@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.
- package/adapter/disposal.d.ts +8 -0
- package/adapter/disposal.js +14 -0
- package/adapter/disposal.js.map +1 -0
- package/adapter/runtime.d.ts +4 -0
- package/adapter/runtime.js +27 -0
- package/adapter/runtime.js.map +1 -0
- package/adapter/state.d.ts +79 -0
- package/adapter/state.js +89 -0
- package/adapter/state.js.map +1 -0
- package/components/body.d.ts +34 -0
- package/components/body.js +53 -0
- package/components/body.js.map +1 -0
- package/components/body_tuning.d.ts +21 -0
- package/components/body_tuning.js +33 -0
- package/components/body_tuning.js.map +1 -0
- package/components/events.d.ts +32 -0
- package/components/events.js +25 -0
- package/components/events.js.map +1 -0
- package/components/force.d.ts +22 -0
- package/components/force.js +35 -0
- package/components/force.js.map +1 -0
- package/components/geometry.d.ts +55 -0
- package/components/geometry.js +74 -0
- package/components/geometry.js.map +1 -0
- package/components/material.d.ts +18 -0
- package/components/material.js +32 -0
- package/components/material.js.map +1 -0
- package/components/shape_pose.d.ts +9 -0
- package/components/shape_pose.js +16 -0
- package/components/shape_pose.js.map +1 -0
- package/components/target.d.ts +13 -0
- package/components/target.js +21 -0
- package/components/target.js.map +1 -0
- package/index.d.ts +10 -0
- package/index.js +23 -0
- package/index.js.map +1 -0
- package/install.d.ts +30 -0
- package/install.js +139 -0
- package/install.js.map +1 -0
- package/package.json +22 -0
- package/systems/debug.d.ts +5 -0
- package/systems/debug.js +266 -0
- package/systems/debug.js.map +1 -0
- package/systems/event_opt_in_sync.d.ts +3 -0
- package/systems/event_opt_in_sync.js +41 -0
- package/systems/event_opt_in_sync.js.map +1 -0
- package/systems/events.d.ts +3 -0
- package/systems/events.js +217 -0
- package/systems/events.js.map +1 -0
- package/systems/forces.d.ts +3 -0
- package/systems/forces.js +26 -0
- package/systems/forces.js.map +1 -0
- package/systems/impulse_accumulate.d.ts +4 -0
- package/systems/impulse_accumulate.js +70 -0
- package/systems/impulse_accumulate.js.map +1 -0
- package/systems/impulse_zero.d.ts +3 -0
- package/systems/impulse_zero.js +25 -0
- package/systems/impulse_zero.js.map +1 -0
- package/systems/index.d.ts +16 -0
- package/systems/index.js +81 -0
- package/systems/index.js.map +1 -0
- package/systems/kinematic.d.ts +3 -0
- package/systems/kinematic.js +88 -0
- package/systems/kinematic.js.map +1 -0
- package/systems/lifecycle.d.ts +3 -0
- package/systems/lifecycle.js +99 -0
- package/systems/lifecycle.js.map +1 -0
- package/systems/mass_recompute.d.ts +3 -0
- package/systems/mass_recompute.js +36 -0
- package/systems/mass_recompute.js.map +1 -0
- package/systems/material_filter_sync.d.ts +3 -0
- package/systems/material_filter_sync.js +64 -0
- package/systems/material_filter_sync.js.map +1 -0
- package/systems/pose_sync_in.d.ts +3 -0
- package/systems/pose_sync_in.js +52 -0
- package/systems/pose_sync_in.js.map +1 -0
- package/systems/pose_sync_out.d.ts +3 -0
- package/systems/pose_sync_out.js +50 -0
- package/systems/pose_sync_out.js.map +1 -0
- package/systems/shape_lifecycle.d.ts +4 -0
- package/systems/shape_lifecycle.js +281 -0
- package/systems/shape_lifecycle.js.map +1 -0
- package/systems/shape_pose_sync.d.ts +3 -0
- package/systems/shape_pose_sync.js +18 -0
- package/systems/shape_pose_sync.js.map +1 -0
- package/systems/step.d.ts +3 -0
- package/systems/step.js +13 -0
- package/systems/step.js.map +1 -0
- package/util/resolve_body.d.ts +6 -0
- package/util/resolve_body.js +16 -0
- package/util/resolve_body.js.map +1 -0
- package/util/warn.d.ts +21 -0
- package/util/warn.js +42 -0
- 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,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,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,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,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;
|
package/systems/index.js
ADDED
|
@@ -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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"}
|