@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.
Files changed (84) hide show
  1. package/adapter/{state.d.ts → engine.d.ts} +13 -10
  2. package/adapter/{state.js → engine.js} +23 -30
  3. package/adapter/engine.js.map +1 -0
  4. package/adapter/queries.d.ts +68 -0
  5. package/adapter/queries.js +145 -0
  6. package/adapter/queries.js.map +1 -0
  7. package/adapter/runtime.d.ts +4 -0
  8. package/adapter/runtime.js +20 -0
  9. package/adapter/runtime.js.map +1 -1
  10. package/components/body.js +5 -2
  11. package/components/body.js.map +1 -1
  12. package/components/geometry.d.ts +21 -6
  13. package/components/geometry.js +47 -9
  14. package/components/geometry.js.map +1 -1
  15. package/components/material.d.ts +5 -0
  16. package/components/material.js +5 -0
  17. package/components/material.js.map +1 -1
  18. package/index.d.ts +4 -2
  19. package/index.js +5 -3
  20. package/index.js.map +1 -1
  21. package/module.js +32 -19
  22. package/module.js.map +1 -1
  23. package/package.json +2 -2
  24. package/systems/chain_lifecycle.d.ts +6 -0
  25. package/systems/chain_lifecycle.js +102 -0
  26. package/systems/chain_lifecycle.js.map +1 -0
  27. package/systems/debug.d.ts +4 -5
  28. package/systems/debug.js +26 -24
  29. package/systems/debug.js.map +1 -1
  30. package/systems/event_opt_in_sync.d.ts +3 -3
  31. package/systems/event_opt_in_sync.js +53 -25
  32. package/systems/event_opt_in_sync.js.map +1 -1
  33. package/systems/events.d.ts +3 -3
  34. package/systems/events.js +36 -34
  35. package/systems/events.js.map +1 -1
  36. package/systems/forces.d.ts +3 -3
  37. package/systems/forces.js +30 -21
  38. package/systems/forces.js.map +1 -1
  39. package/systems/impulse_accumulate.d.ts +4 -4
  40. package/systems/impulse_accumulate.js +32 -28
  41. package/systems/impulse_accumulate.js.map +1 -1
  42. package/systems/impulse_zero.d.ts +3 -3
  43. package/systems/impulse_zero.js +6 -4
  44. package/systems/impulse_zero.js.map +1 -1
  45. package/systems/index.d.ts +3 -4
  46. package/systems/index.js +42 -48
  47. package/systems/index.js.map +1 -1
  48. package/systems/kinematic.d.ts +3 -3
  49. package/systems/kinematic.js +33 -33
  50. package/systems/kinematic.js.map +1 -1
  51. package/systems/lifecycle.d.ts +3 -3
  52. package/systems/lifecycle.js +58 -36
  53. package/systems/lifecycle.js.map +1 -1
  54. package/systems/mass_recompute.d.ts +3 -3
  55. package/systems/mass_recompute.js +21 -19
  56. package/systems/mass_recompute.js.map +1 -1
  57. package/systems/material_filter_sync.d.ts +3 -3
  58. package/systems/material_filter_sync.js +64 -29
  59. package/systems/material_filter_sync.js.map +1 -1
  60. package/systems/pose_sync_in.d.ts +3 -3
  61. package/systems/pose_sync_in.js +47 -20
  62. package/systems/pose_sync_in.js.map +1 -1
  63. package/systems/pose_sync_out.d.ts +3 -3
  64. package/systems/pose_sync_out.js +8 -6
  65. package/systems/pose_sync_out.js.map +1 -1
  66. package/systems/shape_lifecycle.d.ts +31 -4
  67. package/systems/shape_lifecycle.js +93 -145
  68. package/systems/shape_lifecycle.js.map +1 -1
  69. package/systems/shape_pose_sync.d.ts +3 -3
  70. package/systems/shape_pose_sync.js +35 -10
  71. package/systems/shape_pose_sync.js.map +1 -1
  72. package/systems/shape_predicates.d.ts +12 -0
  73. package/systems/shape_predicates.js +5 -0
  74. package/systems/shape_predicates.js.map +1 -0
  75. package/systems/step.d.ts +3 -3
  76. package/systems/step.js +7 -5
  77. package/systems/step.js.map +1 -1
  78. package/util/resolve_body.d.ts +2 -2
  79. package/util/resolve_body.js +5 -9
  80. package/util/resolve_body.js.map +1 -1
  81. package/util/warn.d.ts +1 -1
  82. package/util/warn.js +2 -1
  83. package/util/warn.js.map +1 -1
  84. 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 (PLAN.md →
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 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)
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 { PhysicsSystemTag } from "../adapter/state.js";
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 `state`, and tag each
41
- * system entity with {@link PhysicsSystemTag}. */
42
- export function registerPhysicsSystems(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
- ];
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
- 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);
72
+ installDebugValidation(world, engine, phases.preStep);
79
73
  }
