@vworlds/vecs-physics 1.0.25 → 1.0.26
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 +1 -5
- package/adapter/state.js +5 -10
- package/adapter/state.js.map +1 -1
- package/components/body.js +4 -1
- package/components/body.js.map +1 -1
- package/components/geometry.d.ts +14 -6
- package/components/geometry.js +35 -9
- package/components/geometry.js.map +1 -1
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/module.js +17 -7
- package/module.js.map +1 -1
- package/package.json +2 -2
- package/systems/debug.d.ts +3 -4
- package/systems/debug.js +10 -8
- package/systems/debug.js.map +1 -1
- package/systems/event_opt_in_sync.d.ts +2 -2
- package/systems/event_opt_in_sync.js +16 -13
- package/systems/event_opt_in_sync.js.map +1 -1
- package/systems/events.d.ts +2 -2
- package/systems/events.js +3 -1
- package/systems/events.js.map +1 -1
- package/systems/forces.d.ts +2 -2
- package/systems/forces.js +29 -20
- package/systems/forces.js.map +1 -1
- package/systems/impulse_accumulate.d.ts +2 -2
- package/systems/impulse_accumulate.js +5 -3
- package/systems/impulse_accumulate.js.map +1 -1
- package/systems/impulse_zero.d.ts +2 -2
- package/systems/impulse_zero.js +3 -1
- package/systems/impulse_zero.js.map +1 -1
- package/systems/index.d.ts +1 -2
- package/systems/index.js +28 -37
- package/systems/index.js.map +1 -1
- package/systems/kinematic.d.ts +2 -2
- package/systems/kinematic.js +14 -15
- package/systems/kinematic.js.map +1 -1
- package/systems/lifecycle.d.ts +2 -2
- package/systems/lifecycle.js +38 -16
- package/systems/lifecycle.js.map +1 -1
- package/systems/mass_recompute.d.ts +2 -2
- package/systems/mass_recompute.js +10 -8
- package/systems/mass_recompute.js.map +1 -1
- package/systems/material_filter_sync.d.ts +2 -2
- package/systems/material_filter_sync.js +41 -20
- package/systems/material_filter_sync.js.map +1 -1
- package/systems/pose_sync_in.d.ts +2 -2
- package/systems/pose_sync_in.js +33 -9
- package/systems/pose_sync_in.js.map +1 -1
- package/systems/pose_sync_out.d.ts +2 -2
- package/systems/pose_sync_out.js +3 -1
- package/systems/pose_sync_out.js.map +1 -1
- package/systems/shape_lifecycle.d.ts +5 -3
- package/systems/shape_lifecycle.js +90 -102
- package/systems/shape_lifecycle.js.map +1 -1
- package/systems/shape_pose_sync.d.ts +2 -2
- package/systems/shape_pose_sync.js +18 -8
- package/systems/shape_pose_sync.js.map +1 -1
- package/systems/shape_predicates.d.ts +7 -0
- package/systems/shape_predicates.js +4 -0
- package/systems/shape_predicates.js.map +1 -0
- package/systems/step.d.ts +2 -2
- package/systems/step.js +3 -1
- package/systems/step.js.map +1 -1
- package/util/resolve_body.d.ts +2 -2
- package/util/resolve_body.js +5 -7
- 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.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ArrayMap, type EID, type
|
|
1
|
+
import { ArrayMap, type EID, type World } from "@vworlds/vecs";
|
|
2
2
|
import { type WarnSink, WarnDedupe } from "../util/warn.js";
|
|
3
3
|
import { type Box2DModule } from "./runtime.js";
|
|
4
4
|
export type EntityId = EID;
|
|
@@ -53,12 +53,8 @@ export declare class PhysicsState {
|
|
|
53
53
|
readonly maximumLinearSpeed: number;
|
|
54
54
|
readonly enableSleep: boolean;
|
|
55
55
|
readonly enableContinuous: boolean;
|
|
56
|
-
readonly bodyByEntityWasm: Map<number, import("node_modules/box2d3-wasm/build/dist/es/deluxe/Box2D.deluxe.js").b2BodyId>;
|
|
57
56
|
readonly entityByBodyIndex: ArrayMap<number>;
|
|
58
|
-
readonly shapeByEntityWasm: Map<number, import("node_modules/box2d3-wasm/build/dist/es/deluxe/Box2D.deluxe.js").b2ShapeId>;
|
|
59
57
|
readonly entityByShapeIndex: ArrayMap<number>;
|
|
60
|
-
readonly chainByEntity: Map<number, import("node_modules/box2d3-wasm/build/dist/es/deluxe/Box2D.deluxe.js").b2ChainId>;
|
|
61
|
-
readonly shapeEntityByEid: Map<number, Entity>;
|
|
62
58
|
readonly dirtyMassBodies: Set<number>;
|
|
63
59
|
readonly prevTouchedContact: Set<number>;
|
|
64
60
|
readonly prevTouchedSensor: Set<number>;
|
package/adapter/state.js
CHANGED
|
@@ -31,21 +31,15 @@ export function hasPhysics(world) {
|
|
|
31
31
|
}
|
|
32
32
|
export class PhysicsState {
|
|
33
33
|
constructor(box2d, options, warnSink) {
|
|
34
|
-
//
|
|
34
|
+
// Forward handles live on components: Body._bodyId and Shape._shapeId.
|
|
35
|
+
// Index-keyed reverse ArrayMaps resolve Box2D event IDs back to entities.
|
|
35
36
|
// Emscripten returns fresh wrapper objects for b2*Id fields on events, so
|
|
36
37
|
// Map<b2*Id, EntityId> misses by object identity. Public index1 slot 0 is
|
|
37
38
|
// unused/null-aligned by Box2D, so ArrayMap slot 0 stays empty too. We do not
|
|
38
39
|
// check id generations in hot lookups: correctness comes from clearing each
|
|
39
40
|
// slot on Box2D destruction before Box2D can reuse that index1.
|
|
40
|
-
this.bodyByEntityWasm = new Map();
|
|
41
41
|
this.entityByBodyIndex = new ArrayMap();
|
|
42
|
-
this.shapeByEntityWasm = new Map();
|
|
43
42
|
this.entityByShapeIndex = new ArrayMap();
|
|
44
|
-
this.chainByEntity = new Map();
|
|
45
|
-
// Shape entity object map: shape eid → Entity object.
|
|
46
|
-
// Used by events.ts to resolve entities for teardown events even after
|
|
47
|
-
// the entity has been removed from the world lookup table.
|
|
48
|
-
this.shapeEntityByEid = new Map();
|
|
49
43
|
// Bodies whose mass needs recomputing this step (populated by shape lifecycle).
|
|
50
44
|
this.dirtyMassBodies = new Set();
|
|
51
45
|
// Per-step event tracking sets for PhysicsEvents (M7-8 should-fix: moved from
|
|
@@ -60,8 +54,9 @@ export class PhysicsState {
|
|
|
60
54
|
// Cleared by PhysicsImpulseZero at the end of each post phase.
|
|
61
55
|
this.impulseEntitiesThisStep = new Set();
|
|
62
56
|
// Pending impulses remain wrapper-keyed by invariant: hooks resolve bodyId
|
|
63
|
-
//
|
|
64
|
-
// pre-step drain iterates stored keys instead of
|
|
57
|
+
// off the `Body` component via resolveBodyId, then get/set with that same
|
|
58
|
+
// stored wrapper, and the pre-step drain iterates stored keys instead of
|
|
59
|
+
// looking up event wrappers.
|
|
65
60
|
this.pendingLinearImpulse = new Map();
|
|
66
61
|
this.pendingAngularImpulse = new Map();
|
|
67
62
|
this.box2d = box2d;
|
package/adapter/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../src/adapter/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../src/adapter/state.ts"],"names":[],"mappings":"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"}
|
package/components/body.js
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
//
|
|
5
5
|
// These are plain data classes: every field is initialised on the class body so
|
|
6
6
|
// `new C()` yields a valid, default-shaped instance (the Vecs zero-arg
|
|
7
|
-
// contract). No imports from systems/ or adapter/
|
|
7
|
+
// contract). No imports from systems/ or adapter/ beyond type-only `b2*Id`
|
|
8
|
+
// handle types — components are pure data.
|
|
8
9
|
/** Simulation behaviour of a {@link Body}. */
|
|
9
10
|
export var BodyType;
|
|
10
11
|
(function (BodyType) {
|
|
@@ -22,6 +23,8 @@ export class Body {
|
|
|
22
23
|
this.bullet = false;
|
|
23
24
|
this.enabled = true;
|
|
24
25
|
this.allowFastRotation = false;
|
|
26
|
+
/** @internal Engine-owned box2d handle; set by the lifecycle system, undefined until then. */
|
|
27
|
+
this._bodyId = undefined;
|
|
25
28
|
}
|
|
26
29
|
}
|
|
27
30
|
/** Canonical world-space body position. Teleports when written by user code. */
|
package/components/body.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body.js","sourceRoot":"","sources":["../../../../src/components/body.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,+DAA+D;AAC/D,EAAE;AACF,gFAAgF;AAChF,uEAAuE;AACvE,
|
|
1
|
+
{"version":3,"file":"body.js","sourceRoot":"","sources":["../../../../src/components/body.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,+DAA+D;AAC/D,EAAE;AACF,gFAAgF;AAChF,uEAAuE;AACvE,2EAA2E;AAC3E,2CAA2C;AAI3C,8CAA8C;AAC9C,MAAM,CAAN,IAAY,QAOX;AAPD,WAAY,QAAQ;IAClB,gCAAgC;IAChC,6BAAiB,CAAA;IACjB,2EAA2E;IAC3E,mCAAuB,CAAA;IACvB,2DAA2D;IAC3D,+BAAmB,CAAA;AACrB,CAAC,EAPW,QAAQ,KAAR,QAAQ,QAOnB;AAED,kFAAkF;AAClF,MAAM,OAAO,IAAI;IAAjB;QACE,SAAI,GAAG,QAAQ,CAAC,MAAM,CAAC;QACvB,WAAM,GAAG,KAAK,CAAC;QACf,YAAO,GAAG,IAAI,CAAC;QACf,sBAAiB,GAAG,KAAK,CAAC;QAC1B,8FAA8F;QAC9F,YAAO,GAAyB,SAAS,CAAC;IAC5C,CAAC;CAAA;AAED,gFAAgF;AAChF,MAAM,OAAO,QAAQ;IAArB;QACE,MAAC,GAAG,CAAC,CAAC;QACN,MAAC,GAAG,CAAC,CAAC;IACR,CAAC;CAAA;AAED,8EAA8E;AAC9E,MAAM,OAAO,QAAQ;IAArB;QACE,UAAK,GAAG,CAAC,CAAC;IACZ,CAAC;CAAA;AAED,gFAAgF;AAChF,MAAM,OAAO,cAAc;IAA3B;QACE,MAAC,GAAG,CAAC,CAAC;QACN,MAAC,GAAG,CAAC,CAAC;IACR,CAAC;CAAA;AAED,mDAAmD;AACnD,MAAM,OAAO,eAAe;IAA5B;QACE,UAAK,GAAG,CAAC,CAAC;IACZ,CAAC;CAAA"}
|
package/components/geometry.d.ts
CHANGED
|
@@ -3,6 +3,14 @@ export type Vec2 = {
|
|
|
3
3
|
x: number;
|
|
4
4
|
y: number;
|
|
5
5
|
};
|
|
6
|
+
/**
|
|
7
|
+
* Abstract base for the six geometry components. Every shape entity carries
|
|
8
|
+
* exactly one concrete geometry (`Box`, `Circle`, `Capsule`, `Segment`,
|
|
9
|
+
* `Polygon`, or `Chain`); each declares `Implements: [Shape]` so queries and
|
|
10
|
+
* systems can match `Shape` without enumerating every concrete type.
|
|
11
|
+
*/
|
|
12
|
+
export declare abstract class Shape {
|
|
13
|
+
}
|
|
6
14
|
/**
|
|
7
15
|
* Axis-aligned box in local shape space, stored as half extents (`hx`/`hy`) to
|
|
8
16
|
* match Box2D's internal representation. The `width`/`height` accessors are
|
|
@@ -12,7 +20,7 @@ export type Vec2 = {
|
|
|
12
20
|
* still go through `entity.set(Box, …)` or `entity.modified(Box)` for physics
|
|
13
21
|
* to notice. See PLAN → Box accessors.
|
|
14
22
|
*/
|
|
15
|
-
export declare class Box {
|
|
23
|
+
export declare class Box extends Shape {
|
|
16
24
|
hx: number;
|
|
17
25
|
hy: number;
|
|
18
26
|
get width(): number;
|
|
@@ -21,11 +29,11 @@ export declare class Box {
|
|
|
21
29
|
set height(value: number);
|
|
22
30
|
}
|
|
23
31
|
/** Circle geometry. */
|
|
24
|
-
export declare class Circle {
|
|
32
|
+
export declare class Circle extends Shape {
|
|
25
33
|
radius: number;
|
|
26
34
|
}
|
|
27
35
|
/** Capsule geometry: two local endpoints joined by a radius. */
|
|
28
|
-
export declare class Capsule {
|
|
36
|
+
export declare class Capsule extends Shape {
|
|
29
37
|
x1: number;
|
|
30
38
|
y1: number;
|
|
31
39
|
x2: number;
|
|
@@ -33,7 +41,7 @@ export declare class Capsule {
|
|
|
33
41
|
radius: number;
|
|
34
42
|
}
|
|
35
43
|
/** Line-segment geometry. */
|
|
36
|
-
export declare class Segment {
|
|
44
|
+
export declare class Segment extends Shape {
|
|
37
45
|
x1: number;
|
|
38
46
|
y1: number;
|
|
39
47
|
x2: number;
|
|
@@ -44,12 +52,12 @@ export declare class Segment {
|
|
|
44
52
|
* Convexity and vertex count are validated on shape creation, not on every
|
|
45
53
|
* update. See PLAN → Vec2 in Polygon / Chain.
|
|
46
54
|
*/
|
|
47
|
-
export declare class Polygon {
|
|
55
|
+
export declare class Polygon extends Shape {
|
|
48
56
|
vertices: Vec2[];
|
|
49
57
|
radius: number;
|
|
50
58
|
}
|
|
51
59
|
/** Chain geometry for static terrain. Needs at least four points. */
|
|
52
|
-
export declare class Chain {
|
|
60
|
+
export declare class Chain extends Shape {
|
|
53
61
|
points: Vec2[];
|
|
54
62
|
loop: boolean;
|
|
55
63
|
}
|
package/components/geometry.js
CHANGED
|
@@ -1,6 +1,26 @@
|
|
|
1
|
-
// Geometry components. Exactly one per shape entity;
|
|
2
|
-
//
|
|
3
|
-
//
|
|
1
|
+
// Geometry components. Exactly one per shape entity; each declares
|
|
2
|
+
// `Implements: [Shape]` so `PhysicsModule` enforces mutual exclusivity (setting
|
|
3
|
+
// one evicts any previous geometry). Defaults match the documented shapes.
|
|
4
|
+
// Public API — see `docs/components.md`.
|
|
5
|
+
//
|
|
6
|
+
// These are plain data classes: every field is initialised on the class body so
|
|
7
|
+
// `new C()` yields a valid, default-shaped instance (the Vecs zero-arg
|
|
8
|
+
// contract). No imports from systems/ or adapter/ beyond type-only `b2*Id`
|
|
9
|
+
// handle types — components are pure data.
|
|
10
|
+
/**
|
|
11
|
+
* Abstract base for the six geometry components. Every shape entity carries
|
|
12
|
+
* exactly one concrete geometry (`Box`, `Circle`, `Capsule`, `Segment`,
|
|
13
|
+
* `Polygon`, or `Chain`); each declares `Implements: [Shape]` so queries and
|
|
14
|
+
* systems can match `Shape` without enumerating every concrete type.
|
|
15
|
+
*/
|
|
16
|
+
export class Shape {
|
|
17
|
+
constructor() {
|
|
18
|
+
/** @internal Engine-owned box2d handle: a `b2ShapeId` for real shapes, a
|
|
19
|
+
* `b2ChainId` for `Chain`. Set by the shape lifecycle system; undefined
|
|
20
|
+
* until then. */
|
|
21
|
+
this._shapeId = undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
4
24
|
/**
|
|
5
25
|
* Axis-aligned box in local shape space, stored as half extents (`hx`/`hy`) to
|
|
6
26
|
* match Box2D's internal representation. The `width`/`height` accessors are
|
|
@@ -10,8 +30,9 @@
|
|
|
10
30
|
* still go through `entity.set(Box, …)` or `entity.modified(Box)` for physics
|
|
11
31
|
* to notice. See PLAN → Box accessors.
|
|
12
32
|
*/
|
|
13
|
-
export class Box {
|
|
33
|
+
export class Box extends Shape {
|
|
14
34
|
constructor() {
|
|
35
|
+
super(...arguments);
|
|
15
36
|
this.hx = 0.5;
|
|
16
37
|
this.hy = 0.5;
|
|
17
38
|
}
|
|
@@ -29,14 +50,16 @@ export class Box {
|
|
|
29
50
|
}
|
|
30
51
|
}
|
|
31
52
|
/** Circle geometry. */
|
|
32
|
-
export class Circle {
|
|
53
|
+
export class Circle extends Shape {
|
|
33
54
|
constructor() {
|
|
55
|
+
super(...arguments);
|
|
34
56
|
this.radius = 0.5;
|
|
35
57
|
}
|
|
36
58
|
}
|
|
37
59
|
/** Capsule geometry: two local endpoints joined by a radius. */
|
|
38
|
-
export class Capsule {
|
|
60
|
+
export class Capsule extends Shape {
|
|
39
61
|
constructor() {
|
|
62
|
+
super(...arguments);
|
|
40
63
|
this.x1 = -0.5;
|
|
41
64
|
this.y1 = 0;
|
|
42
65
|
this.x2 = 0.5;
|
|
@@ -45,8 +68,9 @@ export class Capsule {
|
|
|
45
68
|
}
|
|
46
69
|
}
|
|
47
70
|
/** Line-segment geometry. */
|
|
48
|
-
export class Segment {
|
|
71
|
+
export class Segment extends Shape {
|
|
49
72
|
constructor() {
|
|
73
|
+
super(...arguments);
|
|
50
74
|
this.x1 = -0.5;
|
|
51
75
|
this.y1 = 0;
|
|
52
76
|
this.x2 = 0.5;
|
|
@@ -58,15 +82,17 @@ export class Segment {
|
|
|
58
82
|
* Convexity and vertex count are validated on shape creation, not on every
|
|
59
83
|
* update. See PLAN → Vec2 in Polygon / Chain.
|
|
60
84
|
*/
|
|
61
|
-
export class Polygon {
|
|
85
|
+
export class Polygon extends Shape {
|
|
62
86
|
constructor() {
|
|
87
|
+
super(...arguments);
|
|
63
88
|
this.vertices = [];
|
|
64
89
|
this.radius = 0;
|
|
65
90
|
}
|
|
66
91
|
}
|
|
67
92
|
/** Chain geometry for static terrain. Needs at least four points. */
|
|
68
|
-
export class Chain {
|
|
93
|
+
export class Chain extends Shape {
|
|
69
94
|
constructor() {
|
|
95
|
+
super(...arguments);
|
|
70
96
|
this.points = [];
|
|
71
97
|
this.loop = false;
|
|
72
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../../../src/components/geometry.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,
|
|
1
|
+
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../../../src/components/geometry.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,gFAAgF;AAChF,2EAA2E;AAC3E,yCAAyC;AACzC,EAAE;AACF,gFAAgF;AAChF,uEAAuE;AACvE,2EAA2E;AAC3E,2CAA2C;AAO3C;;;;;GAKG;AACH,MAAM,OAAgB,KAAK;IAA3B;QACE;;0BAEkB;QAClB,aAAQ,GAAsC,SAAS,CAAC;IAC1D,CAAC;CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,GAAI,SAAQ,KAAK;IAA9B;;QACE,OAAE,GAAG,GAAG,CAAC;QACT,OAAE,GAAG,GAAG,CAAC;IAiBX,CAAC;IAfC,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,IAAI,KAAK,CAAC,KAAa;QACrB,IAAI,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,IAAI,MAAM,CAAC,KAAa;QACtB,IAAI,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC;IACtB,CAAC;CACF;AAED,uBAAuB;AACvB,MAAM,OAAO,MAAO,SAAQ,KAAK;IAAjC;;QACE,WAAM,GAAG,GAAG,CAAC;IACf,CAAC;CAAA;AAED,gEAAgE;AAChE,MAAM,OAAO,OAAQ,SAAQ,KAAK;IAAlC;;QACE,OAAE,GAAG,CAAC,GAAG,CAAC;QACV,OAAE,GAAG,CAAC,CAAC;QACP,OAAE,GAAG,GAAG,CAAC;QACT,OAAE,GAAG,CAAC,CAAC;QACP,WAAM,GAAG,IAAI,CAAC;IAChB,CAAC;CAAA;AAED,6BAA6B;AAC7B,MAAM,OAAO,OAAQ,SAAQ,KAAK;IAAlC;;QACE,OAAE,GAAG,CAAC,GAAG,CAAC;QACV,OAAE,GAAG,CAAC,CAAC;QACP,OAAE,GAAG,GAAG,CAAC;QACT,OAAE,GAAG,CAAC,CAAC;IACT,CAAC;CAAA;AAED;;;;GAIG;AACH,MAAM,OAAO,OAAQ,SAAQ,KAAK;IAAlC;;QACE,aAAQ,GAAW,EAAE,CAAC;QACtB,WAAM,GAAG,CAAC,CAAC;IACb,CAAC;CAAA;AAED,qEAAqE;AACrE,MAAM,OAAO,KAAM,SAAQ,KAAK;IAAhC;;QACE,WAAM,GAAW,EAAE,CAAC;QACpB,SAAI,GAAG,KAAK,CAAC;IACf,CAAC;CAAA"}
|
package/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export { preloadPhysics } from "./adapter/runtime.js";
|
|
|
3
3
|
export { Body, BodyType, Position, Rotation, LinearVelocity, AngularVelocity, } from "./components/body.js";
|
|
4
4
|
export { Damping, GravityScale, MotionLocks, Sleep } from "./components/body_tuning.js";
|
|
5
5
|
export { ShapePosition, ShapeRotation } from "./components/shape_pose.js";
|
|
6
|
-
export { Box, Circle, Capsule, Segment, Polygon, Chain, type Vec2 } from "./components/geometry.js";
|
|
6
|
+
export { Shape, Box, Circle, Capsule, Segment, Polygon, Chain, type Vec2, } from "./components/geometry.js";
|
|
7
7
|
export { Material, CollisionFilter, Sensor } from "./components/material.js";
|
|
8
8
|
export { Force, Torque, Impulse, AngularImpulse } from "./components/force.js";
|
|
9
9
|
export { KinematicTargetPosition, KinematicTargetRotation } from "./components/target.js";
|
package/index.js
CHANGED
|
@@ -11,7 +11,7 @@ export { Damping, GravityScale, MotionLocks, Sleep } from "./components/body_tun
|
|
|
11
11
|
// Shape pose
|
|
12
12
|
export { ShapePosition, ShapeRotation } from "./components/shape_pose.js";
|
|
13
13
|
// Geometry
|
|
14
|
-
export { Box, Circle, Capsule, Segment, Polygon, Chain } from "./components/geometry.js";
|
|
14
|
+
export { Shape, Box, Circle, Capsule, Segment, Polygon, Chain, } from "./components/geometry.js";
|
|
15
15
|
// Material / filter / sensor
|
|
16
16
|
export { Material, CollisionFilter, Sensor } from "./components/material.js";
|
|
17
17
|
// Forces & impulses
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,wEAAwE;AACxE,uBAAuB;AAEvB,cAAc;AACd,OAAO,EAAE,aAAa,EAAuB,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO;AACP,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAE9B,gBAAgB;AAChB,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAExF,aAAa;AACb,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE1E,WAAW;AACX,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,wEAAwE;AACxE,uBAAuB;AAEvB,cAAc;AACd,OAAO,EAAE,aAAa,EAAuB,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO;AACP,OAAO,EACL,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAE9B,gBAAgB;AAChB,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAExF,aAAa;AACb,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE1E,WAAW;AACX,OAAO,EACL,KAAK,EACL,GAAG,EACH,MAAM,EACN,OAAO,EACP,OAAO,EACP,OAAO,EACP,KAAK,GAEN,MAAM,0BAA0B,CAAC;AAElC,6BAA6B;AAC7B,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAE7E,oBAAoB;AACpB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE/E,oBAAoB;AACpB,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAE1F,SAAS;AACT,OAAO,EACL,aAAa,EAEb,YAAY,EAEZ,SAAS,GAEV,MAAM,wBAAwB,CAAC"}
|
package/module.js
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
// `PhysicsModule` wires the physics engine into a Vecs world. It registers every
|
|
2
|
-
// public component, declares geometry
|
|
3
|
-
//
|
|
4
|
-
//
|
|
2
|
+
// public component, declares each geometry component as a `Shape` implementer
|
|
3
|
+
// (mutually exclusive: setting one evicts any previous geometry), ensures the
|
|
4
|
+
// three physics phases exist, creates the Box2D world, installs the physics
|
|
5
|
+
// systems (each tagged with `PhysicsSystemTag`), and attaches the private
|
|
6
|
+
// `PhysicsState`.
|
|
5
7
|
//
|
|
6
8
|
// Registration order matters: Vecs assigns component type ids in registration
|
|
7
9
|
// order, so keeping the order stable keeps ids deterministic across worlds.
|
|
8
|
-
import { insertPhaseAfter, Module, ON_UPDATE, Phase } from "@vworlds/vecs";
|
|
10
|
+
import { Implements, insertPhaseAfter, Module, ON_UPDATE, Phase, } from "@vworlds/vecs";
|
|
9
11
|
import { AngularVelocity, Body, LinearVelocity, Position, Rotation } from "./components/body.js";
|
|
10
12
|
import { Damping, GravityScale, MotionLocks, Sleep } from "./components/body_tuning.js";
|
|
11
|
-
import { Box, Capsule, Chain, Circle, Polygon, Segment } from "./components/geometry.js";
|
|
13
|
+
import { Box, Capsule, Chain, Circle, Polygon, Segment, Shape } from "./components/geometry.js";
|
|
12
14
|
import { AngularImpulse, Force, Impulse, Torque } from "./components/force.js";
|
|
13
15
|
import { CollisionFilter, Material, Sensor } from "./components/material.js";
|
|
14
16
|
import { ContactEvents, HitEvents, SensorEvents } from "./components/events.js";
|
|
@@ -45,6 +47,7 @@ function registerPhysics(world, opts) {
|
|
|
45
47
|
world.component(Sleep);
|
|
46
48
|
world.component(ShapePosition);
|
|
47
49
|
world.component(ShapeRotation);
|
|
50
|
+
world.component(Shape);
|
|
48
51
|
world.component(Box);
|
|
49
52
|
world.component(Circle);
|
|
50
53
|
world.component(Capsule);
|
|
@@ -66,8 +69,15 @@ function registerPhysics(world, opts) {
|
|
|
66
69
|
// 2. Internal, non-exported components (`PhysicsRoot`, `PhysicsSystemTag`),
|
|
67
70
|
// registered in their documented order for deterministic type ids.
|
|
68
71
|
registerInternalComponents(world);
|
|
69
|
-
// 3. Geometry components
|
|
70
|
-
|
|
72
|
+
// 3. Geometry components all implement `Shape`: queries/systems can match
|
|
73
|
+
// `Shape` without enumerating every concrete type, and `Implements`
|
|
74
|
+
// enforces mutual exclusivity (setting one evicts any previous geometry).
|
|
75
|
+
world.component(Box).set(Implements, { interfaces: [Shape] });
|
|
76
|
+
world.component(Circle).set(Implements, { interfaces: [Shape] });
|
|
77
|
+
world.component(Capsule).set(Implements, { interfaces: [Shape] });
|
|
78
|
+
world.component(Segment).set(Implements, { interfaces: [Shape] });
|
|
79
|
+
world.component(Polygon).set(Implements, { interfaces: [Shape] });
|
|
80
|
+
world.component(Chain).set(Implements, { interfaces: [Shape] });
|
|
71
81
|
// 4. Ensure the three physics phase entities exist and are ordered after update.
|
|
72
82
|
const preStep = resolvePhase(world, opts.preStepPhase, DEFAULT_PRE_STEP_PHASE);
|
|
73
83
|
const step = resolvePhase(world, opts.stepPhase, DEFAULT_STEP_PHASE);
|
package/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../../src/module.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../../src/module.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vworlds/vecs-physics",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.26",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./index.js",
|
|
6
6
|
"types": "./index.d.ts",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"url": "git+https://github.com/vworlds/vecs.git"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@vworlds/vecs": "1.0.
|
|
18
|
+
"@vworlds/vecs": "1.0.26",
|
|
19
19
|
"box2d3-wasm": "^5.2.0"
|
|
20
20
|
},
|
|
21
21
|
"license": "MIT"
|
package/systems/debug.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { type Entity, type
|
|
1
|
+
import { type Entity, type World } from "@vworlds/vecs";
|
|
2
2
|
import { type PhysicsState } from "../adapter/state.js";
|
|
3
|
-
/** Create `PhysicsDebugValidation` on `world` in `phase`.
|
|
4
|
-
|
|
5
|
-
export declare function installDebugValidation(world: World, state: PhysicsState, phase: Entity): System;
|
|
3
|
+
/** Create `PhysicsDebugValidation` on `world` in `phase`. */
|
|
4
|
+
export declare function installDebugValidation(world: World, state: PhysicsState, phase: Entity): void;
|
package/systems/debug.js
CHANGED
|
@@ -29,7 +29,8 @@
|
|
|
29
29
|
// warn again. The WarnDedupe key is `(eid, code)`, so each code is independent.
|
|
30
30
|
//
|
|
31
31
|
// Design points:
|
|
32
|
-
// - Uses world.filter() scans (non-reactive)
|
|
32
|
+
// - Uses world.filter() scans (non-reactive); debug validation is opt-in and
|
|
33
|
+
// intentionally trades hot-path structure for simple whole-world checks.
|
|
33
34
|
// An entity enters the relevant filter when it carries the matching
|
|
34
35
|
// component(s), and the validator re-checks it every step.
|
|
35
36
|
// - WarnDedupe instance is owned by PhysicsState (survives across systems).
|
|
@@ -39,12 +40,13 @@
|
|
|
39
40
|
//
|
|
40
41
|
// Upstream docs: docs/debug-validation.md.
|
|
41
42
|
// Polygon validity is checked via b2ComputeHull (box2d3-wasm); see isValidPolygon.
|
|
42
|
-
import {
|
|
43
|
+
import { ArrayMap, ChildOf } from "@vworlds/vecs";
|
|
43
44
|
import { Body, BodyType, Position } from "../components/body.js";
|
|
44
45
|
import { AngularImpulse, Force, Impulse, Torque } from "../components/force.js";
|
|
45
|
-
import {
|
|
46
|
+
import { Chain, Polygon, Shape } from "../components/geometry.js";
|
|
46
47
|
import { Material } from "../components/material.js";
|
|
47
48
|
import { ShapePosition, ShapeRotation } from "../components/shape_pose.js";
|
|
49
|
+
import { PhysicsSystemTag } from "../adapter/state.js";
|
|
48
50
|
// ─── Issue codes ──────────────────────────────────────────────────────────────
|
|
49
51
|
const CODE_SHAPE_WITHOUT_PARENT_BODY = "shape-without-parent-body";
|
|
50
52
|
const CODE_DYNAMIC_BODY_WITHOUT_DENSITY = "dynamic-body-without-density";
|
|
@@ -54,12 +56,11 @@ const CODE_SHAPE_POSITION_ON_BODY = "shape-position-on-body";
|
|
|
54
56
|
const CODE_POSITION_ON_SHAPE_ENTITY = "position-on-shape-entity";
|
|
55
57
|
const CODE_FORCE_WITHOUT_TARGET = "force-without-target";
|
|
56
58
|
// ─── System factory ───────────────────────────────────────────────────────────
|
|
57
|
-
/** Create `PhysicsDebugValidation` on `world` in `phase`.
|
|
58
|
-
* Returns the system so the caller can tag its entity. */
|
|
59
|
+
/** Create `PhysicsDebugValidation` on `world` in `phase`. */
|
|
59
60
|
export function installDebugValidation(world, state, phase) {
|
|
60
61
|
// ── Filters (non-reactive; walked every step) ─────────────────────────────
|
|
61
62
|
// Geometry entities: any entity with at least one geometry component.
|
|
62
|
-
const geomFilter = world.filter(
|
|
63
|
+
const geomFilter = world.filter(Shape);
|
|
63
64
|
// Body entities: any entity with Body.
|
|
64
65
|
const bodyFilter = world.filter(Body);
|
|
65
66
|
// Force-class entities: any entity with a force, torque, impulse, or angular impulse.
|
|
@@ -72,7 +73,7 @@ export function installDebugValidation(world, state, phase) {
|
|
|
72
73
|
// that leave the filter (ShapePosition/ShapeRotation removed). Re-entry into
|
|
73
74
|
// the filter will then produce a fresh warning, completing the re-arm cycle.
|
|
74
75
|
const prevBodyPoseEids = new Set();
|
|
75
|
-
|
|
76
|
+
const system = world
|
|
76
77
|
.system("PhysicsDebugValidation")
|
|
77
78
|
.phase(phase)
|
|
78
79
|
.run(() => {
|
|
@@ -81,6 +82,7 @@ export function installDebugValidation(world, state, phase) {
|
|
|
81
82
|
_validateBodyShapePositionEntities(bodyPoseFilter, prevBodyPoseEids, state.warn);
|
|
82
83
|
_validateForceEntities(forceFilter, state.warn);
|
|
83
84
|
});
|
|
85
|
+
system.entity.add(PhysicsSystemTag);
|
|
84
86
|
}
|
|
85
87
|
// ─── Geometry-entity validation ───────────────────────────────────────────────
|
|
86
88
|
/** Walk every entity with a geometry component and check:
|
|
@@ -144,7 +146,7 @@ function _validateGeomEntities(state, geomFilter, dedupe) {
|
|
|
144
146
|
* dependency on PhysicsState internals. */
|
|
145
147
|
function _validateBodyEntities(geomFilter, bodyFilter, dedupe) {
|
|
146
148
|
// Build a map: body-eid → list of geometry child entities (per this step).
|
|
147
|
-
const geomChildrenByBody = new
|
|
149
|
+
const geomChildrenByBody = new ArrayMap();
|
|
148
150
|
geomFilter.forEach((e) => {
|
|
149
151
|
const parent = e.parent(ChildOf);
|
|
150
152
|
if (parent === undefined || parent.get(Body) === undefined) {
|
package/systems/debug.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../../../src/systems/debug.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,qEAAqE;AACrE,2EAA2E;AAC3E,8BAA8B;AAC9B,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,4EAA4E;AAC5E,EAAE;AACF,gDAAgD;AAChD,8EAA8E;AAC9E,6EAA6E;AAC7E,+EAA+E;AAC/E,gFAAgF;AAChF,iFAAiF;AACjF,gFAAgF;AAChF,gFAAgF;AAChF,gEAAgE;AAChE,2EAA2E;AAC3E,4EAA4E;AAC5E,sDAAsD;AACtD,2EAA2E;AAC3E,iDAAiD;AACjD,+EAA+E;AAC/E,8DAA8D;AAC9D,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,EAAE;AACF,iBAAiB;AACjB,
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../../../src/systems/debug.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,qEAAqE;AACrE,2EAA2E;AAC3E,8BAA8B;AAC9B,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,4EAA4E;AAC5E,EAAE;AACF,gDAAgD;AAChD,8EAA8E;AAC9E,6EAA6E;AAC7E,+EAA+E;AAC/E,gFAAgF;AAChF,iFAAiF;AACjF,gFAAgF;AAChF,gFAAgF;AAChF,gEAAgE;AAChE,2EAA2E;AAC3E,4EAA4E;AAC5E,sDAAsD;AACtD,2EAA2E;AAC3E,iDAAiD;AACjD,+EAA+E;AAC/E,8DAA8D;AAC9D,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,EAAE;AACF,iBAAiB;AACjB,+EAA+E;AAC/E,6EAA6E;AAC7E,wEAAwE;AACxE,+DAA+D;AAC/D,8EAA8E;AAC9E,0EAA0E;AAC1E,gCAAgC;AAChC,yDAAyD;AACzD,EAAE;AACF,2CAA2C;AAC3C,mFAAmF;AAEnF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAkD,MAAM,eAAe,CAAC;AAElG,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAqB,MAAM,qBAAqB,CAAC;AAG1E,iFAAiF;AAEjF,MAAM,8BAA8B,GAAG,2BAA2B,CAAC;AACnE,MAAM,iCAAiC,GAAG,8BAA8B,CAAC;AACzE,MAAM,yBAAyB,GAAG,sBAAsB,CAAC;AACzD,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAC/C,MAAM,2BAA2B,GAAG,wBAAwB,CAAC;AAC7D,MAAM,6BAA6B,GAAG,0BAA0B,CAAC;AACjE,MAAM,yBAAyB,GAAG,sBAAsB,CAAC;AAEzD,iFAAiF;AAEjF,6DAA6D;AAC7D,MAAM,UAAU,sBAAsB,CAAC,KAAY,EAAE,KAAmB,EAAE,KAAa;IACrF,6EAA6E;IAC7E,sEAAsE;IACtE,MAAM,UAAU,GAAW,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE/C,uCAAuC;IACvC,MAAM,UAAU,GAAW,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAE9C,sFAAsF;IACtF,MAAM,WAAW,GAAW,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;IAE5F,gEAAgE;IAChE,MAAM,cAAc,GAAW,KAAK,CAAC,MAAM,CAAC;QAC1C,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC;KACrD,CAAC,CAAC;IAEH,2EAA2E;IAC3E,6EAA6E;IAC7E,6EAA6E;IAC7E,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAO,CAAC;IAExC,MAAM,MAAM,GAAG,KAAK;SACjB,MAAM,CAAC,wBAAwB,CAAC;SAChC,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,GAAG,EAAE;QACR,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACrD,qBAAqB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1D,kCAAkC,CAAC,cAAc,EAAE,gBAAgB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjF,sBAAsB,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IACL,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AACtC,CAAC;AAED,iFAAiF;AAEjF;;;;4CAI4C;AAC5C,SAAS,qBAAqB,CAAC,KAAmB,EAAE,UAAkB,EAAE,MAAkB;IACxF,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACvB,MAAM,GAAG,GAAQ,CAAC,CAAC,GAAG,CAAC;QAEvB,4EAA4E;QAC5E,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,aAAa,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;QAC7E,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,CAAC,QAAQ,CACb,GAAG,EACH,8BAA8B,EAC9B,SAAS,GAAG,4DAA4D,CACzE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,8BAA8B,CAAC,CAAC;QACpD,CAAC;QAED,4EAA4E;QAC5E,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAsB,CAAC;QAChD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,QAAQ,CACb,GAAG,EACH,yBAAyB,EACzB,SAAS,GAAG,mBAAmB,KAAK,CAAC,MAAM,CAAC,MAAM,qCAAqC,CACxF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,4EAA4E;QAC5E,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAwB,CAAC;QACtD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,CAAC,QAAQ,CACb,GAAG,EACH,oBAAoB,EACpB,SAAS,GAAG,mDAAmD,CAChE,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,4EAA4E;QAC5E,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC;QAClD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,QAAQ,CACb,GAAG,EACH,6BAA6B,EAC7B,SAAS,GAAG,oFAAoF,CACjG,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,6BAA6B,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,iFAAiF;AAEjF;;;;;;;;;2CAS2C;AAC3C,SAAS,qBAAqB,CAAC,UAAkB,EAAE,UAAkB,EAAE,MAAkB;IACvF,2EAA2E;IAC3E,MAAM,kBAAkB,GAAG,IAAI,QAAQ,EAAY,CAAC;IAEpD,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACvB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3D,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAQ,MAAM,CAAC,GAAG,CAAC;QAChC,IAAI,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,GAAG,EAAE,CAAC;YACV,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,iEAAiE;IACjE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACvB,MAAM,GAAG,GAAQ,CAAC,CAAC,GAAG,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAS,CAAC;QAEjC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE7C,yDAAyD;QACzD,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,QAAQ,CACb,GAAG,EACH,iCAAiC,EACjC,SAAS,GAAG,oEAAoE,CACjF,CAAC;YACF,OAAO;QACT,CAAC;QAED,4CAA4C;QAC5C,wEAAwE;QACxE,uEAAuE;QACvE,qDAAqD;QACrD,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAyB,CAAC;YACxD,MAAM,OAAO,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;YAC5E,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,eAAe,GAAG,IAAI,CAAC;gBACvB,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,CAAC,QAAQ,CACb,GAAG,EACH,iCAAiC,EACjC,SAAS,GAAG,6EAA6E,CAC1F,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAEhF;;;;mEAImE;AACnE,SAAS,kCAAkC,CACzC,cAAsB,EACtB,gBAA0B,EAC1B,MAAkB;IAElB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAO,CAAC;IAEnC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAQ,CAAC,CAAC,GAAG,CAAC;QACvB,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAErB,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,SAAS,CAAC;QACvD,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,SAAS,CAAC;QAEvD,MAAM,SAAS,GACb,WAAW,IAAI,WAAW;YACxB,CAAC,CAAC,iCAAiC;YACnC,CAAC,CAAC,WAAW;gBACX,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,eAAe,CAAC;QAExB,MAAM,CAAC,QAAQ,CACb,GAAG,EACH,2BAA2B,EAC3B,SAAS,GAAG,iBAAiB,SAAS,UAAU,SAAS,2BAA2B,CACrF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,iFAAiF;IACjF,6EAA6E;IAC7E,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,2BAA2B,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,gBAAgB,CAAC,KAAK,EAAE,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF;;;;GAIG;AACH,SAAS,cAAc,CACrB,KAAmB,EACnB,QAAiD;IAEjD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,CAAC,CAAC,MAAM,EAAE,CAAC;QACb,CAAC;IACH,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,SAAS,sBAAsB,CAAC,WAAmB,EAAE,MAAkB;IACrE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACxB,MAAM,GAAG,GAAQ,CAAC,CAAC,GAAG,CAAC;QACvB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,SAAS,GACb,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC;QAExF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,CAAC,QAAQ,CACb,GAAG,EACH,yBAAyB,EACzB,SAAS,GAAG,gFAAgF,CAC7F,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { type Entity, type
|
|
1
|
+
import { type Entity, type World } from "@vworlds/vecs";
|
|
2
2
|
import { type PhysicsState } from "../adapter/state.js";
|
|
3
|
-
export declare function installEventOptInSync(world: World, state: PhysicsState, phase: Entity):
|
|
3
|
+
export declare function installEventOptInSync(world: World, state: PhysicsState, phase: Entity): void;
|
|
@@ -1,26 +1,29 @@
|
|
|
1
|
+
import { Chain, Shape } from "../components/geometry.js";
|
|
1
2
|
import { ContactEvents, HitEvents, SensorEvents } from "../components/events.js";
|
|
3
|
+
import { PhysicsSystemTag } from "../adapter/state.js";
|
|
2
4
|
export function installEventOptInSync(world, state, phase) {
|
|
5
|
+
world.component(ContactEvents).onAdd((entity) => setEventFlag(state, entity, "contact", true));
|
|
3
6
|
world
|
|
4
7
|
.component(ContactEvents)
|
|
5
|
-
.
|
|
6
|
-
world
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
world.component(
|
|
10
|
-
|
|
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
|
|
8
|
+
.onRemove((entity) => setEventFlag(state, entity, "contact", false));
|
|
9
|
+
world.component(HitEvents).onAdd((entity) => setEventFlag(state, entity, "hit", true));
|
|
10
|
+
world.component(HitEvents).onRemove((entity) => setEventFlag(state, entity, "hit", false));
|
|
11
|
+
world.component(SensorEvents).onAdd((entity) => setEventFlag(state, entity, "sensor", true));
|
|
12
|
+
world.component(SensorEvents).onRemove((entity) => setEventFlag(state, entity, "sensor", false));
|
|
13
|
+
const system = world
|
|
16
14
|
.system("PhysicsEventOptInSync")
|
|
17
15
|
.phase(phase)
|
|
18
16
|
.run(() => {
|
|
19
17
|
// Hook-driven: onAdd/onRemove do the work synchronously during command drain.
|
|
20
18
|
});
|
|
19
|
+
system.entity.add(PhysicsSystemTag);
|
|
21
20
|
}
|
|
22
|
-
function setEventFlag(state,
|
|
23
|
-
const
|
|
21
|
+
function setEventFlag(state, entity, flag, enabled) {
|
|
22
|
+
const shape = entity.get(Shape);
|
|
23
|
+
if (shape === undefined || shape instanceof Chain) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const shapeId = shape._shapeId;
|
|
24
27
|
if (shapeId !== undefined) {
|
|
25
28
|
applyEventFlag(state, shapeId, flag, enabled);
|
|
26
29
|
}
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"event_opt_in_sync.js","sourceRoot":"","sources":["../../../../src/systems/event_opt_in_sync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAqC,MAAM,qBAAqB,CAAC;AAI1F,MAAM,UAAU,qBAAqB,CAAC,KAAY,EAAE,KAAmB,EAAE,KAAa;IACpF,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/F,KAAK;SACF,SAAS,CAAC,aAAa,CAAC;SACxB,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAEvE,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IACvF,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAE3F,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7F,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAEjG,MAAM,MAAM,GAAG,KAAK;SACjB,MAAM,CAAC,uBAAuB,CAAC;SAC/B,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,GAAG,EAAE;QACR,8EAA8E;IAChF,CAAC,CAAC,CAAC;IACL,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,YAAY,CACnB,KAAmB,EACnB,MAAc,EACd,IAAe,EACf,OAAgB;IAEhB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAClD,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,QAAiC,CAAC;IACxD,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"}
|
package/systems/events.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { type Entity, type
|
|
1
|
+
import { type Entity, type World } from "@vworlds/vecs";
|
|
2
2
|
import { type PhysicsState } from "../adapter/state.js";
|
|
3
|
-
export declare function installEvents(world: World, state: PhysicsState, phase: Entity):
|
|
3
|
+
export declare function installEvents(world: World, state: PhysicsState, phase: Entity): void;
|
package/systems/events.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ContactEvents, HitEvents, SensorEvents } from "../components/events.js";
|
|
2
|
+
import { PhysicsSystemTag } from "../adapter/state.js";
|
|
2
3
|
export function installEvents(world, state, phase) {
|
|
3
|
-
|
|
4
|
+
const system = world
|
|
4
5
|
.system("PhysicsEvents")
|
|
5
6
|
.phase(phase)
|
|
6
7
|
.run(() => {
|
|
@@ -29,6 +30,7 @@ export function installEvents(world, state, phase) {
|
|
|
29
30
|
state.prevTouchedHit.add(eid);
|
|
30
31
|
}
|
|
31
32
|
});
|
|
33
|
+
system.entity.add(PhysicsSystemTag);
|
|
32
34
|
}
|
|
33
35
|
// Contact begin/end and hit events all come from a single
|
|
34
36
|
// `b2World_GetContactEvents` poll, so fetch the event block once per step and
|