@codexo/exojs-physics 0.15.2 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/README.md +51 -23
  2. package/dist/esm/Aabb.d.ts +6 -10
  3. package/dist/esm/Aabb.d.ts.map +1 -0
  4. package/dist/esm/Aabb.js +9 -5
  5. package/dist/esm/Aabb.js.map +1 -1
  6. package/dist/esm/Collider.d.ts +62 -10
  7. package/dist/esm/Collider.d.ts.map +1 -0
  8. package/dist/esm/Collider.js +263 -157
  9. package/dist/esm/Collider.js.map +1 -1
  10. package/dist/esm/ContactGraph.d.ts +51 -5
  11. package/dist/esm/ContactGraph.d.ts.map +1 -0
  12. package/dist/esm/ContactGraph.js +282 -223
  13. package/dist/esm/ContactGraph.js.map +1 -1
  14. package/dist/esm/ContactModifier.d.ts +85 -0
  15. package/dist/esm/ContactModifier.d.ts.map +1 -0
  16. package/dist/esm/ContactModifier.js +49 -0
  17. package/dist/esm/ContactModifier.js.map +1 -0
  18. package/dist/esm/PhysicsBody.d.ts +56 -22
  19. package/dist/esm/PhysicsBody.d.ts.map +1 -0
  20. package/dist/esm/PhysicsBody.js +461 -443
  21. package/dist/esm/PhysicsBody.js.map +1 -1
  22. package/dist/esm/PhysicsWorld.d.ts +276 -43
  23. package/dist/esm/PhysicsWorld.d.ts.map +1 -0
  24. package/dist/esm/PhysicsWorld.js +890 -626
  25. package/dist/esm/PhysicsWorld.js.map +1 -1
  26. package/dist/esm/TimeStepper.d.ts +3 -2
  27. package/dist/esm/TimeStepper.d.ts.map +1 -0
  28. package/dist/esm/TimeStepper.js +56 -67
  29. package/dist/esm/TimeStepper.js.map +1 -1
  30. package/dist/esm/backend/NativePhysicsBackend.d.ts +8 -4
  31. package/dist/esm/backend/NativePhysicsBackend.d.ts.map +1 -0
  32. package/dist/esm/backend/NativePhysicsBackend.js +48 -41
  33. package/dist/esm/backend/NativePhysicsBackend.js.map +1 -1
  34. package/dist/esm/backend/PhysicsBackend.d.ts +9 -2
  35. package/dist/esm/backend/PhysicsBackend.d.ts.map +1 -0
  36. package/dist/esm/binding/BindingRegistry.d.ts +25 -4
  37. package/dist/esm/binding/BindingRegistry.d.ts.map +1 -0
  38. package/dist/esm/binding/BindingRegistry.js +70 -36
  39. package/dist/esm/binding/BindingRegistry.js.map +1 -1
  40. package/dist/esm/binding/PhysicsBinding.d.ts +22 -5
  41. package/dist/esm/binding/PhysicsBinding.d.ts.map +1 -0
  42. package/dist/esm/binding/PhysicsBinding.js +46 -21
  43. package/dist/esm/binding/PhysicsBinding.js.map +1 -1
  44. package/dist/esm/broadphase/AabbTreeBroadPhase.d.ts +68 -0
  45. package/dist/esm/broadphase/AabbTreeBroadPhase.d.ts.map +1 -0
  46. package/dist/esm/broadphase/AabbTreeBroadPhase.js +149 -0
  47. package/dist/esm/broadphase/AabbTreeBroadPhase.js.map +1 -0
  48. package/dist/esm/broadphase/BroadPhase.d.ts +7 -4
  49. package/dist/esm/broadphase/BroadPhase.d.ts.map +1 -0
  50. package/dist/esm/broadphase/index.d.ts +2 -1
  51. package/dist/esm/broadphase/index.d.ts.map +1 -0
  52. package/dist/esm/collision/CollisionProxy.d.ts +3 -2
  53. package/dist/esm/collision/CollisionProxy.d.ts.map +1 -0
  54. package/dist/esm/collision/Manifold.d.ts +5 -4
  55. package/dist/esm/collision/Manifold.d.ts.map +1 -0
  56. package/dist/esm/collision/Manifold.js +34 -25
  57. package/dist/esm/collision/Manifold.js.map +1 -1
  58. package/dist/esm/collision/chainAdjacency.d.ts +29 -0
  59. package/dist/esm/collision/chainAdjacency.d.ts.map +1 -0
  60. package/dist/esm/collision/chainAdjacency.js +44 -0
  61. package/dist/esm/collision/chainAdjacency.js.map +1 -0
  62. package/dist/esm/collision/dispatch.d.ts +35 -0
  63. package/dist/esm/collision/dispatch.d.ts.map +1 -0
  64. package/dist/esm/collision/dispatch.js +58 -0
  65. package/dist/esm/collision/dispatch.js.map +1 -0
  66. package/dist/esm/collision/index.d.ts +2 -0
  67. package/dist/esm/collision/index.d.ts.map +1 -0
  68. package/dist/esm/collision/narrowphase.d.ts +5 -2
  69. package/dist/esm/collision/narrowphase.d.ts.map +1 -0
  70. package/dist/esm/collision/narrowphase.js +524 -399
  71. package/dist/esm/collision/narrowphase.js.map +1 -1
  72. package/dist/esm/collision/segments.d.ts +19 -0
  73. package/dist/esm/collision/segments.d.ts.map +1 -0
  74. package/dist/esm/collision/segments.js +36 -0
  75. package/dist/esm/collision/segments.js.map +1 -0
  76. package/dist/esm/collision/sweep.d.ts +35 -0
  77. package/dist/esm/collision/sweep.d.ts.map +1 -0
  78. package/dist/esm/collision/sweep.js +437 -0
  79. package/dist/esm/collision/sweep.js.map +1 -0
  80. package/dist/esm/debug/PhysicsDebugDraw.d.ts +23 -4
  81. package/dist/esm/debug/PhysicsDebugDraw.d.ts.map +1 -0
  82. package/dist/esm/debug/PhysicsDebugDraw.js +230 -188
  83. package/dist/esm/debug/PhysicsDebugDraw.js.map +1 -1
  84. package/dist/esm/debug/index.d.ts +1 -0
  85. package/dist/esm/debug/index.d.ts.map +1 -0
  86. package/dist/esm/debug/index.js +3 -2
  87. package/dist/esm/events.d.ts +1 -0
  88. package/dist/esm/events.d.ts.map +1 -0
  89. package/dist/esm/index.d.ts +1 -0
  90. package/dist/esm/index.d.ts.map +1 -0
  91. package/dist/esm/index.js +24 -19
  92. package/dist/esm/joints/DistanceJoint.d.ts +4 -3
  93. package/dist/esm/joints/DistanceJoint.d.ts.map +1 -0
  94. package/dist/esm/joints/DistanceJoint.js +160 -172
  95. package/dist/esm/joints/DistanceJoint.js.map +1 -1
  96. package/dist/esm/joints/Joint.d.ts +5 -4
  97. package/dist/esm/joints/Joint.d.ts.map +1 -0
  98. package/dist/esm/joints/Joint.js +23 -21
  99. package/dist/esm/joints/Joint.js.map +1 -1
  100. package/dist/esm/joints/MouseJoint.d.ts +8 -7
  101. package/dist/esm/joints/MouseJoint.d.ts.map +1 -0
  102. package/dist/esm/joints/MouseJoint.js +132 -133
  103. package/dist/esm/joints/MouseJoint.js.map +1 -1
  104. package/dist/esm/joints/PrismaticJoint.d.ts +5 -4
  105. package/dist/esm/joints/PrismaticJoint.d.ts.map +1 -0
  106. package/dist/esm/joints/PrismaticJoint.js +211 -240
  107. package/dist/esm/joints/PrismaticJoint.js.map +1 -1
  108. package/dist/esm/joints/RevoluteJoint.d.ts +4 -3
  109. package/dist/esm/joints/RevoluteJoint.d.ts.map +1 -0
  110. package/dist/esm/joints/RevoluteJoint.js +191 -213
  111. package/dist/esm/joints/RevoluteJoint.js.map +1 -1
  112. package/dist/esm/joints/WeldJoint.d.ts +3 -2
  113. package/dist/esm/joints/WeldJoint.d.ts.map +1 -0
  114. package/dist/esm/joints/WeldJoint.js +156 -152
  115. package/dist/esm/joints/WeldJoint.js.map +1 -1
  116. package/dist/esm/joints/WheelJoint.d.ts +4 -3
  117. package/dist/esm/joints/WheelJoint.d.ts.map +1 -0
  118. package/dist/esm/joints/WheelJoint.js +228 -255
  119. package/dist/esm/joints/WheelJoint.js.map +1 -1
  120. package/dist/esm/math.d.ts +6 -9
  121. package/dist/esm/math.d.ts.map +1 -0
  122. package/dist/esm/math.js +37 -39
  123. package/dist/esm/math.js.map +1 -1
  124. package/dist/esm/physicsBuildInfo.d.ts +1 -0
  125. package/dist/esm/physicsBuildInfo.d.ts.map +1 -0
  126. package/dist/esm/physicsBuildInfo.js +6 -4
  127. package/dist/esm/physicsBuildInfo.js.map +1 -1
  128. package/dist/esm/public.d.ts +8 -3
  129. package/dist/esm/public.d.ts.map +1 -0
  130. package/dist/esm/query/QueryEngine.d.ts +56 -12
  131. package/dist/esm/query/QueryEngine.d.ts.map +1 -0
  132. package/dist/esm/query/QueryEngine.js +494 -237
  133. package/dist/esm/query/QueryEngine.js.map +1 -1
  134. package/dist/esm/query/SpatialIndex.d.ts +34 -0
  135. package/dist/esm/query/SpatialIndex.d.ts.map +1 -0
  136. package/dist/esm/shapes/AnyShape.d.ts +9 -4
  137. package/dist/esm/shapes/AnyShape.d.ts.map +1 -0
  138. package/dist/esm/shapes/BoxShape.d.ts +2 -1
  139. package/dist/esm/shapes/BoxShape.d.ts.map +1 -0
  140. package/dist/esm/shapes/BoxShape.js +37 -25
  141. package/dist/esm/shapes/BoxShape.js.map +1 -1
  142. package/dist/esm/shapes/CapsuleShape.d.ts +30 -0
  143. package/dist/esm/shapes/CapsuleShape.d.ts.map +1 -0
  144. package/dist/esm/shapes/CapsuleShape.js +88 -0
  145. package/dist/esm/shapes/CapsuleShape.js.map +1 -0
  146. package/dist/esm/shapes/ChainEdgeShape.d.ts +30 -0
  147. package/dist/esm/shapes/ChainEdgeShape.d.ts.map +1 -0
  148. package/dist/esm/shapes/ChainEdgeShape.js +66 -0
  149. package/dist/esm/shapes/ChainEdgeShape.js.map +1 -0
  150. package/dist/esm/shapes/ChainShape.d.ts +52 -0
  151. package/dist/esm/shapes/ChainShape.d.ts.map +1 -0
  152. package/dist/esm/shapes/ChainShape.js +85 -0
  153. package/dist/esm/shapes/ChainShape.js.map +1 -0
  154. package/dist/esm/shapes/CircleShape.d.ts +3 -4
  155. package/dist/esm/shapes/CircleShape.d.ts.map +1 -0
  156. package/dist/esm/shapes/CircleShape.js +27 -26
  157. package/dist/esm/shapes/CircleShape.js.map +1 -1
  158. package/dist/esm/shapes/PolygonShape.d.ts +7 -8
  159. package/dist/esm/shapes/PolygonShape.d.ts.map +1 -0
  160. package/dist/esm/shapes/PolygonShape.js +131 -162
  161. package/dist/esm/shapes/PolygonShape.js.map +1 -1
  162. package/dist/esm/shapes/SegmentShape.d.ts +31 -0
  163. package/dist/esm/shapes/SegmentShape.d.ts.map +1 -0
  164. package/dist/esm/shapes/SegmentShape.js +62 -0
  165. package/dist/esm/shapes/SegmentShape.js.map +1 -0
  166. package/dist/esm/shapes/Shape.d.ts +28 -17
  167. package/dist/esm/shapes/Shape.d.ts.map +1 -0
  168. package/dist/esm/shapes/Shape.js +12 -13
  169. package/dist/esm/shapes/Shape.js.map +1 -1
  170. package/dist/esm/shapes/convexParts.d.ts +21 -0
  171. package/dist/esm/shapes/convexParts.d.ts.map +1 -0
  172. package/dist/esm/shapes/convexParts.js +26 -0
  173. package/dist/esm/shapes/convexParts.js.map +1 -0
  174. package/dist/esm/shapes/decompose.d.ts +24 -0
  175. package/dist/esm/shapes/decompose.d.ts.map +1 -0
  176. package/dist/esm/shapes/decompose.js +272 -0
  177. package/dist/esm/shapes/decompose.js.map +1 -0
  178. package/dist/esm/shapes/index.d.ts +4 -0
  179. package/dist/esm/shapes/index.d.ts.map +1 -0
  180. package/dist/esm/solver/ContactSolver.d.ts +12 -5
  181. package/dist/esm/solver/ContactSolver.d.ts.map +1 -0
  182. package/dist/esm/solver/ContactSolver.js +425 -471
  183. package/dist/esm/solver/ContactSolver.js.map +1 -1
  184. package/dist/esm/solver/tolerances.d.ts +34 -0
  185. package/dist/esm/solver/tolerances.d.ts.map +1 -0
  186. package/dist/esm/solver/tolerances.js +38 -0
  187. package/dist/esm/solver/tolerances.js.map +1 -0
  188. package/dist/esm/sort.d.ts +5 -4
  189. package/dist/esm/sort.d.ts.map +1 -0
  190. package/dist/esm/sort.js +41 -51
  191. package/dist/esm/sort.js.map +1 -1
  192. package/dist/esm/types.d.ts +4 -8
  193. package/dist/esm/types.d.ts.map +1 -0
  194. package/dist/esm/types.js +15 -17
  195. package/dist/esm/types.js.map +1 -1
  196. package/package.json +6 -6
  197. package/dist/esm/broadphase/SweepAndPrune.d.ts +0 -15
  198. package/dist/esm/broadphase/SweepAndPrune.js +0 -77
  199. package/dist/esm/broadphase/SweepAndPrune.js.map +0 -1
  200. package/dist/esm/debug/index.js.map +0 -1
  201. package/dist/esm/index.js.map +0 -1
