@codexo/exojs-physics 0.14.0 → 0.15.1
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/dist/esm/PhysicsBody.d.ts +32 -0
- package/dist/esm/PhysicsBody.js +60 -2
- package/dist/esm/PhysicsBody.js.map +1 -1
- package/dist/esm/PhysicsWorld.d.ts +74 -8
- package/dist/esm/PhysicsWorld.js +279 -7
- package/dist/esm/PhysicsWorld.js.map +1 -1
- package/dist/esm/binding/BindingRegistry.d.ts +1 -2
- package/dist/esm/binding/BindingRegistry.js +2 -2
- package/dist/esm/binding/BindingRegistry.js.map +1 -1
- package/dist/esm/binding/PhysicsBinding.d.ts +1 -12
- package/dist/esm/binding/PhysicsBinding.js +1 -3
- package/dist/esm/binding/PhysicsBinding.js.map +1 -1
- package/dist/esm/debug/PhysicsDebugDraw.d.ts +6 -0
- package/dist/esm/debug/PhysicsDebugDraw.js +24 -1
- package/dist/esm/debug/PhysicsDebugDraw.js.map +1 -1
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/joints/DistanceJoint.d.ts +71 -0
- package/dist/esm/joints/DistanceJoint.js +176 -0
- package/dist/esm/joints/DistanceJoint.js.map +1 -0
- package/dist/esm/joints/Joint.d.ts +25 -0
- package/dist/esm/joints/Joint.js +24 -0
- package/dist/esm/joints/Joint.js.map +1 -0
- package/dist/esm/joints/MouseJoint.d.ts +57 -0
- package/dist/esm/joints/MouseJoint.js +137 -0
- package/dist/esm/joints/MouseJoint.js.map +1 -0
- package/dist/esm/joints/PrismaticJoint.d.ts +85 -0
- package/dist/esm/joints/PrismaticJoint.js +241 -0
- package/dist/esm/joints/PrismaticJoint.js.map +1 -0
- package/dist/esm/joints/RevoluteJoint.d.ts +81 -0
- package/dist/esm/joints/RevoluteJoint.js +217 -0
- package/dist/esm/joints/RevoluteJoint.js.map +1 -0
- package/dist/esm/joints/WeldJoint.d.ts +61 -0
- package/dist/esm/joints/WeldJoint.js +159 -0
- package/dist/esm/joints/WeldJoint.js.map +1 -0
- package/dist/esm/joints/WheelJoint.d.ts +92 -0
- package/dist/esm/joints/WheelJoint.js +256 -0
- package/dist/esm/joints/WheelJoint.js.map +1 -0
- package/dist/esm/math.js +15 -1
- package/dist/esm/math.js.map +1 -1
- package/dist/esm/physicsBuildInfo.js +2 -2
- package/dist/esm/public.d.ts +7 -1
- package/dist/esm/solver/ContactSolver.js +7 -0
- package/dist/esm/solver/ContactSolver.js.map +1 -1
- package/package.json +4 -4
package/dist/esm/PhysicsWorld.js
CHANGED
|
@@ -6,6 +6,8 @@ import { PhysicsBody } from './PhysicsBody.js';
|
|
|
6
6
|
import { QueryEngine } from './query/QueryEngine.js';
|
|
7
7
|
import { TimeStepper } from './TimeStepper.js';
|
|
8
8
|
|
|
9
|
+
/** Gap left between a clamped bullet and the surface it hit (so it does not re-hit from inside). */
|
|
10
|
+
const ccdSkin = 0.05;
|
|
9
11
|
/**
|
|
10
12
|
* The collision/query world: owns bodies, colliders, the detection backend,
|
|
11
13
|
* bindings, the query engine and the fixed-step accumulator. Stepped by the
|
|
@@ -52,20 +54,35 @@ class PhysicsWorld {
|
|
|
52
54
|
gravity;
|
|
53
55
|
/** The fixed-step accumulator. */
|
|
54
56
|
timeStepper;
|
|
55
|
-
/** Whether bound nodes interpolate between fixed steps (reserved; no effect yet). */
|
|
56
|
-
interpolation;
|
|
57
57
|
/** TGS-Soft sub-steps per fixed step. */
|
|
58
58
|
subStepCount;
|
|
59
59
|
/** Soft-contact stiffness in Hz. */
|
|
60
60
|
contactHertz;
|
|
61
61
|
/** Soft-contact damping ratio. */
|
|
62
62
|
dampingRatio;
|
|
63
|
+
/** Whether resting bodies are put to sleep. */
|
|
64
|
+
enableSleeping;
|
|
65
|
+
/** Linear sleep threshold (px/s). */
|
|
66
|
+
sleepLinearVelocity;
|
|
67
|
+
/** Angular sleep threshold (rad/s). */
|
|
68
|
+
sleepAngularVelocity;
|
|
69
|
+
/** Seconds below the thresholds before a body sleeps. */
|
|
70
|
+
timeToSleep;
|
|
63
71
|
_backend = new NativePhysicsBackend();
|
|
64
72
|
_bodies = [];
|
|
65
73
|
_colliders = [];
|
|
74
|
+
_joints = [];
|
|
66
75
|
_bindings = new BindingRegistry();
|
|
67
76
|
_query;
|
|
68
77
|
_commands = [];
|
|
78
|
+
/** Pooled union-find parent array for the per-step island pass (reused; sized to the body count). */
|
|
79
|
+
_islandParent = [];
|
|
80
|
+
/** Pooled per-island minimum sleep time, indexed by union-find root. */
|
|
81
|
+
_islandMinSleep = [];
|
|
82
|
+
/** Pooled ray-hit buffer + origin/direction for the CCD swept test. */
|
|
83
|
+
_ccdHits = [];
|
|
84
|
+
_ccdOrigin = { x: 0, y: 0 };
|
|
85
|
+
_ccdDir = { x: 0, y: 0 };
|
|
69
86
|
_nextBodyId = 1;
|
|
70
87
|
_nextColliderId = 1;
|
|
71
88
|
_dispatching = false;
|
|
@@ -76,7 +93,6 @@ class PhysicsWorld {
|
|
|
76
93
|
...(options.fixedDelta !== undefined && { fixedDelta: options.fixedDelta }),
|
|
77
94
|
...(options.maxSubSteps !== undefined && { maxSubSteps: options.maxSubSteps }),
|
|
78
95
|
});
|
|
79
|
-
this.interpolation = options.interpolation ?? true;
|
|
80
96
|
const subStepCount = options.subStepCount ?? 4;
|
|
81
97
|
if (!Number.isInteger(subStepCount) || subStepCount < 1) {
|
|
82
98
|
throw new RangeError(`PhysicsWorld: subStepCount must be an integer ≥ 1, received ${subStepCount}.`);
|
|
@@ -84,6 +100,10 @@ class PhysicsWorld {
|
|
|
84
100
|
this.subStepCount = subStepCount;
|
|
85
101
|
this.contactHertz = options.contactHertz ?? 30;
|
|
86
102
|
this.dampingRatio = options.dampingRatio ?? 10;
|
|
103
|
+
this.enableSleeping = options.enableSleeping ?? true;
|
|
104
|
+
this.sleepLinearVelocity = options.sleepLinearVelocity ?? 5;
|
|
105
|
+
this.sleepAngularVelocity = options.sleepAngularVelocity ?? 0.06;
|
|
106
|
+
this.timeToSleep = options.timeToSleep ?? 0.5;
|
|
87
107
|
this._query = new QueryEngine(this._colliders);
|
|
88
108
|
}
|
|
89
109
|
/** Live bodies (read-only view). */
|
|
@@ -146,7 +166,7 @@ class PhysicsWorld {
|
|
|
146
166
|
],
|
|
147
167
|
});
|
|
148
168
|
this.add(body);
|
|
149
|
-
this.bind(body, node
|
|
169
|
+
this.bind(body, node);
|
|
150
170
|
return body;
|
|
151
171
|
}
|
|
152
172
|
/** Destroy a body and its colliders. Deferred when called inside a callback. */
|
|
@@ -157,6 +177,37 @@ class PhysicsWorld {
|
|
|
157
177
|
destroyCollider(collider) {
|
|
158
178
|
this._defer(() => this._removeCollider(collider));
|
|
159
179
|
}
|
|
180
|
+
/** Live joints (read-only view). */
|
|
181
|
+
get joints() {
|
|
182
|
+
return this._joints;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Add a constraint joint. Construct it first (`new DistanceJoint({ … })`),
|
|
186
|
+
* then add it. Wakes both bodies; safe inside a callback (registration is
|
|
187
|
+
* deferred). Returns the joint.
|
|
188
|
+
*/
|
|
189
|
+
addJoint(joint) {
|
|
190
|
+
this._assertAlive();
|
|
191
|
+
joint.bodyA.wake();
|
|
192
|
+
joint.bodyB.wake();
|
|
193
|
+
this._defer(() => {
|
|
194
|
+
if (!this._joints.includes(joint)) {
|
|
195
|
+
this._joints.push(joint);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
return joint;
|
|
199
|
+
}
|
|
200
|
+
/** Remove a joint, waking both bodies so they respond to the lost constraint. Deferred when called inside a callback. */
|
|
201
|
+
removeJoint(joint) {
|
|
202
|
+
joint.bodyA.wake();
|
|
203
|
+
joint.bodyB.wake();
|
|
204
|
+
this._defer(() => {
|
|
205
|
+
const index = this._joints.indexOf(joint);
|
|
206
|
+
if (index !== -1) {
|
|
207
|
+
this._joints.splice(index, 1);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
160
211
|
// ── stepping ───────────────────────────────────────────────────────────
|
|
161
212
|
/**
|
|
162
213
|
* Advance the world by `frameDeltaSeconds`. Accumulates into fixed steps; each
|
|
@@ -175,12 +226,26 @@ class PhysicsWorld {
|
|
|
175
226
|
const gravityY = this.gravity.y;
|
|
176
227
|
const contactHertz = this.contactHertz;
|
|
177
228
|
const dampingRatio = this.dampingRatio;
|
|
229
|
+
const hasJoints = this._joints.length > 0;
|
|
230
|
+
const hasBullets = this._hasBullets();
|
|
178
231
|
for (let step = 0; step < steps; step++) {
|
|
179
232
|
// Detection runs once per fixed step (collider geometry is already current
|
|
180
233
|
// from the previous frame's finalize / attach / setTransform). TGS-Soft
|
|
181
234
|
// reuses the manifolds across the sub-steps below.
|
|
182
235
|
this._backend.detect(this._colliders);
|
|
236
|
+
// Sleep decision runs after detection (islands need the current contact
|
|
237
|
+
// set) and before the solver (so sleeping contacts are skipped, and a
|
|
238
|
+
// sleeping island touched by an awake body is woken first).
|
|
239
|
+
if (this.enableSleeping) {
|
|
240
|
+
this._updateSleeping(this.timeStepper.fixedDelta);
|
|
241
|
+
}
|
|
183
242
|
this._backend.prepareSolve(h, contactHertz, dampingRatio);
|
|
243
|
+
if (hasJoints) {
|
|
244
|
+
this._prepareJoints(h);
|
|
245
|
+
}
|
|
246
|
+
if (hasBullets) {
|
|
247
|
+
this._recordBulletPositions();
|
|
248
|
+
}
|
|
184
249
|
for (let subStep = 0; subStep < subStepCount; subStep++) {
|
|
185
250
|
// Integrate gravity/forces over the sub-step (forces persist across
|
|
186
251
|
// sub-steps; cleared once per frame by `_finalizePosition`).
|
|
@@ -193,13 +258,23 @@ class PhysicsWorld {
|
|
|
193
258
|
// impulse converges to the per-sub-step load (m·h·g), not the per-frame
|
|
194
259
|
// load, which is what keeps tall stacks from pumping energy.
|
|
195
260
|
this._backend.warmStart();
|
|
261
|
+
if (hasJoints) {
|
|
262
|
+
this._warmStartJoints();
|
|
263
|
+
}
|
|
196
264
|
// Main soft-bias velocity solve, integrate positions (accumulating
|
|
197
|
-
// per-body delta), then the bias-free relax pass.
|
|
265
|
+
// per-body delta), then the bias-free relax pass. Joints solve right
|
|
266
|
+
// after the contacts in each pass (contacts are the stiffer constraint).
|
|
198
267
|
this._backend.solveVelocities(true);
|
|
268
|
+
if (hasJoints) {
|
|
269
|
+
this._solveJoints(true);
|
|
270
|
+
}
|
|
199
271
|
for (const body of this._bodies) {
|
|
200
272
|
body._integratePosition(h);
|
|
201
273
|
}
|
|
202
274
|
this._backend.solveVelocities(false);
|
|
275
|
+
if (hasJoints) {
|
|
276
|
+
this._solveJoints(false);
|
|
277
|
+
}
|
|
203
278
|
}
|
|
204
279
|
// Separate restitution pass, then write the accumulated delta into each
|
|
205
280
|
// body's transform and re-sync collider geometry.
|
|
@@ -207,6 +282,9 @@ class PhysicsWorld {
|
|
|
207
282
|
for (const body of this._bodies) {
|
|
208
283
|
body._finalizePosition();
|
|
209
284
|
}
|
|
285
|
+
if (hasBullets) {
|
|
286
|
+
this._advanceBullets();
|
|
287
|
+
}
|
|
210
288
|
}
|
|
211
289
|
this._dispatchEvents();
|
|
212
290
|
}
|
|
@@ -215,8 +293,8 @@ class PhysicsWorld {
|
|
|
215
293
|
}
|
|
216
294
|
// ── binding ────────────────────────────────────────────────────────────
|
|
217
295
|
/** Link a body to a scene node; the node tracks the body after each step. */
|
|
218
|
-
bind(body, node
|
|
219
|
-
return this._bindings.bind(body, node
|
|
296
|
+
bind(body, node) {
|
|
297
|
+
return this._bindings.bind(body, node);
|
|
220
298
|
}
|
|
221
299
|
/** Remove a body↔node link. */
|
|
222
300
|
unbind(body) {
|
|
@@ -258,6 +336,7 @@ class PhysicsWorld {
|
|
|
258
336
|
}
|
|
259
337
|
this._bodies.length = 0;
|
|
260
338
|
this._colliders.length = 0;
|
|
339
|
+
this._joints.length = 0;
|
|
261
340
|
this._commands.length = 0;
|
|
262
341
|
this._bindings.clear();
|
|
263
342
|
this._backend.destroy();
|
|
@@ -299,6 +378,199 @@ class PhysicsWorld {
|
|
|
299
378
|
}
|
|
300
379
|
this._dispatching = false;
|
|
301
380
|
}
|
|
381
|
+
/**
|
|
382
|
+
* Accumulate per-body sleep timers and put/keep islands of resting bodies
|
|
383
|
+
* asleep so a stack sleeps and wakes as one unit. An island is a connected
|
|
384
|
+
* component of dynamic bodies joined by touching solid contacts (static and
|
|
385
|
+
* kinematic bodies are boundaries, not nodes); it sleeps once every member has
|
|
386
|
+
* stayed below the sleep thresholds for `timeToSleep`, and wakes the instant
|
|
387
|
+
* any member does (e.g. an awake body merges into it via a new contact).
|
|
388
|
+
* Deterministic: union-find roots break ties by lower index and the contact
|
|
389
|
+
* set is id-sorted.
|
|
390
|
+
*/
|
|
391
|
+
_updateSleeping(dt) {
|
|
392
|
+
const bodies = this._bodies;
|
|
393
|
+
const count = bodies.length;
|
|
394
|
+
const parent = this._islandParent;
|
|
395
|
+
const minSleep = this._islandMinSleep;
|
|
396
|
+
// Assign dense indices, reset the union-find, and accumulate sleep timers for
|
|
397
|
+
// awake dynamic bodies (a sleeping body's timer stays frozen ≥ timeToSleep).
|
|
398
|
+
for (let i = 0; i < count; i++) {
|
|
399
|
+
const body = bodies[i];
|
|
400
|
+
body._islandIndex = i;
|
|
401
|
+
parent[i] = i;
|
|
402
|
+
minSleep[i] = Infinity;
|
|
403
|
+
if (body.type === 'dynamic' && !body.isSleeping) {
|
|
404
|
+
body._accumulateSleepTime(dt, this.sleepLinearVelocity, this.sleepAngularVelocity);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
parent.length = count;
|
|
408
|
+
minSleep.length = count;
|
|
409
|
+
// Union dynamic↔dynamic solid contacts into islands.
|
|
410
|
+
for (const contact of this._backend.contactGraph.solidContacts) {
|
|
411
|
+
const bodyA = contact.a.body;
|
|
412
|
+
const bodyB = contact.b.body;
|
|
413
|
+
if (bodyA.type === 'dynamic' && bodyB.type === 'dynamic') {
|
|
414
|
+
this._union(bodyA._islandIndex, bodyB._islandIndex);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
// Joints couple their two bodies into the same island (sleep/wake together).
|
|
418
|
+
for (const joint of this._joints) {
|
|
419
|
+
const bodyA = joint.bodyA;
|
|
420
|
+
const bodyB = joint.bodyB;
|
|
421
|
+
if (joint.enabled && bodyA.type === 'dynamic' && bodyB.type === 'dynamic') {
|
|
422
|
+
this._union(bodyA._islandIndex, bodyB._islandIndex);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
// Per-island minimum sleep time over its dynamic members.
|
|
426
|
+
for (let i = 0; i < count; i++) {
|
|
427
|
+
const body = bodies[i];
|
|
428
|
+
if (body.type === 'dynamic') {
|
|
429
|
+
const root = this._find(i);
|
|
430
|
+
if (body._sleepTime < minSleep[root]) {
|
|
431
|
+
minSleep[root] = body._sleepTime;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
// Sleep an island iff every member has rested for `timeToSleep`; otherwise
|
|
436
|
+
// wake it (which also wakes any member dragged awake by a fresh contact).
|
|
437
|
+
const timeToSleep = this.timeToSleep;
|
|
438
|
+
for (let i = 0; i < count; i++) {
|
|
439
|
+
const body = bodies[i];
|
|
440
|
+
if (body.type === 'dynamic') {
|
|
441
|
+
body._setSleeping(minSleep[this._find(i)] >= timeToSleep);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
/** Union-find union by lower index (deterministic roots). */
|
|
446
|
+
_union(a, b) {
|
|
447
|
+
const rootA = this._find(a);
|
|
448
|
+
const rootB = this._find(b);
|
|
449
|
+
if (rootA < rootB) {
|
|
450
|
+
this._islandParent[rootB] = rootA;
|
|
451
|
+
}
|
|
452
|
+
else if (rootB < rootA) {
|
|
453
|
+
this._islandParent[rootA] = rootB;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
/** Union-find find with path halving. */
|
|
457
|
+
_find(index) {
|
|
458
|
+
const parent = this._islandParent;
|
|
459
|
+
while (parent[index] !== index) {
|
|
460
|
+
const grandparent = parent[parent[index]];
|
|
461
|
+
parent[index] = grandparent;
|
|
462
|
+
index = grandparent;
|
|
463
|
+
}
|
|
464
|
+
return index;
|
|
465
|
+
}
|
|
466
|
+
/** Build each joint's per-frame constraint data (once per fixed step). */
|
|
467
|
+
_prepareJoints(h) {
|
|
468
|
+
for (const joint of this._joints) {
|
|
469
|
+
joint._prepare(h);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
/** Re-apply each joint's accumulated impulse (each sub-step). */
|
|
473
|
+
_warmStartJoints() {
|
|
474
|
+
for (const joint of this._joints) {
|
|
475
|
+
joint._warmStart();
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
/** One joint velocity pass (each sub-step, after the contacts). */
|
|
479
|
+
_solveJoints(useBias) {
|
|
480
|
+
for (const joint of this._joints) {
|
|
481
|
+
joint._solve(useBias);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
/** Whether any dynamic body is flagged for continuous collision (bullet mode). */
|
|
485
|
+
_hasBullets() {
|
|
486
|
+
for (const body of this._bodies) {
|
|
487
|
+
if (body.isBullet && body.type === 'dynamic') {
|
|
488
|
+
return true;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
return false;
|
|
492
|
+
}
|
|
493
|
+
/** Snapshot each bullet's centre of mass at the start of the fixed step (the swept-test origin). */
|
|
494
|
+
_recordBulletPositions() {
|
|
495
|
+
for (const body of this._bodies) {
|
|
496
|
+
if (body.isBullet && body.type === 'dynamic') {
|
|
497
|
+
body._ccdPrevX = body.worldCenterOfMassX;
|
|
498
|
+
body._ccdPrevY = body.worldCenterOfMassY;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Sweep each bullet's centre of mass along this fixed step's motion against every
|
|
504
|
+
* other body's colliders; if it would cross one, clamp the body just short of the
|
|
505
|
+
* surface and resolve the impact about the surface normal (a slide for a non-bouncy
|
|
506
|
+
* body, an elastic reflection as restitution → 1) so it cannot tunnel. Sweeps the
|
|
507
|
+
* centre point — good for small/point-like projectiles; a full swept-shape TOI for
|
|
508
|
+
* large fast bodies is backlog (raise sub-steps or thicken geometry meanwhile).
|
|
509
|
+
*/
|
|
510
|
+
_advanceBullets() {
|
|
511
|
+
for (const body of this._bodies) {
|
|
512
|
+
if (!body.isBullet || body.type !== 'dynamic' || body.isSleeping) {
|
|
513
|
+
continue;
|
|
514
|
+
}
|
|
515
|
+
const newX = body.worldCenterOfMassX;
|
|
516
|
+
const newY = body.worldCenterOfMassY;
|
|
517
|
+
let dirX = newX - body._ccdPrevX;
|
|
518
|
+
let dirY = newY - body._ccdPrevY;
|
|
519
|
+
const distance = Math.hypot(dirX, dirY);
|
|
520
|
+
if (distance < 1e-6) {
|
|
521
|
+
continue;
|
|
522
|
+
}
|
|
523
|
+
dirX /= distance;
|
|
524
|
+
dirY /= distance;
|
|
525
|
+
this._ccdOrigin.x = body._ccdPrevX;
|
|
526
|
+
this._ccdOrigin.y = body._ccdPrevY;
|
|
527
|
+
this._ccdDir.x = dirX;
|
|
528
|
+
this._ccdDir.y = dirY;
|
|
529
|
+
const hits = this._query.rayCastAll(this._ccdOrigin, this._ccdDir, undefined, this._ccdHits, distance);
|
|
530
|
+
let blocked = null;
|
|
531
|
+
for (const hit of hits) {
|
|
532
|
+
// Sweep against every other body (static, kinematic, dynamic); sensors never
|
|
533
|
+
// block. Hits are distance-sorted, so the first match is the nearest surface.
|
|
534
|
+
if (hit.body !== body && !hit.collider.isSensor) {
|
|
535
|
+
blocked = hit;
|
|
536
|
+
break;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
if (blocked === null) {
|
|
540
|
+
continue;
|
|
541
|
+
}
|
|
542
|
+
// Clamp the CoM just short of the surface (a pure translation — the rotation
|
|
543
|
+
// is already applied), then resolve the impact about the surface normal.
|
|
544
|
+
const clampDistance = Math.max(0, blocked.distance - ccdSkin);
|
|
545
|
+
const deltaX = body._ccdPrevX + dirX * clampDistance - newX;
|
|
546
|
+
const deltaY = body._ccdPrevY + dirY * clampDistance - newY;
|
|
547
|
+
this._ccdOrigin.x = body.x + deltaX;
|
|
548
|
+
this._ccdOrigin.y = body.y + deltaY;
|
|
549
|
+
body.setTransform(this._ccdOrigin, body.angle);
|
|
550
|
+
// Reflect about the true surface normal: a slide for a non-bouncy body
|
|
551
|
+
// (restitution 0), an elastic bounce as restitution → 1. The body's own
|
|
552
|
+
// restitution combines (max) with the surface's, matching the contact solver.
|
|
553
|
+
const nx = blocked.normal.x;
|
|
554
|
+
const ny = blocked.normal.y;
|
|
555
|
+
const vn = body.linearVelocityX * nx + body.linearVelocityY * ny;
|
|
556
|
+
if (vn < 0) {
|
|
557
|
+
const restitution = vn < -1 ? Math.max(this._bulletRestitution(body), blocked.collider.restitution) : 0;
|
|
558
|
+
const impulse = -(1 + restitution) * vn;
|
|
559
|
+
body.linearVelocityX += impulse * nx;
|
|
560
|
+
body.linearVelocityY += impulse * ny;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
/** The highest restitution among a body's colliders (its CCD bounce factor). */
|
|
565
|
+
_bulletRestitution(body) {
|
|
566
|
+
let restitution = 0;
|
|
567
|
+
for (const collider of body.colliders) {
|
|
568
|
+
if (collider.restitution > restitution) {
|
|
569
|
+
restitution = collider.restitution;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
return restitution;
|
|
573
|
+
}
|
|
302
574
|
/** Run `command` now, or queue it when inside an event dispatch (deferred to end of step). */
|
|
303
575
|
_defer(command) {
|
|
304
576
|
if (this._dispatching) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhysicsWorld.js","sources":["../../../src/PhysicsWorld.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PhysicsWorld.js","sources":["../../../src/PhysicsWorld.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { SceneNode } from '@codexo/exojs';
|
|
2
2
|
import type { PhysicsBody } from '../PhysicsBody';
|
|
3
|
-
import type { BindingOptions } from './PhysicsBinding';
|
|
4
3
|
import { PhysicsBinding } from './PhysicsBinding';
|
|
5
4
|
/**
|
|
6
5
|
* Owns the body ↔ node links and writes bound node transforms after each step.
|
|
@@ -9,7 +8,7 @@ import { PhysicsBinding } from './PhysicsBinding';
|
|
|
9
8
|
export declare class BindingRegistry {
|
|
10
9
|
private readonly _bindings;
|
|
11
10
|
/** Link `body` to `node`. Rejects nodes with non-zero skew; runtime scale is ignored. */
|
|
12
|
-
bind(body: PhysicsBody, node: SceneNode
|
|
11
|
+
bind(body: PhysicsBody, node: SceneNode): PhysicsBinding;
|
|
13
12
|
/** Remove the link for `body`, if any. */
|
|
14
13
|
unbind(body: PhysicsBody): void;
|
|
15
14
|
/** Write every bound node's transform from its body. */
|
|
@@ -7,11 +7,11 @@ import { PhysicsBinding } from './PhysicsBinding.js';
|
|
|
7
7
|
class BindingRegistry {
|
|
8
8
|
_bindings = new Map();
|
|
9
9
|
/** Link `body` to `node`. Rejects nodes with non-zero skew; runtime scale is ignored. */
|
|
10
|
-
bind(body, node
|
|
10
|
+
bind(body, node) {
|
|
11
11
|
if (node.skewX !== 0 || node.skewY !== 0) {
|
|
12
12
|
throw new Error(`PhysicsBinding: the bound node has non-zero skew (${node.skewX}°, ${node.skewY}°); skewed nodes are not supported.`);
|
|
13
13
|
}
|
|
14
|
-
const binding = new PhysicsBinding(body, node
|
|
14
|
+
const binding = new PhysicsBinding(body, node);
|
|
15
15
|
this._bindings.set(body, binding);
|
|
16
16
|
binding.sync();
|
|
17
17
|
return binding;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BindingRegistry.js","sources":["../../../../src/binding/BindingRegistry.ts"],"sourcesContent":[null],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"BindingRegistry.js","sources":["../../../../src/binding/BindingRegistry.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAKA;;;AAGG;MACU,eAAe,CAAA;AACT,IAAA,SAAS,GAAG,IAAI,GAAG,EAA+B;;IAG5D,IAAI,CAAC,IAAiB,EAAE,IAAe,EAAA;AAC5C,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE;AACxC,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,kDAAA,EAAqD,IAAI,CAAC,KAAK,CAAA,GAAA,EAAM,IAAI,CAAC,KAAK,CAAA,mCAAA,CAAqC,CAAC;QACvI;QAEA,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC;QAE9C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC;QACjC,OAAO,CAAC,IAAI,EAAE;AAEd,QAAA,OAAO,OAAO;IAChB;;AAGO,IAAA,MAAM,CAAC,IAAiB,EAAA;AAC7B,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;IAC7B;;IAGO,IAAI,GAAA;QACT,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE;YAC7C,OAAO,CAAC,IAAI,EAAE;QAChB;IACF;;AAGA,IAAA,IAAW,IAAI,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI;IAC5B;;IAGO,KAAK,GAAA;AACV,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IACxB;AACD;;;;"}
|
|
@@ -1,15 +1,5 @@
|
|
|
1
1
|
import { type SceneNode } from '@codexo/exojs';
|
|
2
2
|
import type { PhysicsBody } from '../PhysicsBody';
|
|
3
|
-
/** Options for {@link PhysicsWorld.bind}. */
|
|
4
|
-
export interface BindingOptions {
|
|
5
|
-
/**
|
|
6
|
-
* Which way the transform flows. `'body-to-node'` (default) writes the body's
|
|
7
|
-
* transform onto the node each step — for dynamic and kinematic-position
|
|
8
|
-
* bodies. `'node-to-body'` (read the node, drive the body) is reserved for the
|
|
9
|
-
* kinematic-velocity follow-up and currently behaves like `'body-to-node'`.
|
|
10
|
-
*/
|
|
11
|
-
drive?: 'body-to-node' | 'node-to-body';
|
|
12
|
-
}
|
|
13
3
|
/**
|
|
14
4
|
* A link between a {@link PhysicsBody} and a {@link SceneNode}. After each
|
|
15
5
|
* {@link PhysicsWorld.step}, the body's world position **and rotation** are
|
|
@@ -20,8 +10,7 @@ export interface BindingOptions {
|
|
|
20
10
|
export declare class PhysicsBinding {
|
|
21
11
|
readonly body: PhysicsBody;
|
|
22
12
|
readonly node: SceneNode;
|
|
23
|
-
|
|
24
|
-
constructor(body: PhysicsBody, node: SceneNode, drive?: 'body-to-node' | 'node-to-body');
|
|
13
|
+
constructor(body: PhysicsBody, node: SceneNode);
|
|
25
14
|
/** Write the body's current transform (position + rotation) onto the bound node. */
|
|
26
15
|
sync(): void;
|
|
27
16
|
}
|
|
@@ -10,11 +10,9 @@ import { MathUtils } from '@codexo/exojs';
|
|
|
10
10
|
class PhysicsBinding {
|
|
11
11
|
body;
|
|
12
12
|
node;
|
|
13
|
-
|
|
14
|
-
constructor(body, node, drive = 'body-to-node') {
|
|
13
|
+
constructor(body, node) {
|
|
15
14
|
this.body = body;
|
|
16
15
|
this.node = node;
|
|
17
|
-
this.drive = drive;
|
|
18
16
|
}
|
|
19
17
|
/** Write the body's current transform (position + rotation) onto the bound node. */
|
|
20
18
|
sync() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhysicsBinding.js","sources":["../../../../src/binding/PhysicsBinding.ts"],"sourcesContent":[null],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"PhysicsBinding.js","sources":["../../../../src/binding/PhysicsBinding.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAIA;;;;;;AAMG;MACU,cAAc,CAAA;AAEP,IAAA,IAAA;AACA,IAAA,IAAA;IAFlB,WAAA,CACkB,IAAiB,EACjB,IAAe,EAAA;QADf,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,IAAI,GAAJ,IAAI;IACnB;;IAGI,IAAI,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpE;AACD;;;;"}
|
|
@@ -17,6 +17,10 @@ export interface PhysicsDebugDrawOptions {
|
|
|
17
17
|
drawCenters?: boolean;
|
|
18
18
|
/** Broad-phase candidate links between AABB-overlapping colliders. Default `false`. */
|
|
19
19
|
drawBroadphase?: boolean;
|
|
20
|
+
/** Tint sleeping bodies distinctly (applies to the shape outline). Default `false`. */
|
|
21
|
+
drawSleeping?: boolean;
|
|
22
|
+
/** Lines connecting the bodies of each joint. Default `false`. */
|
|
23
|
+
drawJoints?: boolean;
|
|
20
24
|
}
|
|
21
25
|
/**
|
|
22
26
|
* `DebugLayer` that visualises a {@link PhysicsWorld} — shapes, AABBs, contacts,
|
|
@@ -37,7 +41,9 @@ export declare class PhysicsDebugDraw extends DebugLayer {
|
|
|
37
41
|
get viewMode(): DebugLayerViewMode;
|
|
38
42
|
update(): void;
|
|
39
43
|
render(backend: RenderBackend): void;
|
|
44
|
+
private _renderJoints;
|
|
40
45
|
destroy(): void;
|
|
46
|
+
private _outlineColor;
|
|
41
47
|
private _strokeShape;
|
|
42
48
|
private _strokeAabb;
|
|
43
49
|
private _strokeCircle;
|
|
@@ -14,6 +14,8 @@ const colorContact = new Color(1, 0.2, 0.2, 1);
|
|
|
14
14
|
const colorNormal = new Color(1, 0.6, 0.1, 1);
|
|
15
15
|
const colorCenter = new Color(1, 1, 1, 0.9);
|
|
16
16
|
const colorBroadphase = new Color(0.2, 0.8, 0.8, 0.5);
|
|
17
|
+
const colorSleeping = new Color(0.45, 0.45, 0.5, 0.7);
|
|
18
|
+
const colorJoint = new Color(0.9, 0.5, 1, 0.8);
|
|
17
19
|
/**
|
|
18
20
|
* `DebugLayer` that visualises a {@link PhysicsWorld} — shapes, AABBs, contacts,
|
|
19
21
|
* normals, centres and broad-phase links. It reads the world's public state and
|
|
@@ -39,6 +41,8 @@ class PhysicsDebugDraw extends DebugLayer {
|
|
|
39
41
|
drawNormals: options.drawNormals ?? false,
|
|
40
42
|
drawCenters: options.drawCenters ?? false,
|
|
41
43
|
drawBroadphase: options.drawBroadphase ?? false,
|
|
44
|
+
drawSleeping: options.drawSleeping ?? false,
|
|
45
|
+
drawJoints: options.drawJoints ?? false,
|
|
42
46
|
};
|
|
43
47
|
}
|
|
44
48
|
get viewMode() {
|
|
@@ -74,8 +78,18 @@ class PhysicsDebugDraw extends DebugLayer {
|
|
|
74
78
|
if (options.drawContacts || options.drawNormals) {
|
|
75
79
|
this._renderContacts(gfx);
|
|
76
80
|
}
|
|
81
|
+
if (options.drawJoints) {
|
|
82
|
+
this._renderJoints(gfx);
|
|
83
|
+
}
|
|
77
84
|
gfx.render(backend);
|
|
78
85
|
}
|
|
86
|
+
_renderJoints(gfx) {
|
|
87
|
+
gfx.lineColor = colorJoint;
|
|
88
|
+
for (const joint of this._world.joints) {
|
|
89
|
+
gfx.moveTo(joint.bodyA.x, joint.bodyA.y);
|
|
90
|
+
gfx.lineTo(joint.bodyB.x, joint.bodyB.y);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
79
93
|
destroy() {
|
|
80
94
|
if (this._graphics !== null) {
|
|
81
95
|
this._graphics.destroy();
|
|
@@ -83,8 +97,17 @@ class PhysicsDebugDraw extends DebugLayer {
|
|
|
83
97
|
}
|
|
84
98
|
}
|
|
85
99
|
// ── helpers ────────────────────────────────────────────────────────────
|
|
100
|
+
_outlineColor(collider) {
|
|
101
|
+
if (collider.isSensor) {
|
|
102
|
+
return colorSensor;
|
|
103
|
+
}
|
|
104
|
+
if (this.options.drawSleeping && collider.body.isSleeping) {
|
|
105
|
+
return colorSleeping;
|
|
106
|
+
}
|
|
107
|
+
return colorForType(collider.body.type);
|
|
108
|
+
}
|
|
86
109
|
_strokeShape(gfx, collider) {
|
|
87
|
-
gfx.lineColor =
|
|
110
|
+
gfx.lineColor = this._outlineColor(collider);
|
|
88
111
|
if (collider.shape.type === 'circle') {
|
|
89
112
|
const c = collider.worldCenter;
|
|
90
113
|
const r = collider.shape.radius;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhysicsDebugDraw.js","sources":["../../../../src/debug/PhysicsDebugDraw.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"PhysicsDebugDraw.js","sources":["../../../../src/debug/PhysicsDebugDraw.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|