@certe/atmos-math 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.
package/dist/noise.js ADDED
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Simple 2D value noise — no dependencies.
3
+ * Uses a hash-based pseudo-random lattice with smooth interpolation.
4
+ */
5
+ /** Deterministic hash for integer coordinates → [0, 1) */
6
+ function hash(ix, iz) {
7
+ // Large primes for mixing
8
+ let h = (ix * 374761393 + iz * 668265263 + 1013904223) | 0;
9
+ h = Math.imul(h ^ (h >>> 13), 1274126177);
10
+ h = h ^ (h >>> 16);
11
+ return (h & 0x7FFFFFFF) / 0x7FFFFFFF;
12
+ }
13
+ /** Smoothstep (Hermite) interpolation */
14
+ function smoothstep(t) {
15
+ return t * t * (3 - 2 * t);
16
+ }
17
+ /** Lerp */
18
+ function lerp(a, b, t) {
19
+ return a + (b - a) * t;
20
+ }
21
+ /**
22
+ * 2D value noise at (x, z). Returns a value in approximately [-1, 1].
23
+ * @param x World X coordinate (pre-scaled by caller)
24
+ * @param z World Z coordinate (pre-scaled by caller)
25
+ */
26
+ export function valueNoise2D(x, z) {
27
+ const ix = Math.floor(x);
28
+ const iz = Math.floor(z);
29
+ const fx = smoothstep(x - ix);
30
+ const fz = smoothstep(z - iz);
31
+ const v00 = hash(ix, iz);
32
+ const v10 = hash(ix + 1, iz);
33
+ const v01 = hash(ix, iz + 1);
34
+ const v11 = hash(ix + 1, iz + 1);
35
+ const top = lerp(v00, v10, fx);
36
+ const bot = lerp(v01, v11, fx);
37
+ // Map from [0,1] to [-1,1]
38
+ return lerp(top, bot, fz) * 2 - 1;
39
+ }
40
+ /**
41
+ * Fractal Brownian Motion (fBm) using value noise.
42
+ * Stacks multiple octaves for natural-looking terrain.
43
+ */
44
+ export function fbm(x, z, octaves = 4, lacunarity = 2, persistence = 0.5) {
45
+ let value = 0;
46
+ let amplitude = 1;
47
+ let frequency = 1;
48
+ let maxAmp = 0;
49
+ for (let i = 0; i < octaves; i++) {
50
+ value += valueNoise2D(x * frequency, z * frequency) * amplitude;
51
+ maxAmp += amplitude;
52
+ amplitude *= persistence;
53
+ frequency *= lacunarity;
54
+ }
55
+ return value / maxAmp;
56
+ }
57
+ // ---------------------------------------------------------------------------
58
+ // 3D Perlin noise (improved, gradient-lattice)
59
+ // ---------------------------------------------------------------------------
60
+ /** 12 gradient vectors — edges of a cube (Perlin standard). */
61
+ const GRAD3 = [
62
+ 1, 1, 0, -1, 1, 0, 1, -1, 0, -1, -1, 0,
63
+ 1, 0, 1, -1, 0, 1, 1, 0, -1, -1, 0, -1,
64
+ 0, 1, 1, 0, -1, 1, 0, 1, -1, 0, -1, -1,
65
+ ];
66
+ /** Permutation table (256 entries, doubled to avoid modulo). */
67
+ const PERM = new Uint8Array(512);
68
+ {
69
+ const p = [
70
+ 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225,
71
+ 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148,
72
+ 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32,
73
+ 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175,
74
+ 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122,
75
+ 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54,
76
+ 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169,
77
+ 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64,
78
+ 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212,
79
+ 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213,
80
+ 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9,
81
+ 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104,
82
+ 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241,
83
+ 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157,
84
+ 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93,
85
+ 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180,
86
+ ];
87
+ for (let i = 0; i < 256; i++)
88
+ PERM[i] = PERM[i + 256] = p[i];
89
+ }
90
+ /** Improved Perlin fade: 6t^5 - 15t^4 + 10t^3 */
91
+ function fade(t) {
92
+ return t * t * t * (t * (t * 6 - 15) + 10);
93
+ }
94
+ /** Dot product with one of the 12 gradient vectors. */
95
+ function grad3dot(hash, x, y, z) {
96
+ const idx = (hash % 12) * 3;
97
+ return GRAD3[idx] * x + GRAD3[idx + 1] * y + GRAD3[idx + 2] * z;
98
+ }
99
+ /**
100
+ * 3D Perlin noise. Returns a value in approximately [-1, 1].
101
+ */
102
+ export function perlinNoise3D(x, y, z) {
103
+ const X = Math.floor(x) & 255;
104
+ const Y = Math.floor(y) & 255;
105
+ const Z = Math.floor(z) & 255;
106
+ const xf = x - Math.floor(x);
107
+ const yf = y - Math.floor(y);
108
+ const zf = z - Math.floor(z);
109
+ const u = fade(xf);
110
+ const v = fade(yf);
111
+ const w = fade(zf);
112
+ // Hash 8 corners
113
+ const A = PERM[X] + Y;
114
+ const AA = PERM[A] + Z;
115
+ const AB = PERM[A + 1] + Z;
116
+ const B = PERM[X + 1] + Y;
117
+ const BA = PERM[B] + Z;
118
+ const BB = PERM[B + 1] + Z;
119
+ // Gradient dots + trilinear interpolation
120
+ return lerp(lerp(lerp(grad3dot(PERM[AA], xf, yf, zf), grad3dot(PERM[BA], xf - 1, yf, zf), u), lerp(grad3dot(PERM[AB], xf, yf - 1, zf), grad3dot(PERM[BB], xf - 1, yf - 1, zf), u), v), lerp(lerp(grad3dot(PERM[AA + 1], xf, yf, zf - 1), grad3dot(PERM[BA + 1], xf - 1, yf, zf - 1), u), lerp(grad3dot(PERM[AB + 1], xf, yf - 1, zf - 1), grad3dot(PERM[BB + 1], xf - 1, yf - 1, zf - 1), u), v), w);
121
+ }
122
+ /**
123
+ * Fractal Brownian Motion using 3D Perlin noise.
124
+ */
125
+ export function fbm3D(x, y, z, octaves = 4, lacunarity = 2, persistence = 0.5) {
126
+ let value = 0;
127
+ let amplitude = 1;
128
+ let frequency = 1;
129
+ let maxAmp = 0;
130
+ for (let i = 0; i < octaves; i++) {
131
+ value += perlinNoise3D(x * frequency, y * frequency, z * frequency) * amplitude;
132
+ maxAmp += amplitude;
133
+ amplitude *= persistence;
134
+ frequency *= lacunarity;
135
+ }
136
+ return value / maxAmp;
137
+ }
138
+ //# sourceMappingURL=noise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noise.js","sourceRoot":"","sources":["../src/noise.ts"],"names":[],"mappings":"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,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;QACpE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QAC1E,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;QACxE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;QACvE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;QACvE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;QACzE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;QAC3E,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;QACzE,GAAG,EAAE,EAAE,EAAE,GAAG,E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"}
package/dist/quat.d.ts ADDED
@@ -0,0 +1,40 @@
1
+ import type { Vec3 } from './vec3.js';
2
+ import type { Mat4 } from './mat4.js';
3
+ /** A Quat is a Float32Array of length 4: [x, y, z, w] */
4
+ export type Quat = Float32Array;
5
+ export declare function create(): Quat;
6
+ export declare function identity(out: Quat): Quat;
7
+ export declare function fromAxisAngle(out: Quat, axis: Vec3, rad: number): Quat;
8
+ export declare function fromEuler(out: Quat, x: number, y: number, z: number): Quat;
9
+ export declare function multiply(out: Quat, a: Quat, b: Quat): Quat;
10
+ export declare function normalize(out: Quat, a: Quat): Quat;
11
+ export declare function slerp(out: Quat, a: Quat, b: Quat, t: number): Quat;
12
+ /**
13
+ * Extract Euler angles (XYZ order) from a quaternion.
14
+ * Returns [x, y, z] in radians.
15
+ */
16
+ export declare function toEuler(out: Vec3, q: Quat): Vec3;
17
+ export declare function invert(out: Quat, a: Quat): Quat;
18
+ export declare function copy(out: Quat, a: Quat): Quat;
19
+ /**
20
+ * Extract rotation quaternion from a Mat4.
21
+ * Handles non-uniform scale by normalizing column vectors.
22
+ */
23
+ export declare function fromMat4(out: Quat, m: Mat4): Quat;
24
+ /**
25
+ * Rotate a quaternion around the X axis by the given angle (radians).
26
+ * Equivalent to multiply(out, fromAxisAngle([1,0,0], rad), a) but without temp allocation.
27
+ */
28
+ export declare function rotateX(out: Quat, a: Quat, rad: number): Quat;
29
+ /**
30
+ * Rotate a quaternion around the Y axis by the given angle (radians).
31
+ * Equivalent to multiply(out, fromAxisAngle([0,1,0], rad), a) but without temp allocation.
32
+ */
33
+ export declare function rotateY(out: Quat, a: Quat, rad: number): Quat;
34
+ /**
35
+ * Rotate a quaternion around the Z axis by the given angle (radians).
36
+ * Equivalent to multiply(out, fromAxisAngle([0,0,1], rad), a) but without temp allocation.
37
+ */
38
+ export declare function rotateZ(out: Quat, a: Quat, rad: number): Quat;
39
+ export declare function toMat4(out: Mat4, q: Quat): Mat4;
40
+ //# sourceMappingURL=quat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quat.d.ts","sourceRoot":"","sources":["../src/quat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,yDAAyD;AACzD,MAAM,MAAM,IAAI,GAAG,YAAY,CAAC;AAEhC,wBAAgB,MAAM,IAAI,IAAI,CAI7B;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAMxC;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAQtE;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAa1E;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAQ1D;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAWlD;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAkClE;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAoBhD;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAS/C;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAM7C;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CA4CjD;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAU7D;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAU7D;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAU7D;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAwB/C"}
package/dist/quat.js ADDED
@@ -0,0 +1,249 @@
1
+ export function create() {
2
+ const out = new Float32Array(4);
3
+ out[3] = 1;
4
+ return out;
5
+ }
6
+ export function identity(out) {
7
+ out[0] = 0;
8
+ out[1] = 0;
9
+ out[2] = 0;
10
+ out[3] = 1;
11
+ return out;
12
+ }
13
+ export function fromAxisAngle(out, axis, rad) {
14
+ const half = rad * 0.5;
15
+ const s = Math.sin(half);
16
+ out[0] = axis[0] * s;
17
+ out[1] = axis[1] * s;
18
+ out[2] = axis[2] * s;
19
+ out[3] = Math.cos(half);
20
+ return out;
21
+ }
22
+ export function fromEuler(out, x, y, z) {
23
+ const halfX = x * 0.5;
24
+ const halfY = y * 0.5;
25
+ const halfZ = z * 0.5;
26
+ const sx = Math.sin(halfX), cx = Math.cos(halfX);
27
+ const sy = Math.sin(halfY), cy = Math.cos(halfY);
28
+ const sz = Math.sin(halfZ), cz = Math.cos(halfZ);
29
+ out[0] = sx * cy * cz - cx * sy * sz;
30
+ out[1] = cx * sy * cz + sx * cy * sz;
31
+ out[2] = cx * cy * sz - sx * sy * cz;
32
+ out[3] = cx * cy * cz + sx * sy * sz;
33
+ return out;
34
+ }
35
+ export function multiply(out, a, b) {
36
+ const ax = a[0], ay = a[1], az = a[2], aw = a[3];
37
+ const bx = b[0], by = b[1], bz = b[2], bw = b[3];
38
+ out[0] = ax * bw + aw * bx + ay * bz - az * by;
39
+ out[1] = ay * bw + aw * by + az * bx - ax * bz;
40
+ out[2] = az * bw + aw * bz + ax * by - ay * bx;
41
+ out[3] = aw * bw - ax * bx - ay * by - az * bz;
42
+ return out;
43
+ }
44
+ export function normalize(out, a) {
45
+ const x = a[0], y = a[1], z = a[2], w = a[3];
46
+ let len = x * x + y * y + z * z + w * w;
47
+ if (len > 0) {
48
+ len = 1 / Math.sqrt(len);
49
+ out[0] = x * len;
50
+ out[1] = y * len;
51
+ out[2] = z * len;
52
+ out[3] = w * len;
53
+ }
54
+ return out;
55
+ }
56
+ export function slerp(out, a, b, t) {
57
+ const ax = a[0], ay = a[1], az = a[2], aw = a[3];
58
+ let bx = b[0], by = b[1], bz = b[2], bw = b[3];
59
+ let cosom = ax * bx + ay * by + az * bz + aw * bw;
60
+ if (cosom < 0) {
61
+ cosom = -cosom;
62
+ bx = -bx;
63
+ by = -by;
64
+ bz = -bz;
65
+ bw = -bw;
66
+ }
67
+ // Clamp to [0, 1] to avoid NaN from floating-point overshoot in Math.acos
68
+ if (cosom > 1)
69
+ cosom = 1;
70
+ let scale0;
71
+ let scale1;
72
+ if (1.0 - cosom > 1e-6) {
73
+ const omega = Math.acos(cosom);
74
+ const sinom = Math.sin(omega);
75
+ if (sinom > 1e-6) {
76
+ scale0 = Math.sin((1.0 - t) * omega) / sinom;
77
+ scale1 = Math.sin(t * omega) / sinom;
78
+ }
79
+ else {
80
+ scale0 = 1.0 - t;
81
+ scale1 = t;
82
+ }
83
+ }
84
+ else {
85
+ scale0 = 1.0 - t;
86
+ scale1 = t;
87
+ }
88
+ out[0] = scale0 * ax + scale1 * bx;
89
+ out[1] = scale0 * ay + scale1 * by;
90
+ out[2] = scale0 * az + scale1 * bz;
91
+ out[3] = scale0 * aw + scale1 * bw;
92
+ return out;
93
+ }
94
+ /**
95
+ * Extract Euler angles (XYZ order) from a quaternion.
96
+ * Returns [x, y, z] in radians.
97
+ */
98
+ export function toEuler(out, q) {
99
+ const x = q[0], y = q[1], z = q[2], w = q[3];
100
+ // Roll (x-axis)
101
+ const sinr_cosp = 2 * (w * x + y * z);
102
+ const cosr_cosp = 1 - 2 * (x * x + y * y);
103
+ out[0] = Math.atan2(sinr_cosp, cosr_cosp);
104
+ // Pitch (y-axis) — clamp to avoid NaN from asin
105
+ const sinp = 2 * (w * y - z * x);
106
+ out[1] = Math.abs(sinp) >= 1
107
+ ? Math.sign(sinp) * (Math.PI / 2)
108
+ : Math.asin(sinp);
109
+ // Yaw (z-axis)
110
+ const siny_cosp = 2 * (w * z + x * y);
111
+ const cosy_cosp = 1 - 2 * (y * y + z * z);
112
+ out[2] = Math.atan2(siny_cosp, cosy_cosp);
113
+ return out;
114
+ }
115
+ export function invert(out, a) {
116
+ const x = a[0], y = a[1], z = a[2], w = a[3];
117
+ const dot = x * x + y * y + z * z + w * w;
118
+ const invDot = dot > 0 ? 1.0 / dot : 0;
119
+ out[0] = -x * invDot;
120
+ out[1] = -y * invDot;
121
+ out[2] = -z * invDot;
122
+ out[3] = w * invDot;
123
+ return out;
124
+ }
125
+ export function copy(out, a) {
126
+ out[0] = a[0];
127
+ out[1] = a[1];
128
+ out[2] = a[2];
129
+ out[3] = a[3];
130
+ return out;
131
+ }
132
+ /**
133
+ * Extract rotation quaternion from a Mat4.
134
+ * Handles non-uniform scale by normalizing column vectors.
135
+ */
136
+ export function fromMat4(out, m) {
137
+ // Column scale lengths
138
+ const sx = Math.sqrt(m[0] * m[0] + m[1] * m[1] + m[2] * m[2]);
139
+ const sy = Math.sqrt(m[4] * m[4] + m[5] * m[5] + m[6] * m[6]);
140
+ const sz = Math.sqrt(m[8] * m[8] + m[9] * m[9] + m[10] * m[10]);
141
+ const isx = sx > 1e-8 ? 1 / sx : 0;
142
+ const isy = sy > 1e-8 ? 1 / sy : 0;
143
+ const isz = sz > 1e-8 ? 1 / sz : 0;
144
+ // Normalized rotation matrix elements
145
+ const m00 = m[0] * isx, m01 = m[1] * isx, m02 = m[2] * isx;
146
+ const m10 = m[4] * isy, m11 = m[5] * isy, m12 = m[6] * isy;
147
+ const m20 = m[8] * isz, m21 = m[9] * isz, m22 = m[10] * isz;
148
+ // Shepperd's method
149
+ const trace = m00 + m11 + m22;
150
+ if (trace > 0) {
151
+ const s = 0.5 / Math.sqrt(trace + 1);
152
+ out[3] = 0.25 / s;
153
+ out[0] = (m12 - m21) * s;
154
+ out[1] = (m20 - m02) * s;
155
+ out[2] = (m01 - m10) * s;
156
+ }
157
+ else if (m00 > m11 && m00 > m22) {
158
+ const s = 2 * Math.sqrt(1 + m00 - m11 - m22);
159
+ out[3] = (m12 - m21) / s;
160
+ out[0] = 0.25 * s;
161
+ out[1] = (m01 + m10) / s;
162
+ out[2] = (m20 + m02) / s;
163
+ }
164
+ else if (m11 > m22) {
165
+ const s = 2 * Math.sqrt(1 + m11 - m00 - m22);
166
+ out[3] = (m20 - m02) / s;
167
+ out[0] = (m01 + m10) / s;
168
+ out[1] = 0.25 * s;
169
+ out[2] = (m12 + m21) / s;
170
+ }
171
+ else {
172
+ const s = 2 * Math.sqrt(1 + m22 - m00 - m11);
173
+ out[3] = (m01 - m10) / s;
174
+ out[0] = (m20 + m02) / s;
175
+ out[1] = (m12 + m21) / s;
176
+ out[2] = 0.25 * s;
177
+ }
178
+ return out;
179
+ }
180
+ /**
181
+ * Rotate a quaternion around the X axis by the given angle (radians).
182
+ * Equivalent to multiply(out, fromAxisAngle([1,0,0], rad), a) but without temp allocation.
183
+ */
184
+ export function rotateX(out, a, rad) {
185
+ const half = rad * 0.5;
186
+ const bx = Math.sin(half);
187
+ const bw = Math.cos(half);
188
+ const ax = a[0], ay = a[1], az = a[2], aw = a[3];
189
+ out[0] = bx * aw + bw * ax;
190
+ out[1] = bw * ay - bx * az;
191
+ out[2] = bw * az + bx * ay;
192
+ out[3] = bw * aw - bx * ax;
193
+ return out;
194
+ }
195
+ /**
196
+ * Rotate a quaternion around the Y axis by the given angle (radians).
197
+ * Equivalent to multiply(out, fromAxisAngle([0,1,0], rad), a) but without temp allocation.
198
+ */
199
+ export function rotateY(out, a, rad) {
200
+ const half = rad * 0.5;
201
+ const by = Math.sin(half);
202
+ const bw = Math.cos(half);
203
+ const ax = a[0], ay = a[1], az = a[2], aw = a[3];
204
+ out[0] = bw * ax + by * az;
205
+ out[1] = by * aw + bw * ay;
206
+ out[2] = bw * az - by * ax;
207
+ out[3] = bw * aw - by * ay;
208
+ return out;
209
+ }
210
+ /**
211
+ * Rotate a quaternion around the Z axis by the given angle (radians).
212
+ * Equivalent to multiply(out, fromAxisAngle([0,0,1], rad), a) but without temp allocation.
213
+ */
214
+ export function rotateZ(out, a, rad) {
215
+ const half = rad * 0.5;
216
+ const bz = Math.sin(half);
217
+ const bw = Math.cos(half);
218
+ const ax = a[0], ay = a[1], az = a[2], aw = a[3];
219
+ out[0] = bw * ax - bz * ay;
220
+ out[1] = bw * ay + bz * ax;
221
+ out[2] = bz * aw + bw * az;
222
+ out[3] = bw * aw - bz * az;
223
+ return out;
224
+ }
225
+ export function toMat4(out, q) {
226
+ const x = q[0], y = q[1], z = q[2], w = q[3];
227
+ const x2 = x + x, y2 = y + y, z2 = z + z;
228
+ const xx = x * x2, xy = x * y2, xz = x * z2;
229
+ const yy = y * y2, yz = y * z2, zz = z * z2;
230
+ const wx = w * x2, wy = w * y2, wz = w * z2;
231
+ out[0] = 1 - (yy + zz);
232
+ out[1] = xy + wz;
233
+ out[2] = xz - wy;
234
+ out[3] = 0;
235
+ out[4] = xy - wz;
236
+ out[5] = 1 - (xx + zz);
237
+ out[6] = yz + wx;
238
+ out[7] = 0;
239
+ out[8] = xz + wy;
240
+ out[9] = yz - wx;
241
+ out[10] = 1 - (xx + yy);
242
+ out[11] = 0;
243
+ out[12] = 0;
244
+ out[13] = 0;
245
+ out[14] = 0;
246
+ out[15] = 1;
247
+ return out;
248
+ }
249
+ //# sourceMappingURL=quat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quat.js","sourceRoot":"","sources":["../src/quat.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,MAAM;IACpB,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IAChC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACX,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAS;IAChC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACX,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACX,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACX,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACX,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAS,EAAE,IAAU,EAAE,GAAW;IAC9D,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;IACvB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC;IACtB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC;IACtB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC;IACtB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;IAClE,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC;IACtB,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC;IACtB,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC;IACtB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAEjD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACrC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACrC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACrC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACrC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAS,EAAE,CAAO,EAAE,CAAO;IAClD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACrD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACrD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC/C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC/C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC/C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC/C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAS,EAAE,CAAO;IAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACjD,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QACjB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QACjB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QACjB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAS,EAAE,CAAO,EAAE,CAAO,EAAE,CAAS;IAC1D,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACrD,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IAEnD,IAAI,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAClD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,KAAK,GAAG,CAAC,KAAK,CAAC;QACf,EAAE,GAAG,CAAC,EAAE,CAAC;QAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACzC,CAAC;IACD,0EAA0E;IAC1E,IAAI,KAAK,GAAG,CAAC;QAAE,KAAK,GAAG,CAAC,CAAC;IAEzB,IAAI,MAAc,CAAC;IACnB,IAAI,MAAc,CAAC;IACnB,IAAI,GAAG,GAAG,KAAK,GAAG,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,KAAK,GAAG,IAAI,EAAE,CAAC;YACjB,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;YAC7C,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC;YACjB,MAAM,GAAG,CAAC,CAAC;QACb,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC;QACjB,MAAM,GAAG,CAAC,CAAC;IACb,CAAC;IAED,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC;IACnC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC;IACnC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC;IACnC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC;IACnC,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,GAAS,EAAE,CAAO;IACxC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IAEjD,gBAAgB;IAChB,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAE1C,gDAAgD;IAChD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpB,eAAe;IACf,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAE1C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,GAAS,EAAE,CAAO;IACvC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACjD,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;IACrB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;IACrB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;IACrB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;IACpB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAS,EAAE,CAAO;IACrC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACf,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACf,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACf,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACf,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAS,EAAE,CAAO;IACzC,uBAAuB;IACvB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IACpE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IACpE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,EAAE,CAAE,GAAG,CAAC,CAAC,EAAE,CAAE,CAAC,CAAC;IAEtE,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnC,sCAAsC;IACtC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC;IAC9D,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC;IAC9D,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAE,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,CAAE,GAAG,GAAG,CAAC;IAE/D,oBAAoB;IACpB,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAC9B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACrC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QAClB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;SAAM,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAC7C,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QAClB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;SAAM,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAC7C,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QAClB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAC7C,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,GAAS,EAAE,CAAO,EAAE,GAAW;IACrD,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;IACvB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACrD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3B,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,GAAS,EAAE,CAAO,EAAE,GAAW;IACrD,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;IACvB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACrD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3B,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,GAAS,EAAE,CAAO,EAAE,GAAW;IACrD,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;IACvB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACrD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC3B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,GAAS,EAAE,CAAO;IACvC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACjD,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;IAC5C,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;IAC5C,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;IAE5C,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACvB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACjB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACjB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACX,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACjB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACvB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACjB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACX,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACjB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACjB,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACxB,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACZ,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACZ,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACZ,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACZ,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACZ,OAAO,GAAG,CAAC;AACb,CAAC"}
package/dist/ray.d.ts ADDED
@@ -0,0 +1,31 @@
1
+ import type { Vec3 } from './vec3.js';
2
+ import type { Mat4 } from './mat4.js';
3
+ export interface Ray {
4
+ origin: Vec3;
5
+ direction: Vec3;
6
+ }
7
+ export declare function create(): Ray;
8
+ /**
9
+ * Build a ray from screen pixel coordinates using an inverse view-projection matrix.
10
+ * sx, sy are in pixels; vpW, vpH are viewport dimensions.
11
+ */
12
+ export declare function fromScreenCoords(out: Ray, sx: number, sy: number, vpW: number, vpH: number, invVP: Mat4): Ray;
13
+ /**
14
+ * Ray-sphere intersection. Returns t >= 0 if hit, -1 if miss.
15
+ */
16
+ export declare function intersectSphere(ray: Ray, center: Vec3, radius: number): number;
17
+ /**
18
+ * Ray-plane intersection. Plane defined as dot(normal, P) = d.
19
+ * Returns t >= 0 if hit, -1 if parallel or behind.
20
+ */
21
+ export declare function intersectPlane(ray: Ray, normal: Vec3, d: number): number;
22
+ /**
23
+ * Ray-triangle intersection using Möller–Trumbore algorithm.
24
+ * Returns t >= 0 if hit, -1 if miss.
25
+ */
26
+ export declare function intersectTriangle(ray: Ray, v0: Vec3, v1: Vec3, v2: Vec3): number;
27
+ /**
28
+ * Compute point on ray at parameter t: out = origin + t * direction.
29
+ */
30
+ export declare function pointOnRay(out: Vec3, ray: Ray, t: number): Vec3;
31
+ //# sourceMappingURL=ray.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ray.d.ts","sourceRoot":"","sources":["../src/ray.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,WAAW,GAAG;IAClB,MAAM,EAAE,IAAI,CAAC;IACb,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,wBAAgB,MAAM,IAAI,GAAG,CAK5B;AAgBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,IAAI,GACV,GAAG,CAkCL;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,MAAM,GACb,MAAM,CAwBR;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,IAAI,EACZ,CAAC,EAAE,MAAM,GACR,MAAM,CAMR;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,GACP,MAAM,CAgCR;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAK/D"}
package/dist/ray.js ADDED
@@ -0,0 +1,129 @@
1
+ import * as V3 from './vec3.js';
2
+ export function create() {
3
+ return {
4
+ origin: new Float32Array(3),
5
+ direction: V3.fromValues(0, 0, -1),
6
+ };
7
+ }
8
+ // Scratch vectors (pre-allocated, no heap alloc per call)
9
+ const _ndcNear = V3.create();
10
+ const _ndcFar = V3.create();
11
+ const _clipNear = new Float32Array(4);
12
+ const _clipFar = new Float32Array(4);
13
+ function transformMat4Vec4(out, v, m) {
14
+ const x = v[0], y = v[1], z = v[2], w = v[3];
15
+ out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;
16
+ out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;
17
+ out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;
18
+ out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;
19
+ }
20
+ /**
21
+ * Build a ray from screen pixel coordinates using an inverse view-projection matrix.
22
+ * sx, sy are in pixels; vpW, vpH are viewport dimensions.
23
+ */
24
+ export function fromScreenCoords(out, sx, sy, vpW, vpH, invVP) {
25
+ // Pixel -> NDC [-1,1]
26
+ const ndcX = (sx / vpW) * 2 - 1;
27
+ const ndcY = 1 - (sy / vpH) * 2; // flip Y
28
+ // Near point in clip space (z = -1 for WebGPU NDC is 0, but we use -1..1 convention with invVP)
29
+ _clipNear[0] = ndcX;
30
+ _clipNear[1] = ndcY;
31
+ _clipNear[2] = 0; // WebGPU near plane = 0
32
+ _clipNear[3] = 1;
33
+ // Far point in clip space
34
+ _clipFar[0] = ndcX;
35
+ _clipFar[1] = ndcY;
36
+ _clipFar[2] = 1; // WebGPU far plane = 1
37
+ _clipFar[3] = 1;
38
+ // Unproject
39
+ transformMat4Vec4(_clipNear, _clipNear, invVP);
40
+ transformMat4Vec4(_clipFar, _clipFar, invVP);
41
+ // Perspective divide
42
+ const wNear = _clipNear[3];
43
+ V3.set(_ndcNear, _clipNear[0] / wNear, _clipNear[1] / wNear, _clipNear[2] / wNear);
44
+ const wFar = _clipFar[3];
45
+ V3.set(_ndcFar, _clipFar[0] / wFar, _clipFar[1] / wFar, _clipFar[2] / wFar);
46
+ // Origin = near point, direction = normalize(far - near)
47
+ V3.copy(out.origin, _ndcNear);
48
+ V3.sub(out.direction, _ndcFar, _ndcNear);
49
+ V3.normalize(out.direction, out.direction);
50
+ return out;
51
+ }
52
+ /**
53
+ * Ray-sphere intersection. Returns t >= 0 if hit, -1 if miss.
54
+ */
55
+ export function intersectSphere(ray, center, radius) {
56
+ const ocX = ray.origin[0] - center[0];
57
+ const ocY = ray.origin[1] - center[1];
58
+ const ocZ = ray.origin[2] - center[2];
59
+ const dX = ray.direction[0];
60
+ const dY = ray.direction[1];
61
+ const dZ = ray.direction[2];
62
+ const a = dX * dX + dY * dY + dZ * dZ;
63
+ const b = 2 * (ocX * dX + ocY * dY + ocZ * dZ);
64
+ const c = ocX * ocX + ocY * ocY + ocZ * ocZ - radius * radius;
65
+ const discriminant = b * b - 4 * a * c;
66
+ if (discriminant < 0)
67
+ return -1;
68
+ const sqrtD = Math.sqrt(discriminant);
69
+ const t1 = (-b - sqrtD) / (2 * a);
70
+ if (t1 >= 0)
71
+ return t1;
72
+ const t2 = (-b + sqrtD) / (2 * a);
73
+ if (t2 >= 0)
74
+ return t2;
75
+ return -1;
76
+ }
77
+ /**
78
+ * Ray-plane intersection. Plane defined as dot(normal, P) = d.
79
+ * Returns t >= 0 if hit, -1 if parallel or behind.
80
+ */
81
+ export function intersectPlane(ray, normal, d) {
82
+ const denom = V3.dot(ray.direction, normal);
83
+ if (Math.abs(denom) < 1e-8)
84
+ return -1; // parallel
85
+ const t = (d - V3.dot(ray.origin, normal)) / denom;
86
+ return t >= 0 ? t : -1;
87
+ }
88
+ /**
89
+ * Ray-triangle intersection using Möller–Trumbore algorithm.
90
+ * Returns t >= 0 if hit, -1 if miss.
91
+ */
92
+ export function intersectTriangle(ray, v0, v1, v2) {
93
+ const e1x = v1[0] - v0[0], e1y = v1[1] - v0[1], e1z = v1[2] - v0[2];
94
+ const e2x = v2[0] - v0[0], e2y = v2[1] - v0[1], e2z = v2[2] - v0[2];
95
+ const dx = ray.direction[0], dy = ray.direction[1], dz = ray.direction[2];
96
+ // h = d × e2
97
+ const hx = dy * e2z - dz * e2y;
98
+ const hy = dz * e2x - dx * e2z;
99
+ const hz = dx * e2y - dy * e2x;
100
+ const a = e1x * hx + e1y * hy + e1z * hz;
101
+ if (a > -1e-8 && a < 1e-8)
102
+ return -1; // parallel
103
+ const f = 1 / a;
104
+ const sx = ray.origin[0] - v0[0];
105
+ const sy = ray.origin[1] - v0[1];
106
+ const sz = ray.origin[2] - v0[2];
107
+ const u = f * (sx * hx + sy * hy + sz * hz);
108
+ if (u < 0 || u > 1)
109
+ return -1;
110
+ // q = s × e1
111
+ const qx = sy * e1z - sz * e1y;
112
+ const qy = sz * e1x - sx * e1z;
113
+ const qz = sx * e1y - sy * e1x;
114
+ const v = f * (dx * qx + dy * qy + dz * qz);
115
+ if (v < 0 || u + v > 1)
116
+ return -1;
117
+ const t = f * (e2x * qx + e2y * qy + e2z * qz);
118
+ return t >= 0 ? t : -1;
119
+ }
120
+ /**
121
+ * Compute point on ray at parameter t: out = origin + t * direction.
122
+ */
123
+ export function pointOnRay(out, ray, t) {
124
+ out[0] = ray.origin[0] + t * ray.direction[0];
125
+ out[1] = ray.origin[1] + t * ray.direction[1];
126
+ out[2] = ray.origin[2] + t * ray.direction[2];
127
+ return out;
128
+ }
129
+ //# sourceMappingURL=ray.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ray.js","sourceRoot":"","sources":["../src/ray.ts"],"names":[],"mappings":"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"}