@@ -1,159 +1,163 @@
1
- import { applyInverseTransform, applyTransform } from '../math.js';
2
- import { Joint } from './Joint.js';
1
+ import { applyInverseTransform, applyTransform } from "../math.js";
2
+ import { Joint } from "./Joint.js";
3
3
 
4
- /** Reused output sink — physics steps single-threaded, so a shared scratch is safe. */
5
- const scratch = { x: 0, y: 0 };
4
+ //#region src/joints/WeldJoint.ts
5
+ /** Reused output sink - physics steps single-threaded, so a shared scratch is safe. */
6
+ const scratch = {
7
+ x: 0,
8
+ y: 0
9
+ };
6
10
  /** Box2D-v3 soft-constraint factors at sub-step `h`, or rigid Baumgarte when `hertz === 0`. */
7
11
  const computeSoftFactors = (hertz, dampingRatio, h, out) => {
8
- if (hertz > 0) {
9
- const omega = 2 * Math.PI * hertz;
10
- const a1 = 2 * dampingRatio + h * omega;
11
- const a2 = h * omega * a1;
12
- const a3 = 1 / (1 + a2);
13
- out.biasRate = omega / a1;
14
- out.massScale = a2 * a3;
15
- out.impulseScale = a3;
16
- }
17
- else {
18
- out.biasRate = 0.2 / h;
19
- out.massScale = 1;
20
- out.impulseScale = 0;
21
- }
12
+ if (hertz > 0) {
13
+ const omega = 2 * Math.PI * hertz;
14
+ const a1 = 2 * dampingRatio + h * omega;
15
+ const a2 = h * omega * a1;
16
+ const a3 = 1 / (1 + a2);
17
+ out.biasRate = omega / a1;
18
+ out.massScale = a2 * a3;
19
+ out.impulseScale = a3;
20
+ } else {
21
+ out.biasRate = .2 / h;
22
+ out.massScale = 1;
23
+ out.impulseScale = 0;
24
+ }
22
25
  };
