UNPKG

@needle-tools/engine

Version:

Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in

1,420 lines (1,419 loc) • 4.8 MB
var jj = Object.defineProperty; var Jj = (s, e, t) => e in s ? jj(s, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[e] = t; var f = (s, e, t) => (Jj(s, typeof e != "symbol" ? e + "" : e, t), t), SM = (s, e, t) => { if (!e.has(s)) throw TypeError("Cannot " + t); }; var bi = (s, e, t) => (SM(s, e, "read from private field"), t ? t.call(s) : e.get(s)), Ko = (s, e, t) => { if (e.has(s)) throw TypeError("Cannot add the same private member more than once"); e instanceof WeakSet ? e.add(s) : e.set(s, t); }, pl = (s, e, t, i) => (SM(s, e, "write to private field"), i ? i.call(s, t) : e.set(s, t), t); var hf = (s, e, t) => (SM(s, e, "access private method"), t); /** * @license * Copyright 2010-2023 Three.js Authors * SPDX-License-Identifier: MIT */ const su = "162", Wf = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 }, Hf = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 }, k5 = 0, _L = 1, D5 = 2, qj = 3, $j = 0, ck = 1, hk = 2, cc = 3, Fn = 0, Sn = 1, Ci = 2, En = 0, _d = 1, kp = 2, wL = 3, CL = 4, uk = 5, ud = 100, F5 = 101, G5 = 102, SL = 103, ZS = 104, O5 = 200, N5 = 201, U5 = 202, z5 = 203, YS = 204, KS = 205, Q5 = 206, V5 = 207, X5 = 208, W5 = 209, H5 = 210, Z5 = 211, Y5 = 212, K5 = 213, j5 = 214, dk = 0, pE = 1, cv = 2, Dp = 3, RA = 4, mE = 5, gE = 6, ox = 7, ax = 0, J5 = 1, q5 = 2, yo = 0, $A = 1, lx = 2, $5 = 3, cx = 4, eX = 5, e0 = 6, Fp = 7, EL = "attached", tX = "detached", AE = 300, ru = 301, Dd = 302, bo = 303, BA = 304, t0 = 306, _o = 1e3, ps = 1001, ou = 1002, Ut = 1003, LA = 1004, e8 = 1004, Dh = 1005, t8 = 1005, Gt = 1006, gp = 1007, i8 = 1007, go = 1008, n8 = 1008, vi = 1009, jS = 1010, fk = 1011, hx = 1012, Ap = 1013, Nr = 1014, ki = 1015, Dn = 1016, pk = 1017, mk = 1018, qh = 1020, iX = 1021, ui = 1023, yE = 1024, nX = 1025, wd = 1026, Fd = 1027, Ja = 1028, bE = 1029, Wh = 1030, ux = 1031, PA = 1033, Cb = 33776, aS = 33777, lS = 33778, Sb = 33779, JS = 35840, IL = 35841, qS = 35842, ML = 35843, vE = 36196, $S = 37492, e1 = 37496, t1 = 37808, TL = 37809, RL = 37810, BL = 37811, hv = 37812, LL = 37813, PL = 37814, kL = 37815, DL = 37816, FL = 37817, GL = 37818, OL = 37819, NL = 37820, UL = 37821, Eb = 36492, zL = 36494, QL = 36495, sX = 36283, VL = 36284, XL = 36285, WL = 36286, uv = 2200, gk = 2201, rX = 2202, Gd = 2300, Gc = 2301, cS = 2302, sp = 2400, rp = 2401, dv = 2402, xE = 2500, Ak = 2501, oX = 0, yk = 1, i1 = 2, aX = 3e3, HL = 3001, yr = 3200, _E = 3201, Vd = 0, lX = 1, Fr = "", bt = "srgb", Fi = "srgb-linear", dx = "display-p3", i0 = "display-p3-linear", fv = "linear", en = "srgb", pv = "rec709", mv = "p3", cX = 0, od = 7680, hX = 7681, uX = 7682, dX = 7683, fX = 34055, pX = 34056, mX = 5386, ZL = 512, gX = 513, AX = 514, yX = 515, bX = 516, vX = 517, xX = 518, n1 = 519, _X = 512, wX = 513, CX = 514, bk = 515, SX = 516, EX = 517, IX = 518, MX = 519, gv = 35044, kr = 35048, s8 = 35040, r8 = 35045, o8 = 35049, a8 = 35041, l8 = 35046, c8 = 35050, h8 = 35042, u8 = "100", s1 = "300 es", r1 = 1035, wc = 2e3, Av = 2001; let Ys = class { addEventListener(e, t) { this._listeners === void 0 && (this._listeners = {}); const i = this._listeners; i[e] === void 0 && (i[e] = []), i[e].indexOf(t) === -1 && i[e].push(t); } hasEventListener(e, t) { if (this._listeners === void 0) return !1; const i = this._listeners; return i[e] !== void 0 && i[e].indexOf(t) !== -1; } removeEventListener(e, t) { if (this._listeners === void 0) return; const n = this._listeners[e]; if (n !== void 0) { const r = n.indexOf(t); r !== -1 && n.splice(r, 1); } } dispatchEvent(e) { if (this._listeners === void 0) return; const i = this._listeners[e.type]; if (i !== void 0) { e.target = this; const n = i.slice(0); for (let r = 0, o = n.length; r < o; r++) n[r].call(this, e); e.target = null; } } }; const wr = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0a", "0b", "0c", "0d", "0e", "0f", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1a", "1b", "1c", "1d", "1e", "1f", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2a", "2b", "2c", "2d", "2e", "2f", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3a", "3b", "3c", "3d", "3e", "3f", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4a", "4b", "4c", "4d", "4e", "4f", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5a", "5b", "5c", "5d", "5e", "5f", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6a", "6b", "6c", "6d", "6e", "6f", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7a", "7b", "7c", "7d", "7e", "7f", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8a", "8b", "8c", "8d", "8e", "8f", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9a", "9b", "9c", "9d", "9e", "9f", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "aa", "ab", "ac", "ad", "ae", "af", "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7", "b8", "b9", "ba", "bb", "bc", "bd", "be", "bf", "c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "ca", "cb", "cc", "cd", "ce", "cf", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "da", "db", "dc", "dd", "de", "df", "e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7", "e8", "e9", "ea", "eb", "ec", "ed", "ee", "ef", "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "fa", "fb", "fc", "fd", "fe", "ff"]; let QG = 1234567; const yp = Math.PI / 180, kA = 180 / Math.PI; function Aa() { const s = Math.random() * 4294967295 | 0, e = Math.random() * 4294967295 | 0, t = Math.random() * 4294967295 | 0, i = Math.random() * 4294967295 | 0; return (wr[s & 255] + wr[s >> 8 & 255] + wr[s >> 16 & 255] + wr[s >> 24 & 255] + "-" + wr[e & 255] + wr[e >> 8 & 255] + "-" + wr[e >> 16 & 15 | 64] + wr[e >> 24 & 255] + "-" + wr[t & 63 | 128] + wr[t >> 8 & 255] + "-" + wr[t >> 16 & 255] + wr[t >> 24 & 255] + wr[i & 255] + wr[i >> 8 & 255] + wr[i >> 16 & 255] + wr[i >> 24 & 255]).toLowerCase(); } function Xn(s, e, t) { return Math.max(e, Math.min(t, s)); } function vk(s, e) { return (s % e + e) % e; } function d8(s, e, t, i, n) { return i + (s - e) * (n - i) / (t - e); } function f8(s, e, t) { return s !== e ? (t - s) / (e - s) : 0; } function Ib(s, e, t) { return (1 - t) * s + t * e; } function p8(s, e, t, i) { return Ib(s, e, 1 - Math.exp(-t * i)); } function m8(s, e = 1) { return e - Math.abs(vk(s, e * 2) - e); } function g8(s, e, t) { return s <= e ? 0 : s >= t ? 1 : (s = (s - e) / (t - e), s * s * (3 - 2 * s)); } function A8(s, e, t) { return s <= e ? 0 : s >= t ? 1 : (s = (s - e) / (t - e), s * s * s * (s * (s * 6 - 15) + 10)); } function y8(s, e) { return s + Math.floor(Math.random() * (e - s + 1)); } function b8(s, e) { return s + Math.random() * (e - s); } function v8(s) { return s * (0.5 - Math.random()); } function x8(s) { s !== void 0 && (QG = s); let e = QG += 1831565813; return e = Math.imul(e ^ e >>> 15, e | 1), e ^= e + Math.imul(e ^ e >>> 7, e | 61), ((e ^ e >>> 14) >>> 0) / 4294967296; } function _8(s) { return s * yp; } function w8(s) { return s * kA; } function YL(s) { return (s & s - 1) === 0 && s !== 0; } function C8(s) { return Math.pow(2, Math.ceil(Math.log(s) / Math.LN2)); } function o1(s) { return Math.pow(2, Math.floor(Math.log(s) / Math.LN2)); } function S8(s, e, t, i, n) { const r = Math.cos, o = Math.sin, a = r(t / 2), l = o(t / 2), c = r((e + i) / 2), h = o((e + i) / 2), u = r((e - i) / 2), d = o((e - i) / 2), p = r((i - e) / 2), m = o((i - e) / 2); switch (n) { case "XYX": s.set(a * h, l * u, l * d, a * c); break; case "YZY": s.set(l * d, a * h, l * u, a * c); break; case "ZXZ": s.set(l * u, l * d, a * h, a * c); break; case "XZX": s.set(a * h, l * m, l * p, a * c); break; case "YXY": s.set(l * p, a * h, l * m, a * c); break; case "ZYZ": s.set(l * m, l * p, a * h, a * c); break; default: console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: " + n); } } function po(s, e) { switch (e.constructor) { case Float32Array: return s; case Uint32Array: return s / 4294967295; case Uint16Array: return s / 65535; case Uint8Array: return s / 255; case Int32Array: return Math.max(s / 2147483647, -1); case Int16Array: return Math.max(s / 32767, -1); case Int8Array: return Math.max(s / 127, -1); default: throw new Error("Invalid component type."); } } function ti(s, e) { switch (e.constructor) { case Float32Array: return s; case Uint32Array: return Math.round(s * 4294967295); case Uint16Array: return Math.round(s * 65535); case Uint8Array: return Math.round(s * 255); case Int32Array: return Math.round(s * 2147483647); case Int16Array: return Math.round(s * 32767); case Int8Array: return Math.round(s * 127); default: throw new Error("Invalid component type."); } } const hi = { DEG2RAD: yp, RAD2DEG: kA, generateUUID: Aa, clamp: Xn, euclideanModulo: vk, mapLinear: d8, inverseLerp: f8, lerp: Ib, damp: p8, pingpong: m8, smoothstep: g8, smootherstep: A8, randInt: y8, randFloat: b8, randFloatSpread: v8, seededRandom: x8, degToRad: _8, radToDeg: w8, isPowerOfTwo: YL, ceilPowerOfTwo: C8, floorPowerOfTwo: o1, setQuaternionFromProperEuler: S8, normalize: ti, denormalize: po }; let ee = class TX { constructor(e = 0, t = 0) { TX.prototype.isVector2 = !0, this.x = e, this.y = t; } get width() { return this.x; } set width(e) { this.x = e; } get height() { return this.y; } set height(e) { this.y = e; } set(e, t) { return this.x = e, this.y = t, this; } setScalar(e) { return this.x = e, this.y = e, this; } setX(e) { return this.x = e, this; } setY(e) { return this.y = e, this; } setComponent(e, t) { switch (e) { case 0: this.x = t; break; case 1: this.y = t; break; default: throw new Error("index is out of range: " + e); } return this; } getComponent(e) { switch (e) { case 0: return this.x; case 1: return this.y; default: throw new Error("index is out of range: " + e); } } clone() { return new this.constructor(this.x, this.y); } copy(e) { return this.x = e.x, this.y = e.y, this; } add(e) { return this.x += e.x, this.y += e.y, this; } addScalar(e) { return this.x += e, this.y += e, this; } addVectors(e, t) { return this.x = e.x + t.x, this.y = e.y + t.y, this; } addScaledVector(e, t) { return this.x += e.x * t, this.y += e.y * t, this; } sub(e) { return this.x -= e.x, this.y -= e.y, this; } subScalar(e) { return this.x -= e, this.y -= e, this; } subVectors(e, t) { return this.x = e.x - t.x, this.y = e.y - t.y, this; } multiply(e) { return this.x *= e.x, this.y *= e.y, this; } multiplyScalar(e) { return this.x *= e, this.y *= e, this; } divide(e) { return this.x /= e.x, this.y /= e.y, this; } divideScalar(e) { return this.multiplyScalar(1 / e); } applyMatrix3(e) { const t = this.x, i = this.y, n = e.elements; return this.x = n[0] * t + n[3] * i + n[6], this.y = n[1] * t + n[4] * i + n[7], this; } min(e) { return this.x = Math.min(this.x, e.x), this.y = Math.min(this.y, e.y), this; } max(e) { return this.x = Math.max(this.x, e.x), this.y = Math.max(this.y, e.y), this; } clamp(e, t) { return this.x = Math.max(e.x, Math.min(t.x, this.x)), this.y = Math.max(e.y, Math.min(t.y, this.y)), this; } clampScalar(e, t) { return this.x = Math.max(e, Math.min(t, this.x)), this.y = Math.max(e, Math.min(t, this.y)), this; } clampLength(e, t) { const i = this.length(); return this.divideScalar(i || 1).multiplyScalar(Math.max(e, Math.min(t, i))); } floor() { return this.x = Math.floor(this.x), this.y = Math.floor(this.y), this; } ceil() { return this.x = Math.ceil(this.x), this.y = Math.ceil(this.y), this; } round() { return this.x = Math.round(this.x), this.y = Math.round(this.y), this; } roundToZero() { return this.x = Math.trunc(this.x), this.y = Math.trunc(this.y), this; } negate() { return this.x = -this.x, this.y = -this.y, this; } dot(e) { return this.x * e.x + this.y * e.y; } cross(e) { return this.x * e.y - this.y * e.x; } lengthSq() { return this.x * this.x + this.y * this.y; } length() { return Math.sqrt(this.x * this.x + this.y * this.y); } manhattanLength() { return Math.abs(this.x) + Math.abs(this.y); } normalize() { return this.divideScalar(this.length() || 1); } angle() { return Math.atan2(-this.y, -this.x) + Math.PI; } angleTo(e) { const t = Math.sqrt(this.lengthSq() * e.lengthSq()); if (t === 0) return Math.PI / 2; const i = this.dot(e) / t; return Math.acos(Xn(i, -1, 1)); } distanceTo(e) { return Math.sqrt(this.distanceToSquared(e)); } distanceToSquared(e) { const t = this.x - e.x, i = this.y - e.y; return t * t + i * i; } manhattanDistanceTo(e) { return Math.abs(this.x - e.x) + Math.abs(this.y - e.y); } setLength(e) { return this.normalize().multiplyScalar(e); } lerp(e, t) { return this.x += (e.x - this.x) * t, this.y += (e.y - this.y) * t, this; } lerpVectors(e, t, i) { return this.x = e.x + (t.x - e.x) * i, this.y = e.y + (t.y - e.y) * i, this; } equals(e) { return e.x === this.x && e.y === this.y; } fromArray(e, t = 0) { return this.x = e[t], this.y = e[t + 1], this; } toArray(e = [], t = 0) { return e[t] = this.x, e[t + 1] = this.y, e; } fromBufferAttribute(e, t) { return this.x = e.getX(t), this.y = e.getY(t), this; } rotateAround(e, t) { const i = Math.cos(t), n = Math.sin(t), r = this.x - e.x, o = this.y - e.y; return this.x = r * i - o * n + e.x, this.y = r * n + o * i + e.y, this; } random() { return this.x = Math.random(), this.y = Math.random(), this; } *[Symbol.iterator]() { yield this.x, yield this.y; } }, Nt = class RX { constructor(e, t, i, n, r, o, a, l, c) { RX.prototype.isMatrix3 = !0, this.elements = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ], e !== void 0 && this.set(e, t, i, n, r, o, a, l, c); } set(e, t, i, n, r, o, a, l, c) { const h = this.elements; return h[0] = e, h[1] = n, h[2] = a, h[3] = t, h[4] = r, h[5] = l, h[6] = i, h[7] = o, h[8] = c, this; } identity() { return this.set( 1, 0, 0, 0, 1, 0, 0, 0, 1 ), this; } copy(e) { const t = this.elements, i = e.elements; return t[0] = i[0], t[1] = i[1], t[2] = i[2], t[3] = i[3], t[4] = i[4], t[5] = i[5], t[6] = i[6], t[7] = i[7], t[8] = i[8], this; } extractBasis(e, t, i) { return e.setFromMatrix3Column(this, 0), t.setFromMatrix3Column(this, 1), i.setFromMatrix3Column(this, 2), this; } setFromMatrix4(e) { const t = e.elements; return this.set( t[0], t[4], t[8], t[1], t[5], t[9], t[2], t[6], t[10] ), this; } multiply(e) { return this.multiplyMatrices(this, e); } premultiply(e) { return this.multiplyMatrices(e, this); } multiplyMatrices(e, t) { const i = e.elements, n = t.elements, r = this.elements, o = i[0], a = i[3], l = i[6], c = i[1], h = i[4], u = i[7], d = i[2], p = i[5], m = i[8], g = n[0], A = n[3], y = n[6], v = n[1], b = n[4], x = n[7], _ = n[2], w = n[5], S = n[8]; return r[0] = o * g + a * v + l * _, r[3] = o * A + a * b + l * w, r[6] = o * y + a * x + l * S, r[1] = c * g + h * v + u * _, r[4] = c * A + h * b + u * w, r[7] = c * y + h * x + u * S, r[2] = d * g + p * v + m * _, r[5] = d * A + p * b + m * w, r[8] = d * y + p * x + m * S, this; } multiplyScalar(e) { const t = this.elements; return t[0] *= e, t[3] *= e, t[6] *= e, t[1] *= e, t[4] *= e, t[7] *= e, t[2] *= e, t[5] *= e, t[8] *= e, this; } determinant() { const e = this.elements, t = e[0], i = e[1], n = e[2], r = e[3], o = e[4], a = e[5], l = e[6], c = e[7], h = e[8]; return t * o * h - t * a * c - i * r * h + i * a * l + n * r * c - n * o * l; } invert() { const e = this.elements, t = e[0], i = e[1], n = e[2], r = e[3], o = e[4], a = e[5], l = e[6], c = e[7], h = e[8], u = h * o - a * c, d = a * l - h * r, p = c * r - o * l, m = t * u + i * d + n * p; if (m === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0); const g = 1 / m; return e[0] = u * g, e[1] = (n * c - h * i) * g, e[2] = (a * i - n * o) * g, e[3] = d * g, e[4] = (h * t - n * l) * g, e[5] = (n * r - a * t) * g, e[6] = p * g, e[7] = (i * l - c * t) * g, e[8] = (o * t - i * r) * g, this; } transpose() { let e; const t = this.elements; return e = t[1], t[1] = t[3], t[3] = e, e = t[2], t[2] = t[6], t[6] = e, e = t[5], t[5] = t[7], t[7] = e, this; } getNormalMatrix(e) { return this.setFromMatrix4(e).invert().transpose(); } transposeIntoArray(e) { const t = this.elements; return e[0] = t[0], e[1] = t[3], e[2] = t[6], e[3] = t[1], e[4] = t[4], e[5] = t[7], e[6] = t[2], e[7] = t[5], e[8] = t[8], this; } setUvTransform(e, t, i, n, r, o, a) { const l = Math.cos(r), c = Math.sin(r); return this.set( i * l, i * c, -i * (l * o + c * a) + o + e, -n * c, n * l, -n * (-c * o + l * a) + a + t, 0, 0, 1 ), this; } // scale(e, t) { return this.premultiply(EM.makeScale(e, t)), this; } rotate(e) { return this.premultiply(EM.makeRotation(-e)), this; } translate(e, t) { return this.premultiply(EM.makeTranslation(e, t)), this; } // for 2D Transforms makeTranslation(e, t) { return e.isVector2 ? this.set( 1, 0, e.x, 0, 1, e.y, 0, 0, 1 ) : this.set( 1, 0, e, 0, 1, t, 0, 0, 1 ), this; } makeRotation(e) { const t = Math.cos(e), i = Math.sin(e); return this.set( t, -i, 0, i, t, 0, 0, 0, 1 ), this; } makeScale(e, t) { return this.set( e, 0, 0, 0, t, 0, 0, 0, 1 ), this; } // equals(e) { const t = this.elements, i = e.elements; for (let n = 0; n < 9; n++) if (t[n] !== i[n]) return !1; return !0; } fromArray(e, t = 0) { for (let i = 0; i < 9; i++) this.elements[i] = e[i + t]; return this; } toArray(e = [], t = 0) { const i = this.elements; return e[t] = i[0], e[t + 1] = i[1], e[t + 2] = i[2], e[t + 3] = i[3], e[t + 4] = i[4], e[t + 5] = i[5], e[t + 6] = i[6], e[t + 7] = i[7], e[t + 8] = i[8], e; } clone() { return new this.constructor().fromArray(this.elements); } }; const EM = /* @__PURE__ */ new Nt(); function BX(s) { for (let e = s.length - 1; e >= 0; --e) if (s[e] >= 65535) return !0; return !1; } const E8 = { Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array }; function Hg(s, e) { return new E8[s](e); } function yv(s) { return document.createElementNS("http://www.w3.org/1999/xhtml", s); } function LX() { const s = yv("canvas"); return s.style.display = "block", s; } const VG = {}; function PX(s) { s in VG || (VG[s] = !0, console.warn(s)); } const XG = /* @__PURE__ */ new Nt().set( 0.8224621, 0.177538, 0, 0.0331941, 0.9668058, 0, 0.0170827, 0.0723974, 0.9105199 ), WG = /* @__PURE__ */ new Nt().set( 1.2249401, -0.2249404, 0, -0.0420569, 1.0420571, 0, -0.0196376, -0.0786361, 1.0982735 ), d_ = { [Fi]: { transfer: fv, primaries: pv, toReference: (s) => s, fromReference: (s) => s }, [bt]: { transfer: en, primaries: pv, toReference: (s) => s.convertSRGBToLinear(), fromReference: (s) => s.convertLinearToSRGB() }, [i0]: { transfer: fv, primaries: mv, toReference: (s) => s.applyMatrix3(WG), fromReference: (s) => s.applyMatrix3(XG) }, [dx]: { transfer: en, primaries: mv, toReference: (s) => s.convertSRGBToLinear().applyMatrix3(WG), fromReference: (s) => s.applyMatrix3(XG).convertLinearToSRGB() } }, I8 = /* @__PURE__ */ new Set([Fi, i0]), Bi = { enabled: !0, _workingColorSpace: Fi, get workingColorSpace() { return this._workingColorSpace; }, set workingColorSpace(s) { if (!I8.has(s)) throw new Error(`Unsupported working color space, "${s}".`); this._workingColorSpace = s; }, convert: function(s, e, t) { if (this.enabled === !1 || e === t || !e || !t) return s; const i = d_[e].toReference, n = d_[t].fromReference; return n(i(s)); }, fromWorkingColorSpace: function(s, e) { return this.convert(s, this._workingColorSpace, e); }, toWorkingColorSpace: function(s, e) { return this.convert(s, e, this._workingColorSpace); }, getPrimaries: function(s) { return d_[s].primaries; }, getTransfer: function(s) { return s === Fr ? fv : d_[s].transfer; } }; function hA(s) { return s < 0.04045 ? s * 0.0773993808 : Math.pow(s * 0.9478672986 + 0.0521327014, 2.4); } function IM(s) { return s < 31308e-7 ? s * 12.92 : 1.055 * Math.pow(s, 0.41666) - 0.055; } let _m, xk = class { static getDataURL(e) { if (/^data:/i.test(e.src) || typeof HTMLCanvasElement > "u") return e.src; let t; if (e instanceof HTMLCanvasElement) t = e; else { _m === void 0 && (_m = yv("canvas")), _m.width = e.width, _m.height = e.height; const i = _m.getContext("2d"); e instanceof ImageData ? i.putImageData(e, 0, 0) : i.drawImage(e, 0, 0, e.width, e.height), t = _m; } return t.width > 2048 || t.height > 2048 ? (console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons", e), t.toDataURL("image/jpeg", 0.6)) : t.toDataURL("image/png"); } static sRGBToLinear(e) { if (typeof HTMLImageElement < "u" && e instanceof HTMLImageElement || typeof HTMLCanvasElement < "u" && e instanceof HTMLCanvasElement || typeof ImageBitmap < "u" && e instanceof ImageBitmap) { const t = yv("canvas"); t.width = e.width, t.height = e.height; const i = t.getContext("2d"); i.drawImage(e, 0, 0, e.width, e.height); const n = i.getImageData(0, 0, e.width, e.height), r = n.data; for (let o = 0; o < r.length; o++) r[o] = hA(r[o] / 255) * 255; return i.putImageData(n, 0, 0), t; } else if (e.data) { const t = e.data.slice(0); for (let i = 0; i < t.length; i++) t instanceof Uint8Array || t instanceof Uint8ClampedArray ? t[i] = Math.floor(hA(t[i] / 255) * 255) : t[i] = hA(t[i]); return { data: t, width: e.width, height: e.height }; } else return console.warn("THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied."), e; } }, M8 = 0, Hh = class { constructor(e = null) { this.isSource = !0, Object.defineProperty(this, "id", { value: M8++ }), this.uuid = Aa(), this.data = e, this.dataReady = !0, this.version = 0; } set needsUpdate(e) { e === !0 && this.version++; } toJSON(e) { const t = e === void 0 || typeof e == "string"; if (!t && e.images[this.uuid] !== void 0) return e.images[this.uuid]; const i = { uuid: this.uuid, url: "" }, n = this.data; if (n !== null) { let r; if (Array.isArray(n)) { r = []; for (let o = 0, a = n.length; o < a; o++) n[o].isDataTexture ? r.push(MM(n[o].image)) : r.push(MM(n[o])); } else r = MM(n); i.url = r; } return t || (e.images[this.uuid] = i), i; } }; function MM(s) { return typeof HTMLImageElement < "u" && s instanceof HTMLImageElement || typeof HTMLCanvasElement < "u" && s instanceof HTMLCanvasElement || typeof ImageBitmap < "u" && s instanceof ImageBitmap ? xk.getDataURL(s) : s.data ? { data: Array.from(s.data), width: s.width, height: s.height, type: s.data.constructor.name } : (console.warn("THREE.Texture: Unable to serialize Texture."), {}); } let T8 = 0, Wt = class hS extends Ys { constructor(e = hS.DEFAULT_IMAGE, t = hS.DEFAULT_MAPPING, i = ps, n = ps, r = Gt, o = go, a = ui, l = vi, c = hS.DEFAULT_ANISOTROPY, h = Fr) { super(), this.isTexture = !0, Object.defineProperty(this, "id", { value: T8++ }), this.uuid = Aa(), this.name = "", this.source = new Hh(e), this.mipmaps = [], this.mapping = t, this.channel = 0, this.wrapS = i, this.wrapT = n, this.magFilter = r, this.minFilter = o, this.anisotropy = c, this.format = a, this.internalFormat = null, this.type = l, this.offset = new ee(0, 0), this.repeat = new ee(1, 1), this.center = new ee(0, 0), this.rotation = 0, this.matrixAutoUpdate = !0, this.matrix = new Nt(), this.generateMipmaps = !0, this.premultiplyAlpha = !1, this.flipY = !0, this.unpackAlignment = 4, this.colorSpace = h, this.userData = {}, this.version = 0, this.onUpdate = null, this.isRenderTargetTexture = !1, this.needsPMREMUpdate = !1; } get image() { return this.source.data; } set image(e = null) { this.source.data = e; } updateMatrix() { this.matrix.setUvTransform(this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y); } clone() { return new this.constructor().copy(this); } copy(e) { return this.name = e.name, this.source = e.source, this.mipmaps = e.mipmaps.slice(0), this.mapping = e.mapping, this.channel = e.channel, this.wrapS = e.wrapS, this.wrapT = e.wrapT, this.magFilter = e.magFilter, this.minFilter = e.minFilter, this.anisotropy = e.anisotropy, this.format = e.format, this.internalFormat = e.internalFormat, this.type = e.type, this.offset.copy(e.offset), this.repeat.copy(e.repeat), this.center.copy(e.center), this.rotation = e.rotation, this.matrixAutoUpdate = e.matrixAutoUpdate, this.matrix.copy(e.matrix), this.generateMipmaps = e.generateMipmaps, this.premultiplyAlpha = e.premultiplyAlpha, this.flipY = e.flipY, this.unpackAlignment = e.unpackAlignment, this.colorSpace = e.colorSpace, this.userData = JSON.parse(JSON.stringify(e.userData)), this.needsUpdate = !0, this; } toJSON(e) { const t = e === void 0 || typeof e == "string"; if (!t && e.textures[this.uuid] !== void 0) return e.textures[this.uuid]; const i = { metadata: { version: 4.6, type: "Texture", generator: "Texture.toJSON" }, uuid: this.uuid, name: this.name, image: this.source.toJSON(e).uuid, mapping: this.mapping, channel: this.channel, repeat: [this.repeat.x, this.repeat.y], offset: [this.offset.x, this.offset.y], center: [this.center.x, this.center.y], rotation: this.rotation, wrap: [this.wrapS, this.wrapT], format: this.format, internalFormat: this.internalFormat, type: this.type, colorSpace: this.colorSpace, minFilter: this.minFilter, magFilter: this.magFilter, anisotropy: this.anisotropy, flipY: this.flipY, generateMipmaps: this.generateMipmaps, premultiplyAlpha: this.premultiplyAlpha, unpackAlignment: this.unpackAlignment }; return Object.keys(this.userData).length > 0 && (i.userData = this.userData), t || (e.textures[this.uuid] = i), i; } dispose() { this.dispatchEvent({ type: "dispose" }); } transformUv(e) { if (this.mapping !== AE) return e; if (e.applyMatrix3(this.matrix), e.x < 0 || e.x > 1) switch (this.wrapS) { case _o: e.x = e.x - Math.floor(e.x); break; case ps: e.x = e.x < 0 ? 0 : 1; break; case ou: Math.abs(Math.floor(e.x) % 2) === 1 ? e.x = Math.ceil(e.x) - e.x : e.x = e.x - Math.floor(e.x); break; } if (e.y < 0 || e.y > 1) switch (this.wrapT) { case _o: e.y = e.y - Math.floor(e.y); break; case ps: e.y = e.y < 0 ? 0 : 1; break; case ou: Math.abs(Math.floor(e.y) % 2) === 1 ? e.y = Math.ceil(e.y) - e.y : e.y = e.y - Math.floor(e.y); break; } return this.flipY && (e.y = 1 - e.y), e; } set needsUpdate(e) { e === !0 && (this.version++, this.source.needsUpdate = !0); } }; Wt.DEFAULT_IMAGE = null; Wt.DEFAULT_MAPPING = AE; Wt.DEFAULT_ANISOTROPY = 1; let Je = class kX { constructor(e = 0, t = 0, i = 0, n = 1) { kX.prototype.isVector4 = !0, this.x = e, this.y = t, this.z = i, this.w = n; } get width() { return this.z; } set width(e) { this.z = e; } get height() { return this.w; } set height(e) { this.w = e; } set(e, t, i, n) { return this.x = e, this.y = t, this.z = i, this.w = n, this; } setScalar(e) { return this.x = e, this.y = e, this.z = e, this.w = e, this; } setX(e) { return this.x = e, this; } setY(e) { return this.y = e, this; } setZ(e) { return this.z = e, this; } setW(e) { return this.w = e, this; } setComponent(e, t) { switch (e) { case 0: this.x = t; break; case 1: this.y = t; break; case 2: this.z = t; break; case 3: this.w = t; break; default: throw new Error("index is out of range: " + e); } return this; } getComponent(e) { switch (e) { case 0: return this.x; case 1: return this.y; case 2: return this.z; case 3: return this.w; default: throw new Error("index is out of range: " + e); } } clone() { return new this.constructor(this.x, this.y, this.z, this.w); } copy(e) { return this.x = e.x, this.y = e.y, this.z = e.z, this.w = e.w !== void 0 ? e.w : 1, this; } add(e) { return this.x += e.x, this.y += e.y, this.z += e.z, this.w += e.w, this; } addScalar(e) { return this.x += e, this.y += e, this.z += e, this.w += e, this; } addVectors(e, t) { return this.x = e.x + t.x, this.y = e.y + t.y, this.z = e.z + t.z, this.w = e.w + t.w, this; } addScaledVector(e, t) { return this.x += e.x * t, this.y += e.y * t, this.z += e.z * t, this.w += e.w * t, this; } sub(e) { return this.x -= e.x, this.y -= e.y, this.z -= e.z, this.w -= e.w, this; } subScalar(e) { return this.x -= e, this.y -= e, this.z -= e, this.w -= e, this; } subVectors(e, t) { return this.x = e.x - t.x, this.y = e.y - t.y, this.z = e.z - t.z, this.w = e.w - t.w, this; } multiply(e) { return this.x *= e.x, this.y *= e.y, this.z *= e.z, this.w *= e.w, this; } multiplyScalar(e) { return this.x *= e, this.y *= e, this.z *= e, this.w *= e, this; } applyMatrix4(e) { const t = this.x, i = this.y, n = this.z, r = this.w, o = e.elements; return this.x = o[0] * t + o[4] * i + o[8] * n + o[12] * r, this.y = o[1] * t + o[5] * i + o[9] * n + o[13] * r, this.z = o[2] * t + o[6] * i + o[10] * n + o[14] * r, this.w = o[3] * t + o[7] * i + o[11] * n + o[15] * r, this; } divideScalar(e) { return this.multiplyScalar(1 / e); } setAxisAngleFromQuaternion(e) { this.w = 2 * Math.acos(e.w); const t = Math.sqrt(1 - e.w * e.w); return t < 1e-4 ? (this.x = 1, this.y = 0, this.z = 0) : (this.x = e.x / t, this.y = e.y / t, this.z = e.z / t), this; } setAxisAngleFromRotationMatrix(e) { let t, i, n, r; const l = e.elements, c = l[0], h = l[4], u = l[8], d = l[1], p = l[5], m = l[9], g = l[2], A = l[6], y = l[10]; if (Math.abs(h - d) < 0.01 && Math.abs(u - g) < 0.01 && Math.abs(m - A) < 0.01) { if (Math.abs(h + d) < 0.1 && Math.abs(u + g) < 0.1 && Math.abs(m + A) < 0.1 && Math.abs(c + p + y - 3) < 0.1) return this.set(1, 0, 0, 0), this; t = Math.PI; const b = (c + 1) / 2, x = (p + 1) / 2, _ = (y + 1) / 2, w = (h + d) / 4, S = (u + g) / 4, M = (m + A) / 4; return b > x && b > _ ? b < 0.01 ? (i = 0, n = 0.707106781, r = 0.707106781) : (i = Math.sqrt(b), n = w / i, r = S / i) : x > _ ? x < 0.01 ? (i = 0.707106781, n = 0, r = 0.707106781) : (n = Math.sqrt(x), i = w / n, r = M / n) : _ < 0.01 ? (i = 0.707106781, n = 0.707106781, r = 0) : (r = Math.sqrt(_), i = S / r, n = M / r), this.set(i, n, r, t), this; } let v = Math.sqrt((A - m) * (A - m) + (u - g) * (u - g) + (d - h) * (d - h)); return Math.abs(v) < 1e-3 && (v = 1), this.x = (A - m) / v, this.y = (u - g) / v, this.z = (d - h) / v, this.w = Math.acos((c + p + y - 1) / 2), this; } min(e) { return this.x = Math.min(this.x, e.x), this.y = Math.min(this.y, e.y), this.z = Math.min(this.z, e.z), this.w = Math.min(this.w, e.w), this; } max(e) { return this.x = Math.max(this.x, e.x), this.y = Math.max(this.y, e.y), this.z = Math.max(this.z, e.z), this.w = Math.max(this.w, e.w), this; } clamp(e, t) { return this.x = Math.max(e.x, Math.min(t.x, this.x)), this.y = Math.max(e.y, Math.min(t.y, this.y)), this.z = Math.max(e.z, Math.min(t.z, this.z)), this.w = Math.max(e.w, Math.min(t.w, this.w)), this; } clampScalar(e, t) { return this.x = Math.max(e, Math.min(t, this.x)), this.y = Math.max(e, Math.min(t, this.y)), this.z = Math.max(e, Math.min(t, this.z)), this.w = Math.max(e, Math.min(t, this.w)), this; } clampLength(e, t) { const i = this.length(); return this.divideScalar(i || 1).multiplyScalar(Math.max(e, Math.min(t, i))); } floor() { return this.x = Math.floor(this.x), this.y = Math.floor(this.y), this.z = Math.floor(this.z), this.w = Math.floor(this.w), this; } ceil() { return this.x = Math.ceil(this.x), this.y = Math.ceil(this.y), this.z = Math.ceil(this.z), this.w = Math.ceil(this.w), this; } round() { return this.x = Math.round(this.x), this.y = Math.round(this.y), this.z = Math.round(this.z), this.w = Math.round(this.w), this; } roundToZero() { return this.x = Math.trunc(this.x), this.y = Math.trunc(this.y), this.z = Math.trunc(this.z), this.w = Math.trunc(this.w), this; } negate() { return this.x = -this.x, this.y = -this.y, this.z = -this.z, this.w = -this.w, this; } dot(e) { return this.x * e.x + this.y * e.y + this.z * e.z + this.w * e.w; } lengthSq() { return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w; } length() { return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); } manhattanLength() { return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w); } normalize() { return this.divideScalar(this.length() || 1); } setLength(e) { return this.normalize().multiplyScalar(e); } lerp(e, t) { return this.x += (e.x - this.x) * t, this.y += (e.y - this.y) * t, this.z += (e.z - this.z) * t, this.w += (e.w - this.w) * t, this; } lerpVectors(e, t, i) { return this.x = e.x + (t.x - e.x) * i, this.y = e.y + (t.y - e.y) * i, this.z = e.z + (t.z - e.z) * i, this.w = e.w + (t.w - e.w) * i, this; } equals(e) { return e.x === this.x && e.y === this.y && e.z === this.z && e.w === this.w; } fromArray(e, t = 0) { return this.x = e[t], this.y = e[t + 1], this.z = e[t + 2], this.w = e[t + 3], this; } toArray(e = [], t = 0) { return e[t] = this.x, e[t + 1] = this.y, e[t + 2] = this.z, e[t + 3] = this.w, e; } fromBufferAttribute(e, t) { return this.x = e.getX(t), this.y = e.getY(t), this.z = e.getZ(t), this.w = e.getW(t), this; } random() { return this.x = Math.random(), this.y = Math.random(), this.z = Math.random(), this.w = Math.random(), this; } *[Symbol.iterator]() { yield this.x, yield this.y, yield this.z, yield this.w; } }; class DX extends Ys { constructor(e = 1, t = 1, i = {}) { super(), this.isRenderTarget = !0, this.width = e, this.height = t, this.depth = 1, this.scissor = new Je(0, 0, e, t), this.scissorTest = !1, this.viewport = new Je(0, 0, e, t); const n = { width: e, height: t, depth: 1 }; i = Object.assign({ generateMipmaps: !1, internalFormat: null, minFilter: Gt, depthBuffer: !0, stencilBuffer: !1, depthTexture: null, samples: 0, count: 1 }, i); const r = new Wt(n, i.mapping, i.wrapS, i.wrapT, i.magFilter, i.minFilter, i.format, i.type, i.anisotropy, i.colorSpace); r.flipY = !1, r.generateMipmaps = i.generateMipmaps, r.internalFormat = i.internalFormat, this.textures = []; const o = i.count; for (let a = 0; a < o; a++) this.textures[a] = r.clone(), this.textures[a].isRenderTargetTexture = !0; this.depthBuffer = i.depthBuffer, this.stencilBuffer = i.stencilBuffer, this.depthTexture = i.depthTexture, this.samples = i.samples; } get texture() { return this.textures[0]; } set texture(e) { this.textures[0] = e; } setSize(e, t, i = 1) { if (this.width !== e || this.height !== t || this.depth !== i) { this.width = e, this.height = t, this.depth = i; for (let n = 0, r = this.textures.length; n < r; n++) this.textures[n].image.width = e, this.textures[n].image.height = t, this.textures[n].image.depth = i; this.dispose(); } this.viewport.set(0, 0, e, t), this.scissor.set(0, 0, e, t); } clone() { return new this.constructor().copy(this); } copy(e) { this.width = e.width, this.height = e.height, this.depth = e.depth, this.scissor.copy(e.scissor), this.scissorTest = e.scissorTest, this.viewport.copy(e.viewport), this.textures.length = 0; for (let i = 0, n = e.textures.length; i < n; i++) this.textures[i] = e.textures[i].clone(), this.textures[i].isRenderTargetTexture = !0; const t = Object.assign({}, e.texture.image); return this.texture.source = new Hh(t), this.depthBuffer = e.depthBuffer, this.stencilBuffer = e.stencilBuffer, e.depthTexture !== null && (this.depthTexture = e.depthTexture.clone()), this.samples = e.samples, this; } dispose() { this.dispatchEvent({ type: "dispose" }); } } class qt extends DX { constructor(e = 1, t = 1, i = {}) { super(e, t, i), this.isWebGLRenderTarget = !0; } } class wE extends Wt { constructor(e = null, t = 1, i = 1, n = 1) { super(null), this.isDataArrayTexture = !0, this.image = { data: e, width: t, height: i, depth: n }, this.magFilter = Ut, this.minFilter = Ut, this.wrapR = ps, this.generateMipmaps = !1, this.flipY = !1, this.unpackAlignment = 1; } } class R8 extends qt { constructor(e = 1, t = 1, i = 1, n = {}) { super(e, t, n), this.isWebGLArrayRenderTarget = !0, this.depth = i, this.texture = new wE(null, e, t, i), this.texture.isRenderTargetTexture = !0; } } let CE = class extends Wt { constructor(e = null, t = 1, i = 1, n = 1) { super(null), this.isData3DTexture = !0, this.image = { data: e, width: t, height: i, depth: n }, this.magFilter = Ut, this.minFilter = Ut, this.wrapR = ps, this.generateMipmaps = !1, this.flipY = !1, this.unpackAlignment = 1; } }; class B8 extends qt { constructor(e = 1, t = 1, i = 1, n = {}) { super(e, t, n), this.isWebGL3DRenderTarget = !0, this.depth = i, this.texture = new CE(null, e, t, i), this.texture.isRenderTargetTexture = !0; } } let we = class { constructor(e = 0, t = 0, i = 0, n = 1) { this.isQuaternion = !0, this._x = e, this._y = t, this._z = i, this._w = n; } static slerpFlat(e, t, i, n, r, o, a) { let l = i[n + 0], c = i[n + 1], h = i[n + 2], u = i[n + 3]; const d = r[o + 0], p = r[o + 1], m = r[o + 2], g = r[o + 3]; if (a === 0) { e[t + 0] = l, e[t + 1] = c, e[t + 2] = h, e[t + 3] = u; return; } if (a === 1) { e[t + 0] = d, e[t + 1] = p, e[t + 2] = m, e[t + 3] = g; return; } if (u !== g || l !== d || c !== p || h !== m) { let A = 1 - a; const y = l * d + c * p + h * m + u * g, v = y >= 0 ? 1 : -1, b = 1 - y * y; if (b > Number.EPSILON) { const _ = Math.sqrt(b), w = Math.atan2(_, y * v); A = Math.sin(A * w) / _, a = Math.sin(a * w) / _; } const x = a * v; if (l = l * A + d * x, c = c * A + p * x, h = h * A + m * x, u = u * A + g * x, A === 1 - a) { const _ = 1 / Math.sqrt(l * l + c * c + h * h + u * u); l *= _, c *= _, h *= _, u *= _; } } e[t] = l, e[t + 1] = c, e[t + 2] = h, e[t + 3] = u; } static multiplyQuaternionsFlat(e, t, i, n, r, o) { const a = i[n], l = i[n + 1], c = i[n + 2], h = i[n + 3], u = r[o], d = r[o + 1], p = r[o + 2], m = r[o + 3]; return e[t] = a * m + h * u + l * p - c * d, e[t + 1] = l * m + h * d + c * u - a * p, e[t + 2] = c * m + h * p + a * d - l * u, e[t + 3] = h * m - a * u - l * d - c * p, e; } get x() { return this._x; } set x(e) { this._x = e, this._onChangeCallback(); } get y() { return this._y; } set y(e) { this._y = e, this._onChangeCallback(); } get z() { return this._z; } set z(e) { this._z = e, this._onChangeCallback(); } get w() { return this._w; } set w(e) { this._w = e, this._onChangeCallback(); } set(e, t, i, n) { return this._x = e, this._y = t, this._z = i, this._w = n, this._onChangeCallback(), this; } clone() { return new this.constructor(this._x, this._y, this._z, this._w); } copy(e) { return this._x = e.x, this._y = e.y, this._z = e.z, this._w = e.w, this._onChangeCallback(), this; } setFromEuler(e, t = !0) { const i = e._x, n = e._y, r = e._z, o = e._order, a = Math.cos, l = Math.sin, c = a(i / 2), h = a(n / 2), u = a(r / 2), d = l(i / 2), p = l(n / 2), m = l(r / 2); switch (o) { case "XYZ": this._x = d * h * u + c * p * m, this._y = c * p * u - d * h * m, this._z = c * h * m + d * p * u, this._w = c * h * u - d * p * m; break; case "YXZ": this._x = d * h * u + c * p * m, this._y = c * p * u - d * h * m, this._z = c * h * m - d * p * u, this._w = c * h * u + d * p * m; break; case "ZXY": this._x = d * h * u - c * p * m, this._y = c * p * u + d * h * m, this._z = c * h * m + d * p * u, this._w = c * h * u - d * p * m; break; case "ZYX": this._x = d * h * u - c * p * m, this._y = c * p * u + d * h * m, this._z = c * h * m - d * p * u, this._w = c * h * u + d * p * m; break; case "YZX": this._x = d * h * u + c * p * m, this._y = c * p * u + d * h * m, this._z = c * h * m - d * p * u, this._w = c * h * u - d * p * m; break; case "XZY": this._x = d * h * u - c * p * m, this._y = c * p * u - d * h * m, this._z = c * h * m + d * p * u, this._w = c * h * u + d * p * m; break; default: console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: " + o); } return t === !0 && this._onChangeCallback(), this; } setFromAxisAngle(e, t) { const i = t / 2, n = Math.sin(i); return this._x = e.x * n, this._y = e.y * n, this._z = e.z * n, this._w = Math.cos(i), this._onChangeCallback(), this; } setFromRotationMatrix(e) { const t = e.elements, i = t[0], n = t[4], r = t[8], o = t[1], a = t[5], l = t[9], c = t[2], h = t[6], u = t[10], d = i + a + u; if (d > 0) { const p = 0.5 / Math.sqrt(d + 1); this._w = 0.25 / p, this._x = (h - l) * p, this._y = (r - c) * p, this._z = (o - n) * p; } else if (i > a && i > u) { const p = 2 * Math.sqrt(1 + i - a - u); this._w = (h - l) / p, this._x = 0.25 * p, this._y = (n + o) / p, this._z = (r + c) / p; } else if (a > u) { const p = 2 * Math.sqrt(1 + a - i - u); this._w = (r - c) / p, this._x = (n + o) / p, this._y = 0.25 * p, this._z = (l + h) / p; } else { const p = 2 * Math.sqrt(1 + u - i - a); this._w = (o - n) / p, this._x = (r + c) / p, this._y = (l + h) / p, this._z = 0.25 * p; } return this._onChangeCallback(), this; } setFromUnitVectors(e, t) { let i = e.dot(t) + 1; return i < Number.EPSILON ? (i = 0, Math.abs(e.x) > Math.abs(e.z) ? (this._x = -e.y, this._y = e.x, this._z = 0, this._w = i) : (this._x = 0, this._y = -e.z, this._z = e.y, this._w = i)) : (this._x = e.y * t.z - e.z * t.y, this._y = e.z * t.x - e.x * t.z, this._z = e.x * t.y - e.y * t.x, this._w = i), this.normalize(); } angleTo(e) { return 2 * Math.acos(Math.abs(Xn(this.dot(e), -1, 1))); } rotateTowards(e, t) { const i = this.angleTo(e); if (i === 0) return this; const n = Math.min(1, t / i); return this.slerp(e, n), this; } identity() { return this.set(0, 0, 0, 1); } invert() { return this.conjugate(); } conjugate() { return this._x *= -1, this._y *= -1, this._z *= -1, this._onChangeCallback(), this; } dot(e) { return this._x * e._x + this._y * e._y + this._z * e._z + this._w * e._w; } lengthSq() { return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w; } length() { return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w); } normalize() { let e = this.length(); return e === 0 ? (this._x = 0, this._y = 0, this._z = 0, this._w = 1) : (e = 1 / e, this._x = this._x * e, this._y = this._y * e, this._z = this._z * e, this._w = this._w * e), this._onChangeCallback(), this; } multiply(e) { return this.multiplyQuaternions(this, e); } premultiply(e) { return this.multiplyQuaternions(e, this); } multiplyQuaternions(e, t) { const i = e._x, n = e._y, r = e._z, o = e._w, a = t._x, l = t._y, c = t._z, h = t._w; return this._x = i * h + o * a + n * c - r * l, this._y = n * h + o * l + r * a - i * c, this._z = r * h + o * c + i * l - n * a, this._w = o * h - i * a - n * l - r * c, this._onChangeCallback(), this; } slerp(e, t) { if (t === 0) return this; if (t === 1) return this.copy(e); const i = this._x, n = this._y, r = this._z, o = this._w; let a = o * e._w + i * e._x + n * e._y + r * e._z; if (a < 0 ? (this._w = -e._w, this._x = -e._x, this._y = -e._y, this._z = -e._z, a = -a) : this.copy(e), a >= 1) return this._w = o, this._x = i, this._y = n, this._z = r, this; const l = 1 - a * a; if (l <= Number.EPSILON) { const p = 1 - t; return this._w = p * o + t * this._w, this._x = p * i + t * this._x, this._y = p * n + t * this._y, this._z = p * r + t * this._z, this.normalize(), this; } const c = Math.sqrt(l), h = Math.atan2(c, a), u = Math.sin((1 - t) * h) / c, d = Math.sin(t * h) / c; return this._w = o * u + this._w * d, this._x = i * u + this._x * d, this._y = n * u + this._y * d, this._z = r * u + this._z * d, this._onChangeCallback(), this; } slerpQuaternions(e, t, i) { return this.copy(e).slerp(t, i); } random() { const e = 2 * Math.PI * Math.random(), t = 2 * Math.PI * Math.random(), i = Math.random(), n = Math.sqrt(1 - i), r = Math.sqrt(i); return this.set( n * Math.sin(e), n * Math.cos(e), r * Math.sin(t), r * Math.cos(t) ); } equals(e) { return e._x === this._x && e._y === this._y && e._z === this._z && e._w === this._w; } fromArray(e, t = 0) { return this._x = e[t], this._y = e[t + 1], this._z = e[t + 2], this._w = e[t + 3], this._onChangeCallback(), this; } toArray(e = [], t = 0) { return e[t] = this._x, e[t + 1] = this._y, e[t + 2] = this._z, e[t + 3] = this._w, e; } fromBufferAttribute(e, t) { return this._x = e.getX(t), this._y = e.getY(t), this._z = e.getZ(t), this._w = e.getW(t), this._onChangeCallback(), this; } toJSON() { return this.toArray(); } _onChange(e) { return this._onChangeCallback = e, this; } _onChangeCallback() { } *[Symbol.iterator]() { yield this._x, yield this._y, yield this._z, yield this._w; } }, E = class FX { constructor(e = 0, t = 0, i = 0) { FX.prototype.isVector3 = !0, this.x = e, this.y = t, this.z = i; } set(e, t, i) { return i === void 0 && (i = this.z), this.x = e, this.y = t, this.z = i, this; } setScalar(e) { return this.x = e, this.y = e, this.z = e, this; } setX(e) { return this.x = e, this; } setY(e) { return this.y = e, this; } setZ(e) { return this.z = e, this; } setComponent(e, t) { switch (e) { case 0: this.x = t; break; case 1: this.y = t; break; case 2: this.z = t; break; default: throw new Error("index is out of range: " + e); } return this; } getComponent(e) { switch (e) { case 0: return this.x; case 1: return this.y; case 2: return this.z; default: throw new Error("index is out of range: " + e); } } clone() { return new this.constructor(this.x, this.y, this.z); } copy(e) { return this.x = e.x, this.y = e.y, this.z = e.z, this; } add(e) { return this.x += e.x, this.y += e.y, this.z += e.z, this; } addScalar(e) { return this.x += e, this.y += e, this.z += e, this; } addVectors(e, t) { return this.x = e.x + t.x, this.y = e.y + t.y, this.z = e.z + t.z, this; } addScaledVector(e, t) { return this.x += e.x * t, this.y += e.y * t, this.z += e.z * t, this; } sub(e) { return this.x -= e.x, this.y -= e.y, this.z -= e.z, this; } subScalar(e) { return this.x -= e, this.y -= e, this.z -= e, this; }