80
74
  }
81
75
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/systems/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/systems/index.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { type Entity, 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: Entity): System;
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;
@@ -1,32 +1,31 @@
1
1
  import { Body } from "../components/body.js";
2
2
  import { KinematicTargetPosition, KinematicTargetRotation } from "../components/target.js";
3
- export function installKinematicTargets(world, state, phase) {
4
- const targetFilter = world.filter({
5
- all: [Body, { any: [KinematicTargetPosition, KinematicTargetRotation] }],
6
- });
7
- return world
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
- .run(() => {
11
- const dt = state.fixedTimeStep;
12
- if (dt <= 0) {
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
- targetFilter.forEach((entity) => {
16
- const bodyId = state.bodyByEntityWasm.get(entity.eid);
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(state, bodyId, target, dt) {
24
+ function drivePositionTarget(engine, bodyId, target, dt) {
26
25
  if (target === undefined) {
27
26
  return;
28
27
  }
29
- const position = state.box2d.b2Body_GetPosition(bodyId);
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 > state.maximumLinearSpeed) {
39
- const scale = state.maximumLinearSpeed / speed;
37
+ if (speed > engine.maximumLinearSpeed) {
38
+ const scale = engine.maximumLinearSpeed / speed;
40
39
  vx *= scale;
41
40
  vy *= scale;
42
41
  }
43
- setLinearVelocity(state, bodyId, vx, vy);
42
+ setLinearVelocity(engine, bodyId, vx, vy);
44
43
  if (target.wake) {
45
- state.box2d.b2Body_SetAwake(bodyId, true);
44
+ engine.box2d.b2Body_SetAwake(bodyId, true);
46
45
  }
47
46
  }
48
47
  else {
49
- setLinearVelocity(state, bodyId, 0, 0);
48
+ setLinearVelocity(engine, bodyId, 0, 0);
50
49
  }
51
50
  }
52
51
  finally {
53
52
  position.delete();
54
53
  }
55
54
  }
56
- function driveRotationTarget(state, bodyId, target, dt) {
55
+ function driveRotationTarget(engine, bodyId, target, dt) {
57
56
  if (target === undefined) {
58
57
  return;
59
58
  }
60
- const rotation = state.box2d.b2Body_GetRotation(bodyId);
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
- state.box2d.b2Body_SetAngularVelocity(bodyId, da / dt);
63
+ engine.box2d.b2Body_SetAngularVelocity(bodyId, da / dt);
65
64
  if (target.wake) {
66
- state.box2d.b2Body_SetAwake(bodyId, true);
65
+ engine.box2d.b2Body_SetAwake(bodyId, true);
67
66
  }
68
67
  }
69
68
  else {
70
- state.box2d.b2Body_SetAngularVelocity(bodyId, 0);
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(state, bodyId) {
78
- return state.box2d.b2Body_GetType(bodyId) === state.box2d.b2BodyType.b2_kinematicBody;
76
+ function isKinematicBody(engine, bodyId) {
77
+ return engine.box2d.b2Body_GetType(bodyId) === engine.box2d.b2BodyType.b2_kinematicBody;
79
78
  }
80
- function setLinearVelocity(state, bodyId, x, y) {
81
- state.scratchVec2.Set(x, y);
82
- state.box2d.b2Body_SetLinearVelocity(bodyId, state.scratchVec2);
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;
@@ -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;AAG3F,MAAM,UAAU,uBAAuB,CAAC,KAAY,EAAE,KAAmB,EAAE,KAAa;IACtF,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC;QAChC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,uBAAuB,EAAE,uBAAuB,CAAC,EAAE,CAAC;KACzE,CAAC,CAAC;IAEH,OAAO,KAAK;SACT,MAAM,CAAC,yBAAyB,CAAC;SACjC,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,GAAG,EAAE;QACR,MAAM,EAAE,GAAG,KAAK,CAAC,aAAa,CAAC;QAC/B,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtD,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;gBAC5D,OAAO;YACT,CAAC;YAED,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5E,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAmB,EACnB,MAAgB,EAChB,MAA2C,EAC3C,EAAU;IAEV,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QACjC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAChC,IAAI,IAAI,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YAC5B,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACjB,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACjC,IAAI,KAAK,GAAG,KAAK,CAAC,kBAAkB,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,KAAK,CAAC,kBAAkB,GAAG,KAAK,CAAC;gBAC/C,EAAE,IAAI,KAAK,CAAC;gBACZ,EAAE,IAAI,KAAK,CAAC;YACd,CAAC;YACD,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,MAAM,EAAE,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAmB,EACnB,MAAgB,EAChB,MAA2C,EAC3C,EAAU;IAEV,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACvE,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YACpC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YACvD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,MAAM,EAAE,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAAmB,EAAE,MAAgB;IAC5D,OAAO,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC;AACxF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAmB,EAAE,MAAgB,EAAE,CAAS,EAAE,CAAS;IACpF,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,IAAI,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IACnD,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;IACxB,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"kinematic.js","sourceRoot":"","sources":["../../../../src/systems/kinematic.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { type Entity, type System, type World } from "@vworlds/vecs";
2
- import { type PhysicsState } from "../adapter/state.js";
3
- export declare function installBodyLifecycle(world: World, state: PhysicsState, phase: Entity): System;
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;
@@ -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, state, phase) {
5
+ export function installBodyLifecycle(world, engine, phase) {
5
6
  const system = world.system("PhysicsBodyLifecycle").with(Body).phase(phase);
6
- system.enter((entity) => {
7
- const body = entity.get(Body);
8
- const bodyId = createWasmBodyId(state, entity, body);
9
- state.bodyByEntityWasm.set(entity.eid, bodyId);
10
- state.entityByBodyIndex.set(bodyId.index1, entity.eid);
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
- system.exit((entity) => {
13
- const bodyId = state.bodyByEntityWasm.get(entity.eid);
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
- state.box2d.b2DestroyBody(bodyId);
18
- state.bodyByEntityWasm.delete(entity.eid);
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 = state.bodyByEntityWasm.get(entity.eid);
25
+ const bodyId = body._bodyId;
23
26
  if (bodyId === undefined) {
24
27
  return;
25
28
  }
26
- state.box2d.b2Body_SetType(bodyId, bodyTypeToBox2D(state.box2d, body.type));
29
+ engine.box2d.b2Body_SetType(bodyId, bodyTypeToBox2D(engine.box2d, body.type));
27
30
  if (body.enabled) {
28
- state.box2d.b2Body_Enable(bodyId);
31
+ engine.box2d.b2Body_Enable(bodyId);
29
32
  }
30
33
  else {
31
- state.box2d.b2Body_Disable(bodyId);
34
+ engine.box2d.b2Body_Disable(bodyId);
32
35
  }
33
- state.box2d.b2Body_SetBullet(bodyId, body.bullet);
36
+ engine.box2d.b2Body_SetBullet(bodyId, body.bullet);
34
37
  });
35
- system.update(Damping, (entity, damping) => {
36
- const bodyId = state.bodyByEntityWasm.get(entity.eid);
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
- state.box2d.b2Body_SetLinearDamping(bodyId, damping.linear);
41
- state.box2d.b2Body_SetAngularDamping(bodyId, damping.angular);
47
+ engine.box2d.b2Body_SetLinearDamping(bodyId, damping.linear);
48
+ engine.box2d.b2Body_SetAngularDamping(bodyId, damping.angular);
42
49
  });
43
- system.update(GravityScale, (entity, gravityScale) => {
44
- const bodyId = state.bodyByEntityWasm.get(entity.eid);
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
- state.box2d.b2Body_SetGravityScale(bodyId, gravityScale.value);
60
+ engine.box2d.b2Body_SetGravityScale(bodyId, gravityScale.value);
49
61
  });
50
- system.update(MotionLocks, (entity, locks) => {
51
- const bodyId = state.bodyByEntityWasm.get(entity.eid);
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 state.box2d.b2MotionLocks(), (motionLocks) => {
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
- state.box2d.b2Body_SetMotionLocks(bodyId, motionLocks);
76
+ engine.box2d.b2Body_SetMotionLocks(bodyId, motionLocks);
60
77
  });
61
78
  });
62
- system.update(Sleep, (entity, sleep) => {
63
- const bodyId = state.bodyByEntityWasm.get(entity.eid);
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
- state.box2d.b2Body_EnableSleep(bodyId, sleep.enabled);
68
- state.box2d.b2Body_SetAwake(bodyId, sleep.awake);
69
- state.box2d.b2Body_SetSleepThreshold(bodyId, sleep.threshold);
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
- return system;
93
+ sleepSystem.entity.add(PhysicsSystemTag);
72
94
  }
73
- function createWasmBodyId(state, entity, body) {
74
- const box2d = state.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(state.worldId, def);
123
+ return box2d.b2CreateBody(engine.worldId, def);
102
124
  });
103
125
  }
104
126
  function bodyTypeToBox2D(box2d, type) {
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../../src/systems/lifecycle.ts"],"names":[],"mappings":"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"}
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 System, type World } from "@vworlds/vecs";
2
- import { type PhysicsState } from "../adapter/state.js";
3
- export declare function installMassRecompute(world: World, state: PhysicsState, phase: Entity): System;
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, state, phase) {
4
- return world
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 state.dirtyMassBodies) {
9
- const bodyId = state.bodyByEntityWasm.get(eid);
9
+ for (const eid of engine.dirtyMassBodies) {
10
+ const bodyId = world.getEntity(eid)?.get(Body)?._bodyId;
10
11
  if (bodyId !== undefined) {
11
- state.box2d.b2Body_ApplyMassFromShapes(bodyId);
12
+ engine.box2d.b2Body_ApplyMassFromShapes(bodyId);
12
13
  }
13
14
  }
14
- state.dirtyMassBodies.clear();
15
- if (state.debug) {
16
- warnOnMasslessDynamicBodies(world, state);
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, state) {
21
- for (const [eid, bodyId] of state.bodyByEntityWasm) {
22
- const entity = world.getEntity(eid);
23
- const body = entity?.get(Body);
24
- if (body?.type !== BodyType.Dynamic) {
25
- state.warn.rearm(eid, CODE_DYNAMIC_BODY_WITHOUT_DENSITY);
26
- continue;
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 (state.box2d.b2Body_GetMass(bodyId) === 0) {
29
- state.warn.warnOnce(eid, CODE_DYNAMIC_BODY_WITHOUT_DENSITY, `Entity${eid} is a dynamic body with zero mass after recompute; it will not fall.`);
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
- state.warn.rearm(eid, CODE_DYNAMIC_BODY_WITHOUT_DENSITY);
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;AAGvD,MAAM,iCAAiC,GAAG,8BAA8B,CAAC;AAEzE,MAAM,UAAU,oBAAoB,CAAC,KAAY,EAAE,KAAmB,EAAE,KAAa;IACnF,OAAO,KAAK;SACT,MAAM,CAAC,sBAAsB,CAAC;SAC9B,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,GAAG,EAAE;QACR,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QACD,KAAK,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAE9B,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,2BAA2B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAY,EAAE,KAAmB;IACpE,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,iCAAiC,CAAC,CAAC;YACzD,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,QAAQ,CACjB,GAAG,EACH,iCAAiC,EACjC,SAAS,GAAG,sEAAsE,CACnF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,iCAAiC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;AACH,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 System, type World } from "@vworlds/vecs";
2
- import { type PhysicsState } from "../adapter/state.js";
3
- export declare function installMaterialFilterSync(world: World, state: PhysicsState, phase: Entity): System;
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;