23
26
  /**
24
- * Rigidly fixes the relative position and orientation of two bodies (they move
25
- * as one rigid body). A 2-DOF point constraint (like {@link RevoluteJoint}) plus
26
- * a 1-DOF angular constraint, solved in the sub-step loop. Both locks default to
27
- * rigid; set `linearHertz`/`angularHertz` for a springy weld.
28
- */
29
- class WeldJoint extends Joint {
30
- /** Locked relative angle `angleB − angleA`. */
31
- referenceAngle;
32
- /** Soft frequency for the position lock (`0` = rigid). */
33
- linearHertz;
34
- /** Soft frequency for the angle lock (`0` = rigid). */
35
- angularHertz;
36
- /** Soft damping ratio. */
37
- dampingRatio;
38
- _localAnchorAx;
39
- _localAnchorAy;
40
- _localAnchorBx;
41
- _localAnchorBy;
42
- _rAx = 0;
43
- _rAy = 0;
44
- _rBx = 0;
45
- _rBy = 0;
46
- _cx = 0;
47
- _cy = 0;
48
- _invK11 = 0;
49
- _invK12 = 0;
50
- _invK22 = 0;
51
- _angleError = 0;
52
- _effMassAngle = 0;
53
- _linear = { biasRate: 0, massScale: 1, impulseScale: 0 };
54
- _angular = { biasRate: 0, massScale: 1, impulseScale: 0 };
55
- _impulseX = 0;
56
- _impulseY = 0;
57
- _impulseAngle = 0;
58
- constructor(options) {
59
- super(options.bodyA, options.bodyB);
60
- const ax = options.anchor?.x ?? (options.bodyA.x + options.bodyB.x) / 2;
61
- const ay = options.anchor?.y ?? (options.bodyA.y + options.bodyB.y) / 2;
62
- applyInverseTransform(options.bodyA.transform, ax, ay, scratch);
63
- this._localAnchorAx = scratch.x;
64
- this._localAnchorAy = scratch.y;
65
- applyInverseTransform(options.bodyB.transform, ax, ay, scratch);
66
- this._localAnchorBx = scratch.x;
67
- this._localAnchorBy = scratch.y;
68
- this.referenceAngle = options.referenceAngle ?? options.bodyB.angle - options.bodyA.angle;
69
- this.linearHertz = options.linearHertz ?? 0;
70
- this.angularHertz = options.angularHertz ?? 0;
71
- this.dampingRatio = options.dampingRatio ?? 1;
72
- }
73
- _prepare(h) {
74
- const bodyA = this.bodyA;
75
- const bodyB = this.bodyB;
76
- this._active = this.enabled && !bodyA.isSleeping && !bodyB.isSleeping && (bodyA.invMass > 0 || bodyB.invMass > 0);
77
- if (!this._active) {
78
- return;
79
- }
80
- applyTransform(bodyA.transform, this._localAnchorAx, this._localAnchorAy, scratch);
81
- const pAx = scratch.x;
82
- const pAy = scratch.y;
83
- applyTransform(bodyB.transform, this._localAnchorBx, this._localAnchorBy, scratch);
84
- const pBx = scratch.x;
85
- const pBy = scratch.y;
86
- this._rAx = pAx - bodyA.worldCenterOfMassX;
87
- this._rAy = pAy - bodyA.worldCenterOfMassY;
88
- this._rBx = pBx - bodyB.worldCenterOfMassX;
89
- this._rBy = pBy - bodyB.worldCenterOfMassY;
90
- this._cx = pBx - pAx;
91
- this._cy = pBy - pAy;
92
- const mA = bodyA.invMass;
93
- const mB = bodyB.invMass;
94
- const iA = bodyA.invInertia;
95
- const iB = bodyB.invInertia;
96
- const k11 = mA + mB + iA * this._rAy * this._rAy + iB * this._rBy * this._rBy;
97
- const k12 = -iA * this._rAx * this._rAy - iB * this._rBx * this._rBy;
98
- const k22 = mA + mB + iA * this._rAx * this._rAx + iB * this._rBx * this._rBx;
99
- const det = k11 * k22 - k12 * k12;
100
- const invDet = det !== 0 ? 1 / det : 0;
101
- this._invK11 = invDet * k22;
102
- this._invK12 = -invDet * k12;
103
- this._invK22 = invDet * k11;
104
- this._angleError = bodyB.angle - bodyA.angle - this.referenceAngle;
105
- const kAngle = iA + iB;
106
- this._effMassAngle = kAngle > 0 ? 1 / kAngle : 0;
107
- computeSoftFactors(this.linearHertz, this.dampingRatio, h, this._linear);
108
- computeSoftFactors(this.angularHertz, this.dampingRatio, h, this._angular);
109
- }
110
- _warmStart() {
111
- if (!this._active) {
112
- return;
113
- }
114
- const bodyA = this.bodyA;
115
- const bodyB = this.bodyB;
116
- bodyA.angularVelocity -= bodyA.invInertia * this._impulseAngle;
117
- bodyB.angularVelocity += bodyB.invInertia * this._impulseAngle;
118
- this._applyLinearImpulse(this._impulseX, this._impulseY);
119
- }
120
- _solve(useBias) {
121
- if (!this._active) {
122
- return;
123
- }
124
- const bodyA = this.bodyA;
125
- const bodyB = this.bodyB;
126
- // Angular lock first.
127
- const cdotAngle = bodyB.angularVelocity - bodyA.angularVelocity;
128
- const biasAngle = useBias ? this._angular.biasRate * this._angleError : 0;
129
- const impulseAngle = -this._effMassAngle * this._angular.massScale * (cdotAngle + biasAngle) - this._angular.impulseScale * this._impulseAngle;
130
- this._impulseAngle += impulseAngle;
131
- bodyA.angularVelocity -= bodyA.invInertia * impulseAngle;
132
- bodyB.angularVelocity += bodyB.invInertia * impulseAngle;
133
- // Linear (point) lock.
134
- const cdotX = bodyB.linearVelocityX - bodyB.angularVelocity * this._rBy - (bodyA.linearVelocityX - bodyA.angularVelocity * this._rAy);
135
- const cdotY = bodyB.linearVelocityY + bodyB.angularVelocity * this._rBx - (bodyA.linearVelocityY + bodyA.angularVelocity * this._rAx);
136
- const rhsX = cdotX + (useBias ? this._linear.biasRate * this._cx : 0);
137
- const rhsY = cdotY + (useBias ? this._linear.biasRate * this._cy : 0);
138
- const solvedX = this._invK11 * rhsX + this._invK12 * rhsY;
139
- const solvedY = this._invK12 * rhsX + this._invK22 * rhsY;
140
- const impulseX = -this._linear.massScale * solvedX - this._linear.impulseScale * this._impulseX;
141
- const impulseY = -this._linear.massScale * solvedY - this._linear.impulseScale * this._impulseY;
142
- this._impulseX += impulseX;
143
- this._impulseY += impulseY;
144
- this._applyLinearImpulse(impulseX, impulseY);
145
- }
146
- _applyLinearImpulse(jx, jy) {
147
- const bodyA = this.bodyA;
148
- const bodyB = this.bodyB;
149
- bodyA.linearVelocityX -= bodyA.invMass * jx;
150
- bodyA.linearVelocityY -= bodyA.invMass * jy;
151
- bodyA.angularVelocity -= bodyA.invInertia * (this._rAx * jy - this._rAy * jx);
152
- bodyB.linearVelocityX += bodyB.invMass * jx;
153
- bodyB.linearVelocityY += bodyB.invMass * jy;
154
- bodyB.angularVelocity += bodyB.invInertia * (this._rBx * jy - this._rBy * jx);
155
- }
156
- }
27
+ * Rigidly fixes the relative position and orientation of two bodies (they move
28
+ * as one rigid body). A 2-DOF point constraint (like {@link RevoluteJoint}) plus
29
+ * a 1-DOF angular constraint, solved in the sub-step loop. Both locks default to
30
+ * rigid; set `linearHertz`/`angularHertz` for a springy weld.
31
+ */
32
+ var WeldJoint = class extends Joint {
33
+ /** Locked relative angle `angleB − angleA`. */
34
+ referenceAngle;
35
+ /** Soft frequency for the position lock (`0` = rigid). */
36
+ linearHertz;
37
+ /** Soft frequency for the angle lock (`0` = rigid). */
38
+ angularHertz;
39
+ /** Soft damping ratio. */
40
+ dampingRatio;
41
+ _localAnchorAx;
42
+ _localAnchorAy;
43
+ _localAnchorBx;
44
+ _localAnchorBy;
45
+ _rAx = 0;
46
+ _rAy = 0;
47
+ _rBx = 0;
48
+ _rBy = 0;
49
+ _cx = 0;
50
+ _cy = 0;
51
+ _invK11 = 0;
52
+ _invK12 = 0;
53
+ _invK22 = 0;
54
+ _angleError = 0;
55
+ _effMassAngle = 0;
56
+ _linear = {
57
+ biasRate: 0,
58
+ massScale: 1,
59
+ impulseScale: 0
60
+ };
61
+ _angular = {
62
+ biasRate: 0,
63
+ massScale: 1,
64
+ impulseScale: 0
65
+ };
66
+ _impulseX = 0;
67
+ _impulseY = 0;
68
+ _impulseAngle = 0;
69
+ constructor(options) {
70
+ super(options.bodyA, options.bodyB);
71
+ const ax = options.anchor?.x ?? (options.bodyA.x + options.bodyB.x) / 2;
72
+ const ay = options.anchor?.y ?? (options.bodyA.y + options.bodyB.y) / 2;
73
+ applyInverseTransform(options.bodyA.transform, ax, ay, scratch);
74
+ this._localAnchorAx = scratch.x;
75
+ this._localAnchorAy = scratch.y;
76
+ applyInverseTransform(options.bodyB.transform, ax, ay, scratch);
77
+ this._localAnchorBx = scratch.x;
78
+ this._localAnchorBy = scratch.y;
79
+ this.referenceAngle = options.referenceAngle ?? options.bodyB.angle - options.bodyA.angle;
80
+ this.linearHertz = options.linearHertz ?? 0;
81
+ this.angularHertz = options.angularHertz ?? 0;
82
+ this.dampingRatio = options.dampingRatio ?? 1;
83
+ }
84
+ _prepare(h) {
85
+ const bodyA = this.bodyA;
86
+ const bodyB = this.bodyB;
87
+ this._active = this.enabled && !bodyA.isSleeping && !bodyB.isSleeping && (bodyA.invMass > 0 || bodyB.invMass > 0);
88
+ if (!this._active) return;
89
+ applyTransform(bodyA.transform, this._localAnchorAx, this._localAnchorAy, scratch);
90
+ const pAx = scratch.x;
91
+ const pAy = scratch.y;
92
+ applyTransform(bodyB.transform, this._localAnchorBx, this._localAnchorBy, scratch);
93
+ const pBx = scratch.x;
94
+ const pBy = scratch.y;
95
+ this._rAx = pAx - bodyA.worldCenterOfMassX;
96
+ this._rAy = pAy - bodyA.worldCenterOfMassY;
97
+ this._rBx = pBx - bodyB.worldCenterOfMassX;
98
+ this._rBy = pBy - bodyB.worldCenterOfMassY;
99
+ this._cx = pBx - pAx;
100
+ this._cy = pBy - pAy;
101
+ const mA = bodyA.invMass;
102
+ const mB = bodyB.invMass;
103
+ const iA = bodyA.invInertia;
104
+ const iB = bodyB.invInertia;
105
+ const k11 = mA + mB + iA * this._rAy * this._rAy + iB * this._rBy * this._rBy;
106
+ const k12 = -iA * this._rAx * this._rAy - iB * this._rBx * this._rBy;
107
+ const k22 = mA + mB + iA * this._rAx * this._rAx + iB * this._rBx * this._rBx;
108
+ const det = k11 * k22 - k12 * k12;
109
+ const invDet = det !== 0 ? 1 / det : 0;
110
+ this._invK11 = invDet * k22;
111
+ this._invK12 = -invDet * k12;
112
+ this._invK22 = invDet * k11;
113
+ this._angleError = bodyB.angle - bodyA.angle - this.referenceAngle;
114
+ const kAngle = iA + iB;
115
+ this._effMassAngle = kAngle > 0 ? 1 / kAngle : 0;
116
+ computeSoftFactors(this.linearHertz, this.dampingRatio, h, this._linear);
117
+ computeSoftFactors(this.angularHertz, this.dampingRatio, h, this._angular);
118
+ }
119
+ _warmStart() {
120
+ if (!this._active) return;
121
+ const bodyA = this.bodyA;
122
+ const bodyB = this.bodyB;
123
+ bodyA.angularVelocity -= bodyA.invInertia * this._impulseAngle;
124
+ bodyB.angularVelocity += bodyB.invInertia * this._impulseAngle;
125
+ this._applyLinearImpulse(this._impulseX, this._impulseY);
126
+ }
127
+ _solve(useBias) {
128
+ if (!this._active) return;
129
+ const bodyA = this.bodyA;
130
+ const bodyB = this.bodyB;
131
+ const cdotAngle = bodyB.angularVelocity - bodyA.angularVelocity;
132
+ const biasAngle = useBias ? this._angular.biasRate * this._angleError : 0;
133
+ const impulseAngle = -this._effMassAngle * this._angular.massScale * (cdotAngle + biasAngle) - this._angular.impulseScale * this._impulseAngle;
134
+ this._impulseAngle += impulseAngle;
135
+ bodyA.angularVelocity -= bodyA.invInertia * impulseAngle;
136
+ bodyB.angularVelocity += bodyB.invInertia * impulseAngle;
137
+ const cdotX = bodyB.linearVelocityX - bodyB.angularVelocity * this._rBy - (bodyA.linearVelocityX - bodyA.angularVelocity * this._rAy);
138
+ const cdotY = bodyB.linearVelocityY + bodyB.angularVelocity * this._rBx - (bodyA.linearVelocityY + bodyA.angularVelocity * this._rAx);
139
+ const rhsX = cdotX + (useBias ? this._linear.biasRate * this._cx : 0);
140
+ const rhsY = cdotY + (useBias ? this._linear.biasRate * this._cy : 0);
141
+ const solvedX = this._invK11 * rhsX + this._invK12 * rhsY;
142
+ const solvedY = this._invK12 * rhsX + this._invK22 * rhsY;
143
+ const impulseX = -this._linear.massScale * solvedX - this._linear.impulseScale * this._impulseX;
144
+ const impulseY = -this._linear.massScale * solvedY - this._linear.impulseScale * this._impulseY;
145
+ this._impulseX += impulseX;
146
+ this._impulseY += impulseY;
147
+ this._applyLinearImpulse(impulseX, impulseY);
148
+ }
149
+ _applyLinearImpulse(jx, jy) {
150
+ const bodyA = this.bodyA;
151
+ const bodyB = this.bodyB;
152
+ bodyA.linearVelocityX -= bodyA.invMass * jx;
153
+ bodyA.linearVelocityY -= bodyA.invMass * jy;
154
+ bodyA.angularVelocity -= bodyA.invInertia * (this._rAx * jy - this._rAy * jx);
155
+ bodyB.linearVelocityX += bodyB.invMass * jx;
156
+ bodyB.linearVelocityY += bodyB.invMass * jy;
157
+ bodyB.angularVelocity += bodyB.invInertia * (this._rBx * jy - this._rBy * jx);
158
+ }
159
+ };
157
160
 
