@codexo/exojs-physics 0.15.2 → 0.16.0
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/README.md +51 -23
- package/dist/esm/Aabb.d.ts +6 -10
- package/dist/esm/Aabb.d.ts.map +1 -0
- package/dist/esm/Aabb.js +9 -5
- package/dist/esm/Aabb.js.map +1 -1
- package/dist/esm/Collider.d.ts +62 -10
- package/dist/esm/Collider.d.ts.map +1 -0
- package/dist/esm/Collider.js +263 -157
- package/dist/esm/Collider.js.map +1 -1
- package/dist/esm/ContactGraph.d.ts +51 -5
- package/dist/esm/ContactGraph.d.ts.map +1 -0
- package/dist/esm/ContactGraph.js +282 -223
- package/dist/esm/ContactGraph.js.map +1 -1
- package/dist/esm/ContactModifier.d.ts +85 -0
- package/dist/esm/ContactModifier.d.ts.map +1 -0
- package/dist/esm/ContactModifier.js +49 -0
- package/dist/esm/ContactModifier.js.map +1 -0
- package/dist/esm/PhysicsBody.d.ts +56 -22
- package/dist/esm/PhysicsBody.d.ts.map +1 -0
- package/dist/esm/PhysicsBody.js +461 -443
- package/dist/esm/PhysicsBody.js.map +1 -1
- package/dist/esm/PhysicsWorld.d.ts +276 -43
- package/dist/esm/PhysicsWorld.d.ts.map +1 -0
- package/dist/esm/PhysicsWorld.js +890 -626
- package/dist/esm/PhysicsWorld.js.map +1 -1
- package/dist/esm/TimeStepper.d.ts +3 -2
- package/dist/esm/TimeStepper.d.ts.map +1 -0
- package/dist/esm/TimeStepper.js +56 -67
- package/dist/esm/TimeStepper.js.map +1 -1
- package/dist/esm/backend/NativePhysicsBackend.d.ts +8 -4
- package/dist/esm/backend/NativePhysicsBackend.d.ts.map +1 -0
- package/dist/esm/backend/NativePhysicsBackend.js +48 -41
- package/dist/esm/backend/NativePhysicsBackend.js.map +1 -1
- package/dist/esm/backend/PhysicsBackend.d.ts +9 -2
- package/dist/esm/backend/PhysicsBackend.d.ts.map +1 -0
- package/dist/esm/binding/BindingRegistry.d.ts +25 -4
- package/dist/esm/binding/BindingRegistry.d.ts.map +1 -0
- package/dist/esm/binding/BindingRegistry.js +70 -36
- package/dist/esm/binding/BindingRegistry.js.map +1 -1
- package/dist/esm/binding/PhysicsBinding.d.ts +22 -5
- package/dist/esm/binding/PhysicsBinding.d.ts.map +1 -0
- package/dist/esm/binding/PhysicsBinding.js +46 -21
- package/dist/esm/binding/PhysicsBinding.js.map +1 -1
- package/dist/esm/broadphase/AabbTreeBroadPhase.d.ts +68 -0
- package/dist/esm/broadphase/AabbTreeBroadPhase.d.ts.map +1 -0
- package/dist/esm/broadphase/AabbTreeBroadPhase.js +149 -0
- package/dist/esm/broadphase/AabbTreeBroadPhase.js.map +1 -0
- package/dist/esm/broadphase/BroadPhase.d.ts +7 -4
- package/dist/esm/broadphase/BroadPhase.d.ts.map +1 -0
- package/dist/esm/broadphase/index.d.ts +2 -1
- package/dist/esm/broadphase/index.d.ts.map +1 -0
- package/dist/esm/collision/CollisionProxy.d.ts +3 -2
- package/dist/esm/collision/CollisionProxy.d.ts.map +1 -0
- package/dist/esm/collision/Manifold.d.ts +5 -4
- package/dist/esm/collision/Manifold.d.ts.map +1 -0
- package/dist/esm/collision/Manifold.js +34 -25
- package/dist/esm/collision/Manifold.js.map +1 -1
- package/dist/esm/collision/chainAdjacency.d.ts +29 -0
- package/dist/esm/collision/chainAdjacency.d.ts.map +1 -0
- package/dist/esm/collision/chainAdjacency.js +44 -0
- package/dist/esm/collision/chainAdjacency.js.map +1 -0
- package/dist/esm/collision/dispatch.d.ts +35 -0
- package/dist/esm/collision/dispatch.d.ts.map +1 -0
- package/dist/esm/collision/dispatch.js +58 -0
- package/dist/esm/collision/dispatch.js.map +1 -0
- package/dist/esm/collision/index.d.ts +2 -0
- package/dist/esm/collision/index.d.ts.map +1 -0
- package/dist/esm/collision/narrowphase.d.ts +5 -2
- package/dist/esm/collision/narrowphase.d.ts.map +1 -0
- package/dist/esm/collision/narrowphase.js +524 -399
- package/dist/esm/collision/narrowphase.js.map +1 -1
- package/dist/esm/collision/segments.d.ts +19 -0
- package/dist/esm/collision/segments.d.ts.map +1 -0
- package/dist/esm/collision/segments.js +36 -0
- package/dist/esm/collision/segments.js.map +1 -0
- package/dist/esm/collision/sweep.d.ts +35 -0
- package/dist/esm/collision/sweep.d.ts.map +1 -0
- package/dist/esm/collision/sweep.js +437 -0
- package/dist/esm/collision/sweep.js.map +1 -0
- package/dist/esm/debug/PhysicsDebugDraw.d.ts +23 -4
- package/dist/esm/debug/PhysicsDebugDraw.d.ts.map +1 -0
- package/dist/esm/debug/PhysicsDebugDraw.js +230 -188
- package/dist/esm/debug/PhysicsDebugDraw.js.map +1 -1
- package/dist/esm/debug/index.d.ts +1 -0
- package/dist/esm/debug/index.d.ts.map +1 -0
- package/dist/esm/debug/index.js +3 -2
- package/dist/esm/events.d.ts +1 -0
- package/dist/esm/events.d.ts.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +24 -19
- package/dist/esm/joints/DistanceJoint.d.ts +4 -3
- package/dist/esm/joints/DistanceJoint.d.ts.map +1 -0
- package/dist/esm/joints/DistanceJoint.js +160 -172
- package/dist/esm/joints/DistanceJoint.js.map +1 -1
- package/dist/esm/joints/Joint.d.ts +5 -4
- package/dist/esm/joints/Joint.d.ts.map +1 -0
- package/dist/esm/joints/Joint.js +23 -21
- package/dist/esm/joints/Joint.js.map +1 -1
- package/dist/esm/joints/MouseJoint.d.ts +8 -7
- package/dist/esm/joints/MouseJoint.d.ts.map +1 -0
- package/dist/esm/joints/MouseJoint.js +132 -133
- package/dist/esm/joints/MouseJoint.js.map +1 -1
- package/dist/esm/joints/PrismaticJoint.d.ts +5 -4
- package/dist/esm/joints/PrismaticJoint.d.ts.map +1 -0
- package/dist/esm/joints/PrismaticJoint.js +211 -240
- package/dist/esm/joints/PrismaticJoint.js.map +1 -1
- package/dist/esm/joints/RevoluteJoint.d.ts +4 -3
- package/dist/esm/joints/RevoluteJoint.d.ts.map +1 -0
- package/dist/esm/joints/RevoluteJoint.js +191 -213
- package/dist/esm/joints/RevoluteJoint.js.map +1 -1
- package/dist/esm/joints/WeldJoint.d.ts +3 -2
- package/dist/esm/joints/WeldJoint.d.ts.map +1 -0
- package/dist/esm/joints/WeldJoint.js +156 -152
- package/dist/esm/joints/WeldJoint.js.map +1 -1
- package/dist/esm/joints/WheelJoint.d.ts +4 -3
- package/dist/esm/joints/WheelJoint.d.ts.map +1 -0
- package/dist/esm/joints/WheelJoint.js +228 -255
- package/dist/esm/joints/WheelJoint.js.map +1 -1
- package/dist/esm/math.d.ts +6 -9
- package/dist/esm/math.d.ts.map +1 -0
- package/dist/esm/math.js +37 -39
- package/dist/esm/math.js.map +1 -1
- package/dist/esm/physicsBuildInfo.d.ts +1 -0
- package/dist/esm/physicsBuildInfo.d.ts.map +1 -0
- package/dist/esm/physicsBuildInfo.js +6 -4
- package/dist/esm/physicsBuildInfo.js.map +1 -1
- package/dist/esm/public.d.ts +8 -3
- package/dist/esm/public.d.ts.map +1 -0
- package/dist/esm/query/QueryEngine.d.ts +56 -12
- package/dist/esm/query/QueryEngine.d.ts.map +1 -0
- package/dist/esm/query/QueryEngine.js +494 -237
- package/dist/esm/query/QueryEngine.js.map +1 -1
- package/dist/esm/query/SpatialIndex.d.ts +34 -0
- package/dist/esm/query/SpatialIndex.d.ts.map +1 -0
- package/dist/esm/shapes/AnyShape.d.ts +9 -4
- package/dist/esm/shapes/AnyShape.d.ts.map +1 -0
- package/dist/esm/shapes/BoxShape.d.ts +2 -1
- package/dist/esm/shapes/BoxShape.d.ts.map +1 -0
- package/dist/esm/shapes/BoxShape.js +37 -25
- package/dist/esm/shapes/BoxShape.js.map +1 -1
- package/dist/esm/shapes/CapsuleShape.d.ts +30 -0
- package/dist/esm/shapes/CapsuleShape.d.ts.map +1 -0
- package/dist/esm/shapes/CapsuleShape.js +88 -0
- package/dist/esm/shapes/CapsuleShape.js.map +1 -0
- package/dist/esm/shapes/ChainEdgeShape.d.ts +30 -0
- package/dist/esm/shapes/ChainEdgeShape.d.ts.map +1 -0
- package/dist/esm/shapes/ChainEdgeShape.js +66 -0
- package/dist/esm/shapes/ChainEdgeShape.js.map +1 -0
- package/dist/esm/shapes/ChainShape.d.ts +52 -0
- package/dist/esm/shapes/ChainShape.d.ts.map +1 -0
- package/dist/esm/shapes/ChainShape.js +85 -0
- package/dist/esm/shapes/ChainShape.js.map +1 -0
- package/dist/esm/shapes/CircleShape.d.ts +3 -4
- package/dist/esm/shapes/CircleShape.d.ts.map +1 -0
- package/dist/esm/shapes/CircleShape.js +27 -26
- package/dist/esm/shapes/CircleShape.js.map +1 -1
- package/dist/esm/shapes/PolygonShape.d.ts +7 -8
- package/dist/esm/shapes/PolygonShape.d.ts.map +1 -0
- package/dist/esm/shapes/PolygonShape.js +131 -162
- package/dist/esm/shapes/PolygonShape.js.map +1 -1
- package/dist/esm/shapes/SegmentShape.d.ts +31 -0
- package/dist/esm/shapes/SegmentShape.d.ts.map +1 -0
- package/dist/esm/shapes/SegmentShape.js +62 -0
- package/dist/esm/shapes/SegmentShape.js.map +1 -0
- package/dist/esm/shapes/Shape.d.ts +28 -17
- package/dist/esm/shapes/Shape.d.ts.map +1 -0
- package/dist/esm/shapes/Shape.js +12 -13
- package/dist/esm/shapes/Shape.js.map +1 -1
- package/dist/esm/shapes/convexParts.d.ts +21 -0
- package/dist/esm/shapes/convexParts.d.ts.map +1 -0
- package/dist/esm/shapes/convexParts.js +26 -0
- package/dist/esm/shapes/convexParts.js.map +1 -0
- package/dist/esm/shapes/decompose.d.ts +24 -0
- package/dist/esm/shapes/decompose.d.ts.map +1 -0
- package/dist/esm/shapes/decompose.js +272 -0
- package/dist/esm/shapes/decompose.js.map +1 -0
- package/dist/esm/shapes/index.d.ts +4 -0
- package/dist/esm/shapes/index.d.ts.map +1 -0
- package/dist/esm/solver/ContactSolver.d.ts +12 -5
- package/dist/esm/solver/ContactSolver.d.ts.map +1 -0
- package/dist/esm/solver/ContactSolver.js +425 -471
- package/dist/esm/solver/ContactSolver.js.map +1 -1
- package/dist/esm/solver/tolerances.d.ts +34 -0
- package/dist/esm/solver/tolerances.d.ts.map +1 -0
- package/dist/esm/solver/tolerances.js +38 -0
- package/dist/esm/solver/tolerances.js.map +1 -0
- package/dist/esm/sort.d.ts +5 -4
- package/dist/esm/sort.d.ts.map +1 -0
- package/dist/esm/sort.js +41 -51
- package/dist/esm/sort.js.map +1 -1
- package/dist/esm/types.d.ts +4 -8
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +15 -17
- package/dist/esm/types.js.map +1 -1
- package/package.json +6 -6
- package/dist/esm/broadphase/SweepAndPrune.d.ts +0 -15
- package/dist/esm/broadphase/SweepAndPrune.js +0 -77
- package/dist/esm/broadphase/SweepAndPrune.js.map +0 -1
- package/dist/esm/debug/index.js.map +0 -1
- package/dist/esm/index.js.map +0 -1
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { Collider } from './Collider';
|
|
2
|
+
import type { ContactRecord } from './ContactGraph';
|
|
3
|
+
import type { PhysicsBody } from './PhysicsBody';
|
|
4
|
+
/**
|
|
5
|
+
* A solid contact as the world's {@link ContactModifier} sees it: the pair that
|
|
6
|
+
* produced it, the contact normal, and the three per-step controls the modifier
|
|
7
|
+
* may change. Everything else is read-only.
|
|
8
|
+
*
|
|
9
|
+
* The object is reused for every contact and is only valid for the duration of
|
|
10
|
+
* the callback - read what you need, write the controls, do not retain it.
|
|
11
|
+
*
|
|
12
|
+
* Writing a control affects this step only; the values are re-derived from the
|
|
13
|
+
* two colliders before the modifier runs again.
|
|
14
|
+
*
|
|
15
|
+
* A chain collider is solved per edge, so a body touching several edges of one
|
|
16
|
+
* chain reaches the modifier once per edge, each time with the same authored
|
|
17
|
+
* collider pair. Decide from the contact's own normal and penetration rather
|
|
18
|
+
* than from the pair's identity if that distinction matters.
|
|
19
|
+
*/
|
|
20
|
+
export interface ContactModifierContext {
|
|
21
|
+
readonly colliderA: Collider;
|
|
22
|
+
readonly colliderB: Collider;
|
|
23
|
+
readonly bodyA: PhysicsBody;
|
|
24
|
+
readonly bodyB: PhysicsBody;
|
|
25
|
+
/** X of the unit contact normal, pointing from A towards B. */
|
|
26
|
+
readonly normalX: number;
|
|
27
|
+
/** Y of the unit contact normal, pointing from A towards B. */
|
|
28
|
+
readonly normalY: number;
|
|
29
|
+
/** Manifold points backing this contact: `1` for a vertex/face hit, `2` for a face/face hit. */
|
|
30
|
+
readonly pointCount: number;
|
|
31
|
+
/** Deepest penetration across the manifold points, in px. */
|
|
32
|
+
readonly maxPenetration: number;
|
|
33
|
+
/**
|
|
34
|
+
* Set to `false` to skip this contact in the solver for this step. The
|
|
35
|
+
* contact stays geometrically touching, so `collisionStart`/`collisionEnd`
|
|
36
|
+
* still describe the real geometry; it just applies no impulse, and it does
|
|
37
|
+
* not join the two bodies into one sleeping island. Its warm-start impulses
|
|
38
|
+
* are dropped while it is disabled, so re-enabling it starts cold rather than
|
|
39
|
+
* releasing a stale impulse.
|
|
40
|
+
*/
|
|
41
|
+
enabled: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Coulomb friction for this step. Defaults to `√(a.friction × b.friction)`
|
|
44
|
+
* over the two colliders.
|
|
45
|
+
*/
|
|
46
|
+
friction: number;
|
|
47
|
+
/**
|
|
48
|
+
* Restitution for this step. Defaults to `max(a.restitution, b.restitution)`
|
|
49
|
+
* over the two colliders.
|
|
50
|
+
*/
|
|
51
|
+
restitution: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Called once per solid contact per fixed step, after contact generation and
|
|
55
|
+
* before the solver runs, to adjust that contact for this step - the hook
|
|
56
|
+
* one-way platforms, conditional friction and per-pair material overrides are
|
|
57
|
+
* built on.
|
|
58
|
+
*
|
|
59
|
+
* A world has at most one modifier. It runs before islands are built, so
|
|
60
|
+
* disabling a contact also keeps the two bodies from sleeping as one.
|
|
61
|
+
*/
|
|
62
|
+
export type ContactModifier = (contact: ContactModifierContext) => void;
|
|
63
|
+
/**
|
|
64
|
+
* The single reused {@link ContactModifierContext} instance. Bound to one record
|
|
65
|
+
* at a time so a step over thousands of contacts allocates nothing.
|
|
66
|
+
* @internal
|
|
67
|
+
*/
|
|
68
|
+
export declare class MutableContactModifierContext implements ContactModifierContext {
|
|
69
|
+
colliderA: Collider;
|
|
70
|
+
colliderB: Collider;
|
|
71
|
+
bodyA: PhysicsBody;
|
|
72
|
+
bodyB: PhysicsBody;
|
|
73
|
+
normalX: number;
|
|
74
|
+
normalY: number;
|
|
75
|
+
pointCount: number;
|
|
76
|
+
maxPenetration: number;
|
|
77
|
+
enabled: boolean;
|
|
78
|
+
friction: number;
|
|
79
|
+
restitution: number;
|
|
80
|
+
/** Point this context at `record` and load its current per-step values. */
|
|
81
|
+
bind(record: ContactRecord): void;
|
|
82
|
+
/** Write the (possibly modified) controls back onto the bound record. */
|
|
83
|
+
flush(record: ContactRecord): void;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=ContactModifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContactModifier.d.ts","sourceRoot":"","sources":["../../src/ContactModifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gGAAgG;IAChG,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,6DAA6D;IAC7D,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;;;;;;OAOG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;AAExE;;;;GAIG;AACH,qBAAa,6BAA8B,YAAW,sBAAsB;IACnE,SAAS,EAAG,QAAQ,CAAC;IACrB,SAAS,EAAG,QAAQ,CAAC;IACrB,KAAK,EAAG,WAAW,CAAC;IACpB,KAAK,EAAG,WAAW,CAAC;IACpB,OAAO,SAAK;IACZ,OAAO,SAAK;IACZ,UAAU,SAAK;IACf,cAAc,SAAK;IACnB,OAAO,UAAQ;IACf,QAAQ,SAAK;IACb,WAAW,SAAK;IAEvB,2EAA2E;IACpE,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IA0BxC,yEAAyE;IAClE,KAAK,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;CAK1C"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
//#region src/ContactModifier.ts
|
|
2
|
+
/**
|
|
3
|
+
* The single reused {@link ContactModifierContext} instance. Bound to one record
|
|
4
|
+
* at a time so a step over thousands of contacts allocates nothing.
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
var MutableContactModifierContext = class {
|
|
8
|
+
colliderA;
|
|
9
|
+
colliderB;
|
|
10
|
+
bodyA;
|
|
11
|
+
bodyB;
|
|
12
|
+
normalX = 0;
|
|
13
|
+
normalY = 0;
|
|
14
|
+
pointCount = 0;
|
|
15
|
+
maxPenetration = 0;
|
|
16
|
+
enabled = true;
|
|
17
|
+
friction = 0;
|
|
18
|
+
restitution = 0;
|
|
19
|
+
/** Point this context at `record` and load its current per-step values. */
|
|
20
|
+
bind(record) {
|
|
21
|
+
const manifold = record.manifold;
|
|
22
|
+
this.colliderA = record.ownerA;
|
|
23
|
+
this.colliderB = record.ownerB;
|
|
24
|
+
this.bodyA = record.ownerA.body;
|
|
25
|
+
this.bodyB = record.ownerB.body;
|
|
26
|
+
this.normalX = manifold.normalX;
|
|
27
|
+
this.normalY = manifold.normalY;
|
|
28
|
+
this.pointCount = manifold.pointCount;
|
|
29
|
+
let deepest = 0;
|
|
30
|
+
for (let i = 0; i < manifold.pointCount; i++) {
|
|
31
|
+
const penetration = (i === 0 ? manifold.points[0] : manifold.points[1]).penetration;
|
|
32
|
+
deepest = penetration > deepest ? penetration : deepest;
|
|
33
|
+
}
|
|
34
|
+
this.maxPenetration = deepest;
|
|
35
|
+
this.enabled = record.enabled;
|
|
36
|
+
this.friction = record.friction;
|
|
37
|
+
this.restitution = record.restitution;
|
|
38
|
+
}
|
|
39
|
+
/** Write the (possibly modified) controls back onto the bound record. */
|
|
40
|
+
flush(record) {
|
|
41
|
+
record.enabled = this.enabled;
|
|
42
|
+
record.friction = this.friction;
|
|
43
|
+
record.restitution = this.restitution;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
//#endregion
|
|
48
|
+
export { MutableContactModifierContext };
|
|
49
|
+
//# sourceMappingURL=ContactModifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContactModifier.js","names":[],"sources":["../../src/ContactModifier.ts"],"sourcesContent":["import type { Collider } from './Collider';\nimport type { ContactRecord } from './ContactGraph';\nimport type { PhysicsBody } from './PhysicsBody';\n\n/**\n * A solid contact as the world's {@link ContactModifier} sees it: the pair that\n * produced it, the contact normal, and the three per-step controls the modifier\n * may change. Everything else is read-only.\n *\n * The object is reused for every contact and is only valid for the duration of\n * the callback - read what you need, write the controls, do not retain it.\n *\n * Writing a control affects this step only; the values are re-derived from the\n * two colliders before the modifier runs again.\n *\n * A chain collider is solved per edge, so a body touching several edges of one\n * chain reaches the modifier once per edge, each time with the same authored\n * collider pair. Decide from the contact's own normal and penetration rather\n * than from the pair's identity if that distinction matters.\n */\nexport interface ContactModifierContext {\n readonly colliderA: Collider;\n readonly colliderB: Collider;\n readonly bodyA: PhysicsBody;\n readonly bodyB: PhysicsBody;\n /** X of the unit contact normal, pointing from A towards B. */\n readonly normalX: number;\n /** Y of the unit contact normal, pointing from A towards B. */\n readonly normalY: number;\n /** Manifold points backing this contact: `1` for a vertex/face hit, `2` for a face/face hit. */\n readonly pointCount: number;\n /** Deepest penetration across the manifold points, in px. */\n readonly maxPenetration: number;\n /**\n * Set to `false` to skip this contact in the solver for this step. The\n * contact stays geometrically touching, so `collisionStart`/`collisionEnd`\n * still describe the real geometry; it just applies no impulse, and it does\n * not join the two bodies into one sleeping island. Its warm-start impulses\n * are dropped while it is disabled, so re-enabling it starts cold rather than\n * releasing a stale impulse.\n */\n enabled: boolean;\n /**\n * Coulomb friction for this step. Defaults to `√(a.friction × b.friction)`\n * over the two colliders.\n */\n friction: number;\n /**\n * Restitution for this step. Defaults to `max(a.restitution, b.restitution)`\n * over the two colliders.\n */\n restitution: number;\n}\n\n/**\n * Called once per solid contact per fixed step, after contact generation and\n * before the solver runs, to adjust that contact for this step - the hook\n * one-way platforms, conditional friction and per-pair material overrides are\n * built on.\n *\n * A world has at most one modifier. It runs before islands are built, so\n * disabling a contact also keeps the two bodies from sleeping as one.\n */\nexport type ContactModifier = (contact: ContactModifierContext) => void;\n\n/**\n * The single reused {@link ContactModifierContext} instance. Bound to one record\n * at a time so a step over thousands of contacts allocates nothing.\n * @internal\n */\nexport class MutableContactModifierContext implements ContactModifierContext {\n public colliderA!: Collider;\n public colliderB!: Collider;\n public bodyA!: PhysicsBody;\n public bodyB!: PhysicsBody;\n public normalX = 0;\n public normalY = 0;\n public pointCount = 0;\n public maxPenetration = 0;\n public enabled = true;\n public friction = 0;\n public restitution = 0;\n\n /** Point this context at `record` and load its current per-step values. */\n public bind(record: ContactRecord): void {\n const manifold = record.manifold;\n\n this.colliderA = record.ownerA;\n this.colliderB = record.ownerB;\n this.bodyA = record.ownerA.body;\n this.bodyB = record.ownerB.body;\n this.normalX = manifold.normalX;\n this.normalY = manifold.normalY;\n this.pointCount = manifold.pointCount;\n\n let deepest = 0;\n\n for (let i = 0; i < manifold.pointCount; i++) {\n // i < pointCount <= 2, so the point exists.\n const penetration = (i === 0 ? manifold.points[0] : manifold.points[1]).penetration;\n\n deepest = penetration > deepest ? penetration : deepest;\n }\n\n this.maxPenetration = deepest;\n this.enabled = record.enabled;\n this.friction = record.friction;\n this.restitution = record.restitution;\n }\n\n /** Write the (possibly modified) controls back onto the bound record. */\n public flush(record: ContactRecord): void {\n record.enabled = this.enabled;\n record.friction = this.friction;\n record.restitution = this.restitution;\n }\n}\n"],"mappings":";;;;;;AAsEA,IAAa,gCAAb,MAA6E;CAC3E,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO,UAAU;CACjB,AAAO,UAAU;CACjB,AAAO,aAAa;CACpB,AAAO,iBAAiB;CACxB,AAAO,UAAU;CACjB,AAAO,WAAW;CAClB,AAAO,cAAc;;CAGrB,AAAO,KAAK,QAA6B;EACvC,MAAM,WAAW,OAAO;EAExB,KAAK,YAAY,OAAO;EACxB,KAAK,YAAY,OAAO;EACxB,KAAK,QAAQ,OAAO,OAAO;EAC3B,KAAK,QAAQ,OAAO,OAAO;EAC3B,KAAK,UAAU,SAAS;EACxB,KAAK,UAAU,SAAS;EACxB,KAAK,aAAa,SAAS;EAE3B,IAAI,UAAU;EAEd,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,YAAY,KAAK;GAE5C,MAAM,eAAe,MAAM,IAAI,SAAS,OAAO,KAAK,SAAS,OAAO,GAAE,CAAE;GAExE,UAAU,cAAc,UAAU,cAAc;EAClD;EAEA,KAAK,iBAAiB;EACtB,KAAK,UAAU,OAAO;EACtB,KAAK,WAAW,OAAO;EACvB,KAAK,cAAc,OAAO;CAC5B;;CAGA,AAAO,MAAM,QAA6B;EACxC,OAAO,UAAU,KAAK;EACtB,OAAO,WAAW,KAAK;EACvB,OAAO,cAAc,KAAK;CAC5B;AACF"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
import type { PointLike } from '@codexo/exojs';
|
|
1
2
|
import { Vector } from '@codexo/exojs';
|
|
2
3
|
import { Collider, type ColliderOptions } from './Collider';
|
|
3
4
|
import type { Transform } from './math';
|
|
4
|
-
import type { BodyType
|
|
5
|
+
import type { BodyType } from './types';
|
|
5
6
|
/** Construction options for a body. */
|
|
6
7
|
export interface BodyOptions {
|
|
7
8
|
/** Simulation role. Default `'dynamic'`. */
|
|
8
9
|
type?: BodyType;
|
|
9
10
|
/** Initial world position. Default `(0, 0)`. */
|
|
10
|
-
position?:
|
|
11
|
+
position?: Readonly<PointLike>;
|
|
11
12
|
/** Initial rotation in radians. Default `0`. */
|
|
12
13
|
angle?: number;
|
|
13
14
|
/** Linear damping applied to the velocity each sub-step. Default `0`. */
|
|
@@ -18,7 +19,7 @@ export interface BodyOptions {
|
|
|
18
19
|
gravityScale?: number;
|
|
19
20
|
/** When `true`, the body never rotates under contacts (infinite rotational inertia). Default `false`. */
|
|
20
21
|
fixedRotation?: boolean;
|
|
21
|
-
/** When `true`, the body
|
|
22
|
+
/** When `true`, the body's colliders are shape-cast along each step's motion (CCD) so it cannot tunnel through thin geometry. Default `false`. */
|
|
22
23
|
isBullet?: boolean;
|
|
23
24
|
/** Colliders to attach up-front. Each may be a {@link Collider} instance or its {@link ColliderOptions}. */
|
|
24
25
|
colliders?: Array<Collider | ColliderOptions>;
|
|
@@ -50,7 +51,7 @@ export declare class PhysicsBody {
|
|
|
50
51
|
gravityScale: number;
|
|
51
52
|
/** When `true`, rotational inertia is treated as infinite. */
|
|
52
53
|
fixedRotation: boolean;
|
|
53
|
-
/** When `true`, the body
|
|
54
|
+
/** When `true`, the body's colliders are shape-cast along each step's motion (CCD) so it cannot tunnel through thin geometry. */
|
|
54
55
|
isBullet: boolean;
|
|
55
56
|
/** Total mass (0 for static/kinematic). */
|
|
56
57
|
mass: number;
|
|
@@ -68,32 +69,42 @@ export declare class PhysicsBody {
|
|
|
68
69
|
angularVelocity: number;
|
|
69
70
|
/** When `false`, this body is never put to sleep. Default `true`. */
|
|
70
71
|
allowSleep: boolean;
|
|
71
|
-
/** @internal
|
|
72
|
+
/** @internal - Delta position X accumulated across the frame's sub-steps by the TGS integrator; written into the transform once per frame by {@link _finalizePosition}. */
|
|
72
73
|
_deltaPosX: number;
|
|
73
|
-
/** @internal
|
|
74
|
+
/** @internal - Delta position Y accumulated across the frame's sub-steps by the TGS integrator. */
|
|
74
75
|
_deltaPosY: number;
|
|
75
|
-
/** @internal
|
|
76
|
+
/** @internal - Delta rotation (radians) accumulated across the frame's sub-steps by the TGS integrator. */
|
|
76
77
|
_deltaAngle: number;
|
|
77
|
-
/** @internal
|
|
78
|
+
/** @internal - `cos(_deltaAngle)`, cached so the solver can rotate the contact anchors by the live sub-step rotation without a per-contact trig call. */
|
|
78
79
|
_deltaCos: number;
|
|
79
|
-
/** @internal
|
|
80
|
+
/** @internal - `sin(_deltaAngle)`, cached alongside {@link _deltaCos}. */
|
|
80
81
|
_deltaSin: number;
|
|
81
82
|
private _forceX;
|
|
82
83
|
private _forceY;
|
|
83
84
|
private _torque;
|
|
84
|
-
/** @internal
|
|
85
|
+
/** @internal - seconds the body has stayed below the sleep thresholds (frozen while asleep). Read by the world's island pass. */
|
|
85
86
|
_sleepTime: number;
|
|
86
|
-
/** @internal
|
|
87
|
+
/** @internal - dense union-find index assigned by the world's island pass each step. */
|
|
87
88
|
_islandIndex: number;
|
|
88
|
-
/**
|
|
89
|
+
/**
|
|
90
|
+
* @internal - raised by {@link setTransform}, cleared once the fixed step that
|
|
91
|
+
* saw it completes. A static/kinematic body driven by teleporting carries no
|
|
92
|
+
* velocity, so this is the world's only signal that such a body moved and its
|
|
93
|
+
* sleeping contact partners must be woken.
|
|
94
|
+
*/
|
|
95
|
+
_teleported: boolean;
|
|
96
|
+
/** @internal - world-space centre of mass at the start of the current fixed step (CCD swept-test origin). */
|
|
89
97
|
_ccdPrevX: number;
|
|
90
|
-
/** @internal
|
|
98
|
+
/** @internal - see {@link _ccdPrevX}. */
|
|
91
99
|
_ccdPrevY: number;
|
|
92
100
|
private _sleeping;
|
|
93
101
|
private _id;
|
|
94
102
|
private _owner;
|
|
95
103
|
private _attached;
|
|
96
104
|
private readonly _transform;
|
|
105
|
+
private _previousX;
|
|
106
|
+
private _previousY;
|
|
107
|
+
private _previousAngle;
|
|
97
108
|
private readonly _colliders;
|
|
98
109
|
private _comX;
|
|
99
110
|
private _comY;
|
|
@@ -110,6 +121,20 @@ export declare class PhysicsBody {
|
|
|
110
121
|
get y(): number;
|
|
111
122
|
/** Rotation in radians. */
|
|
112
123
|
get angle(): number;
|
|
124
|
+
/**
|
|
125
|
+
* World X at the start of the most recent fixed step. With {@link x} it
|
|
126
|
+
* brackets the last step, which is what an interpolating presentation blends
|
|
127
|
+
* between; a teleport collapses it onto {@link x}. Never read by the solver.
|
|
128
|
+
*/
|
|
129
|
+
get previousX(): number;
|
|
130
|
+
/** World Y at the start of the most recent fixed step; see {@link previousX}. */
|
|
131
|
+
get previousY(): number;
|
|
132
|
+
/**
|
|
133
|
+
* Rotation in radians at the start of the most recent fixed step; see
|
|
134
|
+
* {@link previousX}. Body angles are continuous and unbounded, never wrapped
|
|
135
|
+
* to a range, so this and {@link angle} can be blended with a plain lerp.
|
|
136
|
+
*/
|
|
137
|
+
get previousAngle(): number;
|
|
113
138
|
/** A fresh `Vector` copy of the body's world position. */
|
|
114
139
|
get position(): Vector;
|
|
115
140
|
/** The body's world transform (read-only; mutate via {@link setTransform}). */
|
|
@@ -128,7 +153,7 @@ export declare class PhysicsBody {
|
|
|
128
153
|
get isMassReady(): boolean;
|
|
129
154
|
/** `true` after the owning world has destroyed this body. */
|
|
130
155
|
get destroyed(): boolean;
|
|
131
|
-
/** `true` when the body is asleep
|
|
156
|
+
/** `true` when the body is asleep - skipped by the integrator and solver until woken. */
|
|
132
157
|
get isSleeping(): boolean;
|
|
133
158
|
/**
|
|
134
159
|
* Attach a collider to this body. Accepts a {@link Collider} instance or its
|
|
@@ -143,7 +168,7 @@ export declare class PhysicsBody {
|
|
|
143
168
|
* Set the body's world transform. Resets the body's cached collider geometry
|
|
144
169
|
* immediately so subsequent queries see the new placement. Returns `this`.
|
|
145
170
|
*/
|
|
146
|
-
setTransform(position:
|
|
171
|
+
setTransform(position: Readonly<PointLike>, angle?: number): this;
|
|
147
172
|
/** Refresh every collider's world geometry from the current transform. */
|
|
148
173
|
synchronizeColliders(): void;
|
|
149
174
|
/** World-space centre of mass X (body origin + rotated local centre of mass). */
|
|
@@ -167,17 +192,17 @@ export declare class PhysicsBody {
|
|
|
167
192
|
*/
|
|
168
193
|
applyImpulse(impulseX: number, impulseY: number, pointX?: number, pointY?: number): this;
|
|
169
194
|
/**
|
|
170
|
-
* @internal
|
|
195
|
+
* @internal - integrate velocity from gravity, accumulated forces/torque and
|
|
171
196
|
* damping over the sub-step `h`. No-op for static/kinematic (infinite mass
|
|
172
197
|
* keeps their velocity solver-driven only). Called once per TGS sub-step, so
|
|
173
198
|
* gravity/forces are applied with `h` each sub-step (`N·h = dt`, same total
|
|
174
199
|
* impulse, but the small-step position error scales with `h²`). The
|
|
175
|
-
* force/torque accumulators are **not** cleared here
|
|
200
|
+
* force/torque accumulators are **not** cleared here - they are consumed by
|
|
176
201
|
* every sub-step and cleared once per frame by {@link _finalizePosition}.
|
|
177
202
|
*/
|
|
178
203
|
_integrateVelocity(h: number, gravityX: number, gravityY: number): void;
|
|
179
204
|
/**
|
|
180
|
-
* @internal
|
|
205
|
+
* @internal - accumulate this sub-step's velocity into the per-frame delta
|
|
181
206
|
* position/rotation (TGS sub-stepping). The transform itself is **not** moved
|
|
182
207
|
* here; {@link _finalizePosition} writes the accumulated delta once per frame.
|
|
183
208
|
* Tracking the delta (rather than moving the transform each sub-step) lets the
|
|
@@ -186,13 +211,13 @@ export declare class PhysicsBody {
|
|
|
186
211
|
*/
|
|
187
212
|
_integratePosition(h: number): void;
|
|
188
213
|
/**
|
|
189
|
-
* @internal
|
|
214
|
+
* @internal - advance the sleep timer over one fixed step `dt`. A body below
|
|
190
215
|
* both velocity thresholds accumulates time; a too-fast body, or one that opts
|
|
191
216
|
* out via {@link allowSleep}, resets it. The sleep/wake decision is made per
|
|
192
217
|
* island by the world (so a stack sleeps as a unit) from {@link _sleepTime}.
|
|
193
218
|
*/
|
|
194
219
|
_accumulateSleepTime(dt: number, linearThreshold: number, angularThreshold: number): void;
|
|
195
|
-
/** @internal
|
|
220
|
+
/** @internal - set the sleep state. Sleeping zeroes the velocity; waking resets the sleep timer. */
|
|
196
221
|
_setSleeping(sleeping: boolean): void;
|
|
197
222
|
/**
|
|
198
223
|
* Wake the body if it is asleep, resetting its sleep timer. The rest of its
|
|
@@ -201,7 +226,7 @@ export declare class PhysicsBody {
|
|
|
201
226
|
*/
|
|
202
227
|
wake(): this;
|
|
203
228
|
/**
|
|
204
|
-
* @internal
|
|
229
|
+
* @internal - apply the frame's accumulated delta position/rotation to the
|
|
205
230
|
* transform (rotating about the centre of mass), re-sync collider geometry and
|
|
206
231
|
* clear the force/torque accumulators. Called once per frame after the
|
|
207
232
|
* sub-step loop. Static bodies never move; the force clear still runs (forces
|
|
@@ -213,7 +238,7 @@ export declare class PhysicsBody {
|
|
|
213
238
|
/** Internal: detach a collider (called by the world during destruction). */
|
|
214
239
|
_removeCollider(collider: Collider): void;
|
|
215
240
|
/**
|
|
216
|
-
* @internal
|
|
241
|
+
* @internal - join `owner`'s world with the allocated `id`. Allocates ids for
|
|
217
242
|
* and registers every held collider, then aggregates the mass model and
|
|
218
243
|
* synchronises world geometry. Called once by {@link PhysicsWorld.add}.
|
|
219
244
|
*
|
|
@@ -228,6 +253,15 @@ export declare class PhysicsBody {
|
|
|
228
253
|
_attachToWorld(owner: BodyOwner, id: number): void;
|
|
229
254
|
/** Internal: mark destroyed (called by the world). */
|
|
230
255
|
_markDestroyed(): void;
|
|
256
|
+
/**
|
|
257
|
+
* A dynamic body has to carry mass. Boundary geometry (a segment, a chain)
|
|
258
|
+
* reports no mass properties, and a collider may also be given zero density,
|
|
259
|
+
* so a dynamic body can end up with none at all - which the solver cannot tell
|
|
260
|
+
* apart from a static body, since both have `invMass === 0`. Rejecting it is
|
|
261
|
+
* the difference between a clear error and a body that silently stops moving.
|
|
262
|
+
*/
|
|
263
|
+
private _assertDynamicCarriesMass;
|
|
231
264
|
/** Recompute mass, centre of mass and rotational inertia from the colliders. */
|
|
232
265
|
private _recomputeMass;
|
|
233
266
|
}
|
|
267
|
+
//# sourceMappingURL=PhysicsBody.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhysicsBody.d.ts","sourceRoot":"","sources":["../../src/PhysicsBody.ts"],"names":[],"mappings":"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"}
|