@flighthq/physics3d 0.4.0-edge.1908.751021c

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 (180) hide show
  1. package/dist/broadphase.d.ts +4 -0
  2. package/dist/broadphase.d.ts.map +1 -0
  3. package/dist/broadphase.js +158 -0
  4. package/dist/broadphase.js.map +1 -0
  5. package/dist/colliderCollision.d.ts +5 -0
  6. package/dist/colliderCollision.d.ts.map +1 -0
  7. package/dist/colliderCollision.js +55 -0
  8. package/dist/colliderCollision.js.map +1 -0
  9. package/dist/colliderTransform.d.ts +5 -0
  10. package/dist/colliderTransform.d.ts.map +1 -0
  11. package/dist/colliderTransform.js +424 -0
  12. package/dist/colliderTransform.js.map +1 -0
  13. package/dist/contactIntake.d.ts +5 -0
  14. package/dist/contactIntake.d.ts.map +1 -0
  15. package/dist/contactIntake.js +237 -0
  16. package/dist/contactIntake.js.map +1 -0
  17. package/dist/contacts.d.ts +4 -0
  18. package/dist/contacts.d.ts.map +1 -0
  19. package/dist/contacts.js +64 -0
  20. package/dist/contacts.js.map +1 -0
  21. package/dist/continuous.d.ts +5 -0
  22. package/dist/continuous.d.ts.map +1 -0
  23. package/dist/continuous.js +829 -0
  24. package/dist/continuous.js.map +1 -0
  25. package/dist/contract.d.ts +28 -0
  26. package/dist/contract.d.ts.map +1 -0
  27. package/dist/contract.js +28 -0
  28. package/dist/contract.js.map +1 -0
  29. package/dist/debugGeometry.d.ts +4 -0
  30. package/dist/debugGeometry.d.ts.map +1 -0
  31. package/dist/debugGeometry.js +333 -0
  32. package/dist/debugGeometry.js.map +1 -0
  33. package/dist/enablePhysics3DGuards.d.ts +4 -0
  34. package/dist/enablePhysics3DGuards.d.ts.map +1 -0
  35. package/dist/enablePhysics3DGuards.js +155 -0
  36. package/dist/enablePhysics3DGuards.js.map +1 -0
  37. package/dist/explainPhysics3DCollision.d.ts +3 -0
  38. package/dist/explainPhysics3DCollision.d.ts.map +1 -0
  39. package/dist/explainPhysics3DCollision.js +30 -0
  40. package/dist/explainPhysics3DCollision.js.map +1 -0
  41. package/dist/explainPhysics3DJoints.d.ts +3 -0
  42. package/dist/explainPhysics3DJoints.d.ts.map +1 -0
  43. package/dist/explainPhysics3DJoints.js +32 -0
  44. package/dist/explainPhysics3DJoints.js.map +1 -0
  45. package/dist/explainPhysics3DStep.d.ts +3 -0
  46. package/dist/explainPhysics3DStep.d.ts.map +1 -0
  47. package/dist/explainPhysics3DStep.js +51 -0
  48. package/dist/explainPhysics3DStep.js.map +1 -0
  49. package/dist/index.d.ts +22 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +22 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/integrate.d.ts +6 -0
  54. package/dist/integrate.d.ts.map +1 -0
  55. package/dist/integrate.js +184 -0
  56. package/dist/integrate.js.map +1 -0
  57. package/dist/islands.d.ts +6 -0
  58. package/dist/islands.d.ts.map +1 -0
  59. package/dist/islands.js +333 -0
  60. package/dist/islands.js.map +1 -0
  61. package/dist/jointBreakage.d.ts +5 -0
  62. package/dist/jointBreakage.d.ts.map +1 -0
  63. package/dist/jointBreakage.js +44 -0
  64. package/dist/jointBreakage.js.map +1 -0
  65. package/dist/jointCollisionSuppression.d.ts +4 -0
  66. package/dist/jointCollisionSuppression.d.ts.map +1 -0
  67. package/dist/jointCollisionSuppression.js +40 -0
  68. package/dist/jointCollisionSuppression.js.map +1 -0
  69. package/dist/jointFactories.d.ts +9 -0
  70. package/dist/jointFactories.d.ts.map +1 -0
  71. package/dist/jointFactories.js +159 -0
  72. package/dist/jointFactories.js.map +1 -0
  73. package/dist/jointMath.d.ts +17 -0
  74. package/dist/jointMath.d.ts.map +1 -0
  75. package/dist/jointMath.js +361 -0
  76. package/dist/jointMath.js.map +1 -0
  77. package/dist/jointReaction.d.ts +8 -0
  78. package/dist/jointReaction.d.ts.map +1 -0
  79. package/dist/jointReaction.js +65 -0
  80. package/dist/jointReaction.js.map +1 -0
  81. package/dist/jointRegistry.d.ts +8 -0
  82. package/dist/jointRegistry.d.ts.map +1 -0
  83. package/dist/jointRegistry.js +144 -0
  84. package/dist/jointRegistry.js.map +1 -0
  85. package/dist/jointRows.d.ts +33 -0
  86. package/dist/jointRows.d.ts.map +1 -0
  87. package/dist/jointRows.js +352 -0
  88. package/dist/jointRows.js.map +1 -0
  89. package/dist/joints.d.ts +16 -0
  90. package/dist/joints.d.ts.map +1 -0
  91. package/dist/joints.js +1060 -0
  92. package/dist/joints.js.map +1 -0
  93. package/dist/massProperties.d.ts +13 -0
  94. package/dist/massProperties.d.ts.map +1 -0
  95. package/dist/massProperties.js +462 -0
  96. package/dist/massProperties.js.map +1 -0
  97. package/dist/material.d.ts +3 -0
  98. package/dist/material.d.ts.map +1 -0
  99. package/dist/material.js +13 -0
  100. package/dist/material.js.map +1 -0
  101. package/dist/nodeSync.d.ts +3 -0
  102. package/dist/nodeSync.d.ts.map +1 -0
  103. package/dist/nodeSync.js +16 -0
  104. package/dist/nodeSync.js.map +1 -0
  105. package/dist/ownership.d.ts +8 -0
  106. package/dist/ownership.d.ts.map +1 -0
  107. package/dist/ownership.js +26 -0
  108. package/dist/ownership.js.map +1 -0
  109. package/dist/physics3DBroadphasePublication.d.ts +5 -0
  110. package/dist/physics3DBroadphasePublication.d.ts.map +1 -0
  111. package/dist/physics3DBroadphasePublication.js +49 -0
  112. package/dist/physics3DBroadphasePublication.js.map +1 -0
  113. package/dist/physics3DSpatialIndexingGuards.d.ts +4 -0
  114. package/dist/physics3DSpatialIndexingGuards.d.ts.map +1 -0
  115. package/dist/physics3DSpatialIndexingGuards.js +11 -0
  116. package/dist/physics3DSpatialIndexingGuards.js.map +1 -0
  117. package/dist/registerBuiltInPhysics3DJointSolvers.d.ts +3 -0
  118. package/dist/registerBuiltInPhysics3DJointSolvers.d.ts.map +1 -0
  119. package/dist/registerBuiltInPhysics3DJointSolvers.js +15 -0
  120. package/dist/registerBuiltInPhysics3DJointSolvers.js.map +1 -0
  121. package/dist/solver.d.ts +8 -0
  122. package/dist/solver.d.ts.map +1 -0
  123. package/dist/solver.js +460 -0
  124. package/dist/solver.js.map +1 -0
  125. package/dist/step.d.ts +5 -0
  126. package/dist/step.d.ts.map +1 -0
  127. package/dist/step.js +302 -0
  128. package/dist/step.js.map +1 -0
  129. package/dist/stepValidation.d.ts +13 -0
  130. package/dist/stepValidation.d.ts.map +1 -0
  131. package/dist/stepValidation.js +284 -0
  132. package/dist/stepValidation.js.map +1 -0
  133. package/dist/symmetricTensor.d.ts +11 -0
  134. package/dist/symmetricTensor.d.ts.map +1 -0
  135. package/dist/symmetricTensor.js +150 -0
  136. package/dist/symmetricTensor.js.map +1 -0
  137. package/dist/world.d.ts +27 -0
  138. package/dist/world.d.ts.map +1 -0
  139. package/dist/world.js +762 -0
  140. package/dist/world.js.map +1 -0
  141. package/dist/worldQueries.d.ts +11 -0
  142. package/dist/worldQueries.d.ts.map +1 -0
  143. package/dist/worldQueries.js +409 -0
  144. package/dist/worldQueries.js.map +1 -0
  145. package/package.json +55 -0
  146. package/src/broadphase.test.ts +265 -0
  147. package/src/colliderCollision.test.ts +57 -0
  148. package/src/colliderTransform.test.ts +221 -0
  149. package/src/contactIntake.test.ts +370 -0
  150. package/src/contacts.test.ts +64 -0
  151. package/src/continuous.test.ts +679 -0
  152. package/src/debugGeometry.test.ts +288 -0
  153. package/src/enablePhysics3DGuards.test.ts +206 -0
  154. package/src/explainPhysics3DCollision.test.ts +78 -0
  155. package/src/explainPhysics3DJoints.test.ts +101 -0
  156. package/src/explainPhysics3DStep.test.ts +142 -0
  157. package/src/integrate.test.ts +279 -0
  158. package/src/islands.test.ts +384 -0
  159. package/src/jointBreakage.test.ts +143 -0
  160. package/src/jointCollisionSuppression.test.ts +94 -0
  161. package/src/jointFactories.test.ts +244 -0
  162. package/src/jointMath.test.ts +646 -0
  163. package/src/jointReaction.test.ts +241 -0
  164. package/src/jointRegistry.test.ts +229 -0
  165. package/src/jointRows.test.ts +548 -0
  166. package/src/joints.test.ts +1066 -0
  167. package/src/massProperties.test.ts +611 -0
  168. package/src/material.test.ts +40 -0
  169. package/src/nodeSync.test.ts +50 -0
  170. package/src/ownership.test.ts +61 -0
  171. package/src/physics3DBroadphasePublication.test.ts +63 -0
  172. package/src/physics3DSpatialIndexingGuards.test.ts +43 -0
  173. package/src/registerBuiltInPhysics3DJointSolvers.test.ts +51 -0
  174. package/src/solver.test.ts +567 -0
  175. package/src/step.test.ts +490 -0
  176. package/src/stepValidation.test.ts +346 -0
  177. package/src/stress.test.ts +526 -0
  178. package/src/symmetricTensor.test.ts +166 -0
  179. package/src/world.test.ts +1127 -0
  180. package/src/worldQueries.test.ts +565 -0
