@codexo/exojs-physics 0.13.0 → 0.14.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 +17 -10
- package/dist/esm/Collider.d.ts +17 -6
- package/dist/esm/Collider.js +28 -6
- package/dist/esm/Collider.js.map +1 -1
- package/dist/esm/ContactGraph.d.ts +49 -3
- package/dist/esm/ContactGraph.js +132 -44
- package/dist/esm/ContactGraph.js.map +1 -1
- package/dist/esm/PhysicsBody.d.ts +113 -15
- package/dist/esm/PhysicsBody.js +224 -21
- package/dist/esm/PhysicsBody.js.map +1 -1
- package/dist/esm/PhysicsWorld.d.ts +107 -35
- package/dist/esm/PhysicsWorld.js +136 -31
- package/dist/esm/PhysicsWorld.js.map +1 -1
- package/dist/esm/backend/NativePhysicsBackend.d.ts +5 -0
- package/dist/esm/backend/NativePhysicsBackend.js +14 -0
- package/dist/esm/backend/NativePhysicsBackend.js.map +1 -1
- package/dist/esm/backend/PhysicsBackend.d.ts +9 -1
- package/dist/esm/binding/PhysicsBinding.d.ts +6 -6
- package/dist/esm/binding/PhysicsBinding.js +8 -5
- package/dist/esm/binding/PhysicsBinding.js.map +1 -1
- package/dist/esm/broadphase/SweepAndPrune.d.ts +1 -0
- package/dist/esm/broadphase/SweepAndPrune.js +32 -3
- package/dist/esm/broadphase/SweepAndPrune.js.map +1 -1
- package/dist/esm/collision/CollisionProxy.d.ts +2 -2
- package/dist/esm/collision/narrowphase.js +91 -38
- package/dist/esm/collision/narrowphase.js.map +1 -1
- package/dist/esm/debug/PhysicsDebugDraw.d.ts +2 -1
- package/dist/esm/debug/PhysicsDebugDraw.js +2 -1
- package/dist/esm/debug/PhysicsDebugDraw.js.map +1 -1
- package/dist/esm/physicsBuildInfo.js +2 -2
- package/dist/esm/public.d.ts +2 -1
- package/dist/esm/query/QueryEngine.d.ts +2 -2
- package/dist/esm/query/QueryEngine.js +13 -4
- package/dist/esm/query/QueryEngine.js.map +1 -1
- package/dist/esm/shapes/AnyShape.d.ts +9 -0
- package/dist/esm/shapes/CircleShape.d.ts +1 -2
- package/dist/esm/shapes/CircleShape.js.map +1 -1
- package/dist/esm/shapes/PolygonShape.d.ts +1 -2
- package/dist/esm/shapes/PolygonShape.js +45 -17
- package/dist/esm/shapes/PolygonShape.js.map +1 -1
- package/dist/esm/shapes/index.d.ts +1 -0
- package/dist/esm/solver/ContactSolver.d.ts +87 -0
- package/dist/esm/solver/ContactSolver.js +483 -0
- package/dist/esm/solver/ContactSolver.js.map +1 -0
- package/dist/esm/sort.d.ts +17 -0
- package/dist/esm/sort.js +54 -0
- package/dist/esm/sort.js.map +1 -0
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryEngine.js","sources":["../../../../src/query/QueryEngine.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"QueryEngine.js","sources":["../../../../src/query/QueryEngine.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CircleShape } from './CircleShape';
|
|
2
|
+
import type { PolygonShape } from './PolygonShape';
|
|
3
|
+
/**
|
|
4
|
+
* Discriminated union of the concrete shape kinds. Narrow via the literal
|
|
5
|
+
* `shape.type` discriminant (`'circle'` → {@link CircleShape}, `'polygon'` →
|
|
6
|
+
* {@link PolygonShape}) — no `as` casts needed. {@link BoxShape} is a
|
|
7
|
+
* {@link PolygonShape} subclass and carries `type: 'polygon'`.
|
|
8
|
+
*/
|
|
9
|
+
export type AnyShape = CircleShape | PolygonShape;
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import type { ShapeType } from './Shape';
|
|
2
1
|
import { Shape } from './Shape';
|
|
3
2
|
/**
|
|
4
3
|
* A circle of the given `radius` centred on the collider's local origin.
|
|
5
4
|
* The cheapest shape for both broad- and narrow-phase.
|
|
6
5
|
*/
|
|
7
6
|
export declare class CircleShape extends Shape {
|
|
8
|
-
readonly type:
|
|
7
|
+
readonly type: "circle";
|
|
9
8
|
readonly radius: number;
|
|
10
9
|
readonly boundingRadius: number;
|
|
11
10
|
readonly area: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CircleShape.js","sources":["../../../../src/shapes/CircleShape.ts"],"sourcesContent":[null],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"CircleShape.js","sources":["../../../../src/shapes/CircleShape.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA;;;AAGG;AACG,MAAO,WAAY,SAAQ,KAAK,CAAA;IACpB,IAAI,GAAG,QAAiB;AACxB,IAAA,MAAM;AACN,IAAA,cAAc;AACd,IAAA,IAAI;IACJ,SAAS,GAAG,CAAC;IACb,SAAS,GAAG,CAAC;AACb,IAAA,WAAW;AAE3B,IAAA,WAAA,CAAmB,MAAc,EAAA;AAC/B,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE;AAC3C,YAAA,MAAM,IAAI,UAAU,CAAC,kEAAkE,MAAM,CAAA,CAAA,CAAG,CAAC;QACnG;AAEA,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,cAAc,GAAG,MAAM;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,GAAG,MAAM;;AAErC,QAAA,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,GAAG,MAAM;AAEpD,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IACrB;AACD;;;;"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { VectorLike } from '../types';
|
|
2
|
-
import type { ShapeType } from './Shape';
|
|
3
2
|
import { Shape } from './Shape';
|
|
4
3
|
/**
|
|
5
4
|
* A convex polygon defined by ≥3 local-space vertices. Input vertices may be
|
|
@@ -11,7 +10,7 @@ import { Shape } from './Shape';
|
|
|
11
10
|
* the narrow phase allocation-free; both are frozen.
|
|
12
11
|
*/
|
|
13
12
|
export declare class PolygonShape extends Shape {
|
|
14
|
-
readonly type:
|
|
13
|
+
readonly type: "polygon";
|
|
15
14
|
/** Local-space vertices, CCW, flattened. */
|
|
16
15
|
readonly vertices: readonly number[];
|
|
17
16
|
/** Outward unit edge normals (edge `i` spans vertex `i → i+1`), flattened. */
|
|
@@ -34,19 +34,16 @@ class PolygonShape extends Shape {
|
|
|
34
34
|
throw new RangeError(`PolygonShape: vertex has a non-finite component (${vertex.x}, ${vertex.y}).`);
|
|
35
35
|
}
|
|
36
36
|
// Reject coincident consecutive (and wrap-around) vertices.
|
|
37
|
-
const px = points.length >= 2 ? points[points.length - 2] : NaN;
|
|
38
|
-
const py = points.length >= 2 ? points[points.length - 1] : NaN;
|
|
37
|
+
const px = points.length >= 2 ? (points[points.length - 2] ?? NaN) : NaN;
|
|
38
|
+
const py = points.length >= 2 ? (points[points.length - 1] ?? NaN) : NaN;
|
|
39
39
|
if (Math.hypot(vertex.x - px, vertex.y - py) < weldEpsilon) {
|
|
40
40
|
continue;
|
|
41
41
|
}
|
|
42
42
|
points.push(vertex.x, vertex.y);
|
|
43
43
|
}
|
|
44
|
-
let count = points.length / 2;
|
|
45
44
|
// Drop a wrap-around duplicate (last ≈ first).
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
count -= 1;
|
|
49
|
-
}
|
|
45
|
+
dropWrapAroundDuplicate(points);
|
|
46
|
+
const count = points.length / 2;
|
|
50
47
|
if (count < 3) {
|
|
51
48
|
throw new RangeError(`PolygonShape: needs at least 3 distinct vertices after welding, received ${count}.`);
|
|
52
49
|
}
|
|
@@ -66,9 +63,11 @@ class PolygonShape extends Shape {
|
|
|
66
63
|
let cy = 0;
|
|
67
64
|
let inertiaOrigin = 0;
|
|
68
65
|
for (let i = 0; i < count; i++) {
|
|
66
|
+
const j = (i + 1) % count;
|
|
67
|
+
// Indices are provably in-bounds (0..count-1 over a length-2*count array);
|
|
68
|
+
// the `!` is zero-cost; a violation would surface as NaN, not a silent 0.
|
|
69
69
|
const ix = points[i * 2];
|
|
70
70
|
const iy = points[i * 2 + 1];
|
|
71
|
-
const j = (i + 1) % count;
|
|
72
71
|
const jx = points[j * 2];
|
|
73
72
|
const jy = points[j * 2 + 1];
|
|
74
73
|
const cross = ix * jy - jx * iy;
|
|
@@ -92,13 +91,30 @@ class PolygonShape extends Shape {
|
|
|
92
91
|
// BoxShape (and any future convex helper) can extend this class.
|
|
93
92
|
}
|
|
94
93
|
}
|
|
94
|
+
/** Strip a trailing vertex that coincides with the first (wrap-around weld). */
|
|
95
|
+
const dropWrapAroundDuplicate = (points) => {
|
|
96
|
+
if (points.length < 4) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const firstX = points[0] ?? NaN;
|
|
100
|
+
const firstY = points[1] ?? NaN;
|
|
101
|
+
const lastX = points[points.length - 2] ?? NaN;
|
|
102
|
+
const lastY = points[points.length - 1] ?? NaN;
|
|
103
|
+
if (Math.hypot(firstX - lastX, firstY - lastY) < weldEpsilon) {
|
|
104
|
+
points.length -= 2;
|
|
105
|
+
}
|
|
106
|
+
};
|
|
95
107
|
/** Signed area (positive = CCW). */
|
|
96
108
|
const signedArea = (points) => {
|
|
97
109
|
const count = points.length / 2;
|
|
98
110
|
let sum = 0;
|
|
99
111
|
for (let i = 0; i < count; i++) {
|
|
100
112
|
const j = (i + 1) % count;
|
|
101
|
-
|
|
113
|
+
const ix = points[i * 2];
|
|
114
|
+
const iy = points[i * 2 + 1];
|
|
115
|
+
const jx = points[j * 2];
|
|
116
|
+
const jy = points[j * 2 + 1];
|
|
117
|
+
sum += ix * jy - jx * iy;
|
|
102
118
|
}
|
|
103
119
|
return sum / 2;
|
|
104
120
|
};
|
|
@@ -108,8 +124,10 @@ const reverseWinding = (points) => {
|
|
|
108
124
|
const j = count - 1 - i;
|
|
109
125
|
const ix = points[i * 2];
|
|
110
126
|
const iy = points[i * 2 + 1];
|
|
111
|
-
|
|
112
|
-
|
|
127
|
+
const jx = points[j * 2];
|
|
128
|
+
const jy = points[j * 2 + 1];
|
|
129
|
+
points[i * 2] = jx;
|
|
130
|
+
points[i * 2 + 1] = jy;
|
|
113
131
|
points[j * 2] = ix;
|
|
114
132
|
points[j * 2 + 1] = iy;
|
|
115
133
|
}
|
|
@@ -120,8 +138,12 @@ const computeNormals = (points) => {
|
|
|
120
138
|
const normals = [];
|
|
121
139
|
for (let i = 0; i < count; i++) {
|
|
122
140
|
const j = (i + 1) % count;
|
|
123
|
-
const
|
|
124
|
-
const
|
|
141
|
+
const ix = points[i * 2];
|
|
142
|
+
const iy = points[i * 2 + 1];
|
|
143
|
+
const jx = points[j * 2];
|
|
144
|
+
const jy = points[j * 2 + 1];
|
|
145
|
+
const ex = jx - ix;
|
|
146
|
+
const ey = jy - iy;
|
|
125
147
|
const length = Math.hypot(ex, ey);
|
|
126
148
|
normals.push(ey / length, -ex / length);
|
|
127
149
|
}
|
|
@@ -134,10 +156,16 @@ const assertConvex = (points) => {
|
|
|
134
156
|
const a = i;
|
|
135
157
|
const b = (i + 1) % count;
|
|
136
158
|
const c = (i + 2) % count;
|
|
137
|
-
const
|
|
138
|
-
const
|
|
139
|
-
const
|
|
140
|
-
const
|
|
159
|
+
const ax = points[a * 2];
|
|
160
|
+
const ay = points[a * 2 + 1];
|
|
161
|
+
const bx = points[b * 2];
|
|
162
|
+
const by = points[b * 2 + 1];
|
|
163
|
+
const cx = points[c * 2];
|
|
164
|
+
const cy = points[c * 2 + 1];
|
|
165
|
+
const e1x = bx - ax;
|
|
166
|
+
const e1y = by - ay;
|
|
167
|
+
const e2x = cx - bx;
|
|
168
|
+
const e2y = cy - by;
|
|
141
169
|
// CCW polygon ⇒ every cross product must be ≥ 0 (strictly > 0 for no collinear run).
|
|
142
170
|
if (e1x * e2y - e1y * e2x <= 0) {
|
|
143
171
|
throw new RangeError('PolygonShape: vertices are not strictly convex (or contain collinear edges).');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolygonShape.js","sources":["../../../../src/shapes/PolygonShape.ts"],"sourcesContent":[null],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"PolygonShape.js","sources":["../../../../src/shapes/PolygonShape.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { ContactRecord } from '../ContactGraph';
|
|
2
|
+
/**
|
|
3
|
+
* Native warm-started **TGS-Soft** contact solver (Box2D-v3 "soft step"). Driven
|
|
4
|
+
* by {@link PhysicsWorld} as a sub-stepping loop: detection runs once per frame,
|
|
5
|
+
* then {@link prepare} builds the per-contact constraints (effective masses,
|
|
6
|
+
* frame-start separation + impact velocity, soft factors, and a 2×2 block matrix
|
|
7
|
+
* for two-point manifolds) **once**, and each sub-step runs
|
|
8
|
+
* {@link warmStart} → {@link solveVelocities}(useBias=true) → integrate positions
|
|
9
|
+
* → {@link solveVelocities}(useBias=false) relax. A final {@link applyRestitution}
|
|
10
|
+
* pass adds bounce above the threshold.
|
|
11
|
+
*
|
|
12
|
+
* The position constraint is folded into the velocity solve as a **soft bias**
|
|
13
|
+
* (a damped-spring push-out whose stiffness is decoupled from the iteration
|
|
14
|
+
* count), recomputed each pass from the live per-body delta position/rotation —
|
|
15
|
+
* so there is no separate NGS geometric pass. The contact anchors are rotated by
|
|
16
|
+
* the live sub-step rotation each pass, so a tilting stack's restoring torque is
|
|
17
|
+
* computed against its current orientation (without this the tilt grows instead
|
|
18
|
+
* of being corrected). Two-point manifolds still solve the normal impulses **as a
|
|
19
|
+
* 2×2 block LCP** (Box2D-style), which propagates stack loads far better than
|
|
20
|
+
* solving the points sequentially; the block path carries the soft push-out as
|
|
21
|
+
* its velocity target (hard mass scale), while single-point contacts use the full
|
|
22
|
+
* soft mass/impulse scaling. Accumulated impulses are written back to each
|
|
23
|
+
* {@link ContactRecord} for warm-starting the next frame.
|
|
24
|
+
*
|
|
25
|
+
* Internal to {@link NativePhysicsBackend}; not part of the public surface.
|
|
26
|
+
*/
|
|
27
|
+
export declare class ContactSolver {
|
|
28
|
+
private readonly _constraints;
|
|
29
|
+
private _count;
|
|
30
|
+
/**
|
|
31
|
+
* Build the per-contact constraints for this frame from the touching solid
|
|
32
|
+
* contacts. `h` is the sub-step duration (`fixedDelta / subStepCount`); the
|
|
33
|
+
* soft factors are derived from it together with `contactHertz`/`dampingRatio`.
|
|
34
|
+
* Runs once per frame (detection is not repeated per sub-step).
|
|
35
|
+
*/
|
|
36
|
+
prepare(contacts: readonly ContactRecord[], h: number, contactHertz: number, dampingRatio: number): void;
|
|
37
|
+
/** Re-apply the cached impulses from the previous frame (warm-starting); runs each sub-step. */
|
|
38
|
+
warmStart(): void;
|
|
39
|
+
/**
|
|
40
|
+
* One velocity pass over every contact: the normal constraint (block when
|
|
41
|
+
* possible) then friction (Coulomb cone). With `useBias` the normal solve
|
|
42
|
+
* carries the soft push-out bias (the main pass, recomputed from the live
|
|
43
|
+
* separation); without it the relax pass drives the normal velocity to zero so
|
|
44
|
+
* the bias velocity does not remain in the bodies as injected energy.
|
|
45
|
+
*/
|
|
46
|
+
solveVelocities(useBias: boolean): void;
|
|
47
|
+
/**
|
|
48
|
+
* Restitution pass, run once after the sub-step loop. For each loaded point
|
|
49
|
+
* whose frame-start impact speed exceeded the threshold, add the impulse that
|
|
50
|
+
* brings the post-solve normal velocity to `−restitution·impactSpeed`. Kept
|
|
51
|
+
* separate from the main solve so resting contacts (impact below threshold) do
|
|
52
|
+
* not micro-bounce.
|
|
53
|
+
*/
|
|
54
|
+
applyRestitution(): void;
|
|
55
|
+
/** Refresh the live (rotated) contact arms from each body's accumulated sub-step rotation. */
|
|
56
|
+
private _updateArms;
|
|
57
|
+
private _solveVelocityContact;
|
|
58
|
+
/** Per-point friction: clamp the accumulated tangent impulse to the Coulomb cone `±μ·normalImpulse`. */
|
|
59
|
+
private _solveFriction;
|
|
60
|
+
/**
|
|
61
|
+
* Single-point (or ill-conditioned) soft normal solve, accumulated and clamped
|
|
62
|
+
* ≥ 0. The Box2D-v3 incremental form: with the soft bias active the impulse is
|
|
63
|
+
* `−normalMass·massScale·(vn − bias) − impulseScale·accumulated`, which both
|
|
64
|
+
* pushes out the penetration and bleeds a little stored impulse (the damped
|
|
65
|
+
* spring). The relax pass passes `useBias=false`, collapsing it to the hard
|
|
66
|
+
* `−normalMass·vn` (no bias, full mass, no impulse decay).
|
|
67
|
+
*/
|
|
68
|
+
private _solveNormalSequential;
|
|
69
|
+
/**
|
|
70
|
+
* Two-point block normal solve (Box2D LCP): find both new normal impulses
|
|
71
|
+
* `x ≥ 0` so the post-solve normal velocities equal the push-out targets
|
|
72
|
+
* (`velocityBias`, zero in the relax pass) and are complementary, trying the
|
|
73
|
+
* four corners (both active, one active, none). The block path carries the
|
|
74
|
+
* soft push-out as its target but solves with a hard mass scale.
|
|
75
|
+
*/
|
|
76
|
+
private _solveNormalBlock;
|
|
77
|
+
/** Apply the two-point block impulse deltas `(d1, d2)` along the normal at both contact points. */
|
|
78
|
+
private _applyBlock;
|
|
79
|
+
private _acquire;
|
|
80
|
+
/**
|
|
81
|
+
* Pooled constraint at `ci`. Every caller indexes within `0..this._count-1`
|
|
82
|
+
* and `_count` never exceeds the pool length, so the entry always exists; the
|
|
83
|
+
* throw is unreachable and only discharges `noUncheckedIndexedAccess` without a
|
|
84
|
+
* cast or non-null assertion.
|
|
85
|
+
*/
|
|
86
|
+
private _at;
|
|
87
|
+
}
|