@vworlds/vecs-physics 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/adapter/disposal.d.ts +8 -0
  2. package/adapter/disposal.js +14 -0
  3. package/adapter/disposal.js.map +1 -0
  4. package/adapter/runtime.d.ts +4 -0
  5. package/adapter/runtime.js +27 -0
  6. package/adapter/runtime.js.map +1 -0
  7. package/adapter/state.d.ts +79 -0
  8. package/adapter/state.js +89 -0
  9. package/adapter/state.js.map +1 -0
  10. package/components/body.d.ts +34 -0
  11. package/components/body.js +53 -0
  12. package/components/body.js.map +1 -0
  13. package/components/body_tuning.d.ts +21 -0
  14. package/components/body_tuning.js +33 -0
  15. package/components/body_tuning.js.map +1 -0
  16. package/components/events.d.ts +32 -0
  17. package/components/events.js +25 -0
  18. package/components/events.js.map +1 -0
  19. package/components/force.d.ts +22 -0
  20. package/components/force.js +35 -0
  21. package/components/force.js.map +1 -0
  22. package/components/geometry.d.ts +55 -0
  23. package/components/geometry.js +74 -0
  24. package/components/geometry.js.map +1 -0
  25. package/components/material.d.ts +18 -0
  26. package/components/material.js +32 -0
  27. package/components/material.js.map +1 -0
  28. package/components/shape_pose.d.ts +9 -0
  29. package/components/shape_pose.js +16 -0
  30. package/components/shape_pose.js.map +1 -0
  31. package/components/target.d.ts +13 -0
  32. package/components/target.js +21 -0
  33. package/components/target.js.map +1 -0
  34. package/index.d.ts +10 -0
  35. package/index.js +23 -0
  36. package/index.js.map +1 -0
  37. package/install.d.ts +30 -0
  38. package/install.js +139 -0
  39. package/install.js.map +1 -0
  40. package/package.json +22 -0
  41. package/systems/debug.d.ts +5 -0
  42. package/systems/debug.js +266 -0
  43. package/systems/debug.js.map +1 -0
  44. package/systems/event_opt_in_sync.d.ts +3 -0
  45. package/systems/event_opt_in_sync.js +41 -0
  46. package/systems/event_opt_in_sync.js.map +1 -0
  47. package/systems/events.d.ts +3 -0
  48. package/systems/events.js +217 -0
  49. package/systems/events.js.map +1 -0
  50. package/systems/forces.d.ts +3 -0
  51. package/systems/forces.js +26 -0
  52. package/systems/forces.js.map +1 -0
  53. package/systems/impulse_accumulate.d.ts +4 -0
  54. package/systems/impulse_accumulate.js +70 -0
  55. package/systems/impulse_accumulate.js.map +1 -0
  56. package/systems/impulse_zero.d.ts +3 -0
  57. package/systems/impulse_zero.js +25 -0
  58. package/systems/impulse_zero.js.map +1 -0
  59. package/systems/index.d.ts +16 -0
  60. package/systems/index.js +81 -0
  61. package/systems/index.js.map +1 -0
  62. package/systems/kinematic.d.ts +3 -0
  63. package/systems/kinematic.js +88 -0
  64. package/systems/kinematic.js.map +1 -0
  65. package/systems/lifecycle.d.ts +3 -0
  66. package/systems/lifecycle.js +99 -0
  67. package/systems/lifecycle.js.map +1 -0
  68. package/systems/mass_recompute.d.ts +3 -0
  69. package/systems/mass_recompute.js +36 -0
  70. package/systems/mass_recompute.js.map +1 -0
  71. package/systems/material_filter_sync.d.ts +3 -0
  72. package/systems/material_filter_sync.js +64 -0
  73. package/systems/material_filter_sync.js.map +1 -0
  74. package/systems/pose_sync_in.d.ts +3 -0
  75. package/systems/pose_sync_in.js +52 -0
  76. package/systems/pose_sync_in.js.map +1 -0
  77. package/systems/pose_sync_out.d.ts +3 -0
  78. package/systems/pose_sync_out.js +50 -0
  79. package/systems/pose_sync_out.js.map +1 -0
  80. package/systems/shape_lifecycle.d.ts +4 -0
  81. package/systems/shape_lifecycle.js +281 -0
  82. package/systems/shape_lifecycle.js.map +1 -0
  83. package/systems/shape_pose_sync.d.ts +3 -0
  84. package/systems/shape_pose_sync.js +18 -0
  85. package/systems/shape_pose_sync.js.map +1 -0
  86. package/systems/step.d.ts +3 -0
  87. package/systems/step.js +13 -0
  88. package/systems/step.js.map +1 -0
  89. package/util/resolve_body.d.ts +6 -0
  90. package/util/resolve_body.js +16 -0
  91. package/util/resolve_body.js.map +1 -0
  92. package/util/warn.d.ts +21 -0
  93. package/util/warn.js +42 -0
  94. package/util/warn.js.map +1 -0
