@certe/atmos-physics 0.1.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 (60) hide show
  1. package/LICENCE +674 -0
  2. package/README.md +152 -0
  3. package/dist/collider-offset.d.ts +19 -0
  4. package/dist/collider-offset.d.ts.map +1 -0
  5. package/dist/collider-offset.js +33 -0
  6. package/dist/collider-offset.js.map +1 -0
  7. package/dist/collider.d.ts +75 -0
  8. package/dist/collider.d.ts.map +1 -0
  9. package/dist/collider.js +223 -0
  10. package/dist/collider.js.map +1 -0
  11. package/dist/fixed-joint.d.ts +8 -0
  12. package/dist/fixed-joint.d.ts.map +1 -0
  13. package/dist/fixed-joint.js +10 -0
  14. package/dist/fixed-joint.js.map +1 -0
  15. package/dist/hinge-joint.d.ts +78 -0
  16. package/dist/hinge-joint.d.ts.map +1 -0
  17. package/dist/hinge-joint.js +271 -0
  18. package/dist/hinge-joint.js.map +1 -0
  19. package/dist/index.d.ts +23 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +14 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/init.d.ts +8 -0
  24. package/dist/init.d.ts.map +1 -0
  25. package/dist/init.js +98 -0
  26. package/dist/init.js.map +1 -0
  27. package/dist/joint.d.ts +52 -0
  28. package/dist/joint.d.ts.map +1 -0
  29. package/dist/joint.js +143 -0
  30. package/dist/joint.js.map +1 -0
  31. package/dist/physics-hierarchy.d.ts +8 -0
  32. package/dist/physics-hierarchy.d.ts.map +1 -0
  33. package/dist/physics-hierarchy.js +32 -0
  34. package/dist/physics-hierarchy.js.map +1 -0
  35. package/dist/physics-query.d.ts +30 -0
  36. package/dist/physics-query.d.ts.map +1 -0
  37. package/dist/physics-query.js +139 -0
  38. package/dist/physics-query.js.map +1 -0
  39. package/dist/physics-system.d.ts +17 -0
  40. package/dist/physics-system.d.ts.map +1 -0
  41. package/dist/physics-system.js +133 -0
  42. package/dist/physics-system.js.map +1 -0
  43. package/dist/physics-world.d.ts +33 -0
  44. package/dist/physics-world.d.ts.map +1 -0
  45. package/dist/physics-world.js +65 -0
  46. package/dist/physics-world.js.map +1 -0
  47. package/dist/register-builtins.d.ts +2 -0
  48. package/dist/register-builtins.d.ts.map +1 -0
  49. package/dist/register-builtins.js +84 -0
  50. package/dist/register-builtins.js.map +1 -0
  51. package/dist/rigid-body.d.ts +42 -0
  52. package/dist/rigid-body.d.ts.map +1 -0
  53. package/dist/rigid-body.js +189 -0
  54. package/dist/rigid-body.js.map +1 -0
  55. package/dist/spring-joint.d.ts +23 -0
  56. package/dist/spring-joint.d.ts.map +1 -0
  57. package/dist/spring-joint.js +26 -0
  58. package/dist/spring-joint.js.map +1 -0
  59. package/package.json +29 -0
  60. package/src/index.ts +26 -0
