@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,217 +1,195 @@
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/RevoluteJoint.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
  /**
7
- * Pins a shared anchor point on two bodies (a hinge): the bodies may rotate
8
- * freely about the pivot but the anchor points stay coincident. Solved as a
9
- * 2-DOF point constraint (a 2×2 block) in the sub-step loop, warm-started.
10
- */
11
- class RevoluteJoint extends Joint {
12
- /** Soft-spring frequency in Hz (`0` = rigid). */
13
- hertz;
14
- /** Soft-spring damping ratio. */
15
- dampingRatio;
16
- /** When `true`, the motor drives `ωB − ωA` toward {@link motorSpeed}. */
17
- enableMotor;
18
- /** Target relative angular velocity (rad/s) for the motor. */
19
- motorSpeed;
20
- /** Maximum motor torque. */
21
- maxMotorTorque;
22
- /** When `true`, the relative angle is constrained to `[lowerAngle, upperAngle]`. */
23
- enableLimit;
24
- /** Lower relative-angle limit (radians, relative to the creation angle). */
25
- lowerAngle;
26
- /** Upper relative-angle limit (radians). */
27
- upperAngle;
28
- _localAnchorAx;
29
- _localAnchorAy;
30
- _localAnchorBx;
31
- _localAnchorBy;
32
- _rAx = 0;
33
- _rAy = 0;
34
- _rBx = 0;
35
- _rBy = 0;
36
- _cx = 0;
37
- _cy = 0;
38
- _invK11 = 0;
39
- _invK12 = 0;
40
- _invK22 = 0;
41
- _biasRate = 0;
42
- _massScale = 1;
43
- _impulseScale = 0;
44
- _impulseX = 0;
45
- _impulseY = 0;
46
- _referenceAngle;
47
- _axialMass = 0;
48
- _h = 0;
49
- _invH = 0;
50
- _motorImpulse = 0;
51
- _lowerImpulse = 0;
52
- _upperImpulse = 0;
53
- constructor(options) {
54
- super(options.bodyA, options.bodyB);
55
- applyInverseTransform(options.bodyA.transform, options.anchor.x, options.anchor.y, scratch);
56
- this._localAnchorAx = scratch.x;
57
- this._localAnchorAy = scratch.y;
58
- applyInverseTransform(options.bodyB.transform, options.anchor.x, options.anchor.y, scratch);
59
- this._localAnchorBx = scratch.x;
60
- this._localAnchorBy = scratch.y;
61
- this.hertz = options.hertz ?? 0;
62
- this.dampingRatio = options.dampingRatio ?? 1;
63
- this.enableMotor = options.enableMotor ?? false;
64
- this.motorSpeed = options.motorSpeed ?? 0;
65
- this.maxMotorTorque = options.maxMotorTorque ?? 0;
66
- this.enableLimit = options.enableLimit ?? false;
67
- this.lowerAngle = options.lowerAngle ?? 0;
68
- this.upperAngle = options.upperAngle ?? 0;
69
- this._referenceAngle = options.bodyB.angle - options.bodyA.angle;
70
- }
71
- _prepare(h) {
72
- const bodyA = this.bodyA;
73
- const bodyB = this.bodyB;
74
- this._active = this.enabled && !bodyA.isSleeping && !bodyB.isSleeping && (bodyA.invMass > 0 || bodyB.invMass > 0);
75
- if (!this._active) {
76
- return;
77
- }
78
- applyTransform(bodyA.transform, this._localAnchorAx, this._localAnchorAy, scratch);
79
- const pAx = scratch.x;
80
- const pAy = scratch.y;
81
- applyTransform(bodyB.transform, this._localAnchorBx, this._localAnchorBy, scratch);
82
- const pBx = scratch.x;
83
- const pBy = scratch.y;
84
- this._rAx = pAx - bodyA.worldCenterOfMassX;
85
- this._rAy = pAy - bodyA.worldCenterOfMassY;
86
- this._rBx = pBx - bodyB.worldCenterOfMassX;
87
- this._rBy = pBy - bodyB.worldCenterOfMassY;
88
- // Position error (the anchors should coincide).
89
- this._cx = pBx - pAx;
90
- this._cy = pBy - pAy;
91
- const mA = bodyA.invMass;
92
- const mB = bodyB.invMass;
93
- const iA = bodyA.invInertia;
94
- const iB = bodyB.invInertia;
95
- // 2×2 effective-mass matrix K and its inverse.
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
- // Angular (motor/limit) effective mass + sub-step rate.
105
- this._axialMass = iA + iB > 0 ? 1 / (iA + iB) : 0;
106
- this._h = h;
107
- this._invH = 1 / h;
108
- if (!this.enableMotor) {
109
- this._motorImpulse = 0;
110
- }
111
- if (!this.enableLimit) {
112
- this._lowerImpulse = 0;
113
- this._upperImpulse = 0;
114
- }
115
- if (this.hertz > 0) {
116
- const omega = 2 * Math.PI * this.hertz;
117
- const a1 = 2 * this.dampingRatio + h * omega;
118
- const a2 = h * omega * a1;
119
- const a3 = 1 / (1 + a2);
120
- this._biasRate = omega / a1;
121
- this._massScale = a2 * a3;
122
- this._impulseScale = a3;
123
- }
124
- else {
125
- this._biasRate = 0.2 / h;
126
- this._massScale = 1;
127
- this._impulseScale = 0;
128
- }
129
- }
130
- _warmStart() {
131
- if (!this._active) {
132
- return;
133
- }
134
- // Angular warm-start: motor + limits (lower pushes +, upper pushes −).
135
- const axial = this._motorImpulse + this._lowerImpulse - this._upperImpulse;
136
- this.bodyA.angularVelocity -= this.bodyA.invInertia * axial;
137
- this.bodyB.angularVelocity += this.bodyB.invInertia * axial;
138
- this._applyImpulse(this._impulseX, this._impulseY);
139
- }
140
- _solve(useBias) {
141
- if (!this._active) {
142
- return;
143
- }
144
- const bodyA = this.bodyA;
145
- const bodyB = this.bodyB;
146
- const iA = bodyA.invInertia;
147
- const iB = bodyB.invInertia;
148
- // Angular motor: drive ωB ωA toward motorSpeed, clamped to ±maxMotorTorque·h.
149
- if (this.enableMotor) {
150
- const cdot = bodyB.angularVelocity - bodyA.angularVelocity - this.motorSpeed;
151
- const max = this.maxMotorTorque * this._h;
152
- const old = this._motorImpulse;
153
- this._motorImpulse = Math.min(max, Math.max(-max, old - this._axialMass * cdot));
154
- const applied = this._motorImpulse - old;
155
- bodyA.angularVelocity -= iA * applied;
156
- bodyB.angularVelocity += iB * applied;
157
- }
158
- // Angle limits: one-sided constraints keeping the relative angle in [lower, upper].
159
- if (this.enableLimit) {
160
- const angle = bodyB.angle + bodyB._deltaAngle - (bodyA.angle + bodyA._deltaAngle) - this._referenceAngle;
161
- // Lower limit (angle lowerAngle): a positive impulse increases the angle.
162
- const cLower = angle - this.lowerAngle;
163
- let biasLower = 0;
164
- if (cLower > 0) {
165
- biasLower = cLower * this._invH; // speculative: allow approach, engage at the surface
166
- }
167
- else if (useBias) {
168
- biasLower = 0.2 * this._invH * cLower; // Baumgarte push-back when violated
169
- }
170
- const oldLower = this._lowerImpulse;
171
- this._lowerImpulse = Math.max(0, oldLower - this._axialMass * (bodyB.angularVelocity - bodyA.angularVelocity + biasLower));
172
- const appliedLower = this._lowerImpulse - oldLower;
173
- bodyA.angularVelocity -= iA * appliedLower;
174
- bodyB.angularVelocity += iB * appliedLower;
175
- // Upper limit (angle ≤ upperAngle): a positive impulse decreases the angle.
176
- const cUpper = this.upperAngle - angle;
177
- let biasUpper = 0;
178
- if (cUpper > 0) {
179
- biasUpper = cUpper * this._invH;
180
- }
181
- else if (useBias) {
182
- biasUpper = 0.2 * this._invH * cUpper;
183
- }
184
- const oldUpper = this._upperImpulse;
185
- this._upperImpulse = Math.max(0, oldUpper - this._axialMass * (bodyA.angularVelocity - bodyB.angularVelocity + biasUpper));
186
- const appliedUpper = this._upperImpulse - oldUpper;
187
- bodyA.angularVelocity += iA * appliedUpper;
188
- bodyB.angularVelocity -= iB * appliedUpper;
189
- }
190
- // Relative velocity of the anchors.
191
- const cdotX = bodyB.linearVelocityX - bodyB.angularVelocity * this._rBy - (bodyA.linearVelocityX - bodyA.angularVelocity * this._rAy);
192
- const cdotY = bodyB.linearVelocityY + bodyB.angularVelocity * this._rBx - (bodyA.linearVelocityY + bodyA.angularVelocity * this._rAx);
193
- const rhsX = cdotX + (useBias ? this._biasRate * this._cx : 0);
194
- const rhsY = cdotY + (useBias ? this._biasRate * this._cy : 0);
195
- // Solve K·λ = −rhs, then apply the soft mass/impulse scaling.
196
- const solvedX = this._invK11 * rhsX + this._invK12 * rhsY;
197
- const solvedY = this._invK12 * rhsX + this._invK22 * rhsY;
198
- const impulseX = -this._massScale * solvedX - this._impulseScale * this._impulseX;
199
- const impulseY = -this._massScale * solvedY - this._impulseScale * this._impulseY;
200
- this._impulseX += impulseX;
201
- this._impulseY += impulseY;
202
- this._applyImpulse(impulseX, impulseY);
203
- }
204
- _applyImpulse(jx, jy) {
205
- const bodyA = this.bodyA;
206
- const bodyB = this.bodyB;
207
- bodyA.linearVelocityX -= bodyA.invMass * jx;
208
- bodyA.linearVelocityY -= bodyA.invMass * jy;
209
- bodyA.angularVelocity -= bodyA.invInertia * (this._rAx * jy - this._rAy * jx);
210
- bodyB.linearVelocityX += bodyB.invMass * jx;
211
- bodyB.linearVelocityY += bodyB.invMass * jy;
212
- bodyB.angularVelocity += bodyB.invInertia * (this._rBx * jy - this._rBy * jx);
213
- }
214
- }
11
+ * Pins a shared anchor point on two bodies (a hinge): the bodies may rotate
12
+ * freely about the pivot but the anchor points stay coincident. Solved as a
13
+ * 2-DOF point constraint (a 2×2 block) in the sub-step loop, warm-started.
14
+ */
15
+ var RevoluteJoint = class extends Joint {
16
+ /** Soft-spring frequency in Hz (`0` = rigid). */
17
+ hertz;
18
+ /** Soft-spring damping ratio. */
19
+ dampingRatio;
20
+ /** When `true`, the motor drives `ωB − ωA` toward {@link motorSpeed}. */
21
+ enableMotor;
22
+ /** Target relative angular velocity (rad/s) for the motor. */
23
+ motorSpeed;
24
+ /** Maximum motor torque. */
25
+ maxMotorTorque;
26
+ /** When `true`, the relative angle is constrained to `[lowerAngle, upperAngle]`. */
27
+ enableLimit;
28
+ /** Lower relative-angle limit (radians, relative to the creation angle). */
29
+ lowerAngle;
30
+ /** Upper relative-angle limit (radians). */
31
+ upperAngle;
32
+ _localAnchorAx;
33
+ _localAnchorAy;
34
+ _localAnchorBx;
35
+ _localAnchorBy;
36
+ _rAx = 0;
37
+ _rAy = 0;
38
+ _rBx = 0;
39
+ _rBy = 0;
40
+ _cx = 0;
41
+ _cy = 0;
42
+ _invK11 = 0;
43
+ _invK12 = 0;
44
+ _invK22 = 0;
45
+ _biasRate = 0;
46
+ _massScale = 1;
47
+ _impulseScale = 0;
48
+ _impulseX = 0;
49
+ _impulseY = 0;
50
+ _referenceAngle;
51
+ _axialMass = 0;
52
+ _h = 0;
53
+ _invH = 0;
54
+ _motorImpulse = 0;
55
+ _lowerImpulse = 0;
56
+ _upperImpulse = 0;
57
+ constructor(options) {
58
+ super(options.bodyA, options.bodyB);
59
+ applyInverseTransform(options.bodyA.transform, options.anchor.x, options.anchor.y, scratch);
60
+ this._localAnchorAx = scratch.x;
61
+ this._localAnchorAy = scratch.y;
62
+ applyInverseTransform(options.bodyB.transform, options.anchor.x, options.anchor.y, scratch);
63
+ this._localAnchorBx = scratch.x;
64
+ this._localAnchorBy = scratch.y;
65
+ this.hertz = options.hertz ?? 0;
66
+ this.dampingRatio = options.dampingRatio ?? 1;
67
+ this.enableMotor = options.enableMotor ?? false;
68
+ this.motorSpeed = options.motorSpeed ?? 0;
69
+ this.maxMotorTorque = options.maxMotorTorque ?? 0;
70
+ this.enableLimit = options.enableLimit ?? false;
71
+ this.lowerAngle = options.lowerAngle ?? 0;
72
+ this.upperAngle = options.upperAngle ?? 0;
73
+ this._referenceAngle = options.bodyB.angle - options.bodyA.angle;
74
+ }
75
+ _prepare(h) {
76
+ const bodyA = this.bodyA;
77
+ const bodyB = this.bodyB;
78
+ this._active = this.enabled && !bodyA.isSleeping && !bodyB.isSleeping && (bodyA.invMass > 0 || bodyB.invMass > 0);
79
+ if (!this._active) return;
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._axialMass = iA + iB > 0 ? 1 / (iA + iB) : 0;
105
+ this._h = h;
106
+ this._invH = 1 / h;
107
+ if (!this.enableMotor) this._motorImpulse = 0;
108
+ if (!this.enableLimit) {
109
+ this._lowerImpulse = 0;
110
+ this._upperImpulse = 0;
111
+ }
112
+ if (this.hertz > 0) {
113
+ const omega = 2 * Math.PI * this.hertz;
114
+ const a1 = 2 * this.dampingRatio + h * omega;
115
+ const a2 = h * omega * a1;
116
+ const a3 = 1 / (1 + a2);
117
+ this._biasRate = omega / a1;
118
+ this._massScale = a2 * a3;
119
+ this._impulseScale = a3;
120
+ } else {
121
+ this._biasRate = .2 / h;
122
+ this._massScale = 1;
123
+ this._impulseScale = 0;
124
+ }
125
+ }
126
+ _warmStart() {
127
+ if (!this._active) return;
128
+ const axial = this._motorImpulse + this._lowerImpulse - this._upperImpulse;
129
+ this.bodyA.angularVelocity -= this.bodyA.invInertia * axial;
130
+ this.bodyB.angularVelocity += this.bodyB.invInertia * axial;
131
+ this._applyImpulse(this._impulseX, this._impulseY);
132
+ }
133
+ _solve(useBias) {
134
+ if (!this._active) return;
135
+ const bodyA = this.bodyA;
136
+ const bodyB = this.bodyB;
137
+ const iA = bodyA.invInertia;
138
+ const iB = bodyB.invInertia;
139
+ if (this.enableMotor) {
140
+ const cdot = bodyB.angularVelocity - bodyA.angularVelocity - this.motorSpeed;
141
+ const max = this.maxMotorTorque * this._h;
142
+ const old = this._motorImpulse;
143
+ this._motorImpulse = Math.min(max, Math.max(-max, old - this._axialMass * cdot));
144
+ const applied = this._motorImpulse - old;
145
+ bodyA.angularVelocity -= iA * applied;
146
+ bodyB.angularVelocity += iB * applied;
147
+ }
148
+ if (this.enableLimit) {
149
+ const angle = bodyB.angle + bodyB._deltaAngle - (bodyA.angle + bodyA._deltaAngle) - this._referenceAngle;
150
+ const cLower = angle - this.lowerAngle;
151
+ let biasLower = 0;
152
+ if (cLower > 0) biasLower = cLower * this._invH;
153
+ else if (useBias) biasLower = .2 * this._invH * cLower;
154
+ const oldLower = this._lowerImpulse;
155
+ this._lowerImpulse = Math.max(0, oldLower - this._axialMass * (bodyB.angularVelocity - bodyA.angularVelocity + biasLower));
156
+ const appliedLower = this._lowerImpulse - oldLower;
157
+ bodyA.angularVelocity -= iA * appliedLower;
158
+ bodyB.angularVelocity += iB * appliedLower;
159
+ const cUpper = this.upperAngle - angle;
160
+ let biasUpper = 0;
161
+ if (cUpper > 0) biasUpper = cUpper * this._invH;
162
+ else if (useBias) biasUpper = .2 * this._invH * cUpper;
163
+ const oldUpper = this._upperImpulse;
164
+ this._upperImpulse = Math.max(0, oldUpper - this._axialMass * (bodyA.angularVelocity - bodyB.angularVelocity + biasUpper));
165
+ const appliedUpper = this._upperImpulse - oldUpper;
166
+ bodyA.angularVelocity += iA * appliedUpper;
167
+ bodyB.angularVelocity -= iB * appliedUpper;
168
+ }
169
+ const cdotX = bodyB.linearVelocityX - bodyB.angularVelocity * this._rBy - (bodyA.linearVelocityX - bodyA.angularVelocity * this._rAy);
170
+ const cdotY = bodyB.linearVelocityY + bodyB.angularVelocity * this._rBx - (bodyA.linearVelocityY + bodyA.angularVelocity * this._rAx);
171
+ const rhsX = cdotX + (useBias ? this._biasRate * this._cx : 0);
172
+ const rhsY = cdotY + (useBias ? this._biasRate * this._cy : 0);
173
+ const solvedX = this._invK11 * rhsX + this._invK12 * rhsY;
174
+ const solvedY = this._invK12 * rhsX + this._invK22 * rhsY;
175
+ const impulseX = -this._massScale * solvedX - this._impulseScale * this._impulseX;
176
+ const impulseY = -this._massScale * solvedY - this._impulseScale * this._impulseY;
177
+ this._impulseX += impulseX;
178
+ this._impulseY += impulseY;
179
+ this._applyImpulse(impulseX, impulseY);
180
+ }
181
+ _applyImpulse(jx, jy) {
182
+ const bodyA = this.bodyA;
183
+ const bodyB = this.bodyB;
184
+ bodyA.linearVelocityX -= bodyA.invMass * jx;
185
+ bodyA.linearVelocityY -= bodyA.invMass * jy;
186
+ bodyA.angularVelocity -= bodyA.invInertia * (this._rAx * jy - this._rAy * jx);
187
+ bodyB.linearVelocityX += bodyB.invMass * jx;
188
+ bodyB.linearVelocityY += bodyB.invMass * jy;
189
+ bodyB.angularVelocity += bodyB.invInertia * (this._rBx * jy - this._rBy * jx);
190
+ }
191
+ };
215
192
 