package/dist/solver.js ADDED
@@ -0,0 +1,460 @@
1
+ import { createCollisionContactManifold3D } from '@flighthq/collision/contract';
2
+ import { collidePhysics3DColliderShapes } from './colliderCollision';
3
+ import { updatePhysics3DColliderWorldShape } from './colliderTransform';
4
+ import { applySymmetricTensor, TENSOR_XX, TENSOR_XY, TENSOR_XZ, TENSOR_YY, TENSOR_YZ, TENSOR_ZZ, } from './symmetricTensor';
5
+ import { writeRigidBody3DWorldCenter } from './world';
6
+ // Allocates one contact constraint with no points. The solver owns this record; nothing here belongs
7
+ // on `Physics3DContact`, which carries geometry and identity only.
8
+ export function createPhysics3DContactConstraint() {
9
+ return {
10
+ contact: -1,
11
+ pointCount: 0,
12
+ points: [],
13
+ tangent0X: 0,
14
+ tangent0Y: 0,
15
+ tangent0Z: 0,
16
+ tangent1X: 0,
17
+ tangent1Y: 0,
18
+ tangent1Z: 0,
19
+ };
20
+ }
21
+ // Allocates one point's accumulators, zeroed. A fresh point warm-starts from nothing, which is the
22
+ // correct behaviour for a contact that did not exist last step.
23
+ export function createPhysics3DContactConstraintPoint() {
24
+ return {
25
+ bias: 0,
26
+ featureId: 0,
27
+ normalImpulse: 0,
28
+ normalMass: 0,
29
+ tangentImpulse0: 0,
30
+ tangentImpulse1: 0,
31
+ tangentMass0: 0,
32
+ tangentMass1: 0,
33
+ };
34
+ }
35
+ // Rebuilds the solver's working set from the world's contact list and prepares every constraint row:
36
+ // the friction basis, the three effective masses, and the restitution bias.
37
+ //
38
+ // Call once per sub-interval, after `buildPhysics3DSolveIslands` and before
39
+ // `warmStartPhysics3DContacts`. The island order is a real precondition rather than a convention: this
40
+ // reads the island contact slices, so a world whose workspace was never built has no contacts to
41
+ // prepare and produces no constraints at all.
42
+ //
43
+ // Two things happen here that cannot happen anywhere else. The restitution bias is captured from the
44
+ // approach speed BEFORE any impulse is applied — once the first iteration runs, the velocity it would
45
+ // be read from has already been changed by the solve, and restitution computed from it decays toward
46
+ // zero. And the accumulators are matched to last step's by `featureId` rather than by point index,
47
+ // because a narrow phase may report the same physical corner at a different index between steps, and
48
+ // warm starting the wrong corner is worse than not warm starting at all.
49
+ //
50
+ // Contacts that are disabled, sensors, non-touching, asleep, or between two bodies that both have
51
+ // infinite mass produce no constraint: they are skipped rather than emitted with zero rows, so the
52
+ // iteration loops never see work that cannot move anything.
53
+ //
54
+ // The disabled, sensor, and sleeping ones are already gone before this runs, because the iteration is
55
+ // over the SOLVE ISLAND contact slices rather than `world.contacts`. That is what makes a settled world
56
+ // cost nothing here: a sleeping island contributes no slice, so a thousand-body pile at rest is not
57
+ // re-scanned every sub-interval merely to discover there is nothing to do. It also groups the emitted
58
+ // constraints island-major, which disconnected islands cannot perturb for each other.
59
+ //
60
+ // The remaining velocity and position passes stay global over the emitted list rather than looping per
61
+ // island. With a fixed iteration count and no convergence test the two are the same work in the same
62
+ // order — islands are disconnected, so interleaving them cannot change a result — and the flat list is
63
+ // what lets joints and contacts share one interleaved pass.
64
+ export function preparePhysics3DContactConstraints(world) {
65
+ const state = world.solver;
66
+ const previousByContact = state.constraintByContact;
67
+ const constraints = state.constraints;
68
+ // `contact = -1` is the inactive mark while the same high-water objects are gathered back into solve
69
+ // order. The map cannot be cleared first because it is also how the contact finds its prior impulses.
70
+ for (let i = 0; i < constraints.length; i += 1)
71
+ constraints[i].contact = -1;
72
+ constraints.length = 0;
73
+ const config = world.config.sequentialImpulse;
74
+ for (let island = 0; island < world.solveIslandRoots.length; island += 1) {
75
+ const islandStart = world.solveIslandContactStarts[island];
76
+ const islandEnd = islandStart + world.solveIslandContactCounts[island];
77
+ for (let at = islandStart; at < islandEnd; at += 1) {
78
+ const contactIndex = world.solveIslandContactIndices[at];
79
+ const contact = world.contacts[contactIndex];
80
+ if (!contact.touching || contact.pointCount === 0)
81
+ continue;
82
+ const bodyA = world.bodyByIndex.get(contact.bodyA);
83
+ const bodyB = world.bodyByIndex.get(contact.bodyB);
84
+ if (bodyA === undefined || bodyB === undefined)
85
+ continue;
86
+ if (bodyA.inverseMass === 0 &&
87
+ bodyB.inverseMass === 0 &&
88
+ !hasRotationalFreedom(bodyA) &&
89
+ !hasRotationalFreedom(bodyB)) {
90
+ continue;
91
+ }
92
+ let constraint = previousByContact.get(contact);
93
+ if (constraint === undefined) {
94
+ constraint = createPhysics3DContactConstraint();
95
+ previousByContact.set(contact, constraint);
96
+ }
97
+ const previousPointCount = constraint.pointCount;
98
+ for (let i = 0; i < previousPointCount; i += 1) {
99
+ const point = constraint.points[i];
100
+ previousFeatures[i] = point.featureId;
101
+ previousNormalImpulses[i] = point.normalImpulse;
102
+ previousTangentImpulses0[i] = point.tangentImpulse0;
103
+ previousTangentImpulses1[i] = point.tangentImpulse1;
104
+ }
105
+ constraint.contact = contactIndex;
106
+ constraint.pointCount = contact.pointCount;
107
+ writeFrictionBasis(contact.normalX, contact.normalY, contact.normalZ, constraint);
108
+ for (let i = 0; i < contact.pointCount; i += 1) {
109
+ const source = contact.points[i];
110
+ let point = constraint.points[i];
111
+ if (point === undefined) {
112
+ point = createPhysics3DContactConstraintPoint();
113
+ constraint.points.push(point);
114
+ }
115
+ point.featureId = source.featureId;
116
+ point.normalImpulse = 0;
117
+ point.tangentImpulse0 = 0;
118
+ point.tangentImpulse1 = 0;
119
+ if (config.warmStarting) {
120
+ const carried = findPreviousPointByFeatureId(source.featureId, previousPointCount);
121
+ if (carried >= 0) {
122
+ point.normalImpulse = previousNormalImpulses[carried];
123
+ point.tangentImpulse0 = previousTangentImpulses0[carried];
124
+ point.tangentImpulse1 = previousTangentImpulses1[carried];
125
+ }
126
+ }
127
+ point.normalMass = getEffectiveMass(bodyA, bodyB, source.rAX, source.rAY, source.rAZ, source.rBX, source.rBY, source.rBZ, contact.normalX, contact.normalY, contact.normalZ);
128
+ point.tangentMass0 = getEffectiveMass(bodyA, bodyB, source.rAX, source.rAY, source.rAZ, source.rBX, source.rBY, source.rBZ, constraint.tangent0X, constraint.tangent0Y, constraint.tangent0Z);
129
+ point.tangentMass1 = getEffectiveMass(bodyA, bodyB, source.rAX, source.rAY, source.rAZ, source.rBX, source.rBY, source.rBZ, constraint.tangent1X, constraint.tangent1Y, constraint.tangent1Z);
130
+ const approach = getRelativeNormalVelocity(bodyA, bodyB, source.rAX, source.rAY, source.rAZ, source.rBX, source.rBY, source.rBZ, contact.normalX, contact.normalY, contact.normalZ);
131
+ point.bias = approach < -config.restitutionThreshold ? -contact.restitution * approach : 0;
132
+ }
133
+ constraints.push(constraint);
134
+ }
135
+ }
136
+ // Retire constraints whose contacts were omitted from the awake solve without replacing the map.
137
+ // Deleting while iterating a Map is defined to leave the remaining entries visitable.
138
+ previousByContact.forEach((constraint, contact) => {
139
+ if (constraint.contact < 0)
140
+ previousByContact.delete(contact);
141
+ });
142
+ }
143
+ // Resolves penetration by moving bodies directly, leaving `penetrationSlop` of overlap deliberately
144
+ // unresolved so resting bodies do not twitch against a target of exactly zero. Returns the deepest
145
+ // remaining penetration, so a caller can stop iterating once the stack is within tolerance.
146
+ //
147
+ // This is a separate pass from the velocity solve on purpose: correcting overlap by adding separating
148
+ // velocity injects energy the simulation never spent, and a deep stack resolved that way visibly
149
+ // launches itself apart.
150
+ //
151
+ // EACH CONTACT IS REGENERATED IMMEDIATELY BEFORE IT IS SOLVED, which is what makes this a true
152
+ // non-linear Gauss-Seidel pass rather than a repeated correction against one stale measurement.
153
+ //
154
+ // That distinction is the whole quality of a stack. An earlier correction in the same pass has already
155
+ // moved one or both bodies, so the depth captured at intake describes a configuration that no longer
156
+ // exists — and re-applying `positionCorrection * staleDepth` on every iteration cannot converge, because
157
+ // the quantity it is driving to zero never changes. The visible symptom is penetration that grows with
158
+ // stack HEIGHT while every single-contact test still passes: a twelve-box pile measured 0.23 of sink at
159
+ // its base against 0.005 for one box, and correcting from current geometry removes it.
160
+ //
161
+ // The manifold is leased scratch, so the pass allocates nothing.
162
+ export function solvePhysics3DContactPositions(world) {
163
+ const scratch = acquirePhysics3DPositionScratch();
164
+ try {
165
+ return solvePhysics3DContactPositionsWithScratch(world, scratch);
166
+ }
167
+ finally {
168
+ releasePhysics3DPositionScratch(scratch);
169
+ }
170
+ }
171
+ function solvePhysics3DContactPositionsWithScratch(world, scratch) {
172
+ const config = world.config.sequentialImpulse;
173
+ let deepest = 0;
174
+ const constraints = world.solver.constraints;
175
+ for (let constraintIndex = 0; constraintIndex < constraints.length; constraintIndex += 1) {
176
+ const constraint = constraints[constraintIndex];
177
+ const contact = world.contacts[constraint.contact];
178
+ const bodyA = world.bodyByIndex.get(contact.bodyA);
179
+ const bodyB = world.bodyByIndex.get(contact.bodyB);
180
+ if (bodyA === undefined || bodyB === undefined)
181
+ continue;
182
+ const colliderA = bodyA.colliders[contact.colliderA];
183
+ const colliderB = bodyB.colliders[contact.colliderB];
184
+ if (colliderA === undefined || colliderB === undefined)
185
+ continue;
186
+ updatePhysics3DColliderWorldShape(colliderA, bodyA);
187
+ updatePhysics3DColliderWorldShape(colliderB, bodyB);
188
+ if (!collidePhysics3DColliderShapes(colliderA.world, colliderB.world, scratch.manifold))
189
+ continue;
190
+ const manifold = scratch.manifold;
191
+ writeRigidBody3DWorldCenter(bodyA, scratch.centerA);
192
+ writeRigidBody3DWorldCenter(bodyB, scratch.centerB);
193
+ for (let i = 0; i < manifold.pointCount; i += 1) {
194
+ const source = manifold.points[i];
195
+ const excess = source.depth - config.penetrationSlop;
196
+ if (excess > deepest)
197
+ deepest = excess;
198
+ if (excess <= 0)
199
+ continue;
200
+ // Lever arms from the CURRENT centres to the CURRENT contact point, for the same reason the
201
+ // manifold is regenerated: an arm measured against a pose two corrections ago applies its torque
202
+ // about the wrong axis.
203
+ const rAX = source.x - scratch.centerA[0];
204
+ const rAY = source.y - scratch.centerA[1];
205
+ const rAZ = source.z - scratch.centerA[2];
206
+ const rBX = source.x - scratch.centerB[0];
207
+ const rBY = source.y - scratch.centerB[1];
208
+ const rBZ = source.z - scratch.centerB[2];
209
+ const mass = getEffectiveMass(bodyA, bodyB, rAX, rAY, rAZ, rBX, rBY, rBZ, manifold.normalX, manifold.normalY, manifold.normalZ);
210
+ const correction = config.positionCorrection * excess * mass;
211
+ applyPositionCorrection(bodyA, bodyB, rAX, rAY, rAZ, rBX, rBY, rBZ, manifold.normalX * correction, manifold.normalY * correction, manifold.normalZ * correction);
212
+ }
213
+ }
214
+ return deepest;
215
+ }
216
+ // Runs one velocity iteration over every prepared constraint. Call `velocityIterations` times.
217
+ //
218
+ // The normal is solved before friction, so a NEW contact has a Coulomb limit in its first iteration.
219
+ // Reversing them makes friction read the previous normal impulse: zero on first impact, and one
220
+ // iteration behind thereafter. The two tangents are clamped TOGETHER as a cone rather than
221
+ // independently. Clamping each to `friction * normalImpulse` on its own admits a combined
222
+ // magnitude of `sqrt(2) * friction * normalImpulse` along the diagonal, which presents as a box that
223
+ // slides measurably faster at 45 degrees than it does along either tangent — a bug that looks like bad
224
+ // friction tuning rather than like a geometry error, and one that cannot occur in 2D because there is
225
+ // only one tangent to clamp.
226
+ export function solvePhysics3DContactVelocities(world) {
227
+ const constraints = world.solver.constraints;
228
+ for (let constraintIndex = 0; constraintIndex < constraints.length; constraintIndex += 1) {
229
+ const constraint = constraints[constraintIndex];
230
+ const contact = world.contacts[constraint.contact];
231
+ const bodyA = world.bodyByIndex.get(contact.bodyA);
232
+ const bodyB = world.bodyByIndex.get(contact.bodyB);
233
+ if (bodyA === undefined || bodyB === undefined)
234
+ continue;
235
+ for (let i = 0; i < constraint.pointCount; i += 1) {
236
+ const source = contact.points[i];
237
+ const point = constraint.points[i];
238
+ const normalVelocity = getRelativeNormalVelocity(bodyA, bodyB, source.rAX, source.rAY, source.rAZ, source.rBX, source.rBY, source.rBZ, contact.normalX, contact.normalY, contact.normalZ);
239
+ const normalImpulse = Math.max(point.normalImpulse + (point.bias - normalVelocity) * point.normalMass, 0);
240
+ const deltaNormal = normalImpulse - point.normalImpulse;
241
+ point.normalImpulse = normalImpulse;
242
+ applyContactImpulse(bodyA, bodyB, source.rAX, source.rAY, source.rAZ, source.rBX, source.rBY, source.rBZ, contact.normalX * deltaNormal, contact.normalY * deltaNormal, contact.normalZ * deltaNormal);
243
+ const maxFriction = contact.friction * point.normalImpulse;
244
+ const tangentVelocity0 = getRelativeNormalVelocity(bodyA, bodyB, source.rAX, source.rAY, source.rAZ, source.rBX, source.rBY, source.rBZ, constraint.tangent0X, constraint.tangent0Y, constraint.tangent0Z);
245
+ let impulse0 = point.tangentImpulse0 - tangentVelocity0 * point.tangentMass0;
246
+ const tangentVelocity1 = getRelativeNormalVelocity(bodyA, bodyB, source.rAX, source.rAY, source.rAZ, source.rBX, source.rBY, source.rBZ, constraint.tangent1X, constraint.tangent1Y, constraint.tangent1Z);
247
+ let impulse1 = point.tangentImpulse1 - tangentVelocity1 * point.tangentMass1;
248
+ const magnitude = Math.sqrt(impulse0 * impulse0 + impulse1 * impulse1);
249
+ if (magnitude > maxFriction) {
250
+ const scale = maxFriction / magnitude;
251
+ impulse0 *= scale;
252
+ impulse1 *= scale;
253
+ }
254
+ const deltaTangent0 = impulse0 - point.tangentImpulse0;
255
+ const deltaTangent1 = impulse1 - point.tangentImpulse1;
256
+ point.tangentImpulse0 = impulse0;
257
+ point.tangentImpulse1 = impulse1;
258
+ applyContactImpulse(bodyA, bodyB, source.rAX, source.rAY, source.rAZ, source.rBX, source.rBY, source.rBZ, constraint.tangent0X * deltaTangent0 + constraint.tangent1X * deltaTangent1, constraint.tangent0Y * deltaTangent0 + constraint.tangent1Y * deltaTangent1, constraint.tangent0Z * deltaTangent0 + constraint.tangent1Z * deltaTangent1);
259
+ }
260
+ }
261
+ }
262
+ // Replays the accumulated impulses carried over from last step, so the solver starts an iteration
263
+ // budget from roughly the answer it converged to rather than from zero. A stack solved cold every step
264
+ // sinks visibly under its own weight at any practical iteration count.
265
+ //
266
+ // Runs after `preparePhysics3DContactConstraints` and before the first velocity iteration.
267
+ export function warmStartPhysics3DContacts(world) {
268
+ if (!world.config.sequentialImpulse.warmStarting)
269
+ return;
270
+ const constraints = world.solver.constraints;
271
+ for (let constraintIndex = 0; constraintIndex < constraints.length; constraintIndex += 1) {
272
+ const constraint = constraints[constraintIndex];
273
+ const contact = world.contacts[constraint.contact];
274
+ const bodyA = world.bodyByIndex.get(contact.bodyA);
275
+ const bodyB = world.bodyByIndex.get(contact.bodyB);
276
+ if (bodyA === undefined || bodyB === undefined)
277
+ continue;
278
+ for (let i = 0; i < constraint.pointCount; i += 1) {
279
+ const source = contact.points[i];
280
+ const point = constraint.points[i];
281
+ applyContactImpulse(bodyA, bodyB, source.rAX, source.rAY, source.rAZ, source.rBX, source.rBY, source.rBZ, contact.normalX * point.normalImpulse +
282
+ constraint.tangent0X * point.tangentImpulse0 +
283
+ constraint.tangent1X * point.tangentImpulse1, contact.normalY * point.normalImpulse +
284
+ constraint.tangent0Y * point.tangentImpulse0 +
285
+ constraint.tangent1Y * point.tangentImpulse1, contact.normalZ * point.normalImpulse +
286
+ constraint.tangent0Z * point.tangentImpulse0 +
287
+ constraint.tangent1Z * point.tangentImpulse1);
288
+ }
289
+ }
290
+ }
291
+ // Applies an equal and opposite impulse at the contact: A gains it, B loses it. The contact normal
292
+ // points out of B, so a positive normal impulse separates the pair.
293
+ function applyContactImpulse(bodyA, bodyB, rAX, rAY, rAZ, rBX, rBY, rBZ, impulseX, impulseY, impulseZ) {
294
+ applyBodyImpulse(bodyA, rAX, rAY, rAZ, impulseX, impulseY, impulseZ);
295
+ applyBodyImpulse(bodyB, rBX, rBY, rBZ, -impulseX, -impulseY, -impulseZ);
296
+ }
297
+ // A static body's zero inverse mass and zero inverse inertia make this a no-op with no branch, which is
298
+ // the whole reason infinite mass is represented as a zero inverse rather than as a flag.
299
+ function applyBodyImpulse(body, rX, rY, rZ, impulseX, impulseY, impulseZ) {
300
+ body.velocityX += impulseX * body.inverseMass;
301
+ body.velocityY += impulseY * body.inverseMass;
302
+ body.velocityZ += impulseZ * body.inverseMass;
303
+ const torqueX = rY * impulseZ - rZ * impulseY;
304
+ const torqueY = rZ * impulseX - rX * impulseZ;
305
+ const torqueZ = rX * impulseY - rY * impulseX;
306
+ readWorldInverseInertia(body, scratchTensor);
307
+ applySymmetricTensor(scratchTensor, torqueX, torqueY, torqueZ, scratchVector);
308
+ body.angularVelocityX += scratchVector[0];
309
+ body.angularVelocityY += scratchVector[1];
310
+ body.angularVelocityZ += scratchVector[2];
311
+ }
312
+ // Moves both bodies apart along an already-scaled correction vector, rotating each about its centre of
313
+ // mass by the same lever-arm term the velocity solve uses. Orientation is nudged by the small-angle
314
+ // quaternion update and renormalized, exactly as pose integration does.
315
+ function applyPositionCorrection(bodyA, bodyB, rAX, rAY, rAZ, rBX, rBY, rBZ, correctionX, correctionY, correctionZ) {
316
+ applyBodyPositionCorrection(bodyA, rAX, rAY, rAZ, correctionX, correctionY, correctionZ);
317
+ applyBodyPositionCorrection(bodyB, rBX, rBY, rBZ, -correctionX, -correctionY, -correctionZ);
318
+ }
319
+ function applyBodyPositionCorrection(body, rX, rY, rZ, correctionX, correctionY, correctionZ) {
320
+ body.x += correctionX * body.inverseMass;
321
+ body.y += correctionY * body.inverseMass;
322
+ body.z += correctionZ * body.inverseMass;
323
+ const turnX = rY * correctionZ - rZ * correctionY;
324
+ const turnY = rZ * correctionX - rX * correctionZ;
325
+ const turnZ = rX * correctionY - rY * correctionX;
326
+ readWorldInverseInertia(body, scratchTensor);
327
+ applySymmetricTensor(scratchTensor, turnX, turnY, turnZ, scratchVector);
328
+ const angleX = scratchVector[0];
329
+ const angleY = scratchVector[1];
330
+ const angleZ = scratchVector[2];
331
+ if (angleX === 0 && angleY === 0 && angleZ === 0)
332
+ return;
333
+ const qx = body.orientationX;
334
+ const qy = body.orientationY;
335
+ const qz = body.orientationZ;
336
+ const qw = body.orientationW;
337
+ let nextX = qx + 0.5 * (angleX * qw + angleY * qz - angleZ * qy);
338
+ let nextY = qy + 0.5 * (angleY * qw + angleZ * qx - angleX * qz);
339
+ let nextZ = qz + 0.5 * (angleZ * qw + angleX * qy - angleY * qx);
340
+ let nextW = qw - 0.5 * (angleX * qx + angleY * qy + angleZ * qz);
341
+ const length = Math.sqrt(nextX * nextX + nextY * nextY + nextZ * nextZ + nextW * nextW);
342
+ if (length === 0)
343
+ return;
344
+ const inverseLength = 1 / length;
345
+ nextX *= inverseLength;
346
+ nextY *= inverseLength;
347
+ nextZ *= inverseLength;
348
+ nextW *= inverseLength;
349
+ body.orientationX = nextX;
350
+ body.orientationY = nextY;
351
+ body.orientationZ = nextZ;
352
+ body.orientationW = nextW;
353
+ }
354
+ // Locates last step's accumulators for a feature. Linear because a manifold holds at most a handful of
355
+ // points and a map per contact would cost more than the scan.
356
+ function findPreviousPointByFeatureId(featureId, pointCount) {
357
+ for (let i = 0; i < pointCount; i += 1) {
358
+ if (previousFeatures[i] === featureId)
359
+ return i;
360
+ }
361
+ return -1;
362
+ }
363
+ // The constraint denominator along one direction: the scalar mass a unit impulse in that direction
364
+ // acts against, including both bodies' resistance to being spun about the contact.
365
+ //
366
+ // Returns 0 when the pair cannot move along the direction at all, so the impulse computed from it is
367
+ // zero rather than infinite.
368
+ function getEffectiveMass(bodyA, bodyB, rAX, rAY, rAZ, rBX, rBY, rBZ, directionX, directionY, directionZ) {
369
+ let denominator = bodyA.inverseMass + bodyB.inverseMass;
370
+ const crossAX = rAY * directionZ - rAZ * directionY;
371
+ const crossAY = rAZ * directionX - rAX * directionZ;
372
+ const crossAZ = rAX * directionY - rAY * directionX;
373
+ readWorldInverseInertia(bodyA, scratchTensor);
374
+ applySymmetricTensor(scratchTensor, crossAX, crossAY, crossAZ, scratchVector);
375
+ denominator += crossAX * scratchVector[0] + crossAY * scratchVector[1] + crossAZ * scratchVector[2];
376
+ const crossBX = rBY * directionZ - rBZ * directionY;
377
+ const crossBY = rBZ * directionX - rBX * directionZ;
378
+ const crossBZ = rBX * directionY - rBY * directionX;
379
+ readWorldInverseInertia(bodyB, scratchTensor);
380
+ applySymmetricTensor(scratchTensor, crossBX, crossBY, crossBZ, scratchVector);
381
+ denominator += crossBX * scratchVector[0] + crossBY * scratchVector[1] + crossBZ * scratchVector[2];
382
+ return denominator > 0 ? 1 / denominator : 0;
383
+ }
384
+ // The closing speed of the two contact points along a direction, positive when they separate. Each
385
+ // point's velocity is its body's linear velocity plus the rotational contribution at its lever arm,
386
+ // which is the term that makes a spinning body's surface move even when its centre is still.
387
+ function getRelativeNormalVelocity(bodyA, bodyB, rAX, rAY, rAZ, rBX, rBY, rBZ, directionX, directionY, directionZ) {
388
+ const pointAX = bodyA.velocityX + (bodyA.angularVelocityY * rAZ - bodyA.angularVelocityZ * rAY);
389
+ const pointAY = bodyA.velocityY + (bodyA.angularVelocityZ * rAX - bodyA.angularVelocityX * rAZ);
390
+ const pointAZ = bodyA.velocityZ + (bodyA.angularVelocityX * rAY - bodyA.angularVelocityY * rAX);
391
+ const pointBX = bodyB.velocityX + (bodyB.angularVelocityY * rBZ - bodyB.angularVelocityZ * rBY);
392
+ const pointBY = bodyB.velocityY + (bodyB.angularVelocityZ * rBX - bodyB.angularVelocityX * rBZ);
393
+ const pointBZ = bodyB.velocityZ + (bodyB.angularVelocityX * rBY - bodyB.angularVelocityY * rBX);
394
+ return (pointAX - pointBX) * directionX + (pointAY - pointBY) * directionY + (pointAZ - pointBZ) * directionZ;
395
+ }
396
+ function hasRotationalFreedom(body) {
397
+ return (body.inverseInertiaWorldXX !== 0 ||
398
+ body.inverseInertiaWorldYY !== 0 ||
399
+ body.inverseInertiaWorldZZ !== 0 ||
400
+ body.inverseInertiaWorldXY !== 0 ||
401
+ body.inverseInertiaWorldXZ !== 0 ||
402
+ body.inverseInertiaWorldYZ !== 0);
403
+ }
404
+ function readWorldInverseInertia(body, out) {
405
+ out[TENSOR_XX] = body.inverseInertiaWorldXX;
406
+ out[TENSOR_YY] = body.inverseInertiaWorldYY;
407
+ out[TENSOR_ZZ] = body.inverseInertiaWorldZZ;
408
+ out[TENSOR_XY] = body.inverseInertiaWorldXY;
409
+ out[TENSOR_XZ] = body.inverseInertiaWorldXZ;
410
+ out[TENSOR_YZ] = body.inverseInertiaWorldYZ;
411
+ }
412
+ // Builds an orthonormal pair spanning the plane orthogonal to the contact normal. The seed axis is
413
+ // whichever principal axis the normal leans on least, so the cross product is never near-degenerate:
414
+ // a normal within 1/sqrt(3) of x leans on x least often, and that threshold is exactly where the
415
+ // choice flips.
416
+ function writeFrictionBasis(normalX, normalY, normalZ, out) {
417
+ let seedX = 0;
418
+ let seedY = 0;
419
+ let seedZ = 0;
420
+ if (Math.abs(normalX) < AXIS_SELECTION_THRESHOLD)
421
+ seedX = 1;
422
+ else if (Math.abs(normalY) < AXIS_SELECTION_THRESHOLD)
423
+ seedY = 1;
424
+ else
425
+ seedZ = 1;
426
+ let tangent0X = normalY * seedZ - normalZ * seedY;
427
+ let tangent0Y = normalZ * seedX - normalX * seedZ;
428
+ let tangent0Z = normalX * seedY - normalY * seedX;
429
+ const length = Math.sqrt(tangent0X * tangent0X + tangent0Y * tangent0Y + tangent0Z * tangent0Z);
430
+ if (length > 0) {
431
+ const inverseLength = 1 / length;
432
+ tangent0X *= inverseLength;
433
+ tangent0Y *= inverseLength;
434
+ tangent0Z *= inverseLength;
435
+ }
436
+ out.tangent0X = tangent0X;
437
+ out.tangent0Y = tangent0Y;
438
+ out.tangent0Z = tangent0Z;
439
+ out.tangent1X = normalY * tangent0Z - normalZ * tangent0Y;
440
+ out.tangent1Y = normalZ * tangent0X - normalX * tangent0Z;
441
+ out.tangent1Z = normalX * tangent0Y - normalY * tangent0X;
442
+ }
443
+ const AXIS_SELECTION_THRESHOLD = 0.5773502691896258;
444
+ const scratchTensor = [0, 0, 0, 0, 0, 0];
445
+ const scratchVector = [0, 0, 0];
446
+ const previousFeatures = [];
447
+ const previousNormalImpulses = [];
448
+ const previousTangentImpulses0 = [];
449
+ const previousTangentImpulses1 = [];
450
+ function acquirePhysics3DPositionScratch() {
451
+ return physics3DPositionScratchPool.pop() ?? createPhysics3DPositionScratch();
452
+ }
453
+ function createPhysics3DPositionScratch() {
454
+ return { manifold: createCollisionContactManifold3D(), centerA: [0, 0, 0], centerB: [0, 0, 0] };
455
+ }
456
+ function releasePhysics3DPositionScratch(scratch) {
457
+ physics3DPositionScratchPool.push(scratch);
458
+ }
459
+ const physics3DPositionScratchPool = [createPhysics3DPositionScratch()];
460
+ //# sourceMappingURL=solver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solver.js","sourceRoot":"","sources":["../src/solver.ts"],"names":[],"mappings":"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"}
package/dist/step.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import type { Physics3DStepGuard, Physics3DWorld } from '@flighthq/types/contract';
2
+ export declare function setPhysics3DStepGuard(guard: Physics3DStepGuard | null): void;
3
+ export declare function stepPhysics3D(world: Physics3DWorld, dt: number): void;
4
+ export declare function stepPhysics3DInterval(world: Physics3DWorld, dt: number): void;
5
+ //# sourceMappingURL=step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../src/step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKV,kBAAkB,EAClB,cAAc,EAEf,MAAM,0BAA0B,CAAC;AAoClC,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAE5E;AAcD,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAiCrE;AAkBD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CA0C7E"}