@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.
Files changed (45) hide show
  1. package/dist/esm/PhysicsBody.d.ts +32 -0
  2. package/dist/esm/PhysicsBody.js +60 -2
  3. package/dist/esm/PhysicsBody.js.map +1 -1
  4. package/dist/esm/PhysicsWorld.d.ts +74 -8
  5. package/dist/esm/PhysicsWorld.js +279 -7
  6. package/dist/esm/PhysicsWorld.js.map +1 -1
  7. package/dist/esm/binding/BindingRegistry.d.ts +1 -2
  8. package/dist/esm/binding/BindingRegistry.js +2 -2
  9. package/dist/esm/binding/BindingRegistry.js.map +1 -1
  10. package/dist/esm/binding/PhysicsBinding.d.ts +1 -12
  11. package/dist/esm/binding/PhysicsBinding.js +1 -3
  12. package/dist/esm/binding/PhysicsBinding.js.map +1 -1
  13. package/dist/esm/debug/PhysicsDebugDraw.d.ts +6 -0
  14. package/dist/esm/debug/PhysicsDebugDraw.js +24 -1
  15. package/dist/esm/debug/PhysicsDebugDraw.js.map +1 -1
  16. package/dist/esm/index.js +7 -0
  17. package/dist/esm/index.js.map +1 -1
  18. package/dist/esm/joints/DistanceJoint.d.ts +71 -0
  19. package/dist/esm/joints/DistanceJoint.js +176 -0
  20. package/dist/esm/joints/DistanceJoint.js.map +1 -0
  21. package/dist/esm/joints/Joint.d.ts +25 -0
  22. package/dist/esm/joints/Joint.js +24 -0
  23. package/dist/esm/joints/Joint.js.map +1 -0
  24. package/dist/esm/joints/MouseJoint.d.ts +57 -0
  25. package/dist/esm/joints/MouseJoint.js +137 -0
  26. package/dist/esm/joints/MouseJoint.js.map +1 -0
  27. package/dist/esm/joints/PrismaticJoint.d.ts +85 -0
  28. package/dist/esm/joints/PrismaticJoint.js +241 -0
  29. package/dist/esm/joints/PrismaticJoint.js.map +1 -0
  30. package/dist/esm/joints/RevoluteJoint.d.ts +81 -0
  31. package/dist/esm/joints/RevoluteJoint.js +217 -0
  32. package/dist/esm/joints/RevoluteJoint.js.map +1 -0
  33. package/dist/esm/joints/WeldJoint.d.ts +61 -0
  34. package/dist/esm/joints/WeldJoint.js +159 -0
  35. package/dist/esm/joints/WeldJoint.js.map +1 -0
  36. package/dist/esm/joints/WheelJoint.d.ts +92 -0
  37. package/dist/esm/joints/WheelJoint.js +256 -0
  38. package/dist/esm/joints/WheelJoint.js.map +1 -0
  39. package/dist/esm/math.js +15 -1
  40. package/dist/esm/math.js.map +1 -1
  41. package/dist/esm/physicsBuildInfo.js +2 -2
  42. package/dist/esm/public.d.ts +7 -1
  43. package/dist/esm/solver/ContactSolver.js +7 -0
  44. package/dist/esm/solver/ContactSolver.js.map +1 -1
  45. package/package.json +4 -4
@@ -18,6 +18,8 @@ export interface BodyOptions {
18
18
  gravityScale?: number;
19
19
  /** When `true`, the body never rotates under contacts (infinite rotational inertia). Default `false`. */
20
20
  fixedRotation?: boolean;
21
+ /** When `true`, the body is swept against static geometry each step (CCD) so it cannot tunnel through thin walls. Default `false`. */
22
+ isBullet?: boolean;
21
23
  /** Colliders to attach up-front. Each may be a {@link Collider} instance or its {@link ColliderOptions}. */
22
24
  colliders?: Array<Collider | ColliderOptions>;
23
25
  }
