threepipe
Version:
A modern 3D viewer framework built on top of three.js, written in TypeScript, designed to make creating high-quality, modular, and extensible 3D experiences on the web simple and enjoyable.
1,423 lines • 2.48 MB
JavaScript
/**
* @license
* threepipe v0.4.3
* Copyright 2022-2025 repalash <palash@shaders.app>
* Apache-2.0 License
* See ./dependencies.txt for bundled third-party dependencies and licenses.
*/
/**
* @license
* Copyright 2010-2023 Three.js Authors
* SPDX-License-Identifier: MIT
*/
const Gl = { ROTATE: 0, DOLLY: 1, PAN: 2 }, Ql = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 }, a1 = 0, kv = 1, o1 = 2, by = 1, l1 = 2, ha = 3, Cs = 0, Gn = 1, tn = 2, _n = 0, Hr = 1, lf = 2, cf = 3, hf = 4, xr = 5, zr = 100, iE = 101, nE = 102, sE = 103, rE = 104, hA = 200, uA = 201, dA = 202, pA = 203, Hc = 204, Wc = 205, fA = 206, mA = 207, gA = 208, AA = 209, aE = 210, cu = 211, hu = 212, vc = 213, _c = 214, oE = 0, lE = 1, cE = 2, jc = 3, hE = 4, uE = 5, dE = 6, pE = 7, dh = 0, c1 = 1, h1 = 2, ya = 0, fE = 1, mE = 2, gE = 3, Ey = 4, AE = 5, yE = 6, u1 = 7, zv = "attached", d1 = "detached", id = 300, ba = 301, cl = 302, Ea = 303, uf = 304, ph = 306, Qn = 1e3, di = 1001, Ca = 1002, Ai = 1003, nd = 1004, to = 1005, nt = 1006, tl = 1007, kn = 1008, Gv = 1008, Wt = 1009, vE = 1010, _E = 1011, Cy = 1012, My = 1013, Ma = 1014, Vt = 1015, Kt = 1016, Sy = 1017, Ty = 1018, fh = 1020, p1 = 35902, f1 = 1021, m1 = 1022, Jt = 1023, g1 = 1024, A1 = 1025, il = 1026, Ru = 1027, io = 1028, xE = 1029, xc = 1030, wE = 1031, bE = 1033, Vp = 33776, Nm = 33777, km = 33778, Hp = 33779, yA = 35840, Qv = 35841, vA = 35842, Vv = 35843, Iy = 36196, _A = 37492, xA = 37496, wA = 37808, Hv = 37809, Wv = 37810, jv = 37811, df = 37812, qv = 37813, Xv = 37814, Yv = 37815, $v = 37816, Kv = 37817, Jv = 37818, Zv = 37819, e_ = 37820, t_ = 37821, Wp = 36492, i_ = 36494, n_ = 36495, y1 = 36283, s_ = 36284, r_ = 36285, a_ = 36286, bA = 2200, EA = 2201, v1 = 2202, qc = 2300, hl = 2301, zm = 2302, wc = 2400, bc = 2401, pf = 2402, Dy = 2500, EE = 2501, _1 = 0, CE = 1, CA = 2, Ry = 3200, Uc = 3201, Zs = 0, ME = 1, ri = "", gt = "srgb", It = "srgb-linear", sd = "display-p3", rd = "display-p3-linear", qs = "rgbm-16", ff = "linear", wi = "srgb", mf = "rec709", gf = "p3", da = 7680, MA = 519, x1 = 512, w1 = 513, b1 = 514, SE = 515, E1 = 516, C1 = 517, M1 = 518, S1 = 519, Af = 35044, T1 = "100", SA = "300 es", fa = 2e3, yf = 2001, o_ = 3e3, Rd = 3001;
class Pi {
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, a = n.length; r < a; r++)
n[r].call(this, e);
e.target = null;
}
}
}
const jn = ["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 l_ = 1234567;
const nl = Math.PI / 180, Xc = 180 / Math.PI;
function Ls() {
const s = Math.random() * 4294967295 | 0, e = Math.random() * 4294967295 | 0, t = Math.random() * 4294967295 | 0, i = Math.random() * 4294967295 | 0;
return (jn[s & 255] + jn[s >> 8 & 255] + jn[s >> 16 & 255] + jn[s >> 24 & 255] + "-" + jn[e & 255] + jn[e >> 8 & 255] + "-" + jn[e >> 16 & 15 | 64] + jn[e >> 24 & 255] + "-" + jn[t & 63 | 128] + jn[t >> 8 & 255] + "-" + jn[t >> 16 & 255] + jn[t >> 24 & 255] + jn[i & 255] + jn[i >> 8 & 255] + jn[i >> 16 & 255] + jn[i >> 24 & 255]).toLowerCase();
}
function Hi(s, e, t) {
return Math.max(e, Math.min(t, s));
}
function Py(s, e) {
return (s % e + e) % e;
}
function I1(s, e, t, i, n) {
return i + (s - e) * (n - i) / (t - e);
}
function D1(s, e, t) {
return s !== e ? (t - s) / (e - s) : 0;
}
function yu(s, e, t) {
return (1 - t) * s + t * e;
}
function R1(s, e, t, i) {
return yu(s, e, 1 - Math.exp(-t * i));
}
function P1(s, e = 1) {
return e - Math.abs(Py(s, e * 2) - e);
}
function B1(s, e, t) {
return s <= e ? 0 : s >= t ? 1 : (s = (s - e) / (t - e), s * s * (3 - 2 * s));
}
function L1(s, e, t) {
return s <= e ? 0 : s >= t ? 1 : (s = (s - e) / (t - e), s * s * s * (s * (s * 6 - 15) + 10));
}
function O1(s, e) {
return s + Math.floor(Math.random() * (e - s + 1));
}
function U1(s, e) {
return s + Math.random() * (e - s);
}
function F1(s) {
return s * (0.5 - Math.random());
}
function N1(s) {
s !== void 0 && (l_ = s);
let e = l_ += 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 k1(s) {
return s * nl;
}
function z1(s) {
return s * Xc;
}
function G1(s) {
return (s & s - 1) === 0 && s !== 0;
}
function Q1(s) {
return Math.pow(2, Math.ceil(Math.log(s) / Math.LN2));
}
function V1(s) {
return Math.pow(2, Math.floor(Math.log(s) / Math.LN2));
}
function H1(s, e, t, i, n) {
const r = Math.cos, a = Math.sin, o = r(t / 2), l = a(t / 2), c = r((e + i) / 2), h = a((e + i) / 2), u = r((e - i) / 2), d = a((e - i) / 2), p = r((i - e) / 2), f = a((i - e) / 2);
switch (n) {
case "XYX":
s.set(o * h, l * u, l * d, o * c);
break;
case "YZY":
s.set(l * d, o * h, l * u, o * c);
break;
case "ZXZ":
s.set(l * u, l * d, o * h, o * c);
break;
case "XZX":
s.set(o * h, l * f, l * p, o * c);
break;
case "YXY":
s.set(l * p, o * h, l * f, o * c);
break;
case "ZYZ":
s.set(l * f, l * p, o * h, o * c);
break;
default:
console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: " + n);
}
}
function hs(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 vt(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 Gt = {
DEG2RAD: nl,
RAD2DEG: Xc,
generateUUID: Ls,
clamp: Hi,
euclideanModulo: Py,
mapLinear: I1,
inverseLerp: D1,
lerp: yu,
damp: R1,
pingpong: P1,
smoothstep: B1,
smootherstep: L1,
randInt: O1,
randFloat: U1,
randFloatSpread: F1,
seededRandom: N1,
degToRad: k1,
radToDeg: z1,
isPowerOfTwo: G1,
ceilPowerOfTwo: Q1,
floorPowerOfTwo: V1,
setQuaternionFromProperEuler: H1,
normalize: vt,
denormalize: hs
};
class J {
constructor(e = 0, t = 0) {
J.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(Hi(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, a = this.y - e.y;
return this.x = r * i - a * n + e.x, this.y = r * n + a * i + e.y, this;
}
random() {
return this.x = Math.random(), this.y = Math.random(), this;
}
*[Symbol.iterator]() {
yield this.x, yield this.y;
}
}
class ft {
constructor(e, t, i, n, r, a, o, l, c) {
ft.prototype.isMatrix3 = !0, this.elements = [
1,
0,
0,
0,
1,
0,
0,
0,
1
], e !== void 0 && this.set(e, t, i, n, r, a, o, l, c);
}
set(e, t, i, n, r, a, o, l, c) {
const h = this.elements;
return h[0] = e, h[1] = n, h[2] = o, h[3] = t, h[4] = r, h[5] = l, h[6] = i, h[7] = a, 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, a = i[0], o = i[3], l = i[6], c = i[1], h = i[4], u = i[7], d = i[2], p = i[5], f = i[8], g = n[0], m = n[3], A = n[6], v = n[1], y = n[4], _ = n[7], I = n[2], C = n[5], M = n[8];
return r[0] = a * g + o * v + l * I, r[3] = a * m + o * y + l * C, r[6] = a * A + o * _ + l * M, r[1] = c * g + h * v + u * I, r[4] = c * m + h * y + u * C, r[7] = c * A + h * _ + u * M, r[2] = d * g + p * v + f * I, r[5] = d * m + p * y + f * C, r[8] = d * A + p * _ + f * M, 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], a = e[4], o = e[5], l = e[6], c = e[7], h = e[8];
return t * a * h - t * o * c - i * r * h + i * o * l + n * r * c - n * a * l;
}
invert() {
const e = this.elements, t = e[0], i = e[1], n = e[2], r = e[3], a = e[4], o = e[5], l = e[6], c = e[7], h = e[8], u = h * a - o * c, d = o * l - h * r, p = c * r - a * l, f = t * u + i * d + n * p;
if (f === 0) return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0);
const g = 1 / f;
return e[0] = u * g, e[1] = (n * c - h * i) * g, e[2] = (o * i - n * a) * g, e[3] = d * g, e[4] = (h * t - n * l) * g, e[5] = (n * r - o * t) * g, e[6] = p * g, e[7] = (i * l - c * t) * g, e[8] = (a * 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, a, o) {
const l = Math.cos(r), c = Math.sin(r);
return this.set(
i * l,
i * c,
-i * (l * a + c * o) + a + e,
-n * c,
n * l,
-n * (-c * a + l * o) + o + t,
0,
0,
1
), this;
}
//
scale(e, t) {
return this.premultiply(Gm.makeScale(e, t)), this;
}
rotate(e) {
return this.premultiply(Gm.makeRotation(-e)), this;
}
translate(e, t) {
return this.premultiply(Gm.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 Gm = /* @__PURE__ */ new ft();
function TE(s) {
for (let e = s.length - 1; e >= 0; --e)
if (s[e] >= 65535) return !0;
return !1;
}
const W1 = {
Int8Array,
Uint8Array,
Uint8ClampedArray,
Int16Array,
Uint16Array,
Int32Array,
Uint32Array,
Float32Array,
Float64Array
};
function Ec(s, e) {
return new W1[s](e);
}
function Pu(s) {
return document.createElementNS("http://www.w3.org/1999/xhtml", s);
}
function j1() {
const s = Pu("canvas");
return s.style.display = "block", s;
}
const c_ = {};
function vu(s) {
s in c_ || (c_[s] = !0, console.warn(s));
}
const h_ = /* @__PURE__ */ new ft().set(
0.8224621,
0.177538,
0,
0.0331941,
0.9668058,
0,
0.0170827,
0.0723974,
0.9105199
), u_ = /* @__PURE__ */ new ft().set(
1.2249401,
-0.2249404,
0,
-0.0420569,
1.0420571,
0,
-0.0196376,
-0.0786361,
1.0982735
), Pd = {
[It]: {
transfer: ff,
primaries: mf,
toReference: (s) => s,
fromReference: (s) => s
},
[gt]: {
transfer: wi,
primaries: mf,
toReference: (s) => s.convertSRGBToLinear(),
fromReference: (s) => s.convertLinearToSRGB()
},
[rd]: {
transfer: ff,
primaries: gf,
toReference: (s) => s.applyMatrix3(u_),
fromReference: (s) => s.applyMatrix3(h_)
},
[sd]: {
transfer: wi,
primaries: gf,
toReference: (s) => s.convertSRGBToLinear().applyMatrix3(u_),
fromReference: (s) => s.applyMatrix3(h_).convertLinearToSRGB()
}
}, q1 = /* @__PURE__ */ new Set([It, rd]), $t = {
enabled: !0,
_workingColorSpace: It,
get workingColorSpace() {
return this._workingColorSpace;
},
set workingColorSpace(s) {
if (!q1.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 = Pd[e].toReference, n = Pd[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 Pd[s].primaries;
},
getTransfer: function(s) {
return s === ri || s === qs ? ff : Pd[s].transfer;
}
};
function Fc(s) {
return s < 0.04045 ? s * 0.0773993808 : Math.pow(s * 0.9478672986 + 0.0521327014, 2.4);
}
function Qm(s) {
return s < 31308e-7 ? s * 12.92 : 1.055 * Math.pow(s, 0.41666) - 0.055;
}
let Vl;
class IE {
static getDataURL(e, t = !1) {
if (/^data:/i.test(e.src) || typeof HTMLCanvasElement > "u")
return e.src;
let i;
if (e instanceof HTMLCanvasElement)
i = e;
else {
Vl === void 0 && (Vl = Pu("canvas")), Vl.width = e.width, Vl.height = e.height;
const n = Vl.getContext("2d");
e instanceof ImageData ? n.putImageData(e, 0, 0) : n.drawImage(e, 0, 0, e.width, e.height), i = Vl;
}
return !t && (i.width > 2048 || i.height > 2048) ? (console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons", e), i.toDataURL("image/jpeg", 0.6)) : i.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 = Pu("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 a = 0; a < r.length; a++)
r[a] = Fc(r[a] / 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(Fc(t[i] / 255) * 255) : t[i] = Fc(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;
}
}
let X1 = 0;
class no {
constructor(e = null) {
this.isSource = !0, Object.defineProperty(this, "id", { value: X1++ }), this.uuid = Ls(), 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 a = 0, o = n.length; a < o; a++)
n[a].isDataTexture ? r.push(Vm(n[a].image)) : r.push(Vm(n[a]));
} else
r = Vm(n);
i.url = r;
}
return t || (e.images[this.uuid] = i), i;
}
}
function Vm(s) {
if (typeof HTMLImageElement < "u" && s instanceof HTMLImageElement || typeof HTMLCanvasElement < "u" && s instanceof HTMLCanvasElement || typeof ImageBitmap < "u" && s instanceof ImageBitmap)
return IE.getDataURL(s);
if (s.data) {
let e = [];
try {
e = Array.from(s.data);
} catch (t) {
t.message.includes("Invalid array length") ? console.warn("Serializing large texture, might not be saved in JSON structure.") : console.error(t), e = s.data;
}
return {
data: e,
width: s.width,
height: s.height,
type: s.data.constructor.name
};
} else
return s.url !== void 0 ? s.url : (console.warn("THREE.Texture: Unable to serialize Texture."), {});
}
let Y1 = 0;
class Bt extends Pi {
constructor(e = Bt.DEFAULT_IMAGE, t = Bt.DEFAULT_MAPPING, i = di, n = di, r = nt, a = kn, o = Jt, l = Wt, c = Bt.DEFAULT_ANISOTROPY, h = ri) {
super(), this.isTexture = !0, Object.defineProperty(this, "id", { value: Y1++ }), this.uuid = Ls(), this.name = "", this.source = new no(e), this.mipmaps = [], this.mapping = t, this.channel = 0, this.wrapS = i, this.wrapT = n, this.magFilter = r, this.minFilter = a, this.anisotropy = c, this.format = o, this.internalFormat = null, this.type = l, this.offset = new J(0, 0), this.repeat = new J(1, 1), this.center = new J(0, 0), this.rotation = 0, this.matrixAutoUpdate = !0, this.matrix = new ft(), this.generateMipmaps = !0, this.premultiplyAlpha = !1, this.flipY = !0, this.unpackAlignment = 4, typeof h == "string" ? this.colorSpace = h : (vu("THREE.Texture: Property .encoding has been replaced by .colorSpace."), this.colorSpace = h === Rd ? gt : ri), this.userData = {}, this.version = 0, this.onUpdate = null, this.isRenderTargetTexture = !1, this.pmremVersion = 0, e instanceof ImageData && e !== Bt.DEFAULT_IMAGE && (this.needsUpdate = !0);
}
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 = d_(this.userData, e.userData), this.needsUpdate = !0, this;
}
toJSON(e) {
const t = e === void 0 || typeof e == "string";
if (!t && e.textures && 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,
encoding: this.colorSpace === gt ? Rd : o_,
// deprecated in r152, added for backwards compatibility, remove later
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 = d_({}, this.userData)), !t && e.textures && (e.textures[this.uuid] = i), i;
}
dispose() {
this.dispatchEvent({ type: "dispose" });
}
transformUv(e) {
if (this.mapping !== id) return e;
if (e.applyMatrix3(this.matrix), e.x < 0 || e.x > 1)
switch (this.wrapS) {
case Qn:
e.x = e.x - Math.floor(e.x);
break;
case di:
e.x = e.x < 0 ? 0 : 1;
break;
case Ca:
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 Qn:
e.y = e.y - Math.floor(e.y);
break;
case di:
e.y = e.y < 0 ? 0 : 1;
break;
case Ca:
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, this.dispatchEvent({ type: "update" }));
}
// todo repalash remove later
get encoding() {
return vu("THREE.Texture: Property .encoding has been replaced by .colorSpace."), this.colorSpace === gt ? Rd : o_;
}
set encoding(e) {
vu("THREE.Texture: Property .encoding has been replaced by .colorSpace."), this.colorSpace = e === Rd ? gt : ri;
}
set needsPMREMUpdate(e) {
e === !0 && this.pmremVersion++;
}
}
Bt.DEFAULT_IMAGE = null;
Bt.DEFAULT_MAPPING = id;
Bt.DEFAULT_ANISOTROPY = 1;
const $1 = ["appliedMaterials", "uuid"];
function d_(s, e) {
if (e)
for (const t of Object.keys(e))
$1.includes(t) || t.startsWith("__") || typeof s[t] == "function" || typeof e[t] == "function" || (s[t] = typeof e[t] == "object" ? JSON.parse(JSON.stringify(e[t])) : e[t]);
return s;
}
class at {
constructor(e = 0, t = 0, i = 0, n = 1) {
at.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, a = e.elements;
return this.x = a[0] * t + a[4] * i + a[8] * n + a[12] * r, this.y = a[1] * t + a[5] * i + a[9] * n + a[13] * r, this.z = a[2] * t + a[6] * i + a[10] * n + a[14] * r, this.w = a[3] * t + a[7] * i + a[11] * n + a[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], f = l[9], g = l[2], m = l[6], A = l[10];
if (Math.abs(h - d) < 0.01 && Math.abs(u - g) < 0.01 && Math.abs(f - m) < 0.01) {
if (Math.abs(h + d) < 0.1 && Math.abs(u + g) < 0.1 && Math.abs(f + m) < 0.1 && Math.abs(c + p + A - 3) < 0.1)
return this.set(1, 0, 0, 0), this;
t = Math.PI;
const y = (c + 1) / 2, _ = (p + 1) / 2, I = (A + 1) / 2, C = (h + d) / 4, M = (u + g) / 4, b = (f + m) / 4;
return y > _ && y > I ? y < 0.01 ? (i = 0, n = 0.707106781, r = 0.707106781) : (i = Math.sqrt(y), n = C / i, r = M / i) : _ > I ? _ < 0.01 ? (i = 0.707106781, n = 0, r = 0.707106781) : (n = Math.sqrt(_), i = C / n, r = b / n) : I < 0.01 ? (i = 0.707106781, n = 0.707106781, r = 0) : (r = Math.sqrt(I), i = M / r, n = b / r), this.set(i, n, r, t), this;
}
let v = Math.sqrt((m - f) * (m - f) + (u - g) * (u - g) + (d - h) * (d - h));
return Math.abs(v) < 1e-3 && (v = 1), this.x = (m - f) / v, this.y = (u - g) / v, this.z = (d - h) / v, this.w = Math.acos((c + p + A - 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 K1 extends Pi {
constructor(e = 1, t = 1, i = {}) {
super(), this.isRenderTarget = !0, this.width = e, this.height = t, this.depth = 1, this.scissor = new at(0, 0, e, t), this.scissorTest = !1, this.viewport = new at(0, 0, e, t);
const n = { width: e, height: t, depth: 1 };
i = Object.assign({
generateMipmaps: !1,
internalFormat: null,
minFilter: nt,
depthBuffer: !0,
stencilBuffer: !1,
depthTexture: null,
samples: 0,
count: 1
}, i);
const r = new Bt(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 a = i.count;
for (let o = 0; o < a; o++)
this.textures[o] = r.clone(), this.textures[o].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 no(t), this.depthBuffer = e.depthBuffer, this.stencilBuffer = e.stencilBuffer, e.depthTexture && (this.depthTexture = e.depthTexture.clone()), this.samples = e.samples, this;
}
dispose() {
this.dispatchEvent({ type: "dispose" });
}
}
class Fs extends K1 {
constructor(e = 1, t = 1, i = {}) {
super(e, t, i), this.isWebGLRenderTarget = !0;
}
}
class By extends Bt {
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 = Ai, this.minFilter = Ai, this.wrapR = di, this.generateMipmaps = !1, this.flipY = !1, this.unpackAlignment = 1;
}
}
class EV extends Fs {
constructor(e = 1, t = 1, i = 1, n = {}) {
super(e, t, n), this.isWebGLArrayRenderTarget = !0, this.depth = i, this.texture = new By(null, e, t, i), this.texture.isRenderTargetTexture = !0;
}
}
class Ly extends Bt {
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 = Ai, this.minFilter = Ai, this.wrapR = di, this.generateMipmaps = !1, this.flipY = !1, this.unpackAlignment = 1;
}
}
class CV extends Fs {
constructor(e = 1, t = 1, i = 1, n = {}) {
super(e, t, n), this.isWebGL3DRenderTarget = !0, this.depth = i, this.texture = new Ly(null, e, t, i), this.texture.isRenderTargetTexture = !0;
}
}
class Xe {
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, a, o) {
let l = i[n + 0], c = i[n + 1], h = i[n + 2], u = i[n + 3];
const d = r[a + 0], p = r[a + 1], f = r[a + 2], g = r[a + 3];
if (o === 0) {
e[t + 0] = l, e[t + 1] = c, e[t + 2] = h, e[t + 3] = u;
return;
}
if (o === 1) {
e[t + 0] = d, e[t + 1] = p, e[t + 2] = f, e[t + 3] = g;
return;
}
if (u !== g || l !== d || c !== p || h !== f) {
let m = 1 - o;
const A = l * d + c * p + h * f + u * g, v = A >= 0 ? 1 : -1, y = 1 - A * A;
if (y > Number.EPSILON) {
const I = Math.sqrt(y), C = Math.atan2(I, A * v);
m = Math.sin(m * C) / I, o = Math.sin(o * C) / I;
}
const _ = o * v;
if (l = l * m + d * _, c = c * m + p * _, h = h * m + f * _, u = u * m + g * _, m === 1 - o) {
const I = 1 / Math.sqrt(l * l + c * c + h * h + u * u);
l *= I, c *= I, h *= I, u *= I;
}
}
e[t] = l, e[t + 1] = c, e[t + 2] = h, e[t + 3] = u;
}
static multiplyQuaternionsFlat(e, t, i, n, r, a) {
const o = i[n], l = i[n + 1], c = i[n + 2], h = i[n + 3], u = r[a], d = r[a + 1], p = r[a + 2], f = r[a + 3];
return e[t] = o * f + h * u + l * p - c * d, e[t + 1] = l * f + h * d + c * u - o * p, e[t + 2] = c * f + h * p + o * d - l * u, e[t + 3] = h * f - o * 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, a = e._order, o = Math.cos, l = Math.sin, c = o(i / 2), h = o(n / 2), u = o(r / 2), d = l(i / 2), p = l(n / 2), f = l(r / 2);
switch (a) {
case "XYZ":
this._x = d * h * u + c * p * f, this._y = c * p * u - d * h * f, this._z = c * h * f + d * p * u, this._w = c * h * u - d * p * f;
break;
case "YXZ":
this._x = d * h * u + c * p * f, this._y = c * p * u - d * h * f, this._z = c * h * f - d * p * u, this._w = c * h * u + d * p * f;
break;
case "ZXY":
this._x = d * h * u - c * p * f, this._y = c * p * u + d * h * f, this._z = c * h * f + d * p * u, this._w = c * h * u - d * p * f;
break;
case "ZYX":
this._x = d * h * u - c * p * f, this._y = c * p * u + d * h * f, this._z = c * h * f - d * p * u, this._w = c * h * u + d * p * f;
break;
case "YZX":
this._x = d * h * u + c * p * f, this._y = c * p * u + d * h * f, this._z = c * h * f - d * p * u, this._w = c * h * u - d * p * f;
break;
case "XZY":
this._x = d * h * u - c * p * f, this._y = c * p * u - d * h * f, this._z = c * h * f + d * p * u, this._w = c * h * u + d * p * f;
break;
default:
console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: " + a);
}
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], a = t[1], o = t[5], l = t[9], c = t[2], h = t[6], u = t[10], d = i + o + 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 = (a - n) * p;
} else if (i > o && i > u) {
const p = 2 * Math.sqrt(1 + i - o - u);
this._w = (h - l) / p, this._x = 0.25 * p, this._y = (n + a) / p, this._z = (r + c) / p;
} else if (o > u) {
const p = 2 * Math.sqrt(1 + o - i - u);
this._w = (r - c) / p, this._x = (n + a) / p, this._y = 0.25 * p, this._z = (l + h) / p;
} else {
const p = 2 * Math.sqrt(1 + u - i - o);
this._w = (a - 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(Hi(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, a = e._w, o = t._x, l = t._y, c = t._z, h = t._w;
return this._x = i * h + a * o + n * c - r * l, this._y = n * h + a * l + r * o - i * c, this._z = r * h + a * c + i * l - n * o, this._w = a * h - i * o - 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, a = this._w;
let o = a * e._w + i * e._x + n * e._y + r * e._z;
if (o < 0 ? (this._w = -e._w, this._x = -e._x, this._y = -e._y, this._z = -e._z, o = -o) : this.copy(e), o >= 1)
return this._w = a, this._x = i, this._y = n, this._z = r, this;
const l = 1 - o * o;
if (l <= Number.EPSILON) {
const p = 1 - t;
return this._w = p * a + 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, o), u = Math.sin((1 - t) * h) / c, d = Math.sin(t * h) / c;
return this._w = a * 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;
}
}
class E {
constructor(e = 0, t = 0, i = 0) {
E.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.