@@ -0,0 +1,281 @@
1
+ import { ChildOf } from "@vworlds/vecs";
2
+ import { Body } from "../components/body.js";
3
+ import { Box, Capsule, Chain, Circle, Polygon, Segment } from "../components/geometry.js";
4
+ import { ContactEvents, HitEvents, SensorEvents } from "../components/events.js";
5
+ import { CollisionFilter, Material, Sensor } from "../components/material.js";
6
+ import { ShapePosition, ShapeRotation } from "../components/shape_pose.js";
7
+ import { withAllocated } from "../adapter/disposal.js";
8
+ const MAX_POLYGON_VERTICES = 8;
9
+ export function installShapeLifecycle(world, state, phase) {
10
+ const system = world
11
+ .system("PhysicsShapeLifecycle")
12
+ .query({ all: [{ any: [Box, Circle, Capsule, Segment, Polygon, Chain] }, { parent: Body }] })
13
+ .phase(phase);
14
+ system.enter((entity) => {
15
+ createShapeForEntity(state, entity);
16
+ });
17
+ system.exit((entity) => {
18
+ destroyShapeForEntity(state, entity, true);
19
+ });
20
+ system.update(Box, (entity) => {
21
+ recreateShapeForEntity(state, entity);
22
+ });
23
+ system.update(Circle, (entity) => {
24
+ recreateShapeForEntity(state, entity);
25
+ });
26
+ system.update(Capsule, (entity) => {
27
+ const capsule = entity.get(Capsule);
28
+ if (capsule !== undefined &&
29
+ !hasValidEndpoints(capsule.x1, capsule.y1, capsule.x2, capsule.y2)) {
30
+ return;
31
+ }
32
+ recreateShapeForEntity(state, entity);
33
+ });
34
+ system.update(Segment, (entity) => {
35
+ const segment = entity.get(Segment);
36
+ if (segment !== undefined &&
37
+ !hasValidEndpoints(segment.x1, segment.y1, segment.x2, segment.y2)) {
38
+ return;
39
+ }
40
+ recreateShapeForEntity(state, entity);
41
+ });
42
+ system.update(Polygon, (entity) => {
43
+ recreateShapeForEntity(state, entity);
44
+ });
45
+ system.update(Chain, (entity) => {
46
+ recreateShapeForEntity(state, entity);
47
+ });
48
+ system.update(ChildOf, (entity) => {
49
+ recreateShapeForEntity(state, entity);
50
+ });
51
+ return system;
52
+ }
53
+ export function recreateShapeForEntity(state, entity) {
54
+ destroyShapeForEntity(state, entity, false);
55
+ createShapeForEntity(state, entity);
56
+ }
57
+ function createShapeForEntity(state, entity) {
58
+ const parentEntity = entity.parent(ChildOf);
59
+ if (parentEntity === undefined) {
60
+ return;
61
+ }
62
+ const bodyId = state.bodyByEntityWasm.get(parentEntity.eid);
63
+ if (bodyId === undefined) {
64
+ return;
65
+ }
66
+ const options = readShapeOptions(entity);
67
+ const pose = readLocalPose(entity);
68
+ const chain = entity.get(Chain);
69
+ if (chain !== undefined) {
70
+ createChain(state, entity, bodyId, chain, options, pose);
71
+ return;
72
+ }
73
+ const shapeId = createSingleShape(state, entity, bodyId, options, pose);
74
+ if (shapeId !== undefined) {
75
+ state.shapeByEntityWasm.set(entity.eid, shapeId);
76
+ state.entityByShapeIndex.set(shapeId.index1, entity.eid);
77
+ state.shapeEntityByEid.set(entity.eid, entity);
78
+ state.dirtyMassBodies.add(parentEntity.eid);
79
+ }
80
+ }
81
+ function destroyShapeForEntity(state, entity, allowCascadeSkip) {
82
+ const chainId = state.chainByEntity.get(entity.eid);
83
+ if (chainId !== undefined) {
84
+ const parentBodyExists = parentBodyStillExists(state, entity);
85
+ if (!allowCascadeSkip || parentBodyExists || state.box2d.b2Chain_IsValid(chainId)) {
86
+ if (state.box2d.b2Chain_IsValid(chainId)) {
87
+ state.box2d.b2DestroyChain(chainId);
88
+ }
89
+ }
90
+ state.chainByEntity.delete(entity.eid);
91
+ markParentBodyMassDirty(state, entity);
92
+ }
93
+ const shapeId = state.shapeByEntityWasm.get(entity.eid);
94
+ if (shapeId !== undefined) {
95
+ const parentBodyExists = parentBodyStillExists(state, entity);
96
+ if ((!allowCascadeSkip || parentBodyExists) && state.box2d.b2Shape_IsValid(shapeId)) {
97
+ state.box2d.b2DestroyShape(shapeId, true);
98
+ }
99
+ state.shapeByEntityWasm.delete(entity.eid);
100
+ state.entityByShapeIndex.delete(shapeId.index1);
101
+ markParentBodyMassDirty(state, entity);
102
+ }
103
+ }
104
+ function createSingleShape(state, entity, bodyId, options, pose) {
105
+ const box2d = state.box2d;
106
+ return withAllocated(box2d.b2DefaultShapeDef, (def) => {
107
+ applyShapeDef(def, options);
108
+ const box = entity.get(Box);
109
+ if (box !== undefined) {
110
+ return withAllocated(() => new box2d.b2Vec2(pose.x, pose.y), (center) => withAllocated(() => new box2d.b2Rot(), (rot) => {
111
+ rot.SetAngle(pose.angle);
112
+ const polygon = box2d.b2MakeOffsetBox(box.hx, box.hy, center, rot);
113
+ try {
114
+ return box2d.b2CreatePolygonShape(bodyId, def, polygon);
115
+ }
116
+ finally {
117
+ polygon.delete();
118
+ }
119
+ }));
120
+ }
121
+ const circle = entity.get(Circle);
122
+ if (circle !== undefined) {
123
+ return withAllocated(() => new box2d.b2Circle(), (shape) => {
124
+ shape.center.Set(pose.x, pose.y);
125
+ shape.radius = circle.radius;
126
+ return box2d.b2CreateCircleShape(bodyId, def, shape);
127
+ });
128
+ }
129
+ const capsule = entity.get(Capsule);
130
+ if (capsule !== undefined) {
131
+ if (!hasValidEndpoints(capsule.x1, capsule.y1, capsule.x2, capsule.y2)) {
132
+ return undefined;
133
+ }
134
+ return withAllocated(() => new box2d.b2Capsule(), (shape) => {
135
+ shape.center1.Set(capsule.x1 + pose.x, capsule.y1 + pose.y);
136
+ shape.center2.Set(capsule.x2 + pose.x, capsule.y2 + pose.y);
137
+ shape.radius = capsule.radius;
138
+ return box2d.b2CreateCapsuleShape(bodyId, def, shape);
139
+ });
140
+ }
141
+ const segment = entity.get(Segment);
142
+ if (segment !== undefined) {
143
+ if (!hasValidEndpoints(segment.x1, segment.y1, segment.x2, segment.y2)) {
144
+ return undefined;
145
+ }
146
+ return withAllocated(() => new box2d.b2Segment(), (shape) => {
147
+ shape.point1.Set(segment.x1 + pose.x, segment.y1 + pose.y);
148
+ shape.point2.Set(segment.x2 + pose.x, segment.y2 + pose.y);
149
+ return box2d.b2CreateSegmentShape(bodyId, def, shape);
150
+ });
151
+ }
152
+ const polygon = entity.get(Polygon);
153
+ if (polygon !== undefined) {
154
+ return createPolygonShape(state, bodyId, def, polygon, pose);
155
+ }
156
+ return undefined;
157
+ });
158
+ }
159
+ function createPolygonShape(state, bodyId, def, polygon, pose) {
160
+ if (polygon.vertices.length > MAX_POLYGON_VERTICES || polygon.vertices.length < 3) {
161
+ return undefined;
162
+ }
163
+ const box2d = state.box2d;
164
+ const points = polygon.vertices.map((point) => new box2d.b2Vec2(point.x, point.y));
165
+ try {
166
+ const hull = box2d.b2ComputeHull(points);
167
+ try {
168
+ if (hull.count < 3) {
169
+ return undefined;
170
+ }
171
+ const wasmPolygon = box2d.b2MakePolygon(hull, polygon.radius);
172
+ try {
173
+ return box2d.b2CreatePolygonShape(bodyId, def, wasmPolygon);
174
+ }
175
+ finally {
176
+ wasmPolygon.delete();
177
+ }
178
+ }
179
+ finally {
180
+ hull.delete();
181
+ }
182
+ }
183
+ finally {
184
+ for (const point of points) {
185
+ point.delete();
186
+ }
187
+ }
188
+ }
189
+ function createChain(state, entity, bodyId, chain, options, pose) {
190
+ if (chain.points.length < 4) {
191
+ return;
192
+ }
193
+ const box2d = state.box2d;
194
+ const points = chain.points.map((point) => new box2d.b2Vec2(point.x, point.y));
195
+ try {
196
+ const chainId = withAllocated(box2d.b2DefaultChainDef, (def) => {
197
+ applyChainDef(def, options);
198
+ def.isLoop = chain.loop;
199
+ def.count = points.length;
200
+ def.SetPoints(points);
201
+ return box2d.b2CreateChain(bodyId, def);
202
+ });
203
+ state.chainByEntity.set(entity.eid, chainId);
204
+ state.shapeEntityByEid.set(entity.eid, entity);
205
+ markParentBodyMassDirty(state, entity);
206
+ }
207
+ finally {
208
+ for (const point of points) {
209
+ point.delete();
210
+ }
211
+ }
212
+ }
213
+ function applyShapeDef(def, options) {
214
+ def.density = options.density;
215
+ def.isSensor = options.sensor;
216
+ def.enableSensorEvents = options.enableSensorEvents;
217
+ def.enableContactEvents = options.enableContactEvents;
218
+ def.enableHitEvents = options.enableHitEvents;
219
+ def.filter.categoryBits = options.categoryBits;
220
+ def.filter.maskBits = options.maskBits;
221
+ def.filter.groupIndex = options.groupIndex;
222
+ def.material.friction = options.friction;
223
+ def.material.restitution = options.restitution;
224
+ def.material.rollingResistance = options.rollingResistance;
225
+ def.material.tangentSpeed = options.tangentSpeed;
226
+ def.material.userMaterialId = BigInt(options.userMaterialId);
227
+ }
228
+ function applyChainDef(def, options) {
229
+ def.filter.categoryBits = options.categoryBits;
230
+ def.filter.maskBits = options.maskBits;
231
+ def.filter.groupIndex = options.groupIndex;
232
+ const material = def.GetMaterials()[0];
233
+ material.friction = options.friction;
234
+ material.restitution = options.restitution;
235
+ material.rollingResistance = options.rollingResistance;
236
+ material.tangentSpeed = options.tangentSpeed;
237
+ material.userMaterialId = BigInt(options.userMaterialId);
238
+ def.materialCount = 1;
239
+ def.enableSensorEvents = options.enableSensorEvents;
240
+ }
241
+ function readShapeOptions(entity) {
242
+ const material = entity.get(Material);
243
+ const filter = entity.get(CollisionFilter);
244
+ return {
245
+ density: material?.density ?? 1,
246
+ friction: material?.friction ?? 0.6,
247
+ restitution: material?.restitution ?? 0,
248
+ rollingResistance: material?.rollingResistance ?? 0,
249
+ tangentSpeed: material?.tangentSpeed ?? 0,
250
+ userMaterialId: material?.userMaterialId ?? 0,
251
+ categoryBits: filter?.categoryBits ?? 1,
252
+ maskBits: filter?.maskBits ?? 0xffffffff,
253
+ groupIndex: filter?.groupIndex ?? 0,
254
+ sensor: entity.get(Sensor) !== undefined,
255
+ enableContactEvents: entity.get(ContactEvents) !== undefined,
256
+ enableHitEvents: entity.get(HitEvents) !== undefined,
257
+ enableSensorEvents: entity.get(SensorEvents) !== undefined,
258
+ };
259
+ }
260
+ function readLocalPose(entity) {
261
+ return {
262
+ x: entity.get(ShapePosition)?.x ?? 0,
263
+ y: entity.get(ShapePosition)?.y ?? 0,
264
+ angle: entity.get(ShapeRotation)?.angle ?? 0,
265
+ };
266
+ }
267
+ function parentBodyStillExists(state, entity) {
268
+ const parent = entity.parent(ChildOf);
269
+ return parent !== undefined && state.bodyByEntityWasm.has(parent.eid);
270
+ }
271
+ function markParentBodyMassDirty(state, entity) {
272
+ const parent = entity.parent(ChildOf);
273
+ if (parent !== undefined && state.bodyByEntityWasm.has(parent.eid)) {
274
+ state.dirtyMassBodies.add(parent.eid);
275
+ }
276
+ }
277
+ function hasValidEndpoints(ax, ay, bx, by) {
278
+ const LINEAR_SLOP = 0.005;
279
+ return (bx - ax) ** 2 + (by - ay) ** 2 > LINEAR_SLOP * LINEAR_SLOP;
280
+ }
281
+ //# sourceMappingURL=shape_lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape_lifecycle.js","sourceRoot":"","sources":["../../../../src/systems/shape_lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type IPhase, type System, type World } from "@vworlds/vecs";
2
+ import { type PhysicsState } from "../adapter/state.js";
3
+ export declare function installShapePoseSync(world: World, state: PhysicsState, phase: IPhase): System;
@@ -0,0 +1,18 @@
1
+ import { Body } from "../components/body.js";
2
+ import { Box, Capsule, Chain, Circle, Polygon, Segment } from "../components/geometry.js";
3
+ import { ShapePosition, ShapeRotation } from "../components/shape_pose.js";
4
+ import { recreateShapeForEntity } from "./shape_lifecycle.js";
5
+ export function installShapePoseSync(world, state, phase) {
6
+ const system = world
7
+ .system("PhysicsShapePoseSync")
8
+ .query({ all: [{ any: [Box, Circle, Capsule, Segment, Polygon, Chain] }, { parent: Body }] })
9
+ .phase(phase);
10
+ system.update(ShapePosition, (entity) => {
11
+ recreateShapeForEntity(state, entity);
12
+ });
13
+ system.update(ShapeRotation, (entity) => {
14
+ recreateShapeForEntity(state, entity);
15
+ });
16
+ return system;
17
+ }
18
+ //# sourceMappingURL=shape_pose_sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape_pose_sync.js","sourceRoot":"","sources":["../../../../src/systems/shape_pose_sync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,UAAU,oBAAoB,CAAC,KAAY,EAAE,KAAmB,EAAE,KAAa;IACnF,MAAM,MAAM,GAAG,KAAK;SACjB,MAAM,CAAC,sBAAsB,CAAC;SAC9B,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;SAC5F,KAAK,CAAC,KAAK,CAAC,CAAC;IAEhB,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE;QACtC,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE;QACtC,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type IPhase, type System, type World } from "@vworlds/vecs";
2
+ import { type PhysicsState } from "../adapter/state.js";
3
+ export declare function installStep(world: World, state: PhysicsState, phase: IPhase): System;
@@ -0,0 +1,13 @@
1
+ export function installStep(world, state, phase) {
2
+ return world
3
+ .system("PhysicsStep")
4
+ .phase(phase)
5
+ .run((_now, delta) => {
6
+ if (state.debug && Math.abs(delta / 1000 - state.fixedTimeStep) > 1e-4) {
7
+ state.warn.warnOnce(0, "delta-mismatch", `frame delta ${delta}ms does not match fixedTimeStep ${state.fixedTimeStep * 1000}ms; ` +
8
+ `physics expects a fixed delta.`);
9
+ }
10
+ state.box2d.b2World_Step(state.worldId, state.fixedTimeStep, state.subSteps);
11
+ });
12
+ }
13
+ //# sourceMappingURL=step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step.js","sourceRoot":"","sources":["../../../../src/systems/step.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,KAAmB,EAAE,KAAa;IAC1E,OAAO,KAAK;SACT,MAAM,CAAC,aAAa,CAAC;SACrB,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACnB,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,IAAI,EAAE,CAAC;YACvE,KAAK,CAAC,IAAI,CAAC,QAAQ,CACjB,CAAC,EACD,gBAAgB,EAChB,eAAe,KAAK,mCAAmC,KAAK,CAAC,aAAa,GAAG,IAAI,MAAM;gBACrF,gCAAgC,CACnC,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type Entity } from "@vworlds/vecs";
2
+ import { type b2BodyId, type PhysicsState } from "../adapter/state.js";
3
+ /** Resolve the WASM body id for a force/impulse target entity.
4
+ * Accepts entities that directly carry `Body` OR have a `Body`-carrying
5
+ * immediate parent via `ChildOf`. Returns `undefined` when neither applies. */
6
+ export declare function resolveBodyId(entity: Entity, state: PhysicsState): b2BodyId | undefined;
@@ -0,0 +1,16 @@
1
+ import { ChildOf } from "@vworlds/vecs";
2
+ import { Body } from "../components/body.js";
3
+ /** Resolve the WASM body id for a force/impulse target entity.
4
+ * Accepts entities that directly carry `Body` OR have a `Body`-carrying
5
+ * immediate parent via `ChildOf`. Returns `undefined` when neither applies. */
6
+ export function resolveBodyId(entity, state) {
7
+ if (entity.get(Body) !== undefined) {
8
+ return state.bodyByEntityWasm.get(entity.eid);
9
+ }
10
+ const parent = entity.parent(ChildOf);
11
+ if (parent === undefined || parent.get(Body) === undefined) {
12
+ return undefined;
13
+ }
14
+ return state.bodyByEntityWasm.get(parent.eid);
15
+ }
16
+ //# sourceMappingURL=resolve_body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve_body.js","sourceRoot":"","sources":["../../../../src/util/resolve_body.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAG7C;;+EAE+E;AAC/E,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,KAAmB;IAC/D,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAChD,CAAC"}
package/util/warn.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ /** Receives a fully formatted warning line. Defaults to `console.warn`. */
2
+ export type WarnSink = (message: string) => void;
3
+ export declare class WarnDedupe {
4
+ /** entity eid -> set of issue codes already warned for that entity. */
5
+ private readonly _warned;
6
+ private readonly _sink;
7
+ constructor(sink?: WarnSink);
8
+ /**
9
+ * Emit a warning for `(eid, code)` unless it has already been warned.
10
+ *
11
+ * @returns `true` if the warning was emitted (first occurrence), `false` if
12
+ * it was suppressed as a duplicate.
13
+ */
14
+ warnOnce(eid: number, code: string, message: string): boolean;
15
+ /** Re-arm a `(eid, code)` pair so its next {@link warnOnce} emits again. */
16
+ rearm(eid: number, code: string): void;
17
+ /** True when `(eid, code)` has been warned and not since re-armed. */
18
+ has(eid: number, code: string): boolean;
19
+ /** Forget all warnings. */
20
+ clear(): void;
21
+ }
package/util/warn.js ADDED
@@ -0,0 +1,42 @@
1
+ // Debug-warning de-duplication. Each (entity, code) pair warns at most once
2
+ // until it is re-armed, so a persistent structural problem logs once rather
3
+ // than every step. Re-arming lets a fixed-then-rebroken structure warn again.
4
+ export class WarnDedupe {
5
+ constructor(sink = (message) => console.warn(message)) {
6
+ /** entity eid -> set of issue codes already warned for that entity. */
7
+ this._warned = new Map();
8
+ this._sink = sink;
9
+ }
10
+ /**
11
+ * Emit a warning for `(eid, code)` unless it has already been warned.
12
+ *
13
+ * @returns `true` if the warning was emitted (first occurrence), `false` if
14
+ * it was suppressed as a duplicate.
15
+ */
16
+ warnOnce(eid, code, message) {
17
+ let codes = this._warned.get(eid);
18
+ if (codes === undefined) {
19
+ codes = new Set();
20
+ this._warned.set(eid, codes);
21
+ }
22
+ if (codes.has(code)) {
23
+ return false;
24
+ }
25
+ codes.add(code);
26
+ this._sink(`[vecs-physics] ${code}: ${message}`);
27
+ return true;
28
+ }
29
+ /** Re-arm a `(eid, code)` pair so its next {@link warnOnce} emits again. */
30
+ rearm(eid, code) {
31
+ this._warned.get(eid)?.delete(code);
32
+ }
33
+ /** True when `(eid, code)` has been warned and not since re-armed. */
34
+ has(eid, code) {
35
+ return this._warned.get(eid)?.has(code) ?? false;
36
+ }
37
+ /** Forget all warnings. */
38
+ clear() {
39
+ this._warned.clear();
40
+ }
41
+ }
42
+ //# sourceMappingURL=warn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warn.js","sourceRoot":"","sources":["../../../../src/util/warn.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,4EAA4E;AAC5E,8EAA8E;AAK9E,MAAM,OAAO,UAAU;IAMrB,YAAmB,OAAiB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QALtE,uEAAuE;QACtD,YAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;QAKxD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;;;;OAKG;IACI,QAAQ,CAAC,GAAW,EAAE,IAAY,EAAE,OAAe;QACxD,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,IAAI,CAAC,KAAK,CAAC,kBAAkB,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4EAA4E;IACrE,KAAK,CAAC,GAAW,EAAE,IAAY;QACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,sEAAsE;IAC/D,GAAG,CAAC,GAAW,EAAE,IAAY;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;IACnD,CAAC;IAED,2BAA2B;IACpB,KAAK;QACV,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}