@vworlds/vecs-physics 1.0.25 → 1.0.27
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/{state.d.ts → engine.d.ts} +13 -10
- package/adapter/{state.js → engine.js} +23 -30
- package/adapter/engine.js.map +1 -0
- package/adapter/queries.d.ts +68 -0
- package/adapter/queries.js +145 -0
- package/adapter/queries.js.map +1 -0
- package/adapter/runtime.d.ts +4 -0
- package/adapter/runtime.js +20 -0
- package/adapter/runtime.js.map +1 -1
- package/components/body.js +5 -2
- package/components/body.js.map +1 -1
- package/components/geometry.d.ts +21 -6
- package/components/geometry.js +47 -9
- package/components/geometry.js.map +1 -1
- package/components/material.d.ts +5 -0
- package/components/material.js +5 -0
- package/components/material.js.map +1 -1
- package/index.d.ts +4 -2
- package/index.js +5 -3
- package/index.js.map +1 -1
- package/module.js +32 -19
- package/module.js.map +1 -1
- package/package.json +2 -2
- package/systems/chain_lifecycle.d.ts +6 -0
- package/systems/chain_lifecycle.js +102 -0
- package/systems/chain_lifecycle.js.map +1 -0
- package/systems/debug.d.ts +4 -5
- package/systems/debug.js +26 -24
- package/systems/debug.js.map +1 -1
- package/systems/event_opt_in_sync.d.ts +3 -3
- package/systems/event_opt_in_sync.js +53 -25
- package/systems/event_opt_in_sync.js.map +1 -1
- package/systems/events.d.ts +3 -3
- package/systems/events.js +36 -34
- package/systems/events.js.map +1 -1
- package/systems/forces.d.ts +3 -3
- package/systems/forces.js +30 -21
- package/systems/forces.js.map +1 -1
- package/systems/impulse_accumulate.d.ts +4 -4
- package/systems/impulse_accumulate.js +32 -28
- package/systems/impulse_accumulate.js.map +1 -1
- package/systems/impulse_zero.d.ts +3 -3
- package/systems/impulse_zero.js +6 -4
- package/systems/impulse_zero.js.map +1 -1
- package/systems/index.d.ts +3 -4
- package/systems/index.js +42 -48
- package/systems/index.js.map +1 -1
- package/systems/kinematic.d.ts +3 -3
- package/systems/kinematic.js +33 -33
- package/systems/kinematic.js.map +1 -1
- package/systems/lifecycle.d.ts +3 -3
- package/systems/lifecycle.js +58 -36
- package/systems/lifecycle.js.map +1 -1
- package/systems/mass_recompute.d.ts +3 -3
- package/systems/mass_recompute.js +21 -19
- package/systems/mass_recompute.js.map +1 -1
- package/systems/material_filter_sync.d.ts +3 -3
- package/systems/material_filter_sync.js +64 -29
- package/systems/material_filter_sync.js.map +1 -1
- package/systems/pose_sync_in.d.ts +3 -3
- package/systems/pose_sync_in.js +47 -20
- package/systems/pose_sync_in.js.map +1 -1
- package/systems/pose_sync_out.d.ts +3 -3
- package/systems/pose_sync_out.js +8 -6
- package/systems/pose_sync_out.js.map +1 -1
- package/systems/shape_lifecycle.d.ts +31 -4
- package/systems/shape_lifecycle.js +93 -145
- package/systems/shape_lifecycle.js.map +1 -1
- package/systems/shape_pose_sync.d.ts +3 -3
- package/systems/shape_pose_sync.js +35 -10
- package/systems/shape_pose_sync.js.map +1 -1
- package/systems/shape_predicates.d.ts +12 -0
- package/systems/shape_predicates.js +5 -0
- package/systems/shape_predicates.js.map +1 -0
- package/systems/step.d.ts +3 -3
- package/systems/step.js +7 -5
- package/systems/step.js.map +1 -1
- package/util/resolve_body.d.ts +2 -2
- package/util/resolve_body.js +5 -9
- package/util/resolve_body.js.map +1 -1
- package/util/warn.d.ts +1 -1
- package/util/warn.js +2 -1
- package/util/warn.js.map +1 -1
- package/adapter/state.js.map +0 -1
package/systems/index.js
CHANGED
|
@@ -1,27 +1,28 @@
|
|
|
1
1
|
// Physics system installation. Creates all physics systems in their canonical
|
|
2
2
|
// run order and tags each one with `PhysicsSystemTag` so the pose-sync feedback
|
|
3
3
|
// suppression (`PhysicsPoseSyncIn.ignoreSource([PhysicsSystemTag])`) can filter
|
|
4
|
-
// the engine's own write-back. This is registration step 12 (
|
|
4
|
+
// the engine's own write-back. This is registration step 12 (ARCHITECTURE.md →
|
|
5
5
|
// _Component registration order_).
|
|
6
6
|
//
|
|
7
7
|
// Physics-pre phase order (creation order = run order within a phase):
|
|
8
8
|
// 1. PhysicsBodyLifecycle — body must exist before any shape is inserted
|
|
9
|
-
// 2. PhysicsShapeLifecycle — creates/destroys
|
|
10
|
-
// 3.
|
|
11
|
-
// 4.
|
|
12
|
-
// 5.
|
|
13
|
-
// 6.
|
|
14
|
-
// 7.
|
|
15
|
-
// 8.
|
|
16
|
-
// 9.
|
|
17
|
-
// 10.
|
|
18
|
-
// 11.
|
|
9
|
+
// 2. PhysicsShapeLifecycle — creates/destroys b2Shape records + broad-phase proxies
|
|
10
|
+
// 3. PhysicsChainLifecycle — creates/destroys b2Chain records + segment proxies
|
|
11
|
+
// 4. PhysicsMaterialFilterSync — propagates Material/Filter/Sensor updates
|
|
12
|
+
// 5. PhysicsEventOptInSync — runtime ContactEvents/HitEvents/SensorEvents add/remove (hooks)
|
|
13
|
+
// 6. PhysicsShapePoseSync — propagates ShapePosition/ShapeRotation updates
|
|
14
|
+
// 7. PhysicsPoseSyncIn — syncs Position/Rotation/Velocity into body sims
|
|
15
|
+
// 8. PhysicsKinematicTargets — sets target-convergence velocity on kinematic bodies (VP-20)
|
|
16
|
+
// 9. PhysicsForceGather:* — applies Force and Torque to body sims each step (VP-19)
|
|
17
|
+
// 10. PhysicsImpulseAccumulate — drains Impulse/AngularImpulse into pendingImpulses (VP-19)
|
|
18
|
+
// 11. PhysicsMassRecompute — recomputes mass for dirty bodies (last pre-step)
|
|
19
|
+
// 12. PhysicsDebugValidation — structural validation (ONLY when debug: true, VP-25)
|
|
19
20
|
//
|
|
20
21
|
// Physics-post phase order:
|
|
21
22
|
// 1. PhysicsPoseSyncOut — write simulated pose back to ECS
|
|
22
23
|
// 2. PhysicsEvents — fan raw event arrays out to ContactEvents/SensorEvents/HitEvents (VP-21b)
|
|
23
24
|
// 3. PhysicsImpulseZero — silently zero consumed Impulse/AngularImpulse (VP-19)
|
|
24
|
-
import {
|
|
25
|
+
import { installChainLifecycle } from "./chain_lifecycle.js";
|
|
25
26
|
import { installDebugValidation } from "./debug.js";
|
|
26
27
|
import { installEventOptInSync } from "./event_opt_in_sync.js";
|
|
27
28
|
import { installEvents } from "./events.js";
|
|
@@ -37,45 +38,38 @@ import { installPoseSyncOut } from "./pose_sync_out.js";
|
|
|
37
38
|
import { installShapeLifecycle } from "./shape_lifecycle.js";
|
|
38
39
|
import { installShapePoseSync } from "./shape_pose_sync.js";
|
|
39
40
|
import { installStep } from "./step.js";
|
|
40
|
-
/** Register every physics system into `world`, bound to `
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
installImpulseZero(world, state, phases.postStep),
|
|
69
|
-
];
|
|
41
|
+
/** Register every physics system into `world`, bound to `engine`. */
|
|
42
|
+
export function registerPhysicsSystems(world, engine, phases, opts = {}) {
|
|
43
|
+
// physics-pre: lifecycle + sync systems in dependency order.
|
|
44
|
+
installBodyLifecycle(world, engine, phases.preStep);
|
|
45
|
+
installShapeLifecycle(world, engine, phases.preStep);
|
|
46
|
+
installChainLifecycle(world, engine, phases.preStep);
|
|
47
|
+
installMaterialFilterSync(world, engine, 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, engine, phases.preStep);
|
|
51
|
+
installShapePoseSync(world, engine, phases.preStep);
|
|
52
|
+
installPoseSyncIn(world, engine, phases.preStep);
|
|
53
|
+
// physics-pre: kinematic target drive after PoseSyncIn, before ForceGather (VP-20).
|
|
54
|
+
installKinematicTargets(world, engine, phases.preStep);
|
|
55
|
+
// physics-pre: force/impulse systems after KinematicTargets, before MassRecompute (VP-19).
|
|
56
|
+
installForceGather(world, engine, phases.preStep);
|
|
57
|
+
installImpulseAccumulate(world, engine, phases.preStep);
|
|
58
|
+
// physics-pre: mass recompute — last pre-step, after all lifecycle/sync/force.
|
|
59
|
+
installMassRecompute(world, engine, phases.preStep);
|
|
60
|
+
// physics-step: integrator.
|
|
61
|
+
installStep(world, engine, phases.step);
|
|
62
|
+
// physics-post: write simulated pose back to ECS.
|
|
63
|
+
installPoseSyncOut(world, engine, 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, engine, phases.postStep);
|
|
67
|
+
// physics-post: silently zero consumed Impulse/AngularImpulse (last in post).
|
|
68
|
+
installImpulseZero(world, engine, phases.postStep);
|
|
70
69
|
// physics-pre: debug validation — LAST in physics-pre, ONLY when debug: true.
|
|
71
70
|
// Runs after all lifecycle/sync/mass so the world is fully wired for the step.
|
|
72
71
|
if (opts.debug === true) {
|
|
73
|
-
|
|
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);
|
|
72
|
+
installDebugValidation(world, engine, phases.preStep);
|
|
79
73
|
}
|
|
80
74
|
}
|
|
81
75
|
//# sourceMappingURL=index.js.map
|
package/systems/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/systems/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,gFAAgF;AAChF,gFAAgF;AAChF
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/systems/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,gFAAgF;AAChF,gFAAgF;AAChF,+EAA+E;AAC/E,mCAAmC;AACnC,EAAE;AACF,uEAAuE;AACvE,gFAAgF;AAChF,0FAA0F;AAC1F,sFAAsF;AACtF,6EAA6E;AAC7E,mGAAmG;AACnG,kFAAkF;AAClF,mFAAmF;AACnF,gGAAgG;AAChG,2FAA2F;AAC3F,8FAA8F;AAC9F,oFAAoF;AACpF,wFAAwF;AACxF,EAAE;AACF,4BAA4B;AAC5B,8DAA8D;AAC9D,uGAAuG;AACvG,mFAAmF;AAKnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAexC,qEAAqE;AACrE,MAAM,UAAU,sBAAsB,CACpC,KAAY,EACZ,MAAqB,EACrB,MAAqB,EACrB,OAA8B,EAAE;IAEhC,6DAA6D;IAC7D,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACpD,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzD,6EAA6E;IAC7E,yEAAyE;IACzE,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACpD,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACjD,oFAAoF;IACpF,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACvD,2FAA2F;IAC3F,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,+EAA+E;IAC/E,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACpD,4BAA4B;IAC5B,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,kDAAkD;IAClD,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnD,2EAA2E;IAC3E,mFAAmF;IACnF,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9C,8EAA8E;IAC9E,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEnD,8EAA8E;IAC9E,+EAA+E;IAC/E,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACxB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;AACH,CAAC"}
|
package/systems/kinematic.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { type Entity, type
|
|
2
|
-
import { type
|
|
3
|
-
export declare function installKinematicTargets(world: World,
|
|
1
|
+
import { type Entity, type World } from "@vworlds/vecs";
|
|
2
|
+
import { type PhysicsEngine } from "../adapter/engine.js";
|
|
3
|
+
export declare function installKinematicTargets(world: World, engine: PhysicsEngine, phase: Entity): void;
|
package/systems/kinematic.js
CHANGED
|
@@ -1,32 +1,31 @@
|
|
|
1
1
|
import { Body } from "../components/body.js";
|
|
2
2
|
import { KinematicTargetPosition, KinematicTargetRotation } from "../components/target.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
import { scr_b2Vec2 } from "../adapter/runtime.js";
|
|
4
|
+
import { PhysicsSystemTag } from "../adapter/engine.js";
|
|
5
|
+
export function installKinematicTargets(world, engine, phase) {
|
|
6
|
+
const dt = engine.fixedTimeStep;
|
|
7
|
+
if (dt <= 0) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const system = world
|
|
8
11
|
.system("PhysicsKinematicTargets")
|
|
12
|
+
.with({ all: [Body, { any: [KinematicTargetPosition, KinematicTargetRotation] }] })
|
|
9
13
|
.phase(phase)
|
|
10
|
-
.
|
|
11
|
-
const
|
|
12
|
-
if (
|
|
14
|
+
.each([Body, KinematicTargetPosition, KinematicTargetRotation], (_entity, [body, positionTarget, rotationTarget]) => {
|
|
15
|
+
const bodyId = body._bodyId;
|
|
16
|
+
if (bodyId === undefined || !isKinematicBody(engine, bodyId)) {
|
|
13
17
|
return;
|
|
14
18
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
if (bodyId === undefined || !isKinematicBody(state, bodyId)) {
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
drivePositionTarget(state, bodyId, entity.get(KinematicTargetPosition), dt);
|
|
21
|
-
driveRotationTarget(state, bodyId, entity.get(KinematicTargetRotation), dt);
|
|
22
|
-
});
|
|
19
|
+
drivePositionTarget(engine, bodyId, positionTarget, dt);
|
|
20
|
+
driveRotationTarget(engine, bodyId, rotationTarget, dt);
|
|
23
21
|
});
|
|
22
|
+
system.entity.add(PhysicsSystemTag);
|
|
24
23
|
}
|
|
25
|
-
function drivePositionTarget(
|
|
24
|
+
function drivePositionTarget(engine, bodyId, target, dt) {
|
|
26
25
|
if (target === undefined) {
|
|
27
26
|
return;
|
|
28
27
|
}
|
|
29
|
-
const position =
|
|
28
|
+
const position = engine.box2d.b2Body_GetPosition(bodyId);
|
|
30
29
|
try {
|
|
31
30
|
const dx = target.x - position.x;
|
|
32
31
|
const dy = target.y - position.y;
|
|
@@ -35,51 +34,52 @@ function drivePositionTarget(state, bodyId, target, dt) {
|
|
|
35
34
|
let vx = dx / dt;
|
|
36
35
|
let vy = dy / dt;
|
|
37
36
|
const speed = Math.hypot(vx, vy);
|
|
38
|
-
if (speed >
|
|
39
|
-
const scale =
|
|
37
|
+
if (speed > engine.maximumLinearSpeed) {
|
|
38
|
+
const scale = engine.maximumLinearSpeed / speed;
|
|
40
39
|
vx *= scale;
|
|
41
40
|
vy *= scale;
|
|
42
41
|
}
|
|
43
|
-
setLinearVelocity(
|
|
42
|
+
setLinearVelocity(engine, bodyId, vx, vy);
|
|
44
43
|
if (target.wake) {
|
|
45
|
-
|
|
44
|
+
engine.box2d.b2Body_SetAwake(bodyId, true);
|
|
46
45
|
}
|
|
47
46
|
}
|
|
48
47
|
else {
|
|
49
|
-
setLinearVelocity(
|
|
48
|
+
setLinearVelocity(engine, bodyId, 0, 0);
|
|
50
49
|
}
|
|
51
50
|
}
|
|
52
51
|
finally {
|
|
53
52
|
position.delete();
|
|
54
53
|
}
|
|
55
54
|
}
|
|
56
|
-
function driveRotationTarget(
|
|
55
|
+
function driveRotationTarget(engine, bodyId, target, dt) {
|
|
57
56
|
if (target === undefined) {
|
|
58
57
|
return;
|
|
59
58
|
}
|
|
60
|
-
const rotation =
|
|
59
|
+
const rotation = engine.box2d.b2Body_GetRotation(bodyId);
|
|
61
60
|
try {
|
|
62
61
|
const da = wrap(target.angle - rotation.GetAngle(), -Math.PI, Math.PI);
|
|
63
62
|
if (Math.abs(da) > target.tolerance) {
|
|
64
|
-
|
|
63
|
+
engine.box2d.b2Body_SetAngularVelocity(bodyId, da / dt);
|
|
65
64
|
if (target.wake) {
|
|
66
|
-
|
|
65
|
+
engine.box2d.b2Body_SetAwake(bodyId, true);
|
|
67
66
|
}
|
|
68
67
|
}
|
|
69
68
|
else {
|
|
70
|
-
|
|
69
|
+
engine.box2d.b2Body_SetAngularVelocity(bodyId, 0);
|
|
71
70
|
}
|
|
72
71
|
}
|
|
73
72
|
finally {
|
|
74
73
|
rotation.delete();
|
|
75
74
|
}
|
|
76
75
|
}
|
|
77
|
-
function isKinematicBody(
|
|
78
|
-
return
|
|
76
|
+
function isKinematicBody(engine, bodyId) {
|
|
77
|
+
return engine.box2d.b2Body_GetType(bodyId) === engine.box2d.b2BodyType.b2_kinematicBody;
|
|
79
78
|
}
|
|
80
|
-
function setLinearVelocity(
|
|
81
|
-
|
|
82
|
-
|
|
79
|
+
function setLinearVelocity(engine, bodyId, x, y) {
|
|
80
|
+
const vec = scr_b2Vec2[0];
|
|
81
|
+
vec.Set(x, y);
|
|
82
|
+
engine.box2d.b2Body_SetLinearVelocity(bodyId, vec);
|
|
83
83
|
}
|
|
84
84
|
function wrap(value, min, max) {
|
|
85
85
|
const range = max - min;
|
package/systems/kinematic.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kinematic.js","sourceRoot":"","sources":["../../../../src/systems/kinematic.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"kinematic.js","sourceRoot":"","sources":["../../../../src/systems/kinematic.ts"],"names":[],"mappings":"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"}
|
package/systems/lifecycle.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { type Entity, type
|
|
2
|
-
import { type
|
|
3
|
-
export declare function installBodyLifecycle(world: World,
|
|
1
|
+
import { type Entity, type World } from "@vworlds/vecs";
|
|
2
|
+
import { type PhysicsEngine } from "../adapter/engine.js";
|
|
3
|
+
export declare function installBodyLifecycle(world: World, engine: PhysicsEngine, phase: Entity): void;
|
package/systems/lifecycle.js
CHANGED
|
@@ -1,77 +1,99 @@
|
|
|
1
1
|
import { AngularVelocity, Body, BodyType, LinearVelocity, Position, Rotation, } from "../components/body.js";
|
|
2
2
|
import { Damping, GravityScale, MotionLocks, Sleep } from "../components/body_tuning.js";
|
|
3
|
+
import { PhysicsSystemTag } from "../adapter/engine.js";
|
|
3
4
|
import { withAllocated } from "../adapter/disposal.js";
|
|
4
|
-
export function installBodyLifecycle(world,
|
|
5
|
+
export function installBodyLifecycle(world, engine, phase) {
|
|
5
6
|
const system = world.system("PhysicsBodyLifecycle").with(Body).phase(phase);
|
|
6
|
-
system.
|
|
7
|
-
|
|
8
|
-
const bodyId = createWasmBodyId(
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
system.entity.add(PhysicsSystemTag);
|
|
8
|
+
system.enter([Body], (entity, [body]) => {
|
|
9
|
+
const bodyId = createWasmBodyId(engine, entity, body);
|
|
10
|
+
body._bodyId = bodyId;
|
|
11
|
+
engine.entityByBodyIndex.set(bodyId.index1, entity.eid);
|
|
11
12
|
});
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
// Inject `[Body]` so the handle survives the post-`_destroy` snapshot -- by
|
|
14
|
+
// the time the exit callback runs (next tick's inbox drain), `entity.get(Body)`
|
|
15
|
+
// would return `undefined`.
|
|
16
|
+
system.exit([Body], (entity, [body]) => {
|
|
17
|
+
const bodyId = body?._bodyId;
|
|
14
18
|
if (bodyId === undefined) {
|
|
15
19
|
return;
|
|
16
20
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
state.entityByBodyIndex.delete(bodyId.index1);
|
|
21
|
+
engine.box2d.b2DestroyBody(bodyId);
|
|
22
|
+
engine.entityByBodyIndex.delete(bodyId.index1);
|
|
20
23
|
});
|
|
21
24
|
system.update(Body, (entity, body) => {
|
|
22
|
-
const bodyId =
|
|
25
|
+
const bodyId = body._bodyId;
|
|
23
26
|
if (bodyId === undefined) {
|
|
24
27
|
return;
|
|
25
28
|
}
|
|
26
|
-
|
|
29
|
+
engine.box2d.b2Body_SetType(bodyId, bodyTypeToBox2D(engine.box2d, body.type));
|
|
27
30
|
if (body.enabled) {
|
|
28
|
-
|
|
31
|
+
engine.box2d.b2Body_Enable(bodyId);
|
|
29
32
|
}
|
|
30
33
|
else {
|
|
31
|
-
|
|
34
|
+
engine.box2d.b2Body_Disable(bodyId);
|
|
32
35
|
}
|
|
33
|
-
|
|
36
|
+
engine.box2d.b2Body_SetBullet(bodyId, body.bullet);
|
|
34
37
|
});
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
const dampingSystem = world
|
|
39
|
+
.system("PhysicsBodyLifecycle:Damping")
|
|
40
|
+
.with(Body, Damping)
|
|
41
|
+
.phase(phase)
|
|
42
|
+
.update(Damping, [Body], (entity, damping, [body]) => {
|
|
43
|
+
const bodyId = body?._bodyId;
|
|
37
44
|
if (bodyId === undefined) {
|
|
38
45
|
return;
|
|
39
46
|
}
|
|
40
|
-
|
|
41
|
-
|
|
47
|
+
engine.box2d.b2Body_SetLinearDamping(bodyId, damping.linear);
|
|
48
|
+
engine.box2d.b2Body_SetAngularDamping(bodyId, damping.angular);
|
|
42
49
|
});
|
|
43
|
-
|
|
44
|
-
|
|
50
|
+
dampingSystem.entity.add(PhysicsSystemTag);
|
|
51
|
+
const gravityScaleSystem = world
|
|
52
|
+
.system("PhysicsBodyLifecycle:GravityScale")
|
|
53
|
+
.with(Body, GravityScale)
|
|
54
|
+
.phase(phase)
|
|
55
|
+
.update(GravityScale, [Body], (entity, gravityScale, [body]) => {
|
|
56
|
+
const bodyId = body?._bodyId;
|
|
45
57
|
if (bodyId === undefined) {
|
|
46
58
|
return;
|
|
47
59
|
}
|
|
48
|
-
|
|
60
|
+
engine.box2d.b2Body_SetGravityScale(bodyId, gravityScale.value);
|
|
49
61
|
});
|
|
50
|
-
|
|
51
|
-
|
|
62
|
+
gravityScaleSystem.entity.add(PhysicsSystemTag);
|
|
63
|
+
const motionLocksSystem = world
|
|
64
|
+
.system("PhysicsBodyLifecycle:MotionLocks")
|
|
65
|
+
.with(Body, MotionLocks)
|
|
66
|
+
.phase(phase)
|
|
67
|
+
.update(MotionLocks, [Body], (entity, locks, [body]) => {
|
|
68
|
+
const bodyId = body?._bodyId;
|
|
52
69
|
if (bodyId === undefined) {
|
|
53
70
|
return;
|
|
54
71
|
}
|
|
55
|
-
withAllocated(() => new
|
|
72
|
+
withAllocated(() => new engine.box2d.b2MotionLocks(), (motionLocks) => {
|
|
56
73
|
motionLocks.linearX = locks.x;
|
|
57
74
|
motionLocks.linearY = locks.y;
|
|
58
75
|
motionLocks.angularZ = locks.rotation;
|
|
59
|
-
|
|
76
|
+
engine.box2d.b2Body_SetMotionLocks(bodyId, motionLocks);
|
|
60
77
|
});
|
|
61
78
|
});
|
|
62
|
-
|
|
63
|
-
|
|
79
|
+
motionLocksSystem.entity.add(PhysicsSystemTag);
|
|
80
|
+
const sleepSystem = world
|
|
81
|
+
.system("PhysicsBodyLifecycle:Sleep")
|
|
82
|
+
.with(Body, Sleep)
|
|
83
|
+
.phase(phase)
|
|
84
|
+
.update(Sleep, [Body], (entity, sleep, [body]) => {
|
|
85
|
+
const bodyId = body?._bodyId;
|
|
64
86
|
if (bodyId === undefined) {
|
|
65
87
|
return;
|
|
66
88
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
89
|
+
engine.box2d.b2Body_EnableSleep(bodyId, sleep.enabled);
|
|
90
|
+
engine.box2d.b2Body_SetAwake(bodyId, sleep.awake);
|
|
91
|
+
engine.box2d.b2Body_SetSleepThreshold(bodyId, sleep.threshold);
|
|
70
92
|
});
|
|
71
|
-
|
|
93
|
+
sleepSystem.entity.add(PhysicsSystemTag);
|
|
72
94
|
}
|
|
73
|
-
function createWasmBodyId(
|
|
74
|
-
const box2d =
|
|
95
|
+
function createWasmBodyId(engine, entity, body) {
|
|
96
|
+
const box2d = engine.box2d;
|
|
75
97
|
return withAllocated(box2d.b2DefaultBodyDef, (def) => {
|
|
76
98
|
const position = entity.get(Position);
|
|
77
99
|
const rotation = entity.get(Rotation);
|
|
@@ -98,7 +120,7 @@ function createWasmBodyId(state, entity, body) {
|
|
|
98
120
|
def.isEnabled = body.enabled;
|
|
99
121
|
def.isBullet = body.bullet;
|
|
100
122
|
def.allowFastRotation = body.allowFastRotation;
|
|
101
|
-
return box2d.b2CreateBody(
|
|
123
|
+
return box2d.b2CreateBody(engine.worldId, def);
|
|
102
124
|
});
|
|
103
125
|
}
|
|
104
126
|
function bodyTypeToBox2D(box2d, type) {
|
package/systems/lifecycle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../../src/systems/lifecycle.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,eAAe,EACf,IAAI,EACJ,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,QAAQ,GACT,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../../src/systems/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { type Entity, type
|
|
2
|
-
import { type
|
|
3
|
-
export declare function installMassRecompute(world: World,
|
|
1
|
+
import { type Entity, type World } from "@vworlds/vecs";
|
|
2
|
+
import { type PhysicsEngine } from "../adapter/engine.js";
|
|
3
|
+
export declare function installMassRecompute(world: World, engine: PhysicsEngine, phase: Entity): void;
|
|
@@ -1,36 +1,38 @@
|
|
|
1
1
|
import { Body, BodyType } from "../components/body.js";
|
|
2
|
+
import { PhysicsSystemTag } from "../adapter/engine.js";
|
|
2
3
|
const CODE_DYNAMIC_BODY_WITHOUT_DENSITY = "dynamic-body-without-density";
|
|
3
|
-
export function installMassRecompute(world,
|
|
4
|
-
|
|
4
|
+
export function installMassRecompute(world, engine, phase) {
|
|
5
|
+
const system = world
|
|
5
6
|
.system("PhysicsMassRecompute")
|
|
6
7
|
.phase(phase)
|
|
7
8
|
.run(() => {
|
|
8
|
-
for (const eid of
|
|
9
|
-
const bodyId =
|
|
9
|
+
for (const eid of engine.dirtyMassBodies) {
|
|
10
|
+
const bodyId = world.getEntity(eid)?.get(Body)?._bodyId;
|
|
10
11
|
if (bodyId !== undefined) {
|
|
11
|
-
|
|
12
|
+
engine.box2d.b2Body_ApplyMassFromShapes(bodyId);
|
|
12
13
|
}
|
|
13
14
|
}
|
|
14
|
-
|
|
15
|
-
if (
|
|
16
|
-
warnOnMasslessDynamicBodies(world,
|
|
15
|
+
engine.dirtyMassBodies.clear();
|
|
16
|
+
if (engine.debug) {
|
|
17
|
+
warnOnMasslessDynamicBodies(world, engine);
|
|
17
18
|
}
|
|
18
19
|
});
|
|
20
|
+
system.entity.add(PhysicsSystemTag);
|
|
19
21
|
}
|
|
20
|
-
function warnOnMasslessDynamicBodies(world,
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
if (body
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
function warnOnMasslessDynamicBodies(world, engine) {
|
|
23
|
+
world.filter(Body).forEach([Body], (entity, [body]) => {
|
|
24
|
+
const eid = entity.eid;
|
|
25
|
+
const bodyId = body._bodyId;
|
|
26
|
+
if (body.type !== BodyType.Dynamic || bodyId === undefined) {
|
|
27
|
+
engine.warn.rearm(eid, CODE_DYNAMIC_BODY_WITHOUT_DENSITY);
|
|
28
|
+
return;
|
|
27
29
|
}
|
|
28
|
-
if (
|
|
29
|
-
|
|
30
|
+
if (engine.box2d.b2Body_GetMass(bodyId) === 0) {
|
|
31
|
+
engine.warn.warnOnce(eid, CODE_DYNAMIC_BODY_WITHOUT_DENSITY, `Entity${eid} is a dynamic body with zero mass after recompute; it will not fall.`);
|
|
30
32
|
}
|
|
31
33
|
else {
|
|
32
|
-
|
|
34
|
+
engine.warn.rearm(eid, CODE_DYNAMIC_BODY_WITHOUT_DENSITY);
|
|
33
35
|
}
|
|
34
|
-
}
|
|
36
|
+
});
|
|
35
37
|
}
|
|
36
38
|
//# sourceMappingURL=mass_recompute.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mass_recompute.js","sourceRoot":"","sources":["../../../../src/systems/mass_recompute.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"mass_recompute.js","sourceRoot":"","sources":["../../../../src/systems/mass_recompute.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAsB,MAAM,sBAAsB,CAAC;AAE5E,MAAM,iCAAiC,GAAG,8BAA8B,CAAC;AAEzE,MAAM,UAAU,oBAAoB,CAAC,KAAY,EAAE,MAAqB,EAAE,KAAa;IACrF,MAAM,MAAM,GAAG,KAAK;SACjB,MAAM,CAAC,sBAAsB,CAAC;SAC9B,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,GAAG,EAAE;QACR,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;YACxD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QACD,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAE/B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,2BAA2B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;IACL,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAY,EAAE,MAAqB;IACtE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE;QACpD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,OAAO,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,iCAAiC,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAClB,GAAG,EACH,iCAAiC,EACjC,SAAS,GAAG,sEAAsE,CACnF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,iCAAiC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { type Entity, type
|
|
2
|
-
import { type
|
|
3
|
-
export declare function installMaterialFilterSync(world: World,
|
|
1
|
+
import { type Entity, type World } from "@vworlds/vecs";
|
|
2
|
+
import { type PhysicsEngine } from "../adapter/engine.js";
|
|
3
|
+
export declare function installMaterialFilterSync(world: World, engine: PhysicsEngine, phase: Entity): void;
|