161
+ //#endregion
158
162
  export { WeldJoint };
159
- //# sourceMappingURL=WeldJoint.js.map
163
+ //# sourceMappingURL=WeldJoint.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WeldJoint.js","sources":["../../../../src/joints/WeldJoint.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WeldJoint.js","names":[],"sources":["../../../src/joints/WeldJoint.ts"],"sourcesContent":["import type { PointLike } from '@codexo/exojs';\n\nimport { applyInverseTransform, applyTransform } from '../math';\nimport type { PhysicsBody } from '../PhysicsBody';\nimport { Joint } from './Joint';\n\n/** Construction options for a {@link WeldJoint}. */\nexport interface WeldJointOptions {\n /** First body. */\n bodyA: PhysicsBody;\n /** Second body. */\n bodyB: PhysicsBody;\n /** World-space anchor the linear constraint acts at. Default: the midpoint of the two bodies. */\n anchor?: Readonly<PointLike>;\n /** Locked relative angle `angleB − angleA`. Default: the current relative angle at creation. */\n referenceAngle?: number;\n /** Soft frequency (Hz) for the position lock; `0` (default) is rigid. */\n linearHertz?: number;\n /** Soft frequency (Hz) for the angle lock; `0` (default) is rigid. */\n angularHertz?: number;\n /** Soft damping ratio (used when a hertz is `> 0`). Default `1`. */\n dampingRatio?: number;\n}\n\n/** Reused output sink - physics steps single-threaded, so a shared scratch is safe. */\nconst scratch: PointLike = { x: 0, y: 0 };\n\ninterface SoftFactors {\n biasRate: number;\n massScale: number;\n impulseScale: number;\n}\n\n/** Box2D-v3 soft-constraint factors at sub-step `h`, or rigid Baumgarte when `hertz === 0`. */\nconst computeSoftFactors = (hertz: number, dampingRatio: number, h: number, out: SoftFactors): void => {\n if (hertz > 0) {\n const omega = 2 * Math.PI * hertz;\n const a1 = 2 * dampingRatio + h * omega;\n const a2 = h * omega * a1;\n const a3 = 1 / (1 + a2);\n\n out.biasRate = omega / a1;\n out.massScale = a2 * a3;\n out.impulseScale = a3;\n } else {\n out.biasRate = 0.2 / h;\n out.massScale = 1;\n out.impulseScale = 0;\n }\n};\n\n/**\n * Rigidly fixes the relative position and orientation of two bodies (they move\n * as one rigid body). A 2-DOF point constraint (like {@link RevoluteJoint}) plus\n * a 1-DOF angular constraint, solved in the sub-step loop. Both locks default to\n * rigid; set `linearHertz`/`angularHertz` for a springy weld.\n */\nexport class WeldJoint extends Joint {\n /** Locked relative angle `angleB − angleA`. */\n public referenceAngle: number;\n /** Soft frequency for the position lock (`0` = rigid). */\n public linearHertz: number;\n /** Soft frequency for the angle lock (`0` = rigid). */\n public angularHertz: number;\n /** Soft damping ratio. */\n public dampingRatio: number;\n\n private readonly _localAnchorAx: number;\n private readonly _localAnchorAy: number;\n private readonly _localAnchorBx: number;\n private readonly _localAnchorBy: number;\n\n private _rAx = 0;\n private _rAy = 0;\n private _rBx = 0;\n private _rBy = 0;\n private _cx = 0;\n private _cy = 0;\n private _invK11 = 0;\n private _invK12 = 0;\n private _invK22 = 0;\n private _angleError = 0;\n private _effMassAngle = 0;\n private readonly _linear: SoftFactors = { biasRate: 0, massScale: 1, impulseScale: 0 };\n private readonly _angular: SoftFactors = { biasRate: 0, massScale: 1, impulseScale: 0 };\n private _impulseX = 0;\n private _impulseY = 0;\n private _impulseAngle = 0;\n\n public constructor(options: WeldJointOptions) {\n super(options.bodyA, options.bodyB);\n\n const ax = options.anchor?.x ?? (options.bodyA.x + options.bodyB.x) / 2;\n const ay = options.anchor?.y ?? (options.bodyA.y + options.bodyB.y) / 2;\n\n applyInverseTransform(options.bodyA.transform, ax, ay, scratch);\n this._localAnchorAx = scratch.x;\n this._localAnchorAy = scratch.y;\n applyInverseTransform(options.bodyB.transform, ax, ay, scratch);\n this._localAnchorBx = scratch.x;\n this._localAnchorBy = scratch.y;\n\n this.referenceAngle = options.referenceAngle ?? options.bodyB.angle - options.bodyA.angle;\n this.linearHertz = options.linearHertz ?? 0;\n this.angularHertz = options.angularHertz ?? 0;\n this.dampingRatio = options.dampingRatio ?? 1;\n }\n\n public override _prepare(h: number): void {\n const bodyA = this.bodyA;\n const bodyB = this.bodyB;\n\n this._active = this.enabled && !bodyA.isSleeping && !bodyB.isSleeping && (bodyA.invMass > 0 || bodyB.invMass > 0);\n\n if (!this._active) {\n return;\n }\n\n applyTransform(bodyA.transform, this._localAnchorAx, this._localAnchorAy, scratch);\n const pAx = scratch.x;\n const pAy = scratch.y;\n applyTransform(bodyB.transform, this._localAnchorBx, this._localAnchorBy, scratch);\n const pBx = scratch.x;\n const pBy = scratch.y;\n\n this._rAx = pAx - bodyA.worldCenterOfMassX;\n this._rAy = pAy - bodyA.worldCenterOfMassY;\n this._rBx = pBx - bodyB.worldCenterOfMassX;\n this._rBy = pBy - bodyB.worldCenterOfMassY;\n this._cx = pBx - pAx;\n this._cy = pBy - pAy;\n\n const mA = bodyA.invMass;\n const mB = bodyB.invMass;\n const iA = bodyA.invInertia;\n const iB = bodyB.invInertia;\n\n const k11 = mA + mB + iA * this._rAy * this._rAy + iB * this._rBy * this._rBy;\n const k12 = -iA * this._rAx * this._rAy - iB * this._rBx * this._rBy;\n const k22 = mA + mB + iA * this._rAx * this._rAx + iB * this._rBx * this._rBx;\n const det = k11 * k22 - k12 * k12;\n const invDet = det !== 0 ? 1 / det : 0;\n\n this._invK11 = invDet * k22;\n this._invK12 = -invDet * k12;\n this._invK22 = invDet * k11;\n\n this._angleError = bodyB.angle - bodyA.angle - this.referenceAngle;\n const kAngle = iA + iB;\n this._effMassAngle = kAngle > 0 ? 1 / kAngle : 0;\n\n computeSoftFactors(this.linearHertz, this.dampingRatio, h, this._linear);\n computeSoftFactors(this.angularHertz, this.dampingRatio, h, this._angular);\n }\n\n public override _warmStart(): void {\n if (!this._active) {\n return;\n }\n\n const bodyA = this.bodyA;\n const bodyB = this.bodyB;\n\n bodyA.angularVelocity -= bodyA.invInertia * this._impulseAngle;\n bodyB.angularVelocity += bodyB.invInertia * this._impulseAngle;\n this._applyLinearImpulse(this._impulseX, this._impulseY);\n }\n\n public override _solve(useBias: boolean): void {\n if (!this._active) {\n return;\n }\n\n const bodyA = this.bodyA;\n const bodyB = this.bodyB;\n\n // Angular lock first.\n const cdotAngle = bodyB.angularVelocity - bodyA.angularVelocity;\n const biasAngle = useBias ? this._angular.biasRate * this._angleError : 0;\n const impulseAngle = -this._effMassAngle * this._angular.massScale * (cdotAngle + biasAngle) - this._angular.impulseScale * this._impulseAngle;\n\n this._impulseAngle += impulseAngle;\n bodyA.angularVelocity -= bodyA.invInertia * impulseAngle;\n bodyB.angularVelocity += bodyB.invInertia * impulseAngle;\n\n // Linear (point) lock.\n const cdotX = bodyB.linearVelocityX - bodyB.angularVelocity * this._rBy - (bodyA.linearVelocityX - bodyA.angularVelocity * this._rAy);\n const cdotY = bodyB.linearVelocityY + bodyB.angularVelocity * this._rBx - (bodyA.linearVelocityY + bodyA.angularVelocity * this._rAx);\n const rhsX = cdotX + (useBias ? this._linear.biasRate * this._cx : 0);\n const rhsY = cdotY + (useBias ? this._linear.biasRate * this._cy : 0);\n const solvedX = this._invK11 * rhsX + this._invK12 * rhsY;\n const solvedY = this._invK12 * rhsX + this._invK22 * rhsY;\n const impulseX = -this._linear.massScale * solvedX - this._linear.impulseScale * this._impulseX;\n const impulseY = -this._linear.massScale * solvedY - this._linear.impulseScale * this._impulseY;\n\n this._impulseX += impulseX;\n this._impulseY += impulseY;\n this._applyLinearImpulse(impulseX, impulseY);\n }\n\n private _applyLinearImpulse(jx: number, jy: number): void {\n const bodyA = this.bodyA;\n const bodyB = this.bodyB;\n\n bodyA.linearVelocityX -= bodyA.invMass * jx;\n bodyA.linearVelocityY -= bodyA.invMass * jy;\n bodyA.angularVelocity -= bodyA.invInertia * (this._rAx * jy - this._rAy * jx);\n bodyB.linearVelocityX += bodyB.invMass * jx;\n bodyB.linearVelocityY += bodyB.invMass * jy;\n bodyB.angularVelocity += bodyB.invInertia * (this._rBx * jy - this._rBy * jx);\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
+ import type { PointLike } from '@codexo/exojs';
1
2
  import type { PhysicsBody } from '../PhysicsBody';
2
- import type { VectorLike } from '../types';
3
3
  import { Joint } from './Joint';
4
4
  /** Construction options for a {@link WheelJoint}. */
5
5
  export interface WheelJointOptions {
@@ -8,9 +8,9 @@ export interface WheelJointOptions {
8
8
  /** Second body (the wheel). */
9
9
  bodyB: PhysicsBody;
10
10
  /** Shared world-space anchor at creation (the wheel hub). */
11
- anchor: VectorLike;
11
+ anchor: Readonly<PointLike>;
12
12
  /** Suspension axis in world space at creation (normalised internally). */
13
- axis: VectorLike;
13
+ axis: Readonly<PointLike>;
14
14
  /** Suspension spring frequency in Hz (`0` makes the axis rigid). Default `0`. */
15
15
  hertz?: number;
16
16
  /** Suspension spring damping ratio. Default `1`. */
@@ -90,3 +90,4 @@ export declare class WheelJoint extends Joint {
90
90
  private _applyAxial;
91
91
  private _applyPerp;
92
92
  }
93
+ //# sourceMappingURL=WheelJoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WheelJoint.d.ts","sourceRoot":"","sources":["../../../src/joints/WheelJoint.ts"],"names":[],"mappings":"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"}