@@ -0,0 +1,271 @@
1
+ import RAPIER from '@dimforge/rapier3d-compat';
2
+ import { Vec3 } from '@certe/atmos-math';
3
+ import { Joint } from './joint.js';
4
+ import { getWasmMemory, getLockedAxesOffset } from './init.js';
5
+ /**
6
+ * Compute a quaternion that rotates the X-axis [1,0,0] to the given unit axis.
7
+ * Rapier revolute joints use the X-axis of the frame as the rotation axis.
8
+ */
9
+ function axisToFrame(ax, ay, az) {
10
+ // dot = [1,0,0] · axis = ax
11
+ const dot = ax;
12
+ if (dot > 0.999999)
13
+ return { x: 0, y: 0, z: 0, w: 1 };
14
+ if (dot < -0.999999)
15
+ return { x: 0, y: 0, z: 1, w: 0 }; // 180° around Z
16
+ // cross = [1,0,0] × [ax,ay,az] = [0, -az, ay]
17
+ const cx = 0, cy = -az, cz = ay;
18
+ const w = 1 + dot;
19
+ const len = Math.sqrt(cx * cx + cy * cy + cz * cz + w * w);
20
+ return { x: cx / len, y: cy / len, z: cz / len, w: w / len };
21
+ }
22
+ export class HingeJoint extends Joint {
23
+ _axis = Vec3.fromValues(0, 1, 0);
24
+ _connectedAxisVec = Vec3.fromValues(0, 1, 0);
25
+ _autoConfigureConnectedAxis = true;
26
+ // Limits — setters sync to live Rapier joint
27
+ _limitsEnabled = false;
28
+ _limitMin = -Math.PI;
29
+ _limitMax = Math.PI;
30
+ // Motor
31
+ _motorEnabled = false;
32
+ _motorMode = 'velocity';
33
+ _motorTargetVelocity = 0;
34
+ _motorMaxForce = 0;
35
+ _motorTargetPosition = 0;
36
+ _motorStiffness = 0;
37
+ _motorDamping = 0;
38
+ /** Current joint angle in radians. Computed from body orientations and joint frames. */
39
+ get angle() {
40
+ if (!this.joint)
41
+ return 0;
42
+ const f1 = this.joint.frameX1();
43
+ const f2 = this.joint.frameX2();
44
+ const r1 = this.joint.body1().rotation();
45
+ const r2 = this.joint.body2().rotation();
46
+ // a = r1 * f1 (quat multiply)
47
+ const ax = r1.w * f1.x + r1.x * f1.w + r1.y * f1.z - r1.z * f1.y;
48
+ const aw = r1.w * f1.w - r1.x * f1.x - r1.y * f1.y - r1.z * f1.z;
49
+ const ay = r1.w * f1.y - r1.x * f1.z + r1.y * f1.w + r1.z * f1.x;
50
+ const az = r1.w * f1.z + r1.x * f1.y - r1.y * f1.x + r1.z * f1.w;
51
+ // b = r2 * f2
52
+ const bx = r2.w * f2.x + r2.x * f2.w + r2.y * f2.z - r2.z * f2.y;
53
+ const bw = r2.w * f2.w - r2.x * f2.x - r2.y * f2.y - r2.z * f2.z;
54
+ const by = r2.w * f2.y - r2.x * f2.z + r2.y * f2.w + r2.z * f2.x;
55
+ const bz = r2.w * f2.z + r2.x * f2.y - r2.y * f2.x + r2.z * f2.w;
56
+ // q = conj(a) * b — Rapier measures body2 relative to body1
57
+ const qx = aw * bx - ax * bw - ay * bz + az * by;
58
+ const qw = aw * bw + ax * bx + ay * by + az * bz;
59
+ return 2 * Math.atan2(qx, qw);
60
+ }
61
+ // --- Axis accessors (require joint recreation) --- //
62
+ get axis() { return this._axis; }
63
+ set axis(v) {
64
+ Vec3.copy(this._axis, v);
65
+ if (this.joint)
66
+ this._recreateJoint();
67
+ }
68
+ get connectedAxis() { return this._connectedAxisVec; }
69
+ set connectedAxis(v) {
70
+ Vec3.copy(this._connectedAxisVec, v);
71
+ if (this.joint)
72
+ this._recreateJoint();
73
+ }
74
+ get autoConfigureConnectedAxis() { return this._autoConfigureConnectedAxis; }
75
+ set autoConfigureConnectedAxis(v) {
76
+ this._autoConfigureConnectedAxis = v;
77
+ if (v && this.joint)
78
+ this._recreateJoint();
79
+ }
80
+ // --- Limit accessors (sync to live joint) --- //
81
+ get limitsEnabled() { return this._limitsEnabled; }
82
+ set limitsEnabled(v) { this._limitsEnabled = v; this._applyLimits(); }
83
+ get limitMin() { return this._limitMin; }
84
+ set limitMin(v) { this._limitMin = v; this._applyLimits(); }
85
+ get limitMax() { return this._limitMax; }
86
+ set limitMax(v) { this._limitMax = v; this._applyLimits(); }
87
+ // --- Motor accessors (sync to live joint) --- //
88
+ get motorEnabled() { return this._motorEnabled; }
89
+ set motorEnabled(v) {
90
+ const wasEnabled = this._motorEnabled;
91
+ this._motorEnabled = v;
92
+ if (v) {
93
+ this._applyMotor();
94
+ }
95
+ else if (wasEnabled && this.joint) {
96
+ // Calling configureMotorVelocity(0,0) still activates the motor solver and brakes
97
+ // the joint. The only way to truly disable the motor is to recreate the joint.
98
+ this._recreateJoint();
99
+ }
100
+ }
101
+ get motorMode() { return this._motorMode; }
102
+ set motorMode(v) { this._motorMode = v; this._applyMotor(); }
103
+ get motorTargetVelocity() { return this._motorTargetVelocity; }
104
+ set motorTargetVelocity(v) { this._motorTargetVelocity = v; this._applyMotor(); }
105
+ get motorMaxForce() { return this._motorMaxForce; }
106
+ set motorMaxForce(v) { this._motorMaxForce = v; this._applyMotor(); }
107
+ get motorTargetPosition() { return this._motorTargetPosition; }
108
+ set motorTargetPosition(v) { this._motorTargetPosition = v; this._applyMotor(); }
109
+ get motorStiffness() { return this._motorStiffness; }
110
+ set motorStiffness(v) { this._motorStiffness = v; this._applyMotor(); }
111
+ get motorDamping() { return this._motorDamping; }
112
+ set motorDamping(v) { this._motorDamping = v; this._applyMotor(); }
113
+ init(world, options) {
114
+ if (options?.axis)
115
+ this._setVec3(this._axis, options.axis);
116
+ if (options?.connectedAxis) {
117
+ this._setVec3(this._connectedAxisVec, options.connectedAxis);
118
+ this._autoConfigureConnectedAxis = false;
119
+ }
120
+ else if (options?.axis && !this._autoConfigureConnectedAxis) {
121
+ this._setVec3(this._connectedAxisVec, options.axis);
122
+ }
123
+ if (options?.autoConfigureConnectedAxis !== undefined) {
124
+ this._autoConfigureConnectedAxis = options.autoConfigureConnectedAxis;
125
+ }
126
+ if (options?.limitsEnabled !== undefined)
127
+ this._limitsEnabled = options.limitsEnabled;
128
+ if (options?.limitMin !== undefined)
129
+ this._limitMin = options.limitMin;
130
+ if (options?.limitMax !== undefined)
131
+ this._limitMax = options.limitMax;
132
+ if (options?.motorEnabled !== undefined)
133
+ this._motorEnabled = options.motorEnabled;
134
+ if (options?.motorMode !== undefined)
135
+ this._motorMode = options.motorMode;
136
+ if (options?.motorTargetVelocity !== undefined)
137
+ this._motorTargetVelocity = options.motorTargetVelocity;
138
+ if (options?.motorMaxForce !== undefined)
139
+ this._motorMaxForce = options.motorMaxForce;
140
+ if (options?.motorTargetPosition !== undefined)
141
+ this._motorTargetPosition = options.motorTargetPosition;
142
+ if (options?.motorStiffness !== undefined)
143
+ this._motorStiffness = options.motorStiffness;
144
+ if (options?.motorDamping !== undefined)
145
+ this._motorDamping = options.motorDamping;
146
+ super.init(world, options);
147
+ }
148
+ refreshAutoConfig() {
149
+ super.refreshAutoConfig();
150
+ if (this._autoConfigureConnectedAxis) {
151
+ this._computeConnectedAxis();
152
+ }
153
+ }
154
+ _tryCreateJoint() {
155
+ if (this._autoConfigureConnectedAxis) {
156
+ this._computeConnectedAxis();
157
+ }
158
+ super._tryCreateJoint();
159
+ // The joint was created via JointData.fixed() + WASM locked_axes patch.
160
+ // createImpulseJoint returns FixedImpulseJoint (based on JS-side type dispatch),
161
+ // but the underlying WASM joint is revolute. Swap the prototype so setLimits/
162
+ // configureMotor (on UnitImpulseJoint) and rawAxis() (on RevoluteImpulseJoint)
163
+ // are available.
164
+ if (this.joint) {
165
+ Object.setPrototypeOf(this.joint, RAPIER.RevoluteImpulseJoint.prototype);
166
+ }
167
+ this._applyLimits();
168
+ this._applyMotor();
169
+ }
170
+ _computeConnectedAxis() {
171
+ if (!this._connectedObject)
172
+ return;
173
+ const thisTransform = this.gameObject.transform;
174
+ const otherTransform = this._connectedObject.transform;
175
+ thisTransform.updateWorldMatrix();
176
+ otherTransform.updateWorldMatrix();
177
+ const ax = this._axis[0], ay = this._axis[1], az = this._axis[2];
178
+ // Extract rotation columns from body A (normalize to remove scale)
179
+ const m = thisTransform.worldMatrix;
180
+ const sAx = Math.sqrt(m[0] * m[0] + m[1] * m[1] + m[2] * m[2]) || 1;
181
+ const sAy = Math.sqrt(m[4] * m[4] + m[5] * m[5] + m[6] * m[6]) || 1;
182
+ const sAz = Math.sqrt(m[8] * m[8] + m[9] * m[9] + m[10] * m[10]) || 1;
183
+ // Transform axis direction: local A → world (rotation only, no scale)
184
+ const wx = (m[0] / sAx) * ax + (m[4] / sAy) * ay + (m[8] / sAz) * az;
185
+ const wy = (m[1] / sAx) * ax + (m[5] / sAy) * ay + (m[9] / sAz) * az;
186
+ const wz = (m[2] / sAx) * ax + (m[6] / sAy) * ay + (m[10] / sAz) * az;
187
+ // Extract rotation columns from body B (normalize to remove scale)
188
+ const n = otherTransform.worldMatrix;
189
+ const sBx = Math.sqrt(n[0] * n[0] + n[1] * n[1] + n[2] * n[2]) || 1;
190
+ const sBy = Math.sqrt(n[4] * n[4] + n[5] * n[5] + n[6] * n[6]) || 1;
191
+ const sBz = Math.sqrt(n[8] * n[8] + n[9] * n[9] + n[10] * n[10]) || 1;
192
+ // Transform world direction → local B using rotation transpose (no scale)
193
+ const lx = (n[0] / sBx) * wx + (n[1] / sBx) * wy + (n[2] / sBx) * wz;
194
+ const ly = (n[4] / sBy) * wx + (n[5] / sBy) * wy + (n[6] / sBy) * wz;
195
+ const lz = (n[8] / sBz) * wx + (n[9] / sBz) * wy + (n[10] / sBz) * wz;
196
+ // Normalize
197
+ const len = Math.sqrt(lx * lx + ly * ly + lz * lz);
198
+ if (len > 1e-6) {
199
+ Vec3.set(this._connectedAxisVec, lx / len, ly / len, lz / len);
200
+ }
201
+ }
202
+ _setVec3(target, src) {
203
+ if (src instanceof Float32Array) {
204
+ Vec3.copy(target, src);
205
+ }
206
+ else {
207
+ Vec3.set(target, src.x, src.y, src.z);
208
+ }
209
+ }
210
+ _applyLimits() {
211
+ if (!this.joint)
212
+ return;
213
+ const revolute = this.joint;
214
+ if (this._limitsEnabled) {
215
+ revolute.setLimits(this._limitMin, this._limitMax);
216
+ }
217
+ else {
218
+ // Disable limits by setting full-range
219
+ revolute.setLimits(-Math.PI, Math.PI);
220
+ }
221
+ }
222
+ _applyMotor() {
223
+ if (!this.joint || !this._motorEnabled)
224
+ return;
225
+ const revolute = this.joint;
226
+ if (this._motorMode === 'velocity') {
227
+ revolute.configureMotorVelocity(this._motorTargetVelocity, this._motorMaxForce);
228
+ }
229
+ else {
230
+ revolute.configureMotorPosition(this._motorTargetPosition, this._motorStiffness, this._motorDamping);
231
+ }
232
+ }
233
+ _createJointData() {
234
+ // Normalize axes — Rapier rejects zero-length vectors
235
+ const ax = this._axis[0], ay = this._axis[1], az = this._axis[2];
236
+ const axisLen = Math.sqrt(ax * ax + ay * ay + az * az);
237
+ if (axisLen < 1e-6) {
238
+ throw new Error('HingeJoint axis is zero-length');
239
+ }
240
+ const nax = ax / axisLen, nay = ay / axisLen, naz = az / axisLen;
241
+ const cax = this._connectedAxisVec[0], cay = this._connectedAxisVec[1], caz = this._connectedAxisVec[2];
242
+ const caxisLen = Math.sqrt(cax * cax + cay * cay + caz * caz);
243
+ if (caxisLen < 1e-6) {
244
+ throw new Error('HingeJoint connectedAxis is zero-length');
245
+ }
246
+ const ncax = cax / caxisLen, ncay = cay / caxisLen, ncaz = caz / caxisLen;
247
+ const frame1 = axisToFrame(nax, nay, naz);
248
+ const frame2 = axisToFrame(ncax, ncay, ncaz);
249
+ // Rapier 0.14's JS bindings ignore frame1/frame2 for revolute joints in intoRaw().
250
+ // Workaround: create as a Fixed joint (which does support per-body frames),
251
+ // then patch the locked_axes byte in WASM memory from Fixed (0x3F) to Revolute (0x37).
252
+ const data = RAPIER.JointData.fixed(this._toXYZ(this.anchor), frame1, this._toXYZ(this.connectedAnchor), frame2);
253
+ const mem = getWasmMemory();
254
+ const offset = getLockedAxesOffset();
255
+ if (mem && offset >= 0) {
256
+ const origIntoRaw = data.intoRaw.bind(data);
257
+ data.intoRaw = () => {
258
+ const raw = origIntoRaw();
259
+ if (raw) {
260
+ const ptr = raw.__wbg_ptr;
261
+ const bytes = new Uint8Array(mem.buffer);
262
+ bytes[ptr + offset] = 0x37; // Revolute: all DOFs locked except AngX
263
+ }
264
+ return raw;
265
+ };
266
+ }
267
+ // Limits and motor are applied after creation via _applyLimits() / _applyMotor()
268
+ return data;
269
+ }
270
+ }
271
+ //# sourceMappingURL=hinge-joint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hinge-joint.js","sourceRoot":"","sources":["../src/hinge-joint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export { initRapier, getWasmMemory, getLockedAxesOffset } from './init.js';
2
+ export { PhysicsWorld } from './physics-world.js';
3
+ export type { PhysicsWorldOptions } from './physics-world.js';
4
+ export { RigidBody } from './rigid-body.js';
5
+ export type { RigidBodyType, RigidBodyOptions } from './rigid-body.js';
6
+ export { Collider } from './collider.js';
7
+ export type { ColliderShape, ColliderOptions } from './collider.js';
8
+ export { Joint } from './joint.js';
9
+ export type { JointOptions } from './joint.js';
10
+ export { FixedJoint } from './fixed-joint.js';
11
+ export type { FixedJointOptions } from './fixed-joint.js';
12
+ export { HingeJoint } from './hinge-joint.js';
13
+ export type { HingeJointOptions } from './hinge-joint.js';
14
+ export { SpringJoint } from './spring-joint.js';
15
+ export type { SpringJointOptions } from './spring-joint.js';
16
+ export { PhysicsSystem } from './physics-system.js';
17
+ export { registerPhysicsBuiltins } from './register-builtins.js';
18
+ export { findAncestorComponent, hasAncestorComponent, hasDescendantComponent, } from './physics-hierarchy.js';
19
+ export { computeColliderOffset } from './collider-offset.js';
20
+ export type { ColliderOffset } from './collider-offset.js';
21
+ export { Physics, invalidateColliderMap } from './physics-query.js';
22
+ export type { HitResult } from './physics-query.js';
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ export { initRapier, getWasmMemory, getLockedAxesOffset } from './init.js';
2
+ export { PhysicsWorld } from './physics-world.js';
3
+ export { RigidBody } from './rigid-body.js';
4
+ export { Collider } from './collider.js';
5
+ export { Joint } from './joint.js';
6
+ export { FixedJoint } from './fixed-joint.js';
7
+ export { HingeJoint } from './hinge-joint.js';
8
+ export { SpringJoint } from './spring-joint.js';
9
+ export { PhysicsSystem } from './physics-system.js';
10
+ export { registerPhysicsBuiltins } from './register-builtins.js';
11
+ export { findAncestorComponent, hasAncestorComponent, hasDescendantComponent, } from './physics-hierarchy.js';
12
+ export { computeColliderOffset } from './collider-offset.js';
13
+ export { Physics, invalidateColliderMap } from './physics-query.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import RAPIER from '@dimforge/rapier3d-compat';
2
+ /** Initialize Rapier WASM. Idempotent – safe to call multiple times. */
3
+ export declare function initRapier(): Promise<typeof RAPIER>;
4
+ /** Get the WASM memory buffer. Only available after initRapier(). */
5
+ export declare function getWasmMemory(): WebAssembly.Memory | null;
6
+ /** Get the detected locked_axes byte offset, or -1 if detection failed. */
7
+ export declare function getLockedAxesOffset(): number;
8
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,2BAA2B,CAAC;AAgB/C,wEAAwE;AACxE,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,MAAM,CAAC,CAwCzD;AA4CD,qEAAqE;AACrE,wBAAgB,aAAa,IAAI,WAAW,CAAC,MAAM,GAAG,IAAI,CAEzD;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
package/dist/init.js ADDED
@@ -0,0 +1,98 @@
1
+ import RAPIER from '@dimforge/rapier3d-compat';
2
+ let initialized = false;
3
+ /**
4
+ * WASM memory buffer from the Rapier module.
5
+ * Used to patch raw joint data that the JS bindings don't fully expose.
6
+ */
7
+ let wasmMemory = null;
8
+ /**
9
+ * Byte offset of `locked_axes` within a RawGenericJoint WASM struct.
10
+ * Detected at init by comparing a Fixed and Revolute raw joint.
11
+ */
12
+ let lockedAxesOffset = -1;
13
+ /** Initialize Rapier WASM. Idempotent – safe to call multiple times. */
14
+ export async function initRapier() {
15
+ if (!initialized) {
16
+ // RAPIER.init() returns void — intercept WebAssembly instantiation to capture the memory.
17
+ // Browsers may use either instantiateStreaming or instantiate depending on MIME type.
18
+ let capturedMemory = null;
19
+ const extractMemory = (instance) => {
20
+ const mem = instance.exports.memory;
21
+ if (mem)
22
+ capturedMemory = mem;
23
+ };
24
+ const origInstantiate = WebAssembly.instantiate;
25
+ WebAssembly.instantiate = (async (...args) => {
26
+ const result = await origInstantiate.apply(WebAssembly, args);
27
+ const inst = result?.instance;
28
+ if (inst)
29
+ extractMemory(inst);
30
+ return result;
31
+ });
32
+ const origStreaming = WebAssembly.instantiateStreaming;
33
+ if (origStreaming) {
34
+ WebAssembly.instantiateStreaming = (async (...args) => {
35
+ const result = await origStreaming.apply(WebAssembly, args);
36
+ const inst = result?.instance;
37
+ if (inst)
38
+ extractMemory(inst);
39
+ return result;
40
+ });
41
+ }
42
+ try {
43
+ await RAPIER.init();
44
+ }
45
+ finally {
46
+ WebAssembly.instantiate = origInstantiate;
47
+ if (origStreaming)
48
+ WebAssembly.instantiateStreaming = origStreaming;
49
+ }
50
+ wasmMemory = capturedMemory;
51
+ lockedAxesOffset = detectLockedAxesOffset();
52
+ initialized = true;
53
+ }
54
+ return RAPIER;
55
+ }
56
+ /**
57
+ * Detect the byte offset of `locked_axes` in the RawGenericJoint WASM struct.
58
+ * Creates throwaway revolute (locked=0x37) and fixed (locked=0x3F) raw joints,
59
+ * then scans for the differing byte.
60
+ */
61
+ function detectLockedAxesOffset() {
62
+ const v0 = new RAPIER.Vector3(0, 0, 0);
63
+ const v1 = new RAPIER.Vector3(0, 1, 0);
64
+ const q0 = new RAPIER.Quaternion(0, 0, 0, 1);
65
+ const revolute = RAPIER.JointData.revolute(v0, v0, v1);
66
+ const fixed = RAPIER.JointData.fixed(v0, q0, v0, q0);
67
+ const rawRev = revolute.intoRaw();
68
+ const rawFix = fixed.intoRaw();
69
+ if (!rawRev || !rawFix || !wasmMemory) {
70
+ rawRev?.free();
71
+ rawFix?.free();
72
+ return -1;
73
+ }
74
+ const ptrRev = rawRev.__wbg_ptr;
75
+ const ptrFix = rawFix.__wbg_ptr;
76
+ const bytes = new Uint8Array(wasmMemory.buffer);
77
+ // Fixed locked_axes = 0x3F (all 6 DOFs locked)
78
+ // Revolute locked_axes = 0x37 (all except AngX = bit 3)
79
+ let offset = -1;
80
+ for (let i = 0; i < 512; i++) {
81
+ if (bytes[ptrRev + i] === 0x37 && bytes[ptrFix + i] === 0x3F) {
82
+ offset = i;
83
+ break;
84
+ }
85
+ }
86
+ rawRev.free();
87
+ rawFix.free();
88
+ return offset;
89
+ }
90
+ /** Get the WASM memory buffer. Only available after initRapier(). */
91
+ export function getWasmMemory() {
92
+ return wasmMemory;
93
+ }
94
+ /** Get the detected locked_axes byte offset, or -1 if detection failed. */
95
+ export function getLockedAxesOffset() {
96
+ return lockedAxesOffset;
97
+ }
98
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import RAPIER from '@dimforge/rapier3d-compat';
2
+ import { Component } from '@certe/atmos-core';
3
+ import type { GameObject } from '@certe/atmos-core';
4
+ import type { PhysicsWorld } from './physics-world.js';
5
+ export interface JointOptions {
6
+ connectedObject?: GameObject;
7
+ anchor?: {
8
+ x: number;
9
+ y: number;
10
+ z: number;
11
+ };
12
+ connectedAnchor?: {
13
+ x: number;
14
+ y: number;
15
+ z: number;
16
+ };
17
+ autoConfigureConnectedAnchor?: boolean;
18
+ }
19
+ export declare abstract class Joint extends Component {
20
+ joint: RAPIER.ImpulseJoint | null;
21
+ protected _connectedObject: GameObject | null;
22
+ protected _world: PhysicsWorld | null;
23
+ private readonly _anchor;
24
+ private readonly _connectedAnchor;
25
+ private _autoConfigureConnectedAnchor;
26
+ get anchor(): Float32Array;
27
+ set anchor(v: Float32Array);
28
+ get connectedAnchor(): Float32Array;
29
+ set connectedAnchor(v: Float32Array);
30
+ get autoConfigureConnectedAnchor(): boolean;
31
+ set autoConfigureConnectedAnchor(v: boolean);
32
+ get connectedObject(): GameObject | null;
33
+ set connectedObject(value: GameObject | null);
34
+ init(world: PhysicsWorld, options?: JointOptions): void;
35
+ protected abstract _createJointData(): RAPIER.JointData;
36
+ protected _toXYZ(v: Float32Array): {
37
+ x: number;
38
+ y: number;
39
+ z: number;
40
+ };
41
+ protected _tryCreateJoint(): void;
42
+ /** Destroy current joint and recreate it (used when creation-time params change). */
43
+ protected _recreateJoint(): void;
44
+ /** Recompute auto-configured values (anchor/axis) without recreating the Rapier joint. */
45
+ refreshAutoConfig(): void;
46
+ /** Recreate the joint so auto-configured anchors/axes update after transforms change. */
47
+ syncAutoConfig(): void;
48
+ private _computeConnectedAnchor;
49
+ protected _removeJoint(): void;
50
+ onDestroy(): void;
51
+ }
52
+ //# sourceMappingURL=joint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joint.d.ts","sourceRoot":"","sources":["../src/joint.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,2BAA2B,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,WAAW,YAAY;IAC3B,eAAe,CAAC,EAAE,UAAU,CAAC;IAC7B,MAAM,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,eAAe,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,8BAAsB,KAAM,SAAQ,SAAS;IAC3C,KAAK,EAAE,MAAM,CAAC,YAAY,GAAG,IAAI,CAAQ;IAEzC,SAAS,CAAC,gBAAgB,EAAE,UAAU,GAAG,IAAI,CAAQ;IACrD,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAQ;IAE7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA+B;IAChE,OAAO,CAAC,6BAA6B,CAAQ;IAE7C,IAAI,MAAM,IAAI,YAAY,CAAyB;IACnD,IAAI,MAAM,CAAC,CAAC,EAAE,YAAY,EAGzB;IAED,IAAI,eAAe,IAAI,YAAY,CAAkC;IACrE,IAAI,eAAe,CAAC,CAAC,EAAE,YAAY,EAGlC;IAED,IAAI,4BAA4B,IAAI,OAAO,CAA+C;IAC1F,IAAI,4BAA4B,CAAC,CAAC,EAAE,OAAO,EAG1C;IAED,IAAI,eAAe,IAAI,UAAU,GAAG,IAAI,CAEvC;IAED,IAAI,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,EAK3C;IAED,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAsBvD,SAAS,CAAC,QAAQ,CAAC,gBAAgB,IAAI,MAAM,CAAC,SAAS;IAEvD,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAItE,SAAS,CAAC,eAAe,IAAI,IAAI;IAsBjC,qFAAqF;IACrF,SAAS,CAAC,cAAc,IAAI,IAAI;IAMhC,0FAA0F;IAC1F,iBAAiB,IAAI,IAAI;IAMzB,yFAAyF;IACzF,cAAc,IAAI,IAAI;IAKtB,OAAO,CAAC,uBAAuB;IA6C/B,SAAS,CAAC,YAAY,IAAI,IAAI;IAO9B,SAAS,IAAI,IAAI;CAIlB"}