193
+ //#endregion
216
194
  export { RevoluteJoint };
217
- //# sourceMappingURL=RevoluteJoint.js.map
195
+ //# sourceMappingURL=RevoluteJoint.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RevoluteJoint.js","sources":["../../../../src/joints/RevoluteJoint.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RevoluteJoint.js","names":[],"sources":["../../../src/joints/RevoluteJoint.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 RevoluteJoint}. */\nexport interface RevoluteJointOptions {\n /** First body (often a static anchor). */\n bodyA: PhysicsBody;\n /** Second body. */\n bodyB: PhysicsBody;\n /** Shared world-space pivot point at creation. The two bodies are pinned here and may rotate freely about it. */\n anchor: Readonly<PointLike>;\n /** Soft-spring frequency in Hz; `0` (default) makes it a rigid pin. */\n hertz?: number;\n /** Soft-spring damping ratio (used when `hertz > 0`). Default `1`. */\n dampingRatio?: number;\n /** Enable the angular motor (drives `ωB − ωA` toward {@link motorSpeed}). Default `false`. */\n enableMotor?: boolean;\n /** Target relative angular velocity in rad/s when the motor is enabled. Default `0`. */\n motorSpeed?: number;\n /** Maximum motor torque - clamps the per-step motor impulse. Default `0`. */\n maxMotorTorque?: number;\n /** Enable the angle limit (keeps the relative angle in `[lowerAngle, upperAngle]`). Default `false`. */\n enableLimit?: boolean;\n /** Lower relative-angle limit in radians (relative to the angle at creation). Default `0`. */\n lowerAngle?: number;\n /** Upper relative-angle limit in radians. Default `0`. */\n upperAngle?: 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\n/**\n * Pins a shared anchor point on two bodies (a hinge): the bodies may rotate\n * freely about the pivot but the anchor points stay coincident. Solved as a\n * 2-DOF point constraint (a 2×2 block) in the sub-step loop, warm-started.\n */\nexport class RevoluteJoint extends Joint {\n /** Soft-spring frequency in Hz (`0` = rigid). */\n public hertz: number;\n /** Soft-spring damping ratio. */\n public dampingRatio: number;\n /** When `true`, the motor drives `ωB − ωA` toward {@link motorSpeed}. */\n public enableMotor: boolean;\n /** Target relative angular velocity (rad/s) for the motor. */\n public motorSpeed: number;\n /** Maximum motor torque. */\n public maxMotorTorque: number;\n /** When `true`, the relative angle is constrained to `[lowerAngle, upperAngle]`. */\n public enableLimit: boolean;\n /** Lower relative-angle limit (radians, relative to the creation angle). */\n public lowerAngle: number;\n /** Upper relative-angle limit (radians). */\n public upperAngle: 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 _biasRate = 0;\n private _massScale = 1;\n private _impulseScale = 0;\n private _impulseX = 0;\n private _impulseY = 0;\n private readonly _referenceAngle: number;\n private _axialMass = 0;\n private _h = 0;\n private _invH = 0;\n private _motorImpulse = 0;\n private _lowerImpulse = 0;\n private _upperImpulse = 0;\n\n public constructor(options: RevoluteJointOptions) {\n super(options.bodyA, options.bodyB);\n\n applyInverseTransform(options.bodyA.transform, options.anchor.x, options.anchor.y, scratch);\n this._localAnchorAx = scratch.x;\n this._localAnchorAy = scratch.y;\n applyInverseTransform(options.bodyB.transform, options.anchor.x, options.anchor.y, scratch);\n this._localAnchorBx = scratch.x;\n this._localAnchorBy = scratch.y;\n\n this.hertz = options.hertz ?? 0;\n this.dampingRatio = options.dampingRatio ?? 1;\n this.enableMotor = options.enableMotor ?? false;\n this.motorSpeed = options.motorSpeed ?? 0;\n this.maxMotorTorque = options.maxMotorTorque ?? 0;\n this.enableLimit = options.enableLimit ?? false;\n this.lowerAngle = options.lowerAngle ?? 0;\n this.upperAngle = options.upperAngle ?? 0;\n this._referenceAngle = options.bodyB.angle - options.bodyA.angle;\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\n // Position error (the anchors should coincide).\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 // 2×2 effective-mass matrix K and its inverse.\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 // Angular (motor/limit) effective mass + sub-step rate.\n this._axialMass = iA + iB > 0 ? 1 / (iA + iB) : 0;\n this._h = h;\n this._invH = 1 / h;\n\n if (!this.enableMotor) {\n this._motorImpulse = 0;\n }\n\n if (!this.enableLimit) {\n this._lowerImpulse = 0;\n this._upperImpulse = 0;\n }\n\n if (this.hertz > 0) {\n const omega = 2 * Math.PI * this.hertz;\n const a1 = 2 * this.dampingRatio + h * omega;\n const a2 = h * omega * a1;\n const a3 = 1 / (1 + a2);\n\n this._biasRate = omega / a1;\n this._massScale = a2 * a3;\n this._impulseScale = a3;\n } else {\n this._biasRate = 0.2 / h;\n this._massScale = 1;\n this._impulseScale = 0;\n }\n }\n\n public override _warmStart(): void {\n if (!this._active) {\n return;\n }\n\n // Angular warm-start: motor + limits (lower pushes +, upper pushes −).\n const axial = this._motorImpulse + this._lowerImpulse - this._upperImpulse;\n this.bodyA.angularVelocity -= this.bodyA.invInertia * axial;\n this.bodyB.angularVelocity += this.bodyB.invInertia * axial;\n\n this._applyImpulse(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 const iA = bodyA.invInertia;\n const iB = bodyB.invInertia;\n\n // Angular motor: drive ωB − ωA toward motorSpeed, clamped to ±maxMotorTorque·h.\n if (this.enableMotor) {\n const cdot = bodyB.angularVelocity - bodyA.angularVelocity - this.motorSpeed;\n const max = this.maxMotorTorque * this._h;\n const old = this._motorImpulse;\n\n this._motorImpulse = Math.min(max, Math.max(-max, old - this._axialMass * cdot));\n\n const applied = this._motorImpulse - old;\n bodyA.angularVelocity -= iA * applied;\n bodyB.angularVelocity += iB * applied;\n }\n\n // Angle limits: one-sided constraints keeping the relative angle in [lower, upper].\n if (this.enableLimit) {\n const angle = bodyB.angle + bodyB._deltaAngle - (bodyA.angle + bodyA._deltaAngle) - this._referenceAngle;\n\n // Lower limit (angle ≥ lowerAngle): a positive impulse increases the angle.\n const cLower = angle - this.lowerAngle;\n let biasLower = 0;\n\n if (cLower > 0) {\n biasLower = cLower * this._invH; // speculative: allow approach, engage at the surface\n } else if (useBias) {\n biasLower = 0.2 * this._invH * cLower; // Baumgarte push-back when violated\n }\n\n const oldLower = this._lowerImpulse;\n this._lowerImpulse = Math.max(0, oldLower - this._axialMass * (bodyB.angularVelocity - bodyA.angularVelocity + biasLower));\n\n const appliedLower = this._lowerImpulse - oldLower;\n bodyA.angularVelocity -= iA * appliedLower;\n bodyB.angularVelocity += iB * appliedLower;\n\n // Upper limit (angle ≤ upperAngle): a positive impulse decreases the angle.\n const cUpper = this.upperAngle - angle;\n let biasUpper = 0;\n\n if (cUpper > 0) {\n biasUpper = cUpper * this._invH;\n } else if (useBias) {\n biasUpper = 0.2 * this._invH * cUpper;\n }\n\n const oldUpper = this._upperImpulse;\n this._upperImpulse = Math.max(0, oldUpper - this._axialMass * (bodyA.angularVelocity - bodyB.angularVelocity + biasUpper));\n\n const appliedUpper = this._upperImpulse - oldUpper;\n bodyA.angularVelocity += iA * appliedUpper;\n bodyB.angularVelocity -= iB * appliedUpper;\n }\n\n // Relative velocity of the anchors.\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\n const rhsX = cdotX + (useBias ? this._biasRate * this._cx : 0);\n const rhsY = cdotY + (useBias ? this._biasRate * this._cy : 0);\n\n // Solve K·λ = −rhs, then apply the soft mass/impulse scaling.\n const solvedX = this._invK11 * rhsX + this._invK12 * rhsY;\n const solvedY = this._invK12 * rhsX + this._invK22 * rhsY;\n const impulseX = -this._massScale * solvedX - this._impulseScale * this._impulseX;\n const impulseY = -this._massScale * solvedY - this._impulseScale * this._impulseY;\n\n this._impulseX += impulseX;\n this._impulseY += impulseY;\n this._applyImpulse(impulseX, impulseY);\n }\n\n private _applyImpulse(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 WeldJoint}. */
5
5
  export interface WeldJointOptions {
@@ -8,7 +8,7 @@ export interface WeldJointOptions {
8
8
  /** Second body. */
9
9
  bodyB: PhysicsBody;
10
10
  /** World-space anchor the linear constraint acts at. Default: the midpoint of the two bodies. */
11
- anchor?: VectorLike;
11
+ anchor?: Readonly<PointLike>;
12
12
  /** Locked relative angle `angleB − angleA`. Default: the current relative angle at creation. */
13
13
  referenceAngle?: number;
14
14
  /** Soft frequency (Hz) for the position lock; `0` (default) is rigid. */
@@ -59,3 +59,4 @@ export declare class WeldJoint extends Joint {
59
59
  _solve(useBias: boolean): void;
60
60
  private _applyLinearImpulse;
61
61
  }
62
+ //# sourceMappingURL=WeldJoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WeldJoint.d.ts","sourceRoot":"","sources":["../../../src/joints/WeldJoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,oDAAoD;AACpD,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB;IAClB,KAAK,EAAE,WAAW,CAAC;IACnB,mBAAmB;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,iGAAiG;IACjG,MAAM,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC7B,gGAAgG;IAChG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA6BD;;;;;GAKG;AACH,qBAAa,SAAU,SAAQ,KAAK;IAClC,+CAA+C;IACxC,cAAc,EAAE,MAAM,CAAC;IAC9B,0DAA0D;IACnD,WAAW,EAAE,MAAM,CAAC;IAC3B,uDAAuD;IAChD,YAAY,EAAE,MAAM,CAAC;IAC5B,0BAA0B;IACnB,YAAY,EAAE,MAAM,CAAC;IAE5B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+D;IACvF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+D;IACxF,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,aAAa,CAAK;gBAEP,OAAO,EAAE,gBAAgB;IAmB5B,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IA+CzB,UAAU,IAAI,IAAI;IAalB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAgC9C,OAAO,CAAC,mBAAmB;CAW5B"}