@vworlds/vecs-physics 1.0.52 → 1.0.54
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/engine.d.ts +14 -4
- package/adapter/engine.js +14 -5
- package/adapter/engine.js.map +1 -1
- package/adapter/queries.d.ts +4 -4
- package/adapter/queries.js +19 -24
- package/adapter/queries.js.map +1 -1
- package/adapter/runtime.d.ts +14 -1
- package/adapter/runtime.js +27 -7
- package/adapter/runtime.js.map +1 -1
- package/body/components.d.ts +4 -1
- package/body/components.js +4 -1
- package/body/components.js.map +1 -1
- package/body/lifecycle.js +12 -17
- package/body/lifecycle.js.map +1 -1
- package/body/mass.js +47 -2
- package/body/mass.js.map +1 -1
- package/body/pose_in.js +7 -23
- package/body/pose_in.js.map +1 -1
- package/body/pose_out.d.ts +3 -0
- package/body/pose_out.js +59 -50
- package/body/pose_out.js.map +1 -1
- package/core/module.js +8 -2
- package/core/module.js.map +1 -1
- package/core/reaper.js +25 -16
- package/core/reaper.js.map +1 -1
- package/core/step.js +1 -1
- package/core/step.js.map +1 -1
- package/events/opt_in.js +8 -3
- package/events/opt_in.js.map +1 -1
- package/events/publish.d.ts +3 -0
- package/events/publish.js +138 -81
- package/events/publish.js.map +1 -1
- package/forces/gather.js +3 -5
- package/forces/gather.js.map +1 -1
- package/forces/impulses.js +10 -5
- package/forces/impulses.js.map +1 -1
- package/joints/lifecycle.js +6 -6
- package/joints/lifecycle.js.map +1 -1
- package/kinematic/targets.js +39 -40
- package/kinematic/targets.js.map +1 -1
- package/materials/sync.js +1 -1
- package/materials/sync.js.map +1 -1
- package/module.d.ts +3 -1
- package/module.js +6 -3
- package/module.js.map +1 -1
- package/package.json +3 -3
- package/shapes/chain.js +6 -3
- package/shapes/chain.js.map +1 -1
- package/shapes/lifecycle.js +8 -10
- package/shapes/lifecycle.js.map +1 -1
package/body/pose_in.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Module } from "@vworlds/vecs";
|
|
2
2
|
import { getPhysicsEngine, PhysicsSystemTag } from "../adapter/engine.js";
|
|
3
3
|
import { AngularVelocity, Body, LinearVelocity, Position, Rotation } from "./components.js";
|
|
4
|
-
import {
|
|
4
|
+
import { rev } from "../adapter/runtime.js";
|
|
5
5
|
import { PhysicsCoreModule } from "../core/module.js";
|
|
6
6
|
export class BodyPoseInModule extends Module {
|
|
7
7
|
init() {
|
|
@@ -25,15 +25,8 @@ export class BodyPoseInModule extends Module {
|
|
|
25
25
|
if (bodyId === undefined) {
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const vec = scr_b2Vec2[0];
|
|
31
|
-
vec.Set(position.x, position.y);
|
|
32
|
-
engine.box2d.b2Body_SetTransform(bodyId, vec, rotation);
|
|
33
|
-
}
|
|
34
|
-
finally {
|
|
35
|
-
rotation.delete();
|
|
36
|
-
}
|
|
28
|
+
// SetTransform with the body's existing rotation, in one crossing.
|
|
29
|
+
engine.fast.module._b2x_Body_SetPosition(bodyId.index1, rev(bodyId), position.x, position.y);
|
|
37
30
|
})
|
|
38
31
|
.add(PhysicsSystemTag);
|
|
39
32
|
world
|
|
@@ -46,15 +39,8 @@ export class BodyPoseInModule extends Module {
|
|
|
46
39
|
if (bodyId === undefined) {
|
|
47
40
|
return;
|
|
48
41
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
try {
|
|
52
|
-
engine.box2d.b2Body_SetTransform(bodyId, position, wasmRotation);
|
|
53
|
-
}
|
|
54
|
-
finally {
|
|
55
|
-
wasmRotation.delete();
|
|
56
|
-
position.delete();
|
|
57
|
-
}
|
|
42
|
+
// SetTransform with the body's existing position and b2MakeRot(angle).
|
|
43
|
+
engine.fast.module._b2x_Body_SetAngle(bodyId.index1, rev(bodyId), rotation.angle);
|
|
58
44
|
})
|
|
59
45
|
.add(PhysicsSystemTag);
|
|
60
46
|
world
|
|
@@ -67,9 +53,7 @@ export class BodyPoseInModule extends Module {
|
|
|
67
53
|
if (bodyId === undefined) {
|
|
68
54
|
return;
|
|
69
55
|
}
|
|
70
|
-
|
|
71
|
-
vec.Set(velocity.x, velocity.y);
|
|
72
|
-
engine.box2d.b2Body_SetLinearVelocity(bodyId, vec);
|
|
56
|
+
engine.fast.module._b2x_Body_SetLinearVelocity(bodyId.index1, rev(bodyId), velocity.x, velocity.y);
|
|
73
57
|
})
|
|
74
58
|
.add(PhysicsSystemTag);
|
|
75
59
|
world
|
|
@@ -82,7 +66,7 @@ export class BodyPoseInModule extends Module {
|
|
|
82
66
|
if (bodyId === undefined) {
|
|
83
67
|
return;
|
|
84
68
|
}
|
|
85
|
-
engine.
|
|
69
|
+
engine.fast.module._b2x_Body_SetAngularVelocity(bodyId.index1, rev(bodyId), velocity.value);
|
|
86
70
|
})
|
|
87
71
|
.add(PhysicsSystemTag);
|
|
88
72
|
}
|
package/body/pose_in.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pose_in.js","sourceRoot":"","sources":["../../../../src/body/pose_in.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"pose_in.js","sourceRoot":"","sources":["../../../../src/body/pose_in.ts"],"names":[],"mappings":"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"}
|
package/body/pose_out.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { Module } from "@vworlds/vecs";
|
|
2
|
+
/** Export moved bodies once per post-step tick and write only changed Dynamic-body components.
|
|
3
|
+
* The pinned fast path refreshes heap views; optional components and modification routing remain
|
|
4
|
+
* unchanged, and no per-body Box2D handle, marshalling object or typed-array view is created. */
|
|
2
5
|
export declare class BodyPoseOutModule extends Module {
|
|
3
6
|
init(): void;
|
|
4
7
|
}
|
package/body/pose_out.js
CHANGED
|
@@ -1,40 +1,59 @@
|
|
|
1
1
|
import { Module } from "@vworlds/vecs";
|
|
2
|
-
import { getPhysicsEngine, PhysicsSystemTag
|
|
2
|
+
import { getPhysicsEngine, PhysicsSystemTag } from "../adapter/engine.js";
|
|
3
3
|
import { AngularVelocity, Body, BodyType, LinearVelocity, Position, Rotation, } from "./components.js";
|
|
4
4
|
import { PhysicsCoreModule } from "../core/module.js";
|
|
5
|
+
/** Export moved bodies once per post-step tick and write only changed Dynamic-body components.
|
|
6
|
+
* The pinned fast path refreshes heap views; optional components and modification routing remain
|
|
7
|
+
* unchanged, and no per-body Box2D handle, marshalling object or typed-array view is created. */
|
|
5
8
|
export class BodyPoseOutModule extends Module {
|
|
6
9
|
init() {
|
|
7
10
|
const world = this.world;
|
|
8
11
|
world.module(PhysicsCoreModule);
|
|
9
12
|
const engine = getPhysicsEngine(world);
|
|
13
|
+
const fast = engine.fast;
|
|
14
|
+
const move = fast.layout.move;
|
|
15
|
+
const offsets = {
|
|
16
|
+
bodyIndex: move.bodyIndex >> 2,
|
|
17
|
+
x: move.x >> 2,
|
|
18
|
+
y: move.y >> 2,
|
|
19
|
+
angle: move.angle >> 2,
|
|
20
|
+
vx: move.vx >> 2,
|
|
21
|
+
vy: move.vy >> 2,
|
|
22
|
+
w: move.w >> 2,
|
|
23
|
+
};
|
|
24
|
+
const flags = fast.layout.constants.exportVelocity;
|
|
25
|
+
// Numeric ids avoid resolving component classes on every moved body.
|
|
26
|
+
const ids = {
|
|
27
|
+
body: world.entity(Body).eid,
|
|
28
|
+
position: world.entity(Position).eid,
|
|
29
|
+
rotation: world.entity(Rotation).eid,
|
|
30
|
+
linearVelocity: world.entity(LinearVelocity).eid,
|
|
31
|
+
angularVelocity: world.entity(AngularVelocity).eid,
|
|
32
|
+
};
|
|
10
33
|
world
|
|
11
34
|
.system("PhysicsPoseSyncOut")
|
|
12
35
|
.phase(engine.phases.postStep)
|
|
13
36
|
.run(() => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
writePose(engine, entity, move.transform, bodyId);
|
|
30
|
-
}
|
|
31
|
-
finally {
|
|
32
|
-
move.delete();
|
|
33
|
-
}
|
|
37
|
+
// Export after preceding postStep systems; exportMoves also refreshes memory views.
|
|
38
|
+
const exporter = engine.moveExporter;
|
|
39
|
+
const bodyEntities = engine.bodyEntities;
|
|
40
|
+
const count = exporter.exportMoves(engine.world, flags);
|
|
41
|
+
const i32 = fast.i32;
|
|
42
|
+
const f32 = fast.f32;
|
|
43
|
+
const stride = exporter.stride;
|
|
44
|
+
let base = exporter.base;
|
|
45
|
+
for (let i = 0; i < count; i++, base += stride) {
|
|
46
|
+
// A postStep system may destroy an entity after Box2D produced this event.
|
|
47
|
+
// Keep the reverse slot until the reaper frees the body; lookup is O(1).
|
|
48
|
+
const entity = bodyEntities[i32[base + offsets.bodyIndex]];
|
|
49
|
+
if (entity === undefined || entity.destroyed) {
|
|
50
|
+
continue;
|
|
34
51
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
52
|
+
const body = entity.get(ids.body);
|
|
53
|
+
if (body?.type !== BodyType.Dynamic) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
writePose(entity, f32, base, offsets, ids);
|
|
38
57
|
}
|
|
39
58
|
})
|
|
40
59
|
.add(PhysicsSystemTag);
|
|
@@ -62,45 +81,35 @@ export class BodyPoseOutModule extends Module {
|
|
|
62
81
|
* nothing per body: the new values are read into locals and compared directly, and the `{ x, y }`
|
|
63
82
|
* literals exist only on the write path.
|
|
64
83
|
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* the C++ destructor on an interior pointer of the event, which corrupts the wasm heap. The event's
|
|
69
|
-
* single `move.delete()` releases the memory. The linear velocity is a by-value return, a heap copy
|
|
70
|
-
* this function owns and deletes.
|
|
84
|
+
* Values come from the move record exported after preceding postStep systems. The angle uses
|
|
85
|
+
* Box2D's b2Rot_GetAngle, preserving its exact bits, and velocities use the same Box2D getters
|
|
86
|
+
* in wasm. Reading these f32 records creates no embind handle or allocation.
|
|
71
87
|
*/
|
|
72
|
-
function writePose(
|
|
73
|
-
const
|
|
74
|
-
const
|
|
75
|
-
const
|
|
76
|
-
const position = entity.get(Position);
|
|
88
|
+
function writePose(entity, f32, base, offsets, ids) {
|
|
89
|
+
const x = f32[base + offsets.x];
|
|
90
|
+
const y = f32[base + offsets.y];
|
|
91
|
+
const position = entity.get(ids.position);
|
|
77
92
|
if (position === undefined || position.x !== x || position.y !== y) {
|
|
78
93
|
entity.set(Position, { x, y });
|
|
79
94
|
}
|
|
80
|
-
const rotation = entity.get(
|
|
95
|
+
const rotation = entity.get(ids.rotation);
|
|
81
96
|
if (rotation !== undefined) {
|
|
82
|
-
const angle =
|
|
97
|
+
const angle = f32[base + offsets.angle];
|
|
83
98
|
if (rotation.angle !== angle) {
|
|
84
99
|
entity.set(Rotation, { angle });
|
|
85
100
|
}
|
|
86
101
|
}
|
|
87
|
-
const linearVelocity = entity.get(
|
|
102
|
+
const linearVelocity = entity.get(ids.linearVelocity);
|
|
88
103
|
if (linearVelocity !== undefined) {
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if (linearVelocity.x !== vx || linearVelocity.y !== vy) {
|
|
94
|
-
entity.set(LinearVelocity, { x: vx, y: vy });
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
finally {
|
|
98
|
-
linear.delete();
|
|
104
|
+
const vx = f32[base + offsets.vx];
|
|
105
|
+
const vy = f32[base + offsets.vy];
|
|
106
|
+
if (linearVelocity.x !== vx || linearVelocity.y !== vy) {
|
|
107
|
+
entity.set(LinearVelocity, { x: vx, y: vy });
|
|
99
108
|
}
|
|
100
109
|
}
|
|
101
|
-
const angularVelocity = entity.get(
|
|
110
|
+
const angularVelocity = entity.get(ids.angularVelocity);
|
|
102
111
|
if (angularVelocity !== undefined) {
|
|
103
|
-
const value =
|
|
112
|
+
const value = f32[base + offsets.w];
|
|
104
113
|
if (angularVelocity.value !== value) {
|
|
105
114
|
entity.set(AngularVelocity, { value });
|
|
106
115
|
}
|
package/body/pose_out.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pose_out.js","sourceRoot":"","sources":["../../../../src/body/pose_out.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAe,MAAM,eAAe,CAAC;AAEpD,OAAO,
|
|
1
|
+
{"version":3,"file":"pose_out.js","sourceRoot":"","sources":["../../../../src/body/pose_out.ts"],"names":[],"mappings":"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"}
|
package/core/module.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { insertPhaseAfter, Module, ON_UPDATE, Phase, Singleton, } from "@vworlds/vecs";
|
|
2
2
|
import { hasPhysicsEngine, PhysicsEngine, PhysicsSystemTag, } from "../adapter/engine.js";
|
|
3
3
|
import { withAllocated } from "../adapter/disposal.js";
|
|
4
|
-
import { getBox2D } from "../adapter/runtime.js";
|
|
4
|
+
import { getBox2D, getFastPath } from "../adapter/runtime.js";
|
|
5
5
|
const DEFAULT_PRE_STEP_PHASE = "physics-pre";
|
|
6
6
|
const DEFAULT_STEP_PHASE = "physics-step";
|
|
7
7
|
const DEFAULT_POST_STEP_PHASE = "physics-post";
|
|
@@ -16,17 +16,23 @@ export class PhysicsCoreModule extends Module {
|
|
|
16
16
|
world.component(PhysicsSystemTag);
|
|
17
17
|
const phases = {
|
|
18
18
|
preStep: resolvePhase(world, opts.preStepPhase, DEFAULT_PRE_STEP_PHASE),
|
|
19
|
+
cleanup: world.entity("physics-cleanup").add(Phase),
|
|
19
20
|
step: resolvePhase(world, opts.stepPhase, DEFAULT_STEP_PHASE),
|
|
20
21
|
postStep: resolvePhase(world, opts.postStepPhase, DEFAULT_POST_STEP_PHASE),
|
|
21
22
|
};
|
|
22
23
|
const updatePhase = world.entity(ON_UPDATE);
|
|
23
24
|
insertPhaseAfter(phases.preStep, updatePhase);
|
|
24
25
|
insertPhaseAfter(phases.step, phases.preStep);
|
|
26
|
+
// A separate boundary covers every user preStep system, including ones
|
|
27
|
+
// registered after PhysicsModule. Keep the three public phase options intact.
|
|
28
|
+
insertPhaseAfter(phases.cleanup, phases.preStep);
|
|
25
29
|
insertPhaseAfter(phases.postStep, phases.step);
|
|
26
30
|
const box2d = getBox2D();
|
|
27
31
|
const resolved = resolveOptions(opts);
|
|
28
|
-
const
|
|
32
|
+
const fast = getFastPath();
|
|
33
|
+
const engine = new PhysicsEngine(box2d, resolved, phases, fast, opts.debugSink);
|
|
29
34
|
engine.worldId = createWorldId(engine, resolved);
|
|
35
|
+
engine.world = fast.world(engine.worldId);
|
|
30
36
|
world.component(PhysicsEngine).add(Singleton);
|
|
31
37
|
world.component(PhysicsEngine).attach(PhysicsEngine, engine);
|
|
32
38
|
}
|
package/core/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../../../src/core/module.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,MAAM,EACN,SAAS,EACT,KAAK,EACL,SAAS,GAGV,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GAEjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../../../src/core/module.ts"],"names":[],"mappings":"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"}
|
package/core/reaper.js
CHANGED
|
@@ -8,36 +8,45 @@ export class PhysicsReaperModule extends Module {
|
|
|
8
8
|
const engine = getPhysicsEngine(world);
|
|
9
9
|
world
|
|
10
10
|
.system("PhysicsReaper")
|
|
11
|
-
.phase(engine.phases.
|
|
11
|
+
.phase(engine.phases.cleanup)
|
|
12
12
|
.run(() => {
|
|
13
13
|
// Joints first: a body destroy below cascade-destroys its joints, so we
|
|
14
14
|
// tear down explicitly-removed joints before their bodies disappear. Guard
|
|
15
15
|
// with b2Joint_IsValid because a joint queued from a cascaded body entity
|
|
16
16
|
// may already be gone.
|
|
17
17
|
const joints = engine.pendingJointDestroys;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
engine.box2d.
|
|
18
|
+
if (joints.length > 0) {
|
|
19
|
+
for (const jointId of joints) {
|
|
20
|
+
if (engine.box2d.b2Joint_IsValid(jointId)) {
|
|
21
|
+
engine.box2d.b2DestroyJoint(jointId, true);
|
|
22
|
+
}
|
|
21
23
|
}
|
|
24
|
+
joints.length = 0;
|
|
22
25
|
}
|
|
23
|
-
joints.length = 0;
|
|
24
26
|
const shapes = engine.pendingShapeDestroys;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
if (shapes.length > 0) {
|
|
28
|
+
for (const shapeId of shapes) {
|
|
29
|
+
engine.entityByShapeIndex.delete(shapeId.index1);
|
|
30
|
+
engine.box2d.b2DestroyShape(shapeId, true);
|
|
31
|
+
}
|
|
32
|
+
shapes.length = 0;
|
|
28
33
|
}
|
|
29
|
-
shapes.length = 0;
|
|
30
34
|
const chains = engine.pendingChainDestroys;
|
|
31
|
-
|
|
32
|
-
|
|
35
|
+
if (chains.length > 0) {
|
|
36
|
+
for (const chainId of chains) {
|
|
37
|
+
engine.box2d.b2DestroyChain(chainId);
|
|
38
|
+
}
|
|
39
|
+
chains.length = 0;
|
|
33
40
|
}
|
|
34
|
-
chains.length = 0;
|
|
35
41
|
const bodies = engine.pendingBodyDestroys;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
42
|
+
if (bodies.length > 0) {
|
|
43
|
+
for (const bodyId of bodies) {
|
|
44
|
+
engine.entityByBodyIndex.delete(bodyId.index1);
|
|
45
|
+
engine.bodyEntities[bodyId.index1] = undefined;
|
|
46
|
+
engine.box2d.b2DestroyBody(bodyId);
|
|
47
|
+
}
|
|
48
|
+
bodies.length = 0;
|
|
39
49
|
}
|
|
40
|
-
bodies.length = 0;
|
|
41
50
|
})
|
|
42
51
|
.add(PhysicsSystemTag);
|
|
43
52
|
}
|
package/core/reaper.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reaper.js","sourceRoot":"","sources":["../../../../src/core/reaper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,OAAO,mBAAoB,SAAQ,MAAM;IACtC,IAAI;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAEhC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACvC,KAAK;aACF,MAAM,CAAC,eAAe,CAAC;aACvB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;aAC5B,GAAG,CAAC,GAAG,EAAE;YACR,wEAAwE;YACxE,2EAA2E;YAC3E,0EAA0E;YAC1E,uBAAuB;YACvB,MAAM,MAAM,GAAG,MAAM,CAAC,oBAAoB,CAAC;YAC3C,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"reaper.js","sourceRoot":"","sources":["../../../../src/core/reaper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,OAAO,mBAAoB,SAAQ,MAAM;IACtC,IAAI;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAEhC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACvC,KAAK;aACF,MAAM,CAAC,eAAe,CAAC;aACvB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;aAC5B,GAAG,CAAC,GAAG,EAAE;YACR,wEAAwE;YACxE,2EAA2E;YAC3E,0EAA0E;YAC1E,uBAAuB;YACvB,MAAM,MAAM,GAAG,MAAM,CAAC,oBAAoB,CAAC;YAC3C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;oBAC7B,IAAI,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC1C,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC;gBACD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACpB,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,oBAAoB,CAAC;YAC3C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;oBAC7B,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACjD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC7C,CAAC;gBACD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACpB,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,oBAAoB,CAAC;YAC3C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;oBAC7B,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;gBACvC,CAAC;gBACD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACpB,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,mBAAmB,CAAC;YAC1C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;oBAC5B,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC/C,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;oBAC/C,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBACrC,CAAC;gBACD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACpB,CAAC;QACH,CAAC,CAAC;aACD,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC3B,CAAC;CACF"}
|
package/core/step.js
CHANGED
|
@@ -14,7 +14,7 @@ export class PhysicsStepModule extends Module {
|
|
|
14
14
|
engine.warn.warnOnce(0, "delta-mismatch", `frame delta ${delta}ms does not match fixedTimeStep ${engine.fixedTimeStep * 1000}ms; ` +
|
|
15
15
|
`physics expects a fixed delta.`);
|
|
16
16
|
}
|
|
17
|
-
engine.box2d.
|
|
17
|
+
engine.box2d._b2x_World_Step(engine.world, engine.fixedTimeStep, engine.subSteps);
|
|
18
18
|
})
|
|
19
19
|
.add(PhysicsSystemTag);
|
|
20
20
|
}
|
package/core/step.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step.js","sourceRoot":"","sources":["../../../../src/core/step.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,OAAO,iBAAkB,SAAQ,MAAM;IACpC,IAAI;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAEhC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACvC,KAAK;aACF,MAAM,CAAC,aAAa,CAAC;aACrB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;aACzB,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACnB,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI,EAAE,CAAC;gBACzE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAClB,CAAC,EACD,gBAAgB,EAChB,eAAe,KAAK,mCAAmC,MAAM,CAAC,aAAa,GAAG,IAAI,MAAM;oBACtF,gCAAgC,CACnC,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"step.js","sourceRoot":"","sources":["../../../../src/core/step.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,OAAO,iBAAkB,SAAQ,MAAM;IACpC,IAAI;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAEhC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACvC,KAAK;aACF,MAAM,CAAC,aAAa,CAAC;aACrB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;aACzB,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACnB,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI,EAAE,CAAC;gBACzE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAClB,CAAC,EACD,gBAAgB,EAChB,eAAe,KAAK,mCAAmC,MAAM,CAAC,aAAa,GAAG,IAAI,MAAM;oBACtF,gCAAgC,CACnC,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpF,CAAC,CAAC;aACD,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC3B,CAAC;CACF"}
|
package/events/opt_in.js
CHANGED
|
@@ -40,11 +40,16 @@ export class EventOptInModule extends Module {
|
|
|
40
40
|
if (shapeId !== undefined) {
|
|
41
41
|
engine.box2d.b2Shape_EnableSensorEvents(shapeId, true);
|
|
42
42
|
}
|
|
43
|
-
})
|
|
43
|
+
});
|
|
44
|
+
// Disable at the exit flush so a late preStep destroy cannot leave a stale
|
|
45
|
+
// setter in next tick's inbox after cleanup has already freed the shape.
|
|
46
|
+
world
|
|
47
|
+
.query("PhysicsEventOptInTeardown:Sensor")
|
|
48
|
+
.with({ all: [SingleShape, { any: [SensorEvents, Detectable] }] })
|
|
44
49
|
.exit([SingleShape], (_e, [shape]) => {
|
|
45
50
|
const shapeId = shape._shapeId;
|
|
46
|
-
// No stale-id guard needed:
|
|
47
|
-
//
|
|
51
|
+
// No stale-id guard needed: this exit runs at the flush, before cleanup
|
|
52
|
+
// can free or recycle the shape's Box2D slot.
|
|
48
53
|
if (shapeId !== undefined) {
|
|
49
54
|
engine.box2d.b2Shape_EnableSensorEvents(shapeId, false);
|
|
50
55
|
}
|
package/events/opt_in.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opt_in.js","sourceRoot":"","sources":["../../../../src/events/opt_in.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAe,MAAM,eAAe,CAAC;AAEnE,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GAGjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,OAAO,gBAAiB,SAAQ,MAAM;IACnC,IAAI;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAChC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC3B,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAC9B,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAE3B,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;QACpC,KAAK;aACF,SAAS,CAAC,aAAa,CAAC;aACxB,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;aACpE,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QAE5E,KAAK;aACF,SAAS,CAAC,SAAS,CAAC;aACpB,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;aAChE,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAExE,qEAAqE;QACrE,4EAA4E;QAC5E,6DAA6D;QAC7D,KAAK;aACF,MAAM,CAAC,8BAA8B,CAAC;aACtC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;aACjE,KAAK,CAAC,KAAK,CAAC;aACZ,GAAG,CAAC,gBAAgB,CAAC;aACrB,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE;YACpC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC;YAC/B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACzD,CAAC;QACH,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"opt_in.js","sourceRoot":"","sources":["../../../../src/events/opt_in.ts"],"names":[],"mappings":"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"}
|
package/events/publish.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { Module } from "@vworlds/vecs";
|
|
2
|
+
/** Read contact/hit/sensor spans once per tick and publish fresh public event records in order.
|
|
3
|
+
* Native reads allocate no per-event wrappers; event components retain clear-in-place arrays
|
|
4
|
+
* and are marked modified once per receiving entity with new events. */
|
|
2
5
|
export declare class EventPublishModule extends Module {
|
|
3
6
|
init(): void;
|
|
4
7
|
}
|