@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 @@
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../../../src/systems/debug.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 installEventOptInSync(world: World, state: PhysicsState, phase: IPhase): System;
@@ -0,0 +1,41 @@
1
+ import { ContactEvents, HitEvents, SensorEvents } from "../components/events.js";
2
+ export function installEventOptInSync(world, state, phase) {
3
+ world
4
+ .component(ContactEvents)
5
+ .onAdd((entity) => setEventFlag(state, entity.eid, "contact", true));
6
+ world
7
+ .component(ContactEvents)
8
+ .onRemove((entity) => setEventFlag(state, entity.eid, "contact", false));
9
+ world.component(HitEvents).onAdd((entity) => setEventFlag(state, entity.eid, "hit", true));
10
+ world.component(HitEvents).onRemove((entity) => setEventFlag(state, entity.eid, "hit", false));
11
+ world.component(SensorEvents).onAdd((entity) => setEventFlag(state, entity.eid, "sensor", true));
12
+ world
13
+ .component(SensorEvents)
14
+ .onRemove((entity) => setEventFlag(state, entity.eid, "sensor", false));
15
+ return world
16
+ .system("PhysicsEventOptInSync")
17
+ .phase(phase)
18
+ .run(() => {
19
+ // Hook-driven: onAdd/onRemove do the work synchronously during command drain.
20
+ });
21
+ }
22
+ function setEventFlag(state, entityId, flag, enabled) {
23
+ const shapeId = state.shapeByEntityWasm.get(entityId);
24
+ if (shapeId !== undefined) {
25
+ applyEventFlag(state, shapeId, flag, enabled);
26
+ }
27
+ }
28
+ function applyEventFlag(state, shapeId, flag, enabled) {
29
+ switch (flag) {
30
+ case "contact":
31
+ state.box2d.b2Shape_EnableContactEvents(shapeId, enabled);
32
+ break;
33
+ case "hit":
34
+ state.box2d.b2Shape_EnableHitEvents(shapeId, enabled);
35
+ break;
36
+ case "sensor":
37
+ state.box2d.b2Shape_EnableSensorEvents(shapeId, enabled);
38
+ break;
39
+ }
40
+ }
41
+ //# sourceMappingURL=event_opt_in_sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event_opt_in_sync.js","sourceRoot":"","sources":["../../../../src/systems/event_opt_in_sync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAKjF,MAAM,UAAU,qBAAqB,CAAC,KAAY,EAAE,KAAmB,EAAE,KAAa;IACpF,KAAK;SACF,SAAS,CAAC,aAAa,CAAC;SACxB,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IACvE,KAAK;SACF,SAAS,CAAC,aAAa,CAAC;SACxB,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAE3E,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAC3F,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAE/F,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IACjG,KAAK;SACF,SAAS,CAAC,YAAY,CAAC;SACvB,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAE1E,OAAO,KAAK;SACT,MAAM,CAAC,uBAAuB,CAAC;SAC/B,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,GAAG,EAAE;QACR,8EAA8E;IAChF,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,YAAY,CACnB,KAAmB,EACnB,QAAgB,EAChB,IAAe,EACf,OAAgB;IAEhB,MAAM,OAAO,GAAG,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,KAAmB,EACnB,OAAkB,EAClB,IAAe,EACf,OAAgB;IAEhB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS;YACZ,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM;QACR,KAAK,KAAK;YACR,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM;QACR,KAAK,QAAQ;YACX,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM;IACV,CAAC;AACH,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 installEvents(world: World, state: PhysicsState, phase: IPhase): System;
@@ -0,0 +1,217 @@
1
+ import { ContactEvents, HitEvents, SensorEvents } from "../components/events.js";
2
+ export function installEvents(world, state, phase) {
3
+ return world
4
+ .system("PhysicsEvents")
5
+ .phase(phase)
6
+ .run(() => {
7
+ const touchedContact = new Set();
8
+ const touchedSensor = new Set();
9
+ const touchedHit = new Set();
10
+ publishContactEvents(world, state, touchedContact);
11
+ publishSensorEvents(world, state, touchedSensor);
12
+ publishHitEvents(world, state, touchedHit);
13
+ markModified(world, touchedContact, ContactEvents);
14
+ markModified(world, touchedSensor, SensorEvents);
15
+ markModified(world, touchedHit, HitEvents);
16
+ clearUntouchedContactEvents(world, state.prevTouchedContact, touchedContact);
17
+ clearUntouchedSensorEvents(world, state.prevTouchedSensor, touchedSensor);
18
+ clearUntouchedHitEvents(world, state.prevTouchedHit, touchedHit);
19
+ // Store touched sets on state for the next step's clear pass.
20
+ state.prevTouchedContact.clear();
21
+ for (const eid of touchedContact) {
22
+ state.prevTouchedContact.add(eid);
23
+ }
24
+ state.prevTouchedSensor.clear();
25
+ for (const eid of touchedSensor) {
26
+ state.prevTouchedSensor.add(eid);
27
+ }
28
+ state.prevTouchedHit.clear();
29
+ for (const eid of touchedHit) {
30
+ state.prevTouchedHit.add(eid);
31
+ }
32
+ });
33
+ }
34
+ function publishContactEvents(world, state, touched) {
35
+ const events = state.box2d.b2World_GetContactEvents(state.worldId);
36
+ try {
37
+ for (let i = 0; i < events.beginCount; i++) {
38
+ const event = events.GetBeginEvent(i);
39
+ try {
40
+ emitContactEvent(world, state, touched, event, "begin");
41
+ }
42
+ finally {
43
+ deleteIfPresent(event);
44
+ }
45
+ }
46
+ for (let i = 0; i < events.endCount; i++) {
47
+ const event = events.GetEndEvent(i);
48
+ emitContactEvent(world, state, touched, event, "end");
49
+ }
50
+ }
51
+ finally {
52
+ events.delete();
53
+ }
54
+ }
55
+ function publishSensorEvents(world, state, touched) {
56
+ const events = state.box2d.b2World_GetSensorEvents(state.worldId);
57
+ try {
58
+ for (let i = 0; i < events.beginCount; i++) {
59
+ emitSensorEvent(world, state, touched, events.GetBeginEvent(i), "begin");
60
+ }
61
+ for (let i = 0; i < events.endCount; i++) {
62
+ emitSensorEvent(world, state, touched, events.GetEndEvent(i), "end");
63
+ }
64
+ }
65
+ finally {
66
+ events.delete();
67
+ }
68
+ }
69
+ function publishHitEvents(world, state, touched) {
70
+ const events = state.box2d.b2World_GetContactEvents(state.worldId);
71
+ try {
72
+ for (let i = 0; i < events.hitCount; i++) {
73
+ const event = events.GetHitEvent(i);
74
+ try {
75
+ emitHitEvent(world, state, touched, event);
76
+ }
77
+ finally {
78
+ event.delete();
79
+ }
80
+ }
81
+ }
82
+ finally {
83
+ events.delete();
84
+ }
85
+ }
86
+ function emitContactEvent(world, state, touched, event, kind) {
87
+ const entityA = getLiveEntity(world, state.entityByShapeIndex.get(event.shapeIdA.index1));
88
+ const entityB = getLiveEntity(world, state.entityByShapeIndex.get(event.shapeIdB.index1));
89
+ if (entityA === undefined || entityB === undefined) {
90
+ return;
91
+ }
92
+ emitContactToEntity(touched, entityA, entityB, kind);
93
+ emitContactToEntity(touched, entityB, entityA, kind);
94
+ }
95
+ function emitSensorEvent(world, state, touched, event, kind) {
96
+ const sensor = getLiveEntity(world, state.entityByShapeIndex.get(event.sensorShapeId.index1));
97
+ const visitor = getLiveEntity(world, state.entityByShapeIndex.get(event.visitorShapeId.index1));
98
+ if (sensor === undefined || visitor === undefined) {
99
+ return;
100
+ }
101
+ const events = sensor.get(SensorEvents);
102
+ if (events === undefined) {
103
+ return;
104
+ }
105
+ if (!touched.has(sensor.eid)) {
106
+ events.begin.length = 0;
107
+ events.end.length = 0;
108
+ touched.add(sensor.eid);
109
+ }
110
+ if (kind === "begin") {
111
+ events.begin.push({ other: visitor });
112
+ }
113
+ else {
114
+ events.end.push({ other: visitor });
115
+ }
116
+ }
117
+ function emitHitEvent(world, state, touched, event) {
118
+ const entityA = getLiveEntity(world, state.entityByShapeIndex.get(event.shapeIdA.index1));
119
+ const entityB = getLiveEntity(world, state.entityByShapeIndex.get(event.shapeIdB.index1));
120
+ if (entityA === undefined || entityB === undefined) {
121
+ return;
122
+ }
123
+ emitHitToEntity(touched, entityA, entityB, event);
124
+ emitHitToEntity(touched, entityB, entityA, event);
125
+ }
126
+ function emitContactToEntity(touched, entity, other, kind) {
127
+ const events = entity.get(ContactEvents);
128
+ if (events === undefined) {
129
+ return;
130
+ }
131
+ if (!touched.has(entity.eid)) {
132
+ events.begin.length = 0;
133
+ events.end.length = 0;
134
+ touched.add(entity.eid);
135
+ }
136
+ if (kind === "begin") {
137
+ events.begin.push({ other });
138
+ }
139
+ else {
140
+ events.end.push({ other });
141
+ }
142
+ }
143
+ function emitHitToEntity(touched, entity, other, event) {
144
+ const events = entity.get(HitEvents);
145
+ if (events === undefined) {
146
+ return;
147
+ }
148
+ if (!touched.has(entity.eid)) {
149
+ events.hits.length = 0;
150
+ touched.add(entity.eid);
151
+ }
152
+ events.hits.push({
153
+ other,
154
+ x: event.point.x,
155
+ y: event.point.y,
156
+ normalX: event.normal.x,
157
+ normalY: event.normal.y,
158
+ speed: event.approachSpeed,
159
+ });
160
+ }
161
+ function getLiveEntity(world, entityId) {
162
+ if (entityId === undefined) {
163
+ return undefined;
164
+ }
165
+ const entity = world.getEntity(entityId);
166
+ if (entity === undefined || isDestroyed(entity)) {
167
+ return undefined;
168
+ }
169
+ return entity;
170
+ }
171
+ function markModified(world, touched, component) {
172
+ for (const entityId of touched) {
173
+ world.getEntity(entityId)?.modified(component);
174
+ }
175
+ }
176
+ function clearUntouchedContactEvents(world, previouslyTouched, touched) {
177
+ for (const entityId of previouslyTouched) {
178
+ if (touched.has(entityId)) {
179
+ continue;
180
+ }
181
+ const events = world.getEntity(entityId)?.get(ContactEvents);
182
+ if (events !== undefined) {
183
+ events.begin.length = 0;
184
+ events.end.length = 0;
185
+ }
186
+ }
187
+ }
188
+ function clearUntouchedSensorEvents(world, previouslyTouched, touched) {
189
+ for (const entityId of previouslyTouched) {
190
+ if (touched.has(entityId)) {
191
+ continue;
192
+ }
193
+ const events = world.getEntity(entityId)?.get(SensorEvents);
194
+ if (events !== undefined) {
195
+ events.begin.length = 0;
196
+ events.end.length = 0;
197
+ }
198
+ }
199
+ }
200
+ function clearUntouchedHitEvents(world, previouslyTouched, touched) {
201
+ for (const entityId of previouslyTouched) {
202
+ if (touched.has(entityId)) {
203
+ continue;
204
+ }
205
+ const events = world.getEntity(entityId)?.get(HitEvents);
206
+ if (events !== undefined) {
207
+ events.hits.length = 0;
208
+ }
209
+ }
210
+ }
211
+ function deleteIfPresent(value) {
212
+ value.delete?.();
213
+ }
214
+ function isDestroyed(entity) {
215
+ return entity._destroyed === true;
216
+ }
217
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../src/systems/events.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 installForceGather(world: World, state: PhysicsState, phase: IPhase): System;
@@ -0,0 +1,26 @@
1
+ import { Force, Torque } from "../components/force.js";
2
+ import { resolveBodyId } from "../util/resolve_body.js";
3
+ export function installForceGather(world, state, phase) {
4
+ const forceFilter = world.filter({ any: [Force, Torque] });
5
+ return world
6
+ .system("PhysicsForceGather")
7
+ .phase(phase)
8
+ .run(() => {
9
+ forceFilter.forEach((entity) => {
10
+ const bodyId = resolveBodyId(entity, state);
11
+ if (bodyId === undefined) {
12
+ return;
13
+ }
14
+ const force = entity.get(Force);
15
+ if (force !== undefined) {
16
+ state.scratchVec2.Set(force.x, force.y);
17
+ state.box2d.b2Body_ApplyForceToCenter(bodyId, state.scratchVec2, force.wake);
18
+ }
19
+ const torque = entity.get(Torque);
20
+ if (torque !== undefined) {
21
+ state.box2d.b2Body_ApplyTorque(bodyId, torque.value, torque.wake);
22
+ }
23
+ });
24
+ });
25
+ }
26
+ //# sourceMappingURL=forces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forces.js","sourceRoot":"","sources":["../../../../src/systems/forces.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,UAAU,kBAAkB,CAAC,KAAY,EAAE,KAAmB,EAAE,KAAa;IACjF,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAE3D,OAAO,KAAK;SACT,MAAM,CAAC,oBAAoB,CAAC;SAC5B,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,GAAG,EAAE;QACR,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC5C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAsB,CAAC;YACrD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBACxC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/E,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAuB,CAAC;YACxD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACpE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type IPhase, type System, type World } from "@vworlds/vecs";
2
+ import { type PhysicsState } from "../adapter/state.js";
3
+ export declare function installImpulseAccumulate(world: World, state: PhysicsState, phase: IPhase): System;
4
+ export declare function registerImpulseHooks(world: World, state: PhysicsState): void;
@@ -0,0 +1,70 @@
1
+ import { AngularImpulse, Impulse } from "../components/force.js";
2
+ import { resolveBodyId } from "../util/resolve_body.js";
3
+ export function installImpulseAccumulate(world, state, phase) {
4
+ return world
5
+ .system("PhysicsImpulseAccumulate")
6
+ .phase(phase)
7
+ .run(() => {
8
+ drainLinearImpulses(state);
9
+ drainAngularImpulses(state);
10
+ });
11
+ }
12
+ export function registerImpulseHooks(world, state) {
13
+ world.component(Impulse).onSet((entity, impulse) => {
14
+ const bodyId = resolveBodyId(entity, state);
15
+ if (bodyId === undefined) {
16
+ return;
17
+ }
18
+ state.impulseEntitiesThisStep.add(entity.eid);
19
+ const accumulator = getLinearAccumulator(state, bodyId);
20
+ accumulator.x += impulse.x;
21
+ accumulator.y += impulse.y;
22
+ accumulator.wake || (accumulator.wake = impulse.wake);
23
+ });
24
+ world.component(AngularImpulse).onSet((entity, impulse) => {
25
+ const bodyId = resolveBodyId(entity, state);
26
+ if (bodyId === undefined) {
27
+ return;
28
+ }
29
+ state.impulseEntitiesThisStep.add(entity.eid);
30
+ const accumulator = getAngularAccumulator(state, bodyId);
31
+ accumulator.value += impulse.value;
32
+ accumulator.wake || (accumulator.wake = impulse.wake);
33
+ });
34
+ }
35
+ function drainLinearImpulses(state) {
36
+ for (const [bodyId, impulse] of state.pendingLinearImpulse) {
37
+ if (!state.entityByBodyIndex.has(bodyId.index1)) {
38
+ continue;
39
+ }
40
+ state.scratchVec2.Set(impulse.x, impulse.y);
41
+ state.box2d.b2Body_ApplyLinearImpulseToCenter(bodyId, state.scratchVec2, impulse.wake);
42
+ }
43
+ state.pendingLinearImpulse.clear();
44
+ }
45
+ function drainAngularImpulses(state) {
46
+ for (const [bodyId, impulse] of state.pendingAngularImpulse) {
47
+ if (!state.entityByBodyIndex.has(bodyId.index1)) {
48
+ continue;
49
+ }
50
+ state.box2d.b2Body_ApplyAngularImpulse(bodyId, impulse.value, impulse.wake);
51
+ }
52
+ state.pendingAngularImpulse.clear();
53
+ }
54
+ function getLinearAccumulator(state, bodyId) {
55
+ let accumulator = state.pendingLinearImpulse.get(bodyId);
56
+ if (accumulator === undefined) {
57
+ accumulator = { x: 0, y: 0, wake: false };
58
+ state.pendingLinearImpulse.set(bodyId, accumulator);
59
+ }
60
+ return accumulator;
61
+ }
62
+ function getAngularAccumulator(state, bodyId) {
63
+ let accumulator = state.pendingAngularImpulse.get(bodyId);
64
+ if (accumulator === undefined) {
65
+ accumulator = { value: 0, wake: false };
66
+ state.pendingAngularImpulse.set(bodyId, accumulator);
67
+ }
68
+ return accumulator;
69
+ }
70
+ //# sourceMappingURL=impulse_accumulate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impulse_accumulate.js","sourceRoot":"","sources":["../../../../src/systems/impulse_accumulate.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 installImpulseZero(world: World, state: PhysicsState, phase: IPhase): System;
@@ -0,0 +1,25 @@
1
+ import { AngularImpulse, Impulse } from "../components/force.js";
2
+ export function installImpulseZero(world, state, phase) {
3
+ return world
4
+ .system("PhysicsImpulseZero")
5
+ .phase(phase)
6
+ .run(() => {
7
+ for (const eid of state.impulseEntitiesThisStep) {
8
+ const entity = world.getEntity(eid);
9
+ if (entity === undefined) {
10
+ continue;
11
+ }
12
+ const imp = entity.get(Impulse);
13
+ if (imp !== undefined) {
14
+ imp.x = 0;
15
+ imp.y = 0;
16
+ }
17
+ const ai = entity.get(AngularImpulse);
18
+ if (ai !== undefined) {
19
+ ai.value = 0;
20
+ }
21
+ }
22
+ state.impulseEntitiesThisStep.clear();
23
+ });
24
+ }
25
+ //# sourceMappingURL=impulse_zero.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impulse_zero.js","sourceRoot":"","sources":["../../../../src/systems/impulse_zero.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGjE,MAAM,UAAU,kBAAkB,CAAC,KAAY,EAAE,KAAmB,EAAE,KAAa;IACjF,OAAO,KAAK;SACT,MAAM,CAAC,oBAAoB,CAAC;SAC5B,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,GAAG,EAAE;QACR,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,uBAAuB,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,SAAS;YACX,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAwB,CAAC;YACvD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACZ,CAAC;YAED,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAA+B,CAAC;YACpE,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;gBACrB,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;YACf,CAAC;QACH,CAAC;QAED,KAAK,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type IPhase, type World } from "@vworlds/vecs";
2
+ import { type PhysicsState } from "../adapter/state.js";
3
+ /** The three phases the physics systems split across. */
4
+ export interface PhysicsPhases {
5
+ preStep: IPhase;
6
+ step: IPhase;
7
+ postStep: IPhase;
8
+ }
9
+ /** Options forwarded to {@link installPhysicsSystems} from {@link installPhysics}. */
10
+ export interface PhysicsSystemsOptions {
11
+ /** Install `PhysicsDebugValidation` when `true`. Default `false`. */
12
+ debug?: boolean;
13
+ }
14
+ /** Install every physics system into `world`, bound to `state`, and tag each
15
+ * system entity with {@link PhysicsSystemTag}. Must run before `world.start()`. */
16
+ export declare function installPhysicsSystems(world: World, state: PhysicsState, phases: PhysicsPhases, opts?: PhysicsSystemsOptions): void;
@@ -0,0 +1,81 @@
1
+ // Physics system installation. Creates all physics systems in their canonical
2
+ // run order and tags each one with `PhysicsSystemTag` so the pose-sync feedback
3
+ // suppression (`PhysicsPoseSyncIn.ignoreSource([PhysicsSystemTag])`) can filter
4
+ // the engine's own write-back. This is registration step 12 (PLAN.md →
5
+ // _Component registration order_).
6
+ //
7
+ // Physics-pre phase order (creation order = run order within a phase):
8
+ // 1. PhysicsBodyLifecycle — body must exist before any shape is inserted
9
+ // 2. PhysicsShapeLifecycle — creates/destroys shape records + broad-phase proxies
10
+ // 3. PhysicsMaterialFilterSync — propagates Material/Filter/Sensor updates
11
+ // 4. PhysicsEventOptInSync — runtime ContactEvents/HitEvents/SensorEvents add/remove (hooks)
12
+ // 5. PhysicsShapePoseSync — propagates ShapePosition/ShapeRotation updates
13
+ // 6. PhysicsPoseSyncIn — syncs Position/Rotation/Velocity into body sims
14
+ // 7. PhysicsKinematicTargets — sets target-convergence velocity on kinematic bodies (VP-20)
15
+ // 8. PhysicsForceGather — accumulates Force/Torque into BodySim each step (VP-19)
16
+ // 9. PhysicsImpulseAccumulate — drains Impulse/AngularImpulse into pendingImpulses (VP-19)
17
+ // 10. PhysicsMassRecompute — recomputes mass for dirty bodies (last pre-step)
18
+ // 11. PhysicsDebugValidation — structural validation (ONLY when debug: true, VP-25)
19
+ //
20
+ // Physics-post phase order:
21
+ // 1. PhysicsPoseSyncOut — write simulated pose back to ECS
22
+ // 2. PhysicsEvents — fan raw event arrays out to ContactEvents/SensorEvents/HitEvents (VP-21b)
23
+ // 3. PhysicsImpulseZero — silently zero consumed Impulse/AngularImpulse (VP-19)
24
+ import { PhysicsSystemTag } from "../adapter/state.js";
25
+ import { installDebugValidation } from "./debug.js";
26
+ import { installEventOptInSync } from "./event_opt_in_sync.js";
27
+ import { installEvents } from "./events.js";
28
+ import { installForceGather } from "./forces.js";
29
+ import { installImpulseAccumulate } from "./impulse_accumulate.js";
30
+ import { installImpulseZero } from "./impulse_zero.js";
31
+ import { installKinematicTargets } from "./kinematic.js";
32
+ import { installBodyLifecycle } from "./lifecycle.js";
33
+ import { installMassRecompute } from "./mass_recompute.js";
34
+ import { installMaterialFilterSync } from "./material_filter_sync.js";
35
+ import { installPoseSyncIn } from "./pose_sync_in.js";
36
+ import { installPoseSyncOut } from "./pose_sync_out.js";
37
+ import { installShapeLifecycle } from "./shape_lifecycle.js";
38
+ import { installShapePoseSync } from "./shape_pose_sync.js";
39
+ import { installStep } from "./step.js";
40
+ /** Install every physics system into `world`, bound to `state`, and tag each
41
+ * system entity with {@link PhysicsSystemTag}. Must run before `world.start()`. */
42
+ export function installPhysicsSystems(world, state, phases, opts = {}) {
43
+ const systems = [
44
+ // physics-pre: lifecycle + sync systems in dependency order.
45
+ installBodyLifecycle(world, state, phases.preStep),
46
+ installShapeLifecycle(world, state, phases.preStep),
47
+ installMaterialFilterSync(world, state, phases.preStep),
48
+ // physics-pre: keep event opt-in flags in sync when ContactEvents/HitEvents/
49
+ // SensorEvents are added/removed on a shape after creation (hook-based).
50
+ installEventOptInSync(world, state, phases.preStep),
51
+ installShapePoseSync(world, state, phases.preStep),
52
+ installPoseSyncIn(world, state, phases.preStep),
53
+ // physics-pre: kinematic target drive after PoseSyncIn, before ForceGather (VP-20).
54
+ installKinematicTargets(world, state, phases.preStep),
55
+ // physics-pre: force/impulse systems after KinematicTargets, before MassRecompute (VP-19).
56
+ installForceGather(world, state, phases.preStep),
57
+ installImpulseAccumulate(world, state, phases.preStep),
58
+ // physics-pre: mass recompute — last pre-step, after all lifecycle/sync/force.
59
+ installMassRecompute(world, state, phases.preStep),
60
+ // physics-step: integrator.
61
+ installStep(world, state, phases.step),
62
+ // physics-post: write simulated pose back to ECS.
63
+ installPoseSyncOut(world, state, phases.postStep),
64
+ // physics-post: fan raw event arrays out to ECS event components (VP-21b).
65
+ // Must run AFTER PoseSyncOut (so positions are up to date) and BEFORE ImpulseZero.
66
+ installEvents(world, state, phases.postStep),
67
+ // physics-post: silently zero consumed Impulse/AngularImpulse (last in post).
68
+ installImpulseZero(world, state, phases.postStep),
69
+ ];
70
+ // physics-pre: debug validation — LAST in physics-pre, ONLY when debug: true.
71
+ // Runs after all lifecycle/sync/mass so the world is fully wired for the step.
72
+ if (opts.debug === true) {
73
+ const debugSystem = installDebugValidation(world, state, phases.preStep);
74
+ systems.push(debugSystem);
75
+ }
76
+ // Tag every physics system entity for the `ignoreSource` silence domain.
77
+ for (const system of systems) {
78
+ system.entity.add(PhysicsSystemTag);
79
+ }
80
+ }
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/systems/index.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 installKinematicTargets(world: World, state: PhysicsState, phase: IPhase): System;