@@ -48,6 +50,8 @@ export declare class PhysicsBody {
48
50
  gravityScale: number;
49
51
  /** When `true`, rotational inertia is treated as infinite. */
50
52
  fixedRotation: boolean;
53
+ /** When `true`, the body is swept against static geometry each step (CCD) so it cannot tunnel through thin walls. */
54
+ isBullet: boolean;
51
55
  /** Total mass (0 for static/kinematic). */
52
56
  mass: number;
53
57
  /** Inverse mass (`0` = immovable). */
@@ -62,6 +66,8 @@ export declare class PhysicsBody {
62
66
  linearVelocityY: number;
63
67
  /** Angular velocity in rad/s. */
64
68
  angularVelocity: number;
69
+ /** When `false`, this body is never put to sleep. Default `true`. */
70
+ allowSleep: boolean;
65
71
  /** @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}. */
66
72
  _deltaPosX: number;
67
73
  /** @internal — Delta position Y accumulated across the frame's sub-steps by the TGS integrator. */
@@ -75,6 +81,15 @@ export declare class PhysicsBody {
75
81
  private _forceX;
76
82
  private _forceY;
77
83
  private _torque;
84
+ /** @internal — seconds the body has stayed below the sleep thresholds (frozen while asleep). Read by the world's island pass. */
85
+ _sleepTime: number;
86
+ /** @internal — dense union-find index assigned by the world's island pass each step. */
87
+ _islandIndex: number;
88
+ /** @internal — world-space centre of mass at the start of the current fixed step (CCD swept-test origin). */
89
+ _ccdPrevX: number;
90
+ /** @internal — see {@link _ccdPrevX}. */
91
+ _ccdPrevY: number;
92
+ private _sleeping;
78
93
  private _id;
79
94
  private _owner;
80
95
  private _attached;
@@ -113,6 +128,8 @@ export declare class PhysicsBody {
113
128
  get isMassReady(): boolean;
114
129
  /** `true` after the owning world has destroyed this body. */
115
130
  get destroyed(): boolean;
131
+ /** `true` when the body is asleep — skipped by the integrator and solver until woken. */
132
+ get isSleeping(): boolean;
116
133
  /**
117
134
  * Attach a collider to this body. Accepts a {@link Collider} instance or its
118
135
  * {@link ColliderOptions} (a convenience that constructs the collider for you).
@@ -168,6 +185,21 @@ export declare class PhysicsBody {
168
185
  * re-syncing collider geometry per sub-step. Static bodies never move.
169
186
  */
170
187
  _integratePosition(h: number): void;
188
+ /**
189
+ * @internal — advance the sleep timer over one fixed step `dt`. A body below
190
+ * both velocity thresholds accumulates time; a too-fast body, or one that opts
191
+ * out via {@link allowSleep}, resets it. The sleep/wake decision is made per
192
+ * island by the world (so a stack sleeps as a unit) from {@link _sleepTime}.
193
+ */
194
+ _accumulateSleepTime(dt: number, linearThreshold: number, angularThreshold: number): void;
195
+ /** @internal — set the sleep state. Sleeping zeroes the velocity; waking resets the sleep timer. */
196
+ _setSleeping(sleeping: boolean): void;
197
+ /**
198
+ * Wake the body if it is asleep, resetting its sleep timer. The rest of its
199
+ * island wakes with it on the next step (a contact to an awake body keeps the
200
+ * whole island awake). Returns `this`.
201
+ */
202
+ wake(): this;
171
203
  /**
172
204
  * @internal — apply the frame's accumulated delta position/rotation to the
173
205
  * transform (rotating about the centre of mass), re-sync collider geometry and
@@ -21,6 +21,8 @@ class PhysicsBody {
21
21
  gravityScale;
22
22
  /** When `true`, rotational inertia is treated as infinite. */
23
23
  fixedRotation;
24
+ /** When `true`, the body is swept against static geometry each step (CCD) so it cannot tunnel through thin walls. */
25
+ isBullet;
24
26
  /** Total mass (0 for static/kinematic). */
25
27
  mass = 0;
26
28
  /** Inverse mass (`0` = immovable). */
@@ -35,6 +37,8 @@ class PhysicsBody {
35
37
  linearVelocityY = 0;
36
38
  /** Angular velocity in rad/s. */
37
39
  angularVelocity = 0;
40
+ /** When `false`, this body is never put to sleep. Default `true`. */
41
+ allowSleep = true;
38
42
  /** @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}. */
39
43
  _deltaPosX = 0;
40
44
  /** @internal — Delta position Y accumulated across the frame's sub-steps by the TGS integrator. */
@@ -48,6 +52,15 @@ class PhysicsBody {
48
52
  _forceX = 0;
49
53
  _forceY = 0;
50
54
  _torque = 0;
55
+ /** @internal — seconds the body has stayed below the sleep thresholds (frozen while asleep). Read by the world's island pass. */
56
+ _sleepTime = 0;
57
+ /** @internal — dense union-find index assigned by the world's island pass each step. */
58
+ _islandIndex = 0;
59
+ /** @internal — world-space centre of mass at the start of the current fixed step (CCD swept-test origin). */
60
+ _ccdPrevX = 0;
61
+ /** @internal — see {@link _ccdPrevX}. */
62
+ _ccdPrevY = 0;
63
+ _sleeping = false;
51
64
  _id = -1;
52
65
  _owner = null;
53
66
  _attached = false;
@@ -64,6 +77,7 @@ class PhysicsBody {
64
77
  this.angularDamping = options.angularDamping ?? 0;
65
78
  this.gravityScale = options.gravityScale ?? 1;
66
79
  this.fixedRotation = options.fixedRotation ?? false;
80
+ this.isBullet = options.isBullet ?? false;
67
81
  // Build up-front colliders now (no id/world registration until the body
68
82
  // joins a world via `world.add()`). They sit in `_colliders` unsynchronised;
69
83
  // `_attachToWorld` assigns ids, registers them and computes the mass model.
@@ -125,6 +139,10 @@ class PhysicsBody {
125
139
  get destroyed() {
126
140
  return this._destroyed;
127
141
  }
142
+ /** `true` when the body is asleep — skipped by the integrator and solver until woken. */
143
+ get isSleeping() {
144
+ return this._sleeping;
145
+ }
128
146
  /**
129
147
  * Attach a collider to this body. Accepts a {@link Collider} instance or its
130
148
  * {@link ColliderOptions} (a convenience that constructs the collider for you).
@@ -160,6 +178,7 @@ class PhysicsBody {
160
178
  if (this._destroyed) {
161
179
  throw new Error('PhysicsBody: cannot move a destroyed body.');
162
180
  }
181
+ this.wake();
163
182
  setTransform(this._transform, position.x, position.y, angle);
164
183
  for (const collider of this._colliders) {
165
184
  collider.synchronize(this._transform);
@@ -185,6 +204,7 @@ class PhysicsBody {
185
204
  * sub-step and then cleared. No-op on static/kinematic bodies. Returns `this`.
186
205
  */
187
206
  applyForce(forceX, forceY) {
207
+ this.wake();
188
208
  this._forceX += forceX;
189
209
  this._forceY += forceY;
190
210
  return this;
@@ -194,6 +214,7 @@ class PhysicsBody {
194
214
  * on static/kinematic bodies (and fixed-rotation bodies). Returns `this`.
195
215
  */
196
216
  applyTorque(torque) {
217
+ this.wake();
197
218
  this._torque += torque;
198
219
  return this;
199
220
  }
@@ -206,6 +227,7 @@ class PhysicsBody {
206
227
  if (this.invMass === 0) {
207
228
  return this;
208
229
  }
230
+ this.wake();
209
231
  this.linearVelocityX += impulseX * this.invMass;
210
232
  this.linearVelocityY += impulseY * this.invMass;
211
233
  if (pointX !== undefined && pointY !== undefined && this.invInertia !== 0) {
@@ -225,7 +247,7 @@ class PhysicsBody {
225
247
  * every sub-step and cleared once per frame by {@link _finalizePosition}.
226
248
  */
227
249
  _integrateVelocity(h, gravityX, gravityY) {
228
- if (this.invMass === 0) {
250
+ if (this.invMass === 0 || this._sleeping) {
229
251
  return;
230
252
  }
231
253
  this.linearVelocityX += (gravityX * this.gravityScale + this._forceX * this.invMass) * h;
@@ -245,7 +267,7 @@ class PhysicsBody {
245
267
  * re-syncing collider geometry per sub-step. Static bodies never move.
246
268
  */
247
269
  _integratePosition(h) {
248
- if (this.type === 'static') {
270
+ if (this.type === 'static' || this._sleeping) {
249
271
  return;
250
272
  }
251
273
  this._deltaPosX += this.linearVelocityX * h;
@@ -260,6 +282,42 @@ class PhysicsBody {
260
282
  this._deltaSin = Math.sin(this._deltaAngle);
261
283
  }
262
284
  }
285
+ /**
286
+ * @internal — advance the sleep timer over one fixed step `dt`. A body below
287
+ * both velocity thresholds accumulates time; a too-fast body, or one that opts
288
+ * out via {@link allowSleep}, resets it. The sleep/wake decision is made per
289
+ * island by the world (so a stack sleeps as a unit) from {@link _sleepTime}.
290
+ */
291
+ _accumulateSleepTime(dt, linearThreshold, angularThreshold) {
292
+ const tooFast = this.linearVelocityX * this.linearVelocityX + this.linearVelocityY * this.linearVelocityY > linearThreshold * linearThreshold ||
293
+ Math.abs(this.angularVelocity) > angularThreshold;
294
+ this._sleepTime = !this.allowSleep || tooFast ? 0 : this._sleepTime + dt;
295
+ }
296
+ /** @internal — set the sleep state. Sleeping zeroes the velocity; waking resets the sleep timer. */
297
+ _setSleeping(sleeping) {
298
+ if (this._sleeping === sleeping) {
299
+ return;
300
+ }
301
+ this._sleeping = sleeping;
302
+ if (sleeping) {
303
+ this.linearVelocityX = 0;
304
+ this.linearVelocityY = 0;
305
+ this.angularVelocity = 0;
306
+ }
307
+ else {
308
+ this._sleepTime = 0;
309
+ }
310
+ }
311
+ /**
312
+ * Wake the body if it is asleep, resetting its sleep timer. The rest of its
313
+ * island wakes with it on the next step (a contact to an awake body keeps the
314
+ * whole island awake). Returns `this`.
315
+ */
316
+ wake() {
317
+ this._setSleeping(false);
318
+ this._sleepTime = 0;
319
+ return this;
320
+ }
263
321
  /**
264
322
  * @internal — apply the frame's accumulated delta position/rotation to the
265
323
  * transform (rotating about the centre of mass), re-sync collider geometry and
@@ -1 +1 @@
1
- {"version":3,"file":"PhysicsBody.js","sources":["../../../src/PhysicsBody.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PhysicsBody.js","sources":["../../../src/PhysicsBody.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -2,9 +2,10 @@ import type { SceneNode } from '@codexo/exojs';
2
2
  import { Signal, Vector } from '@codexo/exojs';
3
3
  import type { Aabb } from './Aabb';
4
4
  import type { PhysicsBackend } from './backend/PhysicsBackend';
5
- import type { BindingOptions, PhysicsBinding } from './binding/PhysicsBinding';
5
+ import type { PhysicsBinding } from './binding/PhysicsBinding';
6
6
  import { Collider } from './Collider';
7
7
  import type { CollisionEvent, SensorEvent } from './events';
8
+ import type { Joint } from './joints/Joint';
8
9
  import type { BodyOwner } from './PhysicsBody';
9
10
  import { PhysicsBody } from './PhysicsBody';
10
11
  import type { QueryFilter, RayHit } from './query/QueryEngine';
@@ -30,8 +31,14 @@ export interface PhysicsWorldOptions {
30
31
  contactHertz?: number;
31
32
  /** Soft-contact damping ratio (≥ 1 keeps contacts from oscillating). Default `10`. */
32
33
  dampingRatio?: number;
33
- /** Interpolate bound nodes between fixed steps (reserved; no effect yet). Default `true`. */
34
- interpolation?: boolean;
34
+ /** Put resting bodies to sleep so they skip integration and solving. Default `true`. */
35
+ enableSleeping?: boolean;
36
+ /** Linear speed at or below which a body is a sleep candidate, px/s. Default `5`. */
37
+ sleepLinearVelocity?: number;
38
+ /** Angular speed at or below which a body is a sleep candidate, rad/s. Default `0.06`. */
39
+ sleepAngularVelocity?: number;
40
+ /** Seconds a body must stay below the sleep thresholds before it sleeps. Default `0.5`. */
41
+ timeToSleep?: number;
35
42
  }
36
43
  /**
37
44
  * {@link PhysicsWorld.attach} convenience options: a body type plus a single
@@ -64,8 +71,6 @@ export interface AttachOptions {
64
71
  isSensor?: boolean;
65
72
  /** Category/mask/group collision filter; partials merge over the defaults. */
66
73
  filter?: Partial<CollisionFilter>;
67
- /** Binding options forwarded to {@link PhysicsWorld.bind}. */
68
- binding?: BindingOptions;
69
74
  }
70
75
  /**
71
76
  * The collision/query world: owns bodies, colliders, the detection backend,
@@ -113,20 +118,35 @@ export declare class PhysicsWorld implements BodyOwner {
113
118
  readonly gravity: Vector;
114
119
  /** The fixed-step accumulator. */
115
120
  readonly timeStepper: TimeStepper;
116
- /** Whether bound nodes interpolate between fixed steps (reserved; no effect yet). */
117
- readonly interpolation: boolean;
118
121
  /** TGS-Soft sub-steps per fixed step. */
119
122
  readonly subStepCount: number;
120
123
  /** Soft-contact stiffness in Hz. */
121
124
  readonly contactHertz: number;
122
125
  /** Soft-contact damping ratio. */
123
126
  readonly dampingRatio: number;
127
+ /** Whether resting bodies are put to sleep. */
128
+ readonly enableSleeping: boolean;
129
+ /** Linear sleep threshold (px/s). */
130
+ readonly sleepLinearVelocity: number;
131
+ /** Angular sleep threshold (rad/s). */
132
+ readonly sleepAngularVelocity: number;
133
+ /** Seconds below the thresholds before a body sleeps. */
134
+ readonly timeToSleep: number;
124
135
  private readonly _backend;
125
136
  private readonly _bodies;
126
137
  private readonly _colliders;
138
+ private readonly _joints;
127
139
  private readonly _bindings;
128
140
  private readonly _query;
129
141
  private readonly _commands;
142
+ /** Pooled union-find parent array for the per-step island pass (reused; sized to the body count). */
143
+ private readonly _islandParent;
144
+ /** Pooled per-island minimum sleep time, indexed by union-find root. */
145
+ private readonly _islandMinSleep;
146
+ /** Pooled ray-hit buffer + origin/direction for the CCD swept test. */
147
+ private readonly _ccdHits;
148
+ private readonly _ccdOrigin;
149
+ private readonly _ccdDir;
130
150
  private _nextBodyId;
131
151
  private _nextColliderId;
132
152
  private _dispatching;
@@ -156,6 +176,16 @@ export declare class PhysicsWorld implements BodyOwner {
156
176
  destroyBody(body: PhysicsBody): void;
157
177
  /** Destroy a single collider, recomputing its body's mass. Deferred when called inside a callback. */
158
178
  destroyCollider(collider: Collider): void;
179
+ /** Live joints (read-only view). */
180
+ get joints(): readonly Joint[];
181
+ /**
182
+ * Add a constraint joint. Construct it first (`new DistanceJoint({ … })`),
183
+ * then add it. Wakes both bodies; safe inside a callback (registration is
184
+ * deferred). Returns the joint.
185
+ */
186
+ addJoint<T extends Joint>(joint: T): T;
187
+ /** Remove a joint, waking both bodies so they respond to the lost constraint. Deferred when called inside a callback. */
188
+ removeJoint(joint: Joint): void;
159
189
  /**
160
190
  * Advance the world by `frameDeltaSeconds`. Accumulates into fixed steps; each
161
191
  * fixed step runs detection once, then a TGS-Soft sub-step loop (integrate
@@ -165,7 +195,7 @@ export declare class PhysicsWorld implements BodyOwner {
165
195
  */
166
196
  step(frameDeltaSeconds: number): void;
167
197
  /** Link a body to a scene node; the node tracks the body after each step. */
168
- bind(body: PhysicsBody, node: SceneNode, options?: BindingOptions): PhysicsBinding;
198
+ bind(body: PhysicsBody, node: SceneNode): PhysicsBinding;
169
199
  /** Remove a body↔node link. */
170
200
  unbind(body: PhysicsBody): void;
171
201
  /** Colliders containing `point`. Fresh array. */
@@ -187,6 +217,42 @@ export declare class PhysicsWorld implements BodyOwner {
187
217
  /** The detection backend (internal; consumed by the debug draw layer). */
188
218
  get backend(): PhysicsBackend;
189
219
  private _dispatchEvents;
220
+ /**
221
+ * Accumulate per-body sleep timers and put/keep islands of resting bodies
222
+ * asleep so a stack sleeps and wakes as one unit. An island is a connected
223
+ * component of dynamic bodies joined by touching solid contacts (static and
224
+ * kinematic bodies are boundaries, not nodes); it sleeps once every member has
225
+ * stayed below the sleep thresholds for `timeToSleep`, and wakes the instant
226
+ * any member does (e.g. an awake body merges into it via a new contact).
227
+ * Deterministic: union-find roots break ties by lower index and the contact
228
+ * set is id-sorted.
229
+ */
230
+ private _updateSleeping;
231
+ /** Union-find union by lower index (deterministic roots). */
232
+ private _union;
233
+ /** Union-find find with path halving. */
234
+ private _find;
235
+ /** Build each joint's per-frame constraint data (once per fixed step). */
236
+ private _prepareJoints;
237
+ /** Re-apply each joint's accumulated impulse (each sub-step). */
238
+ private _warmStartJoints;
239
+ /** One joint velocity pass (each sub-step, after the contacts). */
240
+ private _solveJoints;
241
+ /** Whether any dynamic body is flagged for continuous collision (bullet mode). */
242
+ private _hasBullets;
243
+ /** Snapshot each bullet's centre of mass at the start of the fixed step (the swept-test origin). */
244
+ private _recordBulletPositions;
245
+ /**
246
+ * Sweep each bullet's centre of mass along this fixed step's motion against every
247
+ * other body's colliders; if it would cross one, clamp the body just short of the
248
+ * surface and resolve the impact about the surface normal (a slide for a non-bouncy
249
+ * body, an elastic reflection as restitution → 1) so it cannot tunnel. Sweeps the
250
+ * centre point — good for small/point-like projectiles; a full swept-shape TOI for
251
+ * large fast bodies is backlog (raise sub-steps or thicken geometry meanwhile).
252
+ */
253
+ private _advanceBullets;
254
+ /** The highest restitution among a body's colliders (its CCD bounce factor). */
255
+ private _bulletRestitution;
190
256
  /** Run `command` now, or queue it when inside an event dispatch (deferred to end of step). */
191
257
  private _defer;
192
258
  private _drainCommands;