@flighthq/geometry 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 (125) hide show
  1. package/dist/aabb.d.ts +88 -0
  2. package/dist/aabb.d.ts.map +1 -0
  3. package/dist/aabb.js +230 -0
  4. package/dist/aabb.js.map +1 -0
  5. package/dist/boundingSphere.d.ts +62 -0
  6. package/dist/boundingSphere.d.ts.map +1 -0
  7. package/dist/boundingSphere.js +188 -0
  8. package/dist/boundingSphere.js.map +1 -0
  9. package/dist/capsule.d.ts +38 -0
  10. package/dist/capsule.d.ts.map +1 -0
  11. package/dist/capsule.js +215 -0
  12. package/dist/capsule.js.map +1 -0
  13. package/dist/frustum.d.ts +49 -0
  14. package/dist/frustum.d.ts.map +1 -0
  15. package/dist/frustum.js +149 -0
  16. package/dist/frustum.js.map +1 -0
  17. package/dist/index.d.ts +25 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +25 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/matrix.d.ts +152 -0
  22. package/dist/matrix.d.ts.map +1 -0
  23. package/dist/matrix.js +488 -0
  24. package/dist/matrix.js.map +1 -0
  25. package/dist/matrix3.d.ts +63 -0
  26. package/dist/matrix3.d.ts.map +1 -0
  27. package/dist/matrix3.js +408 -0
  28. package/dist/matrix3.js.map +1 -0
  29. package/dist/matrix3Pool.d.ts +6 -0
  30. package/dist/matrix3Pool.d.ts.map +1 -0
  31. package/dist/matrix3Pool.js +26 -0
  32. package/dist/matrix3Pool.js.map +1 -0
  33. package/dist/matrix4.d.ts +238 -0
  34. package/dist/matrix4.d.ts.map +1 -0
  35. package/dist/matrix4.js +931 -0
  36. package/dist/matrix4.js.map +1 -0
  37. package/dist/matrix4Pool.d.ts +6 -0
  38. package/dist/matrix4Pool.d.ts.map +1 -0
  39. package/dist/matrix4Pool.js +26 -0
  40. package/dist/matrix4Pool.js.map +1 -0
  41. package/dist/matrixPool.d.ts +6 -0
  42. package/dist/matrixPool.d.ts.map +1 -0
  43. package/dist/matrixPool.js +26 -0
  44. package/dist/matrixPool.js.map +1 -0
  45. package/dist/obb.d.ts +44 -0
  46. package/dist/obb.d.ts.map +1 -0
  47. package/dist/obb.js +248 -0
  48. package/dist/obb.js.map +1 -0
  49. package/dist/plane.d.ts +66 -0
  50. package/dist/plane.d.ts.map +1 -0
  51. package/dist/plane.js +140 -0
  52. package/dist/plane.js.map +1 -0
  53. package/dist/quaternion.d.ts +128 -0
  54. package/dist/quaternion.d.ts.map +1 -0
  55. package/dist/quaternion.js +508 -0
  56. package/dist/quaternion.js.map +1 -0
  57. package/dist/quaternionPool.d.ts +6 -0
  58. package/dist/quaternionPool.d.ts.map +1 -0
  59. package/dist/quaternionPool.js +29 -0
  60. package/dist/quaternionPool.js.map +1 -0
  61. package/dist/ray3d.d.ts +69 -0
  62. package/dist/ray3d.d.ts.map +1 -0
  63. package/dist/ray3d.js +264 -0
  64. package/dist/ray3d.js.map +1 -0
  65. package/dist/rectangle.d.ts +56 -0
  66. package/dist/rectangle.d.ts.map +1 -0
  67. package/dist/rectangle.js +235 -0
  68. package/dist/rectangle.js.map +1 -0
  69. package/dist/rectanglePool.d.ts +6 -0
  70. package/dist/rectanglePool.d.ts.map +1 -0
  71. package/dist/rectanglePool.js +29 -0
  72. package/dist/rectanglePool.js.map +1 -0
  73. package/dist/typedarray.d.ts +4 -0
  74. package/dist/typedarray.d.ts.map +1 -0
  75. package/dist/typedarray.js +25 -0
  76. package/dist/typedarray.js.map +1 -0
  77. package/dist/vector2.d.ts +130 -0
  78. package/dist/vector2.d.ts.map +1 -0
  79. package/dist/vector2.js +250 -0
  80. package/dist/vector2.js.map +1 -0
  81. package/dist/vector2Pool.d.ts +6 -0
  82. package/dist/vector2Pool.d.ts.map +1 -0
  83. package/dist/vector2Pool.js +20 -0
  84. package/dist/vector2Pool.js.map +1 -0
  85. package/dist/vector3.d.ts +220 -0
  86. package/dist/vector3.d.ts.map +1 -0
  87. package/dist/vector3.js +380 -0
  88. package/dist/vector3.js.map +1 -0
  89. package/dist/vector3Pool.d.ts +6 -0
  90. package/dist/vector3Pool.d.ts.map +1 -0
  91. package/dist/vector3Pool.js +28 -0
  92. package/dist/vector3Pool.js.map +1 -0
  93. package/dist/vector4.d.ts +180 -0
  94. package/dist/vector4.d.ts.map +1 -0
  95. package/dist/vector4.js +333 -0
  96. package/dist/vector4.js.map +1 -0
  97. package/dist/vector4Pool.d.ts +6 -0
  98. package/dist/vector4Pool.d.ts.map +1 -0
  99. package/dist/vector4Pool.js +29 -0
  100. package/dist/vector4Pool.js.map +1 -0
  101. package/package.json +38 -0
  102. package/src/aabb.test.ts +341 -0
  103. package/src/boundingSphere.test.ts +247 -0
  104. package/src/capsule.test.ts +157 -0
  105. package/src/frustum.test.ts +160 -0
  106. package/src/matrix.test.ts +1111 -0
  107. package/src/matrix3.test.ts +752 -0
  108. package/src/matrix3Pool.test.ts +73 -0
  109. package/src/matrix4.test.ts +1627 -0
  110. package/src/matrix4Pool.test.ts +71 -0
  111. package/src/matrixPool.test.ts +69 -0
  112. package/src/obb.test.ts +183 -0
  113. package/src/plane.test.ts +225 -0
  114. package/src/quaternion.test.ts +531 -0
  115. package/src/quaternionPool.test.ts +64 -0
  116. package/src/ray3d.test.ts +297 -0
  117. package/src/rectangle.test.ts +982 -0
  118. package/src/rectanglePool.test.ts +71 -0
  119. package/src/typedarray.test.ts +118 -0
  120. package/src/vector2.test.ts +958 -0
  121. package/src/vector2Pool.test.ts +65 -0
  122. package/src/vector3.test.ts +749 -0
  123. package/src/vector3Pool.test.ts +68 -0
  124. package/src/vector4.test.ts +660 -0
  125. package/src/vector4Pool.test.ts +71 -0
@@ -0,0 +1,508 @@
1
+ import { createEntity } from '@flighthq/entity';
2
+ export function cloneQuaternion(source) {
3
+ return createQuaternion(source.x, source.y, source.z, source.w);
4
+ }
5
+ /**
6
+ * Writes the conjugate of a quaternion, negating the vector part (x, y, z) and
7
+ * leaving the scalar part (w) unchanged. For a unit quaternion the conjugate is
8
+ * also its inverse.
9
+ *
10
+ * Safe when `out` aliases `source`.
11
+ */
12
+ export function conjugateQuaternion(out, source) {
13
+ out.x = -source.x;
14
+ out.y = -source.y;
15
+ out.z = -source.z;
16
+ out.w = source.w;
17
+ }
18
+ /**
19
+ * Copies the x, y, z and w components of a quaternion.
20
+ *
21
+ * Safe when `out` aliases `source`.
22
+ */
23
+ export function copyQuaternion(out, source) {
24
+ out.x = source.x;
25
+ out.y = source.y;
26
+ out.z = source.z;
27
+ out.w = source.w;
28
+ }
29
+ /**
30
+ * Creates a unit quaternion (x, y, z, w) representing a 3D rotation. Handedness is pinned
31
+ * across the 3D suite: right-handed coordinates, CCW front-face, glTF tangent w-sign.
32
+ *
33
+ * Defaults to the identity rotation (0, 0, 0, 1).
34
+ */
35
+ export function createQuaternion(x, y, z, w) {
36
+ return createEntity({ x: x ?? 0, y: y ?? 0, z: z ?? 0, w: w ?? 1 });
37
+ }
38
+ export function equalsQuaternion(a, b) {
39
+ if (a === b)
40
+ return true;
41
+ if (!a || !b)
42
+ return false;
43
+ return a.x === b.x && a.y === b.y && a.z === b.z && a.w === b.w;
44
+ }
45
+ /**
46
+ * Returns the angle (in radians) between two unit quaternions. Returns 0 for identical
47
+ * rotations and up to π for opposite rotations. Takes the shorter arc.
48
+ */
49
+ export function getQuaternionAngleBetween(a, b) {
50
+ const dot = Math.abs(getQuaternionDot(a, b));
51
+ return 2 * Math.acos(Math.min(1, dot));
52
+ }
53
+ /**
54
+ * Returns the dot product of two quaternions: sum of component-wise products.
55
+ * Useful for measuring the similarity of two orientations; `|dot| === 1` means identical.
56
+ */
57
+ export function getQuaternionDot(a, b) {
58
+ return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
59
+ }
60
+ /**
61
+ * Extracts Euler angles (in radians) from a unit quaternion in the given `order`.
62
+ * Defaults to `'XYZ'`. Writes the result to `out` as (x=angle around X, y=around Y, z=around Z).
63
+ *
64
+ * Note: Euler angles have a gimbal-lock singularity when the middle axis reaches ±90°. At the
65
+ * singularity the decomposition is not unique; this implementation sets the third angle to 0
66
+ * and puts all the rotation into the first angle (a common convention).
67
+ */
68
+ export function getQuaternionEuler(out, source, order = 'XYZ') {
69
+ // True inverse of setQuaternionFromEuler: build the rotation matrix the set side implies
70
+ // (m[row][col] of the unit-quaternion rotation), then read the Euler angles off that matrix
71
+ // with the standard branch per order. Computing the matrix elements inline keeps this
72
+ // allocation-free while guaranteeing set → get round-trips for every order.
73
+ const x = source.x, y = source.y, z = source.z, w = source.w;
74
+ const xx = x * x, yy = y * y, zz = z * z;
75
+ const xy = x * y, xz = x * z, yz = y * z;
76
+ const wx = w * x, wy = w * y, wz = w * z;
77
+ const m00 = 1 - 2 * (yy + zz), m01 = 2 * (xy - wz), m02 = 2 * (xz + wy);
78
+ const m10 = 2 * (xy + wz), m11 = 1 - 2 * (xx + zz), m12 = 2 * (yz - wx);
79
+ const m20 = 2 * (xz - wy), m21 = 2 * (yz + wx), m22 = 1 - 2 * (xx + yy);
80
+ switch (order) {
81
+ case 'XYZ': {
82
+ out.y = Math.asin(Math.min(1, Math.max(-1, m02)));
83
+ if (Math.abs(m02) < 0.9999999) {
84
+ out.x = Math.atan2(-m12, m22);
85
+ out.z = Math.atan2(-m01, m00);
86
+ }
87
+ else {
88
+ out.x = Math.atan2(m21, m11);
89
+ out.z = 0;
90
+ }
91
+ break;
92
+ }
93
+ case 'XZY': {
94
+ out.z = Math.asin(Math.min(1, Math.max(-1, -m01)));
95
+ if (Math.abs(m01) < 0.9999999) {
96
+ out.x = Math.atan2(m21, m11);
97
+ out.y = Math.atan2(m02, m00);
98
+ }
99
+ else {
100
+ out.x = Math.atan2(-m12, m22);
101
+ out.y = 0;
102
+ }
103
+ break;
104
+ }
105
+ case 'YXZ': {
106
+ out.x = Math.asin(Math.min(1, Math.max(-1, -m12)));
107
+ if (Math.abs(m12) < 0.9999999) {
108
+ out.y = Math.atan2(m02, m22);
109
+ out.z = Math.atan2(m10, m11);
110
+ }
111
+ else {
112
+ out.y = Math.atan2(-m20, m00);
113
+ out.z = 0;
114
+ }
115
+ break;
116
+ }
117
+ case 'YZX': {
118
+ out.z = Math.asin(Math.min(1, Math.max(-1, m10)));
119
+ if (Math.abs(m10) < 0.9999999) {
120
+ out.x = Math.atan2(-m12, m11);
121
+ out.y = Math.atan2(-m20, m00);
122
+ }
123
+ else {
124
+ out.x = 0;
125
+ out.y = Math.atan2(m02, m22);
126
+ }
127
+ break;
128
+ }
129
+ case 'ZXY': {
130
+ out.x = Math.asin(Math.min(1, Math.max(-1, m21)));
131
+ if (Math.abs(m21) < 0.9999999) {
132
+ out.y = Math.atan2(-m20, m22);
133
+ out.z = Math.atan2(-m01, m11);
134
+ }
135
+ else {
136
+ out.y = 0;
137
+ out.z = Math.atan2(m10, m00);
138
+ }
139
+ break;
140
+ }
141
+ case 'ZYX': {
142
+ out.y = Math.asin(Math.min(1, Math.max(-1, -m20)));
143
+ if (Math.abs(m20) < 0.9999999) {
144
+ out.x = Math.atan2(m21, m22);
145
+ out.z = Math.atan2(m10, m00);
146
+ }
147
+ else {
148
+ out.x = 0;
149
+ out.z = Math.atan2(-m01, m11);
150
+ }
151
+ break;
152
+ }
153
+ }
154
+ }
155
+ /**
156
+ * Writes the inverse of a quaternion. For unit quaternions this is the same as the conjugate;
157
+ * for non-unit quaternions this divides the conjugate by the squared length.
158
+ * A zero-length quaternion writes the identity rotation (0, 0, 0, 1).
159
+ *
160
+ * Safe when `out` aliases `source`.
161
+ */
162
+ export function inverseQuaternion(out, source) {
163
+ const x = source.x, y = source.y, z = source.z, w = source.w;
164
+ const lenSq = x * x + y * y + z * z + w * w;
165
+ if (lenSq === 0) {
166
+ out.x = 0;
167
+ out.y = 0;
168
+ out.z = 0;
169
+ out.w = 1;
170
+ return;
171
+ }
172
+ const inv = 1 / lenSq;
173
+ out.x = -x * inv;
174
+ out.y = -y * inv;
175
+ out.z = -z * inv;
176
+ out.w = w * inv;
177
+ }
178
+ /**
179
+ * Hamilton product of two quaternions: out = a · b. The result represents applying
180
+ * rotation `b` first, then rotation `a`.
181
+ *
182
+ * Safe when `out` aliases `a` and/or `b` (all inputs are read into locals first).
183
+ */
184
+ export function multiplyQuaternion(out, a, b) {
185
+ const ax = a.x, ay = a.y, az = a.z, aw = a.w;
186
+ const bx = b.x, by = b.y, bz = b.z, bw = b.w;
187
+ out.x = aw * bx + ax * bw + ay * bz - az * by;
188
+ out.y = aw * by - ax * bz + ay * bw + az * bx;
189
+ out.z = aw * bz + ax * by - ay * bx + az * bw;
190
+ out.w = aw * bw - ax * bx - ay * by - az * bz;
191
+ }
192
+ /**
193
+ * Normalizes a quaternion to unit length. A zero-length quaternion is written as the
194
+ * identity rotation (0, 0, 0, 1).
195
+ *
196
+ * Returns the original length. Safe when `out` aliases `source`.
197
+ */
198
+ export function normalizeQuaternion(out, source) {
199
+ const x = source.x, y = source.y, z = source.z, w = source.w;
200
+ const l = Math.sqrt(x * x + y * y + z * z + w * w);
201
+ if (l !== 0) {
202
+ const inv = 1 / l;
203
+ out.x = x * inv;
204
+ out.y = y * inv;
205
+ out.z = z * inv;
206
+ out.w = w * inv;
207
+ }
208
+ else {
209
+ out.x = 0;
210
+ out.y = 0;
211
+ out.z = 0;
212
+ out.w = 1;
213
+ }
214
+ return l;
215
+ }
216
+ /**
217
+ * Applies a quaternion rotation to a Vector3. Computes q * (0, v) * q^-1 using the
218
+ * sandwich product, which rotates the vector by the quaternion's rotation.
219
+ *
220
+ * Safe when `out` aliases `vector` (all inputs are read into locals first).
221
+ */
222
+ export function rotateVector3ByQuaternion(out, vector, q) {
223
+ // Rodrigues' rotation formula via quaternion sandwich product.
224
+ const qx = q.x, qy = q.y, qz = q.z, qw = q.w;
225
+ const vx = vector.x, vy = vector.y, vz = vector.z;
226
+ // t = 2 * cross(q.xyz, v)
227
+ const tx = 2 * (qy * vz - qz * vy);
228
+ const ty = 2 * (qz * vx - qx * vz);
229
+ const tz = 2 * (qx * vy - qy * vx);
230
+ // out = v + q.w * t + cross(q.xyz, t)
231
+ out.x = vx + qw * tx + (qy * tz - qz * ty);
232
+ out.y = vy + qw * ty + (qz * tx - qx * tz);
233
+ out.z = vz + qw * tz + (qx * ty - qy * tx);
234
+ }
235
+ /**
236
+ * Builds a quaternion from a rotation `axis` (assumed unit length) and an `angle` in
237
+ * radians. The rotation is right-handed (CCW when looking down the axis toward the origin).
238
+ *
239
+ * Safe when `out` aliases `axis`.
240
+ */
241
+ export function setQuaternionFromAxisAngle(out, axis, angle) {
242
+ const half = angle * 0.5;
243
+ const s = Math.sin(half);
244
+ out.x = axis.x * s;
245
+ out.y = axis.y * s;
246
+ out.z = axis.z * s;
247
+ out.w = Math.cos(half);
248
+ }
249
+ /**
250
+ * Builds a quaternion from Euler angles (in radians) applied in the given `order`.
251
+ * Defaults to `'XYZ'` order (intrinsic rotations — each rotation is about the local,
252
+ * rotated axes).
253
+ *
254
+ * Safe when `out` has no aliasing concerns (scalars only).
255
+ */
256
+ export function setQuaternionFromEuler(out, x, y, z, order = 'XYZ') {
257
+ const c1 = Math.cos(x / 2), s1 = Math.sin(x / 2);
258
+ const c2 = Math.cos(y / 2), s2 = Math.sin(y / 2);
259
+ const c3 = Math.cos(z / 2), s3 = Math.sin(z / 2);
260
+ switch (order) {
261
+ case 'XYZ':
262
+ out.x = s1 * c2 * c3 + c1 * s2 * s3;
263
+ out.y = c1 * s2 * c3 - s1 * c2 * s3;
264
+ out.z = c1 * c2 * s3 + s1 * s2 * c3;
265
+ out.w = c1 * c2 * c3 - s1 * s2 * s3;
266
+ break;
267
+ case 'XZY':
268
+ out.x = s1 * c2 * c3 - c1 * s2 * s3;
269
+ out.y = c1 * s2 * c3 - s1 * c2 * s3;
270
+ out.z = c1 * c2 * s3 + s1 * s2 * c3;
271
+ out.w = c1 * c2 * c3 + s1 * s2 * s3;
272
+ break;
273
+ case 'YXZ':
274
+ out.x = s1 * c2 * c3 + c1 * s2 * s3;
275
+ out.y = c1 * s2 * c3 - s1 * c2 * s3;
276
+ out.z = c1 * c2 * s3 - s1 * s2 * c3;
277
+ out.w = c1 * c2 * c3 + s1 * s2 * s3;
278
+ break;
279
+ case 'YZX':
280
+ out.x = s1 * c2 * c3 + c1 * s2 * s3;
281
+ out.y = c1 * s2 * c3 + s1 * c2 * s3;
282
+ out.z = c1 * c2 * s3 - s1 * s2 * c3;
283
+ out.w = c1 * c2 * c3 - s1 * s2 * s3;
284
+ break;
285
+ case 'ZXY':
286
+ out.x = s1 * c2 * c3 - c1 * s2 * s3;
287
+ out.y = c1 * s2 * c3 + s1 * c2 * s3;
288
+ out.z = c1 * c2 * s3 + s1 * s2 * c3;
289
+ out.w = c1 * c2 * c3 - s1 * s2 * s3;
290
+ break;
291
+ case 'ZYX':
292
+ out.x = s1 * c2 * c3 - c1 * s2 * s3;
293
+ out.y = c1 * s2 * c3 + s1 * c2 * s3;
294
+ out.z = c1 * c2 * s3 - s1 * s2 * c3;
295
+ out.w = c1 * c2 * c3 + s1 * s2 * s3;
296
+ break;
297
+ }
298
+ }
299
+ /**
300
+ * Extracts the rotation of a Matrix4 (upper-left 3×3, assumed orthonormal) into a unit
301
+ * quaternion. Uses the numerically stable trace/largest-diagonal branch.
302
+ */
303
+ export function setQuaternionFromMatrix4(out, source) {
304
+ const m = source.m;
305
+ // Column-major Matrix4: m[col*4 + row]. Upper-left 3×3 rotation basis.
306
+ const m00 = m[0], m10 = m[4], m20 = m[8], m01 = m[1], m11 = m[5], m21 = m[9], m02 = m[2], m12 = m[6], m22 = m[10];
307
+ const trace = m00 + m11 + m22;
308
+ if (trace > 0) {
309
+ const s = 0.5 / Math.sqrt(trace + 1.0);
310
+ out.w = 0.25 / s;
311
+ out.x = (m12 - m21) * s;
312
+ out.y = (m20 - m02) * s;
313
+ out.z = (m01 - m10) * s;
314
+ }
315
+ else if (m00 > m11 && m00 > m22) {
316
+ const s = 2.0 * Math.sqrt(1.0 + m00 - m11 - m22);
317
+ out.w = (m12 - m21) / s;
318
+ out.x = 0.25 * s;
319
+ out.y = (m10 + m01) / s;
320
+ out.z = (m20 + m02) / s;
321
+ }
322
+ else if (m11 > m22) {
323
+ const s = 2.0 * Math.sqrt(1.0 + m11 - m00 - m22);
324
+ out.w = (m20 - m02) / s;
325
+ out.x = (m10 + m01) / s;
326
+ out.y = 0.25 * s;
327
+ out.z = (m21 + m12) / s;
328
+ }
329
+ else {
330
+ const s = 2.0 * Math.sqrt(1.0 + m22 - m00 - m11);
331
+ out.w = (m01 - m10) / s;
332
+ out.x = (m20 + m02) / s;
333
+ out.y = (m21 + m12) / s;
334
+ out.z = 0.25 * s;
335
+ }
336
+ }
337
+ /**
338
+ * Builds the shortest-arc rotation quaternion from unit vector `from` to unit vector `to`.
339
+ *
340
+ * Handles the antiparallel case (from ≈ -to) by choosing an arbitrary perpendicular axis
341
+ * for a 180-degree rotation, so the result is always valid.
342
+ *
343
+ * Safe when `out` aliases `from` or `to`.
344
+ */
345
+ export function setQuaternionFromUnitVectors(out, from, to) {
346
+ const fx = from.x, fy = from.y, fz = from.z;
347
+ const tx = to.x, ty = to.y, tz = to.z;
348
+ const dot = fx * tx + fy * ty + fz * tz;
349
+ if (dot > 0.999999) {
350
+ // Already aligned — identity
351
+ setQuaternionIdentity(out);
352
+ return;
353
+ }
354
+ if (dot < -0.999999) {
355
+ // Antiparallel — 180-degree rotation about any perpendicular axis
356
+ // Find an axis not parallel to `from`
357
+ let ax = 1, ay = 0, az = 0;
358
+ if (Math.abs(fx) > 0.9) {
359
+ ax = 0;
360
+ ay = 1;
361
+ az = 0;
362
+ }
363
+ // perpendicular = cross(from, axis), normalized
364
+ let px = fy * az - fz * ay;
365
+ let py = fz * ax - fx * az;
366
+ let pz = fx * ay - fy * ax;
367
+ const pLen = Math.sqrt(px * px + py * py + pz * pz);
368
+ px /= pLen;
369
+ py /= pLen;
370
+ pz /= pLen;
371
+ out.x = px;
372
+ out.y = py;
373
+ out.z = pz;
374
+ out.w = 0;
375
+ return;
376
+ }
377
+ // General case: cross product gives the rotation axis * sin(theta/2)
378
+ const cx = fy * tz - fz * ty;
379
+ const cy = fz * tx - fx * tz;
380
+ const cz = fx * ty - fy * tx;
381
+ out.x = cx;
382
+ out.y = cy;
383
+ out.z = cz;
384
+ out.w = 1 + dot;
385
+ // normalize
386
+ const len = Math.sqrt(out.x * out.x + out.y * out.y + out.z * out.z + out.w * out.w);
387
+ if (len !== 0) {
388
+ const inv = 1 / len;
389
+ out.x *= inv;
390
+ out.y *= inv;
391
+ out.z *= inv;
392
+ out.w *= inv;
393
+ }
394
+ }
395
+ /**
396
+ * Resets a quaternion to the identity rotation (0, 0, 0, 1).
397
+ */
398
+ export function setQuaternionIdentity(out) {
399
+ out.x = 0;
400
+ out.y = 0;
401
+ out.z = 0;
402
+ out.w = 1;
403
+ }
404
+ /**
405
+ * Builds a "look rotation" quaternion from a `forward` and an `up` direction. Both vectors are
406
+ * assumed unit length. Convention: +Z forward with +Y up = identity quaternion (matches
407
+ * three.js / Unity).
408
+ *
409
+ * Internally computes `right = up × forward`, `correctedUp = forward × right`, and builds the
410
+ * rotation matrix from `[right, correctedUp, forward]` as column vectors.
411
+ *
412
+ * If `forward` and `up` are parallel or `forward` has zero length, the result is the
413
+ * identity quaternion.
414
+ *
415
+ * Safe when `out` has no aliasing concerns.
416
+ */
417
+ export function setQuaternionLookRotation(out, forward, up) {
418
+ const fx = forward.x, fy = forward.y, fz = forward.z;
419
+ const ux = up.x, uy = up.y, uz = up.z;
420
+ // right = up × forward
421
+ let rx = uy * fz - uz * fy;
422
+ let ry = uz * fx - ux * fz;
423
+ let rz = ux * fy - uy * fx;
424
+ const rLen = Math.sqrt(rx * rx + ry * ry + rz * rz);
425
+ if (rLen === 0) {
426
+ setQuaternionIdentity(out);
427
+ return;
428
+ }
429
+ const rInv = 1 / rLen;
430
+ rx *= rInv;
431
+ ry *= rInv;
432
+ rz *= rInv;
433
+ // correctedUp = forward × right
434
+ const cux = fy * rz - fz * ry;
435
+ const cuy = fz * rx - fx * rz;
436
+ const cuz = fx * ry - fy * rx;
437
+ // Rotation matrix columns: col0 = right, col1 = correctedUp, col2 = forward
438
+ const m00 = rx, m01 = cux, m02 = fx;
439
+ const m10 = ry, m11 = cuy, m12 = fy;
440
+ const m20 = rz, m21 = cuz, m22 = fz;
441
+ const trace = m00 + m11 + m22;
442
+ if (trace > 0) {
443
+ const s = 0.5 / Math.sqrt(trace + 1);
444
+ out.w = 0.25 / s;
445
+ out.x = (m12 - m21) * s;
446
+ out.y = (m20 - m02) * s;
447
+ out.z = (m01 - m10) * s;
448
+ }
449
+ else if (m00 > m11 && m00 > m22) {
450
+ const s = 2 * Math.sqrt(1 + m00 - m11 - m22);
451
+ out.w = (m12 - m21) / s;
452
+ out.x = 0.25 * s;
453
+ out.y = (m10 + m01) / s;
454
+ out.z = (m20 + m02) / s;
455
+ }
456
+ else if (m11 > m22) {
457
+ const s = 2 * Math.sqrt(1 + m11 - m00 - m22);
458
+ out.w = (m20 - m02) / s;
459
+ out.x = (m10 + m01) / s;
460
+ out.y = 0.25 * s;
461
+ out.z = (m21 + m12) / s;
462
+ }
463
+ else {
464
+ const s = 2 * Math.sqrt(1 + m22 - m00 - m11);
465
+ out.w = (m01 - m10) / s;
466
+ out.x = (m20 + m02) / s;
467
+ out.y = (m21 + m12) / s;
468
+ out.z = 0.25 * s;
469
+ }
470
+ }
471
+ /**
472
+ * Spherical linear interpolation between two unit quaternions at parameter `t` in [0, 1].
473
+ * Chooses the shorter arc (negating `b` if the dot product is negative) and falls back to
474
+ * normalized linear interpolation when the inputs are nearly collinear.
475
+ *
476
+ * Safe when `out` aliases `a` and/or `b` (all inputs are read into locals first).
477
+ */
478
+ export function slerpQuaternion(out, a, b, t) {
479
+ const ax = a.x, ay = a.y, az = a.z, aw = a.w;
480
+ let bx = b.x, by = b.y, bz = b.z, bw = b.w;
481
+ let cosHalfTheta = ax * bx + ay * by + az * bz + aw * bw;
482
+ // Take the shorter arc.
483
+ if (cosHalfTheta < 0) {
484
+ cosHalfTheta = -cosHalfTheta;
485
+ bx = -bx;
486
+ by = -by;
487
+ bz = -bz;
488
+ bw = -bw;
489
+ }
490
+ let scaleA;
491
+ let scaleB;
492
+ if (cosHalfTheta < 0.999999) {
493
+ const halfTheta = Math.acos(cosHalfTheta);
494
+ const sinHalfTheta = Math.sin(halfTheta);
495
+ scaleA = Math.sin((1 - t) * halfTheta) / sinHalfTheta;
496
+ scaleB = Math.sin(t * halfTheta) / sinHalfTheta;
497
+ }
498
+ else {
499
+ // Nearly collinear: fall back to linear interpolation.
500
+ scaleA = 1 - t;
501
+ scaleB = t;
502
+ }
503
+ out.x = ax * scaleA + bx * scaleB;
504
+ out.y = ay * scaleA + by * scaleB;
505
+ out.z = az * scaleA + bz * scaleB;
506
+ out.w = aw * scaleA + bw * scaleB;
507
+ }
508
+ //# sourceMappingURL=quaternion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quaternion.js","sourceRoot":"","sources":["../src/quaternion.ts"],"names":[],"mappings":"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,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACpC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACpC,MAAM;QACR,KAAK,KAAK;YACR,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACpC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACpC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACpC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACpC,MAAM;QACR,KAAK,KAAK;YACR,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACpC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACpC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACpC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACpC,MAAM;QACR,KAAK,KAAK;YACR,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACpC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACpC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YACpC,GAAG,CAAC,CAAC,GAAG,EAAE,G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"}
@@ -0,0 +1,6 @@
1
+ import type { Quaternion } from '@flighthq/types';
2
+ export declare function acquireIdentityQuaternion(): Quaternion;
3
+ export declare function acquireQuaternion(): Quaternion;
4
+ export declare function clearQuaternionPool(): void;
5
+ export declare function releaseQuaternion(q: Quaternion): void;
6
+ //# sourceMappingURL=quaternionPool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quaternionPool.d.ts","sourceRoot":"","sources":["../src/quaternionPool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIlD,wBAAgB,yBAAyB,IAAI,UAAU,CAOtD;AAED,wBAAgB,iBAAiB,IAAI,UAAU,CAU9C;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAGrD"}
@@ -0,0 +1,29 @@
1
+ import { createQuaternion } from './quaternion';
2
+ export function acquireIdentityQuaternion() {
3
+ const q = acquireQuaternion();
4
+ q.x = 0;
5
+ q.y = 0;
6
+ q.z = 0;
7
+ q.w = 1;
8
+ return q;
9
+ }
10
+ export function acquireQuaternion() {
11
+ let q;
12
+ if (pool.length > 0) {
13
+ q = pool.pop();
14
+ }
15
+ else {
16
+ q = createQuaternion();
17
+ }
18
+ return q;
19
+ }
20
+ export function clearQuaternionPool() {
21
+ pool.length = 0;
22
+ }
23
+ export function releaseQuaternion(q) {
24
+ if (!q)
25
+ return;
26
+ pool.push(q);
27
+ }
28
+ const pool = [];
29
+ //# sourceMappingURL=quaternionPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quaternionPool.js","sourceRoot":"","sources":["../src/quaternionPool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,UAAU,yBAAyB;IACvC,MAAM,CAAC,GAAG,iBAAiB,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACR,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACR,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACR,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACR,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAa,CAAC;IAElB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,CAAC,GAAG,IAAI,CAAC,GAAG,EAAgB,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,CAAC,GAAG,gBAAgB,EAAE,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,CAAa;IAC7C,IAAI,CAAC,CAAC;QAAE,OAAO;IACf,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACf,CAAC;AAED,MAAM,IAAI,GAAiB,EAAE,CAAC"}
@@ -0,0 +1,69 @@
1
+ import type { AabbLike, BoundingSphereLike, PlaneLike, Ray3D, Ray3DLike, Vector3Like } from '@flighthq/types';
2
+ export declare function createRay3D(originX?: number, originY?: number, originZ?: number, directionX?: number, directionY?: number, directionZ?: number): Ray3D;
3
+ /**
4
+ * Writes the closest pair of points between two rays: `outA` receives the point on ray `a`
5
+ * closest to ray `b`, and `outB` the point on ray `b` closest to ray `a`. Both parameters are
6
+ * clamped to `t >= 0` so the result respects ray (half-line) semantics rather than infinite
7
+ * lines. Parallel rays fall back to projecting `b`'s origin onto ray `a`.
8
+ *
9
+ * Directions need not be normalized. Reads all inputs into locals before writing, so it is safe
10
+ * when `outA`/`outB` alias the ray vectors.
11
+ */
12
+ export declare function getClosestPointBetweenRay3Ds(outA: Vector3Like, outB: Vector3Like, a: Readonly<Ray3DLike>, b: Readonly<Ray3DLike>): void;
13
+ /**
14
+ * Writes the point on a ray closest to `point`: `point` projected onto the ray and clamped to
15
+ * `t >= 0` so it stays in front of the origin. When `point` projects behind the origin the ray
16
+ * origin is written. Direction need not be normalized.
17
+ *
18
+ * Reads all inputs into locals before writing, so it is safe when `out` aliases `point` or a
19
+ * ray vector.
20
+ */
21
+ export declare function getClosestPointOnRay3D(out: Vector3Like, ray: Readonly<Ray3DLike>, point: Readonly<Vector3Like>): void;
22
+ /**
23
+ * Returns the point on a ray at parameter `t`: `origin + t * direction`. Writes the result to
24
+ * `out`. `t` should be >= 0 for points in front of the origin. There is no bounds check on `t`.
25
+ *
26
+ * Safe when `out` aliases `ray.origin` or `ray.direction`.
27
+ */
28
+ export declare function getRay3DPointAt(out: Vector3Like, ray: Readonly<Ray3DLike>, t: number): void;
29
+ /**
30
+ * Tests whether a ray intersects an axis-aligned bounding box (slab method).
31
+ *
32
+ * Returns the entry parameter `t` (>= 0) on hit, or `-1` on miss. A ray that starts inside the
33
+ * box returns `t = 0`. Direction components need not be normalized; the test works for any
34
+ * non-zero direction. A zero-component direction is handled (the ray is parallel to that slab
35
+ * and outside returns -1, inside continues).
36
+ */
37
+ export declare function intersectRay3DAabb(ray: Readonly<Ray3DLike>, aabb: Readonly<AabbLike>): number;
38
+ /**
39
+ * Tests whether a ray intersects a plane.
40
+ *
41
+ * Returns the parameter `t` (>= 0) such that `origin + t * direction` lies on the plane, or
42
+ * `-1` if the ray is parallel to the plane (no intersection) or intersects behind the origin.
43
+ * The plane is given in the form `ax + by + cz + d = 0` with a (not necessarily unit) normal.
44
+ *
45
+ * Direction need not be normalized; `t` is in the same units as `direction`.
46
+ */
47
+ export declare function intersectRay3DPlane(ray: Readonly<Ray3DLike>, plane: Readonly<PlaneLike>): number;
48
+ /**
49
+ * Tests whether a ray intersects a bounding sphere.
50
+ *
51
+ * Returns the parameter `t` of the nearer intersection (>= 0), or `-1` on miss. An empty
52
+ * sphere (radius < 0) always returns `-1`. A ray that starts inside the sphere returns `t = 0`
53
+ * at the entry point (the near intersection is behind the origin; we clamp to `0`).
54
+ *
55
+ * Direction need not be normalized; `t` is in direction units.
56
+ */
57
+ export declare function intersectRay3DSphere(ray: Readonly<Ray3DLike>, sphere: Readonly<BoundingSphereLike>): number;
58
+ /**
59
+ * Tests whether a ray intersects a triangle using the Möller–Trumbore algorithm.
60
+ *
61
+ * Returns the parameter `t` (>= 0) such that `origin + t * direction` is the hit point, or
62
+ * `-1` on miss (back-face culling is off — both sides are tested). The direction need not be
63
+ * normalized; `t` is in direction units.
64
+ *
65
+ * Also returns `-1` for degenerate triangles (area ≈ 0).
66
+ */
67
+ export declare function intersectRay3DTriangle(ray: Readonly<Ray3DLike>, a: Readonly<Vector3Like>, b: Readonly<Vector3Like>, c: Readonly<Vector3Like>): number;
68
+ export declare function setRay3D(out: Ray3DLike, origin: Readonly<Vector3Like>, direction: Readonly<Vector3Like>): void;
69
+ //# sourceMappingURL=ray3d.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ray3d.d.ts","sourceRoot":"","sources":["../src/ray3d.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAM9G,wBAAgB,WAAW,CACzB,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,KAAK,CAKP;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,WAAW,EACjB,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,EACtB,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,GACrB,IAAI,CAkDN;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI,CAkBrH;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAU3F;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,MAAM,CA+D7F;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,MAAM,CAKhG;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAsB3G;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,EACxB,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,EACxB,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,EACxB,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,GACvB,MAAM,CA4CR;AAKD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI,CAa9G"}