Files
spark/dist/spark.module.min.js
T
sparkjsdev[bot] 556e66c587 Bump dist build
2025-07-08 02:39:23 +00:00

10452 lines
788 KiB
JavaScript

import * as Q from "three";
import { Loader as ig, FileLoader as ng, Quaternion as es, Vector3 as LA, Color as ss, Matrix4 as fe } from "three";
var CA = Uint8Array, pt = Uint16Array, rg = Int32Array, Cs = new CA([
0,
0,
0,
0,
0,
0,
0,
0,
1,
1,
1,
1,
2,
2,
2,
2,
3,
3,
3,
3,
4,
4,
4,
4,
5,
5,
5,
5,
0,
/* unused */
0,
0,
/* impossible */
0
]), Es = new CA([
0,
0,
0,
0,
1,
1,
2,
2,
3,
3,
4,
4,
5,
5,
6,
6,
7,
7,
8,
8,
9,
9,
10,
10,
11,
11,
12,
12,
13,
13,
/* unused */
0,
0
]), ag = new CA([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]), cs = function(t, A) {
for (var e = new pt(31), s = 0; s < 31; ++s)
e[s] = A += 1 << t[s - 1];
for (var i = new rg(e[30]), s = 1; s < 30; ++s)
for (var n = e[s]; n < e[s + 1]; ++n)
i[n] = n - e[s] << 5 | s;
return { b: e, r: i };
}, hs = cs(Cs, 2), ls = hs.b, gg = hs.r;
ls[28] = 258, gg[258] = 28;
var og = cs(Es, 0), Ig = og.b, Fe = new pt(32768);
for (var iA = 0; iA < 32768; ++iA) {
var $A = (iA & 43690) >> 1 | (iA & 21845) << 1;
$A = ($A & 52428) >> 2 | ($A & 13107) << 2, $A = ($A & 61680) >> 4 | ($A & 3855) << 4, Fe[iA] = (($A & 65280) >> 8 | ($A & 255) << 8) >> 1;
}
var Lt = function(t, A, e) {
for (var s = t.length, i = 0, n = new pt(A); i < s; ++i)
t[i] && ++n[t[i] - 1];
var r = new pt(A);
for (i = 1; i < A; ++i)
r[i] = r[i - 1] + n[i - 1] << 1;
var a;
if (e) {
a = new pt(1 << A);
var g = 15 - A;
for (i = 0; i < s; ++i)
if (t[i])
for (var I = i << 4 | t[i], B = A - t[i], o = r[t[i] - 1]++ << B, C = o | (1 << B) - 1; o <= C; ++o)
a[Fe[o] >> g] = I;
} else
for (a = new pt(s), i = 0; i < s; ++i)
t[i] && (a[i] = Fe[r[t[i] - 1]++] >> 15 - t[i]);
return a;
}, qt = new CA(288);
for (var iA = 0; iA < 144; ++iA)
qt[iA] = 8;
for (var iA = 144; iA < 256; ++iA)
qt[iA] = 9;
for (var iA = 256; iA < 280; ++iA)
qt[iA] = 7;
for (var iA = 280; iA < 288; ++iA)
qt[iA] = 8;
var us = new CA(32);
for (var iA = 0; iA < 32; ++iA)
us[iA] = 5;
var Bg = /* @__PURE__ */ Lt(qt, 9, 1), Qg = /* @__PURE__ */ Lt(us, 5, 1), De = function(t) {
for (var A = t[0], e = 1; e < t.length; ++e)
t[e] > A && (A = t[e]);
return A;
}, bA = function(t, A, e) {
var s = A / 8 | 0;
return (t[s] | t[s + 1] << 8) >> (A & 7) & e;
}, me = function(t, A) {
var e = A / 8 | 0;
return (t[e] | t[e + 1] << 8 | t[e + 2] << 16) >> (A & 7);
}, ds = function(t) {
return (t + 7) / 8 | 0;
}, Dt = function(t, A, e) {
return (A == null || A < 0) && (A = 0), (e == null || e > t.length) && (e = t.length), new CA(t.subarray(A, e));
}, Cg = [
"unexpected EOF",
"invalid block type",
"invalid length/literal",
"invalid distance",
"stream finished",
"no stream handler",
,
"no callback",
"invalid UTF-8 data",
"extra field too long",
"date not in range 1980-2099",
"filename too long",
"stream finishing",
"invalid zip data"
// determined by unknown compression method
], yA = function(t, A, e) {
var s = new Error(A || Cg[t]);
if (s.code = t, Error.captureStackTrace && Error.captureStackTrace(s, yA), !e)
throw s;
return s;
}, ws = function(t, A, e, s) {
var i = t.length, n = s ? s.length : 0;
if (!i || A.f && !A.l)
return e || new CA(0);
var r = !e, a = r || A.i != 2, g = A.i;
r && (e = new CA(i * 3));
var I = function(pA) {
var xA = e.length;
if (pA > xA) {
var cA = new CA(Math.max(xA * 2, pA));
cA.set(e), e = cA;
}
}, B = A.f || 0, o = A.p || 0, C = A.b || 0, E = A.l, l = A.d, c = A.m, h = A.n, u = i * 8;
do {
if (!E) {
B = bA(t, o, 1);
var d = bA(t, o + 1, 3);
if (o += 3, d)
if (d == 1)
E = Bg, l = Qg, c = 9, h = 5;
else if (d == 2) {
var M = bA(t, o, 31) + 257, x = bA(t, o + 10, 15) + 4, D = M + bA(t, o + 5, 31) + 1;
o += 14;
for (var p = new CA(D), G = new CA(19), S = 0; S < x; ++S)
G[ag[S]] = bA(t, o + S * 3, 7);
o += x * 3;
for (var m = De(G), v = (1 << m) - 1, F = Lt(G, m, 1), S = 0; S < D; ) {
var k = F[bA(t, o, v)];
o += k & 15;
var w = k >> 4;
if (w < 16)
p[S++] = w;
else {
var U = 0, L = 0;
for (w == 16 ? (L = 3 + bA(t, o, 3), o += 2, U = p[S - 1]) : w == 17 ? (L = 3 + bA(t, o, 7), o += 3) : w == 18 && (L = 11 + bA(t, o, 127), o += 7); L--; )
p[S++] = U;
}
}
var AA = p.subarray(0, M), z = p.subarray(M);
c = De(AA), h = De(z), E = Lt(AA, c, 1), l = Lt(z, h, 1);
} else
yA(1);
else {
var w = ds(o) + 4, y = t[w - 4] | t[w - 3] << 8, f = w + y;
if (f > i) {
g && yA(0);
break;
}
a && I(C + y), e.set(t.subarray(w, f), C), A.b = C += y, A.p = o = f * 8, A.f = B;
continue;
}
if (o > u) {
g && yA(0);
break;
}
}
a && I(C + 131072);
for (var sA = (1 << c) - 1, tA = (1 << h) - 1, O = o; ; O = o) {
var U = E[me(t, o) & sA], T = U >> 4;
if (o += U & 15, o > u) {
g && yA(0);
break;
}
if (U || yA(2), T < 256)
e[C++] = T;
else if (T == 256) {
O = o, E = null;
break;
} else {
var W = T - 254;
if (T > 264) {
var S = T - 257, Z = Cs[S];
W = bA(t, o, (1 << Z) - 1) + ls[S], o += Z;
}
var j = l[me(t, o) & tA], b = j >> 4;
j || yA(3), o += j & 15;
var z = Ig[b];
if (b > 3) {
var Z = Es[b];
z += me(t, o) & (1 << Z) - 1, o += Z;
}
if (o > u) {
g && yA(0);
break;
}
a && I(C + 131072);
var dA = C + W;
if (C < z) {
var oA = n - z, wA = Math.min(z, dA);
for (oA + C < 0 && yA(3); C < wA; ++C)
e[C] = s[oA + C];
}
for (; C < dA; ++C)
e[C] = e[C - z];
}
}
A.l = E, A.p = O, A.b = C, A.f = B, E && (B = 1, A.m = c, A.d = l, A.n = h);
} while (!B);
return C != e.length && r ? Dt(e, 0, C) : e.subarray(0, C);
}, Eg = /* @__PURE__ */ new CA(0), JA = function(t, A) {
return t[A] | t[A + 1] << 8;
}, YA = function(t, A) {
return (t[A] | t[A + 1] << 8 | t[A + 2] << 16 | t[A + 3] << 24) >>> 0;
}, xe = function(t, A) {
return YA(t, A) + YA(t, A + 4) * 4294967296;
}, cg = function(t) {
(t[0] != 31 || t[1] != 139 || t[2] != 8) && yA(6, "invalid gzip data");
var A = t[3], e = 10;
A & 4 && (e += (t[10] | t[11] << 8) + 2);
for (var s = (A >> 3 & 1) + (A >> 4 & 1); s > 0; s -= !t[e++])
;
return e + (A & 2);
}, Me = /* @__PURE__ */ function() {
function t(A, e) {
typeof A == "function" && (e = A, A = {}), this.ondata = e;
var s = A && A.dictionary && A.dictionary.subarray(-32768);
this.s = { i: 0, b: s ? s.length : 0 }, this.o = new CA(32768), this.p = new CA(0), s && this.o.set(s);
}
return t.prototype.e = function(A) {
if (this.ondata || yA(5), this.d && yA(4), !this.p.length)
this.p = A;
else if (A.length) {
var e = new CA(this.p.length + A.length);
e.set(this.p), e.set(A, this.p.length), this.p = e;
}
}, t.prototype.c = function(A) {
this.s.i = +(this.d = A || !1);
var e = this.s.b, s = ws(this.p, this.s, this.o);
this.ondata(Dt(s, e, this.s.b), this.d), this.o = Dt(s, this.s.b - 32768), this.s.b = this.o.length, this.p = Dt(this.p, this.s.p / 8 | 0), this.s.p &= 7;
}, t.prototype.push = function(A, e) {
this.e(A), this.c(e);
}, t;
}();
function hg(t, A) {
return ws(t, { i: 2 }, A && A.out, A && A.dictionary);
}
var ps = /* @__PURE__ */ function() {
function t(A, e) {
this.v = 1, this.r = 0, Me.call(this, A, e);
}
return t.prototype.push = function(A, e) {
if (Me.prototype.e.call(this, A), this.r += A.length, this.v) {
var s = this.p.subarray(this.v - 1), i = s.length > 3 ? cg(s) : 4;
if (i > s.length) {
if (!e)
return;
} else this.v > 1 && this.onmember && this.onmember(this.r - s.length);
this.p = s.subarray(i), this.v = 0;
}
Me.prototype.c.call(this, e), this.s.f && !this.s.l && !e && (this.v = ds(this.s.p) + 9, this.s = { i: 0 }, this.o = new CA(0), this.push(new CA(0), e));
}, t;
}(), ke = typeof TextDecoder < "u" && /* @__PURE__ */ new TextDecoder(), lg = 0;
try {
ke.decode(Eg, { stream: !0 }), lg = 1;
} catch {
}
var ug = function(t) {
for (var A = "", e = 0; ; ) {
var s = t[e++], i = (s > 127) + (s > 223) + (s > 239);
if (e + i > t.length)
return { s: A, r: Dt(t, e - 1) };
i ? i == 3 ? (s = ((s & 15) << 18 | (t[e++] & 63) << 12 | (t[e++] & 63) << 6 | t[e++] & 63) - 65536, A += String.fromCharCode(55296 | s >> 10, 56320 | s & 1023)) : i & 1 ? A += String.fromCharCode((s & 31) << 6 | t[e++] & 63) : A += String.fromCharCode((s & 15) << 12 | (t[e++] & 63) << 6 | t[e++] & 63) : A += String.fromCharCode(s);
}
};
function dg(t, A) {
if (A) {
for (var e = "", s = 0; s < t.length; s += 16384)
e += String.fromCharCode.apply(null, t.subarray(s, s + 16384));
return e;
} else {
if (ke)
return ke.decode(t);
var i = ug(t), n = i.s, e = i.r;
return e.length && yA(8), n;
}
}
var wg = function(t, A) {
return A + 30 + JA(t, A + 26) + JA(t, A + 28);
}, pg = function(t, A, e) {
var s = JA(t, A + 28), i = dg(t.subarray(A + 46, A + 46 + s), !(JA(t, A + 8) & 2048)), n = A + 46 + s, r = YA(t, A + 20), a = e && r == 4294967295 ? yg(t, n) : [r, YA(t, A + 24), YA(t, A + 42)], g = a[0], I = a[1], B = a[2];
return [JA(t, A + 10), g, I, i, n + JA(t, A + 30) + JA(t, A + 32), B];
}, yg = function(t, A) {
for (; JA(t, A) != 1; A += 4 + JA(t, A + 2))
;
return [xe(t, A + 12), xe(t, A + 4), xe(t, A + 20)];
};
function fg(t, A) {
for (var e = {}, s = t.length - 22; YA(t, s) != 101010256; --s)
(!s || t.length - s > 65558) && yA(13);
var i = JA(t, s + 8);
if (!i)
return {};
var n = YA(t, s + 16), r = n == 4294967295 || i == 65535;
if (r) {
var a = YA(t, s - 12);
r = YA(t, a) == 101075792, r && (i = YA(t, a + 32), n = YA(t, a + 48));
}
for (var g = A && A.filter, I = 0; I < i; ++I) {
var B = pg(t, n, r), o = B[0], C = B[1], E = B[2], l = B[3], c = B[4], h = B[5], u = wg(t, h);
n = c, (!g || g({
name: l,
size: C,
originalSize: E,
compression: o
})) && (o ? o == 8 ? e[l] = hg(t.subarray(u, u + C), { out: new CA(E) }) : yA(14, "unknown compression type " + o) : e[l] = Dt(t, u, u + C));
}
return e;
}
let ZA;
const ys = typeof TextDecoder < "u" ? new TextDecoder("utf-8", { ignoreBOM: !0, fatal: !0 }) : { decode: () => {
throw Error("TextDecoder not available");
} };
typeof TextDecoder < "u" && ys.decode();
let Ut = null;
function Dg() {
return (Ut === null || Ut.byteLength === 0) && (Ut = new Uint8Array(ZA.memory.buffer)), Ut;
}
function mg(t, A) {
return t = t >>> 0, ys.decode(Dg().subarray(t, t + A));
}
function xg(t, A, e, s, i, n, r, a, g, I, B) {
return ZA.raycast_splats(t, A, e, s, i, n, r, a, g, I, B);
}
async function Mg(t, A) {
if (typeof Response == "function" && t instanceof Response) {
if (typeof WebAssembly.instantiateStreaming == "function")
try {
return await WebAssembly.instantiateStreaming(t, A);
} catch (s) {
if (t.headers.get("Content-Type") != "application/wasm")
console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", s);
else
throw s;
}
const e = await t.arrayBuffer();
return await WebAssembly.instantiate(e, A);
} else {
const e = await WebAssembly.instantiate(t, A);
return e instanceof WebAssembly.Instance ? { instance: e, module: t } : e;
}
}
function Sg() {
const t = {};
return t.wbg = {}, t.wbg.__wbg_buffer_609cc3eee51ed158 = function(A) {
return A.buffer;
}, t.wbg.__wbg_length_3b4f022188ae8db6 = function(A) {
return A.length;
}, t.wbg.__wbg_length_6ca527665d89694d = function(A) {
return A.length;
}, t.wbg.__wbg_length_8cfd2c6409af88ad = function(A) {
return A.length;
}, t.wbg.__wbg_new_9fee97a409b32b68 = function(A) {
return new Uint16Array(A);
}, t.wbg.__wbg_new_e3b321dcfef89fc7 = function(A) {
return new Uint32Array(A);
}, t.wbg.__wbg_newwithbyteoffsetandlength_e6b7e69acd4c7354 = function(A, e, s) {
return new Float32Array(A, e >>> 0, s >>> 0);
}, t.wbg.__wbg_newwithbyteoffsetandlength_f1dead44d1fc7212 = function(A, e, s) {
return new Uint32Array(A, e >>> 0, s >>> 0);
}, t.wbg.__wbg_newwithlength_5a5efe313cfd59f1 = function(A) {
return new Float32Array(A >>> 0);
}, t.wbg.__wbg_set_10bad9bee0e9c58b = function(A, e, s) {
A.set(e, s >>> 0);
}, t.wbg.__wbg_set_d23661d19148b229 = function(A, e, s) {
A.set(e, s >>> 0);
}, t.wbg.__wbg_set_f4f1f0daa30696fc = function(A, e, s) {
A.set(e, s >>> 0);
}, t.wbg.__wbg_subarray_3aaeec89bb2544f0 = function(A, e, s) {
return A.subarray(e >>> 0, s >>> 0);
}, t.wbg.__wbg_subarray_769e1e0f81bb259b = function(A, e, s) {
return A.subarray(e >>> 0, s >>> 0);
}, t.wbg.__wbindgen_init_externref_table = function() {
const A = ZA.__wbindgen_export_0, e = A.grow(4);
A.set(0, void 0), A.set(e + 0, void 0), A.set(e + 1, null), A.set(e + 2, !0), A.set(e + 3, !1);
}, t.wbg.__wbindgen_memory = function() {
return ZA.memory;
}, t.wbg.__wbindgen_throw = function(A, e) {
throw new Error(mg(A, e));
}, t;
}
function Ng(t, A) {
return ZA = t.exports, fs.__wbindgen_wasm_module = A, Ut = null, ZA.__wbindgen_start(), ZA;
}
async function fs(t) {
if (ZA !== void 0) return ZA;
typeof t < "u" && (Object.getPrototypeOf(t) === Object.prototype ? { module_or_path: t } = t : console.warn("using deprecated parameters for the initialization function; pass a single object instead")), typeof t > "u" && (t = new URL("data:application/wasm;base64,AGFzbQEAAAAB9wEkYAJ/fwF/YAN/f38Bf2ACf38AYAN/f38AYAF/AX9gAX8AYAV/f39/fwBgA29/fwFvYAV/f39/fwF/YAR/f39/AGABbwFvYANvb38AYAFvAX9gAAF/YAAAYAd/f39/f39/AX9gAX0BfWAGf39/f39/AGAEf39/fwF/YAF/AW9gAAFvYAd/f39/f39/AGACf34Bf2ADf35+AGACf34AYAt9fX19fX19fX9vfwFvYAZ/f39/f38Bf2AFf399f38AYAR/fX9/AGAFf39+f38AYAR/fn9/AGAFf398f38AYAR/fH9/AGADf35+AX9gA39vbwF/YAJ9fQF9AvIEEQN3YmcdX193YmdfYnVmZmVyXzYwOWNjM2VlZTUxZWQxNTgACgN3YmcaX193YmdfbmV3XzlmZWU5N2E0MDliMzJiNjgACgN3YmcaX193Ymdfc2V0X2Y0ZjFmMGRhYTMwNjk2ZmMACwN3YmcdX193YmdfbGVuZ3RoXzhjZmQyYzY0MDlhZjg4YWQADAN3YmcxX193YmdfbmV3d2l0aGJ5dGVvZmZzZXRhbmRsZW5ndGhfZjFkZWFkNDRkMWZjNzIxMgAHA3diZxpfX3diZ19uZXdfZTNiMzIxZGNmZWY4OWZjNwAKA3diZxpfX3diZ19zZXRfZDIzNjYxZDE5MTQ4YjIyOQALA3diZx1fX3diZ19sZW5ndGhfNmNhNTI3NjY1ZDg5Njk0ZAAMA3diZzFfX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9lNmI3ZTY5YWNkNGM3MzU0AAcDd2JnGl9fd2JnX3NldF8xMGJhZDliZWUwZTljNThiAAsDd2JnHV9fd2JnX2xlbmd0aF8zYjRmMDIyMTg4YWU4ZGI2AAwDd2JnH19fd2JnX3N1YmFycmF5Xzc2OWUxZTBmODFiYjI1OWIABwN3YmcfX193Ymdfc3ViYXJyYXlfM2FhZWVjODliYjI1NDRmMAAHA3diZyRfX3diZ19uZXd3aXRobGVuZ3RoXzVhNWVmZTMxM2NmZDU5ZjEAEwN3YmcQX193YmluZGdlbl90aHJvdwACA3diZxFfX3diaW5kZ2VuX21lbW9yeQAUA3diZx9fX3diaW5kZ2VuX2luaXRfZXh0ZXJucmVmX3RhYmxlAA4DvAG6AQQAAAYABAQE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QCADQQFxDQAgA0ECcUUNASABKAIAIgMgAGohACABIANrIgFB2NrAACgCAEYEQCACKAIEQQNxQQNHDQFB0NrAACAANgIAIAIgAigCBEF+cTYCBCABIABBAXI2AgQgAiAANgIADwsgASADEDkLAkACQAJAAkACQCACKAIEIgNBAnFFBEAgAkHc2sAAKAIARg0CIAJB2NrAACgCAEYNAyACIANBeHEiAhA5IAEgACACaiIAQQFyNgIEIAAgAWogADYCACABQdjawAAoAgBHDQFB0NrAACAANgIADwsgAiADQX5xNgIEIAEgAEEBcjYCBCAAIAFqIAA2AgALIABBgAJJDQIgASAAEEFBACEBQfDawABB8NrAACgCAEEBayIANgIAIAANBEG42MAAKAIAIgAEQANAIAFBAWohASAAKAIIIgANAAsLQfDawABB/x8gASABQf8fTRs2AgAPC0Hc2sAAIAE2AgBB1NrAAEHU2sAAKAIAIABqIgA2AgAgASAAQQFyNgIEQdjawAAoAgAgAUYEQEHQ2sAAQQA2AgBB2NrAAEEANgIACyAAQejawAAoAgAiA00NA0Hc2sAAKAIAIgJFDQNBACEAQdTawAAoAgAiBEEpSQ0CQbDYwAAhAQNAIAIgASgCACIFTwRAIAIgBSABKAIEakkNBAsgASgCCCEBDAALAAtB2NrAACABNgIAQdDawABB0NrAACgCACAAaiIANgIAIAEgAEEBcjYCBCAAIAFqIAA2AgAPCyAAQfgBcUHA2MAAaiECAn9ByNrAACgCACIDQQEgAEEDdnQiAHFFBEBByNrAACAAIANyNgIAIAIMAQsgAigCCAshACACIAE2AgggACABNgIMIAEgAjYCDCABIAA2AggPC0G42MAAKAIAIgEEQANAIABBAWohACABKAIIIgENAAsLQfDawABB/x8gACAAQf8fTRs2AgAgAyAETw0AQejawABBfzYCAAsL6QQBBX8CfwJAIAJBAk8EQCABKAIEIgRB//8BcUUEQCAEQRB0DAMLIARB/wdxIQUgBEGAgAJxIQMgBEGA+AFxIgZBgPgBRgRAIANBEHQhAyADQYCAgPwHciAFRQ0DGiADIAVBDXRyQYCAgP4HcgwDCyADQRB0IQMgBkUNASAGQQ10QYCAgPwAcSAFQQ10ckGAgIDAA2ogA3IMAgtBAUEBQfSEwAAQ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CCACQQxqIAEQkwEhAwsgAkEQaiQAIAMLhgIBA38jAEGAAWsiBCQAIAAoAgAhAAJ/AkAgASgCCCICQYCAgBBxRQRAIAJBgICAIHENASAAKAIAIAEQOAwCCyAAKAIAIQBBACECA0AgAiAEakH/AGogAEEPcSIDQTByIANB1wBqIANBCkkbOgAAIAJBAWshAiAAQQ9LIABBBHYhAA0ACyABQYO/wABBAiACIARqQYABakEAIAJrECEMAQsgACgCACEAQQAhAgNAIAIgBGpB/wBqIABBD3EiA0EwciADQTdqIANBCkkbOgAAIAJBAWshAiAAQQ9LIABBBHYhAA0ACyABQYO/wABBAiACIARqQYABakEAIAJrECELIARBgAFqJAALygECBH8BfiMAQSBrIgMkAAJAAkAgASABIAJqIgJLDQBBCCACIAAoAgAiAUEBdCIEIAIgBEsbIgIgAkEITRsiBK0iB0IgiFBFDQAgB6ciBUH/////B0sNACADIAEEfyADIAE2AhwgAyAAKAIENgIUQQEFQQALNgIYIANBCGpBASAFIANBFGoQXCADKAIIQQFHDQEgAygCECECIAMoAgwhBgsgBiACQaCOwAAQjAEACyADKAIMIQEgACAENgIAIAAgATYCBCADQSBqJAALiQIBAX8jAEEQayICJAAgACgCACEAAn8gAS0AC0EYcUUEQCABKAIAIAAgASgCBCgCEBEAAAwBCyACQQA2AgwgASACQQxqAn8gAEGAAU8EQCAAQYAQTwRAIABBgIAETwRAIAIgAEE/cUGAAXI6AA8gAiAAQRJ2QfABcjoADCACIABBBnZBP3FBgAFyOgAOIAIgAEEMdkE/cUGAAXI6AA1BBAwDCyACIABBP3FBgAFyOgAOIAIgAEEMdkHgAXI6AAwgAiAAQQZ2QT9xQYABcjoADUEDDAILIAIgAEE/cUGAAXI6AA0gAiAAQQZ2QcABcjoADEECDAELIAIgADoADEEBCxAmCyACQRBqJAALqgICA38BfiMAQUBqIgIkACABKAIAQYCAgIB4RgRAIAEoAgwhAyACQSRqIgRBADYCACACQoCAgIAQNwIcIAJBMGogAygCACIDQQhqKQIANwMAIAJBOGogA0EQaikCADcDACACIAMpAgA3AyggAkEcakH0mMAAIAJBKGoQKhogAkEYaiAEKAIAIgM2AgAg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AEEQayICJAAgAkEIaiABEHYgAiACKAIIIAIoAgwoAhgRAgAgAigCBCEBIAAgAigCADYCACAAIAE2AgQgAkEQaiQAC08BAn9BjdfAAC0AABogASgCBCECIAEoAgAhA0EIQQQQnwEiAUUEQEEEQQgQwQEACyABIAI2AgQgASADNgIAIABBrJ7AADYCBCAAIAE2AgALQQEBfyMAQSBrIgMkACADQQA2AhAgA0EBNgIEIANCBDcCCCADIAE2AhwgAyAANgIYIAMgA0EYajYCACADIAIQfgALPQECfyAAIAAoAgQiAyACazYCBCAAIAAoAgAgAiADS3IiBDYCAEEBIQMgBAR/IAMFIAAoAgggASACEJMBCws+AQF/IwBBEGsiAiQAIAJBCGogASABKAIAKAIEEQIAIAIoAgwhASAAIAIoAgg2AgAgACABNgIEIAJBEGokAAuuAwEDfyAAKAIAIQIgASgCCCIAQYCAgBBxRQRAIABBgICAIHFFBEAjAEEQayIAJABBAyEDIAItAAAiAiEEIAJBCk8EQCAAIAIgAkHkAG4iBEHkAGxrQf8BcUEBdCIDQYa/wABqLQAAOgAPIAAgA0GFv8AAai0AADoADkEBIQMLQQAgAiAEG0UEQCADQQFrIgMgAEENamogBEEBdEH+AXFBhr/AAGotAAA6AAALIAFBAUEAIABBDWogA2pBAyADaxAhIABBEGokAA8LIwBBgAFrIgQkACACLQAAIQBBACECA0AgAiAEakH/AGogAEEPcSIDQTByIANBN2ogA0EKSRs6AAAgAkEBayECIAAiA0EEdiEAIANBD0sNAAsgAUGDv8AAQQIgAiAEakGAAWpBACACaxAhIARBgAFqJAAPCyMAQYABayIEJAAgAi0AACEAQQAhAgNAIAIgBGpB/wBqIABBD3EiA0EwciADQdcAaiADQQpJGzoAACACQQFrIQIgACIDQQR2IQAgA0EPSw0ACyABQYO/wABBAiACIARqQYABakEAIAJrECEgBEGAAWokAAs4AAJAIAJBgIDEAEYNACAAIAIgASgCEBEAAEUNAEEBDwsgA0UEQEEADwsgACADIAQgASgCDBEBAAs8AQF/IwBBEGsiAiQAIAJB8KDAADYCDCACIAA2AgggAkEIakGkl8AAIAJBDGpBpJfAACABQbicwAAQPQALpQQBBn8jAEEQayIG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DJQgEiAOIA6UIBUgFZSSIA0gDZSSIBAgEZIgC5JDAABAQJUiCyALlJOUkyILQwAAAABdDQAgDIwgC5GTIBKVIgsgBmBFIAcgC2BFcg0AICgoAggiIyAoKAIARgRAIChB1ITAABBUCyAoKAIEICNBAnRqIAs4AgAgKCAjQQFqNgIICyAKIClBAnRqIQogJCApayIkDQALCyAnQRBqJAAgIigCFCIKQYQBTwRAIAoQVwsgJiIkICpJDQALCyAiKAIQISQgKygCAEEBags2AgAgJBANIQkQWCIIIAkmASAiIAg2AiQgIigCDCEmICIoAhAhIyMAQSBrIiUkACAlICJBJGooAgAiJCUBEAoiCjYCACAlICM2AgQCQCAKICNGBEAQlwEiKhCPASIKJQEgJiAjEAghCRBYIiYgCSYBICpBhAFPBEAgKhBXCyAKQYQBTwRAIAoQVwsgJCUBICYlAUEAEAkgJkGEAU8EQCAmEFcLICVBIGokAAwBCyAlQQA2AgggJSAlQQRqICVBCGoQewALICIoAggiCgRAICIoAgwgCkECdEEEEKkBCyAiKAIEIgpBhAFPBEAgChBXCyAiQTBqJAAgCAwCCxBuAAsgJCAsQbiJwAAQrAEACyIIJQEgCBBXC/oBAgJ/AX4jAEEQayICJAAgAkEBOwEMIAIgATYCCCACIAA2AgQjAEEQayIBJAAgAkEEaiIAKQIAIQQgASAANgIMIAEgBDcCBCMAQRBrIgAkACABQQRqIgEoAgAiAigCDCEDAkACQAJAAkAgAigCBA4CAAECCyADDQFBASECQQAhAwwCCyADDQAgAigCACICKAIEIQMgAigCACECDAELIABBgICAgHg2AgAgACABNgIMIABB2J7AACABKAIEIAEoAggiAC0ACCAALQAJEFEACyAAIAM2AgQgACACNgIAIABBvJ7AACABKAIEIAEoAggiAC0ACCAALQAJEFEACyUAIABFBEBBpJXAAEEyELYBAAsgACACIAMgBCAFIAEoAhARCAALKAAgASAAKAIALQAAQQJ0IgBB5K/AAGooAgAgAEHQr8AAaigCABCTAQsjACAARQRAQaSVwABBMhC2AQALIAAgAiADIAQgASgCEBEJAAsjACAARQRAQaSVwABBMhC2AQALIAAgAiADIAQgASgCEBEcAAsjACAARQRAQaSVwABBMhC2AQALIAAgAiADIAQgASgCEBEeAAsjACAARQRAQaSVwABBMhC2AQALIAAgAiADIAQgASgCEBEgAAsjACAARQRAQaSVwABBMhC2AQALIAAgAiADIAQgASgCEBESAAsoAQF/IAAoAgAiAUGAgICAeHJBgICAgHhHBEAgACgCBCABQQEQqQELCygAIABBHGpBACACQoC834WrpfibJ1EbQQAgAUKf9ZaU1u7tw6F/URsLIQAgAEUEQEGklcAAQTIQtgEACyAAIAIgAyABKAIQEQMACx8AIABFBEBBpJXAAEEyELYBAAsgACACIAEoAhARAAALqxcBDX8QWCIHIAEmAQJ/IAAhBBBYIgAgAiYBIwBB0ABrIgkkACAJIAA2AhggCSAHNgIUIAlBFGooAgAQxgEhC0HM1sAAKAIARQRAQfTWwABBADYCAEHo1sAAQQA2AgBB3NbAAEEANgIAQdDWwABBADYCAEHw1sAAKAIAIQVB8NbAAEEENgIAQezWwAAoAgAhDEHs1sAAQQA2AgBB5NbAACgCACEIQeTWwABBBDYCAEHg1sAAKAIAIQZB4NbAAEEANgIAQdjWwAAoAgAhB0HY1sAAQQI2AgBB1NbAACgCACEDQdTWwABBADYCAEHM1sAAKAIAIQBBzNbAAEEBNgIAAkAgAEUNACADBEAgByADQQF0QQIQqQELIAYEQCAIIAZBAnRBBBCpAQsgDEUNACAFIAxBAnRBBBCpAQsLAkACQAJAAkACQEHQ1sAAKAIARQRAQdDWwABBfzYCAEHc1sAAKAIAIgcgC0kEQCALIAciAGsiBkHU1sAAKAIAIABrSwRAQdTWwAAgACAGQQJBAhBLQdzWwAAoAgAhAAtB2NbAACgCACIFIABBAXRqIQMgBkECTwRAIAsgB0F/c2pBAXQiCARAIANBACAI/AsACyAAIAtqQQF0IAdBAXRrIAVqQQJrIQMgACAGakEBayEACyADQQA7AQBB3NbAACAAQQFqNgIAC0Ho1sAAKAIAIgcgC0kEQCALIAciAGsiBkHg1sAAKAIAIABrSwRAQeDWwAAgACAGQQRBBBBLQejWwAAoAgAhAAtB5NbAACgCACIFIABBAnRqIQMgBkECTwRAIAsgB0F/c2pBAnQiCARAIANBACAI/AsACyAAIAtqQQJ0IAdBAnRrIAVqQQRrIQMgACAGakEBayEACyADQQA2AgBB6NbAACAAQQFqNgIAC0H01sAAKAIAIgdBgPgBTQRAQYH4ASAHIgBrIghB7NbAACgCACAAa0sEQEHs1sAAIAAgCEEEQQQQS0H01sAAKAIAIQALQfDWwAAoAgAiBiAAQQJ0IgNqIQwgB0GA+AFHBH9BgOAHIAdBAnQiBWsiCARAIAxBACAI/AsACyAAIAdrQYD4AWohACADIAVrIAZqQYDgB2oFIAwLQQA2AgBB9NbAACAAQQFqNgIACyAJQRRqKAIAJQFBACAEEAshARBYIgAgASYBIAkgADYCHCAEQdzWwAAoAgAiAEsNAUHY1sAAKAIAIQUjAEEgayIAJAAgACAJQRxqIggoAgAQxgEiBzYCACAAIAQ2AgQgBCAHRw0FEJcBIgMQjwEiByUBEAEhARBYIgYgASYBIAdBhAFPBEAgBxBXCyAGJQEgCCgCACUBIAVBAXYQAiAGQYQBTwRAIAYQVwsgA0GEAU8EQCADEFcLIABBIGokACAJQQhqIQtBACEDIwBBQGoiCiQAAkAgBCIIQdzWwAAoAgAiAE0EQEHY1sAAKAIAIQRB9NbAAEEANgIAQezWwAAoAgBBgPgBTQRAQezWwABBAEGB+AFBBEEEEEtB9NbAACgCACEDC0Hw1sAAKAIAIg0gA0ECdGoiAEEAQYDgB/wLAEH01sAAIANBgfgBaiIPNgIAIABBgOAHakEANgIAIAhBAXQhBwJAIAgEQCAHIQAgBCEFA0AgBS8BACIGQYD4AUkEQCAGIA9PDQMgDSAGQQJ0aiIGIAYoAgBBAWo2AgALIAVBAmohBSAAQQJrIgANAAsLIA0gD0ECdGpBCGsiBSgCACEAIAVBADYCACAKIAA2AgggBSANRwRAIANBA3FBAUcEQCADQQFrQQNxIQ4DQCAFQQRrIgUoAgAhAyAFIAA2AgAgCiAAIANqIgA2AgggDkEBayIODQALCyAFQRBrIQUDQCAFQQxqIgYoAgAhAyAGIAA2AgAgCiAAIANqIgY2AgggBUEIaiIDKAIAIQAgAyAGNgIAIAogACAGaiIGNgIIIAVBBGoiAygCACEAIAMgBjYCACAKIAAgBmoiAzYCCCAFKAIAIQAgBSADNgIAIAogACADaiIANgIIIAUgDUcgBUEQayEFDQALCyAIRQ0CIAQgB2ohBSAEQQJqIQMgCEEBa0H/////B3FBAWohCEHk1sAAKAIAIQdB6NbAACgCACEMQQAhDgNAIAQvAQAiBEGA+AFJBEACQCAEIA9JBEAgDSAEQQJ0aiIGKAIAIgQgDEkNASAEIAxBlITAABBoAAsgBCAPQYSEwAAQaAALIAcgBEECdGogDjYCACAGIAYoAgBBAWo2AgALIAMiBCAFR0EBdCAEaiEDIAggDkEBaiIORw0ACwwCCyAGIA9BpITAABBoAAsgCCAAQcSDwAAQrAEACyAAIA0oAgBGBH9BAAUgCkECNgIcIApB9IPAADYCGCAKQgI3AiQgCiANrUKAgICAgAOENwM4IAogCkEIaq1CgICAgIADhDcDMCAKIApBMGo2AiAgCkEMaiEIQQAhBSAKQRhqIgQoAgwhAAJAAkACQAJAAkACQAJAIAQoAgQOAgABAgsgAA0BQQEhAEEAIQNBASEEDAMLIABFDQELIAggBBA0DAMLIAQoAgAiACgCBCIDQQBIDQEgACgCACEAIANFBEBBASEEQQAhAwwBC0GN18AALQAAGkEBIQUgA0EBEJ8BIgRFDQELIAMEQCAEIAAgA/wKAAALIAggAzYCCCAIIAQ2AgQgCCADNgIADAELIAUgA0GUg8AAEIwBAAsjAEEgayIEJAAgBEEIaiEHIwBBIGsiBSQAAkACQAJAAkACQAJAQZjXwAAtAAAOAgABAgtBmNfAAEEBOgAACyAHQQE2AgAMAQtBmdfAAC0AACEAQZnXwABBAToAACAFIAA6AAcgAEEBRg0BIAdBADoAFCAHQQA2AgBBmdfAAEEAOgAACyAFQSBqJAAMAQsgBUIANwIUIAVCgYCAgMAANwIMIAVBhJzAADYCCCAFQQdqIAVBCGoQeQALQY3XwAAtAAAaQShBBBCfASIARQRAQQRBKBDBAQALIABBgILAADYCACAAIAcpAgA3AgQgACAIKQIANwIcIABBDGogB0EIaikCADcCACAAQRRqIAdBEGopAgA3AgAgAEEkaiAIQQhqKAIANgIAIARBIGokAEEBCyEEIAsgADYCBCALIAQ2AgAgCkFAayQAIAkoAgwhBiAJKAIIQQFxDQIgBkUNBEHo1sAAKAIAIgAgBkkNA0Hk1sAAKAIAIQggCSAJQRhqQQAgBhCqASIDNgIwIwBBIGsiACQAIAAgCUEwaigCACIHEMcBIgQ2AgAgACAGNgIEAkAgBCAGRgRAEJcBIgUQjwEiBCUBIAggBhAEIQEQWCIIIAEmASAFQYQBTwRAIAUQVwsgBEGEAU8EQCAEEFcLIAcgCEEAEKgBIAhBhAFPBEAgCBBXCyAAQSBqJAAMAQsMBgsgA0GEAUkNBCADEFcMBAsQbgALIAQgAEGQicAAEKwBAAsgCSAGNgIgIAlBATYCNCAJQbCJwAA2AjAgCUIBNwI8IAkgCUEgaq1CgICAgJADhDcDSCAJIAlByABqNgI4IAlBJGohCEEAIQAgCUEwaiIHKAIMIQQCQAJAAkACQAJAAkACQCAHKAIEDgIAAQILIAQNAUEBIQNBACEEQQEhBQwDCyAERQ0BCyAIIAcQNAwDCyAHKAIAIgcoAgQiBEEASA0BIAcoAgAhAyAERQRAQQEhBUEAIQQMAQtBjdfAAC0AABpBASEAIARBARCfASIFRQ0BCyAEBEAgBSADIAT8CgAACyAIIAQ2AgggCCAFNgIEIAggBDYCAAwBCyAAIARB5IjAABCMAQALIAkoAiggCSgCLBC2AQALIAYgAEGgicAAEKwBAAsgCSgCHCIAQYQBTwRAIAAQVwtB0NbAAEHQ1sAAKAIAQQFqNgIAIAkoAhgiAEGEAU8EQCAAEFcLIAkoAhQiAEGEAU8EQCAAEFcLIAlB0ABqJAAgBgwBCyAAQQA2AgggACAAQQRqIABBCGoQewALCxoBAX8gACgCACIBBEAgACgCBCABQQEQqQELC0EAIAAEQCAAIAEQwQEACyMAQSBrIgAkACAAQQA2AhggAEEBNgIMIABB/LHAADYCCCAAQgQ3AhAgAEEIaiACEH4ACxQAIAEgASAAIAAgAV0bIAAgAFwbCxwAIABBADYCECAAQgA3AgggAEKAgICAwAA3AgALFgEBbyAAJQEQACEBEFgiACABJgEgAAsWACAAQZiBwAA2AgQgACABQRxqNgIAC+kGAQZ/An8CQAJAAkACQAJAIABBBGsiBSgCACIGQXhxIgRBBEEIIAZBA3EiBxsgAWpPBEAgB0EAIAFBJ2oiCSAESRsNAQJAAkAgAkEJTwRAIAIgAxA1IggNAUEADAkLIANBzP97Sw0BQRAgA0ELakF4cSADQQtJGyEBAkAgB0UEQCABQYACSSAEIAFBBHJJciAEIAFrQYGACE9yDQEMCQsgAEEIayICIARqIQcCQAJAAkACQCABIARLBEAgB0Hc2sAAKAIARg0EIAdB2NrAACgCAEYNAiAHKAIEIgZBAnENBSAGQXhxIgYgBGoiBCABSQ0FIAcgBhA5IAQgAWsiA0EQSQ0BIAUgASAFKAIAQQFxckECcjYCACABIAJqIgEgA0EDcjYCBCACIARqIgIgAigCBEEBcjYCBCABIAMQMQwNCyAEIAFrIgNBD0sNAgwMCyAFIAQgBSgCAEEBcXJBAnI2AgAgAiAEaiIBIAEoAgRBAXI2AgQMCwtB0NrAACgCACAEaiIEIAFJDQICQCAEIAFrIgNBD00EQCAFIAZBAXEgBHJBAnI2AgAgAiAEaiIBIAEoAgRBAXI2AgRBACEDQQAhAQwBCyAFIAEgBkEBcXJBAnI2AgAgASACaiIBIANBAXI2AgQgAiAEaiICIAM2AgAgAiACKAIEQX5xNgIEC0HY2sAAIAE2AgBB0NrAACADNgIADAoLIAUgASAGQQFxckECcjYCACABIAJqIgEgA0EDcjYCBCAHIAcoAgRBAXI2AgQgASADEDEMCQtB1NrAACgCACAEaiIEIAFLDQcLIAMQESIBRQ0BIANBfEF4IAUoAgAiAkEDcRsgAkF4cWoiAiACIANLGyICBEAgASAAIAL8CgAACyAAECQgAQwICyADIAEgASADSxsiAgRAIAggACAC/AoAAAsgBSgCACICQXhxIgMgAUEEQQggAkEDcSICG2pJDQMgAkEAIAMgCUsbDQQgABAkCyAIDAYLQbWZwABBLkHkmcAAEHQAC0H0mcAAQS5BpJrAABB0AAtBtZnAAEEuQeSZwAAQdAALQfSZwABBLkGkmsAAEHQACyAFIAEgBkEBcXJBAnI2AgAgASACaiICIAQgAWsiAUEBcjYCBEHU2sAAIAE2AgBB3NrAACACNgIAIAAMAQsgAAsLGQAgASgCAEGMvMAAQQ4gASgCBCgCDBEBAAsWACAAKAIAIAEgAiAAKAIEKAIMEQEACxQAIAAoAgAgASAAKAIEKAIQEQAACxQAIAAoAgAgASAAKAIEKAIMEQAAC4IIAQR/IwBB8ABrIgUkACAFIAM2AgwgBSACNgIIAn8gAUGBAk8EQAJ/QYACIAAsAIACQb9/Sg0AGkH/ASAALAD/AUG/f0oNABpB/gFB/QEgACwA/gFBv39KGwsiBiAAaiwAAEG/f0oEQEHExcAAIQdBBQwCCyAAIAFBACAGIAQQlgEAC0EBIQcgASEGQQALIQggBSAGNgIUIAUgADYCECAFIAg2AhwgBSAHNgIYAkACQAJAAkAgASACSSIGIAEgA0lyRQRAIAIgA0sNASACRSABIAJNckUEQCAFQQxqIAVBCGogACACaiwAAEG/f0obKAIAIQMLIAUgAzYCICADIAEiAkkEQCADQQFqIgIgA0EDayIGQQAgAyAGTxsiBkkNAwJ/IAIgBmsiB0EBayAAIANqLAAAQb9/Sg0AGiAHQQJrIAAgAmoiAkECaywAAEG/f0oNABogB0EDayACQQNrLAAAQb9/Sg0AGiAHQXxBeyACQQRrLAAAQb9/ShtqCyAGaiECCwJAIAJFDQAgASACTQRAIAEgAkYNAQwFCyAAIAJqLAAAQb9/TA0ECwJ/AkACQCABIAJGDQACQAJAIAAgAmoiASwAACIAQQBIBEAgAS0AAUE/cSEGIABBH3EhAyAAQV9LDQEgA0EGdCAGciEADAILIAUgAEH/AXE2AiRBAQwECyABLQACQT9xIAZBBnRyIQYgAEFwSQRAIAYgA0EMdHIhAAwBCyADQRJ0QYCA8ABxIAEtAANBP3EgBkEGdHJyIgBBgIDEAEYNAQsgBSAANgIkIABBgAFPDQFBAQwCCyAEEK8BAAtBAiAAQYAQSQ0AGkEDQQQgAEGAgARJGwshACAFIAI2AiggBSAAIAJqNgIsIAVBBTYCNCAFQczGwAA2AjAgBUIFNwI8IAUgBUEYaq1CgICAgJAMhDcDaCAFIAVBEGqtQoCAgICQDIQ3A2AgBSAFQShqrUKAgICAsAyENwNYIAUgBUEkaq1CgICAgMAMhDcDUCAFIAVBIGqtQoCAgICAA4Q3A0gMBAsgBSACIAMgBhs2AiggBUEDNgI0IAVBjMfAADYCMCAFQgM3AjwgBSAFQRhqrUKAgICAkAyENwNYIAUgBUEQaq1CgICAgJAMhDcDUCAFIAVBKGqtQoCAgICAA4Q3A0gMAwsgBUEENgI0IAVB7MXAADYCMCAFQgQ3AjwgBSAFQRhqrUKAgICAkAyENwNgIAUgBUEQaq1CgICAgJAMhDcDWCAFIAVBDGqtQoCAgICAA4Q3A1AgBSAFQQhqrUKAgICAgAOENwNIDAILIAYgAkGkx8AAEK0BAAsgACABIAIgASAEEJYBAAsgBSAFQcgAajYCOCAFQTBqIAQQfgALFAIBbwF/EA8hABBYIgEgACYBIAELEwAgAEEoNgIEIABBgIDAADYCAAsTACAAQdSBwAA2AgQgACABNgIACxMAIABBKDYCBCAAQYSGwAA2AgALIQAgAELUnP3HsryhmMUANwMIIABClLiFgpHLl7R0NwMACyAAIABC7Lz5lKyqlJNxNwMIIABC+enA7KyX2tdONwMACxAAIAAoAgQgACgCCCABEBwLEQAgACgCBCAAKAIIIAEQwwELGQACfyABQQlPBEAgASAAEDUMAQsgABARCwsiACAAQu26rbbNhdT14wA3AwggAEL4gpm9le7Gxbl/NwMACyEAIABCgLzfhaul+JsnNwMIIABCn/WWlNbu7cOhfzcDAAsRACAAKAIAIAAoAgQgARDDAQsTACAAQayewAA2AgQgACABNgIACxEAIAEgACgCACAAKAIEEJMBCxAAIAAoAgAgACgCBCABEBwLEAAgASAAKAIAIAAoAgQQJgsQACABKAIAIAEoAgQgABAqCw4AIAAlASABJQEgAhAGC18BAX8CQAJAIABBBGsoAgAiAkF4cSIDQQRBCCACQQNxIgIbIAFqTwRAIAJBACADIAFBJ2pLGw0BIAAQJAwCC0G1mcAAQS5B5JnAABB0AAtB9JnAAEEuQaSawAAQdAALCx0BAW8gACgCACUBIAEgAhAMIQMQWCIAIAMmASAAC2oBAX8jAEEwayIDJAAgAyABNgIEIAMgADYCACADQQI2AgwgA0Gk1MAANgIIIANCAjcCFCADIANBBGqtQoCAgICAA4Q3AyggAyADrUKAgICAgAOENwMgIAMgA0EgajYCECADQQhqIAIQfgALagEBfyMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQcTUwAA2AgggA0ICNwIUIAMgA0EEaq1CgICAgIADhDcDKCADIAOtQoCAgICAA4Q3AyAgAyADQSBqNgIQIANBCGogAhB+AAtqAQF/IwBBMGsiAyQAIAMgATYCBCADIAA2AgAgA0ECNgIMIANB+NTAADYCCCADQgI3AhQgAyADQQRqrUKAgICAgAOENwMoIAMgA61CgICAgIADhDcDICADIANBIGo2AhAgA0EIaiACEH4ACwsAIAAoAgAgARA4Cw4AQbW8wABBKyAAEHQAC+8CAgV/A34gACkDACEJIwBBIGsiAyQAQRQhACAJIgdC6AdaBEAgByEIA0AgA0EMaiAAaiICQQNrIAggCEKQzgCAIgdCkM4Afn2nIgRB//8DcUHkAG4iBUEBdCIGQYa/wABqLQAAOgAAIAJBBGsgBkGFv8AAai0AADoAACACQQFrIAQgBUHkAGxrQf//A3FBAXQiBEGGv8AAai0AADoAACACQQJrIARBhb/AAGotAAA6AAAgAEEEayEAIAhC/6ziBFYgByEIDQALCyAHQglWBEAgACADakELaiAHpyICIAJB//8DcUHkAG4iAkHkAGxrQf//A3FBAXQiBEGGv8AAai0AADoAACAAQQJrIgAgA0EMamogBEGFv8AAai0AADoAACACrSEHCyAJUEUgB1BxRQRAIABBAWsiACADQQxqaiAHp0EBdEEecUGGv8AAai0AADoAAAsgAUEBQQAgA0EMaiAAakEUIABrECEgA0EgaiQACw0AIABBpIrAACABECoLDQAgAEGwjsAAIAEQKgsKACAAIAEgAhAqCw4AIAFBhJDAAEEFEJMBC8IDAgZ/AX4gACgCACEAIwBB0ABrIgIkACACQSBqIAAgACgCACgCBBECACACIAJByABqrUKAgICAwASENwMoQQEhAyACQQE2AjQgAkH4kcAANgIwIAJCATcCPCACIAIpAyA3AkggAiACQShqNgI4AkAgASgCACIGIAEoAgQiByACQTBqECoNACABLQAKQYABcUUEQEEAIQMMAQsgAkEYaiAAIAAoAgAoAgQRAgAgAkEQaiACKAIYIAIoAhwoAhgRAgAgAigCECIERQRAQQAhAwwBCyACQQhqIAQgAigCFCIFKAIYEQIAIAIoAgwhASACKAIIIQAgAiAFNgIsIAIgBDYCKCACQQE2AjQgAkGEksAANgIwIAJCATcCPCACIAJBKGqtQoCAgIDABIQiCDcDSCACIAJByABqNgI4IAYgByACQTBqELMBDQADQCAARQRAQQAhAwwCCyACIAAgASgCGBECACACKAIEIAIoAgAgAiABNgIsIAIgADYCKCACQQE2AjQgAkGEksAANgIwIAJCATcCPCACIAg3A0ggAiACQcgAajYCOCEAIQEgBiAHIAJBMGoQswFFDQALCyACQdAAaiQAIAMLCQAgACABEA4ACykAAn8gACgCAC0AAEUEQCABQejAwABBBRAmDAELIAFB7cDAAEEEECYLCw0AIABB9JjAACABECoLygECA38BfiAAKAIAIQIjAEGAAWsiBCQAAkAgASkCCCIFpyIAQYCAgARxRQ0AIABBgICAwABxBEAgAEGAgIAIciEADAELIAFBCjsBDCAAQYCAgMgAciEACyABIABBgICABHI2AghBACEAA0AgACAEakH/AGogAkEPcSIDQTByIANB1wBqIANBCkkbOgAAIABBAWshACACQQ9LIAJBBHYhAg0ACyABQYO/wABBAiAAIARqQYABakEAIABrECEgASAFNwIIIARBgAFqJAALDAAgACABKQIANwMACw0AIAFB8aDAAEECECYLDQAgAEGEpMAAIAEQKgsOACABQa+jwABBBRCTAQsOACABQbyvwABBEhCTAQsNACAAQdCxwAAgARAqCw4AIAFByLHAAEEFEJMBCxkAIAAgAUGc18AAKAIAIgBBOiAAGxECAAALDQAgAEHYvsAAIAEQKgsKACACIAAgARAmCwkAIABBADYCAAvTNwIdfwF+IwBB8ABrIgUkACAFQSBqIAAgACgCACgCBBECACAFIAUoAiQiAjYCLCAFIAUoAiAiBDYCKAJAAkACQAJAIAEiDi0ACkGAAXFFBEBBASERIAVBATYCXCAFQfiRwAA2AlggBUIBNwJkIAUgBUEoaq1CgICAgMAEhDcDOCAFIAVBOGo2AmAgASgCACABKAIEIAVB2ABqECoNBCAFQRhqIAUoAiggBSgCLCgCGBECACAFKAIYIgIEQCAFKAIcIQEgDigCAEGMksAAQQwgDigCBCgCDBEBAA0FIAVBEGogAiABKAIYEQIAIAVBMGqtQoCAgIDABIQhHyAFKAIQQQBHIQNBACERA0AgBUEIaiACIAEoAhgRAgAgBSgCDCAFKAIIIQggBSABNgI0IAUgAjYCMCAFQQA2AmggBUEBNgJcIAVBnJLAADYCWCAFQgQ3AmAgDigCACAOKAIEIAVB2ABqIgEQswENBCAFQQA6AEQgBSARNgI8IAUgAzYCOCAFIA42AkAgBUEBNgJcIAVB+JHAADYCWCAFQgE3AmQgBSAfNwNIIAUgBUHIAGo2AmAgBUE4akHckMAAIAEQKg0EIBFBAWohESEBIAgiAg0ACwsCQCAAKAIEIgJBA0cEQCAAQQRqIQAMAQsgACAAKAIAKAIYEQQAIgBFDQIgACgCACECC0EAIREgAkECRw0EIAVBADYCQCAFQoCAgIAQNwI4IAVByI7AADYCXCAFQqCAgIAONwJgIAUgBUE4ajYCWCAFQdgAaiECIwBBoAFrIgMkAAJ/AkACQAJAAkACQAJ/AkACQAJAAkAgACgCAEEBaw4CAAECCyACQaWbwABBEhCTAQwJCyAALQAUQQNHBEAgAyAAQQRqNgI4IANBOGohBCMAQSBrIgEkAAJAAkACQAJAAkACQAJAIABBFGoiCC0AAEEBaw4DBAEDAAsgCEECOgAAIAQoAgAgBEEANgIABEBBmdfAAC0AACEEQZnXwABBAToAACABIAQ6AAcgBEEBRw0CIAFCADcCFCABQoGAgIDAADcCDCABQYScwAA2AgggAUEHaiABQQhqEHkAC0HsnMAAEK8BAAsgAUEANgIYIAFBATYCDCABQeigwAA2AggMAwtBmdfAAEEAOgAAIAhBAzoAAAsgAUEgaiQADAILIAFBADYCGCABQQE2AgwgAUGooMAANgIICyABQgQ3AhAgAUEIakGgncAAEH4ACwsgACgCDCEBIAIoAghBgICABHEiCEUNASAAKAIIDAILIAJBkJvAAEEVEJMBDAcLIAEgACgCECIESQ0BIAEgBGshASAAKAIIIARBDGxqCyESIANBgICAgHg2AgwgA0GIm8AAKQMANwIQIAMgCEEXdiIAOgAYIAMgADoALCADQQA2AiggAyACNgIcIANByJvAADYCJCADIANBDGo2AiAgAUUNAiASIAFBDGxqIRggA0E8aiEUIANBhAFqIRUDQAJAIBIoAggiAEUEQCADQQA2AmQgAyADQRxqNgJgIANBAzYCOCADQQI2AoABIANB4ABqIANBOGogA0GAAWpBACADQQAgAxAaIAMoAmAiASABKAIMQQFqNgIMRQ0BDAcLIABBLGwhGSASKAIEIRpBACEWA0AgA0EANgI0IAMgA0EcajYCMAJAIBYgGmoiD0EgaigCAEGAgICAeEcEQCADQYABaiITIA9BJGooAgAiGyAPQShqKAIAIhwQI0ECIQACQCADKAKAAQ0AIAMoAoQBIQkgAygCiAEhASMAQSBrIgskAEEAIQojAEHgAGsiBiQAIAZBEGogCSABQfStwABBBhAUAkAgBigCEEUEQANAIAZB1ABqIAZBEGoQGSAGKAJUIgBBAUYNAAsC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AAAANQAAABUAAACkARAAHQAAACYAAAAUAAAAc3BhcmstaW50ZXJuYWwtcnMvc3JjL3JheWNhc3QucnM0AhAAIAAAADUAAAAXAAAANAIQACAAAACCAAAAFwAAADQCEAAgAAAAiAAAABwAAAA0AhAAIAAAAIoAAAAcAAAANAIQACAAAACPAAAAIAAAAC9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvc3RkL3NyYy90aHJlYWQvbG9jYWwucnMApAIQAE8AAAAUAgAAJgAAAGRlc2NyaXB0aW9uKCkgaXMgZGVwcmVjYXRlZDsgdXNlIERpc3BsYXkaAAAADAAAAAQAAAACAAAAGgAAAAwAAAAEAAAAAwAAAAIAAAAsAxAABwAAAAUAAAAbAAAABwAAABwAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBpbnZhbGlkIE9uY2Ugc3RhdGVoAxAAPAAAAC9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvc3RkL3NyYy9zeXMvc3luYy9vbmNlL25vX3RocmVhZHMucnMArAMQAFsAAAA1AAAAEgAAAC9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvYWxsb2Mvc3JjL3NsaWNlLnJzAAAYBBAASgAAAL4BAAAdAAAAc3BhcmstaW50ZXJuYWwtcnMvc3JjL2xpYi5yc3QEEAAcAAAAHAAAADMAAAB0BBAAHAAAACcAAAAtAAAAAQAAAAAAAAB0BBAAHAAAAD8AAAAoAAAAL3J1c3RjLzE3MDY3ZTlhYzZkN2VjYjcwZTUwZjkyYzE5NDRlNTQ1MTg4ZDIzNTkvbGlicmFyeS9hbGxvYy9zcmMvdmVjL21vZC5yc8gEEABMAAAAVgoAACQAAAAAAAAAEAAAAAQAAAAdAAAAHgAAAB8AAAAgICAgOiAAAAEAAAAAAAAAQAUQAAIAAAAgICAgICAgL3J1c3RjLzE3MDY3ZTlhYzZkN2VjYjcwZTUwZjkyYzE5NDRlNTQ1MTg4ZDIzNTkvbGlicmFyeS9jb3JlL3NyYy9wdHIvbW9kLnJzAABbBRAASwAAAAsCAAABAAAAL3J1c3RjLzE3MDY3ZTlhYzZkN2VjYjcwZTUwZjkyYzE5NDRlNTQ1MTg4ZDIzNTkvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9pbmRleC5ycwC4BRAATwAAAEwDAAA0AAAAuAUQAE8AAABTAwAAMgAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuaXNfY2hhcl9ib3VuZGFyeShuKS9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwAAAFIGEABLAAAA7QcAAB0AAABSBhAASwAAAPUHAAAdAAAAUgYQAEsAAAB9BQAAGwAAAC9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMvbW9kLnJz0AYQAFAAAAAuAgAAEQAAACAAAAAMAAAABAAAACEAAAAiAAAAIwAAACYAAAAMAAAABAAAACcAAAAoAAAAIwBB6I7AAAvJGQEAAAApAAAAYSBEaXNwbGF5IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yIHVuZXhwZWN0ZWRseS9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwAApwcQAEsAAADRCgAADgAAAEVycm9yAAAApwcQAEsAAAB9BQAAGwAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuaXNfY2hhcl9ib3VuZGFyeShuZXdfbGVuKacHEABLAAAAsgUAAA0AAAAAAAAAEAAAAAQAAAAdAAAAHgAAAB8AAABiYWNrdHJhY2UgY2FwdHVyZSBmYWlsZWQvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9hbnlob3ctMS4wLjk4L3NyYy9lcnJvci5yc4wIEABcAAAAZwQAAA4AAAABAAAAAAAAADogAAAACRAAAgAAAAoKQ2F1c2VkIGJ5OgoAAAAYCRAAAQAAAAoKc3RhY2sgYmFja3RyYWNlOlN0YWNrIGJhY2t0cmFjZToKADYJEAARAAAAUy9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvY29yZS9zcmMvaXRlci90cmFpdHMvaXRlcmF0b3IucnMAAABRCRAAWAAAAMEHAAAJAAAAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvanMtc3lzLTAuMy43Ny9zcmMvbGliLnJzAAC8CRAAWgAAAPsYAAABAAAAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLTAuMi4xMDAvc3JjL2NvbnZlcnQvc2xpY2VzLnJzKAoQAGwAAAAkAQAADgAAAGNsb3N1cmUgaW52b2tlZCByZWN1cnNpdmVseSBvciBhZnRlciBiZWluZyBkcm9wcGVkTGF6eSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVk1goQACoAAAAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9vbmNlX2NlbGwtMS4yMS4zL3NyYy9saWIucnMAAAAICxAAXQAAAAgDAAAZAAAAcmVlbnRyYW50IGluaXQAAHgLEAAOAAAACAsQAF0AAAB6AgAADQAAADogAAAAAAAABAAAAAQAAAA7AAAAL3J1c3RjLzE3MDY3ZTlhYzZkN2VjYjcwZTUwZjkyYzE5NDRlNTQ1MTg4ZDIzNTkvbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzALQLEABLAAAAfQUAABsAAAAvcnVzdGMvMTcwNjdlOWFjNmQ3ZWNiNzBlNTBmOTJjMTk0NGU1NDUxODhkMjM1OS9saWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjL21vZC5ycxAMEABQAAAALgIAABEAAAA6AAAAPAAAAAwAAAAEAAAAPQAAAD4AAAA/AAAAL3J1c3QvZGVwcy9kbG1hbGxvYy0wLjIuNy9zcmMvZGxtYWxsb2MucnNhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA+PSBzaXplICsgbWluX292ZXJoZWFkAIwMEAApAAAAqAQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAACMDBAAKQAAAK4EAAANAAAAbGlicmFyeS9zdGQvc3JjL2JhY2t0cmFjZS5yc29wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm1QDRAAKAAAACQAAAAAAAAAAgAAAHgNEAB1bnN1cHBvcnRlZCBiYWNrdHJhY2VkaXNhYmxlZCBiYWNrdHJhY2UANA0QABwAAACKAQAAHQAAAEAAAAAQAAAABAAAAEEAAABCAAAAAQAAAAAAAABjYW5ub3QgcmVjdXJzaXZlbHkgYWNxdWlyZSBtdXRleOQNEAAgAAAAbGlicmFyeS9zdGQvc3JjL3N5cy9zeW5jL211dGV4L25vX3RocmVhZHMucnMMDhAALAAAABMAAAAJAAAAbGlicmFyeS9zdGQvc3JjL3N5bmMvcG9pc29uL29uY2UucnMASA4QACMAAACbAAAAMgAAAGxpYnJhcnkvc3RkL3NyYy9zeW5jL2xhenlfbG9jay5ycwAAAHwOEAAhAAAA0QAAABMAAAA8dW5rbm93bj7vv71tZW1vcnkgYWxsb2NhdGlvbiBvZiAgYnl0ZXMgZmFpbGVkAAC8DhAAFQAAANEOEAANAAAAbGlicmFyeS9zdGQvc3JjL2FsbG9jLnJz8A4QABgAAABkAQAACQAAAAoAAAA8AAAADAAAAAQAAABDAAAAAAAAAAgAAAAEAAAARAAAAAAAAAAIAAAABAAAAEUAAABGAAAARwAAAEgAAABJAAAAEAAAAAQAAABKAAAASwAAAEwAAABNAAAAbGlicmFyeS9zdGQvc3JjLy4uLy4uL2JhY2t0cmFjZS9zcmMvc3ltYm9saXplL21vZC5yc3QPEAA0AAAAZwEAADAAAAABAAAAAAAAAKALEAACAAAAIC0gAAEAAAAAAAAAyA8QAAMAAAAgICAgICAgICAgICAgICAgICAgYXQgAABwDBAAAQAAAE9uY2UgaW5zdGFuY2UgaGFzIHByZXZpb3VzbHkgYmVlbiBwb2lzb25lZAAA/A8Q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", import.meta.url));
const A = Sg();
(typeof t == "string" || typeof Request == "function" && t instanceof Request || typeof URL == "function" && t instanceof URL) && (t = fetch(t));
const { instance: e, module: s } = await Mg(await t, A);
return Ng(e, s);
}
const HA = -9, Fg = 9, OA = (Fg - HA) / 254, kg = 11, Rg = 11, P = 1 << kg, it = 1 << Rg, Ds = 1;
function ht(t) {
return t === "bool" || t === "bvec2" || t === "bvec3" || t === "bvec4";
}
function lt(t) {
return t === "int" || t === "uint" || t === "float";
}
function hA(t) {
return t === "int" || t === "ivec2" || t === "ivec3" || t === "ivec4";
}
function lA(t) {
return t === "uint" || t === "uvec2" || t === "uvec3" || t === "uvec4";
}
function zt(t) {
return t === "float" || t === "vec2" || t === "vec3" || t === "vec4";
}
function ms(t) {
return t === "mat2" || t === "mat2x2" || t === "mat2x3" || t === "mat2x4" || t === "mat3" || t === "mat3x2" || t === "mat3x3" || t === "mat3x4" || t === "mat4" || t === "mat4x2" || t === "mat4x3" || t === "mat4x4";
}
function at(t) {
return zt(t) || ms(t);
}
function Nt(t) {
return t === "vec2" || t === "ivec2" || t === "uvec2";
}
function Ft(t) {
return t === "vec3" || t === "ivec3" || t === "uvec3";
}
function _t(t) {
return t === "vec4" || t === "ivec4" || t === "uvec4";
}
function Gg(t) {
return Nt(t) || Ft(t) || _t(t);
}
function gt(t) {
return t === "mat2" || t === "mat2x2";
}
function ot(t) {
return t === "mat3" || t === "mat3x3";
}
function It(t) {
return t === "mat4" || t === "mat4x4";
}
function xs(t) {
switch (t) {
case "vec2":
return "float";
case "vec3":
return "float";
case "vec4":
return "float";
case "ivec2":
return "int";
case "ivec3":
return "int";
case "ivec4":
return "int";
case "uvec2":
return "uint";
case "uvec3":
return "uint";
case "uvec4":
return "uint";
default:
throw new Error(`Invalid vector type: ${t}`);
}
}
function Ms(t) {
switch (t) {
case "vec2":
case "ivec2":
case "uvec2":
return 2;
case "vec3":
case "ivec3":
case "uvec3":
return 3;
case "vec4":
case "ivec4":
case "uvec4":
return 4;
default:
throw new Error(`Invalid vector type: ${t}`);
}
}
function Ug(t) {
if (lt(t))
return "float";
if (Nt(t))
return "vec2";
if (Ft(t))
return "vec3";
if (_t(t))
return "vec4";
throw new Error(`Invalid vector type: ${t}`);
}
function Ss(t) {
if (lt(t))
return "uint";
if (Nt(t))
return "uvec2";
if (Ft(t))
return "uvec3";
if (_t(t))
return "uvec4";
throw new Error(`Invalid vector type: ${t}`);
}
function vg(t) {
if (lt(t))
return "int";
if (Nt(t))
return "ivec2";
if (Ft(t))
return "ivec3";
if (_t(t))
return "ivec4";
throw new Error(`Invalid vector type: ${t}`);
}
function Ns(t) {
if (typeof t == "string")
return t;
if (typeof t == "object" && t.type)
return t.type;
throw new Error(`Invalid DynoType: ${String(t)}`);
}
function nA(t) {
return Math.trunc(t).toString();
}
function rA(t) {
return `${Math.max(0, Math.trunc(t)).toString()}u`;
}
function H(t) {
return t === Number.POSITIVE_INFINITY ? "INFINITY" : t === Number.NEGATIVE_INFINITY ? "-INFINITY" : Number.isInteger(t) ? t.toFixed(1) : t.toString();
}
function _(t) {
return t instanceof nt ? t.type : t.dynoOut().type;
}
class nt {
constructor(A) {
this.__isDynoValue = !0, this.type = A;
}
}
class q extends nt {
constructor(A, e) {
super(A.outTypes[e]), this.dyno = A, this.key = e;
}
}
class mt extends nt {
constructor(A, e) {
super(A), this.literal = e;
}
getLiteral() {
return this.literal;
}
}
function ne(t, A) {
return new mt(t, A);
}
class Fs extends mt {
constructor(A, e) {
super(A, ""), this.value = e;
}
getLiteral() {
const { type: A, value: e } = this;
switch (A) {
case "bool":
return e ? "true" : "false";
case "uint":
return rA(e);
case "int":
return nA(e);
case "float":
return H(e);
case "bvec2": {
const s = e;
return `bvec2(${s[0]}, ${s[1]})`;
}
case "uvec2": {
if (e instanceof Q.Vector2)
return `uvec2(${rA(e.x)}, ${rA(e.y)})`;
const s = e;
return `uvec2(${rA(s[0])}, ${rA(s[1])})`;
}
case "ivec2": {
if (e instanceof Q.Vector2)
return `ivec2(${nA(e.x)}, ${nA(e.y)})`;
const s = e;
return `ivec2(${nA(s[0])}, ${nA(s[1])})`;
}
case "vec2": {
if (e instanceof Q.Vector2)
return `vec2(${H(e.x)}, ${H(e.y)})`;
const s = e;
return `vec2(${H(s[0])}, ${H(s[1])})`;
}
case "bvec3": {
const s = e;
return `bvec3(${s[0]}, ${s[1]}, ${s[2]})`;
}
case "uvec3": {
if (e instanceof Q.Vector3)
return `uvec3(${rA(e.x)}, ${rA(e.y)}, ${rA(e.z)})`;
const s = e;
return `uvec3(${rA(s[0])}, ${rA(s[1])}, ${rA(s[2])})`;
}
case "ivec3": {
if (e instanceof Q.Vector3)
return `ivec3(${nA(e.x)}, ${nA(e.y)}, ${nA(e.z)})`;
const s = e;
return `ivec3(${nA(s[0])}, ${nA(s[1])}, ${nA(s[2])})`;
}
case "vec3": {
if (e instanceof Q.Vector3)
return `vec3(${H(e.x)}, ${H(e.y)}, ${H(e.z)})`;
const s = e;
return `vec3(${H(s[0])}, ${H(s[1])}, ${H(s[2])})`;
}
case "bvec4": {
const s = e;
return `bvec4(${s[0]}, ${s[1]}, ${s[2]}, ${s[3]})`;
}
case "uvec4": {
if (e instanceof Q.Vector4)
return `uvec4(${rA(e.x)}, ${rA(e.y)}, ${rA(e.z)}, ${rA(e.w)})`;
const s = e;
return `uvec4(${rA(s[0])}, ${rA(s[1])}, ${rA(s[2])}, ${rA(s[3])})`;
}
case "ivec4": {
if (e instanceof Q.Vector4)
return `ivec4(${nA(e.x)}, ${nA(e.y)}, ${nA(e.z)}, ${nA(e.w)})`;
const s = e;
return `ivec4(${nA(s[0])}, ${nA(s[1])}, ${nA(s[2])}, ${nA(s[3])})`;
}
case "vec4": {
if (e instanceof Q.Vector4)
return `vec4(${H(e.x)}, ${H(e.y)}, ${H(e.z)}, ${H(e.w)})`;
if (e instanceof Q.Quaternion)
return `vec4(${H(e.x)}, ${H(e.y)}, ${H(e.z)}, ${H(e.w)})`;
const s = e;
return `vec4(${H(s[0])}, ${H(s[1])}, ${H(s[2])}, ${H(s[3])})`;
}
case "mat2":
case "mat2x2": {
const s = e, i = s instanceof Q.Matrix2 ? s.elements : e, n = new Array(4).fill(0).map((r, a) => H(i[a]));
return `${A}(${n.join(", ")})`;
}
case "mat2x3": {
const s = e, i = new Array(6).fill(0).map((n, r) => H(s[r]));
return `${A}(${i.join(", ")})`;
}
case "mat2x4": {
const s = e, i = new Array(8).fill(0).map((n, r) => H(s[r]));
return `${A}(${i.join(", ")})`;
}
case "mat3":
case "mat3x3": {
const s = e, i = s instanceof Q.Matrix3 ? s.elements : e, n = new Array(9).fill(0).map((r, a) => H(i[a]));
return `${A}(${n.join(", ")})`;
}
case "mat3x2": {
const s = e, i = new Array(6).fill(0).map((n, r) => H(s[r]));
return `${A}(${i.join(", ")})`;
}
case "mat3x4": {
const s = e, i = new Array(12).fill(0).map((n, r) => H(s[r]));
return `${A}(${i.join(", ")})`;
}
case "mat4":
case "mat4x4": {
const s = e, i = s instanceof Q.Matrix4 ? s.elements : e, n = new Array(16).fill(0).map((r, a) => H(i[a]));
return `${A}(${n.join(", ")})`;
}
case "mat4x2": {
const s = e, i = new Array(8).fill(0).map((n, r) => H(s[r]));
return `${A}(${i.join(", ")})`;
}
case "mat4x3": {
const s = e, i = new Array(12).fill(0).map((n, r) => H(s[r]));
return `${A}(${i.join(", ")})`;
}
default:
throw new Error(`Type not implemented: ${String(A)}`);
}
}
}
function K(t, A) {
return new Fs(t, A);
}
function vt(t) {
const A = String(t);
if (ht(t))
return `${A}(false)`;
if (at(t))
return `${A}(0.0)`;
if (hA(t))
return `${A}(0)`;
if (lA(t))
return `${A}(0u)`;
throw new Error(`Type not implemented: ${A}`);
}
function bg(t) {
const A = String(t);
if (ht(t))
return `${A}(true)`;
if (at(t))
return `${A}(1.0)`;
if (hA(t))
return `${A}(1)`;
if (lA(t))
return `${A}(1u)`;
throw new Error(`Type not implemented: ${A}`);
}
function Lg(t) {
const A = String(t);
if (ht(t))
return `${A}(true)`;
if (at(t))
return `${A}(-1.0)`;
if (hA(t))
return `${A}(-1)`;
if (lA(t))
return `${A}(0xFFFFFFFFu)`;
throw new Error(`Type not implemented: ${A}`);
}
const is = " ";
class ks {
constructor({ indent: A } = {}) {
this.globals = /* @__PURE__ */ new Set(), this.statements = [], this.uniforms = {}, this.declares = /* @__PURE__ */ new Set(), this.updaters = [], this.sequence = 0, this.indent = is, this.indent = A ?? is;
}
nextSequence() {
return this.sequence++;
}
}
class V {
constructor({
inTypes: A,
outTypes: e,
inputs: s,
update: i,
globals: n,
statements: r,
generate: a
}) {
this.inTypes = A ?? {}, this.outTypes = e ?? {}, this.inputs = s ?? {}, this.update = i, this.globals = n, this.statements = r, this.generate = a ?? (({ inputs: g, outputs: I, compile: B }) => {
var o, C;
return {
globals: (o = this.globals) == null ? void 0 : o.call(this, { inputs: g, outputs: I, compile: B }),
statements: (C = this.statements) == null ? void 0 : C.call(this, { inputs: g, outputs: I, compile: B })
};
});
}
get outputs() {
const A = {};
for (const e in this.outTypes)
A[e] = new q(this, e);
return A;
}
apply(A) {
return Object.assign(this.inputs, A), this.outputs;
}
compile({
inputs: A,
outputs: e,
compile: s
}) {
const i = [
`// ${this.constructor.name}(${Object.values(A).join(", ")}) => (${Object.values(e).join(", ")})`
], n = [];
for (const I in e) {
const B = e[I];
B && !s.declares.has(B) && (s.declares.add(B), n.push(I));
}
const { globals: r, statements: a, uniforms: g } = this.generate({
inputs: A,
outputs: e,
compile: s
});
for (const I of r ?? [])
s.globals.add(I);
for (const I in g)
s.uniforms[I] = g[I];
this.update && s.updaters.push(this.update);
for (const I of n) {
const B = e[I];
B && (s.uniforms[B] || i.push(`${ze(B, this.outTypes[I])};`));
}
return a != null && a.length && (i.push("{"), i.push(...a.map((I) => s.indent + I)), i.push("}")), i;
}
}
class zA extends V {
constructor({
inTypes: A,
outTypes: e,
inputs: s,
update: i,
globals: n,
construct: r
}) {
super({
inTypes: A,
outTypes: e,
inputs: s,
update: i,
globals: n,
generate: (a) => this.generateBlock(a)
}), this.construct = r;
}
generateBlock({
inputs: A,
outputs: e,
compile: s
}) {
var l, c;
const i = {}, n = {};
for (const h in A)
A[h] != null && (i[h] = new mt(this.inTypes[h], A[h]));
for (const h in e)
e[h] != null && (n[h] = new nt(this.outTypes[h]));
const r = { roots: [] }, a = this.construct(i, n, r);
for (const h of ((l = this.globals) == null ? void 0 : l.call(this, { inputs: A, outputs: e, compile: s })) ?? [])
s.globals.add(h);
const g = [], I = /* @__PURE__ */ new Map();
function B(h, u, d) {
let w = I.get(h);
if (!w) {
w = {
sequence: s.nextSequence(),
outNames: /* @__PURE__ */ new Map(),
newOuts: /* @__PURE__ */ new Set()
}, I.set(h, w);
for (const y in h.inputs) {
let f = h.inputs[y];
for (; f; ) {
if (f instanceof nt) {
f instanceof q && B(f.dyno, f.key);
break;
}
f = f.dynoOut();
}
}
g.push(h);
}
u && (d || w.newOuts.add(u), w.outNames.set(u, d ?? `${u}_${w.sequence}`));
}
for (const h of r.roots)
B(h);
for (const h in n) {
let u = (a == null ? void 0 : a[h]) ?? n[h];
for (; u; ) {
if (u instanceof nt) {
u instanceof q && B(u.dyno, u.key, e[h]);
break;
}
u = u.dynoOut();
}
n[h] = u;
}
const o = [];
for (const h of g) {
const u = {}, d = {};
for (const f in h.inputs) {
let M = h.inputs[f];
for (; M; ) {
if (M instanceof nt) {
if (M instanceof mt)
u[f] = M.getLiteral();
else if (M instanceof q) {
const x = (c = I.get(M.dyno)) == null ? void 0 : c.outNames.get(M.key);
if (!x)
throw new Error(
`Source not found for ${M.dyno.constructor.name}.${M.key}`
);
u[f] = x;
}
break;
}
M = M.dynoOut();
}
}
const w = I.get(h) ?? { outNames: /* @__PURE__ */ new Map() };
for (const [f, M] of w.outNames.entries())
d[f] = M;
const y = h.compile({ inputs: u, outputs: d, compile: s });
o.push(y);
}
const C = [];
for (const h in e)
n[h] instanceof mt && C.push(
`${e[h]} = ${n[h].getLiteral()};`
);
return C.length > 0 && o.push(C), { statements: o.flatMap((h, u) => u === 0 ? h : ["", ...h]) };
}
}
function kA(t, A, e, { update: s, globals: i } = {}) {
return new zA({ inTypes: t, outTypes: A, construct: e, update: s, globals: i });
}
function Vt({
inTypes: t,
outTypes: A,
inputs: e,
update: s,
globals: i,
statements: n,
generate: r
}) {
return new V({
inTypes: t,
outTypes: A,
inputs: e,
update: s,
globals: i,
statements: n,
generate: r
});
}
function ze(t, A, e) {
const s = typeof A == "string" ? A : A.type;
if (!s)
throw new Error(`Invalid DynoType: ${String(A)}`);
return `${s} ${t}${e != null ? `[${e}]` : ""}`;
}
function UA(t) {
var n;
let A = !1;
const e = t.split(`
`).map((r) => {
const a = r.trimEnd();
return A ? a : a.length > 0 ? (A = !0, a) : null;
}).filter((r) => r != null);
for (; e.length > 0 && e[e.length - 1].length === 0; )
e.pop();
if (e.length === 0)
return [];
const s = (n = e[0].match(/^\s*/)) == null ? void 0 : n[0];
if (!s)
return e;
const i = new RegExp(`^${s}`);
return e.map((r) => r.replace(i, ""));
}
function EA(t) {
return UA(t).join(`
`);
}
class N extends V {
constructor({
a: A,
outKey: e,
outTypeFunc: s
}) {
const i = { a: _(A) }, n = s(_(A)), r = { [e]: n };
super({ inTypes: i, outTypes: r, inputs: { a: A } }), this.outKey = e;
}
dynoOut() {
return new q(this, this.outKey);
}
}
class $ extends V {
constructor({
a: A,
b: e,
outKey: s,
outTypeFunc: i
}) {
const n = { a: _(A), b: _(e) }, r = i(_(A), _(e)), a = { [s]: r };
super({ inTypes: n, outTypes: a, inputs: { a: A, b: e } }), this.outKey = s;
}
dynoOut() {
return new q(this, this.outKey);
}
}
class ut extends V {
constructor({
a: A,
b: e,
c: s,
outKey: i,
outTypeFunc: n
}) {
const r = { a: _(A), b: _(e), c: _(s) }, a = n(_(A), _(e), _(s)), g = { [i]: a };
super({ inTypes: r, outTypes: g, inputs: { a: A, b: e, c: s } }), this.outKey = i;
}
dynoOut() {
return new q(this, this.outKey);
}
}
const X = { type: "Gsplat" }, Zt = { type: "PackedSplats" }, Yg = (t) => new Gs({ packedSplats: t }), Jt = (t, A) => new vs({ packedSplats: t, index: A }), Rs = (t, A, e, s) => new bs({ packedSplats: t, index: A, base: e, count: s }), Qt = (t) => new Ls({ gsplat: t }), rt = ({
gsplat: t,
flags: A,
index: e,
center: s,
scales: i,
quaternion: n,
rgba: r,
rgb: a,
opacity: g,
x: I,
y: B,
z: o,
r: C,
g: E,
b: l
}) => new Ys({
gsplat: t,
flags: A,
index: e,
center: s,
scales: i,
quaternion: n,
rgba: r,
rgb: a,
opacity: g,
x: I,
y: B,
z: o,
r: C,
g: E,
b: l
}), Re = (t) => new Js({ gsplat: t }), _e = (t, {
scale: A,
rotate: e,
translate: s,
recolor: i
}) => new Hs({ gsplat: t, scale: A, rotate: e, translate: s, recolor: i }), NA = EA(`
struct Gsplat {
vec3 center;
uint flags;
vec3 scales;
int index;
vec4 quaternion;
vec4 rgba;
};
const uint GSPLAT_FLAG_ACTIVE = 1u << 0u;
bool isGsplatActive(uint flags) {
return (flags & GSPLAT_FLAG_ACTIVE) != 0u;
}
`), ce = EA(`
struct PackedSplats {
usampler2DArray texture;
int numSplats;
};
`);
class Gs extends N {
constructor({
packedSplats: A
}) {
super({ a: A, outKey: "numSplats", outTypeFunc: () => "int" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.numSplats} = ${e.a}.numSplats;`
];
}
}
const Us = EA(`
bool readPackedSplat(usampler2DArray texture, int numSplats, int index, out Gsplat gsplat) {
if ((index >= 0) && (index < numSplats)) {
uvec4 packed = texelFetch(texture, splatTexCoord(index), 0);
unpackSplat(packed, gsplat.center, gsplat.scales, gsplat.quaternion, gsplat.rgba);
return true;
} else {
return false;
}
}
`);
class vs extends V {
constructor({
packedSplats: A,
index: e
}) {
super({
inTypes: { packedSplats: Zt, index: "int" },
outTypes: { gsplat: X },
inputs: { packedSplats: A, index: e },
globals: () => [NA, ce, Us],
statements: ({ inputs: s, outputs: i }) => {
const { gsplat: n } = i;
if (!n)
return [];
const { packedSplats: r, index: a } = s;
let g;
return r && a ? g = UA(`
if (readPackedSplat(${r}.texture, ${r}.numSplats, ${a}, ${n})) {
bool zeroSize = all(equal(${n}.scales, vec3(0.0, 0.0, 0.0)));
${n}.flags = zeroSize ? 0u : GSPLAT_FLAG_ACTIVE;
} else {
${n}.flags = 0u;
}
`) : g = [`${n}.flags = 0u;`], g.push(`${n}.index = ${a ?? "0"};`), g;
}
});
}
dynoOut() {
return new q(this, "gsplat");
}
}
class bs extends V {
constructor({
packedSplats: A,
index: e,
base: s,
count: i
}) {
super({
inTypes: {
packedSplats: Zt,
index: "int",
base: "int",
count: "int"
},
outTypes: { gsplat: X },
inputs: { packedSplats: A, index: e, base: s, count: i },
globals: () => [NA, ce, Us],
statements: ({ inputs: n, outputs: r }) => {
const { gsplat: a } = r;
if (!a)
return [];
const { packedSplats: g, index: I, base: B, count: o } = n;
let C;
return g && I && B && o ? C = UA(`
${a}.flags = 0u;
if ((${I} >= ${B}) && (${I} < (${B} + ${o}))) {
if (readPackedSplat(${g}.texture, ${g}.numSplats, ${I}, ${a})) {
bool zeroSize = all(equal(${a}.scales, vec3(0.0, 0.0, 0.0)));
${a}.flags = zeroSize ? 0u : GSPLAT_FLAG_ACTIVE;
}
}
`) : C = [`${a}.flags = 0u;`], C.push(`${a}.index = ${I ?? "0"};`), C;
}
});
}
dynoOut() {
return new q(this, "gsplat");
}
}
class Ls extends V {
constructor({ gsplat: A }) {
super({
inTypes: { gsplat: X },
outTypes: {
flags: "uint",
active: "bool",
index: "int",
center: "vec3",
scales: "vec3",
quaternion: "vec4",
rgba: "vec4",
rgb: "vec3",
opacity: "float",
x: "float",
y: "float",
z: "float",
r: "float",
g: "float",
b: "float"
},
inputs: { gsplat: A },
globals: () => [NA],
statements: ({ inputs: e, outputs: s }) => {
const { gsplat: i } = e, {
flags: n,
active: r,
index: a,
center: g,
scales: I,
quaternion: B,
rgba: o,
rgb: C,
opacity: E,
x: l,
y: c,
z: h,
r: u,
g: d,
b: w
} = s;
return [
n ? `${n} = ${i ? `${i}.flags` : "0u"};` : null,
r ? `${r} = isGsplatActive(${i ? `${i}.flags` : "0u"});` : null,
a ? `${a} = ${i ? `${i}.index` : "0"};` : null,
g ? `${g} = ${i ? `${i}.center` : "vec3(0.0, 0.0, 0.0)"};` : null,
I ? `${I} = ${i ? `${i}.scales` : "vec3(0.0, 0.0, 0.0)"};` : null,
B ? `${B} = ${i ? `${i}.quaternion` : "vec4(0.0, 0.0, 0.0, 1.0)"};` : null,
o ? `${o} = ${i ? `${i}.rgba` : "vec4(0.0, 0.0, 0.0, 0.0)"};` : null,
C ? `${C} = ${i ? `${i}.rgba.rgb` : "vec3(0.0, 0.0, 0.0)"};` : null,
E ? `${E} = ${i ? `${i}.rgba.a` : "0.0"};` : null,
l ? `${l} = ${i ? `${i}.center.x` : "0.0"};` : null,
c ? `${c} = ${i ? `${i}.center.y` : "0.0"};` : null,
h ? `${h} = ${i ? `${i}.center.z` : "0.0"};` : null,
u ? `${u} = ${i ? `${i}.rgba.r` : "0.0"};` : null,
d ? `${d} = ${i ? `${i}.rgba.g` : "0.0"};` : null,
w ? `${w} = ${i ? `${i}.rgba.b` : "0.0"};` : null
].filter(Boolean);
}
});
}
}
class Ys extends V {
constructor({
gsplat: A,
flags: e,
index: s,
center: i,
scales: n,
quaternion: r,
rgba: a,
rgb: g,
opacity: I,
x: B,
y: o,
z: C,
r: E,
g: l,
b: c
}) {
super({
inTypes: {
gsplat: X,
flags: "uint",
index: "int",
center: "vec3",
scales: "vec3",
quaternion: "vec4",
rgba: "vec4",
rgb: "vec3",
opacity: "float",
x: "float",
y: "float",
z: "float",
r: "float",
g: "float",
b: "float"
},
outTypes: { gsplat: X },
inputs: {
gsplat: A,
flags: e,
index: s,
center: i,
scales: n,
quaternion: r,
rgba: a,
rgb: g,
opacity: I,
x: B,
y: o,
z: C,
r: E,
g: l,
b: c
},
globals: () => [NA],
statements: ({ inputs: h, outputs: u }) => {
const { gsplat: d } = u;
if (!d)
return [];
const {
gsplat: w,
flags: y,
index: f,
center: M,
scales: x,
quaternion: D,
rgba: p,
rgb: G,
opacity: S,
x: m,
y: v,
z: F,
r: k,
g: U,
b: L
} = h;
return [
`${d}.flags = ${y ?? (w ? `${w}.flags` : "0u")};`,
`${d}.index = ${f ?? (w ? `${w}.index` : "0")};`,
`${d}.center = ${M ?? (w ? `${w}.center` : "vec3(0.0, 0.0, 0.0)")};`,
`${d}.scales = ${x ?? (w ? `${w}.scales` : "vec3(0.0, 0.0, 0.0)")};`,
`${d}.quaternion = ${D ?? (w ? `${w}.quaternion` : "vec4(0.0, 0.0, 0.0, 1.0)")};`,
`${d}.rgba = ${p ?? (w ? `${w}.rgba` : "vec4(0.0, 0.0, 0.0, 0.0)")};`,
G ? `${d}.rgba.rgb = ${G};` : null,
S ? `${d}.rgba.a = ${S};` : null,
m ? `${d}.center.x = ${m};` : null,
v ? `${d}.center.y = ${v};` : null,
F ? `${d}.center.z = ${F};` : null,
k ? `${d}.rgba.r = ${k};` : null,
U ? `${d}.rgba.g = ${U};` : null,
L ? `${d}.rgba.b = ${L};` : null
].filter(Boolean);
}
});
}
dynoOut() {
return new q(this, "gsplat");
}
}
const Ts = EA(`
vec3 gsplatNormal(vec3 scales, vec4 quaternion) {
float minScale = min(scales.x, min(scales.y, scales.z));
vec3 normal;
if (scales.z == minScale) {
normal = vec3(0.0, 0.0, 1.0);
} else if (scales.y == minScale) {
normal = vec3(0.0, 1.0, 0.0);
} else {
normal = vec3(1.0, 0.0, 0.0);
}
return quatVec(quaternion, normal);
}
`);
class Js extends N {
constructor({ gsplat: A }) {
super({ a: A, outKey: "normal", outTypeFunc: () => "vec3" }), this.globals = () => [NA, Ts], this.statements = ({ inputs: e, outputs: s }) => [
`${s.normal} = gsplatNormal(${e.a}.scales, ${e.a}.quaternion);`
];
}
}
class Hs extends V {
constructor({
gsplat: A,
scale: e,
rotate: s,
translate: i,
recolor: n
}) {
super({
inTypes: {
gsplat: X,
scale: "float",
rotate: "vec4",
translate: "vec3",
recolor: "vec4"
},
outTypes: { gsplat: X },
inputs: { gsplat: A, scale: e, rotate: s, translate: i, recolor: n },
globals: () => [NA],
statements: ({ inputs: r, outputs: a, compile: g }) => {
const { gsplat: I } = a;
if (!I || !r.gsplat)
return [];
const { scale: B, rotate: o, translate: C, recolor: E } = r, l = g.indent;
return [
`${I} = ${r.gsplat};`,
`if (isGsplatActive(${I}.flags)) {`,
B ? `${l}${I}.center *= ${B};` : null,
o ? `${l}${I}.center = quatVec(${o}, ${I}.center);` : null,
C ? `${l}${I}.center += ${C};` : null,
B ? `${l}${I}.scales *= ${B};` : null,
o ? `${l}${I}.quaternion = quatQuat(${o}, ${I}.quaternion);` : null,
E ? `${l}${I}.rgba *= ${E};` : null,
"}"
].filter(Boolean);
}
});
}
dynoOut() {
return new q(this, "gsplat");
}
}
const Ks = (t) => new qs({ gsplat: t }), Tg = (t) => new Ve({ rgba8: t });
class qs extends V {
constructor({ gsplat: A }) {
super({
inTypes: { gsplat: X },
inputs: { gsplat: A },
globals: () => [NA],
statements: ({ inputs: e, outputs: s }) => {
const { output: i } = s;
if (!i)
return [];
const { gsplat: n } = e;
return n ? UA(`
if (isGsplatActive(${n}.flags)) {
${i} = packSplat(${n}.center, ${n}.scales, ${n}.quaternion, ${n}.rgba);
} else {
${i} = uvec4(0u, 0u, 0u, 0u);
}
`) : [`${i} = uvec4(0u, 0u, 0u, 0u);`];
}
});
}
dynoOut() {
return new q(this, "output");
}
}
class Ve extends V {
constructor({ rgba8: A }) {
super({
inTypes: { rgba8: "vec4" },
inputs: { rgba8: A },
statements: ({ inputs: e, outputs: s }) => [
`target = ${e.rgba8 ?? "vec4(0.0, 0.0, 0.0, 0.0)"};`
]
});
}
dynoOut() {
return new q(this, "rgba8");
}
}
const Jg = (t, A, e) => new R({ key: t, type: A, value: e }), Hg = (t = !1, A) => new re({ key: A, value: t }), Kg = (t = 0, A) => new zs({ key: A, value: t }), qg = (t = 0, A) => new Ht({ key: A, value: t }), TA = (t = 0, A) => new Ct({ key: A, value: t }), zg = (t, A) => new _s({ key: A, value: t }), _g = (t, A) => new Vs({ key: A, value: t }), Vg = (t, A) => new Zs({ key: A, value: t }), Zg = (t, A) => new Os({ key: A, value: t }), Og = (t, A) => new Ws({ key: A, value: t }), Wg = (t, A) => new js({ key: A, value: t }), jg = (t, A) => new Ps({ key: A, value: t }), At = (t, A) => new Mt({ key: A, value: t }), Pg = (t, A) => new Xs({ key: A, value: t }), Xg = (t, A) => new $s({ key: A, value: t }), $g = (t, A) => new Ai({ key: A, value: t }), Ao = (t, A) => new Ot({ key: A, value: t }), to = (t, A) => new ti({ key: A, value: t }), eo = (t, A) => new ei({ key: A, value: t }), so = (t, A) => new si({ key: A, value: t }), io = (t, A) => new ii({ key: A, value: t }), no = (t, A) => new ni({ key: A, value: t }), ro = (t, A) => new ri({ key: A, value: t }), ao = (t, A) => new ai({ key: A, value: t }), go = (t, A) => new gi({ key: A, value: t }), oo = (t, A) => new oi({ key: A, value: t }), Io = (t, A) => new Ii({ key: A, value: t }), Bo = (t, A) => new Bi({ key: A, value: t }), Qo = (t, A) => new Qi({ key: A, value: t }), Co = (t, A) => new Ci({ key: A, value: t }), Eo = (t, A) => new Ei({ key: A, value: t }), co = (t, A) => new ci({ key: A, value: t }), ho = (t, A) => new Yt({ key: A, value: t }), lo = (t, A) => new hi({ key: t, value: A }), uo = (t, A) => new li({ key: A, value: t }), wo = (t, A) => new ui({ key: A, value: t }), po = (t, A) => new di({ key: A, value: t }), yo = (t, A) => new wi({ key: A, value: t }), fo = (t, A) => new pi({ key: A, value: t }), Do = (t, A) => new yi({ key: A, value: t }), mo = (t, A) => new fi({ key: A, value: t }), xo = (t, A) => new Di({ key: A, value: t }), Mo = (t, A) => new mi({ key: A, value: t }), So = (t, A) => new xi({ key: A, value: t });
class R extends V {
constructor({
key: A,
type: e,
count: s,
value: i,
update: n,
globals: r
}) {
A = A ?? "value", super({
outTypes: { [A]: e },
update: () => {
if (n) {
const a = n(this.value);
a !== void 0 && (this.value = a);
}
this.uniform.value = this.value;
},
generate: ({ inputs: a, outputs: g }) => {
const I = (r == null ? void 0 : r({ inputs: a, outputs: g })) ?? [], B = {}, o = g[A];
return o && (I.push(`uniform ${ze(o, e, s)};`), B[o] = this.uniform), { globals: I, uniforms: B };
}
}), this.type = e, this.count = s, this.value = i, this.uniform = { value: i }, this.outKey = A;
}
dynoOut() {
return new q(this, this.outKey);
}
}
class re extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "bool", value: e, update: s });
}
}
class zs extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "uint", value: e, update: s });
}
}
class Ht extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "int", value: e, update: s });
}
}
class Ct extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "float", value: e, update: s });
}
}
class _s extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "bvec2", value: e, update: s });
}
}
class Vs extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "uvec2", value: e, update: s });
}
}
class Zs extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "ivec2", value: e, update: s });
}
}
class Os extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "vec2", value: e, update: s });
}
}
class Ws extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "bvec3", value: e, update: s });
}
}
class js extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "uvec3", value: e, update: s });
}
}
class Ps extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "ivec3", value: e, update: s });
}
}
class Mt extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "vec3", value: e, update: s });
}
}
class Xs extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "bvec4", value: e, update: s });
}
}
class $s extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "uvec4", value: e, update: s });
}
}
class Ai extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "ivec4", value: e, update: s });
}
}
class Ot extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "vec4", value: e, update: s });
}
}
class ti extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat2", value: e, update: s });
}
}
class ei extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat2x2", value: e, update: s });
}
}
class si extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat2x3", value: e, update: s });
}
}
class ii extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat2x4", value: e, update: s });
}
}
class ni extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat3", value: e, update: s });
}
}
class ri extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat3x2", value: e, update: s });
}
}
class ai extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat3x3", value: e, update: s });
}
}
class gi extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat3x4", value: e, update: s });
}
}
class oi extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat4", value: e, update: s });
}
}
class Ii extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat4x2", value: e, update: s });
}
}
class Bi extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat4x3", value: e, update: s });
}
}
class Qi extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat4x4", value: e, update: s });
}
}
class Ci extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "usampler2D", value: e, update: s });
}
}
class Ei extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "isampler2D", value: e, update: s });
}
}
class ci extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "sampler2D", value: e, update: s });
}
}
class Yt extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "usampler2DArray", value: e, update: s });
}
}
class hi extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "isampler2DArray", value: e, update: s });
}
}
class li extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "sampler2DArray", value: e, update: s });
}
}
class ui extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "usampler3D", value: e, update: s });
}
}
class di extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "isampler3D", value: e, update: s });
}
}
class wi extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "sampler3D", value: e, update: s });
}
}
class pi extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "usamplerCube", value: e, update: s });
}
}
class yi extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "isamplerCube", value: e, update: s });
}
}
class fi extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "samplerCube", value: e, update: s });
}
}
class Di extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "sampler2DShadow", value: e, update: s });
}
}
class mi extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "sampler2DArrayShadow", value: e, update: s });
}
}
class xi extends R {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "samplerCubeShadow", value: e, update: s });
}
}
const Wt = new Float32Array(1), he = new Uint32Array(Wt.buffer);
function No(t) {
return Wt[0] = t, he[0];
}
function Fo(t) {
return he[0] = t, Wt[0];
}
function Et(t) {
Wt[0] = t;
const A = he[0], e = A >> 31 & 1, s = A >> 23 & 255, i = A & 8388607, n = e << 15;
if (s === 255)
return i !== 0 ? n | 32767 : n | 31744;
const r = s - 127 + 15;
if (r >= 31)
return n | 31744;
if (r <= 0) {
if (r < -10)
return n;
const g = (i | 8388608) >> 1 - r + 13;
return n | g;
}
const a = i >> 13;
return n | r << 10 | a;
}
function fA(t) {
const A = t >> 15 & 1, e = t >> 10 & 31, s = t & 1023;
let i;
if (e === 0)
if (s === 0)
i = A << 31;
else {
let n = s, r = -14;
for (; (n & 1024) === 0; )
n <<= 1, r--;
n &= 1023;
const a = r + 127, g = n << 13;
i = A << 31 | a << 23 | g;
}
else if (e === 31)
s === 0 ? i = A << 31 | 2139095040 : i = A << 31 | 2143289344;
else {
const n = e - 15 + 127, r = s << 13;
i = A << 31 | n << 23 | r;
}
return he[0] = i, Wt[0];
}
function FA(t) {
return Math.max(0, Math.min(255, Math.round(t * 255)));
}
function ee(t) {
return Math.max(-127, Math.min(127, Math.round(t * 127)));
}
function ko(t) {
return t / 255;
}
function Ro(t) {
return t / 127;
}
class Go {
// Create a DataCache with a given function that fetches data not in the cache.
constructor({
asyncFetch: A,
maxItems: e = 5
}) {
this.asyncFetch = A, this.maxItems = e, this.items = [];
}
// Fetch data for the key, returning cached data if available.
async getFetch(A) {
const e = this.items.findIndex((i) => i.key === A);
if (e >= 0) {
const i = this.items.splice(e, 1)[0];
return this.items.push(i), i.data;
}
const s = await this.asyncFetch(A);
for (this.items.push({ key: A, data: s }); this.items.length > this.maxItems; )
this.items.shift();
return s;
}
}
function Uo(t, A) {
const e = Object.entries(t).map(([s, i]) => [
s,
A(i, s)
]);
return Object.fromEntries(e);
}
function vo(t, A) {
const e = Object.entries(t).map(([s, i]) => [s, A(i, s)]).filter(([s, i]) => i !== void 0);
return Object.fromEntries(e);
}
function Mi(t) {
const A = [], e = /* @__PURE__ */ new Set();
function s(i) {
i && typeof i == "object" && !e.has(i) && (e.add(i), i instanceof ArrayBuffer ? A.push(i) : ArrayBuffer.isView(i) ? A.push(i.buffer) : Array.isArray(i) ? i.forEach(s) : Object.values(i).forEach(s));
}
return s(t), A;
}
function bo(t, A) {
return new Array(t).fill(null).map((e, s) => A(s));
}
class Si {
constructor({
// Allocate a new item with the given args
allocate: A,
// Dispose of an item (optional, if GC is enough)
dispose: e,
// Check if an existing item in the list is valid for the given args,
// allowing you to store heterogeneous items in the list.
valid: s
}) {
this.items = [], this.allocate = A, this.dispose = e, this.valid = s;
}
// Allocate a new item from the free list, first checking if a existing item
// on the freelist is valid for the given args.
alloc(A) {
for (; ; ) {
const e = this.items.pop();
if (!e)
break;
if (this.valid(e, A))
return e;
this.dispose && this.dispose(e);
}
return this.allocate(A);
}
free(A) {
this.items.push(A);
}
disposeAll() {
let A;
for (A = this.items.pop(); A; )
this.dispose && this.dispose(A), A = this.items.pop();
}
}
function Ge(t, A, e, s, i, n, r, a, g, I, B, o, C, E, l, c) {
const h = FA(E), u = FA(l), d = FA(c), w = FA(C), y = Ze(
new Q.Quaternion(g, I, B, o)
), f = y & 255, M = y >>> 8 & 255, x = y >>> 16 & 255, D = n === 0 ? 0 : Math.min(
255,
Math.max(
0,
Math.round((Math.log(n) - HA) / OA) + 1
)
), p = r === 0 ? 0 : Math.min(
255,
Math.max(
0,
Math.round((Math.log(r) - HA) / OA) + 1
)
), G = a === 0 ? 0 : Math.min(
255,
Math.max(
0,
Math.round((Math.log(a) - HA) / OA) + 1
)
), S = Et(e), m = Et(s), v = Et(i), F = A * 4;
t[F] = h | u << 8 | d << 16 | w << 24, t[F + 1] = S | m << 16, t[F + 2] = v | f << 16 | M << 24, t[F + 3] = D | p << 8 | G << 16 | x << 24;
}
function Lo(t, A, e, s, i) {
const n = Et(e), r = Et(s), a = Et(i), g = A * 4;
t[g + 1] = n | r << 16, t[g + 2] = a | t[g + 2] & 4294901760;
}
function Yo(t, A, e, s, i) {
const n = e === 0 ? 0 : Math.min(
255,
Math.max(
0,
Math.round((Math.log(e) - HA) / OA) + 1
)
), r = s === 0 ? 0 : Math.min(
255,
Math.max(
0,
Math.round((Math.log(s) - HA) / OA) + 1
)
), a = i === 0 ? 0 : Math.min(
255,
Math.max(
0,
Math.round((Math.log(i) - HA) / OA) + 1
)
), g = A * 4;
t[g + 3] = n | r << 8 | a << 16 | t[g + 3] & 4278190080;
}
function To(t, A, e, s, i, n) {
const r = Ze(
new Q.Quaternion(e, s, i, n)
), a = r & 255, g = r >>> 8 & 255, I = r >>> 16 & 255, B = A * 4;
t[B + 2] = t[B + 2] & 65535 | a << 16 | g << 24, t[B + 3] = t[B + 3] & 16777215 | I << 24;
}
function Jo(t, A, e, s, i, n) {
const r = FA(e), a = FA(s), g = FA(i), I = FA(n), B = A * 4;
t[B] = r | a << 8 | g << 16 | I << 24;
}
function Ho(t, A, e, s, i) {
const n = FA(e), r = FA(s), a = FA(i), g = A * 4;
t[g] = n | r << 8 | a << 16 | t[g] & 4278190080;
}
function Ko(t, A, e) {
const s = FA(e), i = A * 4;
t[i] = t[i] & 16777215 | s << 24;
}
const qo = new Q.Vector3(), zo = new Q.Vector3(), _o = new Q.Quaternion(), Vo = new Q.Color(), Zo = {
center: qo,
scales: zo,
quaternion: _o,
color: Vo,
opacity: 0
};
function Ue(t, A) {
const e = Zo, s = A * 4, i = t[s], n = t[s + 1], r = t[s + 2], a = t[s + 3];
e.color.set(
(i & 255) / 255,
(i >>> 8 & 255) / 255,
(i >>> 16 & 255) / 255
), e.opacity = (i >>> 24 & 255) / 255, e.center.set(
fA(n & 65535),
fA(n >>> 16 & 65535),
fA(r & 65535)
);
const g = a & 255;
e.scales.x = g === 0 ? 0 : Math.exp(HA + (g - 1) * OA);
const I = a >>> 8 & 255;
e.scales.y = I === 0 ? 0 : Math.exp(HA + (I - 1) * OA);
const B = a >>> 16 & 255;
e.scales.z = B === 0 ? 0 : Math.exp(HA + (B - 1) * OA);
const o = r >>> 16 & 65535 | a >>> 8 & 16711680;
return vi(o, e.quaternion), e;
}
function mA(t) {
const A = P, e = Math.max(
Ds,
Math.min(it, Math.ceil(t / A))
), s = Math.ceil(t / (A * e)), i = A * e * s;
return { width: A, height: e, depth: s, maxSplats: i };
}
function Oo(t) {
const A = P, e = Math.max(
Ds,
Math.min(it, Math.ceil(t / A))
), s = Math.ceil(t / (A * e));
return A * e * s;
}
function Wo() {
return navigator.maxTouchPoints > 0 ? !0 : /Mobi|Android|iPhone|iPad|iPod|Opera Mini|IEMobile/.test(
navigator.userAgent
);
}
function jo() {
return /Android/.test(navigator.userAgent);
}
function Po() {
return /Oculus/.test(navigator.userAgent);
}
function Xo(t, A, e) {
const s = new Uint8Array(A * 4);
for (let i = 0; i < e / 2; i++) {
const n = i * A * 4, r = (e - 1 - i) * A * 4;
s.set(t.subarray(n, n + A * 4)), t.set(
t.subarray(r, r + A * 4),
n
), t.set(s, r);
}
return t;
}
function $o(t, A, e) {
const s = document.createElement("canvas");
s.width = A, s.height = e;
const i = s.getContext("2d");
if (!i)
throw new Error("Can't get 2d context");
const n = i.createImageData(A, e);
return n.data.set(t), i.putImageData(n, 0, 0), s.toDataURL("image/png");
}
function Ni(t) {
const A = new Q.Clock(t.autoStart);
return A.startTime = t.startTime, A.oldTime = t.oldTime, A.elapsedTime = t.elapsedTime, A.running = t.running, A;
}
function AI(t) {
return Object.fromEntries(
Object.entries(t).filter(([A, e]) => e !== void 0)
);
}
const Fi = EA(`
precision highp float;
in vec3 position;
void main() {
gl_Position = vec4(position.xy, 0.0, 1.0);
}
`);
function ki(t) {
const A = new Q.Vector3();
for (const e of t)
A.add(e);
return A.divideScalar(t.length);
}
function Ri(t) {
if (t.length === 0)
return new Q.Quaternion();
const A = t[0].clone();
for (let e = 1; e < t.length; e++)
t[e].dot(t[0]) < 0 ? (A.x -= t[e].x, A.y -= t[e].y, A.z -= t[e].z, A.w -= t[e].w) : (A.x += t[e].x, A.y += t[e].y, A.z += t[e].z, A.w += t[e].w);
return A.normalize();
}
function Gi(t, A) {
const e = new Q.Vector3(0, 0, 0).applyMatrix4(t), s = new Q.Vector3(0, 0, 0).applyMatrix4(A), i = new Q.Vector3(0, 0, -1).applyMatrix4(t).sub(e).normalize(), n = new Q.Vector3(0, 0, -1).applyMatrix4(A).sub(s).normalize(), r = e.distanceTo(s), a = i.dot(n);
return { distance: r, coincidence: a };
}
function tI({
matrix1: t,
matrix2: A,
maxDistance: e
}) {
const s = new Q.Vector3(0, 0, 0).applyMatrix4(t), i = new Q.Vector3(0, 0, 0).applyMatrix4(A);
return s.distanceTo(i) <= e;
}
function eI({
matrix1: t,
matrix2: A,
maxDistance: e,
minCoincidence: s
}) {
const { distance: i, coincidence: n } = Gi(t, A);
return i <= e && (s == null || n >= s);
}
function Ui(t, A) {
const [e, s] = [new Q.Vector3(), new Q.Quaternion()], [i, n] = [new Q.Vector3(), new Q.Quaternion()];
t.decompose(e, s, new Q.Vector3()), A.decompose(i, n, new Q.Vector3());
const r = e.distanceTo(i), a = Math.abs(s.dot(n));
return { distance: r, coorient: a };
}
function ae({
matrix1: t,
matrix2: A,
maxDistance: e,
minCoorient: s
}) {
const { distance: i, coorient: n } = Ui(t, A);
return i <= e && (s == null || n >= s);
}
function sI(t, A = 1e-3) {
return Math.abs(t) < A ? 0 : Math.sign(t);
}
function iI(t) {
const A = t.w < 0, e = ee(A ? -t.x : t.x), s = ee(A ? -t.y : t.y), i = ee(A ? -t.z : t.z), n = e & 255, r = s & 255, a = i & 255;
return n | r << 8 | a << 16;
}
function nI(t, A) {
const e = t << 24 >> 24, s = t << 16 >> 24, i = t << 8 >> 24;
A.set(e / 127, s / 127, i / 127, 0);
const n = A.x * A.x + A.y * A.y + A.z * A.z;
return A.w = Math.sqrt(Math.max(0, 1 - n)), A;
}
function Ze(t) {
const A = t.clone().normalize();
A.w < 0 && A.set(-A.x, -A.y, -A.z, -A.w);
const e = 2 * Math.acos(A.w), s = Math.sqrt(
A.x * A.x + A.y * A.y + A.z * A.z
), i = s < 1e-6 ? new Q.Vector3(1, 0, 0) : new Q.Vector3(A.x, A.y, A.z).divideScalar(s), n = Math.abs(i.x) + Math.abs(i.y) + Math.abs(i.z);
let r = i.x / n, a = i.y / n;
if (i.z < 0) {
const E = r;
r = (1 - Math.abs(a)) * (r >= 0 ? 1 : -1), a = (1 - Math.abs(E)) * (a >= 0 ? 1 : -1);
}
const g = r * 0.5 + 0.5, I = a * 0.5 + 0.5, B = Math.round(g * 255), o = Math.round(I * 255);
return Math.round(e * (255 / Math.PI)) << 16 | o << 8 | B;
}
function vi(t, A) {
const e = t & 255, s = t >>> 8 & 255, i = t >>> 16 & 255, n = e / 255, r = s / 255;
let a = (n - 0.5) * 2, g = (r - 0.5) * 2;
const I = 1 - (Math.abs(a) + Math.abs(g)), B = Math.max(-I, 0);
a += a >= 0 ? -B : B, g += g >= 0 ? -B : B;
const o = new Q.Vector3(a, g, I).normalize(), E = i / 255 * Math.PI * 0.5, l = Math.sin(E), c = Math.cos(E);
return A.set(o.x * l, o.y * l, o.z * l, c), A;
}
function rI(t) {
const A = t.clone().normalize(), e = 2 * (A.w * A.x + A.y * A.z), s = 1 - 2 * (A.x * A.x + A.y * A.y), i = Math.atan2(e, s), n = 2 * (A.w * A.y - A.z * A.x), r = Math.abs(n) >= 1 ? Math.sign(n) * (Math.PI / 2) : Math.asin(n), a = 2 * (A.w * A.z + A.x * A.y), g = 1 - 2 * (A.y * A.y + A.z * A.z), I = Math.atan2(a, g), B = (i + Math.PI) / (2 * Math.PI), o = (r + Math.PI) / (2 * Math.PI), C = (I + Math.PI) / (2 * Math.PI), E = Math.round(B * 255), l = Math.round(o * 255);
return Math.round(C * 255) << 16 | l << 8 | E;
}
function aI(t, A) {
const e = t & 255, s = t >>> 8 & 255, i = t >>> 16 & 255, n = e / 255, r = s / 255, a = i / 255, g = n * (2 * Math.PI) - Math.PI, I = r * (2 * Math.PI) - Math.PI, B = a * (2 * Math.PI) - Math.PI, o = Math.cos(g * 0.5), C = Math.sin(g * 0.5), E = Math.cos(I * 0.5), l = Math.sin(I * 0.5), c = Math.cos(B * 0.5), h = Math.sin(B * 0.5);
return A.w = o * E * c + C * l * h, A.x = C * E * c - o * l * h, A.y = o * l * c + C * E * h, A.z = o * E * h - C * l * c, A.normalize(), A;
}
function Pt(t, A, e, s) {
const i = Math.max(-127, Math.min(127, t * 127)), n = Math.max(-127, Math.min(127, A * 127)), r = Math.max(-127, Math.min(127, e * 127)), a = Math.max(-127, Math.min(127, s * 127));
return i & 255 | (n & 255) << 8 | (r & 255) << 16 | (a & 255) << 24;
}
function gI(t, A, e) {
const s = A * 2;
for (let i = 0; i < 9; ++i) {
const n = Math.max(-63, Math.min(63, e[i] * 63)) & 127, r = i * 7, a = r + 7, g = Math.floor(r / 32), I = r - g * 32, B = n << I & 4294967295;
if (t[s + g] |= B, a > g * 32 + 32) {
const o = n >>> 32 - I & 4294967295;
t[s + g + 1] |= o;
}
}
}
function oI(t, A, e) {
t[A * 4 + 0] = Pt(
e[0],
e[1],
e[2],
e[3]
), t[A * 4 + 1] = Pt(
e[4],
e[5],
e[6],
e[7]
), t[A * 4 + 2] = Pt(
e[8],
e[9],
e[10],
e[11]
), t[A * 4 + 3] = Pt(
e[12],
e[13],
e[14],
0
);
}
function II(t, A, e) {
const s = A * 4;
for (let i = 0; i < 21; ++i) {
const n = Math.max(-31, Math.min(31, e[i] * 31)) & 63, r = i * 6, a = r + 6, g = Math.floor(r / 32), I = r - g * 32, B = n << I & 4294967295;
if (t[s + g] |= B, a > g * 32 + 32) {
const o = n >>> 32 - I & 4294967295;
t[s + g + 1] |= o;
}
}
}
function bi(t, A) {
const e = [];
let s = 0, i = null;
const n = new ps((g, I) => {
if (e.push(g), s += g.length, I || s >= A) {
const B = new Uint8Array(s);
let o = 0;
for (const C of e)
B.set(C, o), o += C.length;
i = B.slice(0, A);
}
}), r = 1024;
let a = 0;
for (; i == null && a < t.length; ) {
const g = t.slice(a, a + r);
n.push(g, !1), a += r;
}
if (i == null && (n.push(new Uint8Array(), !0), i == null))
throw new Error("Failed to decompress partial gzip");
return i;
}
class Li {
constructor({
fileBytes: A,
chunkBytes: e = 64 * 1024
}) {
this.fileBytes = A, this.chunkBytes = e, this.offset = 0, this.chunks = [], this.totalBytes = 0, this.gunzip = new ps((s, i) => {
this.chunks.push(s), this.totalBytes += s.length;
});
}
read(A) {
for (; this.totalBytes < A && this.offset < this.fileBytes.length; ) {
const n = Math.min(
this.offset + this.chunkBytes,
this.fileBytes.length
);
this.gunzip.push(this.fileBytes.subarray(this.offset, n), !1), this.offset = n;
}
if (this.totalBytes < A && this.offset >= this.fileBytes.length && this.gunzip.push(new Uint8Array(0), !0), this.totalBytes < A)
throw new Error(
`Unexpected EOF: needed ${A}, got ${this.totalBytes}`
);
const e = new Uint8Array(this.totalBytes);
let s = 0;
for (const n of this.chunks)
e.set(n, s), s += n.length;
const i = e.subarray(0, A);
return this.chunks = [e.subarray(A)], this.totalBytes -= A, i;
}
}
const gE = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
DataCache: Go,
FreeList: Si,
GunzipReader: Li,
IDENT_VERTEX_SHADER: Fi,
Sint8ToFloat: Ro,
Uint8ToFloat: ko,
averagePositions: ki,
averageQuaternions: Ri,
cloneClock: Ni,
coinciDist: Gi,
computeMaxSplats: Oo,
coorientDist: Ui,
decodeQuatEulerXyz888: aI,
decodeQuatOctXy88R8: vi,
decodeQuatXyz888: nI,
decompressPartialGzip: bi,
encodeQuatEulerXyz888: rI,
encodeQuatOctXy88R8: Ze,
encodeQuatXyz888: iI,
encodeSh1Rgb: gI,
encodeSh2Rgb: oI,
encodeSh3Rgb: II,
epsilonSign: sI,
flipPixels: Xo,
floatBitsToUint: No,
floatToSint8: ee,
floatToUint8: FA,
fromHalf: fA,
getArrayBuffers: Mi,
getTextureSize: mA,
isAndroid: jo,
isMobile: Wo,
isOculus: Po,
mapFilterObject: vo,
mapObject: Uo,
newArray: bo,
omitUndefined: AI,
pixelsToPngUrl: $o,
setPackedSplat: Ge,
setPackedSplatCenter: Lo,
setPackedSplatOpacity: Ko,
setPackedSplatQuat: To,
setPackedSplatRgb: Ho,
setPackedSplatRgba: Jo,
setPackedSplatScales: Yo,
toHalf: Et,
uintBitsToFloat: Fo,
unpackSplat: Ue,
withinCoinciDist: eI,
withinCoorientDist: ae,
withinDist: tI
}, Symbol.toStringTag, { value: "Module" }));
class Oe {
constructor({
graph: A,
inputs: e,
outputs: s,
template: i
}) {
this.graph = A, this.template = i, this.inputs = e ?? {}, this.outputs = s ?? {};
const n = new ks({ indent: this.template.indent });
for (const a in this.outputs)
this.outputs[a] && n.declares.add(this.outputs[a]);
const r = A.compile({
inputs: this.inputs,
outputs: this.outputs,
compile: n
});
this.shader = i.generate({ globals: n.globals, statements: r }), this.uniforms = n.uniforms, this.updaters = n.updaters;
}
prepareMaterial() {
return BI(this);
}
update() {
for (const A of this.updaters)
A();
}
}
class We {
constructor(A) {
const e = A.match(/^([ \t]*)\{\{\s*GLOBALS\s*\}\}/m), s = A.match(/^([ \t]*)\{\{\s*STATEMENTS\s*\}\}/m);
if (!e || !s)
throw new Error(
"Template must contain {{ GLOBALS }} and {{ STATEMENTS }}"
);
this.before = A.substring(0, e.index), this.between = A.substring(
e.index + e[0].length,
s.index
), this.after = A.substring(
s.index + s[0].length
), this.indent = s[1];
}
generate({
globals: A,
statements: e
}) {
return this.before + Array.from(A).join(`
`) + this.between + e.map((s) => this.indent + s).join(`
`) + this.after;
}
}
const ns = /* @__PURE__ */ new Map();
function BI(t) {
let A = ns.get(t);
return A || (A = new Q.RawShaderMaterial({
glslVersion: Q.GLSL3,
vertexShader: Fi,
fragmentShader: t.shader,
uniforms: t.uniforms
}), ns.set(t, A), A);
}
function je(t, A, e = "add") {
const s = () => {
throw new Error(`Invalid ${e} types: ${t}, ${A}`);
};
if (t === A) return t;
if (t === "int") {
if (hA(A)) return A;
s();
}
if (A === "int") {
if (hA(t)) return t;
s();
}
if (t === "uint") {
if (lA(A)) return A;
s();
}
if (A === "uint") {
if (lA(t)) return t;
s();
}
if (t === "float") {
if (at(A)) return A;
s();
}
if (A === "float") {
if (at(t)) return t;
s();
}
throw new Error(`Invalid ${e} types: ${t}, ${A}`);
}
function QI(t, A) {
return je(t, A, "sub");
}
function CI(t, A) {
const e = () => {
throw new Error(`Invalid mul types: ${t}, ${A}`);
}, s = (i) => i;
if (t === "int") {
if (hA(A)) return s(A);
e();
}
if (A === "int") {
if (hA(t)) return s(t);
e();
}
if (t === "uint") {
if (lA(A)) return s(A);
e();
}
if (A === "uint") {
if (lA(t)) return s(t);
e();
}
if (t === "float") {
if (at(A)) return s(A);
e();
}
if (A === "float") {
if (at(t)) return s(t);
e();
}
if (hA(t) || lA(t) || hA(A) || lA(A)) {
if (t === A) return s(t);
e();
}
if (t === "vec2") {
if (A === "vec2" || gt(A)) return s("vec2");
if (A === "mat3x2") return s("vec3");
if (A === "mat4x2") return s("vec4");
e();
}
if (t === "vec3") {
if (A === "mat2x3") return s("vec2");
if (A === "vec3" || ot(A)) return s("vec3");
if (A === "mat4x3") return s("vec4");
e();
}
if (t === "vec4") {
if (A === "mat2x4") return s("vec2");
if (A === "mat3x4") return s("vec3");
if (A === "vec4" || It(A)) return s("vec4");
e();
}
if (A === "vec2") {
if (gt(t)) return s("vec2");
if (t === "mat2x3") return s("vec3");
if (t === "mat2x4") return s("vec4");
e();
}
if (A === "vec3") {
if (t === "mat3x2") return s("vec2");
if (ot(t)) return s("vec3");
if (t === "mat3x4") return s("vec4");
e();
}
if (A === "vec4") {
if (t === "mat4x2") return s("vec2");
if (t === "mat4x3") return s("vec3");
if (It(t)) return s("vec4");
e();
}
if (gt(t)) {
if (gt(A)) return s("mat2");
if (A === "mat3x2") return s("mat3x2");
if (A === "mat4x2") return s("mat4x2");
e();
}
if (t === "mat2x3") {
if (gt(A)) return s("mat2x3");
if (A === "mat3x2") return s("mat3");
if (A === "mat4x2") return s("mat4x3");
e();
}
if (t === "mat2x4") {
if (gt(A)) return s("mat2x4");
if (A === "mat3x2") return s("mat3x4");
if (A === "mat4x2") return s("mat4");
e();
}
if (t === "mat3x2") {
if (A === "mat2x3") return s("mat2");
if (ot(A)) return s("mat3x2");
if (A === "mat4x3") return s("mat4x2");
e();
}
if (ot(t)) {
if (A === "mat2x3") return s("mat2x3");
if (ot(A)) return s("mat3");
if (A === "mat4x3") return s("mat4x3");
e();
}
if (t === "mat3x4") {
if (A === "mat2x3") return s("mat2x4");
if (ot(A)) return s("mat3x4");
if (A === "mat4x3") return s("mat4");
e();
}
if (t === "mat4x2") {
if (A === "mat2x4") return s("mat2");
if (A === "mat3x4") return s("mat3x2");
if (It(A)) return s("mat4x2");
e();
}
if (t === "mat4x3") {
if (A === "mat2x4") return s("mat2x3");
if (A === "mat3x4") return s("mat3");
if (It(A)) return s("mat4x3");
e();
}
if (It(t)) {
if (A === "mat2x4") return s("mat2x4");
if (A === "mat3x4") return s("mat3x4");
if (It(A)) return s("mat4");
e();
}
throw new Error(`Invalid mul types: ${t}, ${A}`);
}
function EI(t, A) {
return je(t, A, "div");
}
function cI(t, A) {
if (t === A) return t;
if (t === "int") {
if (hA(A)) return A;
} else if (A === "int") {
if (hA(t)) return t;
} else if (t === "uint") {
if (lA(A)) return A;
} else if (A === "uint" && lA(t))
return t;
throw new Error(`Invalid imod types: ${t}, ${A}`);
}
function hI(t, A) {
if (t === A || A === "float") return t;
throw new Error(`Invalid mod types: ${t}, ${A}`);
}
function lI(t) {
return t;
}
function uI(t) {
return t;
}
function dI(t) {
return t;
}
function wI(t) {
return t;
}
function pI(t) {
return t;
}
function yI(t) {
return t;
}
function fI(t) {
return t;
}
function DI(t) {
return t;
}
function mI(t) {
return t;
}
function xI(t) {
return t;
}
function MI(t) {
return t;
}
function SI(t) {
return t;
}
function NI(t) {
return t;
}
function FI(t) {
return t;
}
function kI(t) {
return t;
}
function RI(t) {
return t;
}
function Yi(t, A, e = "min") {
if (t === A) return t;
if (A === "float") {
if (zt(t)) return t;
} else if (A === "int") {
if (hA(t)) return t;
} else if (A === "uint" && lA(t))
return t;
throw new Error(`Invalid ${e} types: ${t}, ${A}`);
}
function GI(t, A) {
return Yi(t, A, "max");
}
function UI(t, A, e) {
if (A === "float") {
if (zt(t)) return t;
} else if (A === "int") {
if (hA(t)) return t;
} else if (A === "uint" && lA(t))
return t;
throw new Error(`Invalid clamp types: ${t}, ${A}`);
}
function vI(t, A, e) {
if (e === t || e === "float" || e === "bool" && t === "float" || e === "bvec2" && t === "vec2" || e === "bvec3" && t === "vec3" || e === "bvec4" && t === "vec4") return t;
throw new Error(`Invalid mix types: ${t}, ${A}, ${e}`);
}
function bI(t, A) {
if (t === A || A === "float") return A;
throw new Error(`Invalid step types: ${t}, ${A}`);
}
function LI(t, A, e) {
if (t === A && (t === e || t === "float"))
return e;
throw new Error(`Invalid smoothstep types: ${t}, ${A}, ${e}`);
}
function Ti(t, A = "isNan") {
if (t === "float") return "bool";
if (t === "vec2") return "bvec2";
if (t === "vec3") return "bvec3";
if (t === "vec4") return "bvec4";
throw new Error(`Invalid ${A} types: ${t}`);
}
function YI(t) {
return Ti(t, "isInf");
}
const DA = (t, A) => new qi({ a: t, b: A }), St = (t, A) => new zi({ a: t, b: A }), QA = (t, A) => new _i({ a: t, b: A }), se = (t, A) => new Vi({ a: t, b: A }), ve = (t, A) => new Zi({ a: t, b: A }), Ji = (t, A) => new Oi({ a: t, b: A }), TI = (t) => new Wi({ a: t }).outputs, Pe = (t) => new ji({ a: t }), JI = (t) => new Pi({ a: t }), HI = (t) => new Xi({ a: t }), KI = (t) => new $i({ a: t }), qI = (t) => new An({ a: t }), zI = (t) => new tn({ a: t }), _I = (t) => new en({ a: t }), ie = (t) => new sn({ a: t }), VI = (t, A) => new nn({ a: t, b: A }), ZI = (t) => new rn({ a: t }), OI = (t) => new an({ a: t }), WI = (t) => new gn({ a: t }), jI = (t) => new on({ a: t }), PI = (t) => new In({ a: t }), XI = (t) => new Bn({ a: t }), $I = (t) => new Qn({ a: t }), AB = (t, A) => new Cn({ a: t, b: A }), Hi = (t, A) => new En({ a: t, b: A }), tB = (t, A, e) => new cn({ a: t, min: A, max: e }), Ki = (t, A, e) => new hn({ a: t, b: A, t: e }), eB = (t, A) => new ln({ edge: t, x: A }), sB = (t, A, e) => new un({ edge0: t, edge1: A, x: e }), iB = (t) => new dn({ a: t }), nB = (t) => new wn({ a: t });
class qi extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "sum", outTypeFunc: je }), this.statements = ({ inputs: s, outputs: i }) => [`${i.sum} = ${s.a} + ${s.b};`];
}
}
class zi extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "difference", outTypeFunc: QI }), this.statements = ({ inputs: s, outputs: i }) => [`${i.difference} = ${s.a} - ${s.b};`];
}
}
class _i extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "product", outTypeFunc: CI }), this.statements = ({ inputs: s, outputs: i }) => [`${i.product} = ${s.a} * ${s.b};`];
}
}
class Vi extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "quotient", outTypeFunc: EI }), this.statements = ({ inputs: s, outputs: i }) => [`${i.quotient} = ${s.a} / ${s.b};`];
}
}
class Zi extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "remainder", outTypeFunc: cI }), this.statements = ({ inputs: s, outputs: i }) => [`${i.remainder} = ${s.a} % ${s.b};`];
}
}
class Oi extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "remainder", outTypeFunc: hI }), this.statements = ({ inputs: s, outputs: i }) => [`${i.remainder} = mod(${s.a}, ${s.b});`];
}
}
class Wi extends V {
constructor({ a: A }) {
const e = { a: _(A) }, s = e.a, i = {
fract: s,
integer: s
};
super({ inTypes: e, outTypes: i, inputs: { a: A } }), this.statements = ({ inputs: n, outputs: r }) => [`${r.fract} = modf(${n.a}, ${r.integer});`];
}
}
class ji extends N {
constructor({ a: A }) {
super({ a: A, outKey: "neg", outTypeFunc: lI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.neg} = -${e.a};`];
}
}
class Pi extends N {
constructor({ a: A }) {
super({ a: A, outKey: "abs", outTypeFunc: uI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.abs} = abs(${e.a});`];
}
}
class Xi extends N {
constructor({ a: A }) {
super({ a: A, outKey: "sign", outTypeFunc: dI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.sign} = sign(${e.a});`];
}
}
class $i extends N {
constructor({ a: A }) {
super({ a: A, outKey: "floor", outTypeFunc: wI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.floor} = floor(${e.a});`];
}
}
class An extends N {
constructor({ a: A }) {
super({ a: A, outKey: "ceil", outTypeFunc: pI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.ceil} = ceil(${e.a});`];
}
}
class tn extends N {
constructor({ a: A }) {
super({ a: A, outKey: "trunc", outTypeFunc: yI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.trunc} = trunc(${e.a});`];
}
}
class en extends N {
constructor({ a: A }) {
super({ a: A, outKey: "round", outTypeFunc: fI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.round} = round(${e.a});`];
}
}
class sn extends N {
constructor({ a: A }) {
super({ a: A, outKey: "fract", outTypeFunc: DI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.fract} = fract(${e.a});`];
}
}
class nn extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "power", outTypeFunc: mI }), this.statements = ({ inputs: s, outputs: i }) => [`${i.power} = pow(${s.a}, ${s.b});`];
}
}
class rn extends N {
constructor({ a: A }) {
super({ a: A, outKey: "exp", outTypeFunc: xI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.exp} = exp(${e.a});`];
}
}
class an extends N {
constructor({ a: A }) {
super({ a: A, outKey: "exp2", outTypeFunc: MI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.exp2} = exp2(${e.a});`];
}
}
class gn extends N {
constructor({ a: A }) {
super({ a: A, outKey: "log", outTypeFunc: SI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.log} = log(${e.a});`];
}
}
class on extends N {
constructor({ a: A }) {
super({ a: A, outKey: "log2", outTypeFunc: NI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.log2} = log2(${e.a});`];
}
}
class In extends N {
constructor({ a: A }) {
super({ a: A, outKey: "sqr", outTypeFunc: FI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.sqr} = ${e.a} * ${e.a};`];
}
}
class Bn extends N {
constructor({ a: A }) {
super({ a: A, outKey: "sqrt", outTypeFunc: kI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.sqrt} = sqrt(${e.a});`];
}
}
class Qn extends N {
constructor({ a: A }) {
super({ a: A, outKey: "inversesqrt", outTypeFunc: RI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.inversesqrt} = inversesqrt(${e.a});`];
}
}
class Cn extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "min", outTypeFunc: Yi }), this.statements = ({ inputs: s, outputs: i }) => [`${i.min} = min(${s.a}, ${s.b});`];
}
}
class En extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "max", outTypeFunc: GI }), this.statements = ({ inputs: s, outputs: i }) => [`${i.max} = max(${s.a}, ${s.b});`];
}
}
class cn extends ut {
constructor({
a: A,
min: e,
max: s
}) {
super({
a: A,
b: e,
c: s,
outKey: "clamp",
outTypeFunc: UI
}), this.statements = ({ inputs: i, outputs: n }) => {
const { a: r, b: a, c: g } = i;
return [`${n.clamp} = clamp(${r}, ${a}, ${g});`];
};
}
}
class hn extends ut {
constructor({ a: A, b: e, t: s }) {
super({ a: A, b: e, c: s, outKey: "mix", outTypeFunc: vI }), this.statements = ({ inputs: i, outputs: n }) => {
const { a: r, b: a, c: g } = i;
return [`${n.mix} = mix(${r}, ${a}, ${g});`];
};
}
}
class ln extends $ {
constructor({ edge: A, x: e }) {
super({
a: A,
b: e,
outKey: "step",
outTypeFunc: bI
}), this.statements = ({ inputs: s, outputs: i }) => {
const { a: n, b: r } = s;
return [`${i.step} = step(${n}, ${r});`];
};
}
}
class un extends ut {
constructor({
edge0: A,
edge1: e,
x: s
}) {
super({
a: A,
b: e,
c: s,
outKey: "smoothstep",
outTypeFunc: LI
}), this.statements = ({ inputs: i, outputs: n }) => {
const { a: r, b: a, c: g } = i;
return [`${n.smoothstep} = smoothstep(${r}, ${a}, ${g});`];
};
}
}
class dn extends N {
constructor({ a: A }) {
super({ a: A, outKey: "isNan", outTypeFunc: Ti }), this.statements = ({ inputs: e, outputs: s }) => [`${s.isNan} = isNan(${e.a});`];
}
}
class wn extends N {
constructor({ a: A }) {
super({ a: A, outKey: "isInf", outTypeFunc: YI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.isInf} = isInf(${e.a});`];
}
}
const rB = (t, A) => new yn({ a: t, b: A }), aB = (t, A) => new fn({ a: t, b: A }), gB = (t, A) => new Dn({ a: t, b: A }), oB = (t) => new mn({ a: t }), IB = (t, A) => new xn({ a: t, b: A }), BB = (t, A) => new Mn({ a: t, b: A }), QB = (t, A) => new Sn({ a: t, b: A }), pn = (t, A) => new Nn({ a: t, b: A }), CB = (t, A) => new Fn({ a: t, b: A }), EB = (t, A) => new kn({ a: t, b: A }), cB = (t) => new Rn({ a: t }), hB = (t) => new Gn({ a: t }), Xe = (t, A, e) => new Un({ cond: t, t: A, f: e }), lB = (t) => new bn({ a: t });
class yn extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outTypeFunc: (s, i) => s, outKey: "and" }), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.and === "bool" ? [`${i.and} = ${s.a} && ${s.b};`] : [`${i.and} = ${s.a} & ${s.b};`];
}
}
class fn extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outTypeFunc: (s, i) => s, outKey: "or" }), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.or === "bool" ? [`${i.or} = ${s.a} || ${s.b};`] : [`${i.or} = ${s.a} | ${s.b};`];
}
}
class Dn extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outTypeFunc: (s, i) => s, outKey: "xor" }), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.xor === "bool" ? [`${i.xor} = ${s.a} ^^ ${s.b};`] : [`${i.xor} = ${s.a} ^ ${s.b};`];
}
}
class mn extends N {
constructor({ a: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "not" }), this.statements = ({ inputs: e, outputs: s }) => this.outTypes.not === "bool" ? [`${s.not} = !${e.a};`] : [`${s.not} = not(${e.a});`];
}
}
class xn extends $ {
constructor({ a: A, b: e }) {
super({
a: A,
b: e,
outTypeFunc: (s, i) => le(s, "lessThan"),
outKey: "lessThan"
}), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.lessThan === "bool" ? [`${i.lessThan} = ${s.a} < ${s.b};`] : [`${i.lessThan} = lessThan(${s.a}, ${s.b});`];
}
}
class Mn extends $ {
constructor({ a: A, b: e }) {
super({
a: A,
b: e,
outTypeFunc: (s, i) => le(s, "lessThanEqual"),
outKey: "lessThanEqual"
}), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.lessThanEqual === "bool" ? [`${i.lessThanEqual} = ${s.a} <= ${s.b};`] : [
`${i.lessThanEqual} = lessThanEqual(${s.a}, ${s.b});`
];
}
}
class Sn extends $ {
constructor({ a: A, b: e }) {
super({
a: A,
b: e,
outTypeFunc: (s, i) => le(s, "greaterThan"),
outKey: "greaterThan"
}), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.greaterThan === "bool" ? [`${i.greaterThan} = ${s.a} > ${s.b};`] : [
`${i.greaterThan} = greaterThan(${s.a}, ${s.b});`
];
}
}
class Nn extends $ {
constructor({ a: A, b: e }) {
super({
a: A,
b: e,
outTypeFunc: (s, i) => le(s, "greaterThanEqual"),
outKey: "greaterThanEqual"
}), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.greaterThanEqual === "bool" ? [`${i.greaterThanEqual} = ${s.a} >= ${s.b};`] : [
`${i.greaterThanEqual} = greaterThanEqual(${s.a}, ${s.b});`
];
}
}
class Fn extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outTypeFunc: vn, outKey: "equal" }), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.equal === "bool" ? [`${i.equal} = ${s.a} == ${s.b};`] : [`${i.equal} = equal(${s.a}, ${s.b});`];
}
}
class kn extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outTypeFunc: uB, outKey: "notEqual" }), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.notEqual === "bool" ? [`${i.notEqual} = ${s.a} != ${s.b};`] : [`${i.notEqual} = notEqual(${s.a}, ${s.b});`];
}
}
class Rn extends N {
constructor({ a: A }) {
super({ a: A, outTypeFunc: (e) => "bool", outKey: "any" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.any} = any(${e.a});`];
}
}
class Gn extends N {
constructor({ a: A }) {
super({ a: A, outTypeFunc: (e) => "bool", outKey: "all" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.all} = all(${e.a});`];
}
}
class Un extends ut {
constructor({
cond: A,
t: e,
f: s
}) {
super({
a: A,
b: e,
c: s,
outKey: "select",
outTypeFunc: (i, n, r) => n
}), this.statements = ({ inputs: i, outputs: n }) => {
const { a: r, b: a, c: g } = i;
return [`${n.select} = (${r}) ? (${a}) : (${g});`];
};
}
}
function le(t, A) {
if (lt(t))
return "bool";
if (t === "ivec2" || t === "uvec2" || t === "vec2")
return "bvec2";
if (t === "ivec3" || t === "uvec3" || t === "vec3")
return "bvec3";
if (t === "ivec4" || t === "uvec4" || t === "vec4")
return "bvec4";
throw new Error(`Invalid ${A} type: ${t}`);
}
function vn(t, A = "equal") {
if (lt(t))
return "bool";
if (ht(t))
return t;
if (t === "ivec2" || t === "uvec2" || t === "vec2")
return "bvec2";
if (t === "ivec3" || t === "uvec3" || t === "vec3")
return "bvec3";
if (t === "ivec4" || t === "uvec4" || t === "vec4")
return "bvec4";
throw new Error(`Invalid ${A} type: ${t}`);
}
function uB(t) {
return vn(t, "notEqual");
}
function dB(t) {
if (ht(t))
return "bool";
if (hA(t))
return "int";
if (lA(t))
return "uint";
throw new Error(`Invalid compXor type: ${t}`);
}
class bn extends N {
constructor({ a: A }) {
const e = dB(_(A));
super({ a: A, outTypeFunc: (s) => e, outKey: "compXor" }), this.statements = ({ inputs: s, outputs: i }) => {
if (lt(this.outTypes.compXor))
return [`${i.compXor} = ${s.a};`];
const r = (Nt(e) ? ["x", "y"] : Ft(e) ? ["x", "y", "z"] : ["x", "y", "z", "w"]).map((g) => `${s.a}.${g}`), a = ht(e) ? "^^" : "^";
return [`${i.compXor} = ${r.join(` ${a} `)};`];
};
}
}
const wB = (t) => new qn({ value: t }), pB = (t) => new zn({ value: t }), yB = (t) => new _n({ value: t }), Ln = (t) => new Vn({ value: t }), fB = (t) => new Zn({ value: t }), DB = (t) => new On({ value: t }), mB = (t) => new Wn({ value: t }), xB = (t) => new jn({ value: t }), MB = (t) => new Pn({ value: t }), SB = (t) => new Xn({ value: t }), NB = (t) => new $n({ value: t }), FB = (t) => new Ar({ value: t }), kB = (t) => new tr({ value: t }), Yn = (t) => new er({ value: t }), ct = (t) => new sr({ value: t }), Tn = (t) => new ir({ value: t }), RB = (t) => new nr({ value: t }), GB = (t) => new rr({ value: t }), UB = (t) => new ar({ value: t }), Jn = (t) => new gr({ value: t }), vB = (t) => new or({ value: t }), bB = (t) => new Ir({ value: t }), LB = (t) => new Br({ value: t }), YB = (t) => new Qr({ value: t }), TB = (t) => new Cr({ value: t }), JB = (t) => new Er({ value: t }), HB = (t) => new cr({ value: t }), Hn = (t) => new hr({ value: t }), KB = (t) => new lr({ value: t }), Kn = (t) => new ur({ value: t });
class gA extends N {
constructor({
value: A,
outType: e,
outKey: s
}) {
super({ a: A, outTypeFunc: () => e, outKey: s }), this.statements = ({ inputs: i, outputs: n }) => [
`${n[s]} = ${Ns(e)}(${i.a});`
];
}
}
class qn extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "bool", outKey: "bool" });
}
}
class zn extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "int", outKey: "int" });
}
}
class _n extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "uint", outKey: "uint" });
}
}
class Vn extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "float", outKey: "float" });
}
}
class Zn extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "bvec2", outKey: "bvec2" });
}
}
class On extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "bvec3", outKey: "bvec3" });
}
}
class Wn extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "bvec4", outKey: "bvec4" });
}
}
class jn extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "ivec2", outKey: "ivec2" });
}
}
class Pn extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "ivec3", outKey: "ivec3" });
}
}
class Xn extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "ivec4", outKey: "ivec4" });
}
}
class $n extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "uvec2", outKey: "uvec2" });
}
}
class Ar extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "uvec3", outKey: "uvec3" });
}
}
class tr extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "uvec4", outKey: "uvec4" });
}
}
class er extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "vec2", outKey: "vec2" });
}
}
class sr extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "vec3", outKey: "vec3" });
}
}
class ir extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "vec4", outKey: "vec4" });
}
}
class nr extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "mat2", outKey: "mat2" });
}
}
class rr extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "mat3", outKey: "mat3" });
}
}
class ar extends gA {
constructor({
value: A
}) {
super({ value: A, outType: "mat4", outKey: "mat4" });
}
}
class gr extends N {
constructor({ value: A }) {
super({ a: A, outKey: "int", outTypeFunc: () => "int" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.int} = floatBitsToInt(${e.a});`];
}
}
class or extends N {
constructor({ value: A }) {
super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.uint} = floatBitsToUint(${e.a});`];
}
}
class Ir extends N {
constructor({ value: A }) {
super({ a: A, outKey: "float", outTypeFunc: () => "float" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.float} = intBitsToFloat(${e.a});`];
}
}
class Br extends N {
constructor({ value: A }) {
super({ a: A, outKey: "float", outTypeFunc: () => "float" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.float} = uintBitsToFloat(${e.a});`];
}
}
class Qr extends N {
constructor({ value: A }) {
super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.uint} = packSnorm2x16(${e.a});`];
}
}
class Cr extends N {
constructor({ value: A }) {
super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.vec2} = unpackSnorm2x16(${e.a});`];
}
}
class Er extends N {
constructor({ value: A }) {
super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.uint} = packUnorm2x16(${e.a});`];
}
}
class cr extends N {
constructor({ value: A }) {
super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.vec2} = unpackUnorm2x16(${e.a});`];
}
}
class hr extends N {
constructor({ value: A }) {
super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.uint} = packHalf2x16(${e.a});`];
}
}
class lr extends N {
constructor({ value: A }) {
super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.vec2} = unpackHalf2x16(${e.a});`];
}
}
class ur extends N {
constructor({ value: A }) {
super({ a: A, outKey: "rgba8", outTypeFunc: () => "vec4" }), this.statements = ({ inputs: e, outputs: s }) => [
`uvec4 uRgba = uvec4(${e.a} & 0xffu, (${e.a} >> 8u) & 0xffu, (${e.a} >> 16u) & 0xffu, (${e.a} >> 24u) & 0xffu);`,
`${s.rgba8} = vec4(uRgba) / 255.0;`
];
}
}
const qB = (t) => new yr({ a: t }), zB = (t, A) => new fr({ a: t, b: A }), dr = (t, A) => new Dr({ a: t, b: A }), _B = (t, A) => new mr({ a: t, b: A }), wr = (t) => new xr({ a: t }), VB = (t, A, e) => new Nr({ a: t, b: A, c: e }), ZB = (t, A) => new Fr({ incident: t, normal: A }), OB = (t, A, e) => new kr({ incident: t, normal: A, eta: e }), xt = (t) => new Lr({ vector: t }), KA = ({
vector: t,
vectorType: A,
x: e,
y: s,
z: i,
w: n,
r,
g: a,
b: g,
a: I
}) => new Yr({ vector: t, vectorType: A, x: e, y: s, z: i, w: n, r, g: a, b: g, a: I }), WB = (t) => new Mr({ a: t }), pr = (t, A) => new Sr({ a: t, b: A }), jB = (t, A) => new Tr({ vector: t, select: A }), PB = (t, A) => new Rr({ a: t, b: A }), XB = (t, A) => new Gr({ a: t, b: A }), $B = (t) => new Ur({ a: t }), AQ = (t) => new vr({ a: t }), tQ = (t) => new br({ a: t });
class yr extends N {
constructor({ a: A }) {
super({ a: A, outTypeFunc: (e) => "float", outKey: "length" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.length} = length(${e.a});`
];
}
}
class fr extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "distance", outTypeFunc: (s, i) => "float" }), this.statements = ({ inputs: s, outputs: i }) => [
`${i.distance} = distance(${s.a}, ${s.b});`
];
}
}
class Dr extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "dot", outTypeFunc: (s, i) => "float" }), this.statements = ({ inputs: s, outputs: i }) => [
`${i.dot} = dot(${s.a}, ${s.b});`
];
}
}
class mr extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "cross", outTypeFunc: (s, i) => "vec3" }), this.statements = ({ inputs: s, outputs: i }) => [
`${i.cross} = cross(${s.a}, ${s.b});`
];
}
}
class xr extends N {
constructor({ a: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "normalize" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.normalize} = normalize(${e.a});`
];
}
}
function eQ(t) {
if (t === "vec3")
return "vec2";
if (t === "vec4")
return "vec3";
throw new Error("Invalid type");
}
class Mr extends N {
constructor({ a: A }) {
super({
a: A,
outTypeFunc: (e) => eQ(e),
outKey: "projected"
}), this.statements = ({ inputs: e, outputs: s }) => {
if (this.inTypes.a === "vec3")
return [`${s.projected} = ${e.a}.xy / ${e.a}.z;`];
if (this.inTypes.a === "vec4")
return [`${s.projected} = ${e.a}.xyz / ${e.a}.w;`];
throw new Error("Invalid type");
};
}
}
function sQ(t) {
if (t === "float") return "vec2";
if (t === "vec2") return "vec3";
if (t === "vec3") return "vec4";
throw new Error("Invalid type");
}
class Sr extends $ {
constructor({ a: A, b: e }) {
const s = _(A), i = sQ(s);
super({ a: A, b: e, outKey: "extend", outTypeFunc: () => i }), this.statements = ({ inputs: n, outputs: r }) => [
`${r.extend} = ${i}(${n.a}, ${n.b});`
];
}
}
class Nr extends ut {
constructor({ a: A, b: e, c: s }) {
super({
a: A,
b: e,
c: s,
outKey: "forward",
outTypeFunc: (i, n, r) => i
}), this.statements = ({ inputs: i, outputs: n }) => [
`${n.forward} = faceforward(${i.a}, ${i.b}, ${i.c});`
];
}
}
class Fr extends $ {
constructor({
incident: A,
normal: e
}) {
super({
a: A,
b: e,
outKey: "reflection",
outTypeFunc: (s, i) => s
}), this.statements = ({ inputs: s, outputs: i }) => [
`${i.reflection} = reflect(${s.a}, ${s.b});`
];
}
}
class kr extends ut {
constructor({
incident: A,
normal: e,
eta: s
}) {
super({
a: A,
b: e,
c: s,
outKey: "refraction",
outTypeFunc: (i, n, r) => i
}), this.statements = ({ inputs: i, outputs: n }) => [
`${n.refraction} = refract(${i.a}, ${i.b}, ${i.c});`
];
}
}
class Rr extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "product", outTypeFunc: (s, i) => s }), this.statements = ({ inputs: s, outputs: i }) => [
`${i.product} = matrixCompMult(${A}, ${e});`
];
}
}
function iQ(t, A) {
if (t === "vec2") {
if (A === "vec2") return "mat2";
if (A === "vec3") return "mat3x2";
if (A === "vec4") return "mat4x2";
}
if (t === "vec3") {
if (A === "vec2") return "mat2x3";
if (A === "vec3") return "mat3";
if (A === "vec4") return "mat4x3";
}
if (t === "vec4") {
if (A === "vec2") return "mat2x4";
if (A === "vec3") return "mat3x4";
if (A === "vec4") return "mat4";
}
throw new Error(`Invalid outer type: ${t}, ${A}`);
}
class Gr extends $ {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "outer", outTypeFunc: iQ }), this.statements = ({ inputs: s, outputs: i }) => [
`${i.outer} = outerProduct(${s.a}, ${s.b});`
];
}
}
function nQ(t) {
if (t === "mat2") return "mat2";
if (t === "mat3") return "mat3";
if (t === "mat4") return "mat4";
if (t === "mat2x2") return "mat2x2";
if (t === "mat2x3") return "mat3x2";
if (t === "mat2x4") return "mat4x2";
if (t === "mat3x2") return "mat2x3";
if (t === "mat3x3") return "mat3x3";
if (t === "mat3x4") return "mat4x3";
if (t === "mat4x2") return "mat2x4";
if (t === "mat4x3") return "mat3x4";
if (t === "mat4x4") return "mat4x4";
throw new Error(`Invalid transpose type: ${t}`);
}
class Ur extends N {
constructor({ a: A }) {
super({ a: A, outKey: "transpose", outTypeFunc: nQ }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.transpose} = transpose(${e.a});`
];
}
}
class vr extends N {
constructor({ a: A }) {
super({ a: A, outKey: "det", outTypeFunc: (e) => "float" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.det} = determinant(${e.a});`
];
}
}
class br extends N {
constructor({ a: A }) {
super({ a: A, outKey: "inverse", outTypeFunc: (e) => e }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.inverse} = inverse(${A});`
];
}
}
function rQ(t) {
const A = (e) => e;
switch (t) {
case "vec2":
return A({ x: "float", y: "float", r: "float", g: "float" });
case "vec3":
return A({
x: "float",
y: "float",
z: "float",
r: "float",
g: "float",
b: "float"
});
case "vec4":
return A({
x: "float",
y: "float",
z: "float",
w: "float",
r: "float",
g: "float",
b: "float",
a: "float"
});
case "ivec2":
return A({ x: "int", y: "int", r: "int", g: "int" });
case "ivec3":
return A({
x: "int",
y: "int",
z: "int",
r: "int",
g: "int",
b: "int"
});
case "ivec4":
return A({
x: "int",
y: "int",
z: "int",
w: "int",
r: "int",
g: "int",
b: "int",
a: "int"
});
case "uvec2":
return A({ x: "uint", y: "uint", r: "uint", g: "uint" });
case "uvec3":
return A({
x: "uint",
y: "uint",
z: "uint",
r: "uint",
g: "uint",
b: "uint"
});
case "uvec4":
return A({
x: "uint",
y: "uint",
z: "uint",
w: "uint",
r: "uint",
g: "uint",
b: "uint",
a: "uint"
});
default:
throw new Error(`Invalid vector type: ${t}`);
}
}
class Lr extends V {
constructor({ vector: A }) {
const s = { vector: _(A) }, i = rQ(s.vector);
super({ inTypes: s, outTypes: i, inputs: { vector: A } }), this.statements = ({ inputs: n, outputs: r }) => {
const { x: a, y: g, z: I, w: B, r: o, g: C, b: E, a: l } = r, { vector: c } = n;
return [
a ? `${a} = ${c}.x;` : null,
g ? `${g} = ${c}.y;` : null,
I ? `${I} = ${c}.z;` : null,
B ? `${B} = ${c}.w;` : null,
o ? `${o} = ${c}.r;` : null,
C ? `${C} = ${c}.g;` : null,
E ? `${E} = ${c}.b;` : null,
l ? `${l} = ${c}.a;` : null
].filter(Boolean);
};
}
}
class Yr extends V {
constructor({
vector: A,
vectorType: e,
x: s,
y: i,
z: n,
w: r,
r: a,
g,
b: I,
a: B
}) {
if (!A && !e)
throw new Error("Either vector or vectorType must be provided");
const o = e ?? _(A), C = xs(o), E = Ms(o), l = {
vector: o,
x: C,
y: C,
r: C,
g: C
}, c = { vector: A, x: s, y: i, r: a, g };
E >= 3 && (Object.assign(l, { z: C, b: C }), Object.assign(c, { z: n, b: I })), E >= 4 && (Object.assign(l, { w: C, a: C }), Object.assign(c, { w: r, a: B })), super({ inTypes: l, outTypes: { vector: o }, inputs: c }), this.statements = ({ inputs: h, outputs: u }) => {
const { vector: d } = u, {
vector: w,
x: y,
y: f,
z: M,
w: x,
r: D,
g: p,
b: G,
a: S
} = h, m = [
`${d}.x = ${y ?? D ?? (w ? `${w}.x` : vt(C))};`,
`${d}.y = ${f ?? p ?? (w ? `${w}.y` : vt(C))};`
];
return E >= 3 && m.push(
`${d}.z = ${M ?? G ?? (w ? `${w}.z` : vt(C))};`
), E >= 4 && m.push(
`${d}.w = ${x ?? S ?? (w ? `${w}.w` : vt(C))};`
), m;
};
}
dynoOut() {
return new q(
this,
"vector"
);
}
}
function aQ(t, A) {
let e = null;
if (zt(t) ? e = A.length === 1 ? "float" : A.length === 2 ? "vec2" : A.length === 3 ? "vec3" : A.length === 4 ? "vec4" : null : hA(t) ? e = A.length === 1 ? "int" : A.length === 2 ? "ivec2" : A.length === 3 ? "ivec3" : A.length === 4 ? "ivec4" : null : lA(t) && (e = A.length === 1 ? "uint" : A.length === 2 ? "uvec2" : A.length === 3 ? "uvec3" : A.length === 4 ? "uvec4" : null), e == null)
throw new Error(`Invalid swizzle: ${A}`);
return e;
}
class Tr extends N {
constructor({ vector: A, select: e }) {
super({
a: A,
outKey: "swizzle",
outTypeFunc: (s) => aQ(s, e)
}), this.statements = ({ inputs: s, outputs: i }) => [
`${i.swizzle} = ${s.a}.${e};`
];
}
}
const gQ = (t, A, e) => new Vr({ index: t, from: A, to: e }), oQ = (t) => new kt({ value: t }), IQ = (t) => new RA({ state: t }), BQ = (t) => new GA({ state: t }), Jr = (t) => new Zr({ value: t }), Hr = (t) => new Or({ value: t }), Kr = (t) => new Wr({ value: t }), qr = (t) => new jr({ value: t }), QQ = (t) => new Pr({ value: t }), CQ = (t) => new Xr({ value: t }), zr = (t) => new $r({ value: t }), be = (t) => new Aa({ value: t }), _r = (t, A, e) => new ta({ z: t, zNear: A, zFar: e }).outputs.depth;
class Vr extends V {
constructor({
from: A,
to: e,
index: s
}) {
super({
inTypes: { from: "int", to: "int", index: "int" },
outTypes: { index: "int" },
inputs: { from: A, to: e, index: s },
statements: ({ inputs: i, outputs: n }) => [
`${n.index} = ${i.index} - ${i.from} + ${i.to};`
]
});
}
dynoOut() {
return new q(this, "index");
}
}
class RA extends V {
constructor({ state: A }) {
const e = _(A);
super({
inTypes: { state: e },
outTypes: { state: "uint" },
inputs: { state: A },
globals: () => [
EA(`
uint pcg_next(uint state) {
return state * 747796405u + 2891336453u;
}
`)
],
statements: ({ inputs: s, outputs: i }) => {
const n = e === "uint" ? `${s.state}` : e === "int" ? `uint(${s.state})` : `floatBitsToUint(${s.state})`;
return [`${i.state} = pcg_next(${n});`];
}
});
}
dynoOut() {
return new q(this, "state");
}
}
class GA extends V {
constructor({ state: A }) {
super({
inTypes: { state: "uint" },
outTypes: { hash: "uint" },
inputs: { state: A },
globals: () => [
EA(`
uint pcg_hash(uint state) {
uint hash = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;
return (hash >> 22u) ^ hash;
}
`)
],
statements: ({ inputs: e, outputs: s }) => [
`${s.hash} = pcg_hash(${e.state});`
]
});
}
dynoOut() {
return new q(this, "hash");
}
}
class kt extends V {
constructor({ value: A }) {
const e = _(A), s = Ss(e);
super({
inTypes: { value: e },
outTypes: { state: "uint" },
inputs: { value: A },
globals: () => [
EA(`
uint pcg_mix(uint value) {
return value;
}
uint pcg_mix(uvec2 value) {
return value.x + 0x9e3779b9u * value.y;
}
uint pcg_mix(uvec3 value) {
return value.x + 0x9e3779b9u * value.y + 0x85ebca6bu * value.z;
}
uint pcg_mix(uvec4 value) {
return value.x + 0x9e3779b9u * value.y + 0x85ebca6bu * value.z + 0xc2b2ae35u * value.w;
}
`)
],
statements: ({ inputs: i, outputs: n }) => {
const r = lA(e) ? `${i.value}` : hA(e) ? `${s}(${i.value})` : `floatBitsToUint(${i.value})`;
return [
`${s} bits = ${r};`,
`${n.state} = pcg_mix(bits);`
];
}
});
}
dynoOut() {
return new q(this, "state");
}
}
class Zr extends zA {
constructor({ value: A }) {
super({
inTypes: { value: _(A) },
outTypes: { hash: "uint" },
inputs: { value: A },
construct: ({ value: e }) => {
if (!e)
throw new Error("value is required");
let s = new kt({ value: e }).outputs.state;
return s = new RA({ state: s }).outputs.state, new GA({ state: s }).outputs;
}
});
}
dynoOut() {
return new q(this, "hash");
}
}
class Or extends zA {
constructor({ value: A }) {
super({
inTypes: { value: _(A) },
outTypes: { hash: "uvec2" },
inputs: { value: A },
construct: ({ value: e }) => {
if (!e)
throw new Error("value is required");
let s = new kt({ value: e }).outputs.state;
s = new RA({ state: s }).outputs.state;
const i = new GA({ state: s }).outputs.hash;
s = new RA({ state: s }).outputs.state;
const n = new GA({ state: s }).outputs.hash;
return { hash: KA({ vectorType: "uvec2", x: i, y: n }) };
}
});
}
dynoOut() {
return new q(this, "hash");
}
}
class Wr extends zA {
constructor({ value: A }) {
super({
inTypes: { value: _(A) },
outTypes: { hash: "uvec3" },
inputs: { value: A },
construct: ({ value: e }) => {
if (!e)
throw new Error("value is required");
let s = new kt({ value: e }).outputs.state;
s = new RA({ state: s }).outputs.state;
const i = new GA({ state: s }).outputs.hash;
s = new RA({ state: s }).outputs.state;
const n = new GA({ state: s }).outputs.hash;
s = new RA({ state: s }).outputs.state;
const r = new GA({ state: s }).outputs.hash;
return { hash: KA({ vectorType: "uvec3", x: i, y: n, z: r }) };
}
});
}
dynoOut() {
return new q(this, "hash");
}
}
class jr extends zA {
constructor({ value: A }) {
super({
inTypes: { value: _(A) },
outTypes: { hash: "uvec4" },
inputs: { value: A },
construct: ({ value: e }) => {
if (!e)
throw new Error("value is required");
let s = new kt({ value: e }).outputs.state;
s = new RA({ state: s }).outputs.state;
const i = new GA({ state: s }).outputs.hash;
s = new RA({ state: s }).outputs.state;
const n = new GA({ state: s }).outputs.hash;
s = new RA({ state: s }).outputs.state;
const r = new GA({ state: s }).outputs.hash;
s = new RA({ state: s }).outputs.state;
const a = new GA({ state: s }).outputs.hash;
return { hash: KA({ vectorType: "uvec4", x: i, y: n, z: r, w: a }) };
}
});
}
dynoOut() {
return new q(this, "hash");
}
}
class Pr extends zA {
constructor({ value: A }) {
super({
inTypes: { value: _(A) },
outTypes: { hash: "float" },
inputs: { value: A },
construct: ({ value: e }) => {
if (!e)
throw new Error("value is required");
const s = Jr(e);
return { hash: QA(Ln(s), K("float", 1 / 2 ** 32)) };
}
});
}
dynoOut() {
return new q(this, "hash");
}
}
class Xr extends zA {
constructor({ value: A }) {
super({
inTypes: { value: _(A) },
outTypes: { hash: "vec2" },
inputs: { value: A },
construct: ({ value: e }) => {
if (!e)
throw new Error("value is required");
const s = Hr(e);
return { hash: QA(Yn(s), K("float", 1 / 2 ** 32)) };
}
});
}
dynoOut() {
return new q(this, "hash");
}
}
class $r extends zA {
constructor({ value: A }) {
super({
inTypes: { value: _(A) },
outTypes: { hash: "vec3" },
inputs: { value: A },
construct: ({ value: e }) => {
if (!e)
throw new Error("value is required");
const s = Kr(e);
return { hash: QA(ct(s), K("float", 1 / 2 ** 32)) };
}
});
}
dynoOut() {
return new q(this, "hash");
}
}
class Aa extends zA {
constructor({ value: A }) {
super({
inTypes: { value: _(A) },
outTypes: { hash: "vec4" },
inputs: { value: A },
construct: ({ value: e }) => {
if (!e)
throw new Error("value is required");
const s = qr(e);
return { hash: QA(Tn(s), K("float", 1 / 2 ** 32)) };
}
});
}
dynoOut() {
return new q(this, "hash");
}
}
class ta extends V {
constructor({
z: A,
zNear: e,
zFar: s
}) {
super({
inTypes: { z: "float", zNear: "float", zFar: "float" },
outTypes: { depth: "float" },
inputs: { z: A, zNear: e, zFar: s },
statements: ({ inputs: i, outputs: n }) => [
`float clamped = clamp(${i.z}, ${i.zNear}, ${i.zFar});`,
`${n.depth} = (log2(clamped + 1.0) - log2(${i.zNear} + 1.0)) / (log2(${i.zFar} + 1.0) - log2(${i.zNear} + 1.0));`
]
});
}
dynoOut() {
return new q(this, "depth");
}
}
const ea = (t, {
scale: A,
scales: e,
rotate: s,
translate: i
}) => new ia({ position: t, scale: A, scales: e, rotate: s, translate: i }).outputs.position, sa = (t, {
scale: A,
scales: e,
rotate: s
}) => new na({ dir: t, scale: A, scales: e, rotate: s }).outputs.dir, EQ = (t, { rotate: A }) => new ra({ quaternion: t, rotate: A }).outputs.quaternion;
class ia extends V {
constructor({
position: A,
scale: e,
scales: s,
rotate: i,
translate: n
}) {
super({
inTypes: {
position: "vec3",
scale: "float",
scales: "vec3",
rotate: "vec4",
translate: "vec3"
},
outTypes: { position: "vec3" },
inputs: { position: A, scale: e, scales: s, rotate: i, translate: n },
statements: ({ inputs: r, outputs: a }) => {
const { position: g } = a;
if (!g)
return [];
const { scale: I, scales: B, rotate: o, translate: C } = r;
return [
`${g} = ${r.position ?? "vec3(0.0, 0.0, 0.0)"};`,
I ? `${g} *= ${I};` : null,
B ? `${g} *= ${B};` : null,
o ? `${g} = quatVec(${o}, ${g});` : null,
C ? `${g} += ${C};` : null
].filter(Boolean);
}
});
}
}
class na extends V {
constructor({
dir: A,
scale: e,
scales: s,
rotate: i
}) {
super({
inTypes: { dir: "vec3", scale: "float", scales: "vec3", rotate: "vec4" },
outTypes: { dir: "vec3" },
inputs: { dir: A, scale: e, scales: s, rotate: i },
statements: ({ inputs: n, outputs: r }) => {
const { dir: a } = r;
if (!a)
return [];
const { scale: g, scales: I, rotate: B } = n;
return [
`${a} = ${n.dir ?? "vec3(0.0, 0.0, 0.0)"};`,
g ? `${a} *= ${g};` : null,
I ? `${a} *= ${I};` : null,
B ? `${a} = quatVec(${B}, ${a});` : null
].filter(Boolean);
}
});
}
}
class ra extends V {
constructor({
quaternion: A,
rotate: e
}) {
super({
inTypes: { quaternion: "vec4", rotate: "vec4" },
outTypes: { quaternion: "vec4" },
inputs: { quaternion: A, rotate: e },
statements: ({ inputs: s, outputs: i }) => {
const { quaternion: n } = i;
return n ? [
`${n} = ${s.quaternion ?? "vec4(0.0, 0.0, 0.0, 1.0)"};`,
e ? `${n} = quatQuat(${s.rotate}, ${n});` : null
].filter(Boolean) : [];
}
});
}
}
const cQ = () => {
throw new Error("Not implemented");
}, hQ = () => {
throw new Error("Not implemented");
}, lQ = () => {
throw new Error("Not implemented");
}, uQ = () => {
throw new Error("Not implemented");
}, dQ = () => {
throw new Error("Not implemented");
}, wQ = () => {
throw new Error("Not implemented");
}, pQ = (t, A) => new aa({ texture: t, lod: A }), yQ = (t, A, e) => new ga({ texture: t, coord: A, bias: e }), fQ = (t, A, e) => new oa({ texture: t, coord: A, lod: e });
class aa extends V {
constructor({ texture: A, lod: e }) {
const s = _(A);
super({
inTypes: { texture: s, lod: "int" },
outTypes: { size: Ia(s) },
inputs: { texture: A, lod: e },
statements: ({ inputs: i, outputs: n }) => [
`${n.size} = textureSize(${i.texture}, ${i.lod ?? "0"});`
]
});
}
dynoOut() {
return new q(this, "size");
}
}
class ga extends V {
constructor({
texture: A,
coord: e,
bias: s
}) {
const i = _(A);
super({
inTypes: {
texture: i,
coord: DQ(i),
bias: "float"
},
outTypes: { sample: Ba(i) },
inputs: { texture: A, coord: e, bias: s },
statements: ({ inputs: n, outputs: r }) => [
`${r.sample} = texture(${n.texture}, ${n.coord}${n.bias ? `, ${n.bias}` : ""});`
]
});
}
dynoOut() {
return new q(this, "sample");
}
}
class oa extends V {
constructor({
texture: A,
coord: e,
lod: s
}) {
const i = _(A);
super({
inTypes: {
texture: i,
coord: Ia(i),
lod: "int"
},
outTypes: { texel: Ba(i) },
inputs: { texture: A, coord: e, lod: s },
statements: ({ inputs: n, outputs: r }) => [
`${r.texel} = texelFetch(${n.texture}, ${n.coord}, ${n.lod ?? "0"});`
]
});
}
dynoOut() {
return new q(this, "texel");
}
}
function Ia(t) {
switch (t) {
case "sampler2D":
case "usampler2D":
case "isampler2D":
case "samplerCube":
case "usamplerCube":
case "isamplerCube":
case "sampler2DShadow":
case "samplerCubeShadow":
return "ivec2";
case "sampler3D":
case "usampler3D":
case "isampler3D":
case "sampler2DArray":
case "usampler2DArray":
case "isampler2DArray":
case "sampler2DArrayShadow":
return "ivec3";
default:
throw new Error(`Invalid texture type: ${t}`);
}
}
function DQ(t) {
switch (t) {
case "sampler2D":
case "usampler2D":
case "isampler2D":
return "vec2";
case "sampler3D":
case "usampler3D":
case "isampler3D":
case "samplerCube":
case "usamplerCube":
case "isamplerCube":
case "sampler2DArray":
case "usampler2DArray":
case "isampler2DArray":
case "sampler2DShadow":
return "vec3";
case "samplerCubeShadow":
case "sampler2DArrayShadow":
return "vec4";
default:
throw new Error(`Invalid texture type: ${t}`);
}
}
function Ba(t) {
switch (t) {
case "sampler2D":
case "sampler2DArray":
case "sampler3D":
case "samplerCube":
case "sampler2DShadow":
return "vec4";
case "usampler2D":
case "usampler2DArray":
case "usampler3D":
case "usamplerCube":
return "uvec4";
case "isampler2D":
case "isampler2DArray":
case "isampler3D":
case "isamplerCube":
return "ivec4";
case "samplerCubeShadow":
case "sampler2DArrayShadow":
return "float";
default:
throw new Error(`Invalid texture type: ${t}`);
}
}
const mQ = (t) => new Qa({ degrees: t }), xQ = (t) => new Ca({ radians: t }), Le = (t) => new Ea({ radians: t }), MQ = (t) => new ca({ radians: t }), SQ = (t) => new ha({ radians: t }), NQ = (t) => new la({ sin: t }), FQ = (t) => new ua({ cos: t }), kQ = (t) => new da({ tan: t }), RQ = (t, A) => new wa({ y: t, x: A }), GQ = (t) => new pa({ x: t }), UQ = (t) => new ya({ x: t }), vQ = (t) => new fa({ x: t }), bQ = (t) => new Da({ x: t }), LQ = (t) => new ma({ x: t }), YQ = (t) => new xa({ x: t });
class Qa extends N {
constructor({ degrees: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "radians" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.radians} = radians(${e.a});`
];
}
}
class Ca extends N {
constructor({ radians: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "degrees" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.degrees} = degrees(${e.a});`
];
}
}
class Ea extends N {
constructor({ radians: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "sin" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.sin} = sin(${e.a});`
];
}
}
class ca extends N {
constructor({ radians: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "cos" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.cos} = cos(${e.a});`
];
}
}
class ha extends N {
constructor({ radians: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "tan" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.tan} = tan(${e.a});`
];
}
}
class la extends N {
constructor({ sin: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "asin" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.asin} = asin(${e.a});`
];
}
}
class ua extends N {
constructor({ cos: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "acos" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.acos} = acos(${e.a});`
];
}
}
class da extends N {
constructor({ tan: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "atan" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.atan} = atan(${e.a});`
];
}
}
class wa extends $ {
constructor({ y: A, x: e }) {
super({
a: A,
b: e,
outTypeFunc: (s, i) => s,
outKey: "atan2"
}), this.statements = ({ inputs: s, outputs: i }) => [
`${i.atan2} = atan2(${s.a}, ${s.b});`
];
}
}
class pa extends N {
constructor({ x: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "sinh" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.sinh} = sinh(${e.a});`
];
}
}
class ya extends N {
constructor({ x: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "cosh" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.cosh} = cosh(${e.a});`
];
}
}
class fa extends N {
constructor({ x: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "tanh" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.tanh} = tanh(${e.a});`
];
}
}
class Da extends N {
constructor({ x: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "asinh" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.asinh} = asinh(${e.a});`
];
}
}
class ma extends N {
constructor({ x: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "acosh" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.acosh} = acosh(${e.a});`
];
}
}
class xa extends N {
constructor({ x: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "atanh" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.atanh} = atanh(${e.a});`
];
}
}
const oE = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
Abs: Pi,
Acos: ua,
Acosh: ma,
Add: qi,
All: Gn,
And: yn,
Any: Rn,
Asin: la,
Asinh: Da,
Atan: da,
Atan2: wa,
Atanh: xa,
BVec2: Zn,
BVec3: On,
BVec4: Wn,
BinaryOp: $,
Bool: qn,
Ceil: An,
Clamp: cn,
Combine: Yr,
CombineGsplat: Ys,
CompMult: Rr,
CompXor: bn,
Compilation: ks,
Cos: ca,
Cosh: ya,
Cross: mr,
Degrees: Ca,
Determinant: vr,
Distance: fr,
Div: Vi,
Dot: Dr,
Dyno: V,
DynoBlock: zA,
DynoBool: re,
DynoBvec2: _s,
DynoBvec3: Ws,
DynoBvec4: Xs,
DynoConst: Fs,
DynoFloat: Ct,
DynoInt: Ht,
DynoIsampler2D: Ei,
DynoIsampler2DArray: hi,
DynoIsampler3D: di,
DynoIsamplerCube: yi,
DynoIvec2: Zs,
DynoIvec3: Ps,
DynoIvec4: Ai,
DynoLiteral: mt,
DynoMat2: ti,
DynoMat2x2: ei,
DynoMat2x3: si,
DynoMat2x4: ii,
DynoMat3: ni,
DynoMat3x2: ri,
DynoMat3x3: ai,
DynoMat3x4: gi,
DynoMat4: oi,
DynoMat4x2: Ii,
DynoMat4x3: Bi,
DynoMat4x4: Qi,
DynoOutput: q,
DynoProgram: Oe,
DynoProgramTemplate: We,
DynoRemapIndex: Vr,
DynoSampler2D: ci,
DynoSampler2DArray: li,
DynoSampler2DArrayShadow: mi,
DynoSampler2DShadow: Di,
DynoSampler3D: wi,
DynoSamplerCube: fi,
DynoSamplerCubeShadow: xi,
DynoUint: zs,
DynoUniform: R,
DynoUsampler2D: Ci,
DynoUsampler2DArray: Yt,
DynoUsampler3D: ui,
DynoUsamplerCube: pi,
DynoUvec2: Vs,
DynoUvec3: js,
DynoUvec4: $s,
DynoValue: nt,
DynoVec2: Os,
DynoVec3: Mt,
DynoVec4: Ot,
Equal: Fn,
Exp: rn,
Exp2: an,
ExtendVec: Sr,
FaceForward: Nr,
Float: Vn,
FloatBitsToInt: gr,
FloatBitsToUint: or,
Floor: $i,
Fract: sn,
GreaterThan: Sn,
GreaterThanEqual: Nn,
Gsplat: X,
GsplatNormal: Js,
Hash: Zr,
Hash2: Or,
Hash3: Wr,
Hash4: jr,
HashFloat: Pr,
HashVec2: Xr,
HashVec3: $r,
HashVec4: Aa,
IMod: Zi,
IVec2: jn,
IVec3: Pn,
IVec4: Xn,
Int: zn,
IntBitsToFloat: Ir,
Inverse: br,
InverseSqrt: Qn,
IsInf: wn,
IsNan: dn,
Length: yr,
LessThan: xn,
LessThanEqual: Mn,
Log: gn,
Log2: on,
Mat2: nr,
Mat3: rr,
Mat4: ar,
Max: En,
Min: Cn,
Mix: hn,
Mod: Oi,
Modf: Wi,
Mul: _i,
Neg: ji,
Normalize: xr,
NormalizedDepth: ta,
Not: mn,
NotEqual: kn,
NumPackedSplats: Gs,
Or: fn,
Outer: Gr,
OutputPackedSplat: qs,
OutputRgba8: Ve,
PackHalf2x16: hr,
PackSnorm2x16: Qr,
PackUnorm2x16: Er,
PcgHash: GA,
PcgMix: kt,
PcgNext: RA,
Pow: nn,
ProjectH: Mr,
Radians: Qa,
ReadPackedSplat: vs,
ReadPackedSplatRange: bs,
ReflectVec: Fr,
RefractVec: kr,
Round: en,
Select: Un,
Sign: Xi,
SimpleCast: gA,
Sin: Ea,
Sinh: pa,
Smoothstep: un,
Split: Lr,
SplitGsplat: Ls,
Sqr: In,
Sqrt: Bn,
Step: ln,
Sub: zi,
Swizzle: Tr,
TPackedSplats: Zt,
Tan: ha,
Tanh: fa,
TexelFetch: oa,
Texture: ga,
TextureSize: aa,
TransformDir: na,
TransformGsplat: Hs,
TransformPosition: ia,
TransformQuaternion: ra,
Transpose: Ur,
TrinaryOp: ut,
Trunc: tn,
UVec2: $n,
UVec3: Ar,
UVec4: tr,
Uint: _n,
UintBitsToFloat: Br,
UintToRgba8: ur,
UnaryOp: N,
UnpackHalf2x16: lr,
UnpackSnorm2x16: Cr,
UnpackUnorm2x16: cr,
Vec2: er,
Vec3: sr,
Vec4: ir,
Xor: Dn,
abs: JI,
acos: FQ,
acosh: LQ,
add: DA,
all: hB,
and: rB,
any: cB,
arrayIndex: dQ,
arrayLength: wQ,
asin: NQ,
asinh: bQ,
atan: kQ,
atan2: RQ,
atanh: YQ,
bool: wB,
bvec2: fB,
bvec3: DB,
bvec4: mB,
ceil: qI,
clamp: tB,
combine: KA,
combineGsplat: rt,
comment: uQ,
compMult: PB,
compXor: lB,
cos: MQ,
cosh: UQ,
cross: _B,
defineGsplat: NA,
defineGsplatNormal: Ts,
definePackedSplats: ce,
degrees: xQ,
determinant: AQ,
distance: zB,
div: se,
dot: dr,
dyno: Vt,
dynoBlock: kA,
dynoBool: Hg,
dynoBvec2: zg,
dynoBvec3: Og,
dynoBvec4: Pg,
dynoConst: K,
dynoDeclare: ze,
dynoFloat: TA,
dynoFor: lQ,
dynoIf: cQ,
dynoInt: qg,
dynoIsampler2D: Eo,
dynoIsampler2DArray: lo,
dynoIsampler3D: po,
dynoIsamplerCube: Do,
dynoIvec2: Vg,
dynoIvec3: jg,
dynoIvec4: $g,
dynoLiteral: ne,
dynoMat2: to,
dynoMat2x2: eo,
dynoMat2x3: so,
dynoMat2x4: io,
dynoMat3: no,
dynoMat3x2: ro,
dynoMat3x3: ao,
dynoMat3x4: go,
dynoMat4: oo,
dynoMat4x2: Io,
dynoMat4x3: Bo,
dynoMat4x4: Qo,
dynoSampler2D: co,
dynoSampler2DArray: uo,
dynoSampler2DArrayShadow: Mo,
dynoSampler2DShadow: xo,
dynoSampler3D: yo,
dynoSamplerCube: mo,
dynoSamplerCubeShadow: So,
dynoSwitch: hQ,
dynoUint: Kg,
dynoUsampler2D: Co,
dynoUsampler2DArray: ho,
dynoUsampler3D: wo,
dynoUsamplerCube: fo,
dynoUvec2: _g,
dynoUvec3: Wg,
dynoUvec4: Xg,
dynoVec2: Zg,
dynoVec3: At,
dynoVec4: Ao,
equal: CB,
exp: ZI,
exp2: OI,
extendVec: pr,
faceforward: VB,
float: Ln,
floatBitsToInt: Jn,
floatBitsToUint: vB,
floor: KI,
fract: ie,
greaterThan: QB,
greaterThanEqual: pn,
gsplatNormal: Re,
hash: Jr,
hash2: Hr,
hash3: Kr,
hash4: qr,
hashFloat: QQ,
hashVec2: CQ,
hashVec3: zr,
hashVec4: be,
imod: ve,
int: pB,
intBitsToFloat: bB,
inverse: tQ,
inversesqrt: $I,
isAllFloatType: at,
isBoolType: ht,
isFloatType: zt,
isInf: nB,
isIntType: hA,
isMat2: gt,
isMat3: ot,
isMat4: It,
isMatFloatType: ms,
isNan: iB,
isScalarType: lt,
isUintType: lA,
isVector2Type: Nt,
isVector3Type: Ft,
isVector4Type: _t,
isVectorType: Gg,
ivec2: xB,
ivec3: MB,
ivec4: SB,
length: qB,
lessThan: IB,
lessThanEqual: BB,
literalNegOne: Lg,
literalOne: bg,
literalZero: vt,
log: WI,
log2: jI,
mat2: RB,
mat3: GB,
mat4: UB,
max: Hi,
min: AB,
mix: Ki,
mod: Ji,
modf: TI,
mul: QA,
neg: Pe,
normalize: wr,
normalizedDepth: _r,
not: oB,
notEqual: EB,
numPackedSplats: Yg,
numberAsFloat: H,
numberAsInt: nA,
numberAsUint: rA,
or: aB,
outer: XB,
outputPackedSplat: Ks,
outputRgba8: Tg,
packHalf2x16: Hn,
packSnorm2x16: YB,
packUnorm2x16: JB,
pcgHash: BQ,
pcgMix: oQ,
pcgNext: IQ,
pow: VI,
projectH: WB,
radians: mQ,
readPackedSplat: Jt,
readPackedSplatRange: Rs,
reflectVec: ZB,
refractVec: OB,
remapIndex: gQ,
round: _I,
sameSizeIvec: vg,
sameSizeUvec: Ss,
sameSizeVec: Ug,
select: Xe,
sign: HI,
sin: Le,
sinh: GQ,
smoothstep: sB,
split: xt,
splitGsplat: Qt,
sqr: PI,
sqrt: XI,
step: eB,
sub: St,
swizzle: jB,
tan: SQ,
tanh: vQ,
texelFetch: fQ,
texture: yQ,
textureSize: pQ,
transformDir: sa,
transformGsplat: _e,
transformPos: ea,
transformQuat: EQ,
transpose: $B,
trunc: zI,
typeLiteral: Ns,
uint: yB,
uintBitsToFloat: LB,
uintToRgba8: Kn,
uniform: Jg,
unindent: EA,
unindentLines: UA,
unpackHalf2x16: KB,
unpackSnorm2x16: TB,
unpackUnorm2x16: HB,
uvec2: NB,
uvec3: FB,
uvec4: kB,
valType: _,
vec2: Yn,
vec3: ct,
vec4: Tn,
vectorDim: Ms,
vectorElementType: xs,
xor: gB
}, Symbol.toStringTag, { value: "Module" }));
var TQ = `precision highp float;
precision highp int;
precision highp sampler2D;
precision highp usampler2D;
precision highp isampler2D;
precision highp sampler2DArray;
precision highp usampler2DArray;
precision highp isampler2DArray;
precision highp sampler3D;
precision highp usampler3D;
precision highp isampler3D;
#include <splatDefines>
uniform uint targetLayer;
uniform int targetBase;
uniform int targetCount;
out vec4 target;
{{ GLOBALS }}
void computeReadback(int index) {
{{ STATEMENTS }}
}
void main() {
int targetIndex = int(targetLayer << SPLAT_TEX_LAYER_BITS) + int(uint(gl_FragCoord.y) << SPLAT_TEX_WIDTH_BITS) + int(gl_FragCoord.x);
int index = targetIndex - targetBase;
if ((index >= 0) && (index < targetCount)) {
computeReadback(index);
} else {
target = vec4(0.0, 0.0, 0.0, 0.0);
}
}`;
const IA = class IA {
constructor({ renderer: A } = {}) {
this.renderer = A, this.capacity = 0, this.count = 0;
}
dispose() {
this.target && (this.target.dispose(), this.target = void 0);
}
// Ensure we have a buffer large enough for the readback of count indices.
// Pass in previous bufer of the desired type.
ensureBuffer(A, e) {
const i = Math.ceil(Math.max(1, A) / P) * P * 4;
if (e.byteLength >= i)
return e;
const n = new ArrayBuffer(i);
if (e instanceof ArrayBuffer)
return n;
const r = e.constructor;
return new r(n);
}
// Ensure our render target is large enough for the readback of capacity indices.
ensureCapacity(A) {
const { width: e, height: s, depth: i, maxSplats: n } = mA(A);
(!this.target || n > this.capacity) && (this.dispose(), this.capacity = n, this.target = new Q.WebGLArrayRenderTarget(e, s, i, {
depthBuffer: !1,
stencilBuffer: !1,
generateMipmaps: !1,
magFilter: Q.NearestFilter,
minFilter: Q.NearestFilter
}), this.target.texture.format = Q.RGBAFormat, this.target.texture.type = Q.UnsignedByteType, this.target.texture.internalFormat = "RGBA8", this.target.scissorTest = !0);
}
// Get a program and THREE.RawShaderMaterial for a given Rgba8Readback,
// generating it if necessary and caching the result.
prepareProgramMaterial(A) {
let e = IA.readbackProgram.get(A);
if (!e) {
const i = kA(
{ index: "int" },
{ rgba8: "vec4" },
({ index: n }) => (A.inputs.index = n, { rgba8: new Ve({ rgba8: A.outputs.rgba8 }) })
);
IA.programTemplate || (IA.programTemplate = new We(TQ)), e = new Oe({
graph: i,
inputs: { index: "index" },
outputs: { rgba8: "target" },
template: IA.programTemplate
}), Object.assign(e.uniforms, {
targetLayer: { value: 0 },
targetBase: { value: 0 },
targetCount: { value: 0 }
}), IA.readbackProgram.set(A, e);
}
const s = e.prepareMaterial();
return IA.mesh.material = s, { program: e, material: s };
}
saveRenderState(A) {
return {
xrEnabled: A.xr.enabled,
autoClear: A.autoClear
};
}
resetRenderState(A, e) {
A.setRenderTarget(null), A.xr.enabled = e.xrEnabled, A.autoClear = e.autoClear;
}
process({
count: A,
material: e
}) {
const s = this.renderer;
if (!s)
throw new Error("No renderer");
if (!this.target)
throw new Error("No target");
const i = P * it;
e.uniforms.targetBase.value = 0, e.uniforms.targetCount.value = A;
let n = 0;
for (; n < A; ) {
const r = Math.floor(n / i), a = r * i, g = Math.min(
it,
Math.ceil((A - a) / P)
);
e.uniforms.targetLayer.value = r, this.target.scissor.set(0, 0, P, g), s.setRenderTarget(this.target, r), s.xr.enabled = !1, s.autoClear = !1, s.render(IA.scene, IA.camera), n += P * g;
}
this.count = A;
}
async read({
readback: A
}) {
const e = this.renderer;
if (!e)
throw new Error("No renderer");
if (!this.target)
throw new Error("No target");
const s = Math.ceil(this.count / P) * P;
if (A.byteLength < s * 4)
throw new Error(
`Readback buffer too small: ${A.byteLength} < ${s * 4}`
);
const i = new Uint8Array(
A instanceof ArrayBuffer ? A : A.buffer
), n = P * it;
let r = 0;
const a = [];
for (; r < this.count; ) {
const g = Math.floor(r / n), I = g * n, B = Math.min(
it,
Math.ceil((this.count - I) / P)
);
e.setRenderTarget(this.target, g);
const o = P * B * 4, C = i.subarray(
I * 4,
I * 4 + o
), E = e == null ? void 0 : e.readRenderTargetPixelsAsync(
this.target,
0,
0,
P,
B,
C
);
a.push(E), r += P * B;
}
return Promise.all(a).then(() => A);
}
// Perform render operation to run the Rgba8Readback program
// but don't perform the readback yet.
render({
reader: A,
count: e,
renderer: s
}) {
if (this.renderer = s || this.renderer, !this.renderer)
throw new Error("No renderer");
this.ensureCapacity(e);
const { program: i, material: n } = this.prepareProgramMaterial(A);
i.update();
const r = this.saveRenderState(this.renderer);
this.process({ count: e, material: n }), this.resetRenderState(this.renderer, r);
}
// Perform a readback of the render target, returning a buffer of the
// given type.
async readback({
readback: A
}) {
if (!this.renderer)
throw new Error("No renderer");
const e = this.saveRenderState(this.renderer), s = this.read({ readback: A });
return this.resetRenderState(this.renderer, e), s;
}
// Perform a render and readback operation for the given Rgba8Readback,
// and readback buffer (call ensureBuffer first).
async renderReadback({
reader: A,
count: e,
renderer: s,
readback: i
}) {
if (this.renderer = s || this.renderer, !this.renderer)
throw new Error("No renderer");
this.ensureCapacity(e);
const { program: n, material: r } = this.prepareProgramMaterial(A);
n.update();
const a = this.saveRenderState(this.renderer);
this.process({ count: e, material: r });
const g = this.read({ readback: i });
return this.resetRenderState(this.renderer, a), g;
}
getTexture() {
var A;
return (A = this.target) == null ? void 0 : A.texture;
}
};
IA.programTemplate = null, IA.readbackProgram = /* @__PURE__ */ new Map(), IA.geometry = new Q.PlaneGeometry(2, 2), IA.mesh = new Q.Mesh(
IA.geometry,
new Q.RawShaderMaterial({ visible: !1 })
), IA.scene = new Q.Scene().add(IA.mesh), IA.camera = new Q.Camera();
let ge = IA;
const BA = class BA {
constructor(A = {}) {
this.capacity = 0, this.count = 0, this.array = null, this.readback = null, this.source = null, this.needsUpdate = !0, this.dyno = new R({
key: "rgbaArray",
type: Ma,
globals: () => [Sa],
value: {
texture: BA.getEmpty(),
count: 0
},
update: (e) => {
var s;
return e.texture = ((s = this.readback) == null ? void 0 : s.getTexture()) ?? this.source ?? BA.getEmpty(), e.count = this.count, e;
}
}), A.array ? (this.array = A.array, this.capacity = Math.floor(this.array.length / 4), this.capacity = Math.floor(this.capacity / P) * P, this.count = Math.min(
this.capacity,
A.count ?? Number.POSITIVE_INFINITY
)) : (this.capacity = A.capacity ?? 0, this.count = 0);
}
// Free up resources
dispose() {
this.readback && (this.readback.dispose(), this.readback = null), this.source && (this.source.dispose(), this.source = null);
}
// Ensure that our array is large enough to hold capacity RGBA8 values.
ensureCapacity(A) {
var e;
if (!this.array || A > (((e = this.array) == null ? void 0 : e.length) ?? 0) / 4) {
this.capacity = mA(A).maxSplats;
const s = new Uint8Array(this.capacity * 4);
this.array && s.set(this.array), this.array = s;
}
return this.array;
}
// Get the THREE.DataArrayTexture from either the readback or the source.
getTexture() {
var e;
let A = (e = this.readback) == null ? void 0 : e.getTexture();
return (this.source || this.array) && (A = this.maybeUpdateSource()), A ?? BA.getEmpty();
}
// Create or get a THREE.DataArrayTexture from the data array.
maybeUpdateSource() {
if (!this.array)
throw new Error("No array");
if (this.needsUpdate || !this.source) {
if (this.needsUpdate = !1, this.source) {
const { width: A, height: e, depth: s } = this.source.image;
this.capacity !== A * e * s && (this.source.dispose(), this.source = null);
}
if (this.source)
this.array.buffer !== this.source.image.data.buffer && (this.source.image.data = new Uint8Array(this.array.buffer));
else {
const { width: A, height: e, depth: s } = mA(this.capacity);
this.source = new Q.DataArrayTexture(
this.array,
A,
e,
s
), this.source.format = Q.RGBAFormat, this.source.type = Q.UnsignedByteType, this.source.internalFormat = "RGBA8", this.source.needsUpdate = !0;
}
this.source.needsUpdate = !0;
}
return this.source;
}
// Generate the RGBA8 values from a Rgba8Readback dyno program.
render({
reader: A,
count: e,
renderer: s
}) {
this.readback || (this.readback = new ge({ renderer: s })), this.readback.render({ reader: A, count: e, renderer: s }), this.capacity = this.readback.capacity, this.count = this.readback.count;
}
// Extract the RGBA8 values from a PackedSplats collection.
fromPackedSplats({
packedSplats: A,
base: e,
count: s,
renderer: i
}) {
const { dynoSplats: n, dynoBase: r, dynoCount: a, reader: g } = BA.makeDynos();
return n.packedSplats = A, r.value = e, a.value = s, this.render({ reader: g, count: s, renderer: i }), this;
}
// Read back the RGBA8 values from the readback buffer.
async read() {
if (!this.readback)
throw new Error("No readback");
return (!this.array || this.array.length < this.count * 4) && (this.array = new Uint8Array(this.capacity * 4)), (await this.readback.readback({ readback: this.array })).subarray(0, this.count * 4);
}
// Can be used where you need an uninitialized THREE.DataArrayTexture like
// a uniform you will update with the result of this.getTexture() later.
static getEmpty() {
if (!BA.emptySource) {
const A = new Uint8Array(4);
BA.emptySource = new Q.DataArrayTexture(A, 1, 1, 1), BA.emptySource.format = Q.RGBAFormat, BA.emptySource.type = Q.UnsignedByteType, BA.emptySource.internalFormat = "RGBA8", BA.emptySource.needsUpdate = !0;
}
return BA.emptySource;
}
// Create a dyno program that can extract RGBA8 values from a PackedSplats
static makeDynos() {
if (!BA.dynos) {
const A = new As(), e = new Ht({ value: 0 }), s = new Ht({ value: 0 }), i = kA(
{ index: "int" },
{ rgba8: "vec4" },
({ index: n }) => {
if (!n)
throw new Error("index is undefined");
n = DA(n, e);
const r = Rs(
A,
n,
e,
s
);
return { rgba8: Qt(r).outputs.rgba };
}
);
BA.dynos = { dynoSplats: A, dynoBase: e, dynoCount: s, reader: i };
}
return BA.dynos;
}
};
BA.emptySource = null, BA.dynos = null;
let Ye = BA;
const Ma = { type: "RgbaArray" }, Sa = EA(`
struct RgbaArray {
sampler2DArray texture;
int count;
};
`);
function JQ(t, A) {
return new V({
inTypes: { rgba: Ma, index: "int" },
outTypes: { rgba: "vec4" },
inputs: { rgba: t, index: A },
globals: () => [Sa],
statements: ({ inputs: s, outputs: i }) => UA(`
if ((index >= 0) && (index < ${s.rgba}.count)) {
${i.rgba} = texelFetch(${s.rgba}.texture, splatTexCoord(index), 0);
} else {
${i.rgba} = vec4(0.0, 0.0, 0.0, 0.0);
}
`)
}).outputs.rgba;
}
var HQ = /* @__PURE__ */ ((t) => (t.ALL = "all", t.PLANE = "plane", t.SPHERE = "sphere", t.BOX = "box", t.ELLIPSOID = "ellipsoid", t.CYLINDER = "cylinder", t.CAPSULE = "capsule", t.INFINITE_CONE = "infinite_cone", t))(HQ || {});
function KQ(t) {
switch (t) {
case "all":
return 0;
case "plane":
return 1;
case "sphere":
return 2;
case "box":
return 3;
case "ellipsoid":
return 4;
case "cylinder":
return 5;
case "capsule":
return 6;
case "infinite_cone":
return 7;
default:
throw new Error(`Unknown SDF type: ${t}`);
}
}
var qQ = /* @__PURE__ */ ((t) => (t.MULTIPLY = "multiply", t.SET_RGB = "set_rgb", t.ADD_RGBA = "add_rgba", t))(qQ || {});
function zQ(t) {
switch (t) {
case "multiply":
return 0;
case "set_rgb":
return 1;
case "add_rgba":
return 2;
default:
throw new Error(`Unknown blend mode: ${t}`);
}
}
class _Q extends Q.Object3D {
constructor(A = {}) {
super();
const { type: e, invert: s, opacity: i, color: n, displace: r, radius: a } = A;
this.type = e ?? "sphere", this.invert = s ?? !1, this.opacity = i ?? 1, this.color = n ?? new Q.Color(1, 1, 1), this.displace = r ?? new Q.Vector3(0, 0, 0), this.radius = a ?? 0;
}
}
const Ee = class Ee extends Q.Object3D {
constructor(A = {}) {
const {
name: e,
rgbaBlendMode: s = "multiply",
sdfSmooth: i = 0,
softEdge: n = 0,
invert: r = !1,
sdfs: a = null
} = A;
super(), this.rgbaBlendMode = s, this.sdfSmooth = i, this.softEdge = n, this.invert = r, this.sdfs = a, this.ordering = Ee.nextOrdering++, this.name = e ?? `Edit ${this.ordering}`;
}
addSdf(A) {
this.sdfs == null && (this.sdfs = []), this.sdfs.includes(A) || this.sdfs.push(A);
}
removeSdf(A) {
this.sdfs != null && (this.sdfs = this.sdfs.filter((e) => e !== A));
}
};
Ee.nextOrdering = 1;
let oe = Ee;
class VQ {
constructor({ maxSdfs: A, maxEdits: e }) {
this.maxSdfs = Math.max(16, A ?? 0), this.numSdfs = 0, this.sdfData = new Uint32Array(this.maxSdfs * 8 * 4), this.sdfFloatData = new Float32Array(this.sdfData.buffer), this.sdfTexture = this.newSdfTexture(this.sdfData, this.maxSdfs), this.dynoSdfArray = new R({
key: "sdfArray",
type: Na,
globals: () => [Fa],
value: {
numSdfs: 0,
sdfTexture: this.sdfTexture
},
update: (s) => (s.numSdfs = this.numSdfs, s.sdfTexture = this.sdfTexture, s)
}), this.maxEdits = Math.max(16, e ?? 0), this.numEdits = 0, this.editData = new Uint32Array(this.maxEdits * 4), this.editFloatData = new Float32Array(this.editData.buffer), this.dynoNumEdits = new Ht({ value: 0 }), this.dynoEdits = this.newEdits(this.editData, this.maxEdits);
}
newSdfTexture(A, e) {
const s = new Q.DataTexture(
A,
8,
e,
Q.RGBAIntegerFormat,
Q.UnsignedIntType
);
return s.internalFormat = "RGBA32UI", s.needsUpdate = !0, s;
}
newEdits(A, e) {
return new R({
key: "edits",
type: "uvec4",
count: e,
globals: () => [ka],
value: A
});
}
// Ensure our SDF texture and edits uniform array have enough capacity.
// Reallocate if not.
ensureCapacity({
maxSdfs: A,
maxEdits: e
}) {
let s = !1;
return A > this.sdfTexture.image.height && (this.sdfTexture.dispose(), this.maxSdfs = Math.max(this.maxSdfs * 2, A), this.sdfData = new Uint32Array(this.maxSdfs * 8 * 4), this.sdfFloatData = new Float32Array(this.sdfData.buffer), this.sdfTexture = this.newSdfTexture(this.sdfData, this.maxSdfs)), e > (this.dynoEdits.count ?? 0) && (this.maxEdits = Math.max(this.maxEdits * 2, e), this.editData = new Uint32Array(this.maxEdits * 4), this.editFloatData = new Float32Array(this.editData.buffer), this.dynoEdits = this.newEdits(this.editData, this.maxEdits), s = !0), s;
}
updateEditData(A, e) {
const s = this.editData[A] !== e;
return this.editData[A] = e, s;
}
updateEditFloatData(A, e) {
dt[0] = e;
const s = this.editFloatData[A] !== dt[0];
return s && (this.editFloatData[A] = dt[0]), s;
}
encodeEdit(A, {
sdfFirst: e,
sdfCount: s,
invert: i,
rgbaBlendMode: n,
softEdge: r,
sdfSmooth: a
}) {
const g = A * 4;
let I = !1;
return I = this.updateEditData(g + 0, n | (i ? 256 : 0)) || I, I = this.updateEditData(g + 1, e | s << 16) || I, I = this.updateEditFloatData(g + 2, r) || I, I = this.updateEditFloatData(g + 3, a) || I, I;
}
updateSdfData(A, e) {
const s = this.sdfData[A] !== e;
return this.sdfData[A] = e, s;
}
updateSdfFloatData(A, e) {
dt[0] = e;
const s = this.sdfFloatData[A] !== dt[0];
return s && (this.sdfFloatData[A] = dt[0]), s;
}
encodeSdf(A, {
sdfType: e,
invert: s,
center: i,
quaternion: n,
scale: r,
sizes: a
}, g) {
const I = A * 32, B = e | (s ? 256 : 0);
let o = !1;
o = this.updateSdfFloatData(I + 0, (i == null ? void 0 : i.x) ?? 0) || o, o = this.updateSdfFloatData(I + 1, (i == null ? void 0 : i.y) ?? 0) || o, o = this.updateSdfFloatData(I + 2, (i == null ? void 0 : i.z) ?? 0) || o, o = this.updateSdfData(I + 3, B) || o, o = this.updateSdfFloatData(I + 4, (n == null ? void 0 : n.x) ?? 0) || o, o = this.updateSdfFloatData(I + 5, (n == null ? void 0 : n.y) ?? 0) || o, o = this.updateSdfFloatData(I + 6, (n == null ? void 0 : n.z) ?? 0) || o, o = this.updateSdfFloatData(I + 7, (n == null ? void 0 : n.w) ?? 0) || o, o = this.updateSdfFloatData(I + 8, (r == null ? void 0 : r.x) ?? 0) || o, o = this.updateSdfFloatData(I + 9, (r == null ? void 0 : r.y) ?? 0) || o, o = this.updateSdfFloatData(I + 10, (r == null ? void 0 : r.z) ?? 0) || o, o = this.updateSdfData(I + 11, 0) || o, o = this.updateSdfFloatData(I + 12, (a == null ? void 0 : a.x) ?? 0) || o, o = this.updateSdfFloatData(I + 13, (a == null ? void 0 : a.y) ?? 0) || o, o = this.updateSdfFloatData(I + 14, (a == null ? void 0 : a.z) ?? 0) || o, o = this.updateSdfFloatData(I + 15, (a == null ? void 0 : a.w) ?? 0) || o;
const C = Math.min(4, g.length);
for (let E = 0; E < C; ++E) {
const l = I + 16 + E * 4;
o = this.updateSdfFloatData(l + 0, g[E].x) || o, o = this.updateSdfFloatData(l + 1, g[E].y) || o, o = this.updateSdfFloatData(l + 2, g[E].z) || o, o = this.updateSdfFloatData(l + 3, g[E].w) || o;
}
return o;
}
// Update the SDFs and edits from an array of SplatEdits and their
// associated SplatEditSdfs, updating it for the dyno shader program.
update(A) {
const e = A.reduce((o, { sdfs: C }) => o + C.length, 0), s = this.ensureCapacity({
maxEdits: A.length,
maxSdfs: e
}), i = [new Q.Vector4(), new Q.Vector4()], n = new Q.Vector3(), r = new Q.Quaternion(), a = new Q.Vector3(), g = new Q.Vector4();
let I = 0, B = s;
A.length !== this.dynoNumEdits.value && (this.dynoNumEdits.value = A.length, this.numEdits = A.length, B = !0);
for (const [o, { edit: C, sdfs: E }] of A.entries()) {
B = this.encodeEdit(o, {
sdfFirst: I,
sdfCount: E.length,
invert: C.invert,
rgbaBlendMode: zQ(C.rgbaBlendMode),
softEdge: C.softEdge,
sdfSmooth: C.sdfSmooth
}) || B;
let l = !1;
for (const c of E)
g.set(c.scale.x, c.scale.y, c.scale.z, c.radius), c.scale.setScalar(1), c.updateMatrixWorld(), c.matrixWorld.clone().invert().decompose(n, r, a), c.scale.set(g.x, g.y, g.z), c.updateMatrixWorld(), i[0].set(c.color.r, c.color.g, c.color.b, c.opacity), i[1].set(c.displace.x, c.displace.y, c.displace.z, 1), l = this.encodeSdf(
I,
{
sdfType: KQ(c.type),
invert: c.invert,
center: n,
quaternion: r,
scale: a,
sizes: g
},
i
) || l, I += 1;
this.numSdfs = I, l && (this.sdfTexture.needsUpdate = !0), B || (B = l);
}
return { updated: B, dynoUpdated: s };
}
// Modify a Gsplat in a dyno shader program using the current edits and SDFs.
modify(A) {
return ZQ(
A,
this.dynoSdfArray,
this.dynoNumEdits,
this.dynoEdits
);
}
}
const Na = { type: "SdfArray" }, Fa = EA(`
struct SdfArray {
int numSdfs;
usampler2D sdfTexture;
};
void unpackSdfArray(
usampler2D sdfTexture, int sdfIndex, out uint flags,
out vec3 center, out vec4 quaternion, out vec3 scale, out vec4 sizes,
int numValues, out vec4 values[4]
) {
uvec4 temp = texelFetch(sdfTexture, ivec2(0, sdfIndex), 0);
flags = temp.w;
center = vec3(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z));
temp = texelFetch(sdfTexture, ivec2(1, sdfIndex), 0);
quaternion = vec4(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z), uintBitsToFloat(temp.w));
temp = texelFetch(sdfTexture, ivec2(2, sdfIndex), 0);
scale = vec3(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z));
temp = texelFetch(sdfTexture, ivec2(3, sdfIndex), 0);
sizes = vec4(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z), uintBitsToFloat(temp.w));
for (int i = 0; i < numValues; ++i) {
temp = texelFetch(sdfTexture, ivec2(4 + i, sdfIndex), 0);
values[i] = vec4(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z), uintBitsToFloat(temp.w));
}
}
const uint SDF_FLAG_TYPE = 0xFFu;
const uint SDF_FLAG_INVERT = 1u << 8u;
const uint SDF_TYPE_ALL = 0u;
const uint SDF_TYPE_PLANE = 1u;
const uint SDF_TYPE_SPHERE = 2u;
const uint SDF_TYPE_BOX = 3u;
const uint SDF_TYPE_ELLIPSOID = 4u;
const uint SDF_TYPE_CYLINDER = 5u;
const uint SDF_TYPE_CAPSULE = 6u;
const uint SDF_TYPE_INFINITE_CONE = 7u;
float evaluateSdfArray(
usampler2D sdfTexture, int numSdfs, int sdfFirst, int sdfCount, vec3 pos,
float smoothK, int numValues, out vec4 outValues[4]
) {
float distanceAccum = (smoothK == 0.0) ? 1.0 / 0.0 : 0.0;
float maxExp = -1.0 / 0.0;
for (int i = 0; i < numValues; ++i) {
outValues[i] = vec4(0.0);
}
uint flags;
vec3 center, scale;
vec4 quaternion, sizes;
vec4 values[4];
int sdfLast = min(sdfFirst + sdfCount, numSdfs);
for (int index = sdfFirst; index < sdfLast; ++index) {
unpackSdfArray(sdfTexture, index, flags, center, quaternion, scale, sizes, numValues, values);
uint sdfType = flags & SDF_FLAG_TYPE;
vec3 sdfPos = quatVec(quaternion, pos * scale) + center;
float distance;
switch (sdfType) {
case SDF_TYPE_ALL:
distance = -1.0 / 0.0;
break;
case SDF_TYPE_PLANE: {
distance = sdfPos.z;
break;
}
case SDF_TYPE_SPHERE: {
distance = length(sdfPos) - sizes.w;
break;
}
case SDF_TYPE_BOX: {
vec3 q = abs(sdfPos) - sizes.xyz + sizes.w;
distance = length(max(q, 0.0)) + min(max(q.x, max(q.y, q.z)), 0.0) - sizes.w;
break;
}
case SDF_TYPE_ELLIPSOID: {
vec3 sizes = sizes.xyz;
float k0 = length(sdfPos / sizes);
float k1 = length(sdfPos / dot(sizes, sizes));
distance = k0 * (k0 - 1.0) / k1;
break;
}
case SDF_TYPE_CYLINDER: {
vec2 d = abs(vec2(length(sdfPos.xz), sdfPos.y)) - sizes.wy;
distance = min(max(d.x, d.y), 0.0) + length(max(d, 0.0));
break;
}
case SDF_TYPE_CAPSULE: {
sdfPos.y -= clamp(sdfPos.y, -0.5 * sizes.y, 0.5 * sizes.y);
distance = length(sdfPos) - sizes.w;
break;
}
case SDF_TYPE_INFINITE_CONE: {
float angle = 0.25 * PI * sizes.w;
vec2 c = vec2(sin(angle), cos(angle));
vec2 q = vec2(length(sdfPos.xy), -sdfPos.z);
float d = length(q - c * max(dot(q, c), 0.0));
distance = d * (((q.x * c.y - q.y * c.x) < 0.0) ? -1.0 : 1.0);
break;
}
}
if ((flags & SDF_FLAG_INVERT) != 0u) {
distance = -distance;
}
if (smoothK == 0.0) {
if (distance < distanceAccum) {
distanceAccum = distance;
for (int i = 0; i < numValues; ++i) {
outValues[i] = values[i];
}
}
} else {
float scaledDistance = -distance / smoothK;
if (scaledDistance > maxExp) {
float scale = exp(maxExp - scaledDistance);
distanceAccum *= scale;
for (int i = 0; i < numValues; ++i) {
outValues[i] *= scale;
}
maxExp = scaledDistance;
}
float weight = exp(scaledDistance - maxExp);
distanceAccum += weight;
for (int i = 0; i < numValues; ++i) {
outValues[i] += weight * values[i];
}
}
}
if (smoothK == 0.0) {
return distanceAccum;
} else {
// Very distant SDFs may result in 0 accumulation
if (distanceAccum == 0.0) {
return 1.0 / 0.0;
}
for (int i = 0; i < numValues; ++i) {
outValues[i] /= distanceAccum;
}
return (-log(distanceAccum) - maxExp) * smoothK;
}
}
float modulateSdfArray(
usampler2D sdfTexture, int numSdfs, int sdfFirst, int sdfCount, vec3 pos,
float smoothK, int numValues, out vec4 values[4],
float softEdge, bool invert
) {
float distance = evaluateSdfArray(sdfTexture, numSdfs, sdfFirst, sdfCount, pos, smoothK, numValues, values);
if (invert) {
distance = -distance;
}
return (softEdge == 0.0) ? ((distance < 0.0) ? 1.0 : 0.0)
: clamp(-distance / softEdge + 0.5, 0.0, 1.0);
}
`), ka = EA(`
const uint EDIT_FLAG_BLEND = 0xFFu;
const uint EDIT_BLEND_MULTIPLY = 0u;
const uint EDIT_BLEND_SET_RGB = 1u;
const uint EDIT_BLEND_ADD_RGBA = 2u;
const uint EDIT_FLAG_INVERT = 0x100u;
void decodeEdit(
uvec4 packedEdit, out int sdfFirst, out int sdfCount,
out bool invert, out uint rgbaBlendMode, out float softEdge, out float sdfSmooth
) {
rgbaBlendMode = packedEdit.x & EDIT_FLAG_BLEND;
invert = (packedEdit.x & EDIT_FLAG_INVERT) != 0u;
sdfFirst = int(packedEdit.y & 0xFFFFu);
sdfCount = int(packedEdit.y >> 16u);
softEdge = uintBitsToFloat(packedEdit.z);
sdfSmooth = uintBitsToFloat(packedEdit.w);
}
void applyRgbaDisplaceEdit(
usampler2D sdfTexture, int numSdfs, int sdfFirst, int sdfCount, inout vec3 pos,
float smoothK, float softEdge, bool invert, uint rgbaBlendMode, inout vec4 rgba
) {
vec4 values[4];
float modulate = modulateSdfArray(sdfTexture, numSdfs, sdfFirst, sdfCount, pos, smoothK, 2, values, softEdge, invert);
// On Android, moving values[0] is necessary to work around a compiler bug.
vec4 sdfRgba = values[0];
vec4 sdfDisplaceScale = values[1];
vec4 target;
switch (rgbaBlendMode) {
case EDIT_BLEND_MULTIPLY:
target = rgba * sdfRgba;
break;
case EDIT_BLEND_SET_RGB:
target = vec4(sdfRgba.rgb, rgba.a * sdfRgba.a);
break;
case EDIT_BLEND_ADD_RGBA:
target = rgba + sdfRgba;
break;
default:
// Debug output if blend mode not set
target = vec4(fract(pos), 1.0);
}
rgba = mix(rgba, target, modulate);
pos += sdfDisplaceScale.xyz * modulate;
}
void applyPackedRgbaDisplaceEdit(uvec4 packedEdit, usampler2D sdfTexture, int numSdfs, inout vec3 pos, inout vec4 rgba) {
int sdfFirst, sdfCount;
bool invert;
uint rgbaBlendMode;
float softEdge, sdfSmooth;
decodeEdit(packedEdit, sdfFirst, sdfCount, invert, rgbaBlendMode, softEdge, sdfSmooth);
applyRgbaDisplaceEdit(sdfTexture, numSdfs, sdfFirst, sdfCount, pos, sdfSmooth, softEdge, invert, rgbaBlendMode, rgba);
}
`);
function ZQ(t, A, e, s) {
return new V({
inTypes: {
gsplat: X,
sdfArray: Na,
numEdits: "int",
rgbaDisplaceEdits: "uvec4"
},
outTypes: { gsplat: X },
globals: () => [Fa, ka],
inputs: { gsplat: t, sdfArray: A, numEdits: e, rgbaDisplaceEdits: s },
statements: ({ inputs: n, outputs: r }) => {
const { sdfArray: a, numEdits: g, rgbaDisplaceEdits: I } = n, { gsplat: B } = r;
return UA(`
${B} = ${n.gsplat};
if (isGsplatActive(${B}.flags)) {
for (int editIndex = 0; editIndex < ${g}; ++editIndex) {
applyPackedRgbaDisplaceEdit(
${I}[editIndex], ${a}.sdfTexture, ${a}.numSdfs,
${B}.center, ${B}.rgba
);
}
}
`);
}
}).outputs.gsplat;
}
const dt = new Float32Array(1);
class OQ {
constructor(A) {
this.modifier = A, this.cache = /* @__PURE__ */ new Map();
}
apply(A) {
let e = this.cache.get(A);
return e || (e = kA(
{ index: "int" },
{ gsplat: X },
({ index: s }) => {
const { gsplat: i } = A.apply({ index: s });
return this.modifier.apply({ gsplat: i });
}
), this.cache.set(A, e)), e;
}
}
class yt {
// Create the dyno uniforms that parameterize the transform, setting them
// to initial values that are different from any valid transform.
constructor() {
this.scale = new Ct({ value: Number.NEGATIVE_INFINITY }), this.rotate = new Ot({
value: new Q.Quaternion(
Number.POSITIVE_INFINITY,
Number.POSITIVE_INFINITY,
Number.POSITIVE_INFINITY,
Number.POSITIVE_INFINITY
)
}), this.translate = new Mt({
value: new Q.Vector3(
Number.POSITIVE_INFINITY,
Number.POSITIVE_INFINITY,
Number.POSITIVE_INFINITY
)
});
}
// Apply the transform to a Vec3 position in a dyno program.
apply(A) {
return ea(A, {
scale: this.scale,
rotate: this.rotate,
translate: this.translate
});
}
applyDir(A) {
return sa(A, {
rotate: this.rotate
});
}
// Apply the transform to a Gsplat in a dyno program.
applyGsplat(A) {
return _e(A, {
scale: this.scale,
rotate: this.rotate,
translate: this.translate
});
}
// Update the uniforms to match the given transform matrix.
updateFromMatrix(A) {
const e = new Q.Vector3(), s = new Q.Quaternion(), i = new Q.Vector3();
A.decompose(i, s, e);
const n = (e.x + e.y + e.z) / 3;
let r = !1;
return n !== this.scale.value && (this.scale.value = n, r = !0), i.equals(this.translate.value) || (this.translate.value.copy(i), r = !0), s.equals(this.rotate.value) || (this.rotate.value.copy(s), r = !0), r;
}
// Update this transform to match the object's to-world transform.
update(A) {
return A.updateMatrixWorld(), this.updateFromMatrix(A.matrixWorld);
}
}
class Kt extends Q.Object3D {
constructor({
numSplats: A,
generator: e,
construct: s,
update: i
}) {
if (super(), this.numSplats = A ?? 0, this.generator = e, this.frameUpdate = i, this.version = 0, s) {
const n = s(this);
Object.assign(this, n);
}
}
updateVersion() {
this.version += 1;
}
set needsUpdate(A) {
A && this.updateVersion();
}
}
const et = class et extends Kt {
constructor(A = {}) {
const e = new yt(), s = new yt(), i = new yt(), n = new yt(), r = new Ot({
value: new Q.Vector4(
Number.NEGATIVE_INFINITY,
Number.NEGATIVE_INFINITY,
Number.NEGATIVE_INFINITY,
Number.NEGATIVE_INFINITY
)
}), a = new Ct({ value: 0 }), g = new Ct({ value: 0 }), I = {
transform: e,
viewToWorld: s,
worldToView: i,
viewToObject: n,
recolor: r,
time: a,
deltaTime: g
};
if (super({
update: ({ time: B, deltaTime: o, viewToWorld: C, globalEdits: E }) => this.update({ time: B, deltaTime: o, viewToWorld: C, globalEdits: E })
}), this.isInitialized = !1, this.recolor = new Q.Color(1, 1, 1), this.opacity = 1, this.enableViewToObject = !1, this.enableViewToWorld = !1, this.enableWorldToView = !1, this.skinning = null, this.edits = null, this.rgbaDisplaceEdits = null, this.splatRgba = null, this.maxSh = 3, this.packedSplats = A.packedSplats ?? new qA(), this.numSplats = this.packedSplats.numSplats, this.editable = A.editable ?? !0, this.onFrame = A.onFrame, this.context = I, this.objectModifier = A.objectModifier, this.worldModifier = A.worldModifier, this.updateGenerator(), A.url || A.fileBytes || A.constructSplats || A.packedSplats && !A.packedSplats.isInitialized)
this.initialized = this.asyncInitialize(A).then(async () => {
if (this.updateGenerator(), this.isInitialized = !0, A.onLoad) {
const B = A.onLoad(this);
B instanceof Promise && await B;
}
return this;
});
else if (this.isInitialized = !0, this.initialized = Promise.resolve(this), A.onLoad) {
const B = A.onLoad(this);
B instanceof Promise && (this.initialized = B.then(() => this));
}
}
async asyncInitialize(A) {
const { url: e, fileBytes: s, fileType: i, fileName: n, maxSplats: r, constructSplats: a } = A;
if (e || s || a) {
const g = {
url: e,
fileBytes: s,
fileType: i,
fileName: n,
maxSplats: r,
construct: a
};
this.packedSplats.reinitialize(g);
}
this.packedSplats && (await this.packedSplats.initialized, this.numSplats = this.packedSplats.numSplats, this.updateGenerator());
}
static async staticInitialize() {
await fs(), et.isStaticInitialized = !0;
}
// Creates a new Gsplat with the provided parameters (all values in "float" space,
// i.e. 0-1 for opacity and color) and adds it to the end of the packedSplats,
// increasing numSplats by 1. If necessary, reallocates the buffer with an exponential
// doubling strategy to fit the new data, so it's fairly efficient to just
// pushSplat(...) each Gsplat you want to create in a loop.
pushSplat(A, e, s, i, n) {
this.packedSplats.pushSplat(A, e, s, i, n);
}
// This method iterates over all Gsplats in this instance's packedSplats,
// invoking the provided callback with index: number in 0..=(this.numSplats-1) and
// center: THREE.Vector3, scales: THREE.Vector3, quaternion: THREE.Quaternion,
// opacity: number (0..1), and color: THREE.Color (rgb values in 0..1).
// Note that the objects passed in as center etc. are the same for every callback
// invocation: these objects are reused for efficiency. Changing these values has
// no effect as they are decoded/unpacked copies of the underlying data. To update
// the packedSplats, call .packedSplats.setSplat(index, center, scales,
// quaternion, opacity, color).
forEachSplat(A) {
this.packedSplats.forEachSplat(A);
}
// Call this when you are finished with the SplatMesh and want to free
// any buffers it holds (via packedSplats).
dispose() {
this.packedSplats.dispose();
}
constructGenerator(A) {
const { transform: e, viewToObject: s, recolor: i } = A, n = kA(
{ index: "int" },
{ gsplat: X },
({ index: r }) => {
if (!r)
throw new Error("index is undefined");
let a = Jt(this.packedSplats.dyno, r);
if (this.maxSh >= 1) {
const { sh1Texture: I, sh2Texture: B, sh3Texture: o } = this.ensureShTextures();
if (I) {
const C = s.translate, { center: E } = Qt(a).outputs, l = wr(St(E, C));
let c = XQ(a, I, l);
this.maxSh >= 2 && B && (c = DA(c, $Q(a, B, l))), this.maxSh >= 3 && o && (c = DA(c, AC(a, o, l)));
let { rgba: h } = Qt(a).outputs;
h = DA(h, pr(c, K("float", 0))), a = rt({ gsplat: a, rgba: h });
}
}
if (this.splatRgba) {
const I = JQ(this.splatRgba.dyno, r);
a = rt({ gsplat: a, rgba: I });
}
this.skinning && (a = this.skinning.modify(a)), this.objectModifier && (a = this.objectModifier.apply({ gsplat: a }).gsplat), a = e.applyGsplat(a);
const g = QA(i, Qt(a).outputs.rgba);
return a = rt({ gsplat: a, rgba: g }), this.rgbaDisplaceEdits && (a = this.rgbaDisplaceEdits.modify(a)), this.worldModifier && (a = this.worldModifier.apply({ gsplat: a }).gsplat), { gsplat: a };
}
);
this.generator = n;
}
// Call this whenever something changes in the Gsplat processing pipeline,
// for example changing maxSh or updating objectModifier or worldModifier.
// Compiled generators are cached for efficiency and re-use when the same
// pipeline structure emerges after successive changes.
updateGenerator() {
this.constructGenerator(this.context);
}
// This is called automatically by SparkRenderer and you should not have to
// call it. It updates parameters for the generated pipeline and calls
// updateGenerator() if the pipeline needs to change.
update({
time: A,
viewToWorld: e,
deltaTime: s,
globalEdits: i
}) {
var h;
this.numSplats = this.packedSplats.numSplats, this.context.time.value = A, this.context.deltaTime.value = s, et.dynoTime.value = A;
const { transform: n, viewToObject: r, recolor: a } = this.context;
let g = n.update(this);
this.context.viewToWorld.updateFromMatrix(e) && this.enableViewToWorld && (g = !0);
const I = e.clone().invert();
this.context.worldToView.updateFromMatrix(I) && this.enableWorldToView && (g = !0);
const C = new Q.Matrix4().compose(
n.translate.value,
n.rotate.value,
new Q.Vector3().setScalar(n.scale.value)
).invert().multiply(e);
r.updateFromMatrix(C) && (this.enableViewToObject || this.packedSplats.extra.sh1) && (g = !0);
const E = new Q.Vector4(
this.recolor.r,
this.recolor.g,
this.recolor.b,
this.opacity
);
E.equals(a.value) || (a.value.copy(E), g = !0);
const l = this.editable ? (this.edits ?? []).concat(i) : [];
this.editable && !this.edits && this.traverseVisible((u) => {
u instanceof oe && l.push(u);
}), l.sort((u, d) => u.ordering - d.ordering);
const c = l.map((u) => {
if (u.sdfs != null)
return { edit: u, sdfs: u.sdfs };
const d = [];
return u.traverseVisible((w) => {
w instanceof _Q && d.push(w);
}), { edit: u, sdfs: d };
});
if (c.length > 0 && !this.rgbaDisplaceEdits) {
const u = c.length, d = c.reduce(
(w, y) => w + y.sdfs.length,
0
);
this.rgbaDisplaceEdits = new VQ({
maxEdits: u,
maxSdfs: d
}), this.updateGenerator();
}
if (this.rgbaDisplaceEdits) {
const u = this.rgbaDisplaceEdits.update(c);
g || (g = u.updated), u.dynoUpdated && this.updateGenerator();
}
g && this.updateVersion(), (h = this.onFrame) == null || h.call(this, { mesh: this, time: A, deltaTime: s });
}
// This method conforms to the standard THREE.Raycaster API, performing object-ray
// intersections using this method to populate the provided intersects[] array
// with each intersection point.
raycast(A, e) {
if (!this.packedSplats.packedArray || !this.packedSplats.numSplats)
return;
const { near: s, far: i, ray: n } = A, r = this.matrixWorld.clone().invert(), a = new Q.Matrix3().setFromMatrix4(r), g = n.origin.clone().applyMatrix4(r), I = n.direction.clone().applyMatrix3(a), B = new Q.Vector3();
r.decompose(new Q.Vector3(), new Q.Quaternion(), B), (B.x * B.y * B.z) ** (1 / 3);
const C = xg(
g.x,
g.y,
g.z,
I.x,
I.y,
I.z,
s,
i,
this.packedSplats.numSplats,
this.packedSplats.packedArray,
!0
);
for (const E of C) {
const l = n.direction.clone().multiplyScalar(E).add(n.origin);
e.push({
distance: E,
point: l,
object: this
});
}
}
ensureShTextures() {
if (!this.packedSplats.extra.sh1)
return {};
let A = this.packedSplats.extra.sh1Texture;
if (!A) {
let i = this.packedSplats.extra.sh1;
const { width: n, height: r, depth: a, maxSplats: g } = mA(
i.length / 2
);
if (i.length < g * 2) {
const B = new Uint32Array(g * 2);
B.set(i), this.packedSplats.extra.sh1 = B, i = B;
}
const I = new Q.DataArrayTexture(i, n, r, a);
I.format = Q.RGIntegerFormat, I.type = Q.UnsignedIntType, I.internalFormat = "RG32UI", I.needsUpdate = !0, A = new Yt({
value: I,
key: "sh1"
}), this.packedSplats.extra.sh1Texture = A;
}
if (!this.packedSplats.extra.sh2)
return { sh1Texture: A };
let e = this.packedSplats.extra.sh2Texture;
if (!e) {
let i = this.packedSplats.extra.sh2;
const { width: n, height: r, depth: a, maxSplats: g } = mA(
i.length / 4
);
if (i.length < g * 4) {
const B = new Uint32Array(g * 4);
B.set(i), this.packedSplats.extra.sh2 = B, i = B;
}
const I = new Q.DataArrayTexture(i, n, r, a);
I.format = Q.RGBAIntegerFormat, I.type = Q.UnsignedIntType, I.internalFormat = "RGBA32UI", I.needsUpdate = !0, e = new Yt({
value: I,
key: "sh2"
}), this.packedSplats.extra.sh2Texture = e;
}
if (!this.packedSplats.extra.sh3)
return { sh1Texture: A, sh2Texture: e };
let s = this.packedSplats.extra.sh3Texture;
if (!s) {
let i = this.packedSplats.extra.sh3;
const { width: n, height: r, depth: a, maxSplats: g } = mA(
i.length / 4
);
if (i.length < g * 4) {
const B = new Uint32Array(g * 4);
B.set(i), this.packedSplats.extra.sh3 = B, i = B;
}
const I = new Q.DataArrayTexture(i, n, r, a);
I.format = Q.RGBAIntegerFormat, I.type = Q.UnsignedIntType, I.internalFormat = "RGBA32UI", I.needsUpdate = !0, s = new Yt({
value: I,
key: "sh3"
}), this.packedSplats.extra.sh3Texture = s;
}
return { sh1Texture: A, sh2Texture: e, sh3Texture: s };
}
};
et.staticInitialized = et.staticInitialize(), et.isStaticInitialized = !1, et.dynoTime = new Ct({ value: 0 });
let WA = et;
const WQ = EA(`
vec3 evaluateSH1(Gsplat gsplat, usampler2DArray sh1, vec3 viewDir) {
// Extract sint7 values packed into 2 x uint32
uvec2 packed = texelFetch(sh1, splatTexCoord(gsplat.index), 0).rg;
vec3 sh1_0 = vec3(ivec3(
int(packed.x << 25u) >> 25,
int(packed.x << 18u) >> 25,
int(packed.x << 11u) >> 25
)) / 63.0;
vec3 sh1_1 = vec3(ivec3(
int(packed.x << 4u) >> 25,
int((packed.x >> 3u) | (packed.y << 29u)) >> 25,
int(packed.y << 22u) >> 25
)) / 63.0;
vec3 sh1_2 = vec3(ivec3(
int(packed.y << 15u) >> 25,
int(packed.y << 8u) >> 25,
int(packed.y << 1u) >> 25
)) / 63.0;
return sh1_0 * (-0.4886025 * viewDir.y)
+ sh1_1 * (0.4886025 * viewDir.z)
+ sh1_2 * (-0.4886025 * viewDir.x);
}
`), jQ = EA(`
vec3 evaluateSH2(Gsplat gsplat, usampler2DArray sh2, vec3 viewDir) {
// Extract sint8 values packed into 4 x uint32
uvec4 packed = texelFetch(sh2, splatTexCoord(gsplat.index), 0);
vec3 sh2_0 = vec3(ivec3(
int(packed.x << 24u) >> 24,
int(packed.x << 16u) >> 24,
int(packed.x << 8u) >> 24
)) / 127.0;
vec3 sh2_1 = vec3(ivec3(
int(packed.x) >> 24,
int(packed.y << 24u) >> 24,
int(packed.y << 16u) >> 24
)) / 127.0;
vec3 sh2_2 = vec3(ivec3(
int(packed.y << 8u) >> 24,
int(packed.y) >> 24,
int(packed.z << 24u) >> 24
)) / 127.0;
vec3 sh2_3 = vec3(ivec3(
int(packed.z << 16u) >> 24,
int(packed.z << 8u) >> 24,
int(packed.z) >> 24
)) / 127.0;
vec3 sh2_4 = vec3(ivec3(
int(packed.w << 24u) >> 24,
int(packed.w << 16u) >> 24,
int(packed.w << 8u) >> 24
)) / 127.0;
return sh2_0 * (1.0925484 * viewDir.x * viewDir.y)
+ sh2_1 * (-1.0925484 * viewDir.y * viewDir.z)
+ sh2_2 * (0.3153915 * (2.0 * viewDir.z * viewDir.z - viewDir.x * viewDir.x - viewDir.y * viewDir.y))
+ sh2_3 * (-1.0925484 * viewDir.x * viewDir.z)
+ sh2_4 * (0.5462742 * (viewDir.x * viewDir.x - viewDir.y * viewDir.y));
}
`), PQ = EA(`
vec3 evaluateSH3(Gsplat gsplat, usampler2DArray sh3, vec3 viewDir) {
// Extract sint6 values packed into 4 x uint32
uvec4 packed = texelFetch(sh3, splatTexCoord(gsplat.index), 0);
vec3 sh3_0 = vec3(ivec3(
int(packed.x << 26u) >> 26,
int(packed.x << 20u) >> 26,
int(packed.x << 14u) >> 26
)) / 31.0;
vec3 sh3_1 = vec3(ivec3(
int(packed.x << 8u) >> 26,
int(packed.x << 2u) >> 26,
int((packed.x >> 4u) | (packed.y << 28u)) >> 26
)) / 31.0;
vec3 sh3_2 = vec3(ivec3(
int(packed.y << 22u) >> 26,
int(packed.y << 16u) >> 26,
int(packed.y << 10u) >> 26
)) / 31.0;
vec3 sh3_3 = vec3(ivec3(
int(packed.y << 4u) >> 26,
int((packed.y >> 2u) | (packed.z << 30u)) >> 26,
int(packed.z << 24u) >> 26
)) / 31.0;
vec3 sh3_4 = vec3(ivec3(
int(packed.z << 18u) >> 26,
int(packed.z << 12u) >> 26,
int(packed.z << 6u) >> 26
)) / 31.0;
vec3 sh3_5 = vec3(ivec3(
int(packed.z) >> 26,
int(packed.w << 26u) >> 26,
int(packed.w << 20u) >> 26
)) / 31.0;
vec3 sh3_6 = vec3(ivec3(
int(packed.w << 14u) >> 26,
int(packed.w << 8u) >> 26,
int(packed.w << 2u) >> 26
)) / 31.0;
float xx = viewDir.x * viewDir.x;
float yy = viewDir.y * viewDir.y;
float zz = viewDir.z * viewDir.z;
float xy = viewDir.x * viewDir.y;
float yz = viewDir.y * viewDir.z;
float zx = viewDir.z * viewDir.x;
return sh3_0 * (-0.5900436 * viewDir.y * (3.0 * xx - yy))
+ sh3_1 * (2.8906114 * xy * viewDir.z) +
+ sh3_2 * (-0.4570458 * viewDir.y * (4.0 * zz - xx - yy))
+ sh3_3 * (0.3731763 * viewDir.z * (2.0 * zz - 3.0 * xx - 3.0 * yy))
+ sh3_4 * (-0.4570458 * viewDir.x * (4.0 * zz - xx - yy))
+ sh3_5 * (1.4453057 * viewDir.z * (xx - yy))
+ sh3_6 * (-0.5900436 * viewDir.x * (xx - 3.0 * yy));
}
`);
function XQ(t, A, e) {
return Vt({
inTypes: { gsplat: X, sh1: "usampler2DArray", viewDir: "vec3" },
outTypes: { rgb: "vec3" },
inputs: { gsplat: t, sh1: A, viewDir: e },
globals: () => [NA, WQ],
statements: ({ inputs: s, outputs: i }) => UA(`
if (isGsplatActive(${s.gsplat}.flags)) {
${i.rgb} = evaluateSH1(${s.gsplat}, ${s.sh1}, ${s.viewDir});
} else {
${i.rgb} = vec3(0.0);
}
`)
}).outputs.rgb;
}
function $Q(t, A, e) {
return Vt({
inTypes: { gsplat: X, sh2: "usampler2DArray", viewDir: "vec3" },
outTypes: { rgb: "vec3" },
inputs: { gsplat: t, sh2: A, viewDir: e },
globals: () => [NA, jQ],
statements: ({ inputs: s, outputs: i }) => UA(`
if (isGsplatActive(${s.gsplat}.flags)) {
${i.rgb} = evaluateSH2(${s.gsplat}, ${s.sh2}, ${s.viewDir});
} else {
${i.rgb} = vec3(0.0);
}
`)
}).outputs.rgb;
}
function AC(t, A, e) {
return Vt({
inTypes: { gsplat: X, sh3: "usampler2DArray", viewDir: "vec3" },
outTypes: { rgb: "vec3" },
inputs: { gsplat: t, sh3: A, viewDir: e },
globals: () => [NA, PQ],
statements: ({ inputs: s, outputs: i }) => UA(`
if (isGsplatActive(${s.gsplat}.flags)) {
${i.rgb} = evaluateSH3(${s.gsplat}, ${s.sh3}, ${s.viewDir});
} else {
${i.rgb} = vec3(0.0);
}
`)
}).outputs.rgb;
}
const ft = class ft {
// Create a PlyReader from a Uint8Array/ArrayBuffer, no parsing done yet
constructor({ fileBytes: A }) {
this.header = "", this.littleEndian = !0, this.elements = {}, this.comments = [], this.data = null, this.numSplats = 0, this.fileBytes = A instanceof ArrayBuffer ? new Uint8Array(A) : A;
}
// Identify and parse the PLY text header (assumed to be <64KB in size).
// this.elements will contain all the elements in the file, typically
// "vertex" contains the Gsplat data.
async parseHeader() {
const e = new ReadableStream({
start: (r) => {
r.enqueue(this.fileBytes.slice(0, 65536)), r.close();
}
}).pipeThrough(new TextDecoderStream()).getReader();
this.header = "";
const s = `end_header
`;
for (; ; ) {
const { value: r, done: a } = await e.read();
if (a)
throw new Error("Failed to read header");
this.header += r;
const g = this.header.indexOf(s);
if (g >= 0) {
this.header = this.header.slice(0, g + s.length);
break;
}
}
const i = new TextEncoder().encode(this.header).length;
this.data = new DataView(this.fileBytes.buffer, i), this.elements = {};
let n = null;
this.comments = [], this.header.trim().split(`
`).forEach((r, a) => {
const g = r.trim();
if (a === 0) {
if (g !== "ply")
throw new Error("Invalid PLY header");
return;
}
if (g.length === 0)
return;
const I = g.split(" ");
switch (I[0]) {
case "format":
if (I[1] === "binary_little_endian")
this.littleEndian = !0;
else if (I[1] === "binary_big_endian")
this.littleEndian = !1;
else
throw new Error(`Unsupported PLY format: ${I[1]}`);
if (I[2] !== "1.0")
throw new Error(`Unsupported PLY version: ${I[2]}`);
break;
case "end_header":
break;
case "comment":
this.comments.push(g.slice(8));
break;
case "element": {
const B = I[1];
n = {
name: B,
count: Number.parseInt(I[2]),
properties: {}
}, this.elements[B] = n;
break;
}
case "property":
if (n == null)
throw new Error("Property must be inside an element");
I[1] === "list" ? n.properties[I[4]] = {
isList: !0,
type: I[3],
countType: I[2]
} : n.properties[I[2]] = {
isList: !1,
type: I[1]
};
break;
}
}), this.elements.vertex && (this.numSplats = this.elements.vertex.count);
}
parseData(A) {
let e = 0;
const s = this.data;
if (s == null)
throw new Error("No data to parse");
for (const i in this.elements) {
const n = this.elements[i], { count: r, properties: a } = n, g = {}, I = [];
for (const [o, C] of Object.entries(a))
C.isList ? (g[o] = [], I.push(() => {
const E = g[o];
E.length = $t[C.countType](
s,
e,
this.littleEndian
), e += wt[C.countType];
for (let l = 0; l < E.length; l++)
E[l] = $t[C.type](
s,
e,
this.littleEndian
), e += wt[C.type];
})) : (g[o] = 0, I.push(() => {
g[o] = $t[C.type](
s,
e,
this.littleEndian
), e += wt[C.type];
}));
const B = A(n) ?? (() => {
});
for (let o = 0; o < r; o++) {
for (const C of I)
C();
B(o, g);
}
}
}
// Parse all the Gsplat data in the PLY file in go, invoking the given
// callbacks for each Gsplat.
parseSplats(A, e) {
if (this.elements.vertex == null)
throw new Error("No vertex element found");
let s = !1;
const i = [];
let n = 0, r = [], a = [], g = [], I, B, o;
function C() {
const u = eC[n];
r = new Array(3).fill(null).flatMap(
(d, w) => [0, 1, 2].map((y, f) => `f_rest_${w + f * u / 3}`)
), a = new Array(5).fill(null).flatMap(
(d, w) => [0, 1, 2].map((y, f) => `f_rest_${3 + w + f * u / 3}`)
), g = new Array(7).fill(null).flatMap(
(d, w) => [0, 1, 2].map((y, f) => `f_rest_${8 + w + f * u / 3}`)
), I = n >= 1 ? new Float32Array(3 * 3) : void 0, B = n >= 2 ? new Float32Array(5 * 3) : void 0, o = n >= 3 ? new Float32Array(7 * 3) : void 0;
}
function E(u, d) {
if (!I)
throw new Error("Missing sh1");
for (const [w, y] of r.entries())
I[w] = d[y] * 8 / 255 - 4;
if (B)
for (const [w, y] of a.entries())
B[w] = d[y] * 8 / 255 - 4;
if (o)
for (const [w, y] of g.entries())
o[w] = d[y] * 8 / 255 - 4;
e == null || e(u, I, B, o);
}
function l(u) {
const {
min_x: d,
min_y: w,
min_z: y,
max_x: f,
max_y: M,
max_z: x,
min_scale_x: D,
min_scale_y: p,
min_scale_z: G,
max_scale_x: S,
max_scale_y: m,
max_scale_z: v
} = u.properties;
if (!d || !w || !y || !f || !M || !x || !D || !p || !G || !S || !m || !v)
throw new Error("Missing PLY chunk properties");
return s = !0, (F, k) => {
const {
min_x: U,
min_y: L,
min_z: AA,
max_x: z,
max_y: sA,
max_z: tA,
min_scale_x: O,
min_scale_y: T,
min_scale_z: W,
max_scale_x: Z,
max_scale_y: j,
max_scale_z: b,
min_r: dA,
min_g: oA,
min_b: wA,
max_r: pA,
max_g: xA,
max_b: cA
} = k;
i.push({
min_x: U,
min_y: L,
min_z: AA,
max_x: z,
max_y: sA,
max_z: tA,
min_scale_x: O,
min_scale_y: T,
min_scale_z: W,
max_scale_x: Z,
max_scale_y: j,
max_scale_z: b,
min_r: dA,
min_g: oA,
min_b: wA,
max_r: pA,
max_g: xA,
max_b: cA
});
};
}
function c(u) {
if (e && u.name === "sh")
return n = as(u.properties), C(), E;
if (u.name !== "vertex")
return null;
const { packed_position: d, packed_rotation: w, packed_scale: y, packed_color: f } = u.properties;
if (!d || !w || !y || !f)
throw new Error(
"Missing PLY properties: packed_position, packed_rotation, packed_scale, packed_color"
);
const M = Math.sqrt(2);
return (x, D) => {
const p = i[x >>> 8];
if (p == null)
throw new Error("Missing PLY chunk");
const {
min_x: G,
min_y: S,
min_z: m,
max_x: v,
max_y: F,
max_z: k,
min_scale_x: U,
min_scale_y: L,
min_scale_z: AA,
max_scale_x: z,
max_scale_y: sA,
max_scale_z: tA,
min_r: O,
min_g: T,
min_b: W,
max_r: Z,
max_g: j,
max_b: b
} = p, { packed_position: dA, packed_rotation: oA, packed_scale: wA, packed_color: pA } = D, xA = (dA >>> 21 & 2047) / 2047 * (v - G) + G, cA = (dA >>> 11 & 1023) / 1023 * (F - S) + S, vA = (dA & 2047) / 2047 * (k - m) + m, MA = ((oA >>> 20 & 1023) / 1023 - 0.5) * M, jA = ((oA >>> 10 & 1023) / 1023 - 0.5) * M, PA = ((oA & 1023) / 1023 - 0.5) * M, Y = Math.sqrt(Math.max(0, 1 - MA * MA - jA * jA - PA * PA)), uA = oA >>> 30, _A = uA === 0 ? MA : uA === 1 ? Y : jA, Rt = uA <= 1 ? jA : uA === 2 ? Y : PA, jt = uA <= 2 ? PA : Y, SA = uA === 0 ? Y : MA, J = Math.exp(
(wA >>> 21 & 2047) / 2047 * (z - U) + U
), VA = Math.exp(
(wA >>> 11 & 1023) / 1023 * (sA - L) + L
), ue = Math.exp(
(wA & 2047) / 2047 * (tA - AA) + AA
), de = (pA >>> 24 & 255) / 255 * ((Z ?? 1) - (O ?? 0)) + (O ?? 0), we = (pA >>> 16 & 255) / 255 * ((j ?? 1) - (T ?? 0)) + (T ?? 0), pe = (pA >>> 8 & 255) / 255 * ((b ?? 1) - (W ?? 0)) + (W ?? 0), ye = (pA & 255) / 255;
A(
x,
xA,
cA,
vA,
J,
VA,
ue,
_A,
Rt,
jt,
SA,
ye,
de,
we,
pe
);
};
}
const h = (u) => {
if (u.name === "chunk")
return l(u);
if (s)
return c(u);
if (u.name !== "vertex")
return null;
const {
x: d,
y: w,
z: y,
scale_0: f,
scale_1: M,
scale_2: x,
rot_0: D,
rot_1: p,
rot_2: G,
rot_3: S,
opacity: m,
f_dc_0: v,
f_dc_1: F,
f_dc_2: k,
red: U,
green: L,
blue: AA,
alpha: z
} = u.properties;
if (!d || !w || !y)
throw new Error("Missing PLY properties: x, y, z");
const sA = f && M && x, tA = D && p && G && S, O = z != null ? Ae[z.type] : 1, T = U != null ? Ae[U.type] : 1, W = L != null ? Ae[L.type] : 1, Z = AA != null ? Ae[AA.type] : 1;
return n = as(u.properties), C(), (j, b) => {
const dA = sA ? Math.exp(b.scale_0) : ft.defaultPointScale, oA = sA ? Math.exp(b.scale_1) : ft.defaultPointScale, wA = sA ? Math.exp(b.scale_2) : ft.defaultPointScale, pA = tA ? b.rot_1 : 0, xA = tA ? b.rot_2 : 0, cA = tA ? b.rot_3 : 0, vA = tA ? b.rot_0 : 1, MA = m != null ? 1 / (1 + Math.exp(-b.opacity)) : z != null ? b.alpha / O : 1, jA = v != null ? b.f_dc_0 * Xt + 0.5 : U != null ? b.red / T : 1, PA = F != null ? b.f_dc_1 * Xt + 0.5 : L != null ? b.green / W : 1, Y = k != null ? b.f_dc_2 * Xt + 0.5 : AA != null ? b.blue / Z : 1;
if (A(
j,
b.x,
b.y,
b.z,
dA,
oA,
wA,
pA,
xA,
cA,
vA,
MA,
jA,
PA,
Y
), e && I) {
if (I)
for (const [uA, _A] of r.entries())
I[uA] = b[_A];
if (B)
for (const [uA, _A] of a.entries())
B[uA] = b[_A];
if (o)
for (const [uA, _A] of g.entries())
o[uA] = b[_A];
e(j, I, B, o);
}
};
};
this.parseData(h);
}
// Inject RGBA values into original PLY file, which can be used to modify
// the color/opacity of the Gsplats and write out the modified PLY file.
injectRgba(A) {
let e = 0;
const s = this.data;
if (s == null)
throw new Error("No parsed data");
if (A.length !== this.numSplats * 4)
throw new Error("Invalid RGBA array length");
for (const i in this.elements) {
const n = this.elements[i], { count: r, properties: a } = n, g = [];
let I = 0;
const B = i === "vertex";
if (B) {
for (const o of ["opacity", "f_dc_0", "f_dc_1", "f_dc_2"])
if (!a[o] || a[o].type !== "float")
throw new Error(`Can't injectRgba due to property: ${o}`);
}
for (const [o, C] of Object.entries(a))
if (C.isList)
g.push(() => {
const E = $t[C.countType](
s,
e,
this.littleEndian
);
e += wt[C.countType], e += E * wt[C.type];
});
else {
if (B)
if (o === "f_dc_0" || o === "f_dc_1" || o === "f_dc_2") {
const E = Number.parseInt(
o.slice(5)
);
g.push(() => {
const l = (A[I + E] / 255 - 0.5) / Xt;
rs[C.type](
s,
e,
this.littleEndian,
l
);
});
} else o === "opacity" && g.push(() => {
const E = Math.max(
-100,
Math.min(
100,
-Math.log(1 / (A[I + 3] / 255) - 1)
)
);
rs[C.type](
s,
e,
this.littleEndian,
E
);
});
g.push(() => {
e += wt[C.type];
});
}
for (let o = 0; o < r; o++) {
for (const C of g)
C();
B && (I += 4);
}
}
}
};
ft.defaultPointScale = 1e-3;
let Ie = ft;
const Xt = 0.28209479177387814, $t = {
char: (t, A, e) => t.getInt8(A),
uchar: (t, A, e) => t.getUint8(A),
short: (t, A, e) => t.getInt16(A, e),
ushort: (t, A, e) => t.getUint16(A, e),
int: (t, A, e) => t.getInt32(A, e),
uint: (t, A, e) => t.getUint32(A, e),
float: (t, A, e) => t.getFloat32(A, e),
double: (t, A, e) => t.getFloat64(A, e)
}, rs = {
char: (t, A, e, s) => {
t.setInt8(A, s);
},
uchar: (t, A, e, s) => {
t.setUint8(A, s);
},
short: (t, A, e, s) => {
t.setInt16(A, s, e);
},
ushort: (t, A, e, s) => {
t.setUint16(A, s, e);
},
int: (t, A, e, s) => {
t.setInt32(A, s, e);
},
uint: (t, A, e, s) => {
t.setUint32(A, s, e);
},
float: (t, A, e, s) => {
t.setFloat32(A, s, e);
},
double: (t, A, e, s) => {
t.setFloat64(A, s, e);
}
}, wt = {
char: 1,
uchar: 1,
short: 2,
ushort: 2,
int: 4,
uint: 4,
float: 4,
double: 8
}, Ae = {
char: 127,
uchar: 255,
short: 32767,
ushort: 65535,
int: 2147483647,
uint: 4294967295,
float: 1,
double: 1
}, tC = {
0: 0,
9: 1,
24: 2,
45: 3
}, eC = {
0: 0,
1: 9,
2: 24,
3: 45
};
function as(t) {
let A = 0;
for (; t[`f_rest_${A}`]; )
A += 1;
const e = tC[A];
if (e == null)
throw new Error(`Unsupported number of SH coefficients: ${A}`);
return e;
}
const Ra = '(function(){"use strict";let XA;const mi=typeof TextDecoder<"u"?new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}):{decode:()=>{throw Error("TextDecoder not available")}};typeof TextDecoder<"u"&&mi.decode();let Be=null;function lr(){return(Be===null||Be.byteLength===0)&&(Be=new Uint8Array(XA.memory.buffer)),Be}function ur(n,A){return n=n>>>0,mi.decode(lr().subarray(n,n+A))}function dr(n,A,t){return XA.sort_splats(n,A,t)>>>0}function fr(n,A,t,e,s,i,r,a,g,o,I){return XA.raycast_splats(n,A,t,e,s,i,r,a,g,o,I)}async function yr(n,A){if(typeof Response=="function"&&n instanceof Response){if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(n,A)}catch(e){if(n.headers.get("Content-Type")!="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n",e);else throw e}const t=await n.arrayBuffer();return await WebAssembly.instantiate(t,A)}else{const t=await WebAssembly.instantiate(n,A);return t instanceof WebAssembly.Instance?{instance:t,module:n}:t}}function wr(){const n={};return n.wbg={},n.wbg.__wbg_buffer_609cc3eee51ed158=function(A){return A.buffer},n.wbg.__wbg_length_3b4f022188ae8db6=function(A){return A.length},n.wbg.__wbg_length_6ca527665d89694d=function(A){return A.length},n.wbg.__wbg_length_8cfd2c6409af88ad=function(A){return A.length},n.wbg.__wbg_new_9fee97a409b32b68=function(A){return new Uint16Array(A)},n.wbg.__wbg_new_e3b321dcfef89fc7=function(A){return new Uint32Array(A)},n.wbg.__wbg_newwithbyteoffsetandlength_e6b7e69acd4c7354=function(A,t,e){return new Float32Array(A,t>>>0,e>>>0)},n.wbg.__wbg_newwithbyteoffsetandlength_f1dead44d1fc7212=function(A,t,e){return new Uint32Array(A,t>>>0,e>>>0)},n.wbg.__wbg_newwithlength_5a5efe313cfd59f1=function(A){return new Float32Array(A>>>0)},n.wbg.__wbg_set_10bad9bee0e9c58b=function(A,t,e){A.set(t,e>>>0)},n.wbg.__wbg_set_d23661d19148b229=function(A,t,e){A.set(t,e>>>0)},n.wbg.__wbg_set_f4f1f0daa30696fc=function(A,t,e){A.set(t,e>>>0)},n.wbg.__wbg_subarray_3aaeec89bb2544f0=function(A,t,e){return A.subarray(t>>>0,e>>>0)},n.wbg.__wbg_subarray_769e1e0f81bb259b=function(A,t,e){return A.subarray(t>>>0,e>>>0)},n.wbg.__wbindgen_init_externref_table=function(){const A=XA.__wbindgen_export_0,t=A.grow(4);A.set(0,void 0),A.set(t+0,void 0),A.set(t+1,null),A.set(t+2,!0),A.set(t+3,!1)},n.wbg.__wbindgen_memory=function(){return XA.memory},n.wbg.__wbindgen_throw=function(A,t){throw new Error(ur(A,t))},n}function pr(n,A){return XA=n.exports,ps.__wbindgen_wasm_module=A,Be=null,XA.__wbindgen_start(),XA}async function ps(n){if(XA!==void 0)return XA;typeof n<"u"&&(Object.getPrototypeOf(n)===Object.prototype?{module_or_path:n}=n:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),typeof n>"u"&&(n=new URL("data:application/wasm;base64,AGFzbQEAAAAB9wEkYAJ/fwF/YAN/f38Bf2ACf38AYAN/f38AYAF/AX9gAX8AYAV/f39/fwBgA29/fwFvYAV/f39/fwF/YAR/f39/AGABbwFvYANvb38AYAFvAX9gAAF/YAAAYAd/f39/f39/AX9gAX0BfWAGf39/f39/AGAEf39/fwF/YAF/AW9gAAFvYAd/f39/f39/AGACf34Bf2ADf35+AGACf34AYAt9fX19fX19fX9vfwFvYAZ/f39/f38Bf2AFf399f38AYAR/fX9/AGAFf39+f38AYAR/fn9/AGAFf398f38AYAR/fH9/AGADf35+AX9gA39vbwF/YAJ9fQF9AvIEEQN3YmcdX193YmdfYnVmZmVyXzYwOWNjM2VlZTUxZWQxNTgACgN3YmcaX193YmdfbmV3XzlmZWU5N2E0MDliMzJiNjgACgN3YmcaX193Ymdfc2V0X2Y0ZjFmMGRhYTMwNjk2ZmMACwN3YmcdX193YmdfbGVuZ3RoXzhjZmQyYzY0MDlhZjg4YWQADAN3YmcxX193YmdfbmV3d2l0aGJ5dGVvZmZzZXRhbmRsZW5ndGhfZjFkZWFkNDRkMWZjNzIxMgAHA3diZxpfX3diZ19uZXdfZTNiMzIxZGNmZWY4OWZjNwAKA3diZxpfX3diZ19zZXRfZDIzNjYxZDE5MTQ4YjIyOQALA3diZx1fX3diZ19sZW5ndGhfNmNhNTI3NjY1ZDg5Njk0ZAAMA3diZzFfX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9lNmI3ZTY5YWNkNGM3MzU0AAcDd2JnGl9fd2JnX3NldF8xMGJhZDliZWUwZTljNThiAAsDd2JnHV9fd2JnX2xlbmd0aF8zYjRmMDIyMTg4YWU4ZGI2AAwDd2JnH19fd2JnX3N1YmFycmF5Xzc2OWUxZTBmODFiYjI1OWIABwN3YmcfX193Ymdfc3ViYXJyYXlfM2FhZWVjODliYjI1NDRmMAAHA3diZyRfX3diZ19uZXd3aXRobGVuZ3RoXzVhNWVmZTMxM2NmZDU5ZjEAEwN3YmcQX193YmluZGdlbl90aHJvdwACA3diZxFfX3diaW5kZ2VuX21lbW9yeQAUA3diZx9fX3diaW5kZ2VuX2luaXRfZXh0ZXJucmVmX3RhYmxlAA4DvAG6AQQAAAYABAQE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QCADQQFxDQAgA0ECcUUNASABKAIAIgMgAGohACABIANrIgFB2NrAACgCAEYEQCACKAIEQQNxQQNHDQFB0NrAACAANgIAIAIgAigCBEF+cTYCBCABIABBAXI2AgQgAiAANgIADwsgASADEDkLAkACQAJAAkACQCACKAIEIgNBAnFFBEAgAkHc2sAAKAIARg0CIAJB2NrAACgCAEYNAyACIANBeHEiAhA5IAEgACACaiIAQQFyNgIEIAAgAWogADYCACABQdjawAAoAgBHDQFB0NrAACAANgIADwsgAiADQX5xNgIEIAEgAEEBcjYCBCAAIAFqIAA2AgALIABBgAJJDQIgASAAEEFBACEBQfDawABB8NrAACgCAEEBayIANgIAIAANBEG42MAAKAIAIgAEQANAIAFBAWohASAAKAIIIgANAAsLQfDawABB/x8gASABQf8fTRs2AgAPC0Hc2sAAIAE2AgBB1NrAAEHU2sAAKAIAIABqIgA2AgAgASAAQQFyNgIEQdjawAAoAgAgAUYEQEHQ2sAAQQA2AgBB2NrAAEEANgIACyAAQejawAAoAgAiA00NA0Hc2sAAKAIAIgJFDQNBACEAQdTawAAoAgAiBEEpSQ0CQbDYwAAhAQNAIAIgASgCACIFTwRAIAIgBSABKAIEakkNBAsgASgCCCEBDAALAAtB2NrAACABNgIAQdDawABB0NrAACgCACAAaiIANgIAIAEgAEEBcjYCBCAAIAFqIAA2AgAPCyAAQfgBcUHA2MAAaiECAn9ByNrAACgCACIDQQEgAEEDdnQiAHFFBEBByNrAACAAIANyNgIAIAIMAQsgAigCCAshACACIAE2AgggACABNgIMIAEgAjYCDCABIAA2AggPC0G42MAAKAIAIgEEQANAIABBAWohACABKAIIIgENAAsLQfDawABB/x8gACAAQf8fTRs2AgAgAyAETw0AQejawABBfzYCAAsL6QQBBX8CfwJAIAJBAk8EQCABKAIEIgRB//8BcUUEQCAEQRB0DAMLIARB/wdxIQUgBEGAgAJxIQMgBEGA+AFxIgZBgPgBRgRAIANBEHQhAyADQYCAgPwHciAFRQ0DGiADIAVBDXRyQYCAgP4HcgwDCyADQRB0IQMgBkUNASAGQQ10QYCAgPwAcSAFQQ10ckGAgIDAA2ogA3IMAgtBAUEBQfSEwAAQ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CCACQQxqIAEQkwEhAwsgAkEQaiQAIAMLhgIBA38jAEGAAWsiBCQAIAAoAgAhAAJ/AkAgASgCCCICQYCAgBBxRQRAIAJBgICAIHENASAAKAIAIAEQOAwCCyAAKAIAIQBBACECA0AgAiAEakH/AGogAEEPcSIDQTByIANB1wBqIANBCkkbOgAAIAJBAWshAiAAQQ9LIABBBHYhAA0ACyABQYO/wABBAiACIARqQYABakEAIAJrECEMAQsgACgCACEAQQAhAgNAIAIgBGpB/wBqIABBD3EiA0EwciADQTdqIANBCkkbOgAAIAJBAWshAiAAQQ9LIABBBHYhAA0ACyABQYO/wABBAiACIARqQYABakEAIAJrECELIARBgAFqJAALygECBH8BfiMAQSBrIgMkAAJAAkAgASABIAJqIgJLDQBBCCACIAAoAgAiAUEBdCIEIAIgBEsbIgIgAkEITRsiBK0iB0IgiFBFDQAgB6ciBUH/////B0sNACADIAEEfyADIAE2AhwgAyAAKAIENgIUQQEFQQALNgIYIANBCGpBASAFIANBFGoQXCADKAIIQQFHDQEgAygCECECIAMoAgwhBgsgBiACQaCOwAAQjAEACyADKAIMIQEgACAENgIAIAAgATYCBCADQSBqJAALiQIBAX8jAEEQayICJAAgACgCACEAAn8gAS0AC0EYcUUEQCABKAIAIAAgASgCBCgCEBEAAAwBCyACQQA2AgwgASACQQxqAn8gAEGAAU8EQCAAQYAQTwRAIABBgIAETwRAIAIgAEE/cUGAAXI6AA8gAiAAQRJ2QfABcjoADCACIABBBnZBP3FBgAFyOgAOIAIgAEEMdkE/cUGAAXI6AA1BBAwDCyACIABBP3FBgAFyOgAOIAIgAEEMdkHgAXI6AAwgAiAAQQZ2QT9xQYABcjoADUEDDAILIAIgAEE/cUGAAXI6AA0gAiAAQQZ2QcABcjoADEECDAELIAIgADoADEEBCxAmCyACQRBqJAALqgICA38BfiMAQUBqIgIkACABKAIAQYCAgIB4RgRAIAEoAgwhAyACQSRqIgRBADYCACACQoCAgIAQNwIcIAJBMGogAygCACIDQQhqKQIANwMAIAJBOGogA0EQaikCADcDACACIAMpAgA3AyggAkEcakH0mMAAIAJBKGoQKhogAkEYaiAEKAIAIgM2AgAg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AEEQayICJAAgAkEIaiABEHYgAiACKAIIIAIoAgwoAhgRAgAgAigCBCEBIAAgAigCADYCACAAIAE2AgQgAkEQaiQAC08BAn9BjdfAAC0AABogASgCBCECIAEoAgAhA0EIQQQQnwEiAUUEQEEEQQgQwQEACyABIAI2AgQgASADNgIAIABBrJ7AADYCBCAAIAE2AgALQQEBfyMAQSBrIgMkACADQQA2AhAgA0EBNgIEIANCBDcCCCADIAE2AhwgAyAANgIYIAMgA0EYajYCACADIAIQfgALPQECfyAAIAAoAgQiAyACazYCBCAAIAAoAgAgAiADS3IiBDYCAEEBIQMgBAR/IAMFIAAoAgggASACEJMBCws+AQF/IwBBEGsiAiQAIAJBCGogASABKAIAKAIEEQIAIAIoAgwhASAAIAIoAgg2AgAgACABNgIEIAJBEGokAAuuAwEDfyAAKAIAIQIgASgCCCIAQYCAgBBxRQRAIABBgICAIHFFBEAjAEEQayIAJABBAyEDIAItAAAiAiEEIAJBCk8EQCAAIAIgAkHkAG4iBEHkAGxrQf8BcUEBdCIDQYa/wABqLQAAOgAPIAAgA0GFv8AAai0AADoADkEBIQMLQQAgAiAEG0UEQCADQQFrIgMgAEENamogBEEBdEH+AXFBhr/AAGotAAA6AAALIAFBAUEAIABBDWogA2pBAyADaxAhIABBEGokAA8LIwBBgAFrIgQkACACLQAAIQBBACECA0AgAiAEakH/AGogAEEPcSIDQTByIANBN2ogA0EKSRs6AAAgAkEBayECIAAiA0EEdiEAIANBD0sNAAsgAUGDv8AAQQIgAiAEakGAAWpBACACaxAhIARBgAFqJAAPCyMAQYABayIEJAAgAi0AACEAQQAhAgNAIAIgBGpB/wBqIABBD3EiA0EwciADQdcAaiADQQpJGzoAACACQQFrIQIgACIDQQR2IQAgA0EPSw0ACyABQYO/wABBAiACIARqQYABakEAIAJrECEgBEGAAWokAAs4AAJAIAJBgIDEAEYNACAAIAIgASgCEBEAAEUNAEEBDwsgA0UEQEEADwsgACADIAQgASgCDBEBAAs8AQF/IwBBEGsiAiQAIAJB8KDAADYCDCACIAA2AgggAkEIakGkl8AAIAJBDGpBpJfAACABQbicwAAQPQALpQQBBn8jAEEQayIG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DJQgEiAOIA6UIBUgFZSSIA0gDZSSIBAgEZIgC5JDAABAQJUiCyALlJOUkyILQwAAAABdDQAgDIwgC5GTIBKVIgsgBmBFIAcgC2BFcg0AICgoAggiIyAoKAIARgRAIChB1ITAABBUCyAoKAIEICNBAnRqIAs4AgAgKCAjQQFqNgIICyAKIClBAnRqIQogJCApayIkDQALCyAnQRBqJAAgIigCFCIKQYQBTwRAIAoQVwsgJiIkICpJDQALCyAiKAIQISQgKygCAEEBags2AgAgJBANIQkQWCIIIAkmASAiIAg2AiQgIigCDCEmICIoAhAhIyMAQSBrIiUkACAlICJBJGooAgAiJCUBEAoiCjYCACAlICM2AgQCQCAKICNGBEAQlwEiKhCPASIKJQEgJiAjEAghCRBYIiYgCSYBICpBhAFPBEAgKhBXCyAKQYQBTwRAIAoQVwsgJCUBICYlAUEAEAkgJkGEAU8EQCAmEFcLICVBIGokAAwBCyAlQQA2AgggJSAlQQRqICVBCGoQewALICIoAggiCgRAICIoAgwgCkECdEEEEKkBCyAiKAIEIgpBhAFPBEAgChBXCyAiQTBqJAAgCAwCCxBuAAsgJCAsQbiJwAAQrAEACyIIJQEgCBBXC/oBAgJ/AX4jAEEQayICJAAgAkEBOwEMIAIgATYCCCACIAA2AgQjAEEQayIBJAAgAkEEaiIAKQIAIQQgASAANgIMIAEgBDcCBCMAQRBrIgAkACABQQRqIgEoAgAiAigCDCEDAkACQAJAAkAgAigCBA4CAAECCyADDQFBASECQQAhAwwCCyADDQAgAigCACICKAIEIQMgAigCACECDAELIABBgICAgHg2AgAgACABNgIMIABB2J7AACABKAIEIAEoAggiAC0ACCAALQAJEFEACyAAIAM2AgQgACACNgIAIABBvJ7AACABKAIEIAEoAggiAC0ACCAALQAJEFEACyUAIABFBEBBpJXAAEEyELYBAAsgACACIAMgBCAFIAEoAhARCAALKAAgASAAKAIALQAAQQJ0IgBB5K/AAGooAgAgAEHQr8AAaigCABCTAQsjACAARQRAQaSVwABBMhC2AQALIAAgAiADIAQgASgCEBEJAAsjACAARQRAQaSVwABBMhC2AQALIAAgAiADIAQgASgCEBEcAAsjACAARQRAQaSVwABBMhC2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OCAFQTBqIAQQfgALFAIBbwF/EA8hABBYIgEgACYBIAELEwAgAEEoNgIEIABBgIDAADYCAAsTACAAQdSBwAA2AgQgACABNgIACxMAIABBKDYCBCAAQYSGwAA2AgALIQAgAELUnP3HsryhmMUANwMIIABClLiFgpHLl7R0NwMACyAAIABC7Lz5lKyqlJNxNwMIIABC+enA7KyX2tdONwMACxAAIAAoAgQgACgCCCABEBwLEQAgACgCBCAAKAIIIAEQwwELGQACfyABQQlPBEAgASAAEDUMAQsgABARCwsiACAAQu26rbbNhdT14wA3AwggAEL4gpm9le7Gxbl/NwMACyEAIABCgLzfhaul+JsnNwMIIABCn/WWlNbu7cOhfzcDAAsRACAAKAIAIAAoAgQgARDDAQsTACAAQayewAA2AgQgACABNgIACxEAIAEgACgCACAAKAIEEJMBCxAAIAAoAgAgACgCBCABEBwLEAAgASAAKAIAIAAoAgQQJgsQACABKAIAIAEoAgQgABAqCw4AIAAlASABJQEgAhAGC18BAX8CQAJAIABBBGsoAgAiAkF4cSIDQQRBCCACQQNxIgIbIAFqTwRAIAJBACADIAFBJ2pLGw0BIAAQJAwCC0G1mcAAQS5B5JnAABB0AAtB9JnAAEEuQaSawAAQdAALCx0BAW8gACgCACUBIAEgAhAMIQMQWCIAIAMmASAAC2oBAX8jAEEwayIDJAAgAyABNgIEIAMgADYCACADQQI2AgwgA0Gk1MAANgIIIANCAjcCFCADIANBBGqtQoCAgICAA4Q3AyggAyADrUKAgICAgAOENwMgIAMgA0EgajYCECADQQhqIAIQfgALagEBfyMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQcTUwAA2AgggA0ICNwIUIAMgA0EEaq1CgICAgIADhDcDKCADIAOtQoCAgICAA4Q3AyAgAyADQSBqNgIQIANBCGogAhB+AAtqAQF/IwBBMGsiAyQAIAMgATYCBCADIAA2AgAgA0ECNgIMIANB+NTAADYCCCADQgI3AhQgAyADQQRqrUKAgICAgAOENwMoIAMgA61CgICAgIADhDcDICADIANBIGo2AhAgA0EIaiACEH4ACwsAIAAoAgAgARA4Cw4AQbW8wABBKyAAEHQAC+8CAgV/A34gACkDACEJIwBBIGsiAyQAQRQhACAJIgdC6AdaBEAgByEIA0AgA0EMaiAAaiICQQNrIAggCEKQzgCAIgdCkM4Afn2nIgRB//8DcUHkAG4iBUEBdCIGQYa/wABqLQAAOgAAIAJBBGsgBkGFv8AAai0AADoAACACQQFrIAQgBUHkAGxrQf//A3FBAXQiBEGGv8AAai0AADoAACACQQJrIARBhb/AAGotAAA6AAAgAEEEayEAIAhC/6ziBFYgByEIDQALCyAHQglWBEAgACADakELaiAHpyICIAJB//8DcUHkAG4iAkHkAGxrQf//A3FBAXQiBEGGv8AAai0AADoAACAAQQJrIgAgA0EMamogBEGFv8AAai0AADoAACACrSEHCyAJUEUgB1BxRQRAIABBAWsiACADQQxqaiAHp0EBdEEecUGGv8AAai0AADoAAAsgAUEBQQAgA0EMaiAAakEUIABrECEgA0EgaiQACw0AIABBpIrAACABECoLDQAgAEGwjsAAIAEQKgsKACAAIAEgAhAqCw4AIAFBhJDAAEEFEJMBC8IDAgZ/AX4gACgCACEAIwBB0ABrIgIkACACQSBqIAAgACgCACgCBBECACACIAJByABqrUKAgICAwASENwMoQQEhAyACQQE2AjQgAkH4kcAANgIwIAJCATcCPCACIAIpAyA3AkggAiACQShqNgI4AkAgASgCACIGIAEoAgQiByACQTBqECoNACABLQAKQYABcUUEQEEAIQMMAQsgAkEYaiAAIAAoAgAoAgQRAgAgAkEQaiACKAIYIAIoAhwoAhgRAgAgAigCECIERQRAQQAhAwwBCyACQQhqIAQgAigCFCIFKAIYEQIAIAIoAgwhASACKAIIIQAgAiAFNgIsIAIgBDYCKCACQQE2AjQgAkGEksAANgIwIAJCATcCPCACIAJBKGqtQoCAgIDABIQiCDcDSCACIAJByABqNgI4IAYgByACQTBqELMBDQADQCAARQRAQQAhAwwCCyACIAAgASgCGBECACACKAIEIAIoAgAgAiABNgIsIAIgADYCKCACQQE2AjQgAkGEksAANgIwIAJCATcCPCACIAg3A0ggAiACQcgAajYCOCEAIQEgBiAHIAJBMGoQswFFDQALCyACQdAAaiQAIAMLCQAgACABEA4ACykAAn8gACgCAC0AAEUEQCABQejAwABBBRAmDAELIAFB7cDAAEEEECYLCw0AIABB9JjAACABECoLygECA38BfiAAKAIAIQIjAEGAAWsiBCQAAkAgASkCCCIFpyIAQYCAgARxRQ0AIABBgICAwABxBEAgAEGAgIAIciEADAELIAFBCjsBDCAAQYCAgMgAciEACyABIABBgICABHI2AghBACEAA0AgACAEakH/AGogAkEPcSIDQTByIANB1wBqIANBCkkbOgAAIABBAWshACACQQ9LIAJBBHYhAg0ACyABQYO/wABBAiAAIARqQYABakEAIABrECEgASAFNwIIIARBgAFqJAALDAAgACABKQIANwMACw0AIAFB8aDAAEECECYLDQAgAEGEpMAAIAEQKgsOACABQa+jwABBBRCTAQsOACABQbyvwABBEhCTAQsNACAAQdCxwAAgARAqCw4AIAFByLHAAEEFEJMBCxkAIAAgAUGc18AAKAIAIgBBOiAAGxECAAALDQAgAEHYvsAAIAEQKgsKACACIAAgARAmCwkAIABBADYCAAvTNwIdfwF+IwBB8ABrIgUkACAFQSBqIAAgACgCACgCBBECACAFIAUoAiQiAjYCLCAFIAUoAiAiBDYCKAJAAkACQAJAIAEiDi0ACkGAAXFFBEBBASERIAVBATYCXCAFQfiRwAA2AlggBUIBNwJkIAUgBUEoaq1CgICAgMAEhDcDOCAFIAVBOGo2AmAgASgCACABKAIEIAVB2ABqECoNBCAFQRhqIAUoAiggBSgCLCgCGBECACAFKAIYIgIEQCAFKAIcIQEgDigCAEGMksAAQQwgDigCBCgCDBEBAA0FIAVBEGogAiABKAIYEQIAIAVBMGqtQoCAgIDABIQhHyAFKAIQQQBHIQNBACERA0AgBUEIaiACIAEoAhgRAgAgBSgCDCAFKAIIIQggBSABNgI0IAUgAjYCMCAFQQA2AmggBUEBNgJcIAVBnJLAADYCWCAFQgQ3AmAgDigCACAOKAIEIAVB2ABqIgEQswENBCAFQQA6AEQgBSARNgI8IAUgAzYCOCAFIA42AkAgBUEBNgJcIAVB+JHAADYCWCAFQgE3AmQgBSAfNwNIIAUgBUHIAGo2AmAgBUE4akHckMAAIAEQKg0EIBFBAWohESEBIAgiAg0ACwsCQCAAKAIEIgJBA0cEQCAAQQRqIQAMAQsgACAAKAIAKAIYEQQAIgBFDQIgACgCACECC0EAIREgAkECRw0EIAVBADYCQCAFQoCAgIAQNwI4IAVByI7AADYCXCAFQqCAgIAONwJgIAUgBUE4ajYCWCAFQdgAaiECIwBBoAFrIgMkAAJ/AkACQAJAAkACQAJ/AkACQAJAAkAgACgCAEEBaw4CAAECCyACQaWbwABBEhCTAQwJCyAALQAUQQNHBEAgAyAAQQRqNgI4IANBOGohBCMAQSBrIgEkAAJAAkACQAJAAkACQAJAIABBFGoiCC0AAEEBaw4DBAEDAAsgCEECOgAAIAQoAgAgBEEANgIABEBBmdfAAC0AACEEQZnXwABBAToAACABIAQ6AAcgBEEBRw0CIAFCADcCFCABQoGAgIDAADcCDCABQYScwAA2AgggAUEHaiABQQhqEHkAC0HsnMAAEK8BAAsgAUEANgIYIAFBATYCDCABQeigwAA2AggMAwtBmdfAAEEAOgAAIAhBAzoAAAsgAUEgaiQADAILIAFBADYCGCABQQE2AgwgAUGooMAANgIICyABQgQ3AhAgAUEIakGgncAAEH4ACwsgACgCDCEBIAIoAghBgICABHEiCEUNASAAKAIIDAILIAJBkJvAAEEVEJMBDAcLIAEgACgCECIESQ0BIAEgBGshASAAKAIIIARBDGxqCyESIANBgICAgHg2AgwgA0GIm8AAKQMANwIQIAMgCEEXdiIAOgAYIAMgADoALCADQQA2AiggAyACNgIcIANByJvAADYCJCADIANBDGo2AiAgAUUNAiASIAFBDGxqIRggA0E8aiEUIANBhAFqIRUDQAJAIBIoAggiAEUEQCADQQA2AmQgAyADQRxqNgJgIANBAzYCOCADQQI2AoABIANB4ABqIANBOGogA0GAAWpBACADQQAgAxAaIAMoAmAiASABKAIMQQFqNgIMRQ0BDAcLIABBLGwhGSASKAIEIRpBACEWA0AgA0EANgI0IAMgA0EcajYCMAJAIBYgGmoiD0EgaigCAEGAgICAeEcEQCADQYABaiITIA9BJGooAgAiGyAPQShqKAIAIhwQI0ECIQACQCADKAKAAQ0AIAMoAoQBIQkgAygCiAEhASMAQSBrIgskAEEAIQojAEHgAGsiBiQAIAZBEGogCSABQfStwABBBhAUAkAgBigCEEUEQANAIAZB1ABqIAZBEGoQGSAGKAJUIgBBAUYNAAsC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AAAANQAAABUAAACkARAAHQAAACYAAAAUAAAAc3BhcmstaW50ZXJuYWwtcnMvc3JjL3JheWNhc3QucnM0AhAAIAAAADUAAAAXAAAANAIQACAAAACCAAAAFwAAADQCEAAgAAAAiAAAABwAAAA0AhAAIAAAAIoAAAAcAAAANAIQACAAAACPAAAAIAAAAC9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvc3RkL3NyYy90aHJlYWQvbG9jYWwucnMApAIQAE8AAAAUAgAAJgAAAGRlc2NyaXB0aW9uKCkgaXMgZGVwcmVjYXRlZDsgdXNlIERpc3BsYXkaAAAADAAAAAQAAAACAAAAGgAAAAwAAAAEAAAAAwAAAAIAAAAsAxAABwAAAAUAAAAbAAAABwAAABwAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBpbnZhbGlkIE9uY2Ugc3RhdGVoAxAAPAAAAC9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvc3RkL3NyYy9zeXMvc3luYy9vbmNlL25vX3RocmVhZHMucnMArAMQAFsAAAA1AAAAEgAAAC9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvYWxsb2Mvc3JjL3NsaWNlLnJzAAAYBBAASgAAAL4BAAAdAAAAc3BhcmstaW50ZXJuYWwtcnMvc3JjL2xpYi5yc3QEEAAcAAAAHAAAADMAAAB0BBAAHAAAACcAAAAtAAAAAQAAAAAAAAB0BBAAHAAAAD8AAAAoAAAAL3J1c3RjLzE3MDY3ZTlhYzZkN2VjYjcwZTUwZjkyYzE5NDRlNTQ1MTg4ZDIzNTkvbGlicmFyeS9hbGxvYy9zcmMvdmVjL21vZC5yc8gEEABMAAAAVgoAACQAAAAAAAAAEAAAAAQAAAAdAAAAHgAAAB8AAAAgICAgOiAAAAEAAAAAAAAAQAUQAAIAAAAgICAgICAgL3J1c3RjLzE3MDY3ZTlhYzZkN2VjYjcwZTUwZjkyYzE5NDRlNTQ1MTg4ZDIzNTkvbGlicmFyeS9jb3JlL3NyYy9wdHIvbW9kLnJzAABbBRAASwAAAAsCAAABAAAAL3J1c3RjLzE3MDY3ZTlhYzZkN2VjYjcwZTUwZjkyYzE5NDRlNTQ1MTg4ZDIzNTkvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9pbmRleC5ycwC4BRAATwAAAEwDAAA0AAAAuAUQAE8AAABTAwAAMgAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuaXNfY2hhcl9ib3VuZGFyeShuKS9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwAAAFIGEABLAAAA7QcAAB0AAABSBhAASwAAAPUHAAAdAAAAUgYQAEsAAAB9BQAAGwAAAC9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMvbW9kLnJz0AYQAFAAAAAuAgAAEQAAACAAAAAMAAAABAAAACEAAAAiAAAAIwAAACYAAAAMAAAABAAAACcAAAAoAAAAIwBB6I7AAAvJGQEAAAApAAAAYSBEaXNwbGF5IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yIHVuZXhwZWN0ZWRseS9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwAApwcQAEsAAADRCgAADgAAAEVycm9yAAAApwcQAEsAAAB9BQAAGwAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuaXNfY2hhcl9ib3VuZGFyeShuZXdfbGVuKacHEABLAAAAsgUAAA0AAAAAAAAAEAAAAAQAAAAdAAAAHgAAAB8AAABiYWNrdHJhY2UgY2FwdHVyZSBmYWlsZWQvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9hbnlob3ctMS4wLjk4L3NyYy9lcnJvci5yc4wIEABcAAAAZwQAAA4AAAABAAAAAAAAADogAAAACRAAAgAAAAoKQ2F1c2VkIGJ5OgoAAAAYCRAAAQAAAAoKc3RhY2sgYmFja3RyYWNlOlN0YWNrIGJhY2t0cmFjZToKADYJEAARAAAAUy9ydXN0Yy8xNzA2N2U5YWM2ZDdlY2I3MGU1MGY5MmMxOTQ0ZTU0NTE4OGQyMzU5L2xpYnJhcnkvY29yZS9zcmMvaXRlci90cmFpdHMvaXRlcmF0b3IucnMAAABRCRAAWAAAAMEHAAAJAAAAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvanMtc3lzLTAuMy43Ny9zcmMvbGliLnJzAAC8CRAAWgAAAPsYAAABAAAAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLTAuMi4xMDAvc3JjL2NvbnZlcnQvc2xpY2VzLnJzKAoQAGwAAAAkAQAADgAAAGNsb3N1cmUgaW52b2tlZCByZWN1cnNpdmVseSBvciBhZnRlciBiZWluZyBkcm9wcGVkTGF6eSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVk1goQACoAAAAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9vbmNlX2NlbGwtMS4yMS4zL3NyYy9saWIucnMAAAAICxAAXQAAAAgDAAAZAAAAcmVlbnRyYW50IGluaXQAAHgLEAAOAAAACAsQAF0AAAB6AgAADQAAADogAAAAAAAABAAAAAQAAAA7AAAAL3J1c3RjLzE3MDY3ZTlhYzZkN2VjYjcwZTUwZjkyYzE5NDRlNTQ1MTg4ZDIzNTkvbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzALQLEABLAAAAfQUAABsAAAAvcnVzdGMvMTcwNjdlOWFjNmQ3ZWNiNzBlNTBmOTJjMTk0NGU1NDUxODhkMjM1OS9saWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjL21vZC5ycxAMEABQAAAALgIAABEAAAA6AAAAPAAAAAwAAAAEAAAAPQAAAD4AAAA/AAAAL3J1c3QvZGVwcy9kbG1hbGxvYy0wLjIuNy9zcmMvZGxtYWxsb2MucnNhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA+PSBzaXplICsgbWluX292ZXJoZWFkAIwMEAApAAAAqAQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAACMDBAAKQAAAK4EAAANAAAAbGlicmFyeS9zdGQvc3JjL2JhY2t0cmFjZS5yc29wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm1QDRAAKAAAACQAAAAAAAAAAgAAAHgNEAB1bnN1cHBvcnRlZCBiYWNrdHJhY2VkaXNhYmxlZCBiYWNrdHJhY2UANA0QABwAAACKAQAAHQAAAEAAAAAQAAAABAAAAEEAAABCAAAAAQAAAAAAAABjYW5ub3QgcmVjdXJzaXZlbHkgYWNxdWlyZSBtdXRleOQNEAAgAAAAbGlicmFyeS9zdGQvc3JjL3N5cy9zeW5jL211dGV4L25vX3RocmVhZHMucnMMDhAALAAAABMAAAAJAAAAbGlicmFyeS9zdGQvc3JjL3N5bmMvcG9pc29uL29uY2UucnMASA4QACMAAACbAAAAMgAAAGxpYnJhcnkvc3RkL3NyYy9zeW5jL2xhenlfbG9jay5ycwAAAHwOEAAhAAAA0QAAABMAAAA8dW5rbm93bj7vv71tZW1vcnkgYWxsb2NhdGlvbiBvZiAgYnl0ZXMgZmFpbGVkAAC8DhAAFQAAANEOEAANAAAAbGlicmFyeS9zdGQvc3JjL2FsbG9jLnJz8A4QABgAAABkAQAACQAAAAoAAAA8AAAADAAAAAQAAABDAAAAAAAAAAgAAAAEAAAARAAAAAAAAAAIAAAABAAAAEUAAABGAAAARwAAAEgAAABJAAAAEAAAAAQAAABKAAAASwAAAEwAAABNAAAAbGlicmFyeS9zdGQvc3JjLy4uLy4uL2JhY2t0cmFjZS9zcmMvc3ltYm9saXplL21vZC5yc3QPEAA0AAAAZwEAADAAAAABAAAAAAAAAKALEAACAAAAIC0gAAEAAAAAAAAAyA8QAAMAAAAgICAgICAgICAgICAgICAgICAgYXQgAABwDBAAAQAAAE9uY2UgaW5zdGFuY2UgaGFzIHByZXZpb3VzbHkgYmVlbiBwb2lzb25lZAAA/A8Q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",self.location.href));const A=wr();(typeof n=="string"||typeof Request=="function"&&n instanceof Request||typeof URL=="function"&&n instanceof URL)&&(n=fetch(n));const{instance:t,module:e}=await yr(await n,A);return pr(t,e)}var xi={},Dr=function(n,A,t,e,s){var i=new Worker(xi[A]||(xi[A]=URL.createObjectURL(new Blob([n+\';addEventListener("error",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})\'],{type:"text/javascript"}))));return i.onmessage=function(r){var a=r.data,g=a.$e$;if(g){var o=new Error(g[0]);o.code=g[1],o.stack=g[2],s(o,null)}else s(null,a)},i.postMessage(t,e),i},eA=Uint8Array,xt=Uint16Array,Mi=Int32Array,Ds=new eA([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),ms=new eA([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Si=new eA([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Fi=function(n,A){for(var t=new xt(31),e=0;e<31;++e)t[e]=A+=1<<n[e-1];for(var s=new Mi(t[30]),e=1;e<30;++e)for(var i=t[e];i<t[e+1];++i)s[i]=i-t[e]<<5|e;return{b:t,r:s}},Ni=Fi(Ds,2),xs=Ni.b,mr=Ni.r;xs[28]=258,mr[258]=28;for(var xr=Fi(ms,0),ki=xr.b,ke=new xt(32768),X=0;X<32768;++X){var ht=(X&43690)>>1|(X&21845)<<1;ht=(ht&52428)>>2|(ht&13107)<<2,ht=(ht&61680)>>4|(ht&3855)<<4,ke[X]=((ht&65280)>>8|(ht&255)<<8)>>1}for(var Lt=function(n,A,t){for(var e=n.length,s=0,i=new xt(A);s<e;++s)n[s]&&++i[n[s]-1];var r=new xt(A);for(s=1;s<A;++s)r[s]=r[s-1]+i[s-1]<<1;var a;if(t){a=new xt(1<<A);var g=15-A;for(s=0;s<e;++s)if(n[s])for(var o=s<<4|n[s],I=A-n[s],B=r[n[s]-1]++<<I,Q=B|(1<<I)-1;B<=Q;++B)a[ke[B]>>g]=o}else for(a=new xt(e),s=0;s<e;++s)n[s]&&(a[s]=ke[r[n[s]-1]++]>>15-n[s]);return a},Qe=new eA(288),X=0;X<144;++X)Qe[X]=8;for(var X=144;X<256;++X)Qe[X]=9;for(var X=256;X<280;++X)Qe[X]=7;for(var X=280;X<288;++X)Qe[X]=8;for(var Ri=new eA(32),X=0;X<32;++X)Ri[X]=5;var Ui=Lt(Qe,9,1),Gi=Lt(Ri,5,1),Re=function(n){for(var A=n[0],t=1;t<n.length;++t)n[t]>A&&(A=n[t]);return A},bA=function(n,A,t){var e=A/8|0;return(n[e]|n[e+1]<<8)>>(A&7)&t},Ue=function(n,A){var t=A/8|0;return(n[t]|n[t+1]<<8|n[t+2]<<16)>>(A&7)},Ms=function(n){return(n+7)/8|0},Ct=function(n,A,t){return(A==null||A<0)&&(A=0),(t==null||t>n.length)&&(t=n.length),new eA(n.subarray(A,t))},bi=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],sA=function(n,A,t){var e=new Error(A||bi[n]);if(e.code=n,Error.captureStackTrace&&Error.captureStackTrace(e,sA),!t)throw e;return e},Ss=function(n,A,t,e){var s=n.length,i=e?e.length:0;if(!s||A.f&&!A.l)return t||new eA(0);var r=!t,a=r||A.i!=2,g=A.i;r&&(t=new eA(s*3));var o=function(wA){var MA=t.length;if(wA>MA){var SA=new eA(Math.max(MA*2,wA));SA.set(t),t=SA}},I=A.f||0,B=A.p||0,Q=A.b||0,h=A.l,C=A.d,E=A.m,l=A.n,c=s*8;do{if(!h){I=bA(n,B,1);var u=bA(n,B+1,3);if(B+=3,u)if(u==1)h=Ui,C=Gi,E=9,l=5;else if(u==2){var x=bA(n,B,31)+257,D=bA(n,B+10,15)+4,w=x+bA(n,B+5,31)+1;B+=14;for(var m=new eA(w),N=new eA(19),M=0;M<D;++M)N[Si[M]]=bA(n,B+M*3,7);B+=D*3;for(var S=Re(N),F=(1<<S)-1,k=Lt(N,S,1),M=0;M<w;){var U=k[bA(n,B,F)];B+=U&15;var d=U>>4;if(d<16)m[M++]=d;else{var R=0,b=0;for(d==16?(b=3+bA(n,B,3),B+=2,R=m[M-1]):d==17?(b=3+bA(n,B,7),B+=3):d==18&&(b=11+bA(n,B,127),B+=7);b--;)m[M++]=R}}var P=m.subarray(0,x),_=m.subarray(x);E=Re(P),l=Re(_),h=Lt(P,E,1),C=Lt(_,l,1)}else sA(1);else{var d=Ms(B)+4,y=n[d-4]|n[d-3]<<8,p=d+y;if(p>s){g&&sA(0);break}a&&o(Q+y),t.set(n.subarray(d,p),Q),A.b=Q+=y,A.p=B=p*8,A.f=I;continue}if(B>c){g&&sA(0);break}}a&&o(Q+131072);for(var j=(1<<E)-1,V=(1<<l)-1,$=B;;$=B){var R=h[Ue(n,B)&j],K=R>>4;if(B+=R&15,B>c){g&&sA(0);break}if(R||sA(2),K<256)t[Q++]=K;else if(K==256){$=B,h=null;break}else{var z=K-254;if(K>264){var M=K-257,L=Ds[M];z=bA(n,B,(1<<L)-1)+xs[M],B+=L}var Z=C[Ue(n,B)&V],G=Z>>4;Z||sA(3),B+=Z&15;var _=ki[G];if(G>3){var L=ms[G];_+=Ue(n,B)&(1<<L)-1,B+=L}if(B>c){g&&sA(0);break}a&&o(Q+131072);var yA=Q+z;if(Q<_){var dA=i-_,GA=Math.min(_,yA);for(dA+Q<0&&sA(3);Q<GA;++Q)t[Q]=e[dA+Q]}for(;Q<yA;++Q)t[Q]=t[Q-_]}}A.l=h,A.p=$,A.b=Q,A.f=I,h&&(I=1,A.m=E,A.d=C,A.n=l)}while(!I);return Q!=t.length&&r?Ct(t,0,Q):t.subarray(0,Q)},Mr=new eA(0),Sr=function(n,A){var t={};for(var e in n)t[e]=n[e];for(var e in A)t[e]=A[e];return t},Li=function(n,A,t){for(var e=n(),s=n.toString(),i=s.slice(s.indexOf("[")+1,s.lastIndexOf("]")).replace(/\\s+/g,"").split(","),r=0;r<e.length;++r){var a=e[r],g=i[r];if(typeof a=="function"){A+=";"+g+"=";var o=a.toString();if(a.prototype)if(o.indexOf("[native code]")!=-1){var I=o.indexOf(" ",8)+1;A+=o.slice(I,o.indexOf("(",I))}else{A+=o;for(var B in a.prototype)A+=";"+g+".prototype."+B+"="+a.prototype[B].toString()}else A+=o}else t[g]=a}return A},Ge=[],Fr=function(n){var A=[];for(var t in n)n[t].buffer&&A.push((n[t]=new n[t].constructor(n[t])).buffer);return A},Nr=function(n,A,t,e){if(!Ge[t]){for(var s="",i={},r=n.length-1,a=0;a<r;++a)s=Li(n[a],s,i);Ge[t]={c:Li(n[r],s,i),e:i}}var g=Sr({},Ge[t].e);return Dr(Ge[t].c+";onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage="+A.toString()+"}",t,g,Fr(g),e)},kr=function(){return[eA,xt,Mi,Ds,ms,Si,xs,ki,Ui,Gi,ke,bi,Lt,Re,bA,Ue,Ms,Ct,sA,Ss,be,Yi,Ji]},Yi=function(n){return postMessage(n,[n.buffer])},Ji=function(n){return n&&{out:n.size&&new eA(n.size),dictionary:n.dictionary}},Rr=function(n,A,t,e,s,i){var r=Nr(t,e,s,function(a,g){r.terminate(),i(a,g)});return r.postMessage([n,A],A.consume?[n.buffer]:[]),function(){r.terminate()}},vA=function(n,A){return n[A]|n[A+1]<<8},CA=function(n,A){return(n[A]|n[A+1]<<8|n[A+2]<<16|n[A+3]<<24)>>>0},Fs=function(n,A){return CA(n,A)+CA(n,A+4)*4294967296},Ur=function(n){(n[0]!=31||n[1]!=139||n[2]!=8)&&sA(6,"invalid gzip data");var A=n[3],t=10;A&4&&(t+=(n[10]|n[11]<<8)+2);for(var e=(A>>3&1)+(A>>4&1);e>0;e-=!n[t++]);return t+(A&2)},Ns=function(){function n(A,t){typeof A=="function"&&(t=A,A={}),this.ondata=t;var e=A&&A.dictionary&&A.dictionary.subarray(-32768);this.s={i:0,b:e?e.length:0},this.o=new eA(32768),this.p=new eA(0),e&&this.o.set(e)}return n.prototype.e=function(A){if(this.ondata||sA(5),this.d&&sA(4),!this.p.length)this.p=A;else if(A.length){var t=new eA(this.p.length+A.length);t.set(this.p),t.set(A,this.p.length),this.p=t}},n.prototype.c=function(A){this.s.i=+(this.d=A||!1);var t=this.s.b,e=Ss(this.p,this.s,this.o);this.ondata(Ct(e,t,this.s.b),this.d),this.o=Ct(e,this.s.b-32768),this.s.b=this.o.length,this.p=Ct(this.p,this.s.p/8|0),this.s.p&=7},n.prototype.push=function(A,t){this.e(A),this.c(t)},n}();function Gr(n,A,t){return t||(t=A,A={}),typeof t!="function"&&sA(7),Rr(n,A,[kr],function(e){return Yi(be(e.data[0],Ji(e.data[1])))},1,t)}function be(n,A){return Ss(n,{i:2},A&&A.out,A&&A.dictionary)}var Ti=function(){function n(A,t){this.v=1,this.r=0,Ns.call(this,A,t)}return n.prototype.push=function(A,t){if(Ns.prototype.e.call(this,A),this.r+=A.length,this.v){var e=this.p.subarray(this.v-1),s=e.length>3?Ur(e):4;if(s>e.length){if(!t)return}else this.v>1&&this.onmember&&this.onmember(this.r-e.length);this.p=e.subarray(s),this.v=0}Ns.prototype.c.call(this,t),this.s.f&&!this.s.l&&!t&&(this.v=Ms(this.s.p)+9,this.s={i:0},this.o=new eA(0),this.push(new eA(0),t))},n}(),ks=typeof TextDecoder<"u"&&new TextDecoder,br=0;try{ks.decode(Mr,{stream:!0}),br=1}catch{}var Lr=function(n){for(var A="",t=0;;){var e=n[t++],s=(e>127)+(e>223)+(e>239);if(t+s>n.length)return{s:A,r:Ct(n,t-1)};s?s==3?(e=((e&15)<<18|(n[t++]&63)<<12|(n[t++]&63)<<6|n[t++]&63)-65536,A+=String.fromCharCode(55296|e>>10,56320|e&1023)):s&1?A+=String.fromCharCode((e&31)<<6|n[t++]&63):A+=String.fromCharCode((e&15)<<12|(n[t++]&63)<<6|n[t++]&63):A+=String.fromCharCode(e)}};function Yr(n,A){if(A){for(var t="",e=0;e<n.length;e+=16384)t+=String.fromCharCode.apply(null,n.subarray(e,e+16384));return t}else{if(ks)return ks.decode(n);var s=Lr(n),i=s.s,t=s.r;return t.length&&sA(8),i}}var vi=function(n,A){return A+30+vA(n,A+26)+vA(n,A+28)},Hi=function(n,A,t){var e=vA(n,A+28),s=Yr(n.subarray(A+46,A+46+e),!(vA(n,A+8)&2048)),i=A+46+e,r=CA(n,A+20),a=t&&r==4294967295?Jr(n,i):[r,CA(n,A+24),CA(n,A+42)],g=a[0],o=a[1],I=a[2];return[vA(n,A+10),g,o,s,i+vA(n,A+30)+vA(n,A+32),I]},Jr=function(n,A){for(;vA(n,A)!=1;A+=4+vA(n,A+2));return[Fs(n,A+12),Fs(n,A+4),Fs(n,A+20)]},zi=typeof queueMicrotask=="function"?queueMicrotask:typeof setTimeout=="function"?setTimeout:function(n){n()};function Tr(n,A,t){t||(t=A,A={}),typeof t!="function"&&sA(7);var e=[],s=function(){for(var l=0;l<e.length;++l)e[l]()},i={},r=function(l,c){zi(function(){t(l,c)})};zi(function(){r=t});for(var a=n.length-22;CA(n,a)!=101010256;--a)if(!a||n.length-a>65558)return r(sA(13,0,1),null),s;var g=vA(n,a+8);if(g){var o=g,I=CA(n,a+16),B=I==4294967295||o==65535;if(B){var Q=CA(n,a-12);B=CA(n,Q)==101075792,B&&(o=g=CA(n,Q+32),I=CA(n,Q+48))}for(var h=A&&A.filter,C=function(l){var c=Hi(n,I,B),u=c[0],d=c[1],y=c[2],p=c[3],x=c[4],D=c[5],w=vi(n,D);I=x;var m=function(M,S){M?(s(),r(M,null)):(S&&(i[p]=S),--g||r(null,i))};if(!h||h({name:p,size:d,originalSize:y,compression:u}))if(!u)m(null,Ct(n,w,w+d));else if(u==8){var N=n.subarray(w,w+d);if(y<524288||d>.8*y)try{m(null,be(N,{out:new eA(y)}))}catch(M){m(M,null)}else e.push(Gr(N,{size:y},m))}else m(sA(14,"unknown compression type "+u,1),null);else m(null,null)},E=0;E<o;++E)C(E)}else r(null,{});return s}function vr(n,A){for(var t={},e=n.length-22;CA(n,e)!=101010256;--e)(!e||n.length-e>65558)&&sA(13);var s=vA(n,e+8);if(!s)return{};var i=CA(n,e+16),r=i==4294967295||s==65535;if(r){var a=CA(n,e-12);r=CA(n,a)==101075792,r&&(s=CA(n,a+32),i=CA(n,a+48))}for(var g=A&&A.filter,o=0;o<s;++o){var I=Hi(n,i,r),B=I[0],Q=I[1],h=I[2],C=I[3],E=I[4],l=I[5],c=vi(n,l);i=E,(!g||g({name:C,size:Q,originalSize:h,compression:B}))&&(B?B==8?t[C]=be(n.subarray(c,c+Q),{out:new eA(h)}):sA(14,"unknown compression type "+B):t[C]=Ct(n,c,c+Q))}return t}/**\n * @license\n * Copyright 2010-2024 Three.js Authors\n * SPDX-License-Identifier: MIT\n */const Ki="172",Rs=0,Hr=1,qi=1,_i=100,Zi=204,Wi=205,Oi=3,zr=0,Pi=300,Vi=1e3,he=1001,Xi=1002,Et=1003,ji=1006,Kr=1008,Le=1009,Mt=1014,qr=1015,Ye=1023,_r=1031,Yt=1033,$i="",HA="srgb",An="srgb-linear",tn="linear",Us="srgb",Jt=7680,en=519,sn=35044,Zr="300 es",Ce=2e3,nn=2001;class Ee{addEventListener(A,t){this._listeners===void 0&&(this._listeners={});const e=this._listeners;e[A]===void 0&&(e[A]=[]),e[A].indexOf(t)===-1&&e[A].push(t)}hasEventListener(A,t){if(this._listeners===void 0)return!1;const e=this._listeners;return e[A]!==void 0&&e[A].indexOf(t)!==-1}removeEventListener(A,t){if(this._listeners===void 0)return;const s=this._listeners[A];if(s!==void 0){const i=s.indexOf(t);i!==-1&&s.splice(i,1)}}dispatchEvent(A){if(this._listeners===void 0)return;const e=this._listeners[A.type];if(e!==void 0){A.target=this;const s=e.slice(0);for(let i=0,r=s.length;i<r;i++)s[i].call(this,A);A.target=null}}}const EA=["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"];function ce(){const n=Math.random()*4294967295|0,A=Math.random()*4294967295|0,t=Math.random()*4294967295|0,e=Math.random()*4294967295|0;return(EA[n&255]+EA[n>>8&255]+EA[n>>16&255]+EA[n>>24&255]+"-"+EA[A&255]+EA[A>>8&255]+"-"+EA[A>>16&15|64]+EA[A>>24&255]+"-"+EA[t&63|128]+EA[t>>8&255]+"-"+EA[t>>16&255]+EA[t>>24&255]+EA[e&255]+EA[e>>8&255]+EA[e>>16&255]+EA[e>>24&255]).toLowerCase()}function v(n,A,t){return Math.max(A,Math.min(t,n))}function Wr(n,A){return(n%A+A)%A}function Gs(n,A,t){return(1-t)*n+t*A}function le(n,A){switch(A.constructor){case Float32Array:return n;case Uint32Array:return n/4294967295;case Uint16Array:return n/65535;case Uint8Array:return n/255;case Int32Array:return Math.max(n/2147483647,-1);case Int16Array:return Math.max(n/32767,-1);case Int8Array:return Math.max(n/127,-1);default:throw new Error("Invalid component type.")}}function pA(n,A){switch(A.constructor){case Float32Array:return n;case Uint32Array:return Math.round(n*4294967295);case Uint16Array:return Math.round(n*65535);case Uint8Array:return Math.round(n*255);case Int32Array:return Math.round(n*2147483647);case Int16Array:return Math.round(n*32767);case Int8Array:return Math.round(n*127);default:throw new Error("Invalid component type.")}}class DA{constructor(A=0,t=0){DA.prototype.isVector2=!0,this.x=A,this.y=t}get width(){return this.x}set width(A){this.x=A}get height(){return this.y}set height(A){this.y=A}set(A,t){return this.x=A,this.y=t,this}setScalar(A){return this.x=A,this.y=A,this}setX(A){return this.x=A,this}setY(A){return this.y=A,this}setComponent(A,t){switch(A){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("index is out of range: "+A)}return this}getComponent(A){switch(A){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+A)}}clone(){return new this.constructor(this.x,this.y)}copy(A){return this.x=A.x,this.y=A.y,this}add(A){return this.x+=A.x,this.y+=A.y,this}addScalar(A){return this.x+=A,this.y+=A,this}addVectors(A,t){return this.x=A.x+t.x,this.y=A.y+t.y,this}addScaledVector(A,t){return this.x+=A.x*t,this.y+=A.y*t,this}sub(A){return this.x-=A.x,this.y-=A.y,this}subScalar(A){return this.x-=A,this.y-=A,this}subVectors(A,t){return this.x=A.x-t.x,this.y=A.y-t.y,this}multiply(A){return this.x*=A.x,this.y*=A.y,this}multiplyScalar(A){return this.x*=A,this.y*=A,this}divide(A){return this.x/=A.x,this.y/=A.y,this}divideScalar(A){return this.multiplyScalar(1/A)}applyMatrix3(A){const t=this.x,e=this.y,s=A.elements;return this.x=s[0]*t+s[3]*e+s[6],this.y=s[1]*t+s[4]*e+s[7],this}min(A){return this.x=Math.min(this.x,A.x),this.y=Math.min(this.y,A.y),this}max(A){return this.x=Math.max(this.x,A.x),this.y=Math.max(this.y,A.y),this}clamp(A,t){return this.x=v(this.x,A.x,t.x),this.y=v(this.y,A.y,t.y),this}clampScalar(A,t){return this.x=v(this.x,A,t),this.y=v(this.y,A,t),this}clampLength(A,t){const e=this.length();return this.divideScalar(e||1).multiplyScalar(v(e,A,t))}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(A){return this.x*A.x+this.y*A.y}cross(A){return this.x*A.y-this.y*A.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(A){const t=Math.sqrt(this.lengthSq()*A.lengthSq());if(t===0)return Math.PI/2;const e=this.dot(A)/t;return Math.acos(v(e,-1,1))}distanceTo(A){return Math.sqrt(this.distanceToSquared(A))}distanceToSquared(A){const t=this.x-A.x,e=this.y-A.y;return t*t+e*e}manhattanDistanceTo(A){return Math.abs(this.x-A.x)+Math.abs(this.y-A.y)}setLength(A){return this.normalize().multiplyScalar(A)}lerp(A,t){return this.x+=(A.x-this.x)*t,this.y+=(A.y-this.y)*t,this}lerpVectors(A,t,e){return this.x=A.x+(t.x-A.x)*e,this.y=A.y+(t.y-A.y)*e,this}equals(A){return A.x===this.x&&A.y===this.y}fromArray(A,t=0){return this.x=A[t],this.y=A[t+1],this}toArray(A=[],t=0){return A[t]=this.x,A[t+1]=this.y,A}fromBufferAttribute(A,t){return this.x=A.getX(t),this.y=A.getY(t),this}rotateAround(A,t){const e=Math.cos(t),s=Math.sin(t),i=this.x-A.x,r=this.y-A.y;return this.x=i*e-r*s+A.x,this.y=i*s+r*e+A.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class jA{constructor(A,t,e,s,i,r,a,g,o){jA.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],A!==void 0&&this.set(A,t,e,s,i,r,a,g,o)}set(A,t,e,s,i,r,a,g,o){const I=this.elements;return I[0]=A,I[1]=s,I[2]=a,I[3]=t,I[4]=i,I[5]=g,I[6]=e,I[7]=r,I[8]=o,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(A){const t=this.elements,e=A.elements;return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],this}extractBasis(A,t,e){return A.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),e.setFromMatrix3Column(this,2),this}setFromMatrix4(A){const t=A.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(A){return this.multiplyMatrices(this,A)}premultiply(A){return this.multiplyMatrices(A,this)}multiplyMatrices(A,t){const e=A.elements,s=t.elements,i=this.elements,r=e[0],a=e[3],g=e[6],o=e[1],I=e[4],B=e[7],Q=e[2],h=e[5],C=e[8],E=s[0],l=s[3],c=s[6],u=s[1],d=s[4],y=s[7],p=s[2],x=s[5],D=s[8];return i[0]=r*E+a*u+g*p,i[3]=r*l+a*d+g*x,i[6]=r*c+a*y+g*D,i[1]=o*E+I*u+B*p,i[4]=o*l+I*d+B*x,i[7]=o*c+I*y+B*D,i[2]=Q*E+h*u+C*p,i[5]=Q*l+h*d+C*x,i[8]=Q*c+h*y+C*D,this}multiplyScalar(A){const t=this.elements;return t[0]*=A,t[3]*=A,t[6]*=A,t[1]*=A,t[4]*=A,t[7]*=A,t[2]*=A,t[5]*=A,t[8]*=A,this}determinant(){const A=this.elements,t=A[0],e=A[1],s=A[2],i=A[3],r=A[4],a=A[5],g=A[6],o=A[7],I=A[8];return t*r*I-t*a*o-e*i*I+e*a*g+s*i*o-s*r*g}invert(){const A=this.elements,t=A[0],e=A[1],s=A[2],i=A[3],r=A[4],a=A[5],g=A[6],o=A[7],I=A[8],B=I*r-a*o,Q=a*g-I*i,h=o*i-r*g,C=t*B+e*Q+s*h;if(C===0)return this.set(0,0,0,0,0,0,0,0,0);const E=1/C;return A[0]=B*E,A[1]=(s*o-I*e)*E,A[2]=(a*e-s*r)*E,A[3]=Q*E,A[4]=(I*t-s*g)*E,A[5]=(s*i-a*t)*E,A[6]=h*E,A[7]=(e*g-o*t)*E,A[8]=(r*t-e*i)*E,this}transpose(){let A;const t=this.elements;return A=t[1],t[1]=t[3],t[3]=A,A=t[2],t[2]=t[6],t[6]=A,A=t[5],t[5]=t[7],t[7]=A,this}getNormalMatrix(A){return this.setFromMatrix4(A).invert().transpose()}transposeIntoArray(A){const t=this.elements;return A[0]=t[0],A[1]=t[3],A[2]=t[6],A[3]=t[1],A[4]=t[4],A[5]=t[7],A[6]=t[2],A[7]=t[5],A[8]=t[8],this}setUvTransform(A,t,e,s,i,r,a){const g=Math.cos(i),o=Math.sin(i);return this.set(e*g,e*o,-e*(g*r+o*a)+r+A,-s*o,s*g,-s*(-o*r+g*a)+a+t,0,0,1),this}scale(A,t){return this.premultiply(bs.makeScale(A,t)),this}rotate(A){return this.premultiply(bs.makeRotation(-A)),this}translate(A,t){return this.premultiply(bs.makeTranslation(A,t)),this}makeTranslation(A,t){return A.isVector2?this.set(1,0,A.x,0,1,A.y,0,0,1):this.set(1,0,A,0,1,t,0,0,1),this}makeRotation(A){const t=Math.cos(A),e=Math.sin(A);return this.set(t,-e,0,e,t,0,0,0,1),this}makeScale(A,t){return this.set(A,0,0,0,t,0,0,0,1),this}equals(A){const t=this.elements,e=A.elements;for(let s=0;s<9;s++)if(t[s]!==e[s])return!1;return!0}fromArray(A,t=0){for(let e=0;e<9;e++)this.elements[e]=A[e+t];return this}toArray(A=[],t=0){const e=this.elements;return A[t]=e[0],A[t+1]=e[1],A[t+2]=e[2],A[t+3]=e[3],A[t+4]=e[4],A[t+5]=e[5],A[t+6]=e[6],A[t+7]=e[7],A[t+8]=e[8],A}clone(){return new this.constructor().fromArray(this.elements)}}const bs=new jA;function Or(n){for(let A=n.length-1;A>=0;--A)if(n[A]>=65535)return!0;return!1}function rn(n){return document.createElementNS("http://www.w3.org/1999/xhtml",n)}const an=new jA().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),gn=new jA().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function Pr(){const n={enabled:!0,workingColorSpace:An,spaces:{},convert:function(s,i,r){return this.enabled===!1||i===r||!i||!r||(this.spaces[i].transfer===Us&&(s.r=tt(s.r),s.g=tt(s.g),s.b=tt(s.b)),this.spaces[i].primaries!==this.spaces[r].primaries&&(s.applyMatrix3(this.spaces[i].toXYZ),s.applyMatrix3(this.spaces[r].fromXYZ)),this.spaces[r].transfer===Us&&(s.r=Tt(s.r),s.g=Tt(s.g),s.b=Tt(s.b))),s},fromWorkingColorSpace:function(s,i){return this.convert(s,this.workingColorSpace,i)},toWorkingColorSpace:function(s,i){return this.convert(s,i,this.workingColorSpace)},getPrimaries:function(s){return this.spaces[s].primaries},getTransfer:function(s){return s===$i?tn:this.spaces[s].transfer},getLuminanceCoefficients:function(s,i=this.workingColorSpace){return s.fromArray(this.spaces[i].luminanceCoefficients)},define:function(s){Object.assign(this.spaces,s)},_getMatrix:function(s,i,r){return s.copy(this.spaces[i].toXYZ).multiply(this.spaces[r].fromXYZ)},_getDrawingBufferColorSpace:function(s){return this.spaces[s].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(s=this.workingColorSpace){return this.spaces[s].workingColorSpaceConfig.unpackColorSpace}},A=[.64,.33,.3,.6,.15,.06],t=[.2126,.7152,.0722],e=[.3127,.329];return n.define({[An]:{primaries:A,whitePoint:e,transfer:tn,toXYZ:an,fromXYZ:gn,luminanceCoefficients:t,workingColorSpaceConfig:{unpackColorSpace:HA},outputColorSpaceConfig:{drawingBufferColorSpace:HA}},[HA]:{primaries:A,whitePoint:e,transfer:Us,toXYZ:an,fromXYZ:gn,luminanceCoefficients:t,outputColorSpaceConfig:{drawingBufferColorSpace:HA}}}),n}const zA=Pr();function tt(n){return n<.04045?n*.0773993808:Math.pow(n*.9478672986+.0521327014,2.4)}function Tt(n){return n<.0031308?n*12.92:1.055*Math.pow(n,.41666)-.055}let vt;class Vr{static getDataURL(A){if(/^data:/i.test(A.src)||typeof HTMLCanvasElement>"u")return A.src;let t;if(A instanceof HTMLCanvasElement)t=A;else{vt===void 0&&(vt=rn("canvas")),vt.width=A.width,vt.height=A.height;const e=vt.getContext("2d");A instanceof ImageData?e.putImageData(A,0,0):e.drawImage(A,0,0,A.width,A.height),t=vt}return t.width>2048||t.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",A),t.toDataURL("image/jpeg",.6)):t.toDataURL("image/png")}static sRGBToLinear(A){if(typeof HTMLImageElement<"u"&&A instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&A instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&A instanceof ImageBitmap){const t=rn("canvas");t.width=A.width,t.height=A.height;const e=t.getContext("2d");e.drawImage(A,0,0,A.width,A.height);const s=e.getImageData(0,0,A.width,A.height),i=s.data;for(let r=0;r<i.length;r++)i[r]=tt(i[r]/255)*255;return e.putImageData(s,0,0),t}else if(A.data){const t=A.data.slice(0);for(let e=0;e<t.length;e++)t instanceof Uint8Array||t instanceof Uint8ClampedArray?t[e]=Math.floor(tt(t[e]/255)*255):t[e]=tt(t[e]);return{data:t,width:A.width,height:A.height}}else return console.warn("THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied."),A}}let Xr=0;class on{constructor(A=null){this.isSource=!0,Object.defineProperty(this,"id",{value:Xr++}),this.uuid=ce(),this.data=A,this.dataReady=!0,this.version=0}set needsUpdate(A){A===!0&&this.version++}toJSON(A){const t=A===void 0||typeof A=="string";if(!t&&A.images[this.uuid]!==void 0)return A.images[this.uuid];const e={uuid:this.uuid,url:""},s=this.data;if(s!==null){let i;if(Array.isArray(s)){i=[];for(let r=0,a=s.length;r<a;r++)s[r].isDataTexture?i.push(Ls(s[r].image)):i.push(Ls(s[r]))}else i=Ls(s);e.url=i}return t||(A.images[this.uuid]=e),e}}function Ls(n){return typeof HTMLImageElement<"u"&&n instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&n instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&n instanceof ImageBitmap?Vr.getDataURL(n):n.data?{data:Array.from(n.data),width:n.width,height:n.height,type:n.data.constructor.name}:(console.warn("THREE.Texture: Unable to serialize Texture."),{})}let jr=0;class $A extends Ee{constructor(A=$A.DEFAULT_IMAGE,t=$A.DEFAULT_MAPPING,e=he,s=he,i=ji,r=Kr,a=Ye,g=Le,o=$A.DEFAULT_ANISOTROPY,I=$i){super(),this.isTexture=!0,Object.defineProperty(this,"id",{value:jr++}),this.uuid=ce(),this.name="",this.source=new on(A),this.mipmaps=[],this.mapping=t,this.channel=0,this.wrapS=e,this.wrapT=s,this.magFilter=i,this.minFilter=r,this.anisotropy=o,this.format=a,this.internalFormat=null,this.type=g,this.offset=new DA(0,0),this.repeat=new DA(1,1),this.center=new DA(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new jA,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.colorSpace=I,this.userData={},this.version=0,this.onUpdate=null,this.renderTarget=null,this.isRenderTargetTexture=!1,this.pmremVersion=0}get image(){return this.source.data}set image(A=null){this.source.data=A}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(A){return this.name=A.name,this.source=A.source,this.mipmaps=A.mipmaps.slice(0),this.mapping=A.mapping,this.channel=A.channel,this.wrapS=A.wrapS,this.wrapT=A.wrapT,this.magFilter=A.magFilter,this.minFilter=A.minFilter,this.anisotropy=A.anisotropy,this.format=A.format,this.internalFormat=A.internalFormat,this.type=A.type,this.offset.copy(A.offset),this.repeat.copy(A.repeat),this.center.copy(A.center),this.rotation=A.rotation,this.matrixAutoUpdate=A.matrixAutoUpdate,this.matrix.copy(A.matrix),this.generateMipmaps=A.generateMipmaps,this.premultiplyAlpha=A.premultiplyAlpha,this.flipY=A.flipY,this.unpackAlignment=A.unpackAlignment,this.colorSpace=A.colorSpace,this.renderTarget=A.renderTarget,this.isRenderTargetTexture=A.isRenderTargetTexture,this.userData=JSON.parse(JSON.stringify(A.userData)),this.needsUpdate=!0,this}toJSON(A){const t=A===void 0||typeof A=="string";if(!t&&A.textures[this.uuid]!==void 0)return A.textures[this.uuid];const e={metadata:{version:4.6,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(A).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&&(e.userData=this.userData),t||(A.textures[this.uuid]=e),e}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(A){if(this.mapping!==Pi)return A;if(A.applyMatrix3(this.matrix),A.x<0||A.x>1)switch(this.wrapS){case Vi:A.x=A.x-Math.floor(A.x);break;case he:A.x=A.x<0?0:1;break;case Xi:Math.abs(Math.floor(A.x)%2)===1?A.x=Math.ceil(A.x)-A.x:A.x=A.x-Math.floor(A.x);break}if(A.y<0||A.y>1)switch(this.wrapT){case Vi:A.y=A.y-Math.floor(A.y);break;case he:A.y=A.y<0?0:1;break;case Xi:Math.abs(Math.floor(A.y)%2)===1?A.y=Math.ceil(A.y)-A.y:A.y=A.y-Math.floor(A.y);break}return this.flipY&&(A.y=1-A.y),A}set needsUpdate(A){A===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(A){A===!0&&this.pmremVersion++}}$A.DEFAULT_IMAGE=null,$A.DEFAULT_MAPPING=Pi,$A.DEFAULT_ANISOTROPY=1;class fA{constructor(A=0,t=0,e=0,s=1){fA.prototype.isVector4=!0,this.x=A,this.y=t,this.z=e,this.w=s}get width(){return this.z}set width(A){this.z=A}get height(){return this.w}set height(A){this.w=A}set(A,t,e,s){return this.x=A,this.y=t,this.z=e,this.w=s,this}setScalar(A){return this.x=A,this.y=A,this.z=A,this.w=A,this}setX(A){return this.x=A,this}setY(A){return this.y=A,this}setZ(A){return this.z=A,this}setW(A){return this.w=A,this}setComponent(A,t){switch(A){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: "+A)}return this}getComponent(A){switch(A){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: "+A)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(A){return this.x=A.x,this.y=A.y,this.z=A.z,this.w=A.w!==void 0?A.w:1,this}add(A){return this.x+=A.x,this.y+=A.y,this.z+=A.z,this.w+=A.w,this}addScalar(A){return this.x+=A,this.y+=A,this.z+=A,this.w+=A,this}addVectors(A,t){return this.x=A.x+t.x,this.y=A.y+t.y,this.z=A.z+t.z,this.w=A.w+t.w,this}addScaledVector(A,t){return this.x+=A.x*t,this.y+=A.y*t,this.z+=A.z*t,this.w+=A.w*t,this}sub(A){return this.x-=A.x,this.y-=A.y,this.z-=A.z,this.w-=A.w,this}subScalar(A){return this.x-=A,this.y-=A,this.z-=A,this.w-=A,this}subVectors(A,t){return this.x=A.x-t.x,this.y=A.y-t.y,this.z=A.z-t.z,this.w=A.w-t.w,this}multiply(A){return this.x*=A.x,this.y*=A.y,this.z*=A.z,this.w*=A.w,this}multiplyScalar(A){return this.x*=A,this.y*=A,this.z*=A,this.w*=A,this}applyMatrix4(A){const t=this.x,e=this.y,s=this.z,i=this.w,r=A.elements;return this.x=r[0]*t+r[4]*e+r[8]*s+r[12]*i,this.y=r[1]*t+r[5]*e+r[9]*s+r[13]*i,this.z=r[2]*t+r[6]*e+r[10]*s+r[14]*i,this.w=r[3]*t+r[7]*e+r[11]*s+r[15]*i,this}divide(A){return this.x/=A.x,this.y/=A.y,this.z/=A.z,this.w/=A.w,this}divideScalar(A){return this.multiplyScalar(1/A)}setAxisAngleFromQuaternion(A){this.w=2*Math.acos(A.w);const t=Math.sqrt(1-A.w*A.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=A.x/t,this.y=A.y/t,this.z=A.z/t),this}setAxisAngleFromRotationMatrix(A){let t,e,s,i;const g=A.elements,o=g[0],I=g[4],B=g[8],Q=g[1],h=g[5],C=g[9],E=g[2],l=g[6],c=g[10];if(Math.abs(I-Q)<.01&&Math.abs(B-E)<.01&&Math.abs(C-l)<.01){if(Math.abs(I+Q)<.1&&Math.abs(B+E)<.1&&Math.abs(C+l)<.1&&Math.abs(o+h+c-3)<.1)return this.set(1,0,0,0),this;t=Math.PI;const d=(o+1)/2,y=(h+1)/2,p=(c+1)/2,x=(I+Q)/4,D=(B+E)/4,w=(C+l)/4;return d>y&&d>p?d<.01?(e=0,s=.707106781,i=.707106781):(e=Math.sqrt(d),s=x/e,i=D/e):y>p?y<.01?(e=.707106781,s=0,i=.707106781):(s=Math.sqrt(y),e=x/s,i=w/s):p<.01?(e=.707106781,s=.707106781,i=0):(i=Math.sqrt(p),e=D/i,s=w/i),this.set(e,s,i,t),this}let u=Math.sqrt((l-C)*(l-C)+(B-E)*(B-E)+(Q-I)*(Q-I));return Math.abs(u)<.001&&(u=1),this.x=(l-C)/u,this.y=(B-E)/u,this.z=(Q-I)/u,this.w=Math.acos((o+h+c-1)/2),this}setFromMatrixPosition(A){const t=A.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this.w=t[15],this}min(A){return this.x=Math.min(this.x,A.x),this.y=Math.min(this.y,A.y),this.z=Math.min(this.z,A.z),this.w=Math.min(this.w,A.w),this}max(A){return this.x=Math.max(this.x,A.x),this.y=Math.max(this.y,A.y),this.z=Math.max(this.z,A.z),this.w=Math.max(this.w,A.w),this}clamp(A,t){return this.x=v(this.x,A.x,t.x),this.y=v(this.y,A.y,t.y),this.z=v(this.z,A.z,t.z),this.w=v(this.w,A.w,t.w),this}clampScalar(A,t){return this.x=v(this.x,A,t),this.y=v(this.y,A,t),this.z=v(this.z,A,t),this.w=v(this.w,A,t),this}clampLength(A,t){const e=this.length();return this.divideScalar(e||1).multiplyScalar(v(e,A,t))}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(A){return this.x*A.x+this.y*A.y+this.z*A.z+this.w*A.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(A){return this.normalize().multiplyScalar(A)}lerp(A,t){return this.x+=(A.x-this.x)*t,this.y+=(A.y-this.y)*t,this.z+=(A.z-this.z)*t,this.w+=(A.w-this.w)*t,this}lerpVectors(A,t,e){return this.x=A.x+(t.x-A.x)*e,this.y=A.y+(t.y-A.y)*e,this.z=A.z+(t.z-A.z)*e,this.w=A.w+(t.w-A.w)*e,this}equals(A){return A.x===this.x&&A.y===this.y&&A.z===this.z&&A.w===this.w}fromArray(A,t=0){return this.x=A[t],this.y=A[t+1],this.z=A[t+2],this.w=A[t+3],this}toArray(A=[],t=0){return A[t]=this.x,A[t+1]=this.y,A[t+2]=this.z,A[t+3]=this.w,A}fromBufferAttribute(A,t){return this.x=A.getX(t),this.y=A.getY(t),this.z=A.getZ(t),this.w=A.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 $r extends Ee{constructor(A=1,t=1,e={}){super(),this.isRenderTarget=!0,this.width=A,this.height=t,this.depth=1,this.scissor=new fA(0,0,A,t),this.scissorTest=!1,this.viewport=new fA(0,0,A,t);const s={width:A,height:t,depth:1};e=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:ji,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1},e);const i=new $A(s,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.colorSpace);i.flipY=!1,i.generateMipmaps=e.generateMipmaps,i.internalFormat=e.internalFormat,this.textures=[];const r=e.count;for(let a=0;a<r;a++)this.textures[a]=i.clone(),this.textures[a].isRenderTargetTexture=!0,this.textures[a].renderTarget=this;this.depthBuffer=e.depthBuffer,this.stencilBuffer=e.stencilBuffer,this.resolveDepthBuffer=e.resolveDepthBuffer,this.resolveStencilBuffer=e.resolveStencilBuffer,this._depthTexture=null,this.depthTexture=e.depthTexture,this.samples=e.samples}get texture(){return this.textures[0]}set texture(A){this.textures[0]=A}set depthTexture(A){this._depthTexture!==null&&(this._depthTexture.renderTarget=null),A!==null&&(A.renderTarget=this),this._depthTexture=A}get depthTexture(){return this._depthTexture}setSize(A,t,e=1){if(this.width!==A||this.height!==t||this.depth!==e){this.width=A,this.height=t,this.depth=e;for(let s=0,i=this.textures.length;s<i;s++)this.textures[s].image.width=A,this.textures[s].image.height=t,this.textures[s].image.depth=e;this.dispose()}this.viewport.set(0,0,A,t),this.scissor.set(0,0,A,t)}clone(){return new this.constructor().copy(this)}copy(A){this.width=A.width,this.height=A.height,this.depth=A.depth,this.scissor.copy(A.scissor),this.scissorTest=A.scissorTest,this.viewport.copy(A.viewport),this.textures.length=0;for(let e=0,s=A.textures.length;e<s;e++)this.textures[e]=A.textures[e].clone(),this.textures[e].isRenderTargetTexture=!0,this.textures[e].renderTarget=this;const t=Object.assign({},A.texture.image);return this.texture.source=new on(t),this.depthBuffer=A.depthBuffer,this.stencilBuffer=A.stencilBuffer,this.resolveDepthBuffer=A.resolveDepthBuffer,this.resolveStencilBuffer=A.resolveStencilBuffer,A.depthTexture!==null&&(this.depthTexture=A.depthTexture.clone()),this.samples=A.samples,this}dispose(){this.dispatchEvent({type:"dispose"})}}class Aa extends $r{constructor(A=1,t=1,e={}){super(A,t,e),this.isWebGLRenderTarget=!0}}class ct extends $A{constructor(A=null,t=1,e=1,s=1){super(null),this.isDataArrayTexture=!0,this.image={data:A,width:t,height:e,depth:s},this.magFilter=Et,this.minFilter=Et,this.wrapR=he,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.layerUpdates=new Set}addLayerUpdate(A){this.layerUpdates.add(A)}clearLayerUpdates(){this.layerUpdates.clear()}}class In extends Aa{constructor(A=1,t=1,e=1,s={}){super(A,t,s),this.isWebGLArrayRenderTarget=!0,this.depth=e,this.texture=new ct(null,A,t,e),this.texture.isRenderTargetTexture=!0}}class gA{constructor(A=0,t=0,e=0,s=1){this.isQuaternion=!0,this._x=A,this._y=t,this._z=e,this._w=s}static slerpFlat(A,t,e,s,i,r,a){let g=e[s+0],o=e[s+1],I=e[s+2],B=e[s+3];const Q=i[r+0],h=i[r+1],C=i[r+2],E=i[r+3];if(a===0){A[t+0]=g,A[t+1]=o,A[t+2]=I,A[t+3]=B;return}if(a===1){A[t+0]=Q,A[t+1]=h,A[t+2]=C,A[t+3]=E;return}if(B!==E||g!==Q||o!==h||I!==C){let l=1-a;const c=g*Q+o*h+I*C+B*E,u=c>=0?1:-1,d=1-c*c;if(d>Number.EPSILON){const p=Math.sqrt(d),x=Math.atan2(p,c*u);l=Math.sin(l*x)/p,a=Math.sin(a*x)/p}const y=a*u;if(g=g*l+Q*y,o=o*l+h*y,I=I*l+C*y,B=B*l+E*y,l===1-a){const p=1/Math.sqrt(g*g+o*o+I*I+B*B);g*=p,o*=p,I*=p,B*=p}}A[t]=g,A[t+1]=o,A[t+2]=I,A[t+3]=B}static multiplyQuaternionsFlat(A,t,e,s,i,r){const a=e[s],g=e[s+1],o=e[s+2],I=e[s+3],B=i[r],Q=i[r+1],h=i[r+2],C=i[r+3];return A[t]=a*C+I*B+g*h-o*Q,A[t+1]=g*C+I*Q+o*B-a*h,A[t+2]=o*C+I*h+a*Q-g*B,A[t+3]=I*C-a*B-g*Q-o*h,A}get x(){return this._x}set x(A){this._x=A,this._onChangeCallback()}get y(){return this._y}set y(A){this._y=A,this._onChangeCallback()}get z(){return this._z}set z(A){this._z=A,this._onChangeCallback()}get w(){return this._w}set w(A){this._w=A,this._onChangeCallback()}set(A,t,e,s){return this._x=A,this._y=t,this._z=e,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(A){return this._x=A.x,this._y=A.y,this._z=A.z,this._w=A.w,this._onChangeCallback(),this}setFromEuler(A,t=!0){const e=A._x,s=A._y,i=A._z,r=A._order,a=Math.cos,g=Math.sin,o=a(e/2),I=a(s/2),B=a(i/2),Q=g(e/2),h=g(s/2),C=g(i/2);switch(r){case"XYZ":this._x=Q*I*B+o*h*C,this._y=o*h*B-Q*I*C,this._z=o*I*C+Q*h*B,this._w=o*I*B-Q*h*C;break;case"YXZ":this._x=Q*I*B+o*h*C,this._y=o*h*B-Q*I*C,this._z=o*I*C-Q*h*B,this._w=o*I*B+Q*h*C;break;case"ZXY":this._x=Q*I*B-o*h*C,this._y=o*h*B+Q*I*C,this._z=o*I*C+Q*h*B,this._w=o*I*B-Q*h*C;break;case"ZYX":this._x=Q*I*B-o*h*C,this._y=o*h*B+Q*I*C,this._z=o*I*C-Q*h*B,this._w=o*I*B+Q*h*C;break;case"YZX":this._x=Q*I*B+o*h*C,this._y=o*h*B+Q*I*C,this._z=o*I*C-Q*h*B,this._w=o*I*B-Q*h*C;break;case"XZY":this._x=Q*I*B-o*h*C,this._y=o*h*B-Q*I*C,this._z=o*I*C+Q*h*B,this._w=o*I*B+Q*h*C;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+r)}return t===!0&&this._onChangeCallback(),this}setFromAxisAngle(A,t){const e=t/2,s=Math.sin(e);return this._x=A.x*s,this._y=A.y*s,this._z=A.z*s,this._w=Math.cos(e),this._onChangeCallback(),this}setFromRotationMatrix(A){const t=A.elements,e=t[0],s=t[4],i=t[8],r=t[1],a=t[5],g=t[9],o=t[2],I=t[6],B=t[10],Q=e+a+B;if(Q>0){const h=.5/Math.sqrt(Q+1);this._w=.25/h,this._x=(I-g)*h,this._y=(i-o)*h,this._z=(r-s)*h}else if(e>a&&e>B){const h=2*Math.sqrt(1+e-a-B);this._w=(I-g)/h,this._x=.25*h,this._y=(s+r)/h,this._z=(i+o)/h}else if(a>B){const h=2*Math.sqrt(1+a-e-B);this._w=(i-o)/h,this._x=(s+r)/h,this._y=.25*h,this._z=(g+I)/h}else{const h=2*Math.sqrt(1+B-e-a);this._w=(r-s)/h,this._x=(i+o)/h,this._y=(g+I)/h,this._z=.25*h}return this._onChangeCallback(),this}setFromUnitVectors(A,t){let e=A.dot(t)+1;return e<Number.EPSILON?(e=0,Math.abs(A.x)>Math.abs(A.z)?(this._x=-A.y,this._y=A.x,this._z=0,this._w=e):(this._x=0,this._y=-A.z,this._z=A.y,this._w=e)):(this._x=A.y*t.z-A.z*t.y,this._y=A.z*t.x-A.x*t.z,this._z=A.x*t.y-A.y*t.x,this._w=e),this.normalize()}angleTo(A){return 2*Math.acos(Math.abs(v(this.dot(A),-1,1)))}rotateTowards(A,t){const e=this.angleTo(A);if(e===0)return this;const s=Math.min(1,t/e);return this.slerp(A,s),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(A){return this._x*A._x+this._y*A._y+this._z*A._z+this._w*A._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 A=this.length();return A===0?(this._x=0,this._y=0,this._z=0,this._w=1):(A=1/A,this._x=this._x*A,this._y=this._y*A,this._z=this._z*A,this._w=this._w*A),this._onChangeCallback(),this}multiply(A){return this.multiplyQuaternions(this,A)}premultiply(A){return this.multiplyQuaternions(A,this)}multiplyQuaternions(A,t){const e=A._x,s=A._y,i=A._z,r=A._w,a=t._x,g=t._y,o=t._z,I=t._w;return this._x=e*I+r*a+s*o-i*g,this._y=s*I+r*g+i*a-e*o,this._z=i*I+r*o+e*g-s*a,this._w=r*I-e*a-s*g-i*o,this._onChangeCallback(),this}slerp(A,t){if(t===0)return this;if(t===1)return this.copy(A);const e=this._x,s=this._y,i=this._z,r=this._w;let a=r*A._w+e*A._x+s*A._y+i*A._z;if(a<0?(this._w=-A._w,this._x=-A._x,this._y=-A._y,this._z=-A._z,a=-a):this.copy(A),a>=1)return this._w=r,this._x=e,this._y=s,this._z=i,this;const g=1-a*a;if(g<=Number.EPSILON){const h=1-t;return this._w=h*r+t*this._w,this._x=h*e+t*this._x,this._y=h*s+t*this._y,this._z=h*i+t*this._z,this.normalize(),this}const o=Math.sqrt(g),I=Math.atan2(o,a),B=Math.sin((1-t)*I)/o,Q=Math.sin(t*I)/o;return this._w=r*B+this._w*Q,this._x=e*B+this._x*Q,this._y=s*B+this._y*Q,this._z=i*B+this._z*Q,this._onChangeCallback(),this}slerpQuaternions(A,t,e){return this.copy(A).slerp(t,e)}random(){const A=2*Math.PI*Math.random(),t=2*Math.PI*Math.random(),e=Math.random(),s=Math.sqrt(1-e),i=Math.sqrt(e);return this.set(s*Math.sin(A),s*Math.cos(A),i*Math.sin(t),i*Math.cos(t))}equals(A){return A._x===this._x&&A._y===this._y&&A._z===this._z&&A._w===this._w}fromArray(A,t=0){return this._x=A[t],this._y=A[t+1],this._z=A[t+2],this._w=A[t+3],this._onChangeCallback(),this}toArray(A=[],t=0){return A[t]=this._x,A[t+1]=this._y,A[t+2]=this._z,A[t+3]=this._w,A}fromBufferAttribute(A,t){return this._x=A.getX(t),this._y=A.getY(t),this._z=A.getZ(t),this._w=A.getW(t),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(A){return this._onChangeCallback=A,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class f{constructor(A=0,t=0,e=0){f.prototype.isVector3=!0,this.x=A,this.y=t,this.z=e}set(A,t,e){return e===void 0&&(e=this.z),this.x=A,this.y=t,this.z=e,this}setScalar(A){return this.x=A,this.y=A,this.z=A,this}setX(A){return this.x=A,this}setY(A){return this.y=A,this}setZ(A){return this.z=A,this}setComponent(A,t){switch(A){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: "+A)}return this}getComponent(A){switch(A){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+A)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(A){return this.x=A.x,this.y=A.y,this.z=A.z,this}add(A){return this.x+=A.x,this.y+=A.y,this.z+=A.z,this}addScalar(A){return this.x+=A,this.y+=A,this.z+=A,this}addVectors(A,t){return this.x=A.x+t.x,this.y=A.y+t.y,this.z=A.z+t.z,this}addScaledVector(A,t){return this.x+=A.x*t,this.y+=A.y*t,this.z+=A.z*t,this}sub(A){return this.x-=A.x,this.y-=A.y,this.z-=A.z,this}subScalar(A){return this.x-=A,this.y-=A,this.z-=A,this}subVectors(A,t){return this.x=A.x-t.x,this.y=A.y-t.y,this.z=A.z-t.z,this}multiply(A){return this.x*=A.x,this.y*=A.y,this.z*=A.z,this}multiplyScalar(A){return this.x*=A,this.y*=A,this.z*=A,this}multiplyVectors(A,t){return this.x=A.x*t.x,this.y=A.y*t.y,this.z=A.z*t.z,this}applyEuler(A){return this.applyQuaternion(Bn.setFromEuler(A))}applyAxisAngle(A,t){return this.applyQuaternion(Bn.setFromAxisAngle(A,t))}applyMatrix3(A){const t=this.x,e=this.y,s=this.z,i=A.elements;return this.x=i[0]*t+i[3]*e+i[6]*s,this.y=i[1]*t+i[4]*e+i[7]*s,this.z=i[2]*t+i[5]*e+i[8]*s,this}applyNormalMatrix(A){return this.applyMatrix3(A).normalize()}applyMatrix4(A){const t=this.x,e=this.y,s=this.z,i=A.elements,r=1/(i[3]*t+i[7]*e+i[11]*s+i[15]);return this.x=(i[0]*t+i[4]*e+i[8]*s+i[12])*r,this.y=(i[1]*t+i[5]*e+i[9]*s+i[13])*r,this.z=(i[2]*t+i[6]*e+i[10]*s+i[14])*r,this}applyQuaternion(A){const t=this.x,e=this.y,s=this.z,i=A.x,r=A.y,a=A.z,g=A.w,o=2*(r*s-a*e),I=2*(a*t-i*s),B=2*(i*e-r*t);return this.x=t+g*o+r*B-a*I,this.y=e+g*I+a*o-i*B,this.z=s+g*B+i*I-r*o,this}project(A){return this.applyMatrix4(A.matrixWorldInverse).applyMatrix4(A.projectionMatrix)}unproject(A){return this.applyMatrix4(A.projectionMatrixInverse).applyMatrix4(A.matrixWorld)}transformDirection(A){const t=this.x,e=this.y,s=this.z,i=A.elements;return this.x=i[0]*t+i[4]*e+i[8]*s,this.y=i[1]*t+i[5]*e+i[9]*s,this.z=i[2]*t+i[6]*e+i[10]*s,this.normalize()}divide(A){return this.x/=A.x,this.y/=A.y,this.z/=A.z,this}divideScalar(A){return this.multiplyScalar(1/A)}min(A){return this.x=Math.min(this.x,A.x),this.y=Math.min(this.y,A.y),this.z=Math.min(this.z,A.z),this}max(A){return this.x=Math.max(this.x,A.x),this.y=Math.max(this.y,A.y),this.z=Math.max(this.z,A.z),this}clamp(A,t){return this.x=v(this.x,A.x,t.x),this.y=v(this.y,A.y,t.y),this.z=v(this.z,A.z,t.z),this}clampScalar(A,t){return this.x=v(this.x,A,t),this.y=v(this.y,A,t),this.z=v(this.z,A,t),this}clampLength(A,t){const e=this.length();return this.divideScalar(e||1).multiplyScalar(v(e,A,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(A){return this.x*A.x+this.y*A.y+this.z*A.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(A){return this.normalize().multiplyScalar(A)}lerp(A,t){return this.x+=(A.x-this.x)*t,this.y+=(A.y-this.y)*t,this.z+=(A.z-this.z)*t,this}lerpVectors(A,t,e){return this.x=A.x+(t.x-A.x)*e,this.y=A.y+(t.y-A.y)*e,this.z=A.z+(t.z-A.z)*e,this}cross(A){return this.crossVectors(this,A)}crossVectors(A,t){const e=A.x,s=A.y,i=A.z,r=t.x,a=t.y,g=t.z;return this.x=s*g-i*a,this.y=i*r-e*g,this.z=e*a-s*r,this}projectOnVector(A){const t=A.lengthSq();if(t===0)return this.set(0,0,0);const e=A.dot(this)/t;return this.copy(A).multiplyScalar(e)}projectOnPlane(A){return Ys.copy(this).projectOnVector(A),this.sub(Ys)}reflect(A){return this.sub(Ys.copy(A).multiplyScalar(2*this.dot(A)))}angleTo(A){const t=Math.sqrt(this.lengthSq()*A.lengthSq());if(t===0)return Math.PI/2;const e=this.dot(A)/t;return Math.acos(v(e,-1,1))}distanceTo(A){return Math.sqrt(this.distanceToSquared(A))}distanceToSquared(A){const t=this.x-A.x,e=this.y-A.y,s=this.z-A.z;return t*t+e*e+s*s}manhattanDistanceTo(A){return Math.abs(this.x-A.x)+Math.abs(this.y-A.y)+Math.abs(this.z-A.z)}setFromSpherical(A){return this.setFromSphericalCoords(A.radius,A.phi,A.theta)}setFromSphericalCoords(A,t,e){const s=Math.sin(t)*A;return this.x=s*Math.sin(e),this.y=Math.cos(t)*A,this.z=s*Math.cos(e),this}setFromCylindrical(A){return this.setFromCylindricalCoords(A.radius,A.theta,A.y)}setFromCylindricalCoords(A,t,e){return this.x=A*Math.sin(t),this.y=e,this.z=A*Math.cos(t),this}setFromMatrixPosition(A){const t=A.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(A){const t=this.setFromMatrixColumn(A,0).length(),e=this.setFromMatrixColumn(A,1).length(),s=this.setFromMatrixColumn(A,2).length();return this.x=t,this.y=e,this.z=s,this}setFromMatrixColumn(A,t){return this.fromArray(A.elements,t*4)}setFromMatrix3Column(A,t){return this.fromArray(A.elements,t*3)}setFromEuler(A){return this.x=A._x,this.y=A._y,this.z=A._z,this}setFromColor(A){return this.x=A.r,this.y=A.g,this.z=A.b,this}equals(A){return A.x===this.x&&A.y===this.y&&A.z===this.z}fromArray(A,t=0){return this.x=A[t],this.y=A[t+1],this.z=A[t+2],this}toArray(A=[],t=0){return A[t]=this.x,A[t+1]=this.y,A[t+2]=this.z,A}fromBufferAttribute(A,t){return this.x=A.getX(t),this.y=A.getY(t),this.z=A.getZ(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const A=Math.random()*Math.PI*2,t=Math.random()*2-1,e=Math.sqrt(1-t*t);return this.x=e*Math.cos(A),this.y=t,this.z=e*Math.sin(A),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const Ys=new f,Bn=new gA;class Ht{constructor(A=new f(1/0,1/0,1/0),t=new f(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=A,this.max=t}set(A,t){return this.min.copy(A),this.max.copy(t),this}setFromArray(A){this.makeEmpty();for(let t=0,e=A.length;t<e;t+=3)this.expandByPoint(KA.fromArray(A,t));return this}setFromBufferAttribute(A){this.makeEmpty();for(let t=0,e=A.count;t<e;t++)this.expandByPoint(KA.fromBufferAttribute(A,t));return this}setFromPoints(A){this.makeEmpty();for(let t=0,e=A.length;t<e;t++)this.expandByPoint(A[t]);return this}setFromCenterAndSize(A,t){const e=KA.copy(t).multiplyScalar(.5);return this.min.copy(A).sub(e),this.max.copy(A).add(e),this}setFromObject(A,t=!1){return this.makeEmpty(),this.expandByObject(A,t)}clone(){return new this.constructor().copy(this)}copy(A){return this.min.copy(A.min),this.max.copy(A.max),this}makeEmpty(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-1/0,this}isEmpty(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z}getCenter(A){return this.isEmpty()?A.set(0,0,0):A.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(A){return this.isEmpty()?A.set(0,0,0):A.subVectors(this.max,this.min)}expandByPoint(A){return this.min.min(A),this.max.max(A),this}expandByVector(A){return this.min.sub(A),this.max.add(A),this}expandByScalar(A){return this.min.addScalar(-A),this.max.addScalar(A),this}expandByObject(A,t=!1){A.updateWorldMatrix(!1,!1);const e=A.geometry;if(e!==void 0){const i=e.getAttribute("position");if(t===!0&&i!==void 0&&A.isInstancedMesh!==!0)for(let r=0,a=i.count;r<a;r++)A.isMesh===!0?A.getVertexPosition(r,KA):KA.fromBufferAttribute(i,r),KA.applyMatrix4(A.matrixWorld),this.expandByPoint(KA);else A.boundingBox!==void 0?(A.boundingBox===null&&A.computeBoundingBox(),Je.copy(A.boundingBox)):(e.boundingBox===null&&e.computeBoundingBox(),Je.copy(e.boundingBox)),Je.applyMatrix4(A.matrixWorld),this.union(Je)}const s=A.children;for(let i=0,r=s.length;i<r;i++)this.expandByObject(s[i],t);return this}containsPoint(A){return A.x>=this.min.x&&A.x<=this.max.x&&A.y>=this.min.y&&A.y<=this.max.y&&A.z>=this.min.z&&A.z<=this.max.z}containsBox(A){return this.min.x<=A.min.x&&A.max.x<=this.max.x&&this.min.y<=A.min.y&&A.max.y<=this.max.y&&this.min.z<=A.min.z&&A.max.z<=this.max.z}getParameter(A,t){return t.set((A.x-this.min.x)/(this.max.x-this.min.x),(A.y-this.min.y)/(this.max.y-this.min.y),(A.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(A){return A.max.x>=this.min.x&&A.min.x<=this.max.x&&A.max.y>=this.min.y&&A.min.y<=this.max.y&&A.max.z>=this.min.z&&A.min.z<=this.max.z}intersectsSphere(A){return this.clampPoint(A.center,KA),KA.distanceToSquared(A.center)<=A.radius*A.radius}intersectsPlane(A){let t,e;return A.normal.x>0?(t=A.normal.x*this.min.x,e=A.normal.x*this.max.x):(t=A.normal.x*this.max.x,e=A.normal.x*this.min.x),A.normal.y>0?(t+=A.normal.y*this.min.y,e+=A.normal.y*this.max.y):(t+=A.normal.y*this.max.y,e+=A.normal.y*this.min.y),A.normal.z>0?(t+=A.normal.z*this.min.z,e+=A.normal.z*this.max.z):(t+=A.normal.z*this.max.z,e+=A.normal.z*this.min.z),t<=-A.constant&&e>=-A.constant}intersectsTriangle(A){if(this.isEmpty())return!1;this.getCenter(ue),Te.subVectors(this.max,ue),zt.subVectors(A.a,ue),Kt.subVectors(A.b,ue),qt.subVectors(A.c,ue),lt.subVectors(Kt,zt),ut.subVectors(qt,Kt),St.subVectors(zt,qt);let t=[0,-lt.z,lt.y,0,-ut.z,ut.y,0,-St.z,St.y,lt.z,0,-lt.x,ut.z,0,-ut.x,St.z,0,-St.x,-lt.y,lt.x,0,-ut.y,ut.x,0,-St.y,St.x,0];return!Js(t,zt,Kt,qt,Te)||(t=[1,0,0,0,1,0,0,0,1],!Js(t,zt,Kt,qt,Te))?!1:(ve.crossVectors(lt,ut),t=[ve.x,ve.y,ve.z],Js(t,zt,Kt,qt,Te))}clampPoint(A,t){return t.copy(A).clamp(this.min,this.max)}distanceToPoint(A){return this.clampPoint(A,KA).distanceTo(A)}getBoundingSphere(A){return this.isEmpty()?A.makeEmpty():(this.getCenter(A.center),A.radius=this.getSize(KA).length()*.5),A}intersect(A){return this.min.max(A.min),this.max.min(A.max),this.isEmpty()&&this.makeEmpty(),this}union(A){return this.min.min(A.min),this.max.max(A.max),this}applyMatrix4(A){return this.isEmpty()?this:(et[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(A),et[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(A),et[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(A),et[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(A),et[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(A),et[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(A),et[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(A),et[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(A),this.setFromPoints(et),this)}translate(A){return this.min.add(A),this.max.add(A),this}equals(A){return A.min.equals(this.min)&&A.max.equals(this.max)}}const et=[new f,new f,new f,new f,new f,new f,new f,new f],KA=new f,Je=new Ht,zt=new f,Kt=new f,qt=new f,lt=new f,ut=new f,St=new f,ue=new f,Te=new f,ve=new f,Ft=new f;function Js(n,A,t,e,s){for(let i=0,r=n.length-3;i<=r;i+=3){Ft.fromArray(n,i);const a=s.x*Math.abs(Ft.x)+s.y*Math.abs(Ft.y)+s.z*Math.abs(Ft.z),g=A.dot(Ft),o=t.dot(Ft),I=e.dot(Ft);if(Math.max(-Math.max(g,o,I),Math.min(g,o,I))>a)return!1}return!0}const ta=new Ht,de=new f,Ts=new f;class Qn{constructor(A=new f,t=-1){this.isSphere=!0,this.center=A,this.radius=t}set(A,t){return this.center.copy(A),this.radius=t,this}setFromPoints(A,t){const e=this.center;t!==void 0?e.copy(t):ta.setFromPoints(A).getCenter(e);let s=0;for(let i=0,r=A.length;i<r;i++)s=Math.max(s,e.distanceToSquared(A[i]));return this.radius=Math.sqrt(s),this}copy(A){return this.center.copy(A.center),this.radius=A.radius,this}isEmpty(){return this.radius<0}makeEmpty(){return this.center.set(0,0,0),this.radius=-1,this}containsPoint(A){return A.distanceToSquared(this.center)<=this.radius*this.radius}distanceToPoint(A){return A.distanceTo(this.center)-this.radius}intersectsSphere(A){const t=this.radius+A.radius;return A.center.distanceToSquared(this.center)<=t*t}intersectsBox(A){return A.intersectsSphere(this)}intersectsPlane(A){return Math.abs(A.distanceToPoint(this.center))<=this.radius}clampPoint(A,t){const e=this.center.distanceToSquared(A);return t.copy(A),e>this.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t}getBoundingBox(A){return this.isEmpty()?(A.makeEmpty(),A):(A.set(this.center,this.center),A.expandByScalar(this.radius),A)}applyMatrix4(A){return this.center.applyMatrix4(A),this.radius=this.radius*A.getMaxScaleOnAxis(),this}translate(A){return this.center.add(A),this}expandByPoint(A){if(this.isEmpty())return this.center.copy(A),this.radius=0,this;de.subVectors(A,this.center);const t=de.lengthSq();if(t>this.radius*this.radius){const e=Math.sqrt(t),s=(e-this.radius)*.5;this.center.addScaledVector(de,s/e),this.radius+=s}return this}union(A){return A.isEmpty()?this:this.isEmpty()?(this.copy(A),this):(this.center.equals(A.center)===!0?this.radius=Math.max(this.radius,A.radius):(Ts.subVectors(A.center,this.center).setLength(A.radius),this.expandByPoint(de.copy(A.center).add(Ts)),this.expandByPoint(de.copy(A.center).sub(Ts))),this)}equals(A){return A.center.equals(this.center)&&A.radius===this.radius}clone(){return new this.constructor().copy(this)}}const st=new f,vs=new f,He=new f,dt=new f,Hs=new f,ze=new f,zs=new f;class ea{constructor(A=new f,t=new f(0,0,-1)){this.origin=A,this.direction=t}set(A,t){return this.origin.copy(A),this.direction.copy(t),this}copy(A){return this.origin.copy(A.origin),this.direction.copy(A.direction),this}at(A,t){return t.copy(this.origin).addScaledVector(this.direction,A)}lookAt(A){return this.direction.copy(A).sub(this.origin).normalize(),this}recast(A){return this.origin.copy(this.at(A,st)),this}closestPointToPoint(A,t){t.subVectors(A,this.origin);const e=t.dot(this.direction);return e<0?t.copy(this.origin):t.copy(this.origin).addScaledVector(this.direction,e)}distanceToPoint(A){return Math.sqrt(this.distanceSqToPoint(A))}distanceSqToPoint(A){const t=st.subVectors(A,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(A):(st.copy(this.origin).addScaledVector(this.direction,t),st.distanceToSquared(A))}distanceSqToSegment(A,t,e,s){vs.copy(A).add(t).multiplyScalar(.5),He.copy(t).sub(A).normalize(),dt.copy(this.origin).sub(vs);const i=A.distanceTo(t)*.5,r=-this.direction.dot(He),a=dt.dot(this.direction),g=-dt.dot(He),o=dt.lengthSq(),I=Math.abs(1-r*r);let B,Q,h,C;if(I>0)if(B=r*g-a,Q=r*a-g,C=i*I,B>=0)if(Q>=-C)if(Q<=C){const E=1/I;B*=E,Q*=E,h=B*(B+r*Q+2*a)+Q*(r*B+Q+2*g)+o}else Q=i,B=Math.max(0,-(r*Q+a)),h=-B*B+Q*(Q+2*g)+o;else Q=-i,B=Math.max(0,-(r*Q+a)),h=-B*B+Q*(Q+2*g)+o;else Q<=-C?(B=Math.max(0,-(-r*i+a)),Q=B>0?-i:Math.min(Math.max(-i,-g),i),h=-B*B+Q*(Q+2*g)+o):Q<=C?(B=0,Q=Math.min(Math.max(-i,-g),i),h=Q*(Q+2*g)+o):(B=Math.max(0,-(r*i+a)),Q=B>0?i:Math.min(Math.max(-i,-g),i),h=-B*B+Q*(Q+2*g)+o);else Q=r>0?-i:i,B=Math.max(0,-(r*Q+a)),h=-B*B+Q*(Q+2*g)+o;return e&&e.copy(this.origin).addScaledVector(this.direction,B),s&&s.copy(vs).addScaledVector(He,Q),h}intersectSphere(A,t){st.subVectors(A.center,this.origin);const e=st.dot(this.direction),s=st.dot(st)-e*e,i=A.radius*A.radius;if(s>i)return null;const r=Math.sqrt(i-s),a=e-r,g=e+r;return g<0?null:a<0?this.at(g,t):this.at(a,t)}intersectsSphere(A){return this.distanceSqToPoint(A.center)<=A.radius*A.radius}distanceToPlane(A){const t=A.normal.dot(this.direction);if(t===0)return A.distanceToPoint(this.origin)===0?0:null;const e=-(this.origin.dot(A.normal)+A.constant)/t;return e>=0?e:null}intersectPlane(A,t){const e=this.distanceToPlane(A);return e===null?null:this.at(e,t)}intersectsPlane(A){const t=A.distanceToPoint(this.origin);return t===0||A.normal.dot(this.direction)*t<0}intersectBox(A,t){let e,s,i,r,a,g;const o=1/this.direction.x,I=1/this.direction.y,B=1/this.direction.z,Q=this.origin;return o>=0?(e=(A.min.x-Q.x)*o,s=(A.max.x-Q.x)*o):(e=(A.max.x-Q.x)*o,s=(A.min.x-Q.x)*o),I>=0?(i=(A.min.y-Q.y)*I,r=(A.max.y-Q.y)*I):(i=(A.max.y-Q.y)*I,r=(A.min.y-Q.y)*I),e>r||i>s||((i>e||isNaN(e))&&(e=i),(r<s||isNaN(s))&&(s=r),B>=0?(a=(A.min.z-Q.z)*B,g=(A.max.z-Q.z)*B):(a=(A.max.z-Q.z)*B,g=(A.min.z-Q.z)*B),e>g||a>s)||((a>e||e!==e)&&(e=a),(g<s||s!==s)&&(s=g),s<0)?null:this.at(e>=0?e:s,t)}intersectsBox(A){return this.intersectBox(A,st)!==null}intersectTriangle(A,t,e,s,i){Hs.subVectors(t,A),ze.subVectors(e,A),zs.crossVectors(Hs,ze);let r=this.direction.dot(zs),a;if(r>0){if(s)return null;a=1}else if(r<0)a=-1,r=-r;else return null;dt.subVectors(this.origin,A);const g=a*this.direction.dot(ze.crossVectors(dt,ze));if(g<0)return null;const o=a*this.direction.dot(Hs.cross(dt));if(o<0||g+o>r)return null;const I=-a*dt.dot(zs);return I<0?null:this.at(I/r,i)}applyMatrix4(A){return this.origin.applyMatrix4(A),this.direction.transformDirection(A),this}equals(A){return A.origin.equals(this.origin)&&A.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}}class cA{constructor(A,t,e,s,i,r,a,g,o,I,B,Q,h,C,E,l){cA.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],A!==void 0&&this.set(A,t,e,s,i,r,a,g,o,I,B,Q,h,C,E,l)}set(A,t,e,s,i,r,a,g,o,I,B,Q,h,C,E,l){const c=this.elements;return c[0]=A,c[4]=t,c[8]=e,c[12]=s,c[1]=i,c[5]=r,c[9]=a,c[13]=g,c[2]=o,c[6]=I,c[10]=B,c[14]=Q,c[3]=h,c[7]=C,c[11]=E,c[15]=l,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new cA().fromArray(this.elements)}copy(A){const t=this.elements,e=A.elements;return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],this}copyPosition(A){const t=this.elements,e=A.elements;return t[12]=e[12],t[13]=e[13],t[14]=e[14],this}setFromMatrix3(A){const t=A.elements;return this.set(t[0],t[3],t[6],0,t[1],t[4],t[7],0,t[2],t[5],t[8],0,0,0,0,1),this}extractBasis(A,t,e){return A.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),e.setFromMatrixColumn(this,2),this}makeBasis(A,t,e){return this.set(A.x,t.x,e.x,0,A.y,t.y,e.y,0,A.z,t.z,e.z,0,0,0,0,1),this}extractRotation(A){const t=this.elements,e=A.elements,s=1/_t.setFromMatrixColumn(A,0).length(),i=1/_t.setFromMatrixColumn(A,1).length(),r=1/_t.setFromMatrixColumn(A,2).length();return t[0]=e[0]*s,t[1]=e[1]*s,t[2]=e[2]*s,t[3]=0,t[4]=e[4]*i,t[5]=e[5]*i,t[6]=e[6]*i,t[7]=0,t[8]=e[8]*r,t[9]=e[9]*r,t[10]=e[10]*r,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromEuler(A){const t=this.elements,e=A.x,s=A.y,i=A.z,r=Math.cos(e),a=Math.sin(e),g=Math.cos(s),o=Math.sin(s),I=Math.cos(i),B=Math.sin(i);if(A.order==="XYZ"){const Q=r*I,h=r*B,C=a*I,E=a*B;t[0]=g*I,t[4]=-g*B,t[8]=o,t[1]=h+C*o,t[5]=Q-E*o,t[9]=-a*g,t[2]=E-Q*o,t[6]=C+h*o,t[10]=r*g}else if(A.order==="YXZ"){const Q=g*I,h=g*B,C=o*I,E=o*B;t[0]=Q+E*a,t[4]=C*a-h,t[8]=r*o,t[1]=r*B,t[5]=r*I,t[9]=-a,t[2]=h*a-C,t[6]=E+Q*a,t[10]=r*g}else if(A.order==="ZXY"){const Q=g*I,h=g*B,C=o*I,E=o*B;t[0]=Q-E*a,t[4]=-r*B,t[8]=C+h*a,t[1]=h+C*a,t[5]=r*I,t[9]=E-Q*a,t[2]=-r*o,t[6]=a,t[10]=r*g}else if(A.order==="ZYX"){const Q=r*I,h=r*B,C=a*I,E=a*B;t[0]=g*I,t[4]=C*o-h,t[8]=Q*o+E,t[1]=g*B,t[5]=E*o+Q,t[9]=h*o-C,t[2]=-o,t[6]=a*g,t[10]=r*g}else if(A.order==="YZX"){const Q=r*g,h=r*o,C=a*g,E=a*o;t[0]=g*I,t[4]=E-Q*B,t[8]=C*B+h,t[1]=B,t[5]=r*I,t[9]=-a*I,t[2]=-o*I,t[6]=h*B+C,t[10]=Q-E*B}else if(A.order==="XZY"){const Q=r*g,h=r*o,C=a*g,E=a*o;t[0]=g*I,t[4]=-B,t[8]=o*I,t[1]=Q*B+E,t[5]=r*I,t[9]=h*B-C,t[2]=C*B-h,t[6]=a*I,t[10]=E*B+Q}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromQuaternion(A){return this.compose(sa,A,ia)}lookAt(A,t,e){const s=this.elements;return NA.subVectors(A,t),NA.lengthSq()===0&&(NA.z=1),NA.normalize(),ft.crossVectors(e,NA),ft.lengthSq()===0&&(Math.abs(e.z)===1?NA.x+=1e-4:NA.z+=1e-4,NA.normalize(),ft.crossVectors(e,NA)),ft.normalize(),Ke.crossVectors(NA,ft),s[0]=ft.x,s[4]=Ke.x,s[8]=NA.x,s[1]=ft.y,s[5]=Ke.y,s[9]=NA.y,s[2]=ft.z,s[6]=Ke.z,s[10]=NA.z,this}multiply(A){return this.multiplyMatrices(this,A)}premultiply(A){return this.multiplyMatrices(A,this)}multiplyMatrices(A,t){const e=A.elements,s=t.elements,i=this.elements,r=e[0],a=e[4],g=e[8],o=e[12],I=e[1],B=e[5],Q=e[9],h=e[13],C=e[2],E=e[6],l=e[10],c=e[14],u=e[3],d=e[7],y=e[11],p=e[15],x=s[0],D=s[4],w=s[8],m=s[12],N=s[1],M=s[5],S=s[9],F=s[13],k=s[2],U=s[6],R=s[10],b=s[14],P=s[3],_=s[7],j=s[11],V=s[15];return i[0]=r*x+a*N+g*k+o*P,i[4]=r*D+a*M+g*U+o*_,i[8]=r*w+a*S+g*R+o*j,i[12]=r*m+a*F+g*b+o*V,i[1]=I*x+B*N+Q*k+h*P,i[5]=I*D+B*M+Q*U+h*_,i[9]=I*w+B*S+Q*R+h*j,i[13]=I*m+B*F+Q*b+h*V,i[2]=C*x+E*N+l*k+c*P,i[6]=C*D+E*M+l*U+c*_,i[10]=C*w+E*S+l*R+c*j,i[14]=C*m+E*F+l*b+c*V,i[3]=u*x+d*N+y*k+p*P,i[7]=u*D+d*M+y*U+p*_,i[11]=u*w+d*S+y*R+p*j,i[15]=u*m+d*F+y*b+p*V,this}multiplyScalar(A){const t=this.elements;return t[0]*=A,t[4]*=A,t[8]*=A,t[12]*=A,t[1]*=A,t[5]*=A,t[9]*=A,t[13]*=A,t[2]*=A,t[6]*=A,t[10]*=A,t[14]*=A,t[3]*=A,t[7]*=A,t[11]*=A,t[15]*=A,this}determinant(){const A=this.elements,t=A[0],e=A[4],s=A[8],i=A[12],r=A[1],a=A[5],g=A[9],o=A[13],I=A[2],B=A[6],Q=A[10],h=A[14],C=A[3],E=A[7],l=A[11],c=A[15];return C*(+i*g*B-s*o*B-i*a*Q+e*o*Q+s*a*h-e*g*h)+E*(+t*g*h-t*o*Q+i*r*Q-s*r*h+s*o*I-i*g*I)+l*(+t*o*B-t*a*h-i*r*B+e*r*h+i*a*I-e*o*I)+c*(-s*a*I-t*g*B+t*a*Q+s*r*B-e*r*Q+e*g*I)}transpose(){const A=this.elements;let t;return t=A[1],A[1]=A[4],A[4]=t,t=A[2],A[2]=A[8],A[8]=t,t=A[6],A[6]=A[9],A[9]=t,t=A[3],A[3]=A[12],A[12]=t,t=A[7],A[7]=A[13],A[13]=t,t=A[11],A[11]=A[14],A[14]=t,this}setPosition(A,t,e){const s=this.elements;return A.isVector3?(s[12]=A.x,s[13]=A.y,s[14]=A.z):(s[12]=A,s[13]=t,s[14]=e),this}invert(){const A=this.elements,t=A[0],e=A[1],s=A[2],i=A[3],r=A[4],a=A[5],g=A[6],o=A[7],I=A[8],B=A[9],Q=A[10],h=A[11],C=A[12],E=A[13],l=A[14],c=A[15],u=B*l*o-E*Q*o+E*g*h-a*l*h-B*g*c+a*Q*c,d=C*Q*o-I*l*o-C*g*h+r*l*h+I*g*c-r*Q*c,y=I*E*o-C*B*o+C*a*h-r*E*h-I*a*c+r*B*c,p=C*B*g-I*E*g-C*a*Q+r*E*Q+I*a*l-r*B*l,x=t*u+e*d+s*y+i*p;if(x===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const D=1/x;return A[0]=u*D,A[1]=(E*Q*i-B*l*i-E*s*h+e*l*h+B*s*c-e*Q*c)*D,A[2]=(a*l*i-E*g*i+E*s*o-e*l*o-a*s*c+e*g*c)*D,A[3]=(B*g*i-a*Q*i-B*s*o+e*Q*o+a*s*h-e*g*h)*D,A[4]=d*D,A[5]=(I*l*i-C*Q*i+C*s*h-t*l*h-I*s*c+t*Q*c)*D,A[6]=(C*g*i-r*l*i-C*s*o+t*l*o+r*s*c-t*g*c)*D,A[7]=(r*Q*i-I*g*i+I*s*o-t*Q*o-r*s*h+t*g*h)*D,A[8]=y*D,A[9]=(C*B*i-I*E*i-C*e*h+t*E*h+I*e*c-t*B*c)*D,A[10]=(r*E*i-C*a*i+C*e*o-t*E*o-r*e*c+t*a*c)*D,A[11]=(I*a*i-r*B*i-I*e*o+t*B*o+r*e*h-t*a*h)*D,A[12]=p*D,A[13]=(I*E*s-C*B*s+C*e*Q-t*E*Q-I*e*l+t*B*l)*D,A[14]=(C*a*s-r*E*s-C*e*g+t*E*g+r*e*l-t*a*l)*D,A[15]=(r*B*s-I*a*s+I*e*g-t*B*g-r*e*Q+t*a*Q)*D,this}scale(A){const t=this.elements,e=A.x,s=A.y,i=A.z;return t[0]*=e,t[4]*=s,t[8]*=i,t[1]*=e,t[5]*=s,t[9]*=i,t[2]*=e,t[6]*=s,t[10]*=i,t[3]*=e,t[7]*=s,t[11]*=i,this}getMaxScaleOnAxis(){const A=this.elements,t=A[0]*A[0]+A[1]*A[1]+A[2]*A[2],e=A[4]*A[4]+A[5]*A[5]+A[6]*A[6],s=A[8]*A[8]+A[9]*A[9]+A[10]*A[10];return Math.sqrt(Math.max(t,e,s))}makeTranslation(A,t,e){return A.isVector3?this.set(1,0,0,A.x,0,1,0,A.y,0,0,1,A.z,0,0,0,1):this.set(1,0,0,A,0,1,0,t,0,0,1,e,0,0,0,1),this}makeRotationX(A){const t=Math.cos(A),e=Math.sin(A);return this.set(1,0,0,0,0,t,-e,0,0,e,t,0,0,0,0,1),this}makeRotationY(A){const t=Math.cos(A),e=Math.sin(A);return this.set(t,0,e,0,0,1,0,0,-e,0,t,0,0,0,0,1),this}makeRotationZ(A){const t=Math.cos(A),e=Math.sin(A);return this.set(t,-e,0,0,e,t,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(A,t){const e=Math.cos(t),s=Math.sin(t),i=1-e,r=A.x,a=A.y,g=A.z,o=i*r,I=i*a;return this.set(o*r+e,o*a-s*g,o*g+s*a,0,o*a+s*g,I*a+e,I*g-s*r,0,o*g-s*a,I*g+s*r,i*g*g+e,0,0,0,0,1),this}makeScale(A,t,e){return this.set(A,0,0,0,0,t,0,0,0,0,e,0,0,0,0,1),this}makeShear(A,t,e,s,i,r){return this.set(1,e,i,0,A,1,r,0,t,s,1,0,0,0,0,1),this}compose(A,t,e){const s=this.elements,i=t._x,r=t._y,a=t._z,g=t._w,o=i+i,I=r+r,B=a+a,Q=i*o,h=i*I,C=i*B,E=r*I,l=r*B,c=a*B,u=g*o,d=g*I,y=g*B,p=e.x,x=e.y,D=e.z;return s[0]=(1-(E+c))*p,s[1]=(h+y)*p,s[2]=(C-d)*p,s[3]=0,s[4]=(h-y)*x,s[5]=(1-(Q+c))*x,s[6]=(l+u)*x,s[7]=0,s[8]=(C+d)*D,s[9]=(l-u)*D,s[10]=(1-(Q+E))*D,s[11]=0,s[12]=A.x,s[13]=A.y,s[14]=A.z,s[15]=1,this}decompose(A,t,e){const s=this.elements;let i=_t.set(s[0],s[1],s[2]).length();const r=_t.set(s[4],s[5],s[6]).length(),a=_t.set(s[8],s[9],s[10]).length();this.determinant()<0&&(i=-i),A.x=s[12],A.y=s[13],A.z=s[14],qA.copy(this);const o=1/i,I=1/r,B=1/a;return qA.elements[0]*=o,qA.elements[1]*=o,qA.elements[2]*=o,qA.elements[4]*=I,qA.elements[5]*=I,qA.elements[6]*=I,qA.elements[8]*=B,qA.elements[9]*=B,qA.elements[10]*=B,t.setFromRotationMatrix(qA),e.x=i,e.y=r,e.z=a,this}makePerspective(A,t,e,s,i,r,a=Ce){const g=this.elements,o=2*i/(t-A),I=2*i/(e-s),B=(t+A)/(t-A),Q=(e+s)/(e-s);let h,C;if(a===Ce)h=-(r+i)/(r-i),C=-2*r*i/(r-i);else if(a===nn)h=-r/(r-i),C=-r*i/(r-i);else throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+a);return g[0]=o,g[4]=0,g[8]=B,g[12]=0,g[1]=0,g[5]=I,g[9]=Q,g[13]=0,g[2]=0,g[6]=0,g[10]=h,g[14]=C,g[3]=0,g[7]=0,g[11]=-1,g[15]=0,this}makeOrthographic(A,t,e,s,i,r,a=Ce){const g=this.elements,o=1/(t-A),I=1/(e-s),B=1/(r-i),Q=(t+A)*o,h=(e+s)*I;let C,E;if(a===Ce)C=(r+i)*B,E=-2*B;else if(a===nn)C=i*B,E=-1*B;else throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+a);return g[0]=2*o,g[4]=0,g[8]=0,g[12]=-Q,g[1]=0,g[5]=2*I,g[9]=0,g[13]=-h,g[2]=0,g[6]=0,g[10]=E,g[14]=-C,g[3]=0,g[7]=0,g[11]=0,g[15]=1,this}equals(A){const t=this.elements,e=A.elements;for(let s=0;s<16;s++)if(t[s]!==e[s])return!1;return!0}fromArray(A,t=0){for(let e=0;e<16;e++)this.elements[e]=A[e+t];return this}toArray(A=[],t=0){const e=this.elements;return A[t]=e[0],A[t+1]=e[1],A[t+2]=e[2],A[t+3]=e[3],A[t+4]=e[4],A[t+5]=e[5],A[t+6]=e[6],A[t+7]=e[7],A[t+8]=e[8],A[t+9]=e[9],A[t+10]=e[10],A[t+11]=e[11],A[t+12]=e[12],A[t+13]=e[13],A[t+14]=e[14],A[t+15]=e[15],A}}const _t=new f,qA=new cA,sa=new f(0,0,0),ia=new f(1,1,1),ft=new f,Ke=new f,NA=new f,hn=new cA,Cn=new gA;class Nt{constructor(A=0,t=0,e=0,s=Nt.DEFAULT_ORDER){this.isEuler=!0,this._x=A,this._y=t,this._z=e,this._order=s}get x(){return this._x}set x(A){this._x=A,this._onChangeCallback()}get y(){return this._y}set y(A){this._y=A,this._onChangeCallback()}get z(){return this._z}set z(A){this._z=A,this._onChangeCallback()}get order(){return this._order}set order(A){this._order=A,this._onChangeCallback()}set(A,t,e,s=this._order){return this._x=A,this._y=t,this._z=e,this._order=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(A){return this._x=A._x,this._y=A._y,this._z=A._z,this._order=A._order,this._onChangeCallback(),this}setFromRotationMatrix(A,t=this._order,e=!0){const s=A.elements,i=s[0],r=s[4],a=s[8],g=s[1],o=s[5],I=s[9],B=s[2],Q=s[6],h=s[10];switch(t){case"XYZ":this._y=Math.asin(v(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-I,h),this._z=Math.atan2(-r,i)):(this._x=Math.atan2(Q,o),this._z=0);break;case"YXZ":this._x=Math.asin(-v(I,-1,1)),Math.abs(I)<.9999999?(this._y=Math.atan2(a,h),this._z=Math.atan2(g,o)):(this._y=Math.atan2(-B,i),this._z=0);break;case"ZXY":this._x=Math.asin(v(Q,-1,1)),Math.abs(Q)<.9999999?(this._y=Math.atan2(-B,h),this._z=Math.atan2(-r,o)):(this._y=0,this._z=Math.atan2(g,i));break;case"ZYX":this._y=Math.asin(-v(B,-1,1)),Math.abs(B)<.9999999?(this._x=Math.atan2(Q,h),this._z=Math.atan2(g,i)):(this._x=0,this._z=Math.atan2(-r,o));break;case"YZX":this._z=Math.asin(v(g,-1,1)),Math.abs(g)<.9999999?(this._x=Math.atan2(-I,o),this._y=Math.atan2(-B,i)):(this._x=0,this._y=Math.atan2(a,h));break;case"XZY":this._z=Math.asin(-v(r,-1,1)),Math.abs(r)<.9999999?(this._x=Math.atan2(Q,o),this._y=Math.atan2(a,i)):(this._x=Math.atan2(-I,h),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+t)}return this._order=t,e===!0&&this._onChangeCallback(),this}setFromQuaternion(A,t,e){return hn.makeRotationFromQuaternion(A),this.setFromRotationMatrix(hn,t,e)}setFromVector3(A,t=this._order){return this.set(A.x,A.y,A.z,t)}reorder(A){return Cn.setFromEuler(this),this.setFromQuaternion(Cn,A)}equals(A){return A._x===this._x&&A._y===this._y&&A._z===this._z&&A._order===this._order}fromArray(A){return this._x=A[0],this._y=A[1],this._z=A[2],A[3]!==void 0&&(this._order=A[3]),this._onChangeCallback(),this}toArray(A=[],t=0){return A[t]=this._x,A[t+1]=this._y,A[t+2]=this._z,A[t+3]=this._order,A}_onChange(A){return this._onChangeCallback=A,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}Nt.DEFAULT_ORDER="XYZ";class na{constructor(){this.mask=1}set(A){this.mask=(1<<A|0)>>>0}enable(A){this.mask|=1<<A|0}enableAll(){this.mask=-1}toggle(A){this.mask^=1<<A|0}disable(A){this.mask&=~(1<<A|0)}disableAll(){this.mask=0}test(A){return(this.mask&A.mask)!==0}isEnabled(A){return(this.mask&(1<<A|0))!==0}}let ra=0;const En=new f,Zt=new gA,it=new cA,qe=new f,fe=new f,aa=new f,ga=new gA,cn=new f(1,0,0),ln=new f(0,1,0),un=new f(0,0,1),dn={type:"added"},oa={type:"removed"},Wt={type:"childadded",child:null},Ks={type:"childremoved",child:null};class mA extends Ee{constructor(){super(),this.isObject3D=!0,Object.defineProperty(this,"id",{value:ra++}),this.uuid=ce(),this.name="",this.type="Object3D",this.parent=null,this.children=[],this.up=mA.DEFAULT_UP.clone();const A=new f,t=new Nt,e=new gA,s=new f(1,1,1);function i(){e.setFromEuler(t,!1)}function r(){t.setFromQuaternion(e,void 0,!1)}t._onChange(i),e._onChange(r),Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:A},rotation:{configurable:!0,enumerable:!0,value:t},quaternion:{configurable:!0,enumerable:!0,value:e},scale:{configurable:!0,enumerable:!0,value:s},modelViewMatrix:{value:new cA},normalMatrix:{value:new jA}}),this.matrix=new cA,this.matrixWorld=new cA,this.matrixAutoUpdate=mA.DEFAULT_MATRIX_AUTO_UPDATE,this.matrixWorldAutoUpdate=mA.DEFAULT_MATRIX_WORLD_AUTO_UPDATE,this.matrixWorldNeedsUpdate=!1,this.layers=new na,this.visible=!0,this.castShadow=!1,this.receiveShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.animations=[],this.userData={}}onBeforeShadow(){}onAfterShadow(){}onBeforeRender(){}onAfterRender(){}applyMatrix4(A){this.matrixAutoUpdate&&this.updateMatrix(),this.matrix.premultiply(A),this.matrix.decompose(this.position,this.quaternion,this.scale)}applyQuaternion(A){return this.quaternion.premultiply(A),this}setRotationFromAxisAngle(A,t){this.quaternion.setFromAxisAngle(A,t)}setRotationFromEuler(A){this.quaternion.setFromEuler(A,!0)}setRotationFromMatrix(A){this.quaternion.setFromRotationMatrix(A)}setRotationFromQuaternion(A){this.quaternion.copy(A)}rotateOnAxis(A,t){return Zt.setFromAxisAngle(A,t),this.quaternion.multiply(Zt),this}rotateOnWorldAxis(A,t){return Zt.setFromAxisAngle(A,t),this.quaternion.premultiply(Zt),this}rotateX(A){return this.rotateOnAxis(cn,A)}rotateY(A){return this.rotateOnAxis(ln,A)}rotateZ(A){return this.rotateOnAxis(un,A)}translateOnAxis(A,t){return En.copy(A).applyQuaternion(this.quaternion),this.position.add(En.multiplyScalar(t)),this}translateX(A){return this.translateOnAxis(cn,A)}translateY(A){return this.translateOnAxis(ln,A)}translateZ(A){return this.translateOnAxis(un,A)}localToWorld(A){return this.updateWorldMatrix(!0,!1),A.applyMatrix4(this.matrixWorld)}worldToLocal(A){return this.updateWorldMatrix(!0,!1),A.applyMatrix4(it.copy(this.matrixWorld).invert())}lookAt(A,t,e){A.isVector3?qe.copy(A):qe.set(A,t,e);const s=this.parent;this.updateWorldMatrix(!0,!1),fe.setFromMatrixPosition(this.matrixWorld),this.isCamera||this.isLight?it.lookAt(fe,qe,this.up):it.lookAt(qe,fe,this.up),this.quaternion.setFromRotationMatrix(it),s&&(it.extractRotation(s.matrixWorld),Zt.setFromRotationMatrix(it),this.quaternion.premultiply(Zt.invert()))}add(A){if(arguments.length>1){for(let t=0;t<arguments.length;t++)this.add(arguments[t]);return this}return A===this?(console.error("THREE.Object3D.add: object can\'t be added as a child of itself.",A),this):(A&&A.isObject3D?(A.removeFromParent(),A.parent=this,this.children.push(A),A.dispatchEvent(dn),Wt.child=A,this.dispatchEvent(Wt),Wt.child=null):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",A),this)}remove(A){if(arguments.length>1){for(let e=0;e<arguments.length;e++)this.remove(arguments[e]);return this}const t=this.children.indexOf(A);return t!==-1&&(A.parent=null,this.children.splice(t,1),A.dispatchEvent(oa),Ks.child=A,this.dispatchEvent(Ks),Ks.child=null),this}removeFromParent(){const A=this.parent;return A!==null&&A.remove(this),this}clear(){return this.remove(...this.children)}attach(A){return this.updateWorldMatrix(!0,!1),it.copy(this.matrixWorld).invert(),A.parent!==null&&(A.parent.updateWorldMatrix(!0,!1),it.multiply(A.parent.matrixWorld)),A.applyMatrix4(it),A.removeFromParent(),A.parent=this,this.children.push(A),A.updateWorldMatrix(!1,!0),A.dispatchEvent(dn),Wt.child=A,this.dispatchEvent(Wt),Wt.child=null,this}getObjectById(A){return this.getObjectByProperty("id",A)}getObjectByName(A){return this.getObjectByProperty("name",A)}getObjectByProperty(A,t){if(this[A]===t)return this;for(let e=0,s=this.children.length;e<s;e++){const r=this.children[e].getObjectByProperty(A,t);if(r!==void 0)return r}}getObjectsByProperty(A,t,e=[]){this[A]===t&&e.push(this);const s=this.children;for(let i=0,r=s.length;i<r;i++)s[i].getObjectsByProperty(A,t,e);return e}getWorldPosition(A){return this.updateWorldMatrix(!0,!1),A.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(A){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(fe,A,aa),A}getWorldScale(A){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(fe,ga,A),A}getWorldDirection(A){this.updateWorldMatrix(!0,!1);const t=this.matrixWorld.elements;return A.set(t[8],t[9],t[10]).normalize()}raycast(){}traverse(A){A(this);const t=this.children;for(let e=0,s=t.length;e<s;e++)t[e].traverse(A)}traverseVisible(A){if(this.visible===!1)return;A(this);const t=this.children;for(let e=0,s=t.length;e<s;e++)t[e].traverseVisible(A)}traverseAncestors(A){const t=this.parent;t!==null&&(A(t),t.traverseAncestors(A))}updateMatrix(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0}updateMatrixWorld(A){this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||A)&&(this.matrixWorldAutoUpdate===!0&&(this.parent===null?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix)),this.matrixWorldNeedsUpdate=!1,A=!0);const t=this.children;for(let e=0,s=t.length;e<s;e++)t[e].updateMatrixWorld(A)}updateWorldMatrix(A,t){const e=this.parent;if(A===!0&&e!==null&&e.updateWorldMatrix(!0,!1),this.matrixAutoUpdate&&this.updateMatrix(),this.matrixWorldAutoUpdate===!0&&(this.parent===null?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix)),t===!0){const s=this.children;for(let i=0,r=s.length;i<r;i++)s[i].updateWorldMatrix(!1,!0)}}toJSON(A){const t=A===void 0||typeof A=="string",e={};t&&(A={geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{},nodes:{}},e.metadata={version:4.6,type:"Object",generator:"Object3D.toJSON"});const s={};s.uuid=this.uuid,s.type=this.type,this.name!==""&&(s.name=this.name),this.castShadow===!0&&(s.castShadow=!0),this.receiveShadow===!0&&(s.receiveShadow=!0),this.visible===!1&&(s.visible=!1),this.frustumCulled===!1&&(s.frustumCulled=!1),this.renderOrder!==0&&(s.renderOrder=this.renderOrder),Object.keys(this.userData).length>0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),this.matrixAutoUpdate===!1&&(s.matrixAutoUpdate=!1),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.visibility=this._visibility,s.active=this._active,s.bounds=this._bounds.map(a=>({boxInitialized:a.boxInitialized,boxMin:a.box.min.toArray(),boxMax:a.box.max.toArray(),sphereInitialized:a.sphereInitialized,sphereRadius:a.sphere.radius,sphereCenter:a.sphere.center.toArray()})),s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.geometryCount=this._geometryCount,s.matricesTexture=this._matricesTexture.toJSON(A),this._colorsTexture!==null&&(s.colorsTexture=this._colorsTexture.toJSON(A)),this.boundingSphere!==null&&(s.boundingSphere={center:s.boundingSphere.center.toArray(),radius:s.boundingSphere.radius}),this.boundingBox!==null&&(s.boundingBox={min:s.boundingBox.min.toArray(),max:s.boundingBox.max.toArray()}));function i(a,g){return a[g.uuid]===void 0&&(a[g.uuid]=g.toJSON(A)),g.uuid}if(this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(A).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(s.environment=this.environment.toJSON(A).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=i(A.geometries,this.geometry);const a=this.geometry.parameters;if(a!==void 0&&a.shapes!==void 0){const g=a.shapes;if(Array.isArray(g))for(let o=0,I=g.length;o<I;o++){const B=g[o];i(A.shapes,B)}else i(A.shapes,g)}}if(this.isSkinnedMesh&&(s.bindMode=this.bindMode,s.bindMatrix=this.bindMatrix.toArray(),this.skeleton!==void 0&&(i(A.skeletons,this.skeleton),s.skeleton=this.skeleton.uuid)),this.material!==void 0)if(Array.isArray(this.material)){const a=[];for(let g=0,o=this.material.length;g<o;g++)a.push(i(A.materials,this.material[g]));s.material=a}else s.material=i(A.materials,this.material);if(this.children.length>0){s.children=[];for(let a=0;a<this.children.length;a++)s.children.push(this.children[a].toJSON(A).object)}if(this.animations.length>0){s.animations=[];for(let a=0;a<this.animations.length;a++){const g=this.animations[a];s.animations.push(i(A.animations,g))}}if(t){const a=r(A.geometries),g=r(A.materials),o=r(A.textures),I=r(A.images),B=r(A.shapes),Q=r(A.skeletons),h=r(A.animations),C=r(A.nodes);a.length>0&&(e.geometries=a),g.length>0&&(e.materials=g),o.length>0&&(e.textures=o),I.length>0&&(e.images=I),B.length>0&&(e.shapes=B),Q.length>0&&(e.skeletons=Q),h.length>0&&(e.animations=h),C.length>0&&(e.nodes=C)}return e.object=s,e;function r(a){const g=[];for(const o in a){const I=a[o];delete I.metadata,g.push(I)}return g}}clone(A){return new this.constructor().copy(this,A)}copy(A,t=!0){if(this.name=A.name,this.up.copy(A.up),this.position.copy(A.position),this.rotation.order=A.rotation.order,this.quaternion.copy(A.quaternion),this.scale.copy(A.scale),this.matrix.copy(A.matrix),this.matrixWorld.copy(A.matrixWorld),this.matrixAutoUpdate=A.matrixAutoUpdate,this.matrixWorldAutoUpdate=A.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=A.matrixWorldNeedsUpdate,this.layers.mask=A.layers.mask,this.visible=A.visible,this.castShadow=A.castShadow,this.receiveShadow=A.receiveShadow,this.frustumCulled=A.frustumCulled,this.renderOrder=A.renderOrder,this.animations=A.animations.slice(),this.userData=JSON.parse(JSON.stringify(A.userData)),t===!0)for(let e=0;e<A.children.length;e++){const s=A.children[e];this.add(s.clone())}return this}}mA.DEFAULT_UP=new f(0,1,0),mA.DEFAULT_MATRIX_AUTO_UPDATE=!0,mA.DEFAULT_MATRIX_WORLD_AUTO_UPDATE=!0;const _A=new f,nt=new f,qs=new f,rt=new f,Ot=new f,Pt=new f,fn=new f,_s=new f,Zs=new f,Ws=new f,Os=new fA,Ps=new fA,Vs=new fA;class ZA{constructor(A=new f,t=new f,e=new f){this.a=A,this.b=t,this.c=e}static getNormal(A,t,e,s){s.subVectors(e,t),_A.subVectors(A,t),s.cross(_A);const i=s.lengthSq();return i>0?s.multiplyScalar(1/Math.sqrt(i)):s.set(0,0,0)}static getBarycoord(A,t,e,s,i){_A.subVectors(s,t),nt.subVectors(e,t),qs.subVectors(A,t);const r=_A.dot(_A),a=_A.dot(nt),g=_A.dot(qs),o=nt.dot(nt),I=nt.dot(qs),B=r*o-a*a;if(B===0)return i.set(0,0,0),null;const Q=1/B,h=(o*g-a*I)*Q,C=(r*I-a*g)*Q;return i.set(1-h-C,C,h)}static containsPoint(A,t,e,s){return this.getBarycoord(A,t,e,s,rt)===null?!1:rt.x>=0&&rt.y>=0&&rt.x+rt.y<=1}static getInterpolation(A,t,e,s,i,r,a,g){return this.getBarycoord(A,t,e,s,rt)===null?(g.x=0,g.y=0,"z"in g&&(g.z=0),"w"in g&&(g.w=0),null):(g.setScalar(0),g.addScaledVector(i,rt.x),g.addScaledVector(r,rt.y),g.addScaledVector(a,rt.z),g)}static getInterpolatedAttribute(A,t,e,s,i,r){return Os.setScalar(0),Ps.setScalar(0),Vs.setScalar(0),Os.fromBufferAttribute(A,t),Ps.fromBufferAttribute(A,e),Vs.fromBufferAttribute(A,s),r.setScalar(0),r.addScaledVector(Os,i.x),r.addScaledVector(Ps,i.y),r.addScaledVector(Vs,i.z),r}static isFrontFacing(A,t,e,s){return _A.subVectors(e,t),nt.subVectors(A,t),_A.cross(nt).dot(s)<0}set(A,t,e){return this.a.copy(A),this.b.copy(t),this.c.copy(e),this}setFromPointsAndIndices(A,t,e,s){return this.a.copy(A[t]),this.b.copy(A[e]),this.c.copy(A[s]),this}setFromAttributeAndIndices(A,t,e,s){return this.a.fromBufferAttribute(A,t),this.b.fromBufferAttribute(A,e),this.c.fromBufferAttribute(A,s),this}clone(){return new this.constructor().copy(this)}copy(A){return this.a.copy(A.a),this.b.copy(A.b),this.c.copy(A.c),this}getArea(){return _A.subVectors(this.c,this.b),nt.subVectors(this.a,this.b),_A.cross(nt).length()*.5}getMidpoint(A){return A.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(A){return ZA.getNormal(this.a,this.b,this.c,A)}getPlane(A){return A.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(A,t){return ZA.getBarycoord(A,this.a,this.b,this.c,t)}getInterpolation(A,t,e,s,i){return ZA.getInterpolation(A,this.a,this.b,this.c,t,e,s,i)}containsPoint(A){return ZA.containsPoint(A,this.a,this.b,this.c)}isFrontFacing(A){return ZA.isFrontFacing(this.a,this.b,this.c,A)}intersectsBox(A){return A.intersectsTriangle(this)}closestPointToPoint(A,t){const e=this.a,s=this.b,i=this.c;let r,a;Ot.subVectors(s,e),Pt.subVectors(i,e),_s.subVectors(A,e);const g=Ot.dot(_s),o=Pt.dot(_s);if(g<=0&&o<=0)return t.copy(e);Zs.subVectors(A,s);const I=Ot.dot(Zs),B=Pt.dot(Zs);if(I>=0&&B<=I)return t.copy(s);const Q=g*B-I*o;if(Q<=0&&g>=0&&I<=0)return r=g/(g-I),t.copy(e).addScaledVector(Ot,r);Ws.subVectors(A,i);const h=Ot.dot(Ws),C=Pt.dot(Ws);if(C>=0&&h<=C)return t.copy(i);const E=h*o-g*C;if(E<=0&&o>=0&&C<=0)return a=o/(o-C),t.copy(e).addScaledVector(Pt,a);const l=I*C-h*B;if(l<=0&&B-I>=0&&h-C>=0)return fn.subVectors(i,s),a=(B-I)/(B-I+(h-C)),t.copy(s).addScaledVector(fn,a);const c=1/(l+E+Q);return r=E*c,a=Q*c,t.copy(e).addScaledVector(Ot,r).addScaledVector(Pt,a)}equals(A){return A.a.equals(this.a)&&A.b.equals(this.b)&&A.c.equals(this.c)}}const yn={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},yt={h:0,s:0,l:0},_e={h:0,s:0,l:0};function Xs(n,A,t){return t<0&&(t+=1),t>1&&(t-=1),t<1/6?n+(A-n)*6*t:t<1/2?A:t<2/3?n+(A-n)*6*(2/3-t):n}class kt{constructor(A,t,e){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(A,t,e)}set(A,t,e){if(t===void 0&&e===void 0){const s=A;s&&s.isColor?this.copy(s):typeof s=="number"?this.setHex(s):typeof s=="string"&&this.setStyle(s)}else this.setRGB(A,t,e);return this}setScalar(A){return this.r=A,this.g=A,this.b=A,this}setHex(A,t=HA){return A=Math.floor(A),this.r=(A>>16&255)/255,this.g=(A>>8&255)/255,this.b=(A&255)/255,zA.toWorkingColorSpace(this,t),this}setRGB(A,t,e,s=zA.workingColorSpace){return this.r=A,this.g=t,this.b=e,zA.toWorkingColorSpace(this,s),this}setHSL(A,t,e,s=zA.workingColorSpace){if(A=Wr(A,1),t=v(t,0,1),e=v(e,0,1),t===0)this.r=this.g=this.b=e;else{const i=e<=.5?e*(1+t):e+t-e*t,r=2*e-i;this.r=Xs(r,i,A+1/3),this.g=Xs(r,i,A),this.b=Xs(r,i,A-1/3)}return zA.toWorkingColorSpace(this,s),this}setStyle(A,t=HA){function e(i){i!==void 0&&parseFloat(i)<1&&console.warn("THREE.Color: Alpha component of "+A+" will be ignored.")}let s;if(s=/^(\\w+)\\(([^\\)]*)\\)/.exec(A)){let i;const r=s[1],a=s[2];switch(r){case"rgb":case"rgba":if(i=/^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(a))return e(i[4]),this.setRGB(Math.min(255,parseInt(i[1],10))/255,Math.min(255,parseInt(i[2],10))/255,Math.min(255,parseInt(i[3],10))/255,t);if(i=/^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(a))return e(i[4]),this.setRGB(Math.min(100,parseInt(i[1],10))/100,Math.min(100,parseInt(i[2],10))/100,Math.min(100,parseInt(i[3],10))/100,t);break;case"hsl":case"hsla":if(i=/^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(a))return e(i[4]),this.setHSL(parseFloat(i[1])/360,parseFloat(i[2])/100,parseFloat(i[3])/100,t);break;default:console.warn("THREE.Color: Unknown color model "+A)}}else if(s=/^\\#([A-Fa-f\\d]+)$/.exec(A)){const i=s[1],r=i.length;if(r===3)return this.setRGB(parseInt(i.charAt(0),16)/15,parseInt(i.charAt(1),16)/15,parseInt(i.charAt(2),16)/15,t);if(r===6)return this.setHex(parseInt(i,16),t);console.warn("THREE.Color: Invalid hex color "+A)}else if(A&&A.length>0)return this.setColorName(A,t);return this}setColorName(A,t=HA){const e=yn[A.toLowerCase()];return e!==void 0?this.setHex(e,t):console.warn("THREE.Color: Unknown color "+A),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(A){return this.r=A.r,this.g=A.g,this.b=A.b,this}copySRGBToLinear(A){return this.r=tt(A.r),this.g=tt(A.g),this.b=tt(A.b),this}copyLinearToSRGB(A){return this.r=Tt(A.r),this.g=Tt(A.g),this.b=Tt(A.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(A=HA){return zA.fromWorkingColorSpace(lA.copy(this),A),Math.round(v(lA.r*255,0,255))*65536+Math.round(v(lA.g*255,0,255))*256+Math.round(v(lA.b*255,0,255))}getHexString(A=HA){return("000000"+this.getHex(A).toString(16)).slice(-6)}getHSL(A,t=zA.workingColorSpace){zA.fromWorkingColorSpace(lA.copy(this),t);const e=lA.r,s=lA.g,i=lA.b,r=Math.max(e,s,i),a=Math.min(e,s,i);let g,o;const I=(a+r)/2;if(a===r)g=0,o=0;else{const B=r-a;switch(o=I<=.5?B/(r+a):B/(2-r-a),r){case e:g=(s-i)/B+(s<i?6:0);break;case s:g=(i-e)/B+2;break;case i:g=(e-s)/B+4;break}g/=6}return A.h=g,A.s=o,A.l=I,A}getRGB(A,t=zA.workingColorSpace){return zA.fromWorkingColorSpace(lA.copy(this),t),A.r=lA.r,A.g=lA.g,A.b=lA.b,A}getStyle(A=HA){zA.fromWorkingColorSpace(lA.copy(this),A);const t=lA.r,e=lA.g,s=lA.b;return A!==HA?`color(${A} ${t.toFixed(3)} ${e.toFixed(3)} ${s.toFixed(3)})`:`rgb(${Math.round(t*255)},${Math.round(e*255)},${Math.round(s*255)})`}offsetHSL(A,t,e){return this.getHSL(yt),this.setHSL(yt.h+A,yt.s+t,yt.l+e)}add(A){return this.r+=A.r,this.g+=A.g,this.b+=A.b,this}addColors(A,t){return this.r=A.r+t.r,this.g=A.g+t.g,this.b=A.b+t.b,this}addScalar(A){return this.r+=A,this.g+=A,this.b+=A,this}sub(A){return this.r=Math.max(0,this.r-A.r),this.g=Math.max(0,this.g-A.g),this.b=Math.max(0,this.b-A.b),this}multiply(A){return this.r*=A.r,this.g*=A.g,this.b*=A.b,this}multiplyScalar(A){return this.r*=A,this.g*=A,this.b*=A,this}lerp(A,t){return this.r+=(A.r-this.r)*t,this.g+=(A.g-this.g)*t,this.b+=(A.b-this.b)*t,this}lerpColors(A,t,e){return this.r=A.r+(t.r-A.r)*e,this.g=A.g+(t.g-A.g)*e,this.b=A.b+(t.b-A.b)*e,this}lerpHSL(A,t){this.getHSL(yt),A.getHSL(_e);const e=Gs(yt.h,_e.h,t),s=Gs(yt.s,_e.s,t),i=Gs(yt.l,_e.l,t);return this.setHSL(e,s,i),this}setFromVector3(A){return this.r=A.x,this.g=A.y,this.b=A.z,this}applyMatrix3(A){const t=this.r,e=this.g,s=this.b,i=A.elements;return this.r=i[0]*t+i[3]*e+i[6]*s,this.g=i[1]*t+i[4]*e+i[7]*s,this.b=i[2]*t+i[5]*e+i[8]*s,this}equals(A){return A.r===this.r&&A.g===this.g&&A.b===this.b}fromArray(A,t=0){return this.r=A[t],this.g=A[t+1],this.b=A[t+2],this}toArray(A=[],t=0){return A[t]=this.r,A[t+1]=this.g,A[t+2]=this.b,A}fromBufferAttribute(A,t){return this.r=A.getX(t),this.g=A.getY(t),this.b=A.getZ(t),this}toJSON(){return this.getHex()}*[Symbol.iterator](){yield this.r,yield this.g,yield this.b}}const lA=new kt;kt.NAMES=yn;let Ia=0;class wn extends Ee{constructor(){super(),this.isMaterial=!0,Object.defineProperty(this,"id",{value:Ia++}),this.uuid=ce(),this.name="",this.type="Material",this.blending=qi,this.side=Rs,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.alphaHash=!1,this.blendSrc=Zi,this.blendDst=Wi,this.blendEquation=_i,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.blendColor=new kt(0,0,0),this.blendAlpha=0,this.depthFunc=Oi,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=en,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=Jt,this.stencilZFail=Jt,this.stencilZPass=Jt,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.forceSinglePass=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(A){this._alphaTest>0!=A>0&&this.version++,this._alphaTest=A}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(A){if(A!==void 0)for(const t in A){const e=A[t];if(e===void 0){console.warn(`THREE.Material: parameter \'${t}\' has value of undefined.`);continue}const s=this[t];if(s===void 0){console.warn(`THREE.Material: \'${t}\' is not a property of THREE.${this.type}.`);continue}s&&s.isColor?s.set(e):s&&s.isVector3&&e&&e.isVector3?s.copy(e):this[t]=e}}toJSON(A){const t=A===void 0||typeof A=="string";t&&(A={textures:{},images:{}});const e={metadata:{version:4.6,type:"Material",generator:"Material.toJSON"}};e.uuid=this.uuid,e.type=this.type,this.name!==""&&(e.name=this.name),this.color&&this.color.isColor&&(e.color=this.color.getHex()),this.roughness!==void 0&&(e.roughness=this.roughness),this.metalness!==void 0&&(e.metalness=this.metalness),this.sheen!==void 0&&(e.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(e.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(e.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(e.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(e.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(e.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(e.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(e.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(e.shininess=this.shininess),this.clearcoat!==void 0&&(e.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(e.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(e.clearcoatMap=this.clearcoatMap.toJSON(A).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(e.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(A).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(e.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(A).uuid,e.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.dispersion!==void 0&&(e.dispersion=this.dispersion),this.iridescence!==void 0&&(e.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(e.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(e.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(e.iridescenceMap=this.iridescenceMap.toJSON(A).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(e.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(A).uuid),this.anisotropy!==void 0&&(e.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(e.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(e.anisotropyMap=this.anisotropyMap.toJSON(A).uuid),this.map&&this.map.isTexture&&(e.map=this.map.toJSON(A).uuid),this.matcap&&this.matcap.isTexture&&(e.matcap=this.matcap.toJSON(A).uuid),this.alphaMap&&this.alphaMap.isTexture&&(e.alphaMap=this.alphaMap.toJSON(A).uuid),this.lightMap&&this.lightMap.isTexture&&(e.lightMap=this.lightMap.toJSON(A).uuid,e.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(e.aoMap=this.aoMap.toJSON(A).uuid,e.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(e.bumpMap=this.bumpMap.toJSON(A).uuid,e.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(e.normalMap=this.normalMap.toJSON(A).uuid,e.normalMapType=this.normalMapType,e.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(e.displacementMap=this.displacementMap.toJSON(A).uuid,e.displacementScale=this.displacementScale,e.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(e.roughnessMap=this.roughnessMap.toJSON(A).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(e.metalnessMap=this.metalnessMap.toJSON(A).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(e.emissiveMap=this.emissiveMap.toJSON(A).uuid),this.specularMap&&this.specularMap.isTexture&&(e.specularMap=this.specularMap.toJSON(A).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(e.specularIntensityMap=this.specularIntensityMap.toJSON(A).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(e.specularColorMap=this.specularColorMap.toJSON(A).uuid),this.envMap&&this.envMap.isTexture&&(e.envMap=this.envMap.toJSON(A).uuid,this.combine!==void 0&&(e.combine=this.combine)),this.envMapRotation!==void 0&&(e.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(e.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(e.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(e.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(e.gradientMap=this.gradientMap.toJSON(A).uuid),this.transmission!==void 0&&(e.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(e.transmissionMap=this.transmissionMap.toJSON(A).uuid),this.thickness!==void 0&&(e.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(e.thicknessMap=this.thicknessMap.toJSON(A).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(e.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(e.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(e.size=this.size),this.shadowSide!==null&&(e.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(e.sizeAttenuation=this.sizeAttenuation),this.blending!==qi&&(e.blending=this.blending),this.side!==Rs&&(e.side=this.side),this.vertexColors===!0&&(e.vertexColors=!0),this.opacity<1&&(e.opacity=this.opacity),this.transparent===!0&&(e.transparent=!0),this.blendSrc!==Zi&&(e.blendSrc=this.blendSrc),this.blendDst!==Wi&&(e.blendDst=this.blendDst),this.blendEquation!==_i&&(e.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(e.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(e.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(e.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(e.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(e.blendAlpha=this.blendAlpha),this.depthFunc!==Oi&&(e.depthFunc=this.depthFunc),this.depthTest===!1&&(e.depthTest=this.depthTest),this.depthWrite===!1&&(e.depthWrite=this.depthWrite),this.colorWrite===!1&&(e.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(e.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==en&&(e.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(e.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(e.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==Jt&&(e.stencilFail=this.stencilFail),this.stencilZFail!==Jt&&(e.stencilZFail=this.stencilZFail),this.stencilZPass!==Jt&&(e.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(e.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(e.rotation=this.rotation),this.polygonOffset===!0&&(e.polygonOffset=!0),this.polygonOffsetFactor!==0&&(e.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(e.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(e.linewidth=this.linewidth),this.dashSize!==void 0&&(e.dashSize=this.dashSize),this.gapSize!==void 0&&(e.gapSize=this.gapSize),this.scale!==void 0&&(e.scale=this.scale),this.dithering===!0&&(e.dithering=!0),this.alphaTest>0&&(e.alphaTest=this.alphaTest),this.alphaHash===!0&&(e.alphaHash=!0),this.alphaToCoverage===!0&&(e.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(e.premultipliedAlpha=!0),this.forceSinglePass===!0&&(e.forceSinglePass=!0),this.wireframe===!0&&(e.wireframe=!0),this.wireframeLinewidth>1&&(e.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(e.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(e.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(e.flatShading=!0),this.visible===!1&&(e.visible=!1),this.toneMapped===!1&&(e.toneMapped=!1),this.fog===!1&&(e.fog=!1),Object.keys(this.userData).length>0&&(e.userData=this.userData);function s(i){const r=[];for(const a in i){const g=i[a];delete g.metadata,r.push(g)}return r}if(t){const i=s(A.textures),r=s(A.images);i.length>0&&(e.textures=i),r.length>0&&(e.images=r)}return e}clone(){return new this.constructor().copy(this)}copy(A){this.name=A.name,this.blending=A.blending,this.side=A.side,this.vertexColors=A.vertexColors,this.opacity=A.opacity,this.transparent=A.transparent,this.blendSrc=A.blendSrc,this.blendDst=A.blendDst,this.blendEquation=A.blendEquation,this.blendSrcAlpha=A.blendSrcAlpha,this.blendDstAlpha=A.blendDstAlpha,this.blendEquationAlpha=A.blendEquationAlpha,this.blendColor.copy(A.blendColor),this.blendAlpha=A.blendAlpha,this.depthFunc=A.depthFunc,this.depthTest=A.depthTest,this.depthWrite=A.depthWrite,this.stencilWriteMask=A.stencilWriteMask,this.stencilFunc=A.stencilFunc,this.stencilRef=A.stencilRef,this.stencilFuncMask=A.stencilFuncMask,this.stencilFail=A.stencilFail,this.stencilZFail=A.stencilZFail,this.stencilZPass=A.stencilZPass,this.stencilWrite=A.stencilWrite;const t=A.clippingPlanes;let e=null;if(t!==null){const s=t.length;e=new Array(s);for(let i=0;i!==s;++i)e[i]=t[i].clone()}return this.clippingPlanes=e,this.clipIntersection=A.clipIntersection,this.clipShadows=A.clipShadows,this.shadowSide=A.shadowSide,this.colorWrite=A.colorWrite,this.precision=A.precision,this.polygonOffset=A.polygonOffset,this.polygonOffsetFactor=A.polygonOffsetFactor,this.polygonOffsetUnits=A.polygonOffsetUnits,this.dithering=A.dithering,this.alphaTest=A.alphaTest,this.alphaHash=A.alphaHash,this.alphaToCoverage=A.alphaToCoverage,this.premultipliedAlpha=A.premultipliedAlpha,this.forceSinglePass=A.forceSinglePass,this.visible=A.visible,this.toneMapped=A.toneMapped,this.userData=JSON.parse(JSON.stringify(A.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(A){A===!0&&this.version++}onBuild(){console.warn("Material: onBuild() has been removed.")}}class Ba extends wn{constructor(A){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new kt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Nt,this.combine=zr,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(A)}copy(A){return super.copy(A),this.color.copy(A.color),this.map=A.map,this.lightMap=A.lightMap,this.lightMapIntensity=A.lightMapIntensity,this.aoMap=A.aoMap,this.aoMapIntensity=A.aoMapIntensity,this.specularMap=A.specularMap,this.alphaMap=A.alphaMap,this.envMap=A.envMap,this.envMapRotation.copy(A.envMapRotation),this.combine=A.combine,this.reflectivity=A.reflectivity,this.refractionRatio=A.refractionRatio,this.wireframe=A.wireframe,this.wireframeLinewidth=A.wireframeLinewidth,this.wireframeLinecap=A.wireframeLinecap,this.wireframeLinejoin=A.wireframeLinejoin,this.fog=A.fog,this}}const iA=new f,Ze=new DA;class Vt{constructor(A,t,e=!1){if(Array.isArray(A))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,this.name="",this.array=A,this.itemSize=t,this.count=A!==void 0?A.length/t:0,this.normalized=e,this.usage=sn,this.updateRanges=[],this.gpuType=qr,this.version=0}onUploadCallback(){}set needsUpdate(A){A===!0&&this.version++}setUsage(A){return this.usage=A,this}addUpdateRange(A,t){this.updateRanges.push({start:A,count:t})}clearUpdateRanges(){this.updateRanges.length=0}copy(A){return this.name=A.name,this.array=new A.array.constructor(A.array),this.itemSize=A.itemSize,this.count=A.count,this.normalized=A.normalized,this.usage=A.usage,this.gpuType=A.gpuType,this}copyAt(A,t,e){A*=this.itemSize,e*=t.itemSize;for(let s=0,i=this.itemSize;s<i;s++)this.array[A+s]=t.array[e+s];return this}copyArray(A){return this.array.set(A),this}applyMatrix3(A){if(this.itemSize===2)for(let t=0,e=this.count;t<e;t++)Ze.fromBufferAttribute(this,t),Ze.applyMatrix3(A),this.setXY(t,Ze.x,Ze.y);else if(this.itemSize===3)for(let t=0,e=this.count;t<e;t++)iA.fromBufferAttribute(this,t),iA.applyMatrix3(A),this.setXYZ(t,iA.x,iA.y,iA.z);return this}applyMatrix4(A){for(let t=0,e=this.count;t<e;t++)iA.fromBufferAttribute(this,t),iA.applyMatrix4(A),this.setXYZ(t,iA.x,iA.y,iA.z);return this}applyNormalMatrix(A){for(let t=0,e=this.count;t<e;t++)iA.fromBufferAttribute(this,t),iA.applyNormalMatrix(A),this.setXYZ(t,iA.x,iA.y,iA.z);return this}transformDirection(A){for(let t=0,e=this.count;t<e;t++)iA.fromBufferAttribute(this,t),iA.transformDirection(A),this.setXYZ(t,iA.x,iA.y,iA.z);return this}set(A,t=0){return this.array.set(A,t),this}getComponent(A,t){let e=this.array[A*this.itemSize+t];return this.normalized&&(e=le(e,this.array)),e}setComponent(A,t,e){return this.normalized&&(e=pA(e,this.array)),this.array[A*this.itemSize+t]=e,this}getX(A){let t=this.array[A*this.itemSize];return this.normalized&&(t=le(t,this.array)),t}setX(A,t){return this.normalized&&(t=pA(t,this.array)),this.array[A*this.itemSize]=t,this}getY(A){let t=this.array[A*this.itemSize+1];return this.normalized&&(t=le(t,this.array)),t}setY(A,t){return this.normalized&&(t=pA(t,this.array)),this.array[A*this.itemSize+1]=t,this}getZ(A){let t=this.array[A*this.itemSize+2];return this.normalized&&(t=le(t,this.array)),t}setZ(A,t){return this.normalized&&(t=pA(t,this.array)),this.array[A*this.itemSize+2]=t,this}getW(A){let t=this.array[A*this.itemSize+3];return this.normalized&&(t=le(t,this.array)),t}setW(A,t){return this.normalized&&(t=pA(t,this.array)),this.array[A*this.itemSize+3]=t,this}setXY(A,t,e){return A*=this.itemSize,this.normalized&&(t=pA(t,this.array),e=pA(e,this.array)),this.array[A+0]=t,this.array[A+1]=e,this}setXYZ(A,t,e,s){return A*=this.itemSize,this.normalized&&(t=pA(t,this.array),e=pA(e,this.array),s=pA(s,this.array)),this.array[A+0]=t,this.array[A+1]=e,this.array[A+2]=s,this}setXYZW(A,t,e,s,i){return A*=this.itemSize,this.normalized&&(t=pA(t,this.array),e=pA(e,this.array),s=pA(s,this.array),i=pA(i,this.array)),this.array[A+0]=t,this.array[A+1]=e,this.array[A+2]=s,this.array[A+3]=i,this}onUpload(A){return this.onUploadCallback=A,this}clone(){return new this.constructor(this.array,this.itemSize).copy(this)}toJSON(){const A={itemSize:this.itemSize,type:this.array.constructor.name,array:Array.from(this.array),normalized:this.normalized};return this.name!==""&&(A.name=this.name),this.usage!==sn&&(A.usage=this.usage),A}}class Qa extends Vt{constructor(A,t,e){super(new Uint16Array(A),t,e)}}class ha extends Vt{constructor(A,t,e){super(new Uint32Array(A),t,e)}}class We extends Vt{constructor(A,t,e){super(new Float32Array(A),t,e)}}let Ca=0;const LA=new cA,js=new mA,Xt=new f,kA=new Ht,ye=new Ht,oA=new f;class Oe extends Ee{constructor(){super(),this.isBufferGeometry=!0,Object.defineProperty(this,"id",{value:Ca++}),this.uuid=ce(),this.name="",this.type="BufferGeometry",this.index=null,this.indirect=null,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(A){return Array.isArray(A)?this.index=new(Or(A)?ha:Qa)(A,1):this.index=A,this}setIndirect(A){return this.indirect=A,this}getIndirect(){return this.indirect}getAttribute(A){return this.attributes[A]}setAttribute(A,t){return this.attributes[A]=t,this}deleteAttribute(A){return delete this.attributes[A],this}hasAttribute(A){return this.attributes[A]!==void 0}addGroup(A,t,e=0){this.groups.push({start:A,count:t,materialIndex:e})}clearGroups(){this.groups=[]}setDrawRange(A,t){this.drawRange.start=A,this.drawRange.count=t}applyMatrix4(A){const t=this.attributes.position;t!==void 0&&(t.applyMatrix4(A),t.needsUpdate=!0);const e=this.attributes.normal;if(e!==void 0){const i=new jA().getNormalMatrix(A);e.applyNormalMatrix(i),e.needsUpdate=!0}const s=this.attributes.tangent;return s!==void 0&&(s.transformDirection(A),s.needsUpdate=!0),this.boundingBox!==null&&this.computeBoundingBox(),this.boundingSphere!==null&&this.computeBoundingSphere(),this}applyQuaternion(A){return LA.makeRotationFromQuaternion(A),this.applyMatrix4(LA),this}rotateX(A){return LA.makeRotationX(A),this.applyMatrix4(LA),this}rotateY(A){return LA.makeRotationY(A),this.applyMatrix4(LA),this}rotateZ(A){return LA.makeRotationZ(A),this.applyMatrix4(LA),this}translate(A,t,e){return LA.makeTranslation(A,t,e),this.applyMatrix4(LA),this}scale(A,t,e){return LA.makeScale(A,t,e),this.applyMatrix4(LA),this}lookAt(A){return js.lookAt(A),js.updateMatrix(),this.applyMatrix4(js.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(Xt).negate(),this.translate(Xt.x,Xt.y,Xt.z),this}setFromPoints(A){const t=this.getAttribute("position");if(t===void 0){const e=[];for(let s=0,i=A.length;s<i;s++){const r=A[s];e.push(r.x,r.y,r.z||0)}this.setAttribute("position",new We(e,3))}else{const e=Math.min(A.length,t.count);for(let s=0;s<e;s++){const i=A[s];t.setXYZ(s,i.x,i.y,i.z||0)}A.length>t.count&&console.warn("THREE.BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),t.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new Ht);const A=this.attributes.position,t=this.morphAttributes.position;if(A&&A.isGLBufferAttribute){console.error("THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),this.boundingBox.set(new f(-1/0,-1/0,-1/0),new f(1/0,1/0,1/0));return}if(A!==void 0){if(this.boundingBox.setFromBufferAttribute(A),t)for(let e=0,s=t.length;e<s;e++){const i=t[e];kA.setFromBufferAttribute(i),this.morphTargetsRelative?(oA.addVectors(this.boundingBox.min,kA.min),this.boundingBox.expandByPoint(oA),oA.addVectors(this.boundingBox.max,kA.max),this.boundingBox.expandByPoint(oA)):(this.boundingBox.expandByPoint(kA.min),this.boundingBox.expandByPoint(kA.max))}}else this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error(\'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.\',this)}computeBoundingSphere(){this.boundingSphere===null&&(this.boundingSphere=new Qn);const A=this.attributes.position,t=this.morphAttributes.position;if(A&&A.isGLBufferAttribute){console.error("THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.",this),this.boundingSphere.set(new f,1/0);return}if(A){const e=this.boundingSphere.center;if(kA.setFromBufferAttribute(A),t)for(let i=0,r=t.length;i<r;i++){const a=t[i];ye.setFromBufferAttribute(a),this.morphTargetsRelative?(oA.addVectors(kA.min,ye.min),kA.expandByPoint(oA),oA.addVectors(kA.max,ye.max),kA.expandByPoint(oA)):(kA.expandByPoint(ye.min),kA.expandByPoint(ye.max))}kA.getCenter(e);let s=0;for(let i=0,r=A.count;i<r;i++)oA.fromBufferAttribute(A,i),s=Math.max(s,e.distanceToSquared(oA));if(t)for(let i=0,r=t.length;i<r;i++){const a=t[i],g=this.morphTargetsRelative;for(let o=0,I=a.count;o<I;o++)oA.fromBufferAttribute(a,o),g&&(Xt.fromBufferAttribute(A,o),oA.add(Xt)),s=Math.max(s,e.distanceToSquared(oA))}this.boundingSphere.radius=Math.sqrt(s),isNaN(this.boundingSphere.radius)&&console.error(\'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.\',this)}}computeTangents(){const A=this.index,t=this.attributes;if(A===null||t.position===void 0||t.normal===void 0||t.uv===void 0){console.error("THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)");return}const e=t.position,s=t.normal,i=t.uv;this.hasAttribute("tangent")===!1&&this.setAttribute("tangent",new Vt(new Float32Array(4*e.count),4));const r=this.getAttribute("tangent"),a=[],g=[];for(let w=0;w<e.count;w++)a[w]=new f,g[w]=new f;const o=new f,I=new f,B=new f,Q=new DA,h=new DA,C=new DA,E=new f,l=new f;function c(w,m,N){o.fromBufferAttribute(e,w),I.fromBufferAttribute(e,m),B.fromBufferAttribute(e,N),Q.fromBufferAttribute(i,w),h.fromBufferAttribute(i,m),C.fromBufferAttribute(i,N),I.sub(o),B.sub(o),h.sub(Q),C.sub(Q);const M=1/(h.x*C.y-C.x*h.y);isFinite(M)&&(E.copy(I).multiplyScalar(C.y).addScaledVector(B,-h.y).multiplyScalar(M),l.copy(B).multiplyScalar(h.x).addScaledVector(I,-C.x).multiplyScalar(M),a[w].add(E),a[m].add(E),a[N].add(E),g[w].add(l),g[m].add(l),g[N].add(l))}let u=this.groups;u.length===0&&(u=[{start:0,count:A.count}]);for(let w=0,m=u.length;w<m;++w){const N=u[w],M=N.start,S=N.count;for(let F=M,k=M+S;F<k;F+=3)c(A.getX(F+0),A.getX(F+1),A.getX(F+2))}const d=new f,y=new f,p=new f,x=new f;function D(w){p.fromBufferAttribute(s,w),x.copy(p);const m=a[w];d.copy(m),d.sub(p.multiplyScalar(p.dot(m))).normalize(),y.crossVectors(x,m);const M=y.dot(g[w])<0?-1:1;r.setXYZW(w,d.x,d.y,d.z,M)}for(let w=0,m=u.length;w<m;++w){const N=u[w],M=N.start,S=N.count;for(let F=M,k=M+S;F<k;F+=3)D(A.getX(F+0)),D(A.getX(F+1)),D(A.getX(F+2))}}computeVertexNormals(){const A=this.index,t=this.getAttribute("position");if(t!==void 0){let e=this.getAttribute("normal");if(e===void 0)e=new Vt(new Float32Array(t.count*3),3),this.setAttribute("normal",e);else for(let Q=0,h=e.count;Q<h;Q++)e.setXYZ(Q,0,0,0);const s=new f,i=new f,r=new f,a=new f,g=new f,o=new f,I=new f,B=new f;if(A)for(let Q=0,h=A.count;Q<h;Q+=3){const C=A.getX(Q+0),E=A.getX(Q+1),l=A.getX(Q+2);s.fromBufferAttribute(t,C),i.fromBufferAttribute(t,E),r.fromBufferAttribute(t,l),I.subVectors(r,i),B.subVectors(s,i),I.cross(B),a.fromBufferAttribute(e,C),g.fromBufferAttribute(e,E),o.fromBufferAttribute(e,l),a.add(I),g.add(I),o.add(I),e.setXYZ(C,a.x,a.y,a.z),e.setXYZ(E,g.x,g.y,g.z),e.setXYZ(l,o.x,o.y,o.z)}else for(let Q=0,h=t.count;Q<h;Q+=3)s.fromBufferAttribute(t,Q+0),i.fromBufferAttribute(t,Q+1),r.fromBufferAttribute(t,Q+2),I.subVectors(r,i),B.subVectors(s,i),I.cross(B),e.setXYZ(Q+0,I.x,I.y,I.z),e.setXYZ(Q+1,I.x,I.y,I.z),e.setXYZ(Q+2,I.x,I.y,I.z);this.normalizeNormals(),e.needsUpdate=!0}}normalizeNormals(){const A=this.attributes.normal;for(let t=0,e=A.count;t<e;t++)oA.fromBufferAttribute(A,t),oA.normalize(),A.setXYZ(t,oA.x,oA.y,oA.z)}toNonIndexed(){function A(a,g){const o=a.array,I=a.itemSize,B=a.normalized,Q=new o.constructor(g.length*I);let h=0,C=0;for(let E=0,l=g.length;E<l;E++){a.isInterleavedBufferAttribute?h=g[E]*a.data.stride+a.offset:h=g[E]*I;for(let c=0;c<I;c++)Q[C++]=o[h++]}return new Vt(Q,I,B)}if(this.index===null)return console.warn("THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed."),this;const t=new Oe,e=this.index.array,s=this.attributes;for(const a in s){const g=s[a],o=A(g,e);t.setAttribute(a,o)}const i=this.morphAttributes;for(const a in i){const g=[],o=i[a];for(let I=0,B=o.length;I<B;I++){const Q=o[I],h=A(Q,e);g.push(h)}t.morphAttributes[a]=g}t.morphTargetsRelative=this.morphTargetsRelative;const r=this.groups;for(let a=0,g=r.length;a<g;a++){const o=r[a];t.addGroup(o.start,o.count,o.materialIndex)}return t}toJSON(){const A={metadata:{version:4.6,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};if(A.uuid=this.uuid,A.type=this.type,this.name!==""&&(A.name=this.name),Object.keys(this.userData).length>0&&(A.userData=this.userData),this.parameters!==void 0){const g=this.parameters;for(const o in g)g[o]!==void 0&&(A[o]=g[o]);return A}A.data={attributes:{}};const t=this.index;t!==null&&(A.data.index={type:t.array.constructor.name,array:Array.prototype.slice.call(t.array)});const e=this.attributes;for(const g in e){const o=e[g];A.data.attributes[g]=o.toJSON(A.data)}const s={};let i=!1;for(const g in this.morphAttributes){const o=this.morphAttributes[g],I=[];for(let B=0,Q=o.length;B<Q;B++){const h=o[B];I.push(h.toJSON(A.data))}I.length>0&&(s[g]=I,i=!0)}i&&(A.data.morphAttributes=s,A.data.morphTargetsRelative=this.morphTargetsRelative);const r=this.groups;r.length>0&&(A.data.groups=JSON.parse(JSON.stringify(r)));const a=this.boundingSphere;return a!==null&&(A.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),A}clone(){return new this.constructor().copy(this)}copy(A){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const t={};this.name=A.name;const e=A.index;e!==null&&this.setIndex(e.clone(t));const s=A.attributes;for(const o in s){const I=s[o];this.setAttribute(o,I.clone(t))}const i=A.morphAttributes;for(const o in i){const I=[],B=i[o];for(let Q=0,h=B.length;Q<h;Q++)I.push(B[Q].clone(t));this.morphAttributes[o]=I}this.morphTargetsRelative=A.morphTargetsRelative;const r=A.groups;for(let o=0,I=r.length;o<I;o++){const B=r[o];this.addGroup(B.start,B.count,B.materialIndex)}const a=A.boundingBox;a!==null&&(this.boundingBox=a.clone());const g=A.boundingSphere;return g!==null&&(this.boundingSphere=g.clone()),this.drawRange.start=A.drawRange.start,this.drawRange.count=A.drawRange.count,this.userData=A.userData,this}dispose(){this.dispatchEvent({type:"dispose"})}}const pn=new cA,Rt=new ea,Pe=new Qn,Dn=new f,Ve=new f,Xe=new f,je=new f,$s=new f,$e=new f,mn=new f,As=new f;class xn extends mA{constructor(A=new Oe,t=new Ba){super(),this.isMesh=!0,this.type="Mesh",this.geometry=A,this.material=t,this.updateMorphTargets()}copy(A,t){return super.copy(A,t),A.morphTargetInfluences!==void 0&&(this.morphTargetInfluences=A.morphTargetInfluences.slice()),A.morphTargetDictionary!==void 0&&(this.morphTargetDictionary=Object.assign({},A.morphTargetDictionary)),this.material=Array.isArray(A.material)?A.material.slice():A.material,this.geometry=A.geometry,this}updateMorphTargets(){const t=this.geometry.morphAttributes,e=Object.keys(t);if(e.length>0){const s=t[e[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let i=0,r=s.length;i<r;i++){const a=s[i].name||String(i);this.morphTargetInfluences.push(0),this.morphTargetDictionary[a]=i}}}}getVertexPosition(A,t){const e=this.geometry,s=e.attributes.position,i=e.morphAttributes.position,r=e.morphTargetsRelative;t.fromBufferAttribute(s,A);const a=this.morphTargetInfluences;if(i&&a){$e.set(0,0,0);for(let g=0,o=i.length;g<o;g++){const I=a[g],B=i[g];I!==0&&($s.fromBufferAttribute(B,A),r?$e.addScaledVector($s,I):$e.addScaledVector($s.sub(t),I))}t.add($e)}return t}raycast(A,t){const e=this.geometry,s=this.material,i=this.matrixWorld;s!==void 0&&(e.boundingSphere===null&&e.computeBoundingSphere(),Pe.copy(e.boundingSphere),Pe.applyMatrix4(i),Rt.copy(A.ray).recast(A.near),!(Pe.containsPoint(Rt.origin)===!1&&(Rt.intersectSphere(Pe,Dn)===null||Rt.origin.distanceToSquared(Dn)>(A.far-A.near)**2))&&(pn.copy(i).invert(),Rt.copy(A.ray).applyMatrix4(pn),!(e.boundingBox!==null&&Rt.intersectsBox(e.boundingBox)===!1)&&this._computeIntersections(A,t,Rt)))}_computeIntersections(A,t,e){let s;const i=this.geometry,r=this.material,a=i.index,g=i.attributes.position,o=i.attributes.uv,I=i.attributes.uv1,B=i.attributes.normal,Q=i.groups,h=i.drawRange;if(a!==null)if(Array.isArray(r))for(let C=0,E=Q.length;C<E;C++){const l=Q[C],c=r[l.materialIndex],u=Math.max(l.start,h.start),d=Math.min(a.count,Math.min(l.start+l.count,h.start+h.count));for(let y=u,p=d;y<p;y+=3){const x=a.getX(y),D=a.getX(y+1),w=a.getX(y+2);s=ts(this,c,A,e,o,I,B,x,D,w),s&&(s.faceIndex=Math.floor(y/3),s.face.materialIndex=l.materialIndex,t.push(s))}}else{const C=Math.max(0,h.start),E=Math.min(a.count,h.start+h.count);for(let l=C,c=E;l<c;l+=3){const u=a.getX(l),d=a.getX(l+1),y=a.getX(l+2);s=ts(this,r,A,e,o,I,B,u,d,y),s&&(s.faceIndex=Math.floor(l/3),t.push(s))}}else if(g!==void 0)if(Array.isArray(r))for(let C=0,E=Q.length;C<E;C++){const l=Q[C],c=r[l.materialIndex],u=Math.max(l.start,h.start),d=Math.min(g.count,Math.min(l.start+l.count,h.start+h.count));for(let y=u,p=d;y<p;y+=3){const x=y,D=y+1,w=y+2;s=ts(this,c,A,e,o,I,B,x,D,w),s&&(s.faceIndex=Math.floor(y/3),s.face.materialIndex=l.materialIndex,t.push(s))}}else{const C=Math.max(0,h.start),E=Math.min(g.count,h.start+h.count);for(let l=C,c=E;l<c;l+=3){const u=l,d=l+1,y=l+2;s=ts(this,r,A,e,o,I,B,u,d,y),s&&(s.faceIndex=Math.floor(l/3),t.push(s))}}}}function Ea(n,A,t,e,s,i,r,a){let g;if(A.side===Hr?g=e.intersectTriangle(r,i,s,!0,a):g=e.intersectTriangle(s,i,r,A.side===Rs,a),g===null)return null;As.copy(a),As.applyMatrix4(n.matrixWorld);const o=t.ray.origin.distanceTo(As);return o<t.near||o>t.far?null:{distance:o,point:As.clone(),object:n}}function ts(n,A,t,e,s,i,r,a,g,o){n.getVertexPosition(a,Ve),n.getVertexPosition(g,Xe),n.getVertexPosition(o,je);const I=Ea(n,A,t,e,Ve,Xe,je,mn);if(I){const B=new f;ZA.getBarycoord(mn,Ve,Xe,je,B),s&&(I.uv=ZA.getInterpolatedAttribute(s,a,g,o,B,new DA)),i&&(I.uv1=ZA.getInterpolatedAttribute(i,a,g,o,B,new DA)),r&&(I.normal=ZA.getInterpolatedAttribute(r,a,g,o,B,new f),I.normal.dot(e.direction)>0&&I.normal.multiplyScalar(-1));const Q={a,b:g,c:o,normal:new f,materialIndex:0};ZA.getNormal(Ve,Xe,je,Q.normal),I.face=Q,I.barycoord=B}return I}function ca(n){const A={};for(const t in n){A[t]={};for(const e in n[t]){const s=n[t][e];s&&(s.isColor||s.isMatrix3||s.isMatrix4||s.isVector2||s.isVector3||s.isVector4||s.isTexture||s.isQuaternion)?s.isRenderTargetTexture?(console.warn("UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms()."),A[t][e]=null):A[t][e]=s.clone():Array.isArray(s)?A[t][e]=s.slice():A[t][e]=s}}return A}function la(n){const A=[];for(let t=0;t<n.length;t++)A.push(n[t].clone());return A}var ua=`void main() {\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}`,da=`void main() {\n gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}`;class fa extends wn{constructor(A){super(),this.isShaderMaterial=!0,this.type="ShaderMaterial",this.defines={},this.uniforms={},this.uniformsGroups=[],this.vertexShader=ua,this.fragmentShader=da,this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.forceSinglePass=!0,this.extensions={clipCullDistance:!1,multiDraw:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv1:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,this.glslVersion=null,A!==void 0&&this.setValues(A)}copy(A){return super.copy(A),this.fragmentShader=A.fragmentShader,this.vertexShader=A.vertexShader,this.uniforms=ca(A.uniforms),this.uniformsGroups=la(A.uniformsGroups),this.defines=Object.assign({},A.defines),this.wireframe=A.wireframe,this.wireframeLinewidth=A.wireframeLinewidth,this.fog=A.fog,this.lights=A.lights,this.clipping=A.clipping,this.extensions=Object.assign({},A.extensions),this.glslVersion=A.glslVersion,this}toJSON(A){const t=super.toJSON(A);t.glslVersion=this.glslVersion,t.uniforms={};for(const s in this.uniforms){const r=this.uniforms[s].value;r&&r.isTexture?t.uniforms[s]={type:"t",value:r.toJSON(A).uuid}:r&&r.isColor?t.uniforms[s]={type:"c",value:r.getHex()}:r&&r.isVector2?t.uniforms[s]={type:"v2",value:r.toArray()}:r&&r.isVector3?t.uniforms[s]={type:"v3",value:r.toArray()}:r&&r.isVector4?t.uniforms[s]={type:"v4",value:r.toArray()}:r&&r.isMatrix3?t.uniforms[s]={type:"m3",value:r.toArray()}:r&&r.isMatrix4?t.uniforms[s]={type:"m4",value:r.toArray()}:t.uniforms[s]={value:r}}Object.keys(this.defines).length>0&&(t.defines=this.defines),t.vertexShader=this.vertexShader,t.fragmentShader=this.fragmentShader,t.lights=this.lights,t.clipping=this.clipping;const e={};for(const s in this.extensions)this.extensions[s]===!0&&(e[s]=!0);return Object.keys(e).length>0&&(t.extensions=e),t}}class Mn extends mA{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new cA,this.projectionMatrix=new cA,this.projectionMatrixInverse=new cA,this.coordinateSystem=Ce}copy(A,t){return super.copy(A,t),this.matrixWorldInverse.copy(A.matrixWorldInverse),this.projectionMatrix.copy(A.projectionMatrix),this.projectionMatrixInverse.copy(A.projectionMatrixInverse),this.coordinateSystem=A.coordinateSystem,this}getWorldDirection(A){return super.getWorldDirection(A).negate()}updateMatrixWorld(A){super.updateMatrixWorld(A),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(A,t){super.updateWorldMatrix(A,t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return new this.constructor().copy(this)}}class Sn extends mA{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new Nt,this.environmentIntensity=1,this.environmentRotation=new Nt,this.overrideMaterial=null,typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(A,t){return super.copy(A,t),A.background!==null&&(this.background=A.background.clone()),A.environment!==null&&(this.environment=A.environment.clone()),A.fog!==null&&(this.fog=A.fog.clone()),this.backgroundBlurriness=A.backgroundBlurriness,this.backgroundIntensity=A.backgroundIntensity,this.backgroundRotation.copy(A.backgroundRotation),this.environmentIntensity=A.environmentIntensity,this.environmentRotation.copy(A.environmentRotation),A.overrideMaterial!==null&&(this.overrideMaterial=A.overrideMaterial.clone()),this.matrixAutoUpdate=A.matrixAutoUpdate,this}toJSON(A){const t=super.toJSON(A);return this.fog!==null&&(t.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(t.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(t.object.backgroundIntensity=this.backgroundIntensity),t.object.backgroundRotation=this.backgroundRotation.toArray(),this.environmentIntensity!==1&&(t.object.environmentIntensity=this.environmentIntensity),t.object.environmentRotation=this.environmentRotation.toArray(),t}}class ya extends $A{constructor(A=null,t=1,e=1,s,i,r,a,g,o=Et,I=Et,B,Q){super(null,r,a,g,o,I,s,i,B,Q),this.isDataTexture=!0,this.image={data:A,width:t,height:e},this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}class es extends Oe{constructor(A=1,t=1,e=1,s=1){super(),this.type="PlaneGeometry",this.parameters={width:A,height:t,widthSegments:e,heightSegments:s};const i=A/2,r=t/2,a=Math.floor(e),g=Math.floor(s),o=a+1,I=g+1,B=A/a,Q=t/g,h=[],C=[],E=[],l=[];for(let c=0;c<I;c++){const u=c*Q-r;for(let d=0;d<o;d++){const y=d*B-i;C.push(y,-u,0),E.push(0,0,1),l.push(d/a),l.push(1-c/g)}}for(let c=0;c<g;c++)for(let u=0;u<a;u++){const d=u+o*c,y=u+o*(c+1),p=u+1+o*(c+1),x=u+1+o*c;h.push(d,y,x),h.push(y,p,x)}this.setIndex(h),this.setAttribute("position",new We(C,3)),this.setAttribute("normal",new We(E,3)),this.setAttribute("uv",new We(l,2))}copy(A){return super.copy(A),this.parameters=Object.assign({},A.parameters),this}static fromJSON(A){return new es(A.width,A.height,A.widthSegments,A.heightSegments)}}class Ai extends fa{constructor(A){super(A),this.isRawShaderMaterial=!0,this.type="RawShaderMaterial"}}const Fn={enabled:!1,files:{},add:function(n,A){this.enabled!==!1&&(this.files[n]=A)},get:function(n){if(this.enabled!==!1)return this.files[n]},remove:function(n){delete this.files[n]},clear:function(){this.files={}}};class wa{constructor(A,t,e){const s=this;let i=!1,r=0,a=0,g;const o=[];this.onStart=void 0,this.onLoad=A,this.onProgress=t,this.onError=e,this.itemStart=function(I){a++,i===!1&&s.onStart!==void 0&&s.onStart(I,r,a),i=!0},this.itemEnd=function(I){r++,s.onProgress!==void 0&&s.onProgress(I,r,a),r===a&&(i=!1,s.onLoad!==void 0&&s.onLoad())},this.itemError=function(I){s.onError!==void 0&&s.onError(I)},this.resolveURL=function(I){return g?g(I):I},this.setURLModifier=function(I){return g=I,this},this.addHandler=function(I,B){return o.push(I,B),this},this.removeHandler=function(I){const B=o.indexOf(I);return B!==-1&&o.splice(B,2),this},this.getHandler=function(I){for(let B=0,Q=o.length;B<Q;B+=2){const h=o[B],C=o[B+1];if(h.global&&(h.lastIndex=0),h.test(I))return C}return null}}}const pa=new wa;class ti{constructor(A){this.manager=A!==void 0?A:pa,this.crossOrigin="anonymous",this.withCredentials=!1,this.path="",this.resourcePath="",this.requestHeader={}}load(){}loadAsync(A,t){const e=this;return new Promise(function(s,i){e.load(A,s,t,i)})}parse(){}setCrossOrigin(A){return this.crossOrigin=A,this}setWithCredentials(A){return this.withCredentials=A,this}setPath(A){return this.path=A,this}setResourcePath(A){return this.resourcePath=A,this}setRequestHeader(A){return this.requestHeader=A,this}}ti.DEFAULT_MATERIAL_NAME="__DEFAULT";const at={};class Da extends Error{constructor(A,t){super(A),this.response=t}}class ma extends ti{constructor(A){super(A)}load(A,t,e,s){A===void 0&&(A=""),this.path!==void 0&&(A=this.path+A),A=this.manager.resolveURL(A);const i=Fn.get(A);if(i!==void 0)return this.manager.itemStart(A),setTimeout(()=>{t&&t(i),this.manager.itemEnd(A)},0),i;if(at[A]!==void 0){at[A].push({onLoad:t,onProgress:e,onError:s});return}at[A]=[],at[A].push({onLoad:t,onProgress:e,onError:s});const r=new Request(A,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin"}),a=this.mimeType,g=this.responseType;fetch(r).then(o=>{if(o.status===200||o.status===0){if(o.status===0&&console.warn("THREE.FileLoader: HTTP Status 0 received."),typeof ReadableStream>"u"||o.body===void 0||o.body.getReader===void 0)return o;const I=at[A],B=o.body.getReader(),Q=o.headers.get("X-File-Size")||o.headers.get("Content-Length"),h=Q?parseInt(Q):0,C=h!==0;let E=0;const l=new ReadableStream({start(c){u();function u(){B.read().then(({done:d,value:y})=>{if(d)c.close();else{E+=y.byteLength;const p=new ProgressEvent("progress",{lengthComputable:C,loaded:E,total:h});for(let x=0,D=I.length;x<D;x++){const w=I[x];w.onProgress&&w.onProgress(p)}c.enqueue(y),u()}},d=>{c.error(d)})}}});return new Response(l)}else throw new Da(`fetch for "${o.url}" responded with ${o.status}: ${o.statusText}`,o)}).then(o=>{switch(g){case"arraybuffer":return o.arrayBuffer();case"blob":return o.blob();case"document":return o.text().then(I=>new DOMParser().parseFromString(I,a));case"json":return o.json();default:if(a===void 0)return o.text();{const B=/charset="?([^;"\\s]*)"?/i.exec(a),Q=B&&B[1]?B[1].toLowerCase():void 0,h=new TextDecoder(Q);return o.arrayBuffer().then(C=>h.decode(C))}}}).then(o=>{Fn.add(A,o);const I=at[A];delete at[A];for(let B=0,Q=I.length;B<Q;B++){const h=I[B];h.onLoad&&h.onLoad(o)}}).catch(o=>{const I=at[A];if(I===void 0)throw this.manager.itemError(A),o;delete at[A];for(let B=0,Q=I.length;B<Q;B++){const h=I[B];h.onError&&h.onError(o)}this.manager.itemError(A)}).finally(()=>{this.manager.itemEnd(A)}),this.manager.itemStart(A)}setResponseType(A){return this.responseType=A,this}setMimeType(A){return this.mimeType=A,this}}class ei{constructor(A,t,e,s){ei.prototype.isMatrix2=!0,this.elements=[1,0,0,1],A!==void 0&&this.set(A,t,e,s)}identity(){return this.set(1,0,0,1),this}fromArray(A,t=0){for(let e=0;e<4;e++)this.elements[e]=A[e+t];return this}set(A,t,e,s){const i=this.elements;return i[0]=A,i[2]=t,i[1]=e,i[3]=s,this}}typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:Ki}})),typeof window<"u"&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=Ki);const WA=-9,gt=(9-WA)/254,si=Math.exp(WA),xa=11,Ma=11,W=1<<xa,wt=1<<Ma,Nn=1,Sa=!0;function jt(n){return n==="int"||n==="ivec2"||n==="ivec3"||n==="ivec4"}function $t(n){return n==="uint"||n==="uvec2"||n==="uvec3"||n==="uvec4"}function Fa(n){return n==="float"||n==="vec2"||n==="vec3"||n==="vec4"}function Na(n){return n==="mat2"||n==="mat2x2"||n==="mat2x3"||n==="mat2x4"||n==="mat3"||n==="mat3x2"||n==="mat3x3"||n==="mat3x4"||n==="mat4"||n==="mat4x2"||n==="mat4x3"||n==="mat4x4"}function ss(n){return Fa(n)||Na(n)}function Ae(n){return n==="mat2"||n==="mat2x2"}function te(n){return n==="mat3"||n==="mat3x3"}function ee(n){return n==="mat4"||n==="mat4x4"}function rA(n){return Math.trunc(n).toString()}function aA(n){return`${Math.max(0,Math.trunc(n)).toString()}u`}function q(n){return n===Number.POSITIVE_INFINITY?"INFINITY":n===Number.NEGATIVE_INFINITY?"-INFINITY":Number.isInteger(n)?n.toFixed(1):n.toString()}function Ut(n){return n instanceof Gt?n.type:n.dynoOut().type}class Gt{constructor(A){this.__isDynoValue=!0,this.type=A}}class RA extends Gt{constructor(A,t){super(A.outTypes[t]),this.dyno=A,this.key=t}}class is extends Gt{constructor(A,t){super(A),this.literal=t}getLiteral(){return this.literal}}class ka extends is{constructor(A,t){super(A,""),this.value=t}getLiteral(){const{type:A,value:t}=this;switch(A){case"bool":return t?"true":"false";case"uint":return aA(t);case"int":return rA(t);case"float":return q(t);case"bvec2":{const e=t;return`bvec2(${e[0]}, ${e[1]})`}case"uvec2":{if(t instanceof DA)return`uvec2(${aA(t.x)}, ${aA(t.y)})`;const e=t;return`uvec2(${aA(e[0])}, ${aA(e[1])})`}case"ivec2":{if(t instanceof DA)return`ivec2(${rA(t.x)}, ${rA(t.y)})`;const e=t;return`ivec2(${rA(e[0])}, ${rA(e[1])})`}case"vec2":{if(t instanceof DA)return`vec2(${q(t.x)}, ${q(t.y)})`;const e=t;return`vec2(${q(e[0])}, ${q(e[1])})`}case"bvec3":{const e=t;return`bvec3(${e[0]}, ${e[1]}, ${e[2]})`}case"uvec3":{if(t instanceof f)return`uvec3(${aA(t.x)}, ${aA(t.y)}, ${aA(t.z)})`;const e=t;return`uvec3(${aA(e[0])}, ${aA(e[1])}, ${aA(e[2])})`}case"ivec3":{if(t instanceof f)return`ivec3(${rA(t.x)}, ${rA(t.y)}, ${rA(t.z)})`;const e=t;return`ivec3(${rA(e[0])}, ${rA(e[1])}, ${rA(e[2])})`}case"vec3":{if(t instanceof f)return`vec3(${q(t.x)}, ${q(t.y)}, ${q(t.z)})`;const e=t;return`vec3(${q(e[0])}, ${q(e[1])}, ${q(e[2])})`}case"bvec4":{const e=t;return`bvec4(${e[0]}, ${e[1]}, ${e[2]}, ${e[3]})`}case"uvec4":{if(t instanceof fA)return`uvec4(${aA(t.x)}, ${aA(t.y)}, ${aA(t.z)}, ${aA(t.w)})`;const e=t;return`uvec4(${aA(e[0])}, ${aA(e[1])}, ${aA(e[2])}, ${aA(e[3])})`}case"ivec4":{if(t instanceof fA)return`ivec4(${rA(t.x)}, ${rA(t.y)}, ${rA(t.z)}, ${rA(t.w)})`;const e=t;return`ivec4(${rA(e[0])}, ${rA(e[1])}, ${rA(e[2])}, ${rA(e[3])})`}case"vec4":{if(t instanceof fA)return`vec4(${q(t.x)}, ${q(t.y)}, ${q(t.z)}, ${q(t.w)})`;if(t instanceof gA)return`vec4(${q(t.x)}, ${q(t.y)}, ${q(t.z)}, ${q(t.w)})`;const e=t;return`vec4(${q(e[0])}, ${q(e[1])}, ${q(e[2])}, ${q(e[3])})`}case"mat2":case"mat2x2":{const e=t,s=e instanceof ei?e.elements:t,i=new Array(4).fill(0).map((r,a)=>q(s[a]));return`${A}(${i.join(", ")})`}case"mat2x3":{const e=t,s=new Array(6).fill(0).map((i,r)=>q(e[r]));return`${A}(${s.join(", ")})`}case"mat2x4":{const e=t,s=new Array(8).fill(0).map((i,r)=>q(e[r]));return`${A}(${s.join(", ")})`}case"mat3":case"mat3x3":{const e=t,s=e instanceof jA?e.elements:t,i=new Array(9).fill(0).map((r,a)=>q(s[a]));return`${A}(${i.join(", ")})`}case"mat3x2":{const e=t,s=new Array(6).fill(0).map((i,r)=>q(e[r]));return`${A}(${s.join(", ")})`}case"mat3x4":{const e=t,s=new Array(12).fill(0).map((i,r)=>q(e[r]));return`${A}(${s.join(", ")})`}case"mat4":case"mat4x4":{const e=t,s=e instanceof cA?e.elements:t,i=new Array(16).fill(0).map((r,a)=>q(s[a]));return`${A}(${i.join(", ")})`}case"mat4x2":{const e=t,s=new Array(8).fill(0).map((i,r)=>q(e[r]));return`${A}(${s.join(", ")})`}case"mat4x3":{const e=t,s=new Array(12).fill(0).map((i,r)=>q(e[r]));return`${A}(${s.join(", ")})`}default:throw new Error(`Type not implemented: ${String(A)}`)}}}function Ra(n,A){return new ka(n,A)}const kn=" ";class Ua{constructor({indent:A}={}){this.globals=new Set,this.statements=[],this.uniforms={},this.declares=new Set,this.updaters=[],this.sequence=0,this.indent=kn,this.indent=A??kn}nextSequence(){return this.sequence++}}class uA{constructor({inTypes:A,outTypes:t,inputs:e,update:s,globals:i,statements:r,generate:a}){this.inTypes=A??{},this.outTypes=t??{},this.inputs=e??{},this.update=s,this.globals=i,this.statements=r,this.generate=a??(({inputs:g,outputs:o,compile:I})=>{var B,Q;return{globals:(B=this.globals)==null?void 0:B.call(this,{inputs:g,outputs:o,compile:I}),statements:(Q=this.statements)==null?void 0:Q.call(this,{inputs:g,outputs:o,compile:I})}})}get outputs(){const A={};for(const t in this.outTypes)A[t]=new RA(this,t);return A}apply(A){return Object.assign(this.inputs,A),this.outputs}compile({inputs:A,outputs:t,compile:e}){const s=[`// ${this.constructor.name}(${Object.values(A).join(", ")}) => (${Object.values(t).join(", ")})`],i=[];for(const o in t){const I=t[o];I&&!e.declares.has(I)&&(e.declares.add(I),i.push(o))}const{globals:r,statements:a,uniforms:g}=this.generate({inputs:A,outputs:t,compile:e});for(const o of r??[])e.globals.add(o);for(const o in g)e.uniforms[o]=g[o];this.update&&e.updaters.push(this.update);for(const o of i){const I=t[o];I&&(e.uniforms[I]||s.push(`${Rn(I,this.outTypes[o])};`))}return a!=null&&a.length&&(s.push("{"),s.push(...a.map(o=>e.indent+o)),s.push("}")),s}}class Ga extends uA{constructor({inTypes:A,outTypes:t,inputs:e,update:s,globals:i,construct:r}){super({inTypes:A,outTypes:t,inputs:e,update:s,globals:i,generate:a=>this.generateBlock(a)}),this.construct=r}generateBlock({inputs:A,outputs:t,compile:e}){var C,E;const s={},i={};for(const l in A)A[l]!=null&&(s[l]=new is(this.inTypes[l],A[l]));for(const l in t)t[l]!=null&&(i[l]=new Gt(this.outTypes[l]));const r={roots:[]},a=this.construct(s,i,r);for(const l of((C=this.globals)==null?void 0:C.call(this,{inputs:A,outputs:t,compile:e}))??[])e.globals.add(l);const g=[],o=new Map;function I(l,c,u){let d=o.get(l);if(!d){d={sequence:e.nextSequence(),outNames:new Map,newOuts:new Set},o.set(l,d);for(const y in l.inputs){let p=l.inputs[y];for(;p;){if(p instanceof Gt){p instanceof RA&&I(p.dyno,p.key);break}p=p.dynoOut()}}g.push(l)}c&&(u||d.newOuts.add(c),d.outNames.set(c,u??`${c}_${d.sequence}`))}for(const l of r.roots)I(l);for(const l in i){let c=(a==null?void 0:a[l])??i[l];for(;c;){if(c instanceof Gt){c instanceof RA&&I(c.dyno,c.key,t[l]);break}c=c.dynoOut()}i[l]=c}const B=[];for(const l of g){const c={},u={};for(const p in l.inputs){let x=l.inputs[p];for(;x;){if(x instanceof Gt){if(x instanceof is)c[p]=x.getLiteral();else if(x instanceof RA){const D=(E=o.get(x.dyno))==null?void 0:E.outNames.get(x.key);if(!D)throw new Error(`Source not found for ${x.dyno.constructor.name}.${x.key}`);c[p]=D}break}x=x.dynoOut()}}const d=o.get(l)??{outNames:new Map};for(const[p,x]of d.outNames.entries())u[p]=x;const y=l.compile({inputs:c,outputs:u,compile:e});B.push(y)}const Q=[];for(const l in t)i[l]instanceof is&&Q.push(`${t[l]} = ${i[l].getLiteral()};`);return Q.length>0&&B.push(Q),{statements:B.flatMap((l,c)=>c===0?l:["",...l])}}}function ns(n,A,t,{update:e,globals:s}={}){return new Ga({inTypes:n,outTypes:A,construct:t,update:e,globals:s})}function ii({inTypes:n,outTypes:A,inputs:t,update:e,globals:s,statements:i,generate:r}){return new uA({inTypes:n,outTypes:A,inputs:t,update:e,globals:s,statements:i,generate:r})}function Rn(n,A,t){const e=typeof A=="string"?A:A.type;if(!e)throw new Error(`Invalid DynoType: ${String(A)}`);return`${e} ${n}${t!=null?`[${t}]`:""}`}function ot(n){var i;let A=!1;const t=n.split(`\n`).map(r=>{const a=r.trimEnd();return A?a:a.length>0?(A=!0,a):null}).filter(r=>r!=null);for(;t.length>0&&t[t.length-1].length===0;)t.pop();if(t.length===0)return[];const e=(i=t[0].match(/^\\s*/))==null?void 0:i[0];if(!e)return t;const s=new RegExp(`^${e}`);return t.map(r=>r.replace(s,""))}function OA(n){return ot(n).join(`\n`)}class ba extends uA{constructor({a:A,outKey:t,outTypeFunc:e}){const s={a:Ut(A)},i=e(Ut(A)),r={[t]:i};super({inTypes:s,outTypes:r,inputs:{a:A}}),this.outKey=t}dynoOut(){return new RA(this,this.outKey)}}class rs extends uA{constructor({a:A,b:t,outKey:e,outTypeFunc:s}){const i={a:Ut(A),b:Ut(t)},r=s(Ut(A),Ut(t)),a={[e]:r};super({inTypes:i,outTypes:a,inputs:{a:A,b:t}}),this.outKey=e}dynoOut(){return new RA(this,this.outKey)}}const ni=new Float32Array(1),Un=new Uint32Array(ni.buffer);function se(n){ni[0]=n;const A=Un[0],t=A>>31&1,e=A>>23&255,s=A&8388607,i=t<<15;if(e===255)return s!==0?i|32767:i|31744;const r=e-127+15;if(r>=31)return i|31744;if(r<=0){if(r<-10)return i;const g=(s|8388608)>>1-r+13;return i|g}const a=s>>13;return i|r<<10|a}function tA(n){const A=n>>15&1,t=n>>10&31,e=n&1023;let s;if(t===0)if(e===0)s=A<<31;else{let i=e,r=-14;for(;(i&1024)===0;)i<<=1,r--;i&=1023;const a=r+127,g=i<<13;s=A<<31|a<<23|g}else if(t===31)e===0?s=A<<31|2139095040:s=A<<31|2143289344;else{const i=t-15+127,r=e<<13;s=A<<31|i<<23|r}return Un[0]=s,ni[0]}function YA(n){return Math.max(0,Math.min(255,Math.round(n*255)))}function Gn(n){const A=[],t=new Set;function e(s){s&&typeof s=="object"&&!t.has(s)&&(t.add(s),s instanceof ArrayBuffer?A.push(s):ArrayBuffer.isView(s)?A.push(s.buffer):Array.isArray(s)?s.forEach(e):Object.values(s).forEach(e))}return e(n),A}function we(n,A,t,e,s,i,r,a,g,o,I,B,Q,h,C,E){const l=YA(h),c=YA(C),u=YA(E),d=YA(Q),y=Tn(new gA(g,o,I,B)),p=y&255,x=y>>>8&255,D=y>>>16&255,w=i===0?0:Math.min(255,Math.max(0,Math.round((Math.log(i)-WA)/gt)+1)),m=r===0?0:Math.min(255,Math.max(0,Math.round((Math.log(r)-WA)/gt)+1)),N=a===0?0:Math.min(255,Math.max(0,Math.round((Math.log(a)-WA)/gt)+1)),M=se(t),S=se(e),F=se(s),k=A*4;n[k]=l|c<<8|u<<16|d<<24,n[k+1]=M|S<<16,n[k+2]=F|p<<16|x<<24,n[k+3]=w|m<<8|N<<16|D<<24}function bn(n,A,t,e,s){const i=se(t),r=se(e),a=se(s),g=A*4;n[g+1]=i|r<<16,n[g+2]=a|n[g+2]&4294901760}function Ln(n,A,t,e,s){const i=t===0?0:Math.min(255,Math.max(0,Math.round((Math.log(t)-WA)/gt)+1)),r=e===0?0:Math.min(255,Math.max(0,Math.round((Math.log(e)-WA)/gt)+1)),a=s===0?0:Math.min(255,Math.max(0,Math.round((Math.log(s)-WA)/gt)+1)),g=A*4;n[g+3]=i|r<<8|a<<16|n[g+3]&4278190080}function Yn(n,A,t,e,s,i){const r=Tn(new gA(t,e,s,i)),a=r&255,g=r>>>8&255,o=r>>>16&255,I=A*4;n[I+2]=n[I+2]&65535|a<<16|g<<24,n[I+3]=n[I+3]&16777215|o<<24}function La(n,A,t,e,s,i){const r=YA(t),a=YA(e),g=YA(s),o=YA(i),I=A*4;n[I]=r|a<<8|g<<16|o<<24}function Ya(n,A,t,e,s){const i=YA(t),r=YA(e),a=YA(s),g=A*4;n[g]=i|r<<8|a<<16|n[g]&4278190080}function Ja(n,A,t){const e=YA(t),s=A*4;n[s]=n[s]&16777215|e<<24}const Ta=new f,va=new f,Ha=new gA,za=new kt,Ka={center:Ta,scales:va,quaternion:Ha,color:za,opacity:0};function Jn(n,A){const t=Ka,e=A*4,s=n[e],i=n[e+1],r=n[e+2],a=n[e+3];t.color.set((s&255)/255,(s>>>8&255)/255,(s>>>16&255)/255),t.opacity=(s>>>24&255)/255,t.center.set(tA(i&65535),tA(i>>>16&65535),tA(r&65535));const g=a&255;t.scales.x=g===0?0:Math.exp(WA+(g-1)*gt);const o=a>>>8&255;t.scales.y=o===0?0:Math.exp(WA+(o-1)*gt);const I=a>>>16&255;t.scales.z=I===0?0:Math.exp(WA+(I-1)*gt);const B=r>>>16&65535|a>>>8&16711680;return _a(B,t.quaternion),t}function UA(n){const A=W,t=Math.max(Nn,Math.min(wt,Math.ceil(n/A))),e=Math.ceil(n/(A*t)),s=A*t*e;return{width:A,height:t,depth:e,maxSplats:s}}function as(n){const A=W,t=Math.max(Nn,Math.min(wt,Math.ceil(n/A))),e=Math.ceil(n/(A*t));return A*t*e}const qa=OA(`\n precision highp float;\n\n in vec3 position;\n\n void main() {\n gl_Position = vec4(position.xy, 0.0, 1.0);\n }\n`);function Tn(n){const A=n.clone().normalize();A.w<0&&A.set(-A.x,-A.y,-A.z,-A.w);const t=2*Math.acos(A.w),e=Math.sqrt(A.x*A.x+A.y*A.y+A.z*A.z),s=e<1e-6?new f(1,0,0):new f(A.x,A.y,A.z).divideScalar(e),i=Math.abs(s.x)+Math.abs(s.y)+Math.abs(s.z);let r=s.x/i,a=s.y/i;if(s.z<0){const h=r;r=(1-Math.abs(a))*(r>=0?1:-1),a=(1-Math.abs(h))*(a>=0?1:-1)}const g=r*.5+.5,o=a*.5+.5,I=Math.round(g*255),B=Math.round(o*255);return Math.round(t*(255/Math.PI))<<16|B<<8|I}function _a(n,A){const t=n&255,e=n>>>8&255,s=n>>>16&255,i=t/255,r=e/255;let a=(i-.5)*2,g=(r-.5)*2;const o=1-(Math.abs(a)+Math.abs(g)),I=Math.max(-o,0);a+=a>=0?-I:I,g+=g>=0?-I:I;const B=new f(a,g,o).normalize(),h=s/255*Math.PI*.5,C=Math.sin(h),E=Math.cos(h);return A.set(B.x*C,B.y*C,B.z*C,E),A}function gs(n,A,t,e){const s=Math.max(-127,Math.min(127,n*127)),i=Math.max(-127,Math.min(127,A*127)),r=Math.max(-127,Math.min(127,t*127)),a=Math.max(-127,Math.min(127,e*127));return s&255|(i&255)<<8|(r&255)<<16|(a&255)<<24}function os(n,A,t){const e=A*2;for(let s=0;s<9;++s){const i=Math.max(-63,Math.min(63,t[s]*63))&127,r=s*7,a=r+7,g=Math.floor(r/32),o=r-g*32,I=i<<o&4294967295;if(n[e+g]|=I,a>g*32+32){const B=i>>>32-o&4294967295;n[e+g+1]|=B}}}function Is(n,A,t){n[A*4+0]=gs(t[0],t[1],t[2],t[3]),n[A*4+1]=gs(t[4],t[5],t[6],t[7]),n[A*4+2]=gs(t[8],t[9],t[10],t[11]),n[A*4+3]=gs(t[12],t[13],t[14],0)}function Bs(n,A,t){const e=A*4;for(let s=0;s<21;++s){const i=Math.max(-31,Math.min(31,t[s]*31))&63,r=s*6,a=r+6,g=Math.floor(r/32),o=r-g*32,I=i<<o&4294967295;if(n[e+g]|=I,a>g*32+32){const B=i>>>32-o&4294967295;n[e+g+1]|=B}}}function Za(n,A){const t=[];let e=0,s=null;const i=new Ti((g,o)=>{if(t.push(g),e+=g.length,o||e>=A){const I=new Uint8Array(e);let B=0;for(const Q of t)I.set(Q,B),B+=Q.length;s=I.slice(0,A)}}),r=1024;let a=0;for(;s==null&&a<n.length;){const g=n.slice(a,a+r);i.push(g,!1),a+=r}if(s==null&&(i.push(new Uint8Array,!0),s==null))throw new Error("Failed to decompress partial gzip");return s}class Wa{constructor({fileBytes:A,chunkBytes:t=64*1024}){this.fileBytes=A,this.chunkBytes=t,this.offset=0,this.chunks=[],this.totalBytes=0,this.gunzip=new Ti((e,s)=>{this.chunks.push(e),this.totalBytes+=e.length})}read(A){for(;this.totalBytes<A&&this.offset<this.fileBytes.length;){const i=Math.min(this.offset+this.chunkBytes,this.fileBytes.length);this.gunzip.push(this.fileBytes.subarray(this.offset,i),!1),this.offset=i}if(this.totalBytes<A&&this.offset>=this.fileBytes.length&&this.gunzip.push(new Uint8Array(0),!0),this.totalBytes<A)throw new Error(`Unexpected EOF: needed ${A}, got ${this.totalBytes}`);const t=new Uint8Array(this.totalBytes);let e=0;for(const i of this.chunks)t.set(i,e),e+=i.length;const s=t.subarray(0,A);return this.chunks=[t.subarray(A)],this.totalBytes-=A,s}}function vn(n,A,t){const e=Math.floor(n.length/32);if(e*32!==n.length)throw new Error("Invalid .splat file size");A(e);const s=new Float32Array(n.buffer);for(let i=0;i<e;++i){const r=i*32,a=i*8,g=s[a+0],o=s[a+1],I=s[a+2],B=s[a+3],Q=s[a+4],h=s[a+5],C=n[r+24]/255,E=n[r+25]/255,l=n[r+26]/255,c=n[r+27]/255,u=(n[r+28]-128)/128,d=(n[r+29]-128)/128,y=(n[r+30]-128)/128,p=(n[r+31]-128)/128;t(i,g,o,I,B,Q,h,d,y,p,u,c,C,E,l)}}function Oa(n){let A=0,t=0,e=new Uint32Array(0);return vn(n,s=>{A=s,t=as(A),e=new Uint32Array(t*4)},(s,i,r,a,g,o,I,B,Q,h,C,E,l,c,u)=>{we(e,s,i,r,a,g,o,I,B,Q,h,C,E,l,c,u)}),{packedArray:e,numSplats:A}}const Qs={0:{bytesPerCenter:12,bytesPerScale:12,bytesPerRotation:16,bytesPerColor:4,bytesPerSphericalHarmonicsComponent:4,scaleOffsetBytes:12,rotationOffsetBytes:24,colorOffsetBytes:40,sphericalHarmonicsOffsetBytes:44,scaleRange:1},1:{bytesPerCenter:6,bytesPerScale:6,bytesPerRotation:8,bytesPerColor:4,bytesPerSphericalHarmonicsComponent:2,scaleOffsetBytes:6,rotationOffsetBytes:12,colorOffsetBytes:20,sphericalHarmonicsOffsetBytes:24,scaleRange:32767},2:{bytesPerCenter:6,bytesPerScale:6,bytesPerRotation:8,bytesPerColor:4,bytesPerSphericalHarmonicsComponent:1,scaleOffsetBytes:6,rotationOffsetBytes:12,colorOffsetBytes:20,sphericalHarmonicsOffsetBytes:24,scaleRange:32767}},Hn={0:0,1:9,2:24,3:45};function Pa(n,A,t,e){var E;let r=0;const a=new DataView(n.buffer,r,4096);r+=4096;const g=a.getUint8(0),o=a.getUint8(1);if(g!==0||o<1)throw new Error(`Unsupported .ksplat version: ${g}.${o}`);const I=a.getUint32(4,!0);a.getUint32(16,!0);const B=a.getUint16(20,!0);if(B<0||B>2)throw new Error(`Invalid .ksplat compression level: ${B}`);const Q=a.getFloat32(36,!0)||-1.5,h=a.getFloat32(40,!0)||1.5;let C=4096+I*1024;for(let l=0;l<I;++l){let c=function(hA,T){if(B===0)return J.getFloat32(hA+L+T*4,!0);if(B===1)return tA(J.getUint16(hA+L+T*2,!0));const AA=J.getUint8(hA+L+T)/255;return Q+AA*(h-Q)};const u=new DataView(n.buffer,r,1024);r+=1024;const d=u.getUint32(0,!0),y=u.getUint32(4,!0),p=u.getUint32(8,!0),x=u.getUint32(12,!0),D=u.getFloat32(16,!0),w=u.getUint16(20,!0),m=(u.getUint32(24,!0)||((E=Qs[B])==null?void 0:E.scaleRange))??1,N=u.getUint32(32,!0),M=N*p,S=u.getUint32(36,!0),F=S*4,k=w*x+F,U=u.getUint16(40,!0),R=Hn[U],{bytesPerCenter:b,bytesPerScale:P,bytesPerRotation:_,bytesPerColor:j,bytesPerSphericalHarmonicsComponent:V,scaleOffsetBytes:$,rotationOffsetBytes:K,colorOffsetBytes:z,sphericalHarmonicsOffsetBytes:L}=Qs[B],Z=b+P+_+j+R*V,G=Z*y,yA=G+k,dA=[0,3,6,1,4,7,2,5,8],GA=[9,14,19,10,15,20,11,16,21,12,17,22,13,18,23],wA=[24,31,38,25,32,39,26,33,40,27,34,41,28,35,42,29,36,43,30,37,44],MA=U>=1?new Float32Array(3*3):void 0,SA=U>=2?new Float32Array(5*3):void 0,PA=U>=3?new Float32Array(7*3):void 0,FA=D/2/m,JA=C+F,TA=C+k,J=new DataView(n.buffer,TA,G),QA=new Float32Array(n.buffer,JA,x*3),Y=new Uint32Array(n.buffer,C,S);let Qt=N,Ie=M;for(let hA=0;hA<d;++hA){const T=hA*Z;let AA;if(hA<M)AA=Math.floor(hA/p);else{const At=Y[Qt-N];hA>=Ie+At&&(Qt+=1,Ie+=At),AA=Qt}const H=B===0?J.getFloat32(T+0,!0):(J.getUint16(T+0,!0)-m)*FA+QA[3*AA+0],VA=B===0?J.getFloat32(T+4,!0):(J.getUint16(T+2,!0)-m)*FA+QA[3*AA+1],Me=B===0?J.getFloat32(T+8,!0):(J.getUint16(T+4,!0)-m)*FA+QA[3*AA+2],Se=B===0?J.getFloat32(T+$+0,!0):tA(J.getUint16(T+$+0,!0)),Fe=B===0?J.getFloat32(T+$+4,!0):tA(J.getUint16(T+$+2,!0)),ci=B===0?J.getFloat32(T+$+8,!0):tA(J.getUint16(T+$+4,!0)),li=B===0?J.getFloat32(T+K+0,!0):tA(J.getUint16(T+K+0,!0)),ui=B===0?J.getFloat32(T+K+4,!0):tA(J.getUint16(T+K+2,!0)),di=B===0?J.getFloat32(T+K+8,!0):tA(J.getUint16(T+K+4,!0)),fi=B===0?J.getFloat32(T+K+12,!0):tA(J.getUint16(T+K+6,!0)),yi=J.getUint8(T+z+0)/255,wi=J.getUint8(T+z+1)/255,pi=J.getUint8(T+z+2)/255,Di=J.getUint8(T+z+3)/255;if(t(hA,H,VA,Me,Se,Fe,ci,ui,di,fi,li,Di,yi,wi,pi),U>=1&&MA){for(const[At,bt]of dA.entries())MA[At]=c(T,bt);if(SA)for(const[At,bt]of GA.entries())SA[At]=c(T,bt);if(PA)for(const[At,bt]of wA.entries())PA[At]=c(T,bt);e==null||e(hA,MA,SA,PA)}}C+=yA}}function Va(n){var c;let e=0;const s=new DataView(n.buffer,e,4096);e+=4096;const i=s.getUint8(0),r=s.getUint8(1);if(i!==0||r<1)throw new Error(`Unsupported .ksplat version: ${i}.${r}`);const a=s.getUint32(4,!0),g=s.getUint32(16,!0),o=s.getUint16(20,!0);if(o<0||o>2)throw new Error(`Invalid .ksplat compression level: ${o}`);const I=s.getFloat32(36,!0)||-1.5,B=s.getFloat32(40,!0)||1.5,Q=g,h=as(Q),C=new Uint32Array(h*4),E={};let l=4096+a*1024;for(let u=0;u<a;++u){let d=function(AA,H){if(o===0)return Y.getFloat32(AA+G+H*4,!0);if(o===1)return tA(Y.getUint16(AA+G+H*2,!0));const VA=Y.getUint8(AA+G+H)/255;return I+VA*(B-I)};const y=new DataView(n.buffer,e,1024);e+=1024;const p=y.getUint32(0,!0),x=y.getUint32(4,!0),D=y.getUint32(8,!0),w=y.getUint32(12,!0),m=y.getFloat32(16,!0),N=y.getUint16(20,!0),M=(y.getUint32(24,!0)||((c=Qs[o])==null?void 0:c.scaleRange))??1,S=y.getUint32(32,!0),F=S*D,k=y.getUint32(36,!0),U=k*4,R=N*w+U,b=y.getUint16(40,!0),P=Hn[b],{bytesPerCenter:_,bytesPerScale:j,bytesPerRotation:V,bytesPerColor:$,bytesPerSphericalHarmonicsComponent:K,scaleOffsetBytes:z,rotationOffsetBytes:L,colorOffsetBytes:Z,sphericalHarmonicsOffsetBytes:G}=Qs[o],yA=_+j+V+$+P*K,dA=yA*x,GA=dA+R,wA=[0,3,6,1,4,7,2,5,8],MA=[9,14,19,10,15,20,11,16,21,12,17,22,13,18,23],SA=[24,31,38,25,32,39,26,33,40,27,34,41,28,35,42,29,36,43,30,37,44],PA=b>=1?new Float32Array(3*3):void 0,FA=b>=2?new Float32Array(5*3):void 0,JA=b>=3?new Float32Array(7*3):void 0,TA=m/2/M,J=l+U,QA=l+R,Y=new DataView(n.buffer,QA,dA),Qt=new Float32Array(n.buffer,J,w*3),Ie=new Uint32Array(n.buffer,l,k);let hA=S,T=F;for(let AA=0;AA<p;++AA){const H=AA*yA;let VA;if(AA<F)VA=Math.floor(AA/D);else{const mt=Ie[hA-S];AA>=T+mt&&(hA+=1,T+=mt),VA=hA}const Me=o===0?Y.getFloat32(H+0,!0):(Y.getUint16(H+0,!0)-M)*TA+Qt[3*VA+0],Se=o===0?Y.getFloat32(H+4,!0):(Y.getUint16(H+2,!0)-M)*TA+Qt[3*VA+1],Fe=o===0?Y.getFloat32(H+8,!0):(Y.getUint16(H+4,!0)-M)*TA+Qt[3*VA+2],ci=o===0?Y.getFloat32(H+z+0,!0):tA(Y.getUint16(H+z+0,!0)),li=o===0?Y.getFloat32(H+z+4,!0):tA(Y.getUint16(H+z+2,!0)),ui=o===0?Y.getFloat32(H+z+8,!0):tA(Y.getUint16(H+z+4,!0)),di=o===0?Y.getFloat32(H+L+0,!0):tA(Y.getUint16(H+L+0,!0)),fi=o===0?Y.getFloat32(H+L+4,!0):tA(Y.getUint16(H+L+2,!0)),yi=o===0?Y.getFloat32(H+L+8,!0):tA(Y.getUint16(H+L+4,!0)),wi=o===0?Y.getFloat32(H+L+12,!0):tA(Y.getUint16(H+L+6,!0)),pi=Y.getUint8(H+Z+0)/255,Di=Y.getUint8(H+Z+1)/255,At=Y.getUint8(H+Z+2)/255,bt=Y.getUint8(H+Z+3)/255;if(we(C,AA,Me,Se,Fe,ci,li,ui,fi,yi,wi,di,bt,pi,Di,At),b>=1){if(PA){E.sh1||(E.sh1=new Uint32Array(Q*2));for(const[mt,Ne]of wA.entries())PA[mt]=d(H,Ne);os(E.sh1,AA,PA)}if(FA){E.sh2||(E.sh2=new Uint32Array(Q*4));for(const[mt,Ne]of MA.entries())FA[mt]=d(H,Ne);Is(E.sh2,AA,FA)}if(JA){E.sh3||(E.sh3=new Uint32Array(Q*4));for(const[mt,Ne]of SA.entries())JA[mt]=d(H,Ne);Bs(E.sh3,AA,JA)}}}l+=GA}return{packedArray:C,numSplats:Q,extra:E}}const xA={type:"Gsplat"},ri={type:"PackedSplats"},Xa=(n,A)=>new Ag({packedSplats:n,index:A}),ja=(n,A,t,e)=>new tg({packedSplats:n,index:A,base:t,count:e}),hs=n=>new eg({gsplat:n}),ai=({gsplat:n,flags:A,index:t,center:e,scales:s,quaternion:i,rgba:r,rgb:a,opacity:g,x:o,y:I,z:B,r:Q,g:h,b:C})=>new sg({gsplat:n,flags:A,index:t,center:e,scales:s,quaternion:i,rgba:r,rgb:a,opacity:g,x:o,y:I,z:B,r:Q,g:h,b:C}),$a=(n,{scale:A,rotate:t,translate:e,recolor:s})=>new ig({gsplat:n,scale:A,rotate:t,translate:e,recolor:s}),It=OA(`\n struct Gsplat {\n vec3 center;\n uint flags;\n vec3 scales;\n int index;\n vec4 quaternion;\n vec4 rgba;\n };\n const uint GSPLAT_FLAG_ACTIVE = 1u << 0u;\n\n bool isGsplatActive(uint flags) {\n return (flags & GSPLAT_FLAG_ACTIVE) != 0u;\n }\n`),gi=OA(`\n struct PackedSplats {\n usampler2DArray texture;\n int numSplats;\n };\n`),zn=OA(`\n bool readPackedSplat(usampler2DArray texture, int numSplats, int index, out Gsplat gsplat) {\n if ((index >= 0) && (index < numSplats)) {\n uvec4 packed = texelFetch(texture, splatTexCoord(index), 0);\n unpackSplat(packed, gsplat.center, gsplat.scales, gsplat.quaternion, gsplat.rgba);\n return true;\n } else {\n return false;\n }\n }\n`);class Ag extends uA{constructor({packedSplats:A,index:t}){super({inTypes:{packedSplats:ri,index:"int"},outTypes:{gsplat:xA},inputs:{packedSplats:A,index:t},globals:()=>[It,gi,zn],statements:({inputs:e,outputs:s})=>{const{gsplat:i}=s;if(!i)return[];const{packedSplats:r,index:a}=e;let g;return r&&a?g=ot(`\n if (readPackedSplat(${r}.texture, ${r}.numSplats, ${a}, ${i})) {\n bool zeroSize = all(equal(${i}.scales, vec3(0.0, 0.0, 0.0)));\n ${i}.flags = zeroSize ? 0u : GSPLAT_FLAG_ACTIVE;\n } else {\n ${i}.flags = 0u;\n }\n `):g=[`${i}.flags = 0u;`],g.push(`${i}.index = ${a??"0"};`),g}})}dynoOut(){return new RA(this,"gsplat")}}class tg extends uA{constructor({packedSplats:A,index:t,base:e,count:s}){super({inTypes:{packedSplats:ri,index:"int",base:"int",count:"int"},outTypes:{gsplat:xA},inputs:{packedSplats:A,index:t,base:e,count:s},globals:()=>[It,gi,zn],statements:({inputs:i,outputs:r})=>{const{gsplat:a}=r;if(!a)return[];const{packedSplats:g,index:o,base:I,count:B}=i;let Q;return g&&o&&I&&B?Q=ot(`\n ${a}.flags = 0u;\n if ((${o} >= ${I}) && (${o} < (${I} + ${B}))) {\n if (readPackedSplat(${g}.texture, ${g}.numSplats, ${o}, ${a})) {\n bool zeroSize = all(equal(${a}.scales, vec3(0.0, 0.0, 0.0)));\n ${a}.flags = zeroSize ? 0u : GSPLAT_FLAG_ACTIVE;\n }\n }\n `):Q=[`${a}.flags = 0u;`],Q.push(`${a}.index = ${o??"0"};`),Q}})}dynoOut(){return new RA(this,"gsplat")}}class eg extends uA{constructor({gsplat:A}){super({inTypes:{gsplat:xA},outTypes:{flags:"uint",active:"bool",index:"int",center:"vec3",scales:"vec3",quaternion:"vec4",rgba:"vec4",rgb:"vec3",opacity:"float",x:"float",y:"float",z:"float",r:"float",g:"float",b:"float"},inputs:{gsplat:A},globals:()=>[It],statements:({inputs:t,outputs:e})=>{const{gsplat:s}=t,{flags:i,active:r,index:a,center:g,scales:o,quaternion:I,rgba:B,rgb:Q,opacity:h,x:C,y:E,z:l,r:c,g:u,b:d}=e;return[i?`${i} = ${s?`${s}.flags`:"0u"};`:null,r?`${r} = isGsplatActive(${s?`${s}.flags`:"0u"});`:null,a?`${a} = ${s?`${s}.index`:"0"};`:null,g?`${g} = ${s?`${s}.center`:"vec3(0.0, 0.0, 0.0)"};`:null,o?`${o} = ${s?`${s}.scales`:"vec3(0.0, 0.0, 0.0)"};`:null,I?`${I} = ${s?`${s}.quaternion`:"vec4(0.0, 0.0, 0.0, 1.0)"};`:null,B?`${B} = ${s?`${s}.rgba`:"vec4(0.0, 0.0, 0.0, 0.0)"};`:null,Q?`${Q} = ${s?`${s}.rgba.rgb`:"vec3(0.0, 0.0, 0.0)"};`:null,h?`${h} = ${s?`${s}.rgba.a`:"0.0"};`:null,C?`${C} = ${s?`${s}.center.x`:"0.0"};`:null,E?`${E} = ${s?`${s}.center.y`:"0.0"};`:null,l?`${l} = ${s?`${s}.center.z`:"0.0"};`:null,c?`${c} = ${s?`${s}.rgba.r`:"0.0"};`:null,u?`${u} = ${s?`${s}.rgba.g`:"0.0"};`:null,d?`${d} = ${s?`${s}.rgba.b`:"0.0"};`:null].filter(Boolean)}})}}class sg extends uA{constructor({gsplat:A,flags:t,index:e,center:s,scales:i,quaternion:r,rgba:a,rgb:g,opacity:o,x:I,y:B,z:Q,r:h,g:C,b:E}){super({inTypes:{gsplat:xA,flags:"uint",index:"int",center:"vec3",scales:"vec3",quaternion:"vec4",rgba:"vec4",rgb:"vec3",opacity:"float",x:"float",y:"float",z:"float",r:"float",g:"float",b:"float"},outTypes:{gsplat:xA},inputs:{gsplat:A,flags:t,index:e,center:s,scales:i,quaternion:r,rgba:a,rgb:g,opacity:o,x:I,y:B,z:Q,r:h,g:C,b:E},globals:()=>[It],statements:({inputs:l,outputs:c})=>{const{gsplat:u}=c;if(!u)return[];const{gsplat:d,flags:y,index:p,center:x,scales:D,quaternion:w,rgba:m,rgb:N,opacity:M,x:S,y:F,z:k,r:U,g:R,b}=l;return[`${u}.flags = ${y??(d?`${d}.flags`:"0u")};`,`${u}.index = ${p??(d?`${d}.index`:"0")};`,`${u}.center = ${x??(d?`${d}.center`:"vec3(0.0, 0.0, 0.0)")};`,`${u}.scales = ${D??(d?`${d}.scales`:"vec3(0.0, 0.0, 0.0)")};`,`${u}.quaternion = ${w??(d?`${d}.quaternion`:"vec4(0.0, 0.0, 0.0, 1.0)")};`,`${u}.rgba = ${m??(d?`${d}.rgba`:"vec4(0.0, 0.0, 0.0, 0.0)")};`,N?`${u}.rgba.rgb = ${N};`:null,M?`${u}.rgba.a = ${M};`:null,S?`${u}.center.x = ${S};`:null,F?`${u}.center.y = ${F};`:null,k?`${u}.center.z = ${k};`:null,U?`${u}.rgba.r = ${U};`:null,R?`${u}.rgba.g = ${R};`:null,b?`${u}.rgba.b = ${b};`:null].filter(Boolean)}})}dynoOut(){return new RA(this,"gsplat")}}OA(`\n vec3 gsplatNormal(vec3 scales, vec4 quaternion) {\n float minScale = min(scales.x, min(scales.y, scales.z));\n vec3 normal;\n if (scales.z == minScale) {\n normal = vec3(0.0, 0.0, 1.0);\n } else if (scales.y == minScale) {\n normal = vec3(0.0, 1.0, 0.0);\n } else {\n normal = vec3(1.0, 0.0, 0.0);\n }\n return quatVec(quaternion, normal);\n }\n`);class ig extends uA{constructor({gsplat:A,scale:t,rotate:e,translate:s,recolor:i}){super({inTypes:{gsplat:xA,scale:"float",rotate:"vec4",translate:"vec3",recolor:"vec4"},outTypes:{gsplat:xA},inputs:{gsplat:A,scale:t,rotate:e,translate:s,recolor:i},globals:()=>[It],statements:({inputs:r,outputs:a,compile:g})=>{const{gsplat:o}=a;if(!o||!r.gsplat)return[];const{scale:I,rotate:B,translate:Q,recolor:h}=r,C=g.indent;return[`${o} = ${r.gsplat};`,`if (isGsplatActive(${o}.flags)) {`,I?`${C}${o}.center *= ${I};`:null,B?`${C}${o}.center = quatVec(${B}, ${o}.center);`:null,Q?`${C}${o}.center += ${Q};`:null,I?`${C}${o}.scales *= ${I};`:null,B?`${C}${o}.quaternion = quatQuat(${B}, ${o}.quaternion);`:null,h?`${C}${o}.rgba *= ${h};`:null,"}"].filter(Boolean)}})}dynoOut(){return new RA(this,"gsplat")}}const ng=n=>new rg({gsplat:n});class rg extends uA{constructor({gsplat:A}){super({inTypes:{gsplat:xA},inputs:{gsplat:A},globals:()=>[It],statements:({inputs:t,outputs:e})=>{const{output:s}=e;if(!s)return[];const{gsplat:i}=t;return i?ot(`\n if (isGsplatActive(${i}.flags)) {\n ${s} = packSplat(${i}.center, ${i}.scales, ${i}.quaternion, ${i}.rgba);\n } else {\n ${s} = uvec4(0u, 0u, 0u, 0u);\n }\n `):[`${s} = uvec4(0u, 0u, 0u, 0u);`]}})}dynoOut(){return new RA(this,"output")}}class ag extends uA{constructor({rgba8:A}){super({inTypes:{rgba8:"vec4"},inputs:{rgba8:A},statements:({inputs:t,outputs:e})=>[`target = ${t.rgba8??"vec4(0.0, 0.0, 0.0, 0.0)"};`]})}dynoOut(){return new RA(this,"rgba8")}}class Bt extends uA{constructor({key:A,type:t,count:e,value:s,update:i,globals:r}){A=A??"value",super({outTypes:{[A]:t},update:()=>{if(i){const a=i(this.value);a!==void 0&&(this.value=a)}this.uniform.value=this.value},generate:({inputs:a,outputs:g})=>{const o=(r==null?void 0:r({inputs:a,outputs:g}))??[],I={},B=g[A];return B&&(o.push(`uniform ${Rn(B,t,e)};`),I[B]=this.uniform),{globals:o,uniforms:I}}}),this.type=t,this.count=e,this.value=s,this.uniform={value:s},this.outKey=A}dynoOut(){return new RA(this,this.outKey)}}class oi extends Bt{constructor({key:A,value:t,update:e}){super({key:A,type:"int",value:t,update:e})}}class Cs extends Bt{constructor({key:A,value:t,update:e}){super({key:A,type:"float",value:t,update:e})}}class gg extends Bt{constructor({key:A,value:t,update:e}){super({key:A,type:"vec3",value:t,update:e})}}class Kn extends Bt{constructor({key:A,value:t,update:e}){super({key:A,type:"vec4",value:t,update:e})}}class Ii extends Bt{constructor({key:A,value:t,update:e}){super({key:A,type:"usampler2DArray",value:t,update:e})}}class qn{constructor({graph:A,inputs:t,outputs:e,template:s}){this.graph=A,this.template=s,this.inputs=t??{},this.outputs=e??{};const i=new Ua({indent:this.template.indent});for(const a in this.outputs)this.outputs[a]&&i.declares.add(this.outputs[a]);const r=A.compile({inputs:this.inputs,outputs:this.outputs,compile:i});this.shader=s.generate({globals:i.globals,statements:r}),this.uniforms=i.uniforms,this.updaters=i.updaters}prepareMaterial(){return og(this)}update(){for(const A of this.updaters)A()}}class _n{constructor(A){const t=A.match(/^([ \\t]*)\\{\\{\\s*GLOBALS\\s*\\}\\}/m),e=A.match(/^([ \\t]*)\\{\\{\\s*STATEMENTS\\s*\\}\\}/m);if(!t||!e)throw new Error("Template must contain {{ GLOBALS }} and {{ STATEMENTS }}");this.before=A.substring(0,t.index),this.between=A.substring(t.index+t[0].length,e.index),this.after=A.substring(e.index+e[0].length),this.indent=e[1]}generate({globals:A,statements:t}){return this.before+Array.from(A).join(`\n\n`)+this.between+t.map(e=>this.indent+e).join(`\n`)+this.after}}const Zn=new Map;function og(n){let A=Zn.get(n);return A||(A=new Ai({glslVersion:Zr,vertexShader:qa,fragmentShader:n.shader,uniforms:n.uniforms}),Zn.set(n,A),A)}function Wn(n,A,t="add"){const e=()=>{throw new Error(`Invalid ${t} types: ${n}, ${A}`)};if(n===A)return n;if(n==="int"){if(jt(A))return A;e()}if(A==="int"){if(jt(n))return n;e()}if(n==="uint"){if($t(A))return A;e()}if(A==="uint"){if($t(n))return n;e()}if(n==="float"){if(ss(A))return A;e()}if(A==="float"){if(ss(n))return n;e()}throw new Error(`Invalid ${t} types: ${n}, ${A}`)}function Ig(n,A){return Wn(n,A,"sub")}function Bg(n,A){const t=()=>{throw new Error(`Invalid mul types: ${n}, ${A}`)},e=s=>s;if(n==="int"){if(jt(A))return e(A);t()}if(A==="int"){if(jt(n))return e(n);t()}if(n==="uint"){if($t(A))return e(A);t()}if(A==="uint"){if($t(n))return e(n);t()}if(n==="float"){if(ss(A))return e(A);t()}if(A==="float"){if(ss(n))return e(n);t()}if(jt(n)||$t(n)||jt(A)||$t(A)){if(n===A)return e(n);t()}if(n==="vec2"){if(A==="vec2"||Ae(A))return e("vec2");if(A==="mat3x2")return e("vec3");if(A==="mat4x2")return e("vec4");t()}if(n==="vec3"){if(A==="mat2x3")return e("vec2");if(A==="vec3"||te(A))return e("vec3");if(A==="mat4x3")return e("vec4");t()}if(n==="vec4"){if(A==="mat2x4")return e("vec2");if(A==="mat3x4")return e("vec3");if(A==="vec4"||ee(A))return e("vec4");t()}if(A==="vec2"){if(Ae(n))return e("vec2");if(n==="mat2x3")return e("vec3");if(n==="mat2x4")return e("vec4");t()}if(A==="vec3"){if(n==="mat3x2")return e("vec2");if(te(n))return e("vec3");if(n==="mat3x4")return e("vec4");t()}if(A==="vec4"){if(n==="mat4x2")return e("vec2");if(n==="mat4x3")return e("vec3");if(ee(n))return e("vec4");t()}if(Ae(n)){if(Ae(A))return e("mat2");if(A==="mat3x2")return e("mat3x2");if(A==="mat4x2")return e("mat4x2");t()}if(n==="mat2x3"){if(Ae(A))return e("mat2x3");if(A==="mat3x2")return e("mat3");if(A==="mat4x2")return e("mat4x3");t()}if(n==="mat2x4"){if(Ae(A))return e("mat2x4");if(A==="mat3x2")return e("mat3x4");if(A==="mat4x2")return e("mat4");t()}if(n==="mat3x2"){if(A==="mat2x3")return e("mat2");if(te(A))return e("mat3x2");if(A==="mat4x3")return e("mat4x2");t()}if(te(n)){if(A==="mat2x3")return e("mat2x3");if(te(A))return e("mat3");if(A==="mat4x3")return e("mat4x3");t()}if(n==="mat3x4"){if(A==="mat2x3")return e("mat2x4");if(te(A))return e("mat3x4");if(A==="mat4x3")return e("mat4");t()}if(n==="mat4x2"){if(A==="mat2x4")return e("mat2");if(A==="mat3x4")return e("mat3x2");if(ee(A))return e("mat4x2");t()}if(n==="mat4x3"){if(A==="mat2x4")return e("mat2x3");if(A==="mat3x4")return e("mat3");if(ee(A))return e("mat4x3");t()}if(ee(n)){if(A==="mat2x4")return e("mat2x4");if(A==="mat3x4")return e("mat3x4");if(ee(A))return e("mat4");t()}throw new Error(`Invalid mul types: ${n}, ${A}`)}const Es=(n,A)=>new Cg({a:n,b:A}),Qg=(n,A)=>new Eg({a:n,b:A}),hg=(n,A)=>new cg({a:n,b:A});class Cg extends rs{constructor({a:A,b:t}){super({a:A,b:t,outKey:"sum",outTypeFunc:Wn}),this.statements=({inputs:e,outputs:s})=>[`${s.sum} = ${e.a} + ${e.b};`]}}class Eg extends rs{constructor({a:A,b:t}){super({a:A,b:t,outKey:"difference",outTypeFunc:Ig}),this.statements=({inputs:e,outputs:s})=>[`${s.difference} = ${e.a} - ${e.b};`]}}class cg extends rs{constructor({a:A,b:t}){super({a:A,b:t,outKey:"product",outTypeFunc:Bg}),this.statements=({inputs:e,outputs:s})=>[`${s.product} = ${e.a} * ${e.b};`]}}const lg=n=>new dg({a:n}),ug=(n,A)=>new yg({a:n,b:A});class dg extends ba{constructor({a:A}){super({a:A,outTypeFunc:t=>t,outKey:"normalize"}),this.statements=({inputs:t,outputs:e})=>[`${e.normalize} = normalize(${t.a});`]}}function fg(n){if(n==="float")return"vec2";if(n==="vec2")return"vec3";if(n==="vec3")return"vec4";throw new Error("Invalid type")}class yg extends rs{constructor({a:A,b:t}){const e=Ut(A),s=fg(e);super({a:A,b:t,outKey:"extend",outTypeFunc:()=>s}),this.statements=({inputs:i,outputs:r})=>[`${r.extend} = ${s}(${i.a}, ${i.b});`]}}const wg=(n,{scale:A,scales:t,rotate:e,translate:s})=>new Dg({position:n,scale:A,scales:t,rotate:e,translate:s}).outputs.position,pg=(n,{scale:A,scales:t,rotate:e})=>new mg({dir:n,scale:A,scales:t,rotate:e}).outputs.dir;class Dg extends uA{constructor({position:A,scale:t,scales:e,rotate:s,translate:i}){super({inTypes:{position:"vec3",scale:"float",scales:"vec3",rotate:"vec4",translate:"vec3"},outTypes:{position:"vec3"},inputs:{position:A,scale:t,scales:e,rotate:s,translate:i},statements:({inputs:r,outputs:a})=>{const{position:g}=a;if(!g)return[];const{scale:o,scales:I,rotate:B,translate:Q}=r;return[`${g} = ${r.position??"vec3(0.0, 0.0, 0.0)"};`,o?`${g} *= ${o};`:null,I?`${g} *= ${I};`:null,B?`${g} = quatVec(${B}, ${g});`:null,Q?`${g} += ${Q};`:null].filter(Boolean)}})}}class mg extends uA{constructor({dir:A,scale:t,scales:e,rotate:s}){super({inTypes:{dir:"vec3",scale:"float",scales:"vec3",rotate:"vec4"},outTypes:{dir:"vec3"},inputs:{dir:A,scale:t,scales:e,rotate:s},statements:({inputs:i,outputs:r})=>{const{dir:a}=r;if(!a)return[];const{scale:g,scales:o,rotate:I}=i;return[`${a} = ${i.dir??"vec3(0.0, 0.0, 0.0)"};`,g?`${a} *= ${g};`:null,o?`${a} *= ${o};`:null,I?`${a} = quatVec(${I}, ${a});`:null].filter(Boolean)}})}}var xg=`precision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp usampler2D;\nprecision highp isampler2D;\nprecision highp sampler2DArray;\nprecision highp usampler2DArray;\nprecision highp isampler2DArray;\nprecision highp sampler3D;\nprecision highp usampler3D;\nprecision highp isampler3D;\n\n#include <splatDefines>\n\nuniform uint targetLayer;\nuniform int targetBase;\nuniform int targetCount;\n\nout uvec4 target;\n\n{{ GLOBALS }}\n\nvoid produceSplat(int index) {\n {{ STATEMENTS }}\n}\n\nvoid main() {\n int targetIndex = int(targetLayer << SPLAT_TEX_LAYER_BITS) + int(uint(gl_FragCoord.y) << SPLAT_TEX_WIDTH_BITS) + int(gl_FragCoord.x);\n int index = targetIndex - targetBase;\n\n if ((index >= 0) && (index < targetCount)) {\n produceSplat(index);\n } else {\n target = uvec4(0u, 0u, 0u, 0u);\n }\n}`;const O=class O{constructor(A={}){this.maxSplats=0,this.numSplats=0,this.packedArray=null,this.isInitialized=!1,this.target=null,this.source=null,this.needsUpdate=!0,this.extra={},this.dyno=new On({packedSplats:this}),this.initialized=Promise.resolve(this),this.reinitialize(A)}reinitialize(A){this.isInitialized=!1,A.url||A.fileBytes||A.construct?this.initialized=this.asyncInitialize(A).then(()=>(this.isInitialized=!0,this)):(this.initialize(A),this.isInitialized=!0,this.initialized=Promise.resolve(this))}initialize(A){A.packedArray?(this.packedArray=A.packedArray,this.maxSplats=Math.floor(this.packedArray.length/4),this.maxSplats=Math.floor(this.maxSplats/W)*W,this.numSplats=Math.min(this.maxSplats,A.numSplats??Number.POSITIVE_INFINITY)):(this.maxSplats=A.maxSplats??0,this.numSplats=0),this.extra=A.extra??{}}async asyncInitialize(A){const{url:t,fileBytes:e,construct:s}=A;if(t){const i=new Wg;i.packedSplats=this,await i.loadAsync(t)}else if(e){const i=await Ir({input:e,fileType:A.fileType,pathOrUrl:A.fileName??t});this.initialize(i)}if(s){const i=s(this);i instanceof Promise&&await i}}dispose(){this.target&&(this.target.dispose(),this.target=null),this.source&&(this.source.dispose(),this.source=null)}ensureSplats(A){const t=A<=this.maxSplats?this.maxSplats:Math.max(A,2*this.maxSplats),e=this.packedArray?this.packedArray.length/4:0;if(!this.packedArray||t>e){this.maxSplats=UA(t).maxSplats;const s=new Uint32Array(this.maxSplats*4);this.packedArray&&s.set(this.packedArray),this.packedArray=s}return this.packedArray}ensureSplatsSh(A,t){let e,s;if(A===0)return this.ensureSplats(t);if(A===1)e=2,s="sh1";else if(A===2)e=4,s="sh2";else if(A===3)e=4,s="sh3";else throw new Error(`Invalid level: ${A}`);let i=this.extra[s]?this.extra[s].length/e:0;const r=t<=i?i:Math.max(t,2*i);if(!this.extra[s]||r>i){i=UA(r).maxSplats;const a=new Uint32Array(i*e);this.extra[s]&&a.set(this.extra[s]),this.extra[s]=a}return this.extra[s]}getSplat(A){if(!this.packedArray||A>=this.numSplats)throw new Error("Invalid index");return Jn(this.packedArray,A)}setSplat(A,t,e,s,i,r){const a=this.ensureSplats(A+1);we(a,A,t.x,t.y,t.z,e.x,e.y,e.z,s.x,s.y,s.z,s.w,i,r.r,r.g,r.b),this.numSplats=Math.max(this.numSplats,A+1)}pushSplat(A,t,e,s,i){const r=this.ensureSplats(this.numSplats+1);we(r,this.numSplats,A.x,A.y,A.z,t.x,t.y,t.z,e.x,e.y,e.z,e.w,s,i.r,i.g,i.b),++this.numSplats}forEachSplat(A){if(!(!this.packedArray||!this.numSplats))for(let t=0;t<this.numSplats;++t){const e=Jn(this.packedArray,t);A(t,e.center,e.scales,e.quaternion,e.opacity,e.color)}}ensureGenerate(A){if(this.target&&(A??1)<=this.maxSplats)return!1;this.dispose();const t=UA(A??1),{width:e,height:s,depth:i}=t;return this.maxSplats=t.maxSplats,this.target=new In(e,s,i,{depthBuffer:!1,stencilBuffer:!1,generateMipmaps:!1,magFilter:Et,minFilter:Et}),this.target.texture.format=Yt,this.target.texture.type=Mt,this.target.texture.internalFormat="RGBA32UI",this.target.scissorTest=!0,!0}generateMapping(A){let t=0;const e=A.map(s=>{const i=t,r=Math.ceil(s/W)*W;return t+=r,{base:i,count:s}});return{maxSplats:t,mapping:e}}getTexture(){return this.target?this.target.texture:this.source||this.packedArray?this.maybeUpdateSource():O.getEmpty()}maybeUpdateSource(){if(!this.packedArray)throw new Error("No packed splats");if(this.needsUpdate||!this.source){if(this.needsUpdate=!1,this.source){const{width:A,height:t,depth:e}=this.source.image;this.maxSplats!==A*t*e&&(this.source.dispose(),this.source=null)}if(this.source)this.packedArray.buffer!==this.source.image.data.buffer&&(this.source.image.data=new Uint8Array(this.packedArray.buffer));else{const{width:A,height:t,depth:e}=UA(this.maxSplats);this.source=new ct(this.packedArray,A,t,e),this.source.format=Yt,this.source.type=Mt,this.source.internalFormat="RGBA32UI",this.source.needsUpdate=!0}this.source.needsUpdate=!0}return this.source}static getEmpty(){if(!O.emptySource){const{width:A,height:t,depth:e,maxSplats:s}=UA(1),i=new Uint32Array(s*4);O.emptySource=new ct(i,A,t,e),O.emptySource.format=Yt,O.emptySource.type=Mt,O.emptySource.internalFormat="RGBA32UI",O.emptySource.needsUpdate=!0}return O.emptySource}prepareProgramMaterial(A){let t=O.generatorProgram.get(A);if(!t){const s=ns({index:"int"},{output:"uvec4"},({index:i})=>{A.inputs.index=i;const r=A.outputs.gsplat;return{output:ng(r)}});O.programTemplate||(O.programTemplate=new _n(xg)),t=new qn({graph:s,inputs:{index:"index"},outputs:{output:"target"},template:O.programTemplate}),Object.assign(t.uniforms,{targetLayer:{value:0},targetBase:{value:0},targetCount:{value:0}}),O.generatorProgram.set(A,t)}const e=t.prepareMaterial();return O.mesh.material=e,{program:t,material:e}}saveRenderState(A){return{xrEnabled:A.xr.enabled,autoClear:A.autoClear}}resetRenderState(A,t){A.setRenderTarget(null),A.xr.enabled=t.xrEnabled,A.autoClear=t.autoClear}generate({generator:A,base:t,count:e,renderer:s}){if(!this.target)throw new Error("Target must be initialized with ensureSplats");if(t+e>this.maxSplats)throw new Error("Base + count exceeds maxSplats");const{program:i,material:r}=this.prepareProgramMaterial(A);i.update();const a=this.saveRenderState(s),g=Math.ceil((t+e)/W)*W,o=W*wt;for(r.uniforms.targetBase.value=t,r.uniforms.targetCount.value=e;t<g;){const I=Math.floor(t/o);r.uniforms.targetLayer.value=I;const B=I*o,Q=Math.floor((t-B)/W),h=Math.min(wt,Math.ceil((g-B)/W));this.target.scissor.set(0,Q,W,h-Q),s.setRenderTarget(this.target,I),s.xr.enabled=!1,s.autoClear=!1,s.render(O.scene,O.camera),t+=W*(h-Q)}return this.resetRenderState(s,a),{nextBase:g}}};O.emptySource=null,O.programTemplate=null,O.generatorProgram=new Map,O.geometry=new es(2,2),O.mesh=new xn(O.geometry,new Ai({visible:!1})),O.scene=new Sn().add(O.mesh),O.camera=new Mn;let ie=O;class On extends Bt{constructor({packedSplats:A}={}){super({key:"packedSplats",type:ri,globals:()=>[gi],value:{texture:ie.getEmpty(),numSplats:0},update:t=>{var e,s;return t.texture=((e=this.packedSplats)==null?void 0:e.getTexture())??ie.getEmpty(),t.numSplats=((s=this.packedSplats)==null?void 0:s.numSplats)??0,t}}),this.packedSplats=A}}var Mg=`precision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp usampler2D;\nprecision highp isampler2D;\nprecision highp sampler2DArray;\nprecision highp usampler2DArray;\nprecision highp isampler2DArray;\nprecision highp sampler3D;\nprecision highp usampler3D;\nprecision highp isampler3D;\n\n#include <splatDefines>\n\nuniform uint targetLayer;\nuniform int targetBase;\nuniform int targetCount;\n\nout vec4 target;\n\n{{ GLOBALS }}\n\nvoid computeReadback(int index) {\n {{ STATEMENTS }}\n}\n\nvoid main() {\n int targetIndex = int(targetLayer << SPLAT_TEX_LAYER_BITS) + int(uint(gl_FragCoord.y) << SPLAT_TEX_WIDTH_BITS) + int(gl_FragCoord.x);\n int index = targetIndex - targetBase;\n\n if ((index >= 0) && (index < targetCount)) {\n computeReadback(index);\n } else {\n target = vec4(0.0, 0.0, 0.0, 0.0);\n }\n}`;const IA=class IA{constructor({renderer:A}={}){this.renderer=A,this.capacity=0,this.count=0}dispose(){this.target&&(this.target.dispose(),this.target=void 0)}ensureBuffer(A,t){const s=Math.ceil(Math.max(1,A)/W)*W*4;if(t.byteLength>=s)return t;const i=new ArrayBuffer(s);if(t instanceof ArrayBuffer)return i;const r=t.constructor;return new r(i)}ensureCapacity(A){const{width:t,height:e,depth:s,maxSplats:i}=UA(A);(!this.target||i>this.capacity)&&(this.dispose(),this.capacity=i,this.target=new In(t,e,s,{depthBuffer:!1,stencilBuffer:!1,generateMipmaps:!1,magFilter:Et,minFilter:Et}),this.target.texture.format=Ye,this.target.texture.type=Le,this.target.texture.internalFormat="RGBA8",this.target.scissorTest=!0)}prepareProgramMaterial(A){let t=IA.readbackProgram.get(A);if(!t){const s=ns({index:"int"},{rgba8:"vec4"},({index:i})=>(A.inputs.index=i,{rgba8:new ag({rgba8:A.outputs.rgba8})}));IA.programTemplate||(IA.programTemplate=new _n(Mg)),t=new qn({graph:s,inputs:{index:"index"},outputs:{rgba8:"target"},template:IA.programTemplate}),Object.assign(t.uniforms,{targetLayer:{value:0},targetBase:{value:0},targetCount:{value:0}}),IA.readbackProgram.set(A,t)}const e=t.prepareMaterial();return IA.mesh.material=e,{program:t,material:e}}saveRenderState(A){return{xrEnabled:A.xr.enabled,autoClear:A.autoClear}}resetRenderState(A,t){A.setRenderTarget(null),A.xr.enabled=t.xrEnabled,A.autoClear=t.autoClear}process({count:A,material:t}){const e=this.renderer;if(!e)throw new Error("No renderer");if(!this.target)throw new Error("No target");const s=W*wt;t.uniforms.targetBase.value=0,t.uniforms.targetCount.value=A;let i=0;for(;i<A;){const r=Math.floor(i/s),a=r*s,g=Math.min(wt,Math.ceil((A-a)/W));t.uniforms.targetLayer.value=r,this.target.scissor.set(0,0,W,g),e.setRenderTarget(this.target,r),e.xr.enabled=!1,e.autoClear=!1,e.render(IA.scene,IA.camera),i+=W*g}this.count=A}async read({readback:A}){const t=this.renderer;if(!t)throw new Error("No renderer");if(!this.target)throw new Error("No target");const e=Math.ceil(this.count/W)*W;if(A.byteLength<e*4)throw new Error(`Readback buffer too small: ${A.byteLength} < ${e*4}`);const s=new Uint8Array(A instanceof ArrayBuffer?A:A.buffer),i=W*wt;let r=0;const a=[];for(;r<this.count;){const g=Math.floor(r/i),o=g*i,I=Math.min(wt,Math.ceil((this.count-o)/W));t.setRenderTarget(this.target,g);const B=W*I*4,Q=s.subarray(o*4,o*4+B),h=t==null?void 0:t.readRenderTargetPixelsAsync(this.target,0,0,W,I,Q);a.push(h),r+=W*I}return Promise.all(a).then(()=>A)}render({reader:A,count:t,renderer:e}){if(this.renderer=e||this.renderer,!this.renderer)throw new Error("No renderer");this.ensureCapacity(t);const{program:s,material:i}=this.prepareProgramMaterial(A);s.update();const r=this.saveRenderState(this.renderer);this.process({count:t,material:i}),this.resetRenderState(this.renderer,r)}async readback({readback:A}){if(!this.renderer)throw new Error("No renderer");const t=this.saveRenderState(this.renderer),e=this.read({readback:A});return this.resetRenderState(this.renderer,t),e}async renderReadback({reader:A,count:t,renderer:e,readback:s}){if(this.renderer=e||this.renderer,!this.renderer)throw new Error("No renderer");this.ensureCapacity(t);const{program:i,material:r}=this.prepareProgramMaterial(A);i.update();const a=this.saveRenderState(this.renderer);this.process({count:t,material:r});const g=this.read({readback:s});return this.resetRenderState(this.renderer,a),g}getTexture(){var A;return(A=this.target)==null?void 0:A.texture}};IA.programTemplate=null,IA.readbackProgram=new Map,IA.geometry=new es(2,2),IA.mesh=new xn(IA.geometry,new Ai({visible:!1})),IA.scene=new Sn().add(IA.mesh),IA.camera=new Mn;let Bi=IA;const BA=class BA{constructor(A={}){this.capacity=0,this.count=0,this.array=null,this.readback=null,this.source=null,this.needsUpdate=!0,this.dyno=new Bt({key:"rgbaArray",type:Vn,globals:()=>[Xn],value:{texture:BA.getEmpty(),count:0},update:t=>{var e;return t.texture=((e=this.readback)==null?void 0:e.getTexture())??this.source??BA.getEmpty(),t.count=this.count,t}}),A.array?(this.array=A.array,this.capacity=Math.floor(this.array.length/4),this.capacity=Math.floor(this.capacity/W)*W,this.count=Math.min(this.capacity,A.count??Number.POSITIVE_INFINITY)):(this.capacity=A.capacity??0,this.count=0)}dispose(){this.readback&&(this.readback.dispose(),this.readback=null),this.source&&(this.source.dispose(),this.source=null)}ensureCapacity(A){var t;if(!this.array||A>(((t=this.array)==null?void 0:t.length)??0)/4){this.capacity=UA(A).maxSplats;const e=new Uint8Array(this.capacity*4);this.array&&e.set(this.array),this.array=e}return this.array}getTexture(){var t;let A=(t=this.readback)==null?void 0:t.getTexture();return(this.source||this.array)&&(A=this.maybeUpdateSource()),A??BA.getEmpty()}maybeUpdateSource(){if(!this.array)throw new Error("No array");if(this.needsUpdate||!this.source){if(this.needsUpdate=!1,this.source){const{width:A,height:t,depth:e}=this.source.image;this.capacity!==A*t*e&&(this.source.dispose(),this.source=null)}if(this.source)this.array.buffer!==this.source.image.data.buffer&&(this.source.image.data=new Uint8Array(this.array.buffer));else{const{width:A,height:t,depth:e}=UA(this.capacity);this.source=new ct(this.array,A,t,e),this.source.format=Ye,this.source.type=Le,this.source.internalFormat="RGBA8",this.source.needsUpdate=!0}this.source.needsUpdate=!0}return this.source}render({reader:A,count:t,renderer:e}){this.readback||(this.readback=new Bi({renderer:e})),this.readback.render({reader:A,count:t,renderer:e}),this.capacity=this.readback.capacity,this.count=this.readback.count}fromPackedSplats({packedSplats:A,base:t,count:e,renderer:s}){const{dynoSplats:i,dynoBase:r,dynoCount:a,reader:g}=BA.makeDynos();return i.packedSplats=A,r.value=t,a.value=e,this.render({reader:g,count:e,renderer:s}),this}async read(){if(!this.readback)throw new Error("No readback");return(!this.array||this.array.length<this.count*4)&&(this.array=new Uint8Array(this.capacity*4)),(await this.readback.readback({readback:this.array})).subarray(0,this.count*4)}static getEmpty(){if(!BA.emptySource){const A=new Uint8Array(4);BA.emptySource=new ct(A,1,1,1),BA.emptySource.format=Ye,BA.emptySource.type=Le,BA.emptySource.internalFormat="RGBA8",BA.emptySource.needsUpdate=!0}return BA.emptySource}static makeDynos(){if(!BA.dynos){const A=new On,t=new oi({value:0}),e=new oi({value:0}),s=ns({index:"int"},{rgba8:"vec4"},({index:i})=>{if(!i)throw new Error("index is undefined");i=Es(i,t);const r=ja(A,i,t,e);return{rgba8:hs(r).outputs.rgba}});BA.dynos={dynoSplats:A,dynoBase:t,dynoCount:e,reader:s}}return BA.dynos}};BA.emptySource=null,BA.dynos=null;let Pn=BA;const Vn={type:"RgbaArray"},Xn=OA(`\n struct RgbaArray {\n sampler2DArray texture;\n int count;\n };\n`);function Sg(n,A){return new uA({inTypes:{rgba:Vn,index:"int"},outTypes:{rgba:"vec4"},inputs:{rgba:n,index:A},globals:()=>[Xn],statements:({inputs:e,outputs:s})=>ot(`\n if ((index >= 0) && (index < ${e.rgba}.count)) {\n ${s.rgba} = texelFetch(${e.rgba}.texture, splatTexCoord(index), 0);\n } else {\n ${s.rgba} = vec4(0.0, 0.0, 0.0, 0.0);\n }\n `)}).outputs.rgba}function Fg(n){switch(n){case"all":return 0;case"plane":return 1;case"sphere":return 2;case"box":return 3;case"ellipsoid":return 4;case"cylinder":return 5;case"capsule":return 6;case"infinite_cone":return 7;default:throw new Error(`Unknown SDF type: ${n}`)}}function Ng(n){switch(n){case"multiply":return 0;case"set_rgb":return 1;case"add_rgba":return 2;default:throw new Error(`Unknown blend mode: ${n}`)}}class kg extends mA{constructor(A={}){super();const{type:t,invert:e,opacity:s,color:i,displace:r,radius:a}=A;this.type=t??"sphere",this.invert=e??!1,this.opacity=s??1,this.color=i??new kt(1,1,1),this.displace=r??new f(0,0,0),this.radius=a??0}}const ws=class ws extends mA{constructor(A={}){const{name:t,rgbaBlendMode:e="multiply",sdfSmooth:s=0,softEdge:i=0,invert:r=!1,sdfs:a=null}=A;super(),this.rgbaBlendMode=e,this.sdfSmooth=s,this.softEdge=i,this.invert=r,this.sdfs=a,this.ordering=ws.nextOrdering++,this.name=t??`Edit ${this.ordering}`}addSdf(A){this.sdfs==null&&(this.sdfs=[]),this.sdfs.includes(A)||this.sdfs.push(A)}removeSdf(A){this.sdfs!=null&&(this.sdfs=this.sdfs.filter(t=>t!==A))}};ws.nextOrdering=1;let Qi=ws;class Rg{constructor({maxSdfs:A,maxEdits:t}){this.maxSdfs=Math.max(16,A??0),this.numSdfs=0,this.sdfData=new Uint32Array(this.maxSdfs*8*4),this.sdfFloatData=new Float32Array(this.sdfData.buffer),this.sdfTexture=this.newSdfTexture(this.sdfData,this.maxSdfs),this.dynoSdfArray=new Bt({key:"sdfArray",type:jn,globals:()=>[$n],value:{numSdfs:0,sdfTexture:this.sdfTexture},update:e=>(e.numSdfs=this.numSdfs,e.sdfTexture=this.sdfTexture,e)}),this.maxEdits=Math.max(16,t??0),this.numEdits=0,this.editData=new Uint32Array(this.maxEdits*4),this.editFloatData=new Float32Array(this.editData.buffer),this.dynoNumEdits=new oi({value:0}),this.dynoEdits=this.newEdits(this.editData,this.maxEdits)}newSdfTexture(A,t){const e=new ya(A,8,t,Yt,Mt);return e.internalFormat="RGBA32UI",e.needsUpdate=!0,e}newEdits(A,t){return new Bt({key:"edits",type:"uvec4",count:t,globals:()=>[Ar],value:A})}ensureCapacity({maxSdfs:A,maxEdits:t}){let e=!1;return A>this.sdfTexture.image.height&&(this.sdfTexture.dispose(),this.maxSdfs=Math.max(this.maxSdfs*2,A),this.sdfData=new Uint32Array(this.maxSdfs*8*4),this.sdfFloatData=new Float32Array(this.sdfData.buffer),this.sdfTexture=this.newSdfTexture(this.sdfData,this.maxSdfs)),t>(this.dynoEdits.count??0)&&(this.maxEdits=Math.max(this.maxEdits*2,t),this.editData=new Uint32Array(this.maxEdits*4),this.editFloatData=new Float32Array(this.editData.buffer),this.dynoEdits=this.newEdits(this.editData,this.maxEdits),e=!0),e}updateEditData(A,t){const e=this.editData[A]!==t;return this.editData[A]=t,e}updateEditFloatData(A,t){ne[0]=t;const e=this.editFloatData[A]!==ne[0];return e&&(this.editFloatData[A]=ne[0]),e}encodeEdit(A,{sdfFirst:t,sdfCount:e,invert:s,rgbaBlendMode:i,softEdge:r,sdfSmooth:a}){const g=A*4;let o=!1;return o=this.updateEditData(g+0,i|(s?256:0))||o,o=this.updateEditData(g+1,t|e<<16)||o,o=this.updateEditFloatData(g+2,r)||o,o=this.updateEditFloatData(g+3,a)||o,o}updateSdfData(A,t){const e=this.sdfData[A]!==t;return this.sdfData[A]=t,e}updateSdfFloatData(A,t){ne[0]=t;const e=this.sdfFloatData[A]!==ne[0];return e&&(this.sdfFloatData[A]=ne[0]),e}encodeSdf(A,{sdfType:t,invert:e,center:s,quaternion:i,scale:r,sizes:a},g){const o=A*32,I=t|(e?256:0);let B=!1;B=this.updateSdfFloatData(o+0,(s==null?void 0:s.x)??0)||B,B=this.updateSdfFloatData(o+1,(s==null?void 0:s.y)??0)||B,B=this.updateSdfFloatData(o+2,(s==null?void 0:s.z)??0)||B,B=this.updateSdfData(o+3,I)||B,B=this.updateSdfFloatData(o+4,(i==null?void 0:i.x)??0)||B,B=this.updateSdfFloatData(o+5,(i==null?void 0:i.y)??0)||B,B=this.updateSdfFloatData(o+6,(i==null?void 0:i.z)??0)||B,B=this.updateSdfFloatData(o+7,(i==null?void 0:i.w)??0)||B,B=this.updateSdfFloatData(o+8,(r==null?void 0:r.x)??0)||B,B=this.updateSdfFloatData(o+9,(r==null?void 0:r.y)??0)||B,B=this.updateSdfFloatData(o+10,(r==null?void 0:r.z)??0)||B,B=this.updateSdfData(o+11,0)||B,B=this.updateSdfFloatData(o+12,(a==null?void 0:a.x)??0)||B,B=this.updateSdfFloatData(o+13,(a==null?void 0:a.y)??0)||B,B=this.updateSdfFloatData(o+14,(a==null?void 0:a.z)??0)||B,B=this.updateSdfFloatData(o+15,(a==null?void 0:a.w)??0)||B;const Q=Math.min(4,g.length);for(let h=0;h<Q;++h){const C=o+16+h*4;B=this.updateSdfFloatData(C+0,g[h].x)||B,B=this.updateSdfFloatData(C+1,g[h].y)||B,B=this.updateSdfFloatData(C+2,g[h].z)||B,B=this.updateSdfFloatData(C+3,g[h].w)||B}return B}update(A){const t=A.reduce((B,{sdfs:Q})=>B+Q.length,0),e=this.ensureCapacity({maxEdits:A.length,maxSdfs:t}),s=[new fA,new fA],i=new f,r=new gA,a=new f,g=new fA;let o=0,I=e;A.length!==this.dynoNumEdits.value&&(this.dynoNumEdits.value=A.length,this.numEdits=A.length,I=!0);for(const[B,{edit:Q,sdfs:h}]of A.entries()){I=this.encodeEdit(B,{sdfFirst:o,sdfCount:h.length,invert:Q.invert,rgbaBlendMode:Ng(Q.rgbaBlendMode),softEdge:Q.softEdge,sdfSmooth:Q.sdfSmooth})||I;let C=!1;for(const E of h)g.set(E.scale.x,E.scale.y,E.scale.z,E.radius),E.scale.setScalar(1),E.updateMatrixWorld(),E.matrixWorld.clone().invert().decompose(i,r,a),E.scale.set(g.x,g.y,g.z),E.updateMatrixWorld(),s[0].set(E.color.r,E.color.g,E.color.b,E.opacity),s[1].set(E.displace.x,E.displace.y,E.displace.z,1),C=this.encodeSdf(o,{sdfType:Fg(E.type),invert:E.invert,center:i,quaternion:r,scale:a,sizes:g},s)||C,o+=1;this.numSdfs=o,C&&(this.sdfTexture.needsUpdate=!0),I||(I=C)}return{updated:I,dynoUpdated:e}}modify(A){return Ug(A,this.dynoSdfArray,this.dynoNumEdits,this.dynoEdits)}}const jn={type:"SdfArray"},$n=OA(`\n struct SdfArray {\n int numSdfs;\n usampler2D sdfTexture;\n };\n\n void unpackSdfArray(\n usampler2D sdfTexture, int sdfIndex, out uint flags,\n out vec3 center, out vec4 quaternion, out vec3 scale, out vec4 sizes,\n int numValues, out vec4 values[4]\n ) {\n uvec4 temp = texelFetch(sdfTexture, ivec2(0, sdfIndex), 0);\n flags = temp.w;\n center = vec3(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z));\n\n temp = texelFetch(sdfTexture, ivec2(1, sdfIndex), 0);\n quaternion = vec4(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z), uintBitsToFloat(temp.w));\n\n temp = texelFetch(sdfTexture, ivec2(2, sdfIndex), 0);\n scale = vec3(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z));\n\n temp = texelFetch(sdfTexture, ivec2(3, sdfIndex), 0);\n sizes = vec4(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z), uintBitsToFloat(temp.w));\n\n for (int i = 0; i < numValues; ++i) {\n temp = texelFetch(sdfTexture, ivec2(4 + i, sdfIndex), 0);\n values[i] = vec4(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z), uintBitsToFloat(temp.w));\n }\n }\n\n const uint SDF_FLAG_TYPE = 0xFFu;\n const uint SDF_FLAG_INVERT = 1u << 8u;\n\n const uint SDF_TYPE_ALL = 0u;\n const uint SDF_TYPE_PLANE = 1u;\n const uint SDF_TYPE_SPHERE = 2u;\n const uint SDF_TYPE_BOX = 3u;\n const uint SDF_TYPE_ELLIPSOID = 4u;\n const uint SDF_TYPE_CYLINDER = 5u;\n const uint SDF_TYPE_CAPSULE = 6u;\n const uint SDF_TYPE_INFINITE_CONE = 7u;\n\n float evaluateSdfArray(\n usampler2D sdfTexture, int numSdfs, int sdfFirst, int sdfCount, vec3 pos,\n float smoothK, int numValues, out vec4 outValues[4]\n ) {\n float distanceAccum = (smoothK == 0.0) ? 1.0 / 0.0 : 0.0;\n float maxExp = -1.0 / 0.0;\n for (int i = 0; i < numValues; ++i) {\n outValues[i] = vec4(0.0);\n }\n\n uint flags;\n vec3 center, scale;\n vec4 quaternion, sizes;\n vec4 values[4];\n\n int sdfLast = min(sdfFirst + sdfCount, numSdfs);\n for (int index = sdfFirst; index < sdfLast; ++index) {\n unpackSdfArray(sdfTexture, index, flags, center, quaternion, scale, sizes, numValues, values);\n uint sdfType = flags & SDF_FLAG_TYPE;\n vec3 sdfPos = quatVec(quaternion, pos * scale) + center;\n\n float distance;\n switch (sdfType) {\n case SDF_TYPE_ALL:\n distance = -1.0 / 0.0;\n break;\n case SDF_TYPE_PLANE: {\n distance = sdfPos.z;\n break;\n }\n case SDF_TYPE_SPHERE: {\n distance = length(sdfPos) - sizes.w;\n break;\n }\n case SDF_TYPE_BOX: {\n vec3 q = abs(sdfPos) - sizes.xyz + sizes.w;\n distance = length(max(q, 0.0)) + min(max(q.x, max(q.y, q.z)), 0.0) - sizes.w;\n break;\n }\n case SDF_TYPE_ELLIPSOID: {\n vec3 sizes = sizes.xyz;\n float k0 = length(sdfPos / sizes);\n float k1 = length(sdfPos / dot(sizes, sizes));\n distance = k0 * (k0 - 1.0) / k1;\n break;\n }\n case SDF_TYPE_CYLINDER: {\n vec2 d = abs(vec2(length(sdfPos.xz), sdfPos.y)) - sizes.wy;\n distance = min(max(d.x, d.y), 0.0) + length(max(d, 0.0));\n break;\n }\n case SDF_TYPE_CAPSULE: {\n sdfPos.y -= clamp(sdfPos.y, -0.5 * sizes.y, 0.5 * sizes.y);\n distance = length(sdfPos) - sizes.w;\n break;\n }\n case SDF_TYPE_INFINITE_CONE: {\n float angle = 0.25 * PI * sizes.w;\n vec2 c = vec2(sin(angle), cos(angle));\n vec2 q = vec2(length(sdfPos.xy), -sdfPos.z);\n float d = length(q - c * max(dot(q, c), 0.0));\n distance = d * (((q.x * c.y - q.y * c.x) < 0.0) ? -1.0 : 1.0);\n break;\n }\n }\n\n if ((flags & SDF_FLAG_INVERT) != 0u) {\n distance = -distance;\n }\n\n if (smoothK == 0.0) {\n if (distance < distanceAccum) {\n distanceAccum = distance;\n for (int i = 0; i < numValues; ++i) {\n outValues[i] = values[i];\n }\n }\n } else {\n float scaledDistance = -distance / smoothK;\n if (scaledDistance > maxExp) {\n float scale = exp(maxExp - scaledDistance);\n distanceAccum *= scale;\n for (int i = 0; i < numValues; ++i) {\n outValues[i] *= scale;\n }\n maxExp = scaledDistance;\n }\n\n float weight = exp(scaledDistance - maxExp);\n distanceAccum += weight;\n for (int i = 0; i < numValues; ++i) {\n outValues[i] += weight * values[i];\n }\n }\n }\n\n if (smoothK == 0.0) {\n return distanceAccum;\n } else {\n // Very distant SDFs may result in 0 accumulation\n if (distanceAccum == 0.0) {\n return 1.0 / 0.0;\n }\n for (int i = 0; i < numValues; ++i) {\n outValues[i] /= distanceAccum;\n }\n return (-log(distanceAccum) - maxExp) * smoothK;\n }\n }\n\n float modulateSdfArray(\n usampler2D sdfTexture, int numSdfs, int sdfFirst, int sdfCount, vec3 pos,\n float smoothK, int numValues, out vec4 values[4],\n float softEdge, bool invert\n ) {\n float distance = evaluateSdfArray(sdfTexture, numSdfs, sdfFirst, sdfCount, pos, smoothK, numValues, values);\n if (invert) {\n distance = -distance;\n }\n\n return (softEdge == 0.0) ? ((distance < 0.0) ? 1.0 : 0.0)\n : clamp(-distance / softEdge + 0.5, 0.0, 1.0);\n }\n`),Ar=OA(`\n const uint EDIT_FLAG_BLEND = 0xFFu;\n const uint EDIT_BLEND_MULTIPLY = 0u;\n const uint EDIT_BLEND_SET_RGB = 1u;\n const uint EDIT_BLEND_ADD_RGBA = 2u;\n const uint EDIT_FLAG_INVERT = 0x100u;\n\n void decodeEdit(\n uvec4 packedEdit, out int sdfFirst, out int sdfCount,\n out bool invert, out uint rgbaBlendMode, out float softEdge, out float sdfSmooth\n ) {\n rgbaBlendMode = packedEdit.x & EDIT_FLAG_BLEND;\n invert = (packedEdit.x & EDIT_FLAG_INVERT) != 0u;\n\n sdfFirst = int(packedEdit.y & 0xFFFFu);\n sdfCount = int(packedEdit.y >> 16u);\n\n softEdge = uintBitsToFloat(packedEdit.z);\n sdfSmooth = uintBitsToFloat(packedEdit.w);\n }\n\n void applyRgbaDisplaceEdit(\n usampler2D sdfTexture, int numSdfs, int sdfFirst, int sdfCount, inout vec3 pos,\n float smoothK, float softEdge, bool invert, uint rgbaBlendMode, inout vec4 rgba\n ) {\n vec4 values[4];\n float modulate = modulateSdfArray(sdfTexture, numSdfs, sdfFirst, sdfCount, pos, smoothK, 2, values, softEdge, invert);\n // On Android, moving values[0] is necessary to work around a compiler bug.\n vec4 sdfRgba = values[0];\n vec4 sdfDisplaceScale = values[1];\n\n vec4 target;\n switch (rgbaBlendMode) {\n case EDIT_BLEND_MULTIPLY:\n target = rgba * sdfRgba;\n break;\n case EDIT_BLEND_SET_RGB:\n target = vec4(sdfRgba.rgb, rgba.a * sdfRgba.a);\n break;\n case EDIT_BLEND_ADD_RGBA:\n target = rgba + sdfRgba;\n break;\n default:\n // Debug output if blend mode not set\n target = vec4(fract(pos), 1.0);\n }\n rgba = mix(rgba, target, modulate);\n pos += sdfDisplaceScale.xyz * modulate;\n }\n\n void applyPackedRgbaDisplaceEdit(uvec4 packedEdit, usampler2D sdfTexture, int numSdfs, inout vec3 pos, inout vec4 rgba) {\n int sdfFirst, sdfCount;\n bool invert;\n uint rgbaBlendMode;\n float softEdge, sdfSmooth;\n decodeEdit(packedEdit, sdfFirst, sdfCount, invert, rgbaBlendMode, softEdge, sdfSmooth);\n applyRgbaDisplaceEdit(sdfTexture, numSdfs, sdfFirst, sdfCount, pos, sdfSmooth, softEdge, invert, rgbaBlendMode, rgba);\n }\n`);function Ug(n,A,t,e){return new uA({inTypes:{gsplat:xA,sdfArray:jn,numEdits:"int",rgbaDisplaceEdits:"uvec4"},outTypes:{gsplat:xA},globals:()=>[$n,Ar],inputs:{gsplat:n,sdfArray:A,numEdits:t,rgbaDisplaceEdits:e},statements:({inputs:i,outputs:r})=>{const{sdfArray:a,numEdits:g,rgbaDisplaceEdits:o}=i,{gsplat:I}=r;return ot(`\n ${I} = ${i.gsplat};\n if (isGsplatActive(${I}.flags)) {\n for (int editIndex = 0; editIndex < ${g}; ++editIndex) {\n applyPackedRgbaDisplaceEdit(\n ${o}[editIndex], ${a}.sdfTexture, ${a}.numSdfs,\n ${I}.center, ${I}.rgba\n );\n }\n }\n `)}}).outputs.gsplat}const ne=new Float32Array(1);class cs{constructor(){this.scale=new Cs({value:Number.NEGATIVE_INFINITY}),this.rotate=new Kn({value:new gA(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY)}),this.translate=new gg({value:new f(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY)})}apply(A){return wg(A,{scale:this.scale,rotate:this.rotate,translate:this.translate})}applyDir(A){return pg(A,{rotate:this.rotate})}applyGsplat(A){return $a(A,{scale:this.scale,rotate:this.rotate,translate:this.translate})}updateFromMatrix(A){const t=new f,e=new gA,s=new f;A.decompose(s,e,t);const i=(t.x+t.y+t.z)/3;let r=!1;return i!==this.scale.value&&(this.scale.value=i,r=!0),s.equals(this.translate.value)||(this.translate.value.copy(s),r=!0),e.equals(this.rotate.value)||(this.rotate.value.copy(e),r=!0),r}update(A){return A.updateMatrixWorld(),this.updateFromMatrix(A.matrixWorld)}}class Gg extends mA{constructor({numSplats:A,generator:t,construct:e,update:s}){if(super(),this.numSplats=A??0,this.generator=t,this.frameUpdate=s,this.version=0,e){const i=e(this);Object.assign(this,i)}}updateVersion(){this.version+=1}set needsUpdate(A){A&&this.updateVersion()}}const Dt=class Dt extends Gg{constructor(A={}){const t=new cs,e=new cs,s=new cs,i=new cs,r=new Kn({value:new fA(Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY)}),a=new Cs({value:0}),g=new Cs({value:0}),o={transform:t,viewToWorld:e,worldToView:s,viewToObject:i,recolor:r,time:a,deltaTime:g};if(super({update:({time:I,deltaTime:B,viewToWorld:Q,globalEdits:h})=>this.update({time:I,deltaTime:B,viewToWorld:Q,globalEdits:h})}),this.isInitialized=!1,this.recolor=new kt(1,1,1),this.opacity=1,this.enableViewToObject=!1,this.enableViewToWorld=!1,this.enableWorldToView=!1,this.skinning=null,this.edits=null,this.rgbaDisplaceEdits=null,this.splatRgba=null,this.maxSh=3,this.packedSplats=A.packedSplats??new ie,this.numSplats=this.packedSplats.numSplats,this.editable=A.editable??!0,this.onFrame=A.onFrame,this.context=o,this.objectModifier=A.objectModifier,this.worldModifier=A.worldModifier,this.updateGenerator(),A.url||A.fileBytes||A.constructSplats||A.packedSplats&&!A.packedSplats.isInitialized)this.initialized=this.asyncInitialize(A).then(async()=>{if(this.updateGenerator(),this.isInitialized=!0,A.onLoad){const I=A.onLoad(this);I instanceof Promise&&await I}return this});else if(this.isInitialized=!0,this.initialized=Promise.resolve(this),A.onLoad){const I=A.onLoad(this);I instanceof Promise&&(this.initialized=I.then(()=>this))}}async asyncInitialize(A){const{url:t,fileBytes:e,fileType:s,fileName:i,maxSplats:r,constructSplats:a}=A;if(t||e||a){const g={url:t,fileBytes:e,fileType:s,fileName:i,maxSplats:r,construct:a};this.packedSplats.reinitialize(g)}this.packedSplats&&(await this.packedSplats.initialized,this.numSplats=this.packedSplats.numSplats,this.updateGenerator())}static async staticInitialize(){await ps(),Dt.isStaticInitialized=!0}pushSplat(A,t,e,s,i){this.packedSplats.pushSplat(A,t,e,s,i)}forEachSplat(A){this.packedSplats.forEachSplat(A)}dispose(){this.packedSplats.dispose()}constructGenerator(A){const{transform:t,viewToObject:e,recolor:s}=A,i=ns({index:"int"},{gsplat:xA},({index:r})=>{if(!r)throw new Error("index is undefined");let a=Xa(this.packedSplats.dyno,r);if(this.maxSh>=1){const{sh1Texture:o,sh2Texture:I,sh3Texture:B}=this.ensureShTextures();if(o){const Q=e.translate,{center:h}=hs(a).outputs,C=lg(Qg(h,Q));let E=Jg(a,o,C);this.maxSh>=2&&I&&(E=Es(E,Tg(a,I,C))),this.maxSh>=3&&B&&(E=Es(E,vg(a,B,C)));let{rgba:l}=hs(a).outputs;l=Es(l,ug(E,Ra("float",0))),a=ai({gsplat:a,rgba:l})}}if(this.splatRgba){const o=Sg(this.splatRgba.dyno,r);a=ai({gsplat:a,rgba:o})}this.skinning&&(a=this.skinning.modify(a)),this.objectModifier&&(a=this.objectModifier.apply({gsplat:a}).gsplat),a=t.applyGsplat(a);const g=hg(s,hs(a).outputs.rgba);return a=ai({gsplat:a,rgba:g}),this.rgbaDisplaceEdits&&(a=this.rgbaDisplaceEdits.modify(a)),this.worldModifier&&(a=this.worldModifier.apply({gsplat:a}).gsplat),{gsplat:a}});this.generator=i}updateGenerator(){this.constructGenerator(this.context)}update({time:A,viewToWorld:t,deltaTime:e,globalEdits:s}){var l;this.numSplats=this.packedSplats.numSplats,this.context.time.value=A,this.context.deltaTime.value=e,Dt.dynoTime.value=A;const{transform:i,viewToObject:r,recolor:a}=this.context;let g=i.update(this);this.context.viewToWorld.updateFromMatrix(t)&&this.enableViewToWorld&&(g=!0);const o=t.clone().invert();this.context.worldToView.updateFromMatrix(o)&&this.enableWorldToView&&(g=!0);const Q=new cA().compose(i.translate.value,i.rotate.value,new f().setScalar(i.scale.value)).invert().multiply(t);r.updateFromMatrix(Q)&&(this.enableViewToObject||this.packedSplats.extra.sh1)&&(g=!0);const h=new fA(this.recolor.r,this.recolor.g,this.recolor.b,this.opacity);h.equals(a.value)||(a.value.copy(h),g=!0);const C=this.editable?(this.edits??[]).concat(s):[];this.editable&&!this.edits&&this.traverseVisible(c=>{c instanceof Qi&&C.push(c)}),C.sort((c,u)=>c.ordering-u.ordering);const E=C.map(c=>{if(c.sdfs!=null)return{edit:c,sdfs:c.sdfs};const u=[];return c.traverseVisible(d=>{d instanceof kg&&u.push(d)}),{edit:c,sdfs:u}});if(E.length>0&&!this.rgbaDisplaceEdits){const c=E.length,u=E.reduce((d,y)=>d+y.sdfs.length,0);this.rgbaDisplaceEdits=new Rg({maxEdits:c,maxSdfs:u}),this.updateGenerator()}if(this.rgbaDisplaceEdits){const c=this.rgbaDisplaceEdits.update(E);g||(g=c.updated),c.dynoUpdated&&this.updateGenerator()}g&&this.updateVersion(),(l=this.onFrame)==null||l.call(this,{mesh:this,time:A,deltaTime:e})}raycast(A,t){if(!this.packedSplats.packedArray||!this.packedSplats.numSplats)return;const{near:e,far:s,ray:i}=A,r=this.matrixWorld.clone().invert(),a=new jA().setFromMatrix4(r),g=i.origin.clone().applyMatrix4(r),o=i.direction.clone().applyMatrix3(a),I=new f;r.decompose(new f,new gA,I),(I.x*I.y*I.z)**(1/3);const Q=fr(g.x,g.y,g.z,o.x,o.y,o.z,e,s,this.packedSplats.numSplats,this.packedSplats.packedArray,!0);for(const h of Q){const C=i.direction.clone().multiplyScalar(h).add(i.origin);t.push({distance:h,point:C,object:this})}}ensureShTextures(){if(!this.packedSplats.extra.sh1)return{};let A=this.packedSplats.extra.sh1Texture;if(!A){let s=this.packedSplats.extra.sh1;const{width:i,height:r,depth:a,maxSplats:g}=UA(s.length/2);if(s.length<g*2){const I=new Uint32Array(g*2);I.set(s),this.packedSplats.extra.sh1=I,s=I}const o=new ct(s,i,r,a);o.format=_r,o.type=Mt,o.internalFormat="RG32UI",o.needsUpdate=!0,A=new Ii({value:o,key:"sh1"}),this.packedSplats.extra.sh1Texture=A}if(!this.packedSplats.extra.sh2)return{sh1Texture:A};let t=this.packedSplats.extra.sh2Texture;if(!t){let s=this.packedSplats.extra.sh2;const{width:i,height:r,depth:a,maxSplats:g}=UA(s.length/4);if(s.length<g*4){const I=new Uint32Array(g*4);I.set(s),this.packedSplats.extra.sh2=I,s=I}const o=new ct(s,i,r,a);o.format=Yt,o.type=Mt,o.internalFormat="RGBA32UI",o.needsUpdate=!0,t=new Ii({value:o,key:"sh2"}),this.packedSplats.extra.sh2Texture=t}if(!this.packedSplats.extra.sh3)return{sh1Texture:A,sh2Texture:t};let e=this.packedSplats.extra.sh3Texture;if(!e){let s=this.packedSplats.extra.sh3;const{width:i,height:r,depth:a,maxSplats:g}=UA(s.length/4);if(s.length<g*4){const I=new Uint32Array(g*4);I.set(s),this.packedSplats.extra.sh3=I,s=I}const o=new ct(s,i,r,a);o.format=Yt,o.type=Mt,o.internalFormat="RGBA32UI",o.needsUpdate=!0,e=new Ii({value:o,key:"sh3"}),this.packedSplats.extra.sh3Texture=e}return{sh1Texture:A,sh2Texture:t,sh3Texture:e}}};Dt.staticInitialized=Dt.staticInitialize(),Dt.isStaticInitialized=!1,Dt.dynoTime=new Cs({value:0});let hi=Dt;const bg=OA(`\n vec3 evaluateSH1(Gsplat gsplat, usampler2DArray sh1, vec3 viewDir) {\n // Extract sint7 values packed into 2 x uint32\n uvec2 packed = texelFetch(sh1, splatTexCoord(gsplat.index), 0).rg;\n vec3 sh1_0 = vec3(ivec3(\n int(packed.x << 25u) >> 25,\n int(packed.x << 18u) >> 25,\n int(packed.x << 11u) >> 25\n )) / 63.0;\n vec3 sh1_1 = vec3(ivec3(\n int(packed.x << 4u) >> 25,\n int((packed.x >> 3u) | (packed.y << 29u)) >> 25,\n int(packed.y << 22u) >> 25\n )) / 63.0;\n vec3 sh1_2 = vec3(ivec3(\n int(packed.y << 15u) >> 25,\n int(packed.y << 8u) >> 25,\n int(packed.y << 1u) >> 25\n )) / 63.0;\n\n return sh1_0 * (-0.4886025 * viewDir.y)\n + sh1_1 * (0.4886025 * viewDir.z)\n + sh1_2 * (-0.4886025 * viewDir.x);\n }\n`),Lg=OA(`\n vec3 evaluateSH2(Gsplat gsplat, usampler2DArray sh2, vec3 viewDir) {\n // Extract sint8 values packed into 4 x uint32\n uvec4 packed = texelFetch(sh2, splatTexCoord(gsplat.index), 0);\n vec3 sh2_0 = vec3(ivec3(\n int(packed.x << 24u) >> 24,\n int(packed.x << 16u) >> 24,\n int(packed.x << 8u) >> 24\n )) / 127.0;\n vec3 sh2_1 = vec3(ivec3(\n int(packed.x) >> 24,\n int(packed.y << 24u) >> 24,\n int(packed.y << 16u) >> 24\n )) / 127.0;\n vec3 sh2_2 = vec3(ivec3(\n int(packed.y << 8u) >> 24,\n int(packed.y) >> 24,\n int(packed.z << 24u) >> 24\n )) / 127.0;\n vec3 sh2_3 = vec3(ivec3(\n int(packed.z << 16u) >> 24,\n int(packed.z << 8u) >> 24,\n int(packed.z) >> 24\n )) / 127.0;\n vec3 sh2_4 = vec3(ivec3(\n int(packed.w << 24u) >> 24,\n int(packed.w << 16u) >> 24,\n int(packed.w << 8u) >> 24\n )) / 127.0;\n\n return sh2_0 * (1.0925484 * viewDir.x * viewDir.y)\n + sh2_1 * (-1.0925484 * viewDir.y * viewDir.z)\n + sh2_2 * (0.3153915 * (2.0 * viewDir.z * viewDir.z - viewDir.x * viewDir.x - viewDir.y * viewDir.y))\n + sh2_3 * (-1.0925484 * viewDir.x * viewDir.z)\n + sh2_4 * (0.5462742 * (viewDir.x * viewDir.x - viewDir.y * viewDir.y));\n }\n`),Yg=OA(`\n vec3 evaluateSH3(Gsplat gsplat, usampler2DArray sh3, vec3 viewDir) {\n // Extract sint6 values packed into 4 x uint32\n uvec4 packed = texelFetch(sh3, splatTexCoord(gsplat.index), 0);\n vec3 sh3_0 = vec3(ivec3(\n int(packed.x << 26u) >> 26,\n int(packed.x << 20u) >> 26,\n int(packed.x << 14u) >> 26\n )) / 31.0;\n vec3 sh3_1 = vec3(ivec3(\n int(packed.x << 8u) >> 26,\n int(packed.x << 2u) >> 26,\n int((packed.x >> 4u) | (packed.y << 28u)) >> 26\n )) / 31.0;\n vec3 sh3_2 = vec3(ivec3(\n int(packed.y << 22u) >> 26,\n int(packed.y << 16u) >> 26,\n int(packed.y << 10u) >> 26\n )) / 31.0;\n vec3 sh3_3 = vec3(ivec3(\n int(packed.y << 4u) >> 26,\n int((packed.y >> 2u) | (packed.z << 30u)) >> 26,\n int(packed.z << 24u) >> 26\n )) / 31.0;\n vec3 sh3_4 = vec3(ivec3(\n int(packed.z << 18u) >> 26,\n int(packed.z << 12u) >> 26,\n int(packed.z << 6u) >> 26\n )) / 31.0;\n vec3 sh3_5 = vec3(ivec3(\n int(packed.z) >> 26,\n int(packed.w << 26u) >> 26,\n int(packed.w << 20u) >> 26\n )) / 31.0;\n vec3 sh3_6 = vec3(ivec3(\n int(packed.w << 14u) >> 26,\n int(packed.w << 8u) >> 26,\n int(packed.w << 2u) >> 26\n )) / 31.0;\n\n float xx = viewDir.x * viewDir.x;\n float yy = viewDir.y * viewDir.y;\n float zz = viewDir.z * viewDir.z;\n float xy = viewDir.x * viewDir.y;\n float yz = viewDir.y * viewDir.z;\n float zx = viewDir.z * viewDir.x;\n\n return sh3_0 * (-0.5900436 * viewDir.y * (3.0 * xx - yy))\n + sh3_1 * (2.8906114 * xy * viewDir.z) +\n + sh3_2 * (-0.4570458 * viewDir.y * (4.0 * zz - xx - yy))\n + sh3_3 * (0.3731763 * viewDir.z * (2.0 * zz - 3.0 * xx - 3.0 * yy))\n + sh3_4 * (-0.4570458 * viewDir.x * (4.0 * zz - xx - yy))\n + sh3_5 * (1.4453057 * viewDir.z * (xx - yy))\n + sh3_6 * (-0.5900436 * viewDir.x * (xx - 3.0 * yy));\n }\n`);function Jg(n,A,t){return ii({inTypes:{gsplat:xA,sh1:"usampler2DArray",viewDir:"vec3"},outTypes:{rgb:"vec3"},inputs:{gsplat:n,sh1:A,viewDir:t},globals:()=>[It,bg],statements:({inputs:e,outputs:s})=>ot(`\n if (isGsplatActive(${e.gsplat}.flags)) {\n ${s.rgb} = evaluateSH1(${e.gsplat}, ${e.sh1}, ${e.viewDir});\n } else {\n ${s.rgb} = vec3(0.0);\n }\n `)}).outputs.rgb}function Tg(n,A,t){return ii({inTypes:{gsplat:xA,sh2:"usampler2DArray",viewDir:"vec3"},outTypes:{rgb:"vec3"},inputs:{gsplat:n,sh2:A,viewDir:t},globals:()=>[It,Lg],statements:({inputs:e,outputs:s})=>ot(`\n if (isGsplatActive(${e.gsplat}.flags)) {\n ${s.rgb} = evaluateSH2(${e.gsplat}, ${e.sh2}, ${e.viewDir});\n } else {\n ${s.rgb} = vec3(0.0);\n }\n `)}).outputs.rgb}function vg(n,A,t){return ii({inTypes:{gsplat:xA,sh3:"usampler2DArray",viewDir:"vec3"},outTypes:{rgb:"vec3"},inputs:{gsplat:n,sh3:A,viewDir:t},globals:()=>[It,Yg],statements:({inputs:e,outputs:s})=>ot(`\n if (isGsplatActive(${e.gsplat}.flags)) {\n ${s.rgb} = evaluateSH3(${e.gsplat}, ${e.sh3}, ${e.viewDir});\n } else {\n ${s.rgb} = vec3(0.0);\n }\n `)}).outputs.rgb}const oe=class oe{constructor({fileBytes:A}){this.header="",this.littleEndian=!0,this.elements={},this.comments=[],this.data=null,this.numSplats=0,this.fileBytes=A instanceof ArrayBuffer?new Uint8Array(A):A}async parseHeader(){const t=new ReadableStream({start:r=>{r.enqueue(this.fileBytes.slice(0,65536)),r.close()}}).pipeThrough(new TextDecoderStream).getReader();this.header="";const e=`end_header\n`;for(;;){const{value:r,done:a}=await t.read();if(a)throw new Error("Failed to read header");this.header+=r;const g=this.header.indexOf(e);if(g>=0){this.header=this.header.slice(0,g+e.length);break}}const s=new TextEncoder().encode(this.header).length;this.data=new DataView(this.fileBytes.buffer,s),this.elements={};let i=null;this.comments=[],this.header.trim().split(`\n`).forEach((r,a)=>{const g=r.trim();if(a===0){if(g!=="ply")throw new Error("Invalid PLY header");return}if(g.length===0)return;const o=g.split(" ");switch(o[0]){case"format":if(o[1]==="binary_little_endian")this.littleEndian=!0;else if(o[1]==="binary_big_endian")this.littleEndian=!1;else throw new Error(`Unsupported PLY format: ${o[1]}`);if(o[2]!=="1.0")throw new Error(`Unsupported PLY version: ${o[2]}`);break;case"end_header":break;case"comment":this.comments.push(g.slice(8));break;case"element":{const I=o[1];i={name:I,count:Number.parseInt(o[2]),properties:{}},this.elements[I]=i;break}case"property":if(i==null)throw new Error("Property must be inside an element");o[1]==="list"?i.properties[o[4]]={isList:!0,type:o[3],countType:o[2]}:i.properties[o[2]]={isList:!1,type:o[1]};break}}),this.elements.vertex&&(this.numSplats=this.elements.vertex.count)}parseData(A){let t=0;const e=this.data;if(e==null)throw new Error("No data to parse");for(const s in this.elements){const i=this.elements[s],{count:r,properties:a}=i,g={},o=[];for(const[B,Q]of Object.entries(a))Q.isList?(g[B]=[],o.push(()=>{const h=g[B];h.length=us[Q.countType](e,t,this.littleEndian),t+=re[Q.countType];for(let C=0;C<h.length;C++)h[C]=us[Q.type](e,t,this.littleEndian),t+=re[Q.type]})):(g[B]=0,o.push(()=>{g[B]=us[Q.type](e,t,this.littleEndian),t+=re[Q.type]}));const I=A(i)??(()=>{});for(let B=0;B<r;B++){for(const Q of o)Q();I(B,g)}}}parseSplats(A,t){if(this.elements.vertex==null)throw new Error("No vertex element found");let e=!1;const s=[];let i=0,r=[],a=[],g=[],o,I,B;function Q(){const c=zg[i];r=new Array(3).fill(null).flatMap((u,d)=>[0,1,2].map((y,p)=>`f_rest_${d+p*c/3}`)),a=new Array(5).fill(null).flatMap((u,d)=>[0,1,2].map((y,p)=>`f_rest_${3+d+p*c/3}`)),g=new Array(7).fill(null).flatMap((u,d)=>[0,1,2].map((y,p)=>`f_rest_${8+d+p*c/3}`)),o=i>=1?new Float32Array(3*3):void 0,I=i>=2?new Float32Array(5*3):void 0,B=i>=3?new Float32Array(7*3):void 0}function h(c,u){if(!o)throw new Error("Missing sh1");for(const[d,y]of r.entries())o[d]=u[y]*8/255-4;if(I)for(const[d,y]of a.entries())I[d]=u[y]*8/255-4;if(B)for(const[d,y]of g.entries())B[d]=u[y]*8/255-4;t==null||t(c,o,I,B)}function C(c){const{min_x:u,min_y:d,min_z:y,max_x:p,max_y:x,max_z:D,min_scale_x:w,min_scale_y:m,min_scale_z:N,max_scale_x:M,max_scale_y:S,max_scale_z:F}=c.properties;if(!u||!d||!y||!p||!x||!D||!w||!m||!N||!M||!S||!F)throw new Error("Missing PLY chunk properties");return e=!0,(k,U)=>{const{min_x:R,min_y:b,min_z:P,max_x:_,max_y:j,max_z:V,min_scale_x:$,min_scale_y:K,min_scale_z:z,max_scale_x:L,max_scale_y:Z,max_scale_z:G,min_r:yA,min_g:dA,min_b:GA,max_r:wA,max_g:MA,max_b:SA}=U;s.push({min_x:R,min_y:b,min_z:P,max_x:_,max_y:j,max_z:V,min_scale_x:$,min_scale_y:K,min_scale_z:z,max_scale_x:L,max_scale_y:Z,max_scale_z:G,min_r:yA,min_g:dA,min_b:GA,max_r:wA,max_g:MA,max_b:SA})}}function E(c){if(t&&c.name==="sh")return i=er(c.properties),Q(),h;if(c.name!=="vertex")return null;const{packed_position:u,packed_rotation:d,packed_scale:y,packed_color:p}=c.properties;if(!u||!d||!y||!p)throw new Error("Missing PLY properties: packed_position, packed_rotation, packed_scale, packed_color");const x=Math.sqrt(2);return(D,w)=>{const m=s[D>>>8];if(m==null)throw new Error("Missing PLY chunk");const{min_x:N,min_y:M,min_z:S,max_x:F,max_y:k,max_z:U,min_scale_x:R,min_scale_y:b,min_scale_z:P,max_scale_x:_,max_scale_y:j,max_scale_z:V,min_r:$,min_g:K,min_b:z,max_r:L,max_g:Z,max_b:G}=m,{packed_position:yA,packed_rotation:dA,packed_scale:GA,packed_color:wA}=w,MA=(yA>>>21&2047)/2047*(F-N)+N,SA=(yA>>>11&1023)/1023*(k-M)+M,PA=(yA&2047)/2047*(U-S)+S,FA=((dA>>>20&1023)/1023-.5)*x,JA=((dA>>>10&1023)/1023-.5)*x,TA=((dA&1023)/1023-.5)*x,J=Math.sqrt(Math.max(0,1-FA*FA-JA*JA-TA*TA)),QA=dA>>>30,Y=QA===0?FA:QA===1?J:JA,Qt=QA<=1?JA:QA===2?J:TA,Ie=QA<=2?TA:J,hA=QA===0?J:FA,T=Math.exp((GA>>>21&2047)/2047*(_-R)+R),AA=Math.exp((GA>>>11&1023)/1023*(j-b)+b),H=Math.exp((GA&2047)/2047*(V-P)+P),VA=(wA>>>24&255)/255*((L??1)-($??0))+($??0),Me=(wA>>>16&255)/255*((Z??1)-(K??0))+(K??0),Se=(wA>>>8&255)/255*((G??1)-(z??0))+(z??0),Fe=(wA&255)/255;A(D,MA,SA,PA,T,AA,H,Y,Qt,Ie,hA,Fe,VA,Me,Se)}}const l=c=>{if(c.name==="chunk")return C(c);if(e)return E(c);if(c.name!=="vertex")return null;const{x:u,y:d,z:y,scale_0:p,scale_1:x,scale_2:D,rot_0:w,rot_1:m,rot_2:N,rot_3:M,opacity:S,f_dc_0:F,f_dc_1:k,f_dc_2:U,red:R,green:b,blue:P,alpha:_}=c.properties;if(!u||!d||!y)throw new Error("Missing PLY properties: x, y, z");const j=p&&x&&D,V=w&&m&&N&&M,$=_!=null?ds[_.type]:1,K=R!=null?ds[R.type]:1,z=b!=null?ds[b.type]:1,L=P!=null?ds[P.type]:1;return i=er(c.properties),Q(),(Z,G)=>{const yA=j?Math.exp(G.scale_0):oe.defaultPointScale,dA=j?Math.exp(G.scale_1):oe.defaultPointScale,GA=j?Math.exp(G.scale_2):oe.defaultPointScale,wA=V?G.rot_1:0,MA=V?G.rot_2:0,SA=V?G.rot_3:0,PA=V?G.rot_0:1,FA=S!=null?1/(1+Math.exp(-G.opacity)):_!=null?G.alpha/$:1,JA=F!=null?G.f_dc_0*ls+.5:R!=null?G.red/K:1,TA=k!=null?G.f_dc_1*ls+.5:b!=null?G.green/z:1,J=U!=null?G.f_dc_2*ls+.5:P!=null?G.blue/L:1;if(A(Z,G.x,G.y,G.z,yA,dA,GA,wA,MA,SA,PA,FA,JA,TA,J),t&&o){if(o)for(const[QA,Y]of r.entries())o[QA]=G[Y];if(I)for(const[QA,Y]of a.entries())I[QA]=G[Y];if(B)for(const[QA,Y]of g.entries())B[QA]=G[Y];t(Z,o,I,B)}}};this.parseData(l)}injectRgba(A){let t=0;const e=this.data;if(e==null)throw new Error("No parsed data");if(A.length!==this.numSplats*4)throw new Error("Invalid RGBA array length");for(const s in this.elements){const i=this.elements[s],{count:r,properties:a}=i,g=[];let o=0;const I=s==="vertex";if(I){for(const B of["opacity","f_dc_0","f_dc_1","f_dc_2"])if(!a[B]||a[B].type!=="float")throw new Error(`Can\'t injectRgba due to property: ${B}`)}for(const[B,Q]of Object.entries(a))if(Q.isList)g.push(()=>{const h=us[Q.countType](e,t,this.littleEndian);t+=re[Q.countType],t+=h*re[Q.type]});else{if(I)if(B==="f_dc_0"||B==="f_dc_1"||B==="f_dc_2"){const h=Number.parseInt(B.slice(5));g.push(()=>{const C=(A[o+h]/255-.5)/ls;tr[Q.type](e,t,this.littleEndian,C)})}else B==="opacity"&&g.push(()=>{const h=Math.max(-100,Math.min(100,-Math.log(1/(A[o+3]/255)-1)));tr[Q.type](e,t,this.littleEndian,h)});g.push(()=>{t+=re[Q.type]})}for(let B=0;B<r;B++){for(const Q of g)Q();I&&(o+=4)}}}};oe.defaultPointScale=.001;let pe=oe;const ls=.28209479177387814,us={char:(n,A,t)=>n.getInt8(A),uchar:(n,A,t)=>n.getUint8(A),short:(n,A,t)=>n.getInt16(A,t),ushort:(n,A,t)=>n.getUint16(A,t),int:(n,A,t)=>n.getInt32(A,t),uint:(n,A,t)=>n.getUint32(A,t),float:(n,A,t)=>n.getFloat32(A,t),double:(n,A,t)=>n.getFloat64(A,t)},tr={char:(n,A,t,e)=>{n.setInt8(A,e)},uchar:(n,A,t,e)=>{n.setUint8(A,e)},short:(n,A,t,e)=>{n.setInt16(A,e,t)},ushort:(n,A,t,e)=>{n.setUint16(A,e,t)},int:(n,A,t,e)=>{n.setInt32(A,e,t)},uint:(n,A,t,e)=>{n.setUint32(A,e,t)},float:(n,A,t,e)=>{n.setFloat32(A,e,t)},double:(n,A,t,e)=>{n.setFloat64(A,e,t)}},re={char:1,uchar:1,short:2,ushort:2,int:4,uint:4,float:4,double:8},ds={char:127,uchar:255,short:32767,ushort:65535,int:2147483647,uint:4294967295,float:1,double:1},Hg={0:0,9:1,24:2,45:3},zg={0:0,1:9,2:24,3:45};function er(n){let A=0;for(;n[`f_rest_${A}`];)A+=1;const t=Hg[A];if(t==null)throw new Error(`Unsupported number of SH coefficients: ${A}`);return t}function Kg(n){return new Worker(self.location.href,{name:n==null?void 0:n.name})}class qg{constructor(){this.messages={},this.messageIdNext=0,this.worker=new Kg,this.worker.onmessage=A=>this.onMessage(A)}makeMessageId(){return++this.messageIdNext}makeMessagePromiseId(){const A=this.makeMessageId(),t=new Promise((e,s)=>{this.messages[A]={resolve:e,reject:s}});return{id:A,promise:t}}onMessage(A){const{id:t,result:e,error:s}=A.data,i=this.messages[t];i&&(delete this.messages[t],s?i.reject(s):i.resolve(e))}async call(A,t){const{id:e,promise:s}=this.makeMessagePromiseId();return this.worker.postMessage({name:A,args:t,id:e},{transfer:Gn(t)}),s}}let sr=4,fs=0;const ir=[],nr=[];async function _g(){const n=ir.shift();if(n)return n;if(fs<sr){const A=new qg;return fs+=1,A}return new Promise(A=>{nr.push(A)})}function Zg(n){if(fs>sr){fs-=1;return}const A=nr.shift();if(A){A(n);return}ir.push(n)}async function ae(n){const A=await _g();try{return await n(A)}finally{Zg(A)}}class Wg extends ti{constructor(A){super(A),this.fileLoader=new ma(A)}load(A,t,e,s){this.fileLoader.setResponseType("arraybuffer"),this.fileLoader.setCrossOrigin(this.crossOrigin),this.fileLoader.setWithCredentials(this.withCredentials),this.fileLoader.setPath(this.path),this.fileLoader.setResourcePath(this.resourcePath),this.fileLoader.setRequestHeader(this.requestHeader),this.fileLoader.load(A,async i=>{if(t){const r=i,a={},g=[];let o=this.fileType;try{const I=gr(r);if(this.fileType==="pcsogs"&&I===void 0)throw new Error("Invalid PC SOGS file");if(I!==void 0){o="pcsogs";for(const Q of["means","scales","quats","sh0","shN"]){const h=I[Q];if(h){const C=h.files;for(const E of C){const l=new URL(E,A).toString();this.manager.itemStart(l);const c=this.loadExtra(l).then(u=>{a[E]=u}).catch(u=>{throw this.manager.itemError(l),u}).finally(()=>{this.manager.itemEnd(l)});g.push(c)}}}}await Promise.all(g);const B=await Ir({input:r,extraFiles:a,fileType:o,pathOrUrl:A});this.packedSplats?(this.packedSplats.initialize(B),t(this.packedSplats)):t(new ie(B))}catch(I){s==null||s(I)}}},e,s)}async loadAsync(A,t){return new Promise((e,s)=>{this.load(A,i=>{e(i)},t,s)})}async loadExtra(A){return new Promise((t,e)=>{this.fileLoader.load(A,s=>t(s),void 0,s=>e(s))})}parse(A){return new hi({packedSplats:A})}}var De=(n=>(n.PLY="ply",n.SPZ="spz",n.SPLAT="splat",n.KSPLAT="ksplat",n.PCSOGS="pcsogs",n.PCSOGSZIP="pcsogszip",n))(De||{});function rr(n){const A=new DataView(n.buffer);if((A.getUint32(0,!0)&16777215)===7957616)return"ply";if((A.getUint32(0,!0)&16777215)===559903){const t=Za(n,4);return new DataView(t.buffer).getUint32(0,!0)===1347635022?"spz":void 0}if(A.getUint32(0,!0)===67324752)return or(n)?"pcsogszip":void 0}function Og(n){const A=n.split(/[?#]/,1)[0],t=Math.max(A.lastIndexOf("/"),A.lastIndexOf("\\\\")),e=A.slice(t+1),s=e.lastIndexOf(".");return s<=0||s===e.length-1?"":e.slice(s+1).toLowerCase()}function ar(n){const A=Og(n);if(A==="ply")return"ply";if(A==="spz")return"spz";if(A==="splat")return"splat";if(A==="ksplat")return"ksplat"}function gr(n){try{let A;if(typeof n=="string")A=n;else{const e=n instanceof ArrayBuffer?new Uint8Array(n):n;if(e.length>65536)return;A=new TextDecoder().decode(e)}const t=JSON.parse(A);if(!t||typeof t!="object"||Array.isArray(t))return;for(const e of["means","scales","quats","sh0"])if(!t[e]||typeof t[e]!="object"||Array.isArray(t[e])||!t[e].shape||!t[e].files||e!=="quats"&&(!t[e].mins||!t[e].maxs))return;return t}catch{return}}function or(n){try{const A=n instanceof ArrayBuffer?new Uint8Array(n):n;let t=null;const e=vr(A,{filter:({name:i})=>i.split(/[\\\\/]/).pop()==="meta.json"?(t=i,!0):!1});if(!t)return;const s=gr(e[t]);return s?{name:t,json:s}:void 0}catch{return}}async function Ir({input:n,extraFiles:A,fileType:t,pathOrUrl:e}){const s=n instanceof ArrayBuffer?new Uint8Array(n):n;let i=t;switch(t||(i=rr(s),!i&&e&&(i=ar(e))),i){case"ply":{const r=new pe({fileBytes:s});await r.parseHeader();const a=r.numSplats,g=UA(a).maxSplats,o={fileBytes:s,packedArray:new Uint32Array(g*4)};return await ae(async I=>{const{packedArray:B,numSplats:Q,extra:h}=await I.call("unpackPly",o);return{packedArray:B,numSplats:Q,extra:h}})}case"spz":return await ae(async r=>{const{packedArray:a,numSplats:g,extra:o}=await r.call("decodeSpz",{fileBytes:s});return{packedArray:a,numSplats:g,extra:o}});case"splat":return await ae(async r=>{const{packedArray:a,numSplats:g}=await r.call("decodeAntiSplat",{fileBytes:s});return{packedArray:a,numSplats:g}});case"ksplat":return await ae(async r=>{const{packedArray:a,numSplats:g,extra:o}=await r.call("decodeKsplat",{fileBytes:s});return{packedArray:a,numSplats:g,extra:o}});case"pcsogs":return await ae(async r=>{const{packedArray:a,numSplats:g,extra:o}=await r.call("decodePcSogs",{fileBytes:s,extraFiles:A});return{packedArray:a,numSplats:g,extra:o}});case"pcsogszip":return await ae(async r=>{const{packedArray:a,numSplats:g,extra:o}=await r.call("decodePcSogsZip",{fileBytes:s});return{packedArray:a,numSplats:g,extra:o}});default:throw new Error(`Unknown splat file type: ${i}`)}}class Pg{constructor({maxSplats:A=1}={}){this.numSplats=0,this.maxSplats=UA(A).maxSplats,this.centers=new Float32Array(this.maxSplats*3),this.scales=new Float32Array(this.maxSplats*3),this.quaternions=new Float32Array(this.maxSplats*4),this.opacities=new Float32Array(this.maxSplats),this.colors=new Float32Array(this.maxSplats*3)}pushSplat(){const A=this.numSplats;return this.ensureIndex(A),this.numSplats+=1,A}unpushSplat(A){if(A===this.numSplats-1)this.numSplats-=1;else throw new Error("Cannot unpush splat from non-last position")}ensureCapacity(A){if(A>this.maxSplats){const t=Math.max(A,this.maxSplats*2),e=new Float32Array(t*3),s=new Float32Array(t*3),i=new Float32Array(t*4),r=new Float32Array(t),a=new Float32Array(t*3);if(e.set(this.centers),s.set(this.scales),i.set(this.quaternions),r.set(this.opacities),a.set(this.colors),this.centers=e,this.scales=s,this.quaternions=i,this.opacities=r,this.colors=a,this.sh1){const g=new Float32Array(t*9);g.set(this.sh1),this.sh1=g}if(this.sh2){const g=new Float32Array(t*15);g.set(this.sh2),this.sh2=g}if(this.sh3){const g=new Float32Array(t*21);g.set(this.sh3),this.sh3=g}this.maxSplats=t}}ensureIndex(A){this.ensureCapacity(A+1)}setCenter(A,t,e,s){this.centers[A*3]=t,this.centers[A*3+1]=e,this.centers[A*3+2]=s}setScale(A,t,e,s){this.scales[A*3]=t,this.scales[A*3+1]=e,this.scales[A*3+2]=s}setQuaternion(A,t,e,s,i){this.quaternions[A*4]=t,this.quaternions[A*4+1]=e,this.quaternions[A*4+2]=s,this.quaternions[A*4+3]=i}setOpacity(A,t){this.opacities[A]=t}setColor(A,t,e,s){this.colors[A*3]=t,this.colors[A*3+1]=e,this.colors[A*3+2]=s}setSh1(A,t){this.sh1||(this.sh1=new Float32Array(this.maxSplats*9));for(let e=0;e<9;++e)this.sh1[A*9+e]=t[e]}setSh2(A,t){this.sh2||(this.sh2=new Float32Array(this.maxSplats*15));for(let e=0;e<15;++e)this.sh2[A*15+e]=t[e]}setSh3(A,t){this.sh3||(this.sh3=new Float32Array(this.maxSplats*21));for(let e=0;e<21;++e)this.sh3[A*21+e]=t[e]}}async function Br(n,A){if(n.quats.encoding!=="quaternion_packed")throw new Error("Unsupported quaternion encoding");const t=n.means.shape[0],e=as(t),s=new Uint32Array(e*4),i={},r=await Promise.all([me(A[n.means.files[0]]),me(A[n.means.files[1]])]);for(let Q=0;Q<t;++Q){const h=Q*4,C=(r[0][h+0]+(r[1][h+0]<<8))/65535,E=(r[0][h+1]+(r[1][h+1]<<8))/65535,l=(r[0][h+2]+(r[1][h+2]<<8))/65535;let c=n.means.mins[0]+(n.means.maxs[0]-n.means.mins[0])*C,u=n.means.mins[1]+(n.means.maxs[1]-n.means.mins[1])*E,d=n.means.mins[2]+(n.means.maxs[2]-n.means.mins[2])*l;c=Math.sign(c)*(Math.exp(Math.abs(c))-1),u=Math.sign(u)*(Math.exp(Math.abs(u))-1),d=Math.sign(d)*(Math.exp(Math.abs(d))-1),bn(s,Q,c,u,d)}const a=await me(A[n.scales.files[0]]);for(let Q=0;Q<t;++Q){const h=Q*4,C=a[h+0]/255,E=a[h+1]/255,l=a[h+2]/255,c=n.scales.mins[0]+(n.scales.maxs[0]-n.scales.mins[0])*C,u=n.scales.mins[1]+(n.scales.maxs[1]-n.scales.mins[1])*E,d=n.scales.mins[2]+(n.scales.maxs[2]-n.scales.mins[2])*l;Ln(s,Q,Math.exp(c),Math.exp(u),Math.exp(d))}const g=await me(A[n.quats.files[0]]),o=Math.sqrt(2);for(let Q=0;Q<t;++Q){const h=Q*4,C=(g[h+0]/255-.5)*o,E=(g[h+1]/255-.5)*o,l=(g[h+2]/255-.5)*o,c=Math.sqrt(Math.max(0,1-C*C-E*E-l*l)),u=g[h+3]-252,d=u===0?C:u===1?c:E,y=u<=1?E:u===2?c:l,p=u<=2?l:c;Yn(s,Q,d,y,p,u===0?c:C)}const I=await me(A[n.sh0.files[0]]),B=.28209479177387814;for(let Q=0;Q<t;++Q){const h=Q*4,C=I[h+0]/255,E=I[h+1]/255,l=I[h+2]/255,c=I[h+3]/255,u=n.sh0.mins[0]+(n.sh0.maxs[0]-n.sh0.mins[0])*C,d=n.sh0.mins[1]+(n.sh0.maxs[1]-n.sh0.mins[1])*E,y=n.sh0.mins[2]+(n.sh0.maxs[2]-n.sh0.mins[2])*l,p=n.sh0.mins[3]+(n.sh0.maxs[3]-n.sh0.mins[3])*c,x=B*u+.5,D=B*d+.5,w=B*y+.5,m=1/(1+Math.exp(-p));La(s,Q,x,D,w,m)}if(n.shN){i.sh1=new Uint32Array(t*2),i.sh2=new Uint32Array(t*4),i.sh3=new Uint32Array(t*4);const Q=new Float32Array(9),h=new Float32Array(15),C=new Float32Array(21),[E,l]=await Promise.all([Ci(A[n.shN.files[0]]),Ci(A[n.shN.files[1]])]);for(let c=0;c<t;++c){const u=c*4,d=l.rgba[u+0]+(l.rgba[u+1]<<8),y=(d&63)*15,x=(d>>>6)*E.width+y;for(let D=0;D<3;++D){for(let w=0;w<3;++w)Q[w*3+D]=n.shN.mins+(n.shN.maxs-n.shN.mins)*E.rgba[(x+w)*4+D]/255;for(let w=0;w<5;++w)h[w*3+D]=n.shN.mins+(n.shN.maxs-n.shN.mins)*E.rgba[(x+3+w)*4+D]/255;for(let w=0;w<7;++w)C[w*3+D]=n.shN.mins+(n.shN.maxs-n.shN.mins)*E.rgba[(x+8+w)*4+D]/255}os(i.sh1,c,Q),Is(i.sh2,c,h),Bs(i.sh3,c,C)}}return{packedArray:s,numSplats:t,extra:i}}let ys=null;async function Ci(n){if(!ys&&(ys=new OffscreenCanvas(1,1).getContext("webgl2"),!ys))throw new Error("Failed to create WebGL2 context");const A=new Blob([n]),t=await createImageBitmap(A,{premultiplyAlpha:"none"}),e=ys,s=e.createTexture();e.bindTexture(e.TEXTURE_2D,s),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);const i=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,i),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,s,0);const r=new Uint8Array(t.width*t.height*4);return e.readPixels(0,0,t.width,t.height,e.RGBA,e.UNSIGNED_BYTE,r),e.deleteTexture(s),e.deleteFramebuffer(i),{rgba:r,width:t.width,height:t.height}}async function me(n){const{rgba:A}=await Ci(n);return A}async function Vg(n){var B;const A=or(n);if(!A)throw new Error("Invalid PC SOGS zip file");const{name:t,json:e}=A,s=t.lastIndexOf("/"),i=t.lastIndexOf("\\\\"),r=t.slice(0,Math.max(s,i)+1),a=new Map,g=[...e.means.files,...e.scales.files,...e.quats.files,...e.sh0.files,...((B=e.shN)==null?void 0:B.files)??[]];for(const Q of g)a.set(r+Q,Q);const o=await new Promise((Q,h)=>{Tr(n,{filter:({name:C})=>a.has(C)},(C,E)=>{C?h(C):Q(E)})}),I={};for(const[Q,h]of a.entries())I[h]=o[Q];return await Br(e,I)}class Qr{constructor({fileBytes:A}){this.fileBytes=A instanceof ArrayBuffer?new Uint8Array(A):A,this.reader=new Wa({fileBytes:this.fileBytes});const t=new DataView(this.reader.read(16).buffer);if(t.getUint32(0,!0)!==1347635022)throw new Error("Invalid SPZ file");if(this.version=t.getUint32(4,!0),this.version<1||this.version>2)throw new Error(`Unsupported SPZ version: ${this.version}`);this.numSplats=t.getUint32(8,!0),this.shDegree=t.getUint8(12),this.fractionalBits=t.getUint8(13),this.flags=t.getUint8(14),this.flagAntiAlias=(this.flags&1)!==0,this.reserved=t.getUint8(15),this.parsed=!1}parseSplats(A,t,e,s,i,r){if(this.parsed)throw new Error("SPZ file already parsed");if(this.parsed=!0,this.version===1){const a=this.reader.read(this.numSplats*3*2),g=new Uint16Array(a.buffer);for(let o=0;o<this.numSplats;o++){const I=o*3,B=tA(g[I]),Q=tA(g[I+1]),h=tA(g[I+2]);A==null||A(o,B,Q,h)}}else if(this.version===2){const a=1<<this.fractionalBits,g=this.reader.read(this.numSplats*3*3);for(let o=0;o<this.numSplats;o++){const I=o*9,B=((g[I+2]<<24|g[I+1]<<16|g[I]<<8)>>8)/a,Q=((g[I+5]<<24|g[I+4]<<16|g[I+3]<<8)>>8)/a,h=((g[I+8]<<24|g[I+7]<<16|g[I+6]<<8)>>8)/a;A==null||A(o,B,Q,h)}}else throw new Error("Unreachable");{const a=this.reader.read(this.numSplats);for(let g=0;g<this.numSplats;g++)t==null||t(g,a[g]/255)}{const a=this.reader.read(this.numSplats*3),g=Cr/.15;for(let o=0;o<this.numSplats;o++){const I=o*3,B=(a[I]/255-.5)*g+.5,Q=(a[I+1]/255-.5)*g+.5,h=(a[I+2]/255-.5)*g+.5;e==null||e(o,B,Q,h)}}{const a=this.reader.read(this.numSplats*3);for(let g=0;g<this.numSplats;g++){const o=g*3,I=Math.exp(a[o]/16-10),B=Math.exp(a[o+1]/16-10),Q=Math.exp(a[o+2]/16-10);s==null||s(g,I,B,Q)}}{const a=this.reader.read(this.numSplats*3);for(let g=0;g<this.numSplats;g++){const o=g*3,I=a[o]/127.5-1,B=a[o+1]/127.5-1,Q=a[o+2]/127.5-1,h=Math.sqrt(Math.max(0,1-I*I-B*B-Q*Q));i==null||i(g,I,B,Q,h)}}if(r&&this.shDegree>=1){const a=new Float32Array(9),g=this.shDegree>=2?new Float32Array(5*3):void 0,o=this.shDegree>=3?new Float32Array(7*3):void 0,I=this.reader.read(this.numSplats*hr[this.shDegree]*3);let B=0;for(let Q=0;Q<this.numSplats;Q++){for(let h=0;h<9;++h)a[h]=(I[B+h]-128)/128;if(B+=9,g){for(let h=0;h<15;++h)g[h]=(I[B+h]-128)/128;B+=15}if(o){for(let h=0;h<21;++h)o[h]=(I[B+h]-128)/128;B+=21}r==null||r(Q,a,g,o)}}}}const hr={1:3,2:8,3:15},Cr=.28209479177387814,Xg=1347635022,jg=2,$g=1;class pt{constructor({numSplats:A,shDegree:t,fractionalBits:e=12,flagAntiAlias:s=!0}){this.clippedCount=0;const i=19+(t>=1?9:0)+(t>=2?15:0)+(t>=3?21:0),r=16+A*i;this.buffer=new ArrayBuffer(r),this.view=new DataView(this.buffer),this.view.setUint32(0,Xg,!0),this.view.setUint32(4,jg,!0),this.view.setUint32(8,A,!0),this.view.setUint8(12,t),this.view.setUint8(13,e),this.view.setUint8(14,s?$g:0),this.view.setUint8(15,0),this.numSplats=A,this.shDegree=t,this.fractionalBits=e,this.fraction=1<<e,this.flagAntiAlias=s}setCenter(A,t,e,s){const i=Math.round(t*this.fraction),r=Math.max(-8388607,Math.min(8388607,i)),a=Math.round(e*this.fraction),g=Math.max(-8388607,Math.min(8388607,a)),o=Math.round(s*this.fraction),I=Math.max(-8388607,Math.min(8388607,o));(i!==r||a!==g||o!==I)&&(this.clippedCount+=1);const h=16+A*9;this.view.setUint8(h,r&255),this.view.setUint8(h+1,r>>8&255),this.view.setUint8(h+2,r>>16&255),this.view.setUint8(h+3,g&255),this.view.setUint8(h+4,g>>8&255),this.view.setUint8(h+5,g>>16&255),this.view.setUint8(h+6,I&255),this.view.setUint8(h+7,I>>8&255),this.view.setUint8(h+8,I>>16&255)}setAlpha(A,t){const e=16+this.numSplats*9+A;this.view.setUint8(e,Math.max(0,Math.min(255,Math.round(t*255))))}static scaleRgb(A){const t=((A-.5)/(Cr/.15)+.5)*255;return Math.max(0,Math.min(255,Math.round(t)))}setRgb(A,t,e,s){const i=16+this.numSplats*10+A*3;this.view.setUint8(i,pt.scaleRgb(t)),this.view.setUint8(i+1,pt.scaleRgb(e)),this.view.setUint8(i+2,pt.scaleRgb(s))}setScale(A,t,e,s){const i=16+this.numSplats*13+A*3;this.view.setUint8(i,Math.max(0,Math.min(255,Math.round((Math.log(t)+10)*16)))),this.view.setUint8(i+1,Math.max(0,Math.min(255,Math.round((Math.log(e)+10)*16)))),this.view.setUint8(i+2,Math.max(0,Math.min(255,Math.round((Math.log(s)+10)*16))))}setQuat(A,t,e,s,i){const r=16+this.numSplats*16+A*3,a=i<0;this.view.setUint8(r,Math.max(0,Math.min(255,Math.round(((a?-t:t)+1)*127.5)))),this.view.setUint8(r+1,Math.max(0,Math.min(255,Math.round(((a?-e:e)+1)*127.5)))),this.view.setUint8(r+2,Math.max(0,Math.min(255,Math.round(((a?-s:s)+1)*127.5))))}static quantizeSh(A,t){const e=Math.round(A*128)+128,s=1<<8-t,i=Math.floor((e+s/2)/s)*s;return Math.max(0,Math.min(255,i))}setSh(A,t,e,s){const i=hr[this.shDegree]||0,r=16+this.numSplats*19+A*i*3;for(let a=0;a<9;++a)this.view.setUint8(r+a,pt.quantizeSh(t[a],5));if(e){const a=r+9;for(let g=0;g<15;++g)this.view.setUint8(a+g,pt.quantizeSh(e[g],4));if(s){const g=a+15;for(let o=0;o<21;++o)this.view.setUint8(g+o,pt.quantizeSh(s[o],4))}}}async finalize(){const A=new Uint8Array(this.buffer),e=new ReadableStream({async start(r){r.enqueue(A),r.close()}}).pipeThrough(new CompressionStream("gzip")),i=await new Response(e).arrayBuffer();return console.log("Compressed",A.length,"bytes to",i.byteLength,"bytes"),new Uint8Array(i)}}async function Ao(n){var I,B,Q;const A=new Pg,{inputs:t,clipXyz:e,maxSh:s,fractionalBits:i=12,opacityThreshold:r}=n;for(const h of t){let C=function(w){return w.multiplyScalar(d),w.applyQuaternion(y),w.add(p),w},E=function(w){return w.multiplyScalar(d),w},l=function(w){return w.premultiply(y),w},c=function(w){return!x||x.containsPoint(w)},u=function(w){return r!==void 0?w>=r:!0};const d=((I=h.transform)==null?void 0:I.scale)??1,y=new gA().fromArray(((B=h.transform)==null?void 0:B.quaternion)??[0,0,0,1]),p=new f().fromArray(((Q=h.transform)==null?void 0:Q.translate)??[0,0,0]),x=e?new Ht(new f().fromArray(e.min),new f().fromArray(e.max)):void 0;let D=h.fileType;switch(D||(D=rr(h.fileBytes),!D&&h.pathOrUrl&&(D=ar(h.pathOrUrl))),D){case De.PLY:{const w=new pe({fileBytes:h.fileBytes});await w.parseHeader();let m=null;w.parseSplats((N,M,S,F,k,U,R,b,P,_,j,V,$,K,z)=>{const L=C(new f(M,S,F));if(c(L)&&u(V)){m=A.pushSplat(),A.setCenter(m,L.x,L.y,L.z);const Z=E(new f(k,U,R));A.setScale(m,Z.x,Z.y,Z.z);const G=l(new gA(b,P,_,j));A.setQuaternion(m,G.x,G.y,G.z,G.w),A.setOpacity(m,V),A.setColor(m,$,K,z)}else m=null},(N,M,S,F)=>{M&&m!==null&&A.setSh1(m,M),S&&m!==null&&A.setSh2(m,S),F&&m!==null&&A.setSh3(m,F)});break}case De.SPZ:{const w=new Qr({fileBytes:h.fileBytes}),m=new Int32Array(w.numSplats);m.fill(-1);const N=new Float32Array(w.numSplats*3),M=new f;w.parseSplats((S,F,k,U)=>{const R=C(new f(F,k,U));N[S*3]=R.x,N[S*3+1]=R.y,N[S*3+2]=R.z},(S,F)=>{M.fromArray(N,S*3),c(M)&&u(F)&&(m[S]=A.pushSplat(),A.setCenter(m[S],M.x,M.y,M.z),A.setOpacity(m[S],F))},(S,F,k,U)=>{m[S]>=0&&A.setColor(m[S],F,k,U)},(S,F,k,U)=>{if(m[S]>=0){const R=E(new f(F,k,U));A.setScale(m[S],R.x,R.y,R.z)}},(S,F,k,U,R)=>{if(m[S]>=0){const b=l(new gA(F,k,U,R));A.setQuaternion(m[S],b.x,b.y,b.z,b.w)}},(S,F,k,U)=>{m[S]>=0&&(A.setSh1(m[S],F),k&&A.setSh2(m[S],k),U&&A.setSh3(m[S],U))});break}case De.SPLAT:vn(h.fileBytes,w=>{},(w,m,N,M,S,F,k,U,R,b,P,_,j,V,$)=>{const K=C(new f(m,N,M));if(c(K)&&u(_)){const z=A.pushSplat();A.setCenter(z,K.x,K.y,K.z);const L=E(new f(S,F,k));A.setScale(z,L.x,L.y,L.z);const Z=l(new gA(U,R,b,P));A.setQuaternion(z,Z.x,Z.y,Z.z,Z.w),A.setOpacity(z,_),A.setColor(z,j,V,$)}});break;case De.KSPLAT:{let w=null;Pa(h.fileBytes,m=>{},(m,N,M,S,F,k,U,R,b,P,_,j,V,$,K)=>{const z=C(new f(N,M,S));if(c(z)&&u(j)){w=A.pushSplat(),A.setCenter(w,z.x,z.y,z.z);const L=E(new f(F,k,U));A.setScale(w,L.x,L.y,L.z);const Z=l(new gA(R,b,P,_));A.setQuaternion(w,Z.x,Z.y,Z.z,Z.w),A.setOpacity(w,j),A.setColor(w,V,$,K)}else w=null},(m,N,M,S)=>{w!==null&&(A.setSh1(w,N),M&&A.setSh2(w,M),S&&A.setSh3(w,S))});break}default:throw new Error(`transcodeSpz not implemented for ${D}`)}}const a=Math.min(s??3,A.sh3?3:A.sh2?2:A.sh1?1:0),g=new pt({numSplats:A.numSplats,shDegree:a,fractionalBits:i,flagAntiAlias:!0});for(let h=0;h<A.numSplats;++h){const C=h*3,E=h*4;g.setCenter(h,A.centers[C],A.centers[C+1],A.centers[C+2]),g.setScale(h,A.scales[C],A.scales[C+1],A.scales[C+2]),g.setQuat(h,A.quaternions[E],A.quaternions[E+1],A.quaternions[E+2],A.quaternions[E+3]),g.setAlpha(h,A.opacities[h]),g.setRgb(h,A.colors[C],A.colors[C+1],A.colors[C+2]),A.sh1&&a>=1&&g.setSh(h,A.sh1.slice(h*9,(h+1)*9),a>=2&&A.sh2?A.sh2.slice(h*15,(h+1)*15):void 0,a>=3&&A.sh3?A.sh3.slice(h*21,(h+1)*21):void 0)}return{fileBytes:await g.finalize(),clippedCount:g.clippedCount}}async function Er(n){const{name:A,args:t,id:e}=n.data;let s,i;try{switch(A){case"unpackPly":{const{packedArray:r,fileBytes:a}=t,g=await to({packedArray:r,fileBytes:a});s={id:e,numSplats:g.numSplats,packedArray:g.packedArray,extra:g.extra};break}case"decodeSpz":{const{fileBytes:r}=t,a=eo(r);s={id:e,numSplats:a.numSplats,packedArray:a.packedArray,extra:a.extra};break}case"decodeAntiSplat":{const{fileBytes:r}=t,a=Oa(r);s={id:e,numSplats:a.numSplats,packedArray:a.packedArray};break}case"decodeKsplat":{const{fileBytes:r}=t,a=Va(r);s={id:e,numSplats:a.numSplats,packedArray:a.packedArray,extra:a.extra};break}case"decodePcSogs":{const{fileBytes:r,extraFiles:a}=t,g=JSON.parse(new TextDecoder().decode(r)),o=await Br(g,a);s={id:e,numSplats:o.numSplats,packedArray:o.packedArray,extra:o.extra};break}case"decodePcSogsZip":{const{fileBytes:r}=t,a=await Vg(r);s={id:e,numSplats:a.numSplats,packedArray:a.packedArray,extra:a.extra};break}case"sortSplats":{const{maxSplats:r,totalSplats:a,readback:g,ordering:o}=t;s={id:e,readback:g,...so({totalSplats:a,readback:g,ordering:o})};break}case"sortDoubleSplats":{const{numSplats:r,readback:a,ordering:g}=t;s={id:e,readback:a,ordering:g},Sa&&(s={id:e,readback:a,ordering:g,activeSplats:dr(r,a,g)});break}case"transcodeSpz":{const r=t,a=await Ao(r);s={id:e,fileBytes:a,input:r};break}default:throw new Error(`Unknown name: ${A}`)}}catch(r){i=r}self.postMessage({id:e,result:s,error:i},{transfer:Gn(s)})}async function to({packedArray:n,fileBytes:A}){const t=new pe({fileBytes:A});await t.parseHeader();const e=t.numSplats,s={},i=Math.exp(-20);return t.parseSplats((r,a,g,o,I,B,Q,h,C,E,l,c,u,d,y)=>{we(n,r,a,g,o,I<i?0:Math.max(si,I),B<i?0:Math.max(si,B),Q<i?0:Math.max(si,Q),h,C,E,l,c,u,d,y)},(r,a,g,o)=>{a&&(s.sh1||(s.sh1=new Uint32Array(e*2)),os(s.sh1,r,a)),g&&(s.sh2||(s.sh2=new Uint32Array(e*4)),Is(s.sh2,r,g)),o&&(s.sh3||(s.sh3=new Uint32Array(e*4)),Bs(s.sh3,r,o))}),{packedArray:n,numSplats:e,extra:s}}function eo(n){const A=new Qr({fileBytes:n}),t=A.numSplats,e=as(t),s=new Uint32Array(e*4),i={};return A.parseSplats((r,a,g,o)=>{bn(s,r,a,g,o)},(r,a)=>{Ja(s,r,a)},(r,a,g,o)=>{Ya(s,r,a,g,o)},(r,a,g,o)=>{Ln(s,r,a,g,o)},(r,a,g,o,I)=>{Yn(s,r,a,g,o,I)},(r,a,g,o)=>{a&&(i.sh1||(i.sh1=new Uint32Array(t*2)),os(i.sh1,r,a)),g&&(i.sh2||(i.sh2=new Uint32Array(t*4)),Is(i.sh2,r,g)),o&&(i.sh3||(i.sh3=new Uint32Array(t*4)),Bs(i.sh3,r,o))}),{packedArray:s,numSplats:t,extra:i}}const ge=31744,xe=ge+1;let nA=null;function so({totalSplats:n,readback:A,ordering:t}){nA||(nA=new Uint32Array(xe)),nA.fill(0);const e=A.map(g=>new Uint32Array(g.buffer)),s=e[0].length,i=Math.ceil(n/s);let r=0;for(let g=0;g<i;++g){const o=e[g],I=Math.min(o.length,n-r);for(let B=0;B<I;++B){const Q=o[B]&32767;Q<ge&&(nA[Q]+=1)}r+=I}let a=0;for(let g=0;g<xe;++g){const o=a+nA[g];nA[g]=a,a=o}r=0;for(let g=0;g<i;++g){const o=e[g],I=Math.min(o.length,n-r);for(let B=0;B<I;++B){const Q=o[B]&32767;Q<ge&&(t[nA[Q]]=r+B,nA[Q]+=1)}r+=I}if(nA[xe-1]!==a)throw new Error(`Expected ${a} active splats but got ${nA[xe-1]}`);return{activeSplats:a,ordering:t}}function ro({numSplats:n,readback:A,ordering:t}){nA||(nA=new Uint32Array(xe)),nA.fill(0);for(let s=0;s<n;++s){const i=A[s];i<ge&&(nA[i]+=1)}let e=0;for(let s=ge-1;s>=0;--s){const i=e+nA[s];nA[s]=e,e=i}for(let s=0;s<n;++s){const i=A[s];i<ge&&(t[nA[i]]=s,nA[i]+=1)}if(nA[0]!==e)throw new Error(`Expected ${e} active splats but got ${nA[0]}`);return{activeSplats:e,ordering:t}}const Ei=[];function cr(n){Ei.push(n)}async function io(){self.addEventListener("message",cr),await ps(),self.removeEventListener("message",cr),self.addEventListener("message",Er);for(const n of Ei)Er(n);Ei.length=0}io().catch(console.error)})();\n//# sourceMappingURL=worker-BL--K90d.js.map\n', gs = typeof self < "u" && self.Blob && new Blob([Ra], { type: "text/javascript;charset=utf-8" });
function sC(t) {
let A;
try {
if (A = gs && (self.URL || self.webkitURL).createObjectURL(gs), !A) throw "";
const e = new Worker(A, {
name: t == null ? void 0 : t.name
});
return e.addEventListener("error", () => {
(self.URL || self.webkitURL).revokeObjectURL(A);
}), e;
} catch {
return new Worker(
"data:text/javascript;charset=utf-8," + encodeURIComponent(Ra),
{
name: t == null ? void 0 : t.name
}
);
} finally {
A && (self.URL || self.webkitURL).revokeObjectURL(A);
}
}
class iC {
constructor() {
this.messages = {}, this.messageIdNext = 0, this.worker = new sC(), this.worker.onmessage = (A) => this.onMessage(A);
}
makeMessageId() {
return ++this.messageIdNext;
}
makeMessagePromiseId() {
const A = this.makeMessageId(), e = new Promise((s, i) => {
this.messages[A] = { resolve: s, reject: i };
});
return { id: A, promise: e };
}
onMessage(A) {
const { id: e, result: s, error: i } = A.data, n = this.messages[e];
n && (delete this.messages[e], i ? n.reject(i) : n.resolve(s));
}
// Invoke an RPC on the worker with the given name and arguments.
// The normal usage of a worker is to run one activity at a time,
// but this function allows for concurrent calls, tagging each request
// with a unique message Id and awaiting a response to that same Id.
// The method will automatically transfer any ArrayBuffers in the
// arguments to the worker. If you'd like to transfer a copy of a
// buffer then you must clone it before passing to this function.
async call(A, e) {
const { id: s, promise: i } = this.makeMessagePromiseId();
return this.worker.postMessage(
{ name: A, args: e, id: s },
{ transfer: Mi(e) }
), i;
}
}
let Ga = 4, Be = 0;
const Ua = [], va = [];
async function nC() {
const t = Ua.shift();
if (t)
return t;
if (Be < Ga) {
const A = new iC();
return Be += 1, A;
}
return new Promise((A) => {
va.push(A);
});
}
function rC(t) {
if (Be > Ga) {
Be -= 1;
return;
}
const A = va.shift();
if (A) {
A(t);
return;
}
Ua.push(t);
}
async function Bt(t) {
const A = await nC();
try {
return await t(A);
} finally {
rC(A);
}
}
class aC extends ig {
constructor(A) {
super(A), this.fileLoader = new ng(A);
}
load(A, e, s, i) {
this.fileLoader.setResponseType("arraybuffer"), this.fileLoader.setCrossOrigin(this.crossOrigin), this.fileLoader.setWithCredentials(this.withCredentials), this.fileLoader.setPath(this.path), this.fileLoader.setResourcePath(this.resourcePath), this.fileLoader.setRequestHeader(this.requestHeader), this.fileLoader.load(
A,
async (n) => {
if (e) {
const r = n, a = {}, g = [];
let I = this.fileType;
try {
const B = $e(r);
if (this.fileType === "pcsogs" && B === void 0)
throw new Error("Invalid PC SOGS file");
if (B !== void 0) {
I = "pcsogs";
for (const C of ["means", "scales", "quats", "sh0", "shN"]) {
const E = B[C];
if (E) {
const l = E.files;
for (const c of l) {
const h = new URL(c, A).toString();
this.manager.itemStart(h);
const u = this.loadExtra(h).then((d) => {
a[c] = d;
}).catch((d) => {
throw this.manager.itemError(h), d;
}).finally(() => {
this.manager.itemEnd(h);
});
g.push(u);
}
}
}
}
await Promise.all(g);
const o = await Ya({
input: r,
extraFiles: a,
fileType: I,
pathOrUrl: A
});
this.packedSplats ? (this.packedSplats.initialize(o), e(this.packedSplats)) : e(new qA(o));
} catch (B) {
i == null || i(B);
}
}
},
s,
i
);
}
async loadAsync(A, e) {
return new Promise((s, i) => {
this.load(
A,
(n) => {
s(n);
},
e,
i
);
});
}
async loadExtra(A) {
return new Promise((e, s) => {
this.fileLoader.load(
A,
(i) => e(i),
void 0,
(i) => s(i)
);
});
}
parse(A) {
return new WA({ packedSplats: A });
}
}
var bt = /* @__PURE__ */ ((t) => (t.PLY = "ply", t.SPZ = "spz", t.SPLAT = "splat", t.KSPLAT = "ksplat", t.PCSOGS = "pcsogs", t.PCSOGSZIP = "pcsogszip", t))(bt || {});
function ba(t) {
const A = new DataView(t.buffer);
if ((A.getUint32(0, !0) & 16777215) === 7957616)
return "ply";
if ((A.getUint32(0, !0) & 16777215) === 559903) {
const e = bi(t, 4);
return new DataView(e.buffer).getUint32(0, !0) === 1347635022 ? "spz" : void 0;
}
if (A.getUint32(0, !0) === 67324752)
return oC(t) ? "pcsogszip" : void 0;
}
function gC(t) {
const A = t.split(/[?#]/, 1)[0], e = Math.max(
A.lastIndexOf("/"),
A.lastIndexOf("\\")
), s = A.slice(e + 1), i = s.lastIndexOf(".");
return i <= 0 || i === s.length - 1 ? "" : s.slice(i + 1).toLowerCase();
}
function La(t) {
const A = gC(t);
if (A === "ply")
return "ply";
if (A === "spz")
return "spz";
if (A === "splat")
return "splat";
if (A === "ksplat")
return "ksplat";
}
function IE(t) {
return $e(t) !== void 0;
}
function $e(t) {
try {
let A;
if (typeof t == "string")
A = t;
else {
const s = t instanceof ArrayBuffer ? new Uint8Array(t) : t;
if (s.length > 65536)
return;
A = new TextDecoder().decode(s);
}
const e = JSON.parse(A);
if (!e || typeof e != "object" || Array.isArray(e))
return;
for (const s of ["means", "scales", "quats", "sh0"])
if (!e[s] || typeof e[s] != "object" || Array.isArray(e[s]) || !e[s].shape || !e[s].files || s !== "quats" && (!e[s].mins || !e[s].maxs))
return;
return e;
} catch {
return;
}
}
function oC(t) {
try {
const A = t instanceof ArrayBuffer ? new Uint8Array(t) : t;
let e = null;
const s = fg(A, {
filter: ({ name: n }) => n.split(/[\\/]/).pop() === "meta.json" ? (e = n, !0) : !1
});
if (!e)
return;
const i = $e(s[e]);
return i ? { name: e, json: i } : void 0;
} catch {
return;
}
}
async function Ya({
input: t,
extraFiles: A,
fileType: e,
pathOrUrl: s
}) {
const i = t instanceof ArrayBuffer ? new Uint8Array(t) : t;
let n = e;
switch (e || (n = ba(i), !n && s && (n = La(s))), n) {
case "ply": {
const r = new Ie({ fileBytes: i });
await r.parseHeader();
const a = r.numSplats, g = mA(a).maxSplats, I = { fileBytes: i, packedArray: new Uint32Array(g * 4) };
return await Bt(async (B) => {
const { packedArray: o, numSplats: C, extra: E } = await B.call(
"unpackPly",
I
);
return { packedArray: o, numSplats: C, extra: E };
});
}
case "spz":
return await Bt(async (r) => {
const { packedArray: a, numSplats: g, extra: I } = await r.call(
"decodeSpz",
{
fileBytes: i
}
);
return { packedArray: a, numSplats: g, extra: I };
});
case "splat":
return await Bt(async (r) => {
const { packedArray: a, numSplats: g } = await r.call(
"decodeAntiSplat",
{
fileBytes: i
}
);
return { packedArray: a, numSplats: g };
});
case "ksplat":
return await Bt(async (r) => {
const { packedArray: a, numSplats: g, extra: I } = await r.call(
"decodeKsplat",
{ fileBytes: i }
);
return { packedArray: a, numSplats: g, extra: I };
});
case "pcsogs":
return await Bt(async (r) => {
const { packedArray: a, numSplats: g, extra: I } = await r.call(
"decodePcSogs",
{ fileBytes: i, extraFiles: A }
);
return { packedArray: a, numSplats: g, extra: I };
});
case "pcsogszip":
return await Bt(async (r) => {
const { packedArray: a, numSplats: g, extra: I } = await r.call(
"decodePcSogsZip",
{ fileBytes: i }
);
return { packedArray: a, numSplats: g, extra: I };
});
default:
throw new Error(`Unknown splat file type: ${n}`);
}
}
class IC {
constructor({ maxSplats: A = 1 } = {}) {
this.numSplats = 0, this.maxSplats = mA(A).maxSplats, this.centers = new Float32Array(this.maxSplats * 3), this.scales = new Float32Array(this.maxSplats * 3), this.quaternions = new Float32Array(this.maxSplats * 4), this.opacities = new Float32Array(this.maxSplats), this.colors = new Float32Array(this.maxSplats * 3);
}
pushSplat() {
const A = this.numSplats;
return this.ensureIndex(A), this.numSplats += 1, A;
}
unpushSplat(A) {
if (A === this.numSplats - 1)
this.numSplats -= 1;
else
throw new Error("Cannot unpush splat from non-last position");
}
ensureCapacity(A) {
if (A > this.maxSplats) {
const e = Math.max(A, this.maxSplats * 2), s = new Float32Array(e * 3), i = new Float32Array(e * 3), n = new Float32Array(e * 4), r = new Float32Array(e), a = new Float32Array(e * 3);
if (s.set(this.centers), i.set(this.scales), n.set(this.quaternions), r.set(this.opacities), a.set(this.colors), this.centers = s, this.scales = i, this.quaternions = n, this.opacities = r, this.colors = a, this.sh1) {
const g = new Float32Array(e * 9);
g.set(this.sh1), this.sh1 = g;
}
if (this.sh2) {
const g = new Float32Array(e * 15);
g.set(this.sh2), this.sh2 = g;
}
if (this.sh3) {
const g = new Float32Array(e * 21);
g.set(this.sh3), this.sh3 = g;
}
this.maxSplats = e;
}
}
ensureIndex(A) {
this.ensureCapacity(A + 1);
}
setCenter(A, e, s, i) {
this.centers[A * 3] = e, this.centers[A * 3 + 1] = s, this.centers[A * 3 + 2] = i;
}
setScale(A, e, s, i) {
this.scales[A * 3] = e, this.scales[A * 3 + 1] = s, this.scales[A * 3 + 2] = i;
}
setQuaternion(A, e, s, i, n) {
this.quaternions[A * 4] = e, this.quaternions[A * 4 + 1] = s, this.quaternions[A * 4 + 2] = i, this.quaternions[A * 4 + 3] = n;
}
setOpacity(A, e) {
this.opacities[A] = e;
}
setColor(A, e, s, i) {
this.colors[A * 3] = e, this.colors[A * 3 + 1] = s, this.colors[A * 3 + 2] = i;
}
setSh1(A, e) {
this.sh1 || (this.sh1 = new Float32Array(this.maxSplats * 9));
for (let s = 0; s < 9; ++s)
this.sh1[A * 9 + s] = e[s];
}
setSh2(A, e) {
this.sh2 || (this.sh2 = new Float32Array(this.maxSplats * 15));
for (let s = 0; s < 15; ++s)
this.sh2[A * 15 + s] = e[s];
}
setSh3(A, e) {
this.sh3 || (this.sh3 = new Float32Array(this.maxSplats * 21));
for (let s = 0; s < 21; ++s)
this.sh3[A * 21 + s] = e[s];
}
}
var BC = `precision highp float;
precision highp int;
precision highp sampler2D;
precision highp usampler2D;
precision highp isampler2D;
precision highp sampler2DArray;
precision highp usampler2DArray;
precision highp isampler2DArray;
precision highp sampler3D;
precision highp usampler3D;
precision highp isampler3D;
#include <splatDefines>
uniform uint targetLayer;
uniform int targetBase;
uniform int targetCount;
out uvec4 target;
{{ GLOBALS }}
void produceSplat(int index) {
{{ STATEMENTS }}
}
void main() {
int targetIndex = int(targetLayer << SPLAT_TEX_LAYER_BITS) + int(uint(gl_FragCoord.y) << SPLAT_TEX_WIDTH_BITS) + int(gl_FragCoord.x);
int index = targetIndex - targetBase;
if ((index >= 0) && (index < targetCount)) {
produceSplat(index);
} else {
target = uvec4(0u, 0u, 0u, 0u);
}
}`;
const eA = class eA {
constructor(A = {}) {
this.maxSplats = 0, this.numSplats = 0, this.packedArray = null, this.isInitialized = !1, this.target = null, this.source = null, this.needsUpdate = !0, this.extra = {}, this.dyno = new As({ packedSplats: this }), this.initialized = Promise.resolve(this), this.reinitialize(A);
}
reinitialize(A) {
this.isInitialized = !1, A.url || A.fileBytes || A.construct ? this.initialized = this.asyncInitialize(A).then(() => (this.isInitialized = !0, this)) : (this.initialize(A), this.isInitialized = !0, this.initialized = Promise.resolve(this));
}
initialize(A) {
A.packedArray ? (this.packedArray = A.packedArray, this.maxSplats = Math.floor(this.packedArray.length / 4), this.maxSplats = Math.floor(this.maxSplats / P) * P, this.numSplats = Math.min(
this.maxSplats,
A.numSplats ?? Number.POSITIVE_INFINITY
)) : (this.maxSplats = A.maxSplats ?? 0, this.numSplats = 0), this.extra = A.extra ?? {};
}
async asyncInitialize(A) {
const { url: e, fileBytes: s, construct: i } = A;
if (e) {
const n = new aC();
n.packedSplats = this, await n.loadAsync(e);
} else if (s) {
const n = await Ya({
input: s,
fileType: A.fileType,
pathOrUrl: A.fileName ?? e
});
this.initialize(n);
}
if (i) {
const n = i(this);
n instanceof Promise && await n;
}
}
// Call this when you are finished with the PackedSplats and want to free
// any buffers it holds.
dispose() {
this.target && (this.target.dispose(), this.target = null), this.source && (this.source.dispose(), this.source = null);
}
// Ensures that this.packedArray can fit numSplats Gsplats. If it's too small,
// resize exponentially and copy over the original data.
//
// Typically you don't need to call this, because calling this.setSplat(index, ...)
// and this.pushSplat(...) will automatically call ensureSplats() so we have
// enough splats.
ensureSplats(A) {
const e = A <= this.maxSplats ? this.maxSplats : (
// Grow exponentially to avoid frequent reallocations
Math.max(A, 2 * this.maxSplats)
), s = this.packedArray ? this.packedArray.length / 4 : 0;
if (!this.packedArray || e > s) {
this.maxSplats = mA(e).maxSplats;
const i = new Uint32Array(this.maxSplats * 4);
this.packedArray && i.set(this.packedArray), this.packedArray = i;
}
return this.packedArray;
}
// Ensure the extra array for the given level is large enough to hold numSplats
ensureSplatsSh(A, e) {
let s, i;
if (A === 0)
return this.ensureSplats(e);
if (A === 1)
s = 2, i = "sh1";
else if (A === 2)
s = 4, i = "sh2";
else if (A === 3)
s = 4, i = "sh3";
else
throw new Error(`Invalid level: ${A}`);
let n = this.extra[i] ? this.extra[i].length / s : 0;
const r = e <= n ? n : Math.max(e, 2 * n);
if (!this.extra[i] || r > n) {
n = mA(r).maxSplats;
const a = new Uint32Array(n * s);
this.extra[i] && a.set(this.extra[i]), this.extra[i] = a;
}
return this.extra[i];
}
// Unpack the 16-byte Gsplat data at index into the Three.js components
// center: THREE.Vector3, scales: THREE.Vector3, quaternion: THREE.Quaternion,
// opacity: number 0..1, color: THREE.Color 0..1.
getSplat(A) {
if (!this.packedArray || A >= this.numSplats)
throw new Error("Invalid index");
return Ue(this.packedArray, A);
}
// Set all PackedSplat components at index with the provided Gsplat attributes
// (can be the same objects returned by getSplat). Ensures there is capacity
// for at least index+1 Gsplats.
setSplat(A, e, s, i, n, r) {
const a = this.ensureSplats(A + 1);
Ge(
a,
A,
e.x,
e.y,
e.z,
s.x,
s.y,
s.z,
i.x,
i.y,
i.z,
i.w,
n,
r.r,
r.g,
r.b
), this.numSplats = Math.max(this.numSplats, A + 1);
}
// Effectively calls this.setSplat(this.numSplats++, center, ...), useful on
// construction where you just want to iterate and create a collection of Gsplats.
pushSplat(A, e, s, i, n) {
const r = this.ensureSplats(this.numSplats + 1);
Ge(
r,
this.numSplats,
A.x,
A.y,
A.z,
e.x,
e.y,
e.z,
s.x,
s.y,
s.z,
s.w,
i,
n.r,
n.g,
n.b
), ++this.numSplats;
}
// Iterate over Gsplats index 0..=(this.numSplats-1), unpack each Gsplat
// and invoke the callback function with the Gsplat attributes.
forEachSplat(A) {
if (!(!this.packedArray || !this.numSplats))
for (let e = 0; e < this.numSplats; ++e) {
const s = Ue(this.packedArray, e);
A(
e,
s.center,
s.scales,
s.quaternion,
s.opacity,
s.color
);
}
}
// Ensures our PackedSplats.target render target has enough space to generate
// maxSplats total Gsplats, and reallocate if not large enough.
ensureGenerate(A) {
if (this.target && (A ?? 1) <= this.maxSplats)
return !1;
this.dispose();
const e = mA(A ?? 1), { width: s, height: i, depth: n } = e;
return this.maxSplats = e.maxSplats, this.target = new Q.WebGLArrayRenderTarget(s, i, n, {
depthBuffer: !1,
stencilBuffer: !1,
generateMipmaps: !1,
magFilter: Q.NearestFilter,
minFilter: Q.NearestFilter
}), this.target.texture.format = Q.RGBAIntegerFormat, this.target.texture.type = Q.UnsignedIntType, this.target.texture.internalFormat = "RGBA32UI", this.target.scissorTest = !0, !0;
}
// Given an array of splatCounts (.numSplats for each
// SplatGenerator/SplatMesh in the scene), compute a
// "mapping layout" in the composite array of generated outputs.
generateMapping(A) {
let e = 0;
const s = A.map((i) => {
const n = e, r = Math.ceil(i / P) * P;
return e += r, { base: n, count: i };
});
return { maxSplats: e, mapping: s };
}
// Returns a THREE.DataArrayTexture representing the PackedSplats content as
// a Uint32x4 data array texture (2048 x 2048 x depth in size)
getTexture() {
return this.target ? this.target.texture : this.source || this.packedArray ? this.maybeUpdateSource() : eA.getEmpty();
}
// Check if source texture needs to be created/updated
maybeUpdateSource() {
if (!this.packedArray)
throw new Error("No packed splats");
if (this.needsUpdate || !this.source) {
if (this.needsUpdate = !1, this.source) {
const { width: A, height: e, depth: s } = this.source.image;
this.maxSplats !== A * e * s && (this.source.dispose(), this.source = null);
}
if (this.source)
this.packedArray.buffer !== this.source.image.data.buffer && (this.source.image.data = new Uint8Array(this.packedArray.buffer));
else {
const { width: A, height: e, depth: s } = mA(this.maxSplats);
this.source = new Q.DataArrayTexture(
this.packedArray,
A,
e,
s
), this.source.format = Q.RGBAIntegerFormat, this.source.type = Q.UnsignedIntType, this.source.internalFormat = "RGBA32UI", this.source.needsUpdate = !0;
}
this.source.needsUpdate = !0;
}
return this.source;
}
// Can be used where you need an uninitialized THREE.DataArrayTexture like
// a uniform you will update with the result of this.getTexture() later.
static getEmpty() {
if (!eA.emptySource) {
const { width: A, height: e, depth: s, maxSplats: i } = mA(1), n = new Uint32Array(i * 4);
eA.emptySource = new Q.DataArrayTexture(
n,
A,
e,
s
), eA.emptySource.format = Q.RGBAIntegerFormat, eA.emptySource.type = Q.UnsignedIntType, eA.emptySource.internalFormat = "RGBA32UI", eA.emptySource.needsUpdate = !0;
}
return eA.emptySource;
}
// Get a program and THREE.RawShaderMaterial for a given GsplatGenerator,
// generating it if necessary and caching the result.
prepareProgramMaterial(A) {
let e = eA.generatorProgram.get(A);
if (!e) {
const i = kA(
{ index: "int" },
{ output: "uvec4" },
({ index: n }) => {
A.inputs.index = n;
const r = A.outputs.gsplat;
return { output: Ks(r) };
}
);
eA.programTemplate || (eA.programTemplate = new We(
BC
)), e = new Oe({
graph: i,
inputs: { index: "index" },
outputs: { output: "target" },
template: eA.programTemplate
}), Object.assign(e.uniforms, {
targetLayer: { value: 0 },
targetBase: { value: 0 },
targetCount: { value: 0 }
}), eA.generatorProgram.set(A, e);
}
const s = e.prepareMaterial();
return eA.mesh.material = s, { program: e, material: s };
}
saveRenderState(A) {
return {
xrEnabled: A.xr.enabled,
autoClear: A.autoClear
};
}
resetRenderState(A, e) {
A.setRenderTarget(null), A.xr.enabled = e.xrEnabled, A.autoClear = e.autoClear;
}
// Executes a dyno program specified by generator which is any DynoBlock that
// maps { index: "int" } to { gsplat: Gsplat }. This is called in
// SparkRenderer.updateInternal() to re-generate Gsplats in the scene for
// SplatGenerator instances whose version is newer than what was generated
// for it last time.
generate({
generator: A,
base: e,
count: s,
renderer: i
}) {
if (!this.target)
throw new Error("Target must be initialized with ensureSplats");
if (e + s > this.maxSplats)
throw new Error("Base + count exceeds maxSplats");
const { program: n, material: r } = this.prepareProgramMaterial(A);
n.update();
const a = this.saveRenderState(i), g = Math.ceil((e + s) / P) * P, I = P * it;
for (r.uniforms.targetBase.value = e, r.uniforms.targetCount.value = s; e < g; ) {
const B = Math.floor(e / I);
r.uniforms.targetLayer.value = B;
const o = B * I, C = Math.floor((e - o) / P), E = Math.min(
it,
Math.ceil((g - o) / P)
);
this.target.scissor.set(
0,
C,
P,
E - C
), i.setRenderTarget(this.target, B), i.xr.enabled = !1, i.autoClear = !1, i.render(eA.scene, eA.camera), e += P * (E - C);
}
return this.resetRenderState(i, a), { nextBase: g };
}
};
eA.emptySource = null, eA.programTemplate = null, eA.generatorProgram = /* @__PURE__ */ new Map(), eA.geometry = new Q.PlaneGeometry(2, 2), eA.mesh = new Q.Mesh(
eA.geometry,
new Q.RawShaderMaterial({ visible: !1 })
), eA.scene = new Q.Scene().add(eA.mesh), eA.camera = new Q.Camera();
let qA = eA;
class As extends R {
constructor({ packedSplats: A } = {}) {
super({
key: "packedSplats",
type: Zt,
globals: () => [ce],
value: {
texture: qA.getEmpty(),
numSplats: 0
},
update: (e) => {
var s, i;
return e.texture = ((s = this.packedSplats) == null ? void 0 : s.getTexture()) ?? qA.getEmpty(), e.numSplats = ((i = this.packedSplats) == null ? void 0 : i.numSplats) ?? 0, e;
}
}), this.packedSplats = A;
}
}
class Te extends Q.InstancedBufferGeometry {
constructor(A, e) {
super(), this.ordering = A, this.setAttribute("position", new Q.BufferAttribute(QC, 3)), this.setIndex(new Q.BufferAttribute(CC, 1)), this._maxInstanceCount = A.length, this.instanceCount = e, this.attribute = new Q.InstancedBufferAttribute(A, 1, !1, 1), this.attribute.setUsage(Q.DynamicDrawUsage), this.setAttribute("splatIndex", this.attribute);
}
update(A, e) {
this.ordering = A, this.attribute.array = A, this.instanceCount = e, this.attribute.addUpdateRange(0, e), this.attribute.needsUpdate = !0;
}
}
const QC = new Float32Array([
-1,
-1,
0,
1,
-1,
0,
1,
1,
0,
-1,
1,
0
]), CC = new Uint16Array([0, 1, 2, 0, 2, 3]), st = class st {
constructor(A) {
if (this.lastTime = null, this.encodeLinear = !1, this.superXY = 1, this.display = null, this.sorting = null, this.pending = null, this.sortingCheck = !1, this.readback = new Uint16Array(0), this.spark = A.spark, this.camera = A.camera, this.viewToWorld = A.viewToWorld ?? new Q.Matrix4(), A.target) {
const { width: e, height: s, doubleBuffer: i } = A.target, n = Math.max(1, Math.min(4, A.target.superXY ?? 1));
if (this.superXY = n, e * n > 8192 || s * n > 8192)
throw new Error("Target size too large");
this.target = new Q.WebGLRenderTarget(
e * n,
s * n,
{
format: Q.RGBAFormat,
type: Q.UnsignedByteType,
colorSpace: Q.SRGBColorSpace
}
), i && (this.back = new Q.WebGLRenderTarget(
e * n,
s * n,
{
format: Q.RGBAFormat,
type: Q.UnsignedByteType,
colorSpace: Q.SRGBColorSpace
}
)), this.encodeLinear = !0;
}
this.onTextureUpdated = A.onTextureUpdated, this.sortRadial = A.sortRadial ?? !0, this.sortDistance = A.sortDistance, this.sortCoorient = A.sortCoorient, this.depthBias = A.depthBias, this.sort360 = A.sort360, this.orderingFreelist = new Si({
allocate: (e) => new Uint32Array(e),
valid: (e, s) => e.length === s
}), this.autoUpdate = !1, this.setAutoUpdate(A.autoUpdate ?? !1);
}
// Call this when you are done with the SparkViewpoint and want to
// free up its resources (GPU targets, pixel buffers, etc.)
dispose() {
var A;
this.setAutoUpdate(!1), this.target && (this.target.dispose(), this.target = void 0), this.back && (this.back.dispose(), this.back = void 0), this.display && (this.spark.releaseAccumulator(this.display.accumulator), this.display.geometry.dispose(), this.display = null), (A = this.pending) != null && A.accumulator && (this.spark.releaseAccumulator(this.pending.accumulator), this.pending = null);
}
// Use this function to change whether this viewpoint will auto-update
// its sort order whenever the attached SparkRenderer updates the Gsplats.
// Turn this on or off depending on whether you expect to do renders from
// this viewpoint most frames.
setAutoUpdate(A) {
!this.autoUpdate && A ? this.spark.autoViewpoints.push(this) : this.autoUpdate && !A && (this.spark.autoViewpoints = this.spark.autoViewpoints.filter(
(e) => e !== this
)), this.autoUpdate = A;
}
// See below async prepareRenderPixels() for explanation of parameters.
// Awaiting this method updates the Gsplats in the scene and performs a sort of the
// Gsplats from this viewpoint, preparing it for a subsequent this.renderTarget()
// call in the same tick.
async prepare({
scene: A,
camera: e,
viewToWorld: s,
update: i,
forceOrigin: n
}) {
var a;
for (s ? this.viewToWorld = s : (this.camera = e ?? this.camera, this.camera && (this.camera.updateMatrixWorld(), this.viewToWorld = this.camera.matrixWorld.clone())); i ?? !0; ) {
const g = n ? this.viewToWorld : void 0;
if (this.spark.updateInternal({ scene: A, originToWorld: g }))
break;
await new Promise((B) => setTimeout(B, 10));
}
const r = this.spark.active;
r !== ((a = this.display) == null ? void 0 : a.accumulator) && (this.spark.active.refCount += 1), await this.sortUpdate({ accumulator: r, viewToWorld: this.viewToWorld });
}
// Render out the viewpoint to the view target RGBA buffer.
// Swaps buffers if doubleBuffer: true was set.
// Calls onTextureUpdated(texture) with the resulting texture.
renderTarget({
scene: A,
camera: e
}) {
var i;
const s = this.back ?? this.target;
if (!s)
throw new Error("Must initialize SparkViewpoint with target");
if (e = e ?? this.camera, !e)
throw new Error("Must provide camera");
if (e instanceof Q.PerspectiveCamera) {
const n = new Q.PerspectiveCamera().copy(e, !1);
n.aspect = s.width / s.height, n.updateProjectionMatrix(), e = n;
}
this.viewToWorld = e.matrixWorld.clone();
try {
this.spark.renderer.setRenderTarget(s), this.spark.prepareViewpoint(this), this.spark.renderer.render(A, e);
} finally {
this.spark.prepareViewpoint(this.spark.defaultView), this.spark.renderer.setRenderTarget(null);
}
s !== this.target && ([this.target, this.back] = [this.back, this.target]), (i = this.onTextureUpdated) == null || i.call(this, s.texture);
}
// Read back the previously rendered target image as a Uint8Array of packed
// RGBA values (in that order). If superXY was set greater than 1 then
// downsampling is performed in the target pixel array with simple averaging
// to derive the returned pixel values. Subsequent calls to this.readTarget()
// will reuse the same buffers to minimize memory allocations.
async readTarget() {
if (!this.target)
throw new Error("Must initialize SparkViewpoint with target");
const { width: A, height: e } = this.target, s = A * e * 4;
(!this.superPixels || this.superPixels.length < s) && (this.superPixels = new Uint8Array(s)), await this.spark.renderer.readRenderTargetPixelsAsync(
this.target,
0,
0,
A,
e,
this.superPixels
);
const { superXY: i } = this;
if (i === 1)
return this.superPixels;
const n = A / i, r = e / i, a = n * r * 4;
(!this.pixels || this.pixels.length < a) && (this.pixels = new Uint8Array(a));
const { superPixels: g, pixels: I } = this, B = i * i;
for (let o = 0; o < r; o++) {
const C = o * n;
for (let E = 0; E < n; E++) {
const l = E * i;
let c = 0, h = 0, u = 0, d = 0;
for (let y = 0; y < i; y++) {
const f = (o * i + y) * this.target.width;
for (let M = 0; M < i; M++) {
const x = (f + l + M) * 4;
c += g[x], h += g[x + 1], u += g[x + 2], d += g[x + 3];
}
}
const w = (C + E) * 4;
I[w] = c / B, I[w + 1] = h / B, I[w + 2] = u / B, I[w + 3] = d / B;
}
}
return I;
}
// Render out a viewpoint as a Uint8Array of RGBA values for the provided scene
// and any camera/viewToWorld viewpoint overrides. By default update is true,
// which triggers its SparkRenderer to check and potentially update the Gsplats.
// Setting update to false disables this and sorts the Gsplats as they are.
// Setting forceOrigin (default: false) to true forces the view update to
// recalculate the splats with this view origin, potentially altering any
// view-dependent effects. If you expect view-dependent effects to play a role
// in the rendering quality, enable this.
//
// Underneath, prepareRenderPixels() simply calls await this.prepare(...),
// this.renderTarget(...), and finally returns the result this.readTarget(),
// a Promise to a Uint8Array with RGBA values for all the pixels (potentially
// downsampled if the superXY parameter was used). These steps can also be called
// manually, for example if you need to alter the scene before and after
// this.renderTarget(...) to hide UI elements from being rendered.
async prepareRenderPixels({
scene: A,
camera: e,
viewToWorld: s,
update: i,
forceOrigin: n
}) {
return await this.prepare({ scene: A, camera: e, viewToWorld: s, update: i, forceOrigin: n }), this.renderTarget({ scene: A, camera: e }), this.readTarget();
}
// This is called automatically by SparkRenderer, there is no need to call it!
// The method cannot be private because then SparkRenderer would
// not be able to call it.
autoPoll({ accumulator: A }) {
var n, r, a, g;
this.camera && (this.camera.updateMatrixWorld(), this.viewToWorld = this.camera.matrixWorld.clone());
let e = !1, s = !1;
if (!this.display)
e = !0;
else if (A) {
e = !0;
const { mappingVersion: I } = this.display.accumulator;
A.mappingVersion === I && (this.spark.releaseAccumulator(this.display.accumulator), this.display.accumulator = A, s = !0);
}
const i = ((n = this.sorting) == null ? void 0 : n.viewToWorld) ?? ((r = this.display) == null ? void 0 : r.viewToWorld);
i && !ae({
matrix1: this.viewToWorld,
matrix2: i,
// By default update sort each 1 cm
maxDistance: this.sortDistance ?? 0.01,
// By default for radial sort, update for intermittent movement so that
// we bring back splats culled by being behind the camera.
// For depth sort, small rotations can change sort order a lot, so
// update sort for even small rotations.
minCoorient: this.sortCoorient ?? this.sortRadial ? 0.99 : 0.999
}) && (e = !0), e && (A && (A.refCount += 1), A && ((a = this.pending) != null && a.accumulator) && this.pending.accumulator !== ((g = this.display) == null ? void 0 : g.accumulator) && this.spark.releaseAccumulator(this.pending.accumulator), this.pending = { accumulator: A, viewToWorld: this.viewToWorld, displayed: s }, this.driveSort());
}
async driveSort() {
var A;
for (; ; ) {
if (this.sorting || !this.pending)
return;
const { viewToWorld: e, displayed: s } = this.pending;
let i = this.pending.accumulator ?? ((A = this.display) == null ? void 0 : A.accumulator);
if (i || (i = this.spark.active, i.refCount += 1), this.pending = null, !i)
throw new Error("No accumulator to sort");
this.sorting = { viewToWorld: e }, await this.sortUpdate({ accumulator: i, viewToWorld: e, displayed: s }), this.sorting = null;
}
}
async sortUpdate({
accumulator: A,
viewToWorld: e,
displayed: s = !1
}) {
if (this.sortingCheck)
throw new Error("Only one sort at a time");
this.sortingCheck = !0, A = A ?? this.spark.active;
const { numSplats: i, maxSplats: n } = A.splats;
let r = 0, a = this.orderingFreelist.alloc(n);
if (i > 0) {
const {
reader: g,
doubleSortReader: I,
dynoSortRadial: B,
dynoOrigin: o,
dynoDirection: C,
dynoDepthBias: E,
dynoSort360: l,
dynoSplats: c
} = st.makeSorter(), h = Math.ceil(n / 2);
this.readback = g.ensureBuffer(h, this.readback);
const u = A.toWorld.clone().invert(), d = e.clone().premultiply(u);
B.value = this.sort360 ? !0 : this.sortRadial, o.value.set(0, 0, 0).applyMatrix4(d), C.value.set(0, 0, -1).applyMatrix4(d).sub(o.value).normalize(), E.value = this.depthBias ?? 1, l.value = this.sort360 ?? !1, c.packedSplats = A.splats, await g.renderReadback({
renderer: this.spark.renderer,
reader: I,
count: Math.ceil(i / 2),
readback: this.readback
});
const w = await Bt(async (y) => y.call("sortDoubleSplats", {
numSplats: i,
readback: this.readback,
ordering: a
}));
this.readback = w.readback, a = w.ordering, r = w.activeSplats;
}
this.updateDisplay({
accumulator: A,
viewToWorld: e,
ordering: a,
activeSplats: r,
displayed: s
}), this.sortingCheck = !1;
}
updateDisplay({
accumulator: A,
viewToWorld: e,
ordering: s,
activeSplats: i,
displayed: n = !1
}) {
if (!this.display)
this.display = {
accumulator: A,
viewToWorld: e,
geometry: new Te(s, i)
};
else {
!n && A !== this.display.accumulator && (this.spark.releaseAccumulator(this.display.accumulator), this.display.accumulator = A), this.display.viewToWorld = e;
const r = this.display.geometry.ordering;
r.length === s.length ? this.display.geometry.update(s, i) : (this.display.geometry.dispose(), this.display.geometry = new Te(s, i)), this.orderingFreelist.free(r);
}
this.spark.viewpoint === this && this.spark.prepareViewpoint(this);
}
static makeSorter() {
if (!st.dynos) {
const A = new re({ value: !0 }), e = new Mt({ value: new Q.Vector3() }), s = new Mt({ value: new Q.Vector3() }), i = new Ct({ value: 1 }), n = new re({ value: !1 }), r = new As(), a = new ge(), g = kA(
{ index: "int" },
{ rgba8: "vec4" },
({ index: I }) => {
if (!I)
throw new Error("No index");
const B = {
sortRadial: A,
sortOrigin: e,
sortDirection: s,
sortDepthBias: i,
sort360: n
}, o = QA(I, K("int", 2)), C = Jt(r, o), E = os({ gsplat: C, ...B }), l = Jt(
r,
DA(o, K("int", 1))
), c = os({ gsplat: l, ...B }), h = KA({
vectorType: "vec2",
x: E,
y: c
});
return { rgba8: Kn(Hn(h)) };
}
);
st.dynos = {
dynoSortRadial: A,
dynoOrigin: e,
dynoDirection: s,
dynoDepthBias: i,
dynoSort360: n,
dynoSplats: r,
reader: a,
doubleSortReader: g
};
}
return st.dynos;
}
};
st.EMPTY_TEXTURE = new Q.Texture(), st.dynos = null;
let Qe = st;
const EC = EA(`
float computeSort(Gsplat gsplat, bool sortRadial, vec3 sortOrigin, vec3 sortDirection, float sortDepthBias, bool sort360) {
if (!isGsplatActive(gsplat.flags)) {
return INFINITY;
}
vec3 center = gsplat.center - sortOrigin;
float biasedDepth = dot(center, sortDirection) + sortDepthBias;
if (!sort360 && (biasedDepth <= 0.0)) {
return INFINITY;
}
return sortRadial ? length(center) : biasedDepth;
}
`);
function os({
gsplat: t,
sortRadial: A,
sortOrigin: e,
sortDirection: s,
sortDepthBias: i,
sort360: n
}) {
return Vt({
inTypes: {
gsplat: X,
sortRadial: "bool",
sortOrigin: "vec3",
sortDirection: "vec3",
sortDepthBias: "float",
sort360: "bool"
},
outTypes: { metric: "float" },
globals: () => [NA, EC],
inputs: {
gsplat: t,
sortRadial: A,
sortOrigin: e,
sortDirection: s,
sortDepthBias: i,
sort360: n
},
statements: ({ inputs: r, outputs: a }) => {
const {
gsplat: g,
sortRadial: I,
sortOrigin: B,
sortDirection: o,
sortDepthBias: C,
sort360: E
} = r;
return UA(`
${a.metric} = computeSort(${g}, ${I}, ${B}, ${o}, ${C}, ${E});
`);
}
}).outputs.metric;
}
class Se {
constructor() {
this.splats = new qA(), this.toWorld = new Q.Matrix4(), this.mapping = [], this.refCount = 0, this.splatsVersion = -1, this.mappingVersion = -1;
}
ensureGenerate(A) {
this.splats.ensureGenerate(A) && (this.mapping = []);
}
// Generate all Gsplats from an array of generators
generateSplats({
renderer: A,
modifier: e,
generators: s,
forceUpdate: i,
originToWorld: n
}) {
const r = this.mapping.reduce((I, B) => (I.set(B.node, B), I), /* @__PURE__ */ new Map());
let a = 0, g = 0;
for (const { node: I, generator: B, version: o, base: C, count: E } of s) {
const l = r.get(I);
if ((i || B !== (l == null ? void 0 : l.generator) || o !== (l == null ? void 0 : l.version) || C !== (l == null ? void 0 : l.base) || E !== (l == null ? void 0 : l.count)) && B && E > 0) {
const c = e.apply(B);
try {
this.splats.generate({
generator: c,
base: C,
count: E,
renderer: A
});
} catch (h) {
I.generator = void 0, I.generatorError = h;
}
a += 1;
}
g = Math.max(g, C + E);
}
return this.splats.numSplats = g, this.toWorld = n, this.mapping = s, a !== 0;
}
// Check if this accumulator has exactly the same generator mapping as
// the previous one. If so, we can reuse the Gsplat sort order.
hasCorrespondence(A) {
return this.mapping.length !== A.mapping.length ? !1 : this.mapping.every(({ node: e, base: s, count: i }, n) => {
const {
node: r,
base: a,
count: g
} = A.mapping[n];
return e === r && s === a && i === g;
});
}
}
var cC = `const float LN_SCALE_MIN = -9.0;
const float LN_SCALE_MAX = 9.0;
const float LN_RESCALE = (LN_SCALE_MAX - LN_SCALE_MIN) / 254.0;
const uint SPLAT_TEX_WIDTH_BITS = 11u;
const uint SPLAT_TEX_HEIGHT_BITS = 11u;
const uint SPLAT_TEX_DEPTH_BITS = 11u;
const uint SPLAT_TEX_LAYER_BITS = SPLAT_TEX_WIDTH_BITS + SPLAT_TEX_HEIGHT_BITS;
const uint SPLAT_TEX_WIDTH = 1u << SPLAT_TEX_WIDTH_BITS;
const uint SPLAT_TEX_HEIGHT = 1u << SPLAT_TEX_HEIGHT_BITS;
const uint SPLAT_TEX_DEPTH = 1u << SPLAT_TEX_DEPTH_BITS;
const uint SPLAT_TEX_WIDTH_MASK = SPLAT_TEX_WIDTH - 1u;
const uint SPLAT_TEX_HEIGHT_MASK = SPLAT_TEX_HEIGHT - 1u;
const uint SPLAT_TEX_DEPTH_MASK = SPLAT_TEX_DEPTH - 1u;
const uint F16_INF = 0x7c00u;
const float PI = 3.1415926535897932384626433832795;
const float INFINITY = 1.0 / 0.0;
const float NEG_INFINITY = -INFINITY;
const float MAX_PIXEL_RADIUS = 512.0;
const float MIN_ALPHA = 0.5 * (1.0 / 255.0);
const float MAX_STDDEV = sqrt(8.0);
float sqr(float x) {
return x * x;
}
float pow4(float x) {
float x2 = x * x;
return x2 * x2;
}
float pow8(float x) {
float x4 = pow4(x);
return x4 * x4;
}
vec3 srgbToLinear(vec3 rgb) {
return pow(rgb, vec3(2.2));
}
vec3 linearToSrgb(vec3 rgb) {
return pow(rgb, vec3(1.0 / 2.2));
}
uint encodeQuatOctXy88R8(vec4 q) {
if (q.w < 0.0) {
q = -q;
}
float theta = 2.0 * acos(q.w);
float halfTheta = theta * 0.5;
float s = sin(halfTheta);
vec3 axis = (abs(s) < 1e-6) ? vec3(1.0, 0.0, 0.0) : q.xyz / s;
float sum = abs(axis.x) + abs(axis.y) + abs(axis.z);
vec2 p = vec2(axis.x, axis.y) / sum;
if (axis.z < 0.0) {
float oldPx = p.x;
p.x = (1.0 - abs(p.y)) * (p.x >= 0.0 ? 1.0 : -1.0);
p.y = (1.0 - abs(oldPx)) * (p.y >= 0.0 ? 1.0 : -1.0);
}
float u_f = p.x * 0.5 + 0.5;
float v_f = p.y * 0.5 + 0.5;
uint quantU = uint(clamp(round(u_f * 255.0), 0.0, 255.0));
uint quantV = uint(clamp(round(v_f * 255.0), 0.0, 255.0));
uint angleInt = uint(clamp(round((theta / 3.14159265359) * 255.0), 0.0, 255.0));
return (angleInt << 16u) | (quantV << 8u) | quantU;
}
vec4 decodeQuatOctXy88R8(uint encoded) {
uint quantU = encoded & uint(0xFFu);
uint quantV = (encoded >> 8u) & uint(0xFFu);
uint angleInt = encoded >> 16u;
float u_f = float(quantU) / 255.0;
float v_f = float(quantV) / 255.0;
vec2 f = vec2(u_f * 2.0 - 1.0, v_f * 2.0 - 1.0);
vec3 axis = vec3(f.xy, 1.0 - abs(f.x) - abs(f.y));
float t = max(-axis.z, 0.0);
axis.x += (axis.x >= 0.0) ? -t : t;
axis.y += (axis.y >= 0.0) ? -t : t;
axis = normalize(axis);
float theta = (float(angleInt) / 255.0) * 3.14159265359;
float halfTheta = theta * 0.5;
float s = sin(halfTheta);
float w = cos(halfTheta);
return vec4(axis * s, w);
}
uvec4 packSplat(vec3 center, vec3 scales, vec4 quaternion, vec4 rgba) {
uvec4 uRgba = uvec4(round(clamp(rgba * 255.0, 0.0, 255.0)));
uint uQuat = encodeQuatOctXy88R8(quaternion);
uvec3 uQuat3 = uvec3(uQuat & 0xffu, (uQuat >> 8u) & 0xffu, (uQuat >> 16u) & 0xffu);
uvec3 uScales = uvec3(
(scales.x == 0.0) ? 0u : uint(round(clamp((log(scales.x) - LN_SCALE_MIN) / LN_RESCALE, 0.0, 254.0))) + 1u,
(scales.y == 0.0) ? 0u : uint(round(clamp((log(scales.y) - LN_SCALE_MIN) / LN_RESCALE, 0.0, 254.0))) + 1u,
(scales.z == 0.0) ? 0u : uint(round(clamp((log(scales.z) - LN_SCALE_MIN) / LN_RESCALE, 0.0, 254.0))) + 1u
);
uint word0 = uRgba.r | (uRgba.g << 8u) | (uRgba.b << 16u) | (uRgba.a << 24u);
uint word1 = packHalf2x16(center.xy);
uint word2 = packHalf2x16(vec2(center.z, 0.0)) | (uQuat3.x << 16u) | (uQuat3.y << 24u);
uint word3 = uScales.x | (uScales.y << 8u) | (uScales.z << 16u) | (uQuat3.z << 24u);
return uvec4(word0, word1, word2, word3);
}
void unpackSplat(uvec4 packed, out vec3 center, out vec3 scales, out vec4 quaternion, out vec4 rgba) {
uint word0 = packed.x, word1 = packed.y, word2 = packed.z, word3 = packed.w;
uvec4 uRgba = uvec4(word0 & 0xffu, (word0 >> 8u) & 0xffu, (word0 >> 16u) & 0xffu, (word0 >> 24u) & 0xffu);
rgba = vec4(uRgba) / 255.0;
center = vec4(
unpackHalf2x16(word1),
unpackHalf2x16(word2 & 0xffffu)
).xyz;
uvec3 uScales = uvec3(word3 & 0xffu, (word3 >> 8u) & 0xffu, (word3 >> 16u) & 0xffu);
scales = vec3(
(uScales.x == 0u) ? 0.0 : exp(LN_SCALE_MIN + float(uScales.x - 1u) * LN_RESCALE),
(uScales.y == 0u) ? 0.0 : exp(LN_SCALE_MIN + float(uScales.y - 1u) * LN_RESCALE),
(uScales.z == 0u) ? 0.0 : exp(LN_SCALE_MIN + float(uScales.z - 1u) * LN_RESCALE)
);
uint uQuat = ((word2 >> 16u) & 0xFFFFu) | ((word3 >> 8u) & 0xFF0000u);
quaternion = decodeQuatOctXy88R8(uQuat);
}
vec3 quatVec(vec4 q, vec3 v) {
vec3 t = 2.0 * cross(q.xyz, v);
return v + q.w * t + cross(q.xyz, t);
}
vec4 quatQuat(vec4 q1, vec4 q2) {
return vec4(
q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y,
q1.w * q2.y - q1.x * q2.z + q1.y * q2.w + q1.z * q2.x,
q1.w * q2.z + q1.x * q2.y - q1.y * q2.x + q1.z * q2.w,
q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z
);
}
mat3 scaleQuaternionToMatrix(vec3 s, vec4 q) {
return mat3(
s.x * (1.0 - 2.0 * (q.y * q.y + q.z * q.z)),
s.x * (2.0 * (q.x * q.y + q.w * q.z)),
s.x * (2.0 * (q.x * q.z - q.w * q.y)),
s.y * (2.0 * (q.x * q.y - q.w * q.z)),
s.y * (1.0 - 2.0 * (q.x * q.x + q.z * q.z)),
s.y * (2.0 * (q.y * q.z + q.w * q.x)),
s.z * (2.0 * (q.x * q.z + q.w * q.y)),
s.z * (2.0 * (q.y * q.z - q.w * q.x)),
s.z * (1.0 - 2.0 * (q.x * q.x + q.y * q.y))
);
}
vec4 slerp(vec4 q1, vec4 q2, float t) {
float cosHalfTheta = dot(q1, q2);
if (abs(cosHalfTheta) >= 0.999) {
return q1;
}
if (cosHalfTheta < 0.0) {
q2 = -q2;
cosHalfTheta = -cosHalfTheta;
}
float halfTheta = acos(cosHalfTheta);
float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta);
float ratioA = sin((1.0 - t) * halfTheta) / sinHalfTheta;
float ratioB = sin(t * halfTheta) / sinHalfTheta;
return q1 * ratioA + q2 * ratioB;
}
ivec3 splatTexCoord(int index) {
uint x = uint(index) & SPLAT_TEX_WIDTH_MASK;
uint y = (uint(index) >> SPLAT_TEX_WIDTH_BITS) & SPLAT_TEX_HEIGHT_MASK;
uint z = uint(index) >> SPLAT_TEX_LAYER_BITS;
return ivec3(x, y, z);
}`, hC = `precision highp float;
precision highp int;
#include <splatDefines>
uniform float near;
uniform float far;
uniform bool encodeLinear;
uniform float maxStdDev;
uniform bool disableFalloff;
uniform float falloff;
uniform bool splatTexEnable;
uniform sampler3D splatTexture;
uniform mat2 splatTexMul;
uniform vec2 splatTexAdd;
uniform float splatTexNear;
uniform float splatTexFar;
uniform float splatTexMid;
out vec4 fragColor;
in vec4 vRgba;
in vec2 vSplatUv;
in vec3 vNdc;
void main() {
vec4 rgba = vRgba;
float z = dot(vSplatUv, vSplatUv);
if (!splatTexEnable) {
if (z > (maxStdDev * maxStdDev)) {
discard;
}
} else {
vec2 uv = splatTexMul * vSplatUv + splatTexAdd;
float ndcZ = vNdc.z;
float depth = (2.0 * near * far) / (far + near - ndcZ * (far - near));
float clampedFar = max(splatTexFar, splatTexNear);
float clampedDepth = clamp(depth, splatTexNear, clampedFar);
float logDepth = log2(clampedDepth + 1.0);
float logNear = log2(splatTexNear + 1.0);
float logFar = log2(clampedFar + 1.0);
float texZ;
if (splatTexMid > 0.0) {
float clampedMid = clamp(splatTexMid, splatTexNear, clampedFar);
float logMid = log2(clampedMid + 1.0);
texZ = (clampedDepth <= clampedMid) ?
(0.5 * ((logDepth - logNear) / (logMid - logNear))) :
(0.5 * ((logDepth - logMid) / (logFar - logMid)) + 0.5);
} else {
texZ = (logDepth - logNear) / (logFar - logNear);
}
vec4 modulate = texture(splatTexture, vec3(uv, 1.0 - texZ));
rgba *= modulate;
}
rgba.a *= mix(1.0, exp(-0.5 * z), falloff);
if (rgba.a < MIN_ALPHA) {
discard;
}
if (encodeLinear) {
rgba.rgb = srgbToLinear(rgba.rgb);
}
fragColor = rgba;
}`, lC = `precision highp float;
precision highp int;
precision highp usampler2DArray;
#include <splatDefines>
attribute uint splatIndex;
out vec4 vRgba;
out vec2 vSplatUv;
out vec3 vNdc;
uniform vec2 renderSize;
uniform uint numSplats;
uniform vec4 renderToViewQuat;
uniform vec3 renderToViewPos;
uniform float maxStdDev;
uniform float time;
uniform float deltaTime;
uniform bool debugFlag;
uniform bool enable2DGS;
uniform float blurAmount;
uniform float preBlurAmount;
uniform float focalDistance;
uniform float apertureAngle;
uniform float clipXY;
uniform float renderScale;
uniform usampler2DArray packedSplats;
void main() {
gl_Position = vec4(0.0, 0.0, 2.0, 1.0);
if (uint(gl_InstanceID) >= numSplats) {
return;
}
if (splatIndex == 0xffffffffu) {
return;
}
ivec3 texCoord = ivec3(
splatIndex & SPLAT_TEX_WIDTH_MASK,
(splatIndex >> SPLAT_TEX_WIDTH_BITS) & SPLAT_TEX_HEIGHT_MASK,
splatIndex >> SPLAT_TEX_LAYER_BITS
);
uvec4 packed = texelFetch(packedSplats, texCoord, 0);
vec3 center, scales;
vec4 quaternion, rgba;
unpackSplat(packed, center, scales, quaternion, rgba);
if (rgba.a < MIN_ALPHA) {
return;
}
bvec3 zeroScales = equal(scales, vec3(0.0));
if (all(zeroScales)) {
return;
}
vec3 viewCenter = quatVec(renderToViewQuat, center) + renderToViewPos;
if (viewCenter.z >= 0.0) {
return;
}
vec4 clipCenter = projectionMatrix * vec4(viewCenter, 1.0);
if (abs(clipCenter.z) >= clipCenter.w) {
return;
}
float clip = clipXY * clipCenter.w;
if (abs(clipCenter.x) > clip || abs(clipCenter.y) > clip) {
return;
}
vec4 viewQuaternion = quatQuat(renderToViewQuat, quaternion);
if (enable2DGS && any(zeroScales)) {
vRgba = rgba;
vSplatUv = position.xy * maxStdDev;
vec3 offset;
if (zeroScales.z) {
offset = vec3(vSplatUv.xy * scales.xy, 0.0);
} else if (zeroScales.y) {
offset = vec3(vSplatUv.x * scales.x, 0.0, vSplatUv.y * scales.z);
} else {
offset = vec3(0.0, vSplatUv.xy * scales.yz);
}
vec3 viewPos = viewCenter + quatVec(viewQuaternion, offset);
gl_Position = projectionMatrix * vec4(viewPos, 1.0);
vNdc = gl_Position.xyz / gl_Position.w;
return;
}
vec3 ndcCenter = clipCenter.xyz / clipCenter.w;
mat3 RS = scaleQuaternionToMatrix(scales, viewQuaternion);
mat3 cov3D = RS * transpose(RS);
vec2 scaledRenderSize = renderSize * renderScale;
vec2 focal = 0.5 * scaledRenderSize * vec2(projectionMatrix[0][0], projectionMatrix[1][1]);
float invZ = 1.0 / viewCenter.z;
vec2 J1 = focal * invZ;
vec2 J2 = -(J1 * viewCenter.xy) * invZ;
mat3 J = mat3(
J1.x, 0.0, J2.x,
0.0, J1.y, J2.y,
0.0, 0.0, 0.0
);
mat3 cov2D = transpose(J) * cov3D * J;
float a = cov2D[0][0];
float d = cov2D[1][1];
float b = cov2D[0][1];
a += preBlurAmount;
d += preBlurAmount;
float fullBlurAmount = blurAmount;
if ((focalDistance > 0.0) && (apertureAngle > 0.0)) {
float focusRadius = MAX_PIXEL_RADIUS;
if (viewCenter.z < 0.0) {
float focusBlur = abs((-viewCenter.z - focalDistance) / viewCenter.z);
float apertureRadius = focal.x * tan(0.5 * apertureAngle);
focusRadius = focusBlur * apertureRadius;
}
fullBlurAmount = clamp(sqr(focusRadius), blurAmount, sqr(MAX_PIXEL_RADIUS));
}
float detOrig = a * d - b * b;
a += fullBlurAmount;
d += fullBlurAmount;
float det = a * d - b * b;
float blurAdjust = sqrt(max(0.0, detOrig / det));
rgba.a *= blurAdjust;
if (rgba.a < MIN_ALPHA) {
return;
}
float eigenAvg = 0.5 * (a + d);
float eigenDelta = sqrt(max(0.0, eigenAvg * eigenAvg - det));
float eigen1 = eigenAvg + eigenDelta;
float eigen2 = eigenAvg - eigenDelta;
vec2 eigenVec1 = normalize(vec2((abs(b) < 0.001) ? 1.0 : b, eigen1 - a));
vec2 eigenVec2 = vec2(eigenVec1.y, -eigenVec1.x);
float scale1 = position.x * min(MAX_PIXEL_RADIUS, maxStdDev * sqrt(eigen1));
float scale2 = position.y * min(MAX_PIXEL_RADIUS, maxStdDev * sqrt(eigen2));
vec2 pixelOffset = eigenVec1 * scale1 + eigenVec2 * scale2;
vec2 ndcOffset = (2.0 / scaledRenderSize) * pixelOffset;
vec3 ndc = vec3(ndcCenter.xy + ndcOffset, ndcCenter.z);
vRgba = rgba;
vSplatUv = position.xy * maxStdDev;
vNdc = ndc;
gl_Position = vec4(ndc.xy * clipCenter.w, clipCenter.zw);
}`;
let Ne = null;
function uC() {
return Ne || (Q.ShaderChunk.splatDefines = cC, Ne = {
splatVertex: lC,
splatFragment: hC
}), Ne;
}
const Is = 5;
let Je = !1, He = !1, Ta;
function dC(t) {
let A = !1;
return t instanceof WA ? !0 : (t.traverse((e) => {
A = A || e instanceof WA;
}), A);
}
const Ja = Q.Scene.prototype.add;
Q.Scene.prototype.add = function(t) {
return Je = Je || dC(t), He = He || t instanceof Ce, Ja.call(this, t), this;
};
const wC = Q.Scene.prototype.onBeforeRender;
Q.Scene.prototype.onBeforeRender = function(t) {
if (Je) {
if (!He) {
const A = Ta || new Ce({ renderer: t });
this.add(A);
}
Q.Scene.prototype.onBeforeRender = wC, Q.Scene.prototype.add = Ja;
}
};
const aA = class aA extends Q.Mesh {
constructor(A) {
const e = aA.makeUniforms(), s = uC(), i = new Q.ShaderMaterial({
glslVersion: Q.GLSL3,
vertexShader: s.splatVertex,
fragmentShader: s.splatFragment,
uniforms: e,
transparent: !0,
blending: Q.NormalBlending,
depthTest: !0,
depthWrite: !1,
side: Q.DoubleSide
});
super(Bs, i), this.renderScale = 1, this.splatTexture = null, this.autoViewpoints = [], this.rotateToAccumulator = new Ot({ value: new Q.Quaternion() }), this.translateToAccumulator = new Mt({ value: new Q.Vector3() }), this.lastFrame = -1, this.lastUpdateTime = null, this.defaultCameras = [], this.pendingUpdate = null, this.envViewpoint = null, this.frustumCulled = !1, this.renderer = A.renderer, this.material = i, this.uniforms = e;
const n = kA(
{ gsplat: X },
{ gsplat: X },
({ gsplat: r }) => {
if (!r)
throw new Error("gsplat not defined");
return r = _e(r, {
rotate: this.rotateToAccumulator,
translate: this.translateToAccumulator
}), { gsplat: r };
}
);
this.modifier = new OQ(n), this.autoUpdate = A.autoUpdate ?? !0, this.preUpdate = A.preUpdate ?? !1, this.originDistance = A.originDistance ?? 1, this.maxStdDev = A.maxStdDev ?? Math.sqrt(8), this.enable2DGS = A.enable2DGS ?? !1, this.preBlurAmount = A.preBlurAmount ?? 0, this.blurAmount = A.blurAmount ?? 0.3, this.focalDistance = A.focalDistance ?? 0, this.apertureAngle = A.apertureAngle ?? 0, this.falloff = A.falloff ?? 1, this.clipXY = A.clipXY ?? 1.4, this.active = new Se(), this.accumulatorCount = 1, this.freeAccumulators = [];
for (let r = 0; r < 1; ++r)
this.freeAccumulators.push(new Se()), this.accumulatorCount += 1;
this.defaultView = new Qe({
...A.view,
autoUpdate: !0,
spark: this
}), this.viewpoint = this.defaultView, this.prepareViewpoint(this.viewpoint), this.clock = A.clock ? Ni(A.clock) : new Q.Clock(), Ta = this;
}
static makeUniforms() {
return {
// Size of render viewport in pixels
renderSize: { value: new Q.Vector2() },
// Near and far plane distances
near: { value: 0.1 },
far: { value: 1e3 },
// Total number of Gsplats in packedSplats to render
numSplats: { value: 0 },
// SplatAccumulator to view transformation quaternion
renderToViewQuat: { value: new Q.Quaternion() },
// SplatAccumulator to view transformation translation
renderToViewPos: { value: new Q.Vector3() },
// Maximum distance (in stddevs) from Gsplat center to render
maxStdDev: { value: 1 },
// Enable interpreting 0-thickness Gsplats as 2DGS
enable2DGS: { value: !1 },
// Add to projected 2D splat covariance diagonal (thickens and brightens)
preBlurAmount: { value: 0 },
// Add to 2D splat covariance diagonal and adjust opacity (anti-aliasing)
blurAmount: { value: 0.3 },
// Depth-of-field distance to focal plane
focalDistance: { value: 0 },
// Full-width angle of aperture opening (in radians)
apertureAngle: { value: 0 },
// Modulate Gaussian kernal falloff. 0 means "no falloff, flat shading",
// 1 is normal e^-x^2 falloff.
falloff: { value: 1 },
// Clip Gsplats that are clipXY times beyond the +-1 frustum bounds
clipXY: { value: 1.4 },
// Debug renderSize scale factor
renderScale: { value: 1 },
// Enable splat texture rendering
splatTexEnable: { value: !1 },
// Splat texture to render
splatTexture: { type: "t", value: aA.EMPTY_SPLAT_TEXTURE },
// Splat texture UV transform (multiply)
splatTexMul: { value: new Q.Matrix2() },
// Splat texture UV transform (add)
splatTexAdd: { value: new Q.Vector2() },
// Splat texture near plane distance
splatTexNear: { value: 0.1 },
// Splat texture far plane distance
splatTexFar: { value: 1e3 },
// Splat texture mid plane distance, or 0.0 to disable
splatTexMid: { value: 0 },
// Gsplat collection to render
packedSplats: { type: "t", value: qA.getEmpty() },
// Time in seconds for time-based effects
time: { value: 0 },
// Delta time in seconds since last frame
deltaTime: { value: 0 },
// Whether to encode Gsplat with linear RGB (for environment mapping)
encodeLinear: { value: !1 },
// Debug flag that alternates each frame
debugFlag: { value: !1 }
};
}
canAllocAccumulator() {
return this.freeAccumulators.length > 0 || this.accumulatorCount < Is;
}
maybeAllocAccumulator() {
let A = this.freeAccumulators.pop();
if (A === void 0) {
if (this.accumulatorCount >= Is)
return null;
A = new Se(), this.accumulatorCount += 1;
}
return A.refCount = 1, A;
}
releaseAccumulator(A) {
A.refCount -= 1, A.refCount === 0 && this.freeAccumulators.push(A);
}
newViewpoint(A) {
return new Qe({ ...A, spark: this });
}
onBeforeRender(A, e, s) {
var E, l;
const i = this.time ?? this.clock.getElapsedTime(), n = i - (this.viewpoint.lastTime ?? i);
this.viewpoint.lastTime = i;
const r = A.info.render.frame, a = r !== this.lastFrame;
this.lastFrame = r;
const g = this.viewpoint;
if (g === this.defaultView) {
if (a)
if (!A.xr.isPresenting)
this.defaultView.viewToWorld = s.matrixWorld.clone(), this.defaultCameras = [this.defaultView.viewToWorld];
else {
const c = A.xr.getCamera().cameras;
this.defaultCameras = c.map((h) => h.matrixWorld), this.defaultView.viewToWorld = pC(this.defaultCameras) ?? new Q.Matrix4();
}
this.autoUpdate && this.update({ scene: e, viewToWorld: this.defaultView.viewToWorld });
}
if (a && (this.uniforms.time.value = i, this.uniforms.deltaTime.value = n, this.uniforms.debugFlag.value = performance.now() / 1e3 % 2 < 1), g.target)
this.uniforms.renderSize.value.set(
g.target.width,
g.target.height
);
else {
const c = A.getDrawingBufferSize(
this.uniforms.renderSize.value
);
if (c.x === 1 && c.y === 1) {
const h = (E = A.xr.getSession()) == null ? void 0 : E.renderState.baseLayer;
h && (c.x = h.framebufferWidth, c.y = h.framebufferHeight);
}
}
const I = s;
if (this.uniforms.near.value = I.near, this.uniforms.far.value = I.far, this.uniforms.encodeLinear.value = g.encodeLinear, this.uniforms.maxStdDev.value = this.maxStdDev, this.uniforms.enable2DGS.value = this.enable2DGS, this.uniforms.preBlurAmount.value = this.preBlurAmount, this.uniforms.blurAmount.value = this.blurAmount, this.uniforms.focalDistance.value = this.focalDistance, this.uniforms.apertureAngle.value = this.apertureAngle, this.uniforms.falloff.value = this.falloff, this.uniforms.clipXY.value = this.clipXY, this.uniforms.renderScale.value = this.renderScale, this.splatTexture) {
const { enable: c, texture: h, multiply: u, add: d, near: w, far: y, mid: f } = this.splatTexture;
c && h ? (this.uniforms.splatTexEnable.value = !0, this.uniforms.splatTexture.value = h, u ? this.uniforms.splatTexMul.value.fromArray(u.elements) : this.uniforms.splatTexMul.value.set(
0.5 / this.maxStdDev,
0,
0,
0.5 / this.maxStdDev
), this.uniforms.splatTexAdd.value.set((d == null ? void 0 : d.x) ?? 0.5, (d == null ? void 0 : d.y) ?? 0.5), this.uniforms.splatTexNear.value = w ?? this.uniforms.near.value, this.uniforms.splatTexFar.value = y ?? this.uniforms.far.value, this.uniforms.splatTexMid.value = f ?? 0) : (this.uniforms.splatTexEnable.value = !1, this.uniforms.splatTexture.value = aA.EMPTY_SPLAT_TEXTURE);
} else
this.uniforms.splatTexEnable.value = !1, this.uniforms.splatTexture.value = aA.EMPTY_SPLAT_TEXTURE;
const B = ((l = g.display) == null ? void 0 : l.accumulator.toWorld) ?? new Q.Matrix4(), o = s.matrixWorld.clone().invert();
B.clone().premultiply(o).decompose(
this.uniforms.renderToViewPos.value,
this.uniforms.renderToViewQuat.value,
new Q.Vector3()
);
}
// Update the uniforms for the given viewpoint.
// Note that the client expects to be able to call render() at any point
// to update the canvas, so we must switch the viewpoint back to
// defaultView when we're finished.
prepareViewpoint(A) {
if (this.viewpoint = A ?? this.viewpoint, this.viewpoint.display) {
const { accumulator: e, geometry: s } = this.viewpoint.display;
this.uniforms.numSplats.value = e.splats.numSplats, this.uniforms.packedSplats.value = e.splats.getTexture(), this.geometry = s;
} else
this.uniforms.numSplats.value = 0, this.uniforms.packedSplats.value = qA.getEmpty(), this.geometry = Bs;
}
// If spark.autoUpdate is false then you must manually call
// spark.update({ scene }) to have the scene Gsplats be re-generated.
update({
scene: A,
viewToWorld: e
}) {
const s = this.matrixWorld.clone();
this.preUpdate ? this.updateInternal({ scene: A, originToWorld: s, viewToWorld: e }) : (this.pendingUpdate = {
scene: A,
originToWorld: s
}, setTimeout(() => {
if (this.pendingUpdate) {
const { scene: i, originToWorld: n } = this.pendingUpdate;
this.pendingUpdate = null, this.updateInternal({ scene: i, originToWorld: n, viewToWorld: e });
}
}, 1));
}
updateInternal({
scene: A,
originToWorld: e,
viewToWorld: s
}) {
var l;
if (!this.canAllocAccumulator())
return !1;
e || (e = this.active.toWorld), s = s ?? e.clone();
const i = this.time ?? this.clock.getElapsedTime(), n = i - (this.lastUpdateTime ?? i);
this.lastUpdateTime = i;
const r = this.active.mapping.reduce((c, h) => (c.set(h.node, h), c), /* @__PURE__ */ new Map()), { generators: a, visibleGenerators: g, globalEdits: I } = this.compileScene(A);
for (const c of a)
(l = c.frameUpdate) == null || l.call(c, {
object: c,
time: i,
deltaTime: n,
viewToWorld: s,
globalEdits: I
});
const B = new Set(g.map((c) => c.uuid));
for (const c of a) {
const h = r.get(c), d = c.generator && B.has(c.uuid) ? c.numSplats : 0;
(c.generator !== (h == null ? void 0 : h.generator) || d !== (h == null ? void 0 : h.count)) && c.updateVersion();
}
const C = !ae({
matrix1: e,
matrix2: this.active.toWorld,
maxDistance: this.originDistance
}) || a.length !== r.size || a.some((c) => {
var h;
return c.version !== ((h = r.get(c)) == null ? void 0 : h.version);
});
let E = null;
if (C) {
if (E = this.maybeAllocAccumulator(), !E)
throw new Error("Unreachable");
const c = !ae({
matrix1: e,
matrix2: this.active.toWorld,
maxDistance: 1e-5,
minCoorient: 0.99999
}), u = g.map((x, D) => {
const p = r.get(x);
return p ? (
// Sort by version deltas then by previous ordering in the mapping,
// attempting to keep unchanging generators near the front
// to improve our chances of avoiding a re-generation.
[x.version - p.version, p.base, x]
) : [Number.POSITIVE_INFINITY, x.version, x];
}).sort((x, D) => x[0] !== D[0] ? x[0] - D[0] : x[1] - D[1]).map(([x, D, p]) => p), d = u.map((x) => x.numSplats), { maxSplats: w, mapping: y } = E.splats.generateMapping(d), f = u.map((x, D) => {
const { base: p, count: G } = y[D];
return {
node: x,
generator: x.generator,
version: x.version,
base: p,
count: G
};
});
e.clone().invert().decompose(
this.translateToAccumulator.value,
this.rotateToAccumulator.value,
new Q.Vector3()
), E.ensureGenerate(w), E.generateSplats({
renderer: this.renderer,
modifier: this.modifier,
generators: f,
forceUpdate: c,
originToWorld: e
}), E.splatsVersion = this.active.splatsVersion + 1;
const M = E.hasCorrespondence(this.active);
E.mappingVersion = this.active.mappingVersion + (M ? 0 : 1), this.releaseAccumulator(this.active), this.active = E, this.prepareViewpoint();
}
return setTimeout(() => {
for (const c of this.autoViewpoints)
c.autoPoll({ accumulator: E ?? void 0 });
}, 1), !0;
}
compileScene(A) {
const e = [];
A.traverse((n) => {
n instanceof Kt && e.push(n);
});
const s = [];
A.traverseVisible((n) => {
n instanceof Kt && s.push(n);
});
const i = /* @__PURE__ */ new Set();
return A.traverseVisible((n) => {
if (n instanceof oe) {
let r = n.parent;
for (; r != null && !(r instanceof WA); )
r = r.parent;
r == null && i.add(n);
}
}), {
generators: e,
visibleGenerators: s,
globalEdits: Array.from(i)
};
}
// Renders out the scene to an environment map that can be used for
// Image-based lighting or similar applications. First optionally updates Gsplats,
// sorts them with respect to the provided worldCenter, renders 6 cube faces,
// then pre-filters them using THREE.PMREMGenerator and returns a THREE.Texture
// that can assigned directly to a THREE.MeshStandardMaterial.envMap property.
async renderEnvMap({
renderer: A,
scene: e,
worldCenter: s,
size: i = 256,
near: n = 0.1,
far: r = 1e3,
hideObjects: a = [],
update: g = !1
}) {
var E, l;
if (this.envViewpoint || (this.envViewpoint = this.newViewpoint({ sort360: !0 })), !aA.cubeRender || aA.cubeRender.target.width !== i || aA.cubeRender.near !== n || aA.cubeRender.far !== r) {
aA.cubeRender && aA.cubeRender.target.dispose();
const c = new Q.WebGLCubeRenderTarget(i, {
format: Q.RGBAFormat,
generateMipmaps: !0,
minFilter: Q.LinearMipMapLinearFilter
}), h = new Q.CubeCamera(n, r, c);
aA.cubeRender = { target: c, camera: h, near: n, far: r };
}
aA.pmrem || (aA.pmrem = new Q.PMREMGenerator(A ?? this.renderer));
const I = new Q.Matrix4().setPosition(s);
await ((E = this.envViewpoint) == null ? void 0 : E.prepare({ scene: e, viewToWorld: I, update: g }));
const { target: B, camera: o } = aA.cubeRender;
o.position.copy(s);
const C = /* @__PURE__ */ new Map();
for (const c of a)
C.set(c, c.visible), c.visible = !1;
this.prepareViewpoint(this.envViewpoint), o.update(A ?? this.renderer, e), this.prepareViewpoint(this.defaultView);
for (const [c, h] of C.entries())
c.visible = h;
return (l = aA.pmrem) == null ? void 0 : l.fromCubemap(B.texture).texture;
}
// Utility function to recursively set the envMap property for any
// THREE.MeshStandardMaterial within the subtree of root.
recurseSetEnvMap(A, e) {
A.traverse((s) => {
if (s instanceof Q.Mesh)
if (Array.isArray(s.material))
for (const i of s.material)
i instanceof Q.MeshStandardMaterial && (i.envMap = e);
else
s.material instanceof Q.MeshStandardMaterial && (s.material.envMap = e);
});
}
// Utility function that helps extract the Gsplat RGBA values from a
// SplatGenerator, including the result of any real-time RGBA SDF edits applied
// to a SplatMesh. This effectively "bakes" any computed RGBA values, which can
// now be used as a pipeline input via SplatMesh.splatRgba to inject these
// baked values into the Gsplat data.
getRgba({
generator: A,
rgba: e
}) {
const s = this.active.mapping.find(({ node: i }) => i === A);
if (!s)
throw new Error("Generator not found");
return e = e ?? new Ye(), e.fromPackedSplats({
packedSplats: this.active.splats,
base: s.base,
count: s.count,
renderer: this.renderer
}), e;
}
// Utility function that builds on getRgba({ generator }) and additionally
// reads back the RGBA values to the CPU in a Uint8Array with packed RGBA
// in that byte order.
async readRgba({
generator: A,
rgba: e
}) {
return e = this.getRgba({ generator: A, rgba: e }), e.read();
}
};
aA.cubeRender = null, aA.pmrem = null, aA.EMPTY_SPLAT_TEXTURE = new Q.Data3DTexture();
let Ce = aA;
const Bs = new Te(new Uint32Array(1), 0);
kA(
{ packedSplats: Zt, index: "int" },
{ gsplat: X },
({ packedSplats: t, index: A }) => {
if (!t || !A)
throw new Error("Invalid input");
return { gsplat: Jt(t, A) };
}
);
function pC(t) {
if (t.length === 0)
return null;
const A = new Q.Vector3(), e = new Q.Quaternion(), s = new Q.Vector3(), i = [], n = [];
for (const r of t)
r.decompose(A, e, s), i.push(A), n.push(e);
return new Q.Matrix4().compose(
ki(i),
Ri(n),
new Q.Vector3(1, 1, 1)
);
}
function yC(t, A, e) {
const s = Math.floor(t.length / 32);
if (s * 32 !== t.length)
throw new Error("Invalid .splat file size");
const i = new Float32Array(t.buffer);
for (let n = 0; n < s; ++n) {
const r = n * 32, a = n * 8, g = i[a + 0], I = i[a + 1], B = i[a + 2], o = i[a + 3], C = i[a + 4], E = i[a + 5], l = t[r + 24] / 255, c = t[r + 25] / 255, h = t[r + 26] / 255, u = t[r + 27] / 255, d = (t[r + 28] - 128) / 128, w = (t[r + 29] - 128) / 128, y = (t[r + 30] - 128) / 128, f = (t[r + 31] - 128) / 128;
e(
n,
g,
I,
B,
o,
C,
E,
w,
y,
f,
d,
u,
l,
c,
h
);
}
}
const Qs = {
0: {
bytesPerCenter: 12,
bytesPerScale: 12,
bytesPerRotation: 16,
bytesPerColor: 4,
bytesPerSphericalHarmonicsComponent: 4,
scaleOffsetBytes: 12,
rotationOffsetBytes: 24,
colorOffsetBytes: 40,
sphericalHarmonicsOffsetBytes: 44,
scaleRange: 1
},
1: {
bytesPerCenter: 6,
bytesPerScale: 6,
bytesPerRotation: 8,
bytesPerColor: 4,
bytesPerSphericalHarmonicsComponent: 2,
scaleOffsetBytes: 6,
rotationOffsetBytes: 12,
colorOffsetBytes: 20,
sphericalHarmonicsOffsetBytes: 24,
scaleRange: 32767
},
2: {
bytesPerCenter: 6,
bytesPerScale: 6,
bytesPerRotation: 8,
bytesPerColor: 4,
bytesPerSphericalHarmonicsComponent: 1,
scaleOffsetBytes: 6,
rotationOffsetBytes: 12,
colorOffsetBytes: 20,
sphericalHarmonicsOffsetBytes: 24,
scaleRange: 32767
}
}, fC = {
0: 0,
1: 9,
2: 24,
3: 45
};
function DC(t, A, e, s) {
var c;
let r = 0;
const a = new DataView(t.buffer, r, 4096);
r += 4096;
const g = a.getUint8(0), I = a.getUint8(1);
if (g !== 0 || I < 1)
throw new Error(
`Unsupported .ksplat version: ${g}.${I}`
);
const B = a.getUint32(4, !0);
a.getUint32(16, !0);
const o = a.getUint16(20, !0);
if (o < 0 || o > 2)
throw new Error(`Invalid .ksplat compression level: ${o}`);
const C = a.getFloat32(36, !0) || -1.5, E = a.getFloat32(40, !0) || 1.5;
let l = 4096 + B * 1024;
for (let h = 0; h < B; ++h) {
let u = function(SA, J) {
if (o === 0)
return Y.getFloat32(
SA + Z + J * 4,
!0
);
if (o === 1)
return fA(
Y.getUint16(
SA + Z + J * 2,
!0
)
);
const VA = Y.getUint8(SA + Z + J) / 255;
return C + VA * (E - C);
};
const d = new DataView(t.buffer, r, 1024);
r += 1024;
const w = d.getUint32(0, !0), y = d.getUint32(4, !0), f = d.getUint32(8, !0), M = d.getUint32(12, !0), x = d.getFloat32(16, !0), D = d.getUint16(20, !0), p = (d.getUint32(24, !0) || ((c = Qs[o]) == null ? void 0 : c.scaleRange)) ?? 1, G = d.getUint32(32, !0), S = G * f, m = d.getUint32(36, !0), v = m * 4, F = D * M + v, k = d.getUint16(40, !0), U = fC[k], {
bytesPerCenter: L,
bytesPerScale: AA,
bytesPerRotation: z,
bytesPerColor: sA,
bytesPerSphericalHarmonicsComponent: tA,
scaleOffsetBytes: O,
rotationOffsetBytes: T,
colorOffsetBytes: W,
sphericalHarmonicsOffsetBytes: Z
} = Qs[o], j = L + AA + z + sA + U * tA, b = j * y, dA = b + F, oA = [0, 3, 6, 1, 4, 7, 2, 5, 8], wA = [
9,
14,
19,
10,
15,
20,
11,
16,
21,
12,
17,
22,
13,
18,
23
], pA = [
24,
31,
38,
25,
32,
39,
26,
33,
40,
27,
34,
41,
28,
35,
42,
29,
36,
43,
30,
37,
44
], xA = k >= 1 ? new Float32Array(3 * 3) : void 0, cA = k >= 2 ? new Float32Array(5 * 3) : void 0, vA = k >= 3 ? new Float32Array(7 * 3) : void 0, MA = x / 2 / p, jA = l + v, PA = l + F, Y = new DataView(
t.buffer,
PA,
b
), uA = new Float32Array(
t.buffer,
jA,
M * 3
), _A = new Uint32Array(
t.buffer,
l,
m
);
let Rt = G, jt = S;
for (let SA = 0; SA < w; ++SA) {
const J = SA * j;
let VA;
if (SA < S)
VA = Math.floor(SA / f);
else {
const XA = _A[Rt - G];
SA >= jt + XA && (Rt += 1, jt += XA), VA = Rt;
}
const ue = o === 0 ? Y.getFloat32(J + 0, !0) : (Y.getUint16(J + 0, !0) - p) * MA + uA[3 * VA + 0], de = o === 0 ? Y.getFloat32(J + 4, !0) : (Y.getUint16(J + 2, !0) - p) * MA + uA[3 * VA + 1], we = o === 0 ? Y.getFloat32(J + 8, !0) : (Y.getUint16(J + 4, !0) - p) * MA + uA[3 * VA + 2], pe = o === 0 ? Y.getFloat32(J + O + 0, !0) : fA(Y.getUint16(J + O + 0, !0)), ye = o === 0 ? Y.getFloat32(J + O + 4, !0) : fA(Y.getUint16(J + O + 2, !0)), Wa = o === 0 ? Y.getFloat32(J + O + 8, !0) : fA(Y.getUint16(J + O + 4, !0)), ja = o === 0 ? Y.getFloat32(J + T + 0, !0) : fA(
Y.getUint16(J + T + 0, !0)
), Pa = o === 0 ? Y.getFloat32(J + T + 4, !0) : fA(
Y.getUint16(J + T + 2, !0)
), Xa = o === 0 ? Y.getFloat32(J + T + 8, !0) : fA(
Y.getUint16(J + T + 4, !0)
), $a = o === 0 ? Y.getFloat32(J + T + 12, !0) : fA(
Y.getUint16(J + T + 6, !0)
), Ag = Y.getUint8(J + W + 0) / 255, tg = Y.getUint8(J + W + 1) / 255, eg = Y.getUint8(J + W + 2) / 255, sg = Y.getUint8(J + W + 3) / 255;
if (e(
SA,
ue,
de,
we,
pe,
ye,
Wa,
Pa,
Xa,
$a,
ja,
sg,
Ag,
tg,
eg
), k >= 1 && xA) {
for (const [XA, Gt] of oA.entries())
xA[XA] = u(J, Gt);
if (cA)
for (const [XA, Gt] of wA.entries())
cA[XA] = u(J, Gt);
if (vA)
for (const [XA, Gt] of pA.entries())
vA[XA] = u(J, Gt);
s == null || s(SA, xA, cA, vA);
}
}
l += dA;
}
}
class mC {
constructor({ fileBytes: A }) {
this.fileBytes = A instanceof ArrayBuffer ? new Uint8Array(A) : A, this.reader = new Li({ fileBytes: this.fileBytes });
const e = new DataView(this.reader.read(16).buffer);
if (e.getUint32(0, !0) !== 1347635022)
throw new Error("Invalid SPZ file");
if (this.version = e.getUint32(4, !0), this.version < 1 || this.version > 2)
throw new Error(`Unsupported SPZ version: ${this.version}`);
this.numSplats = e.getUint32(8, !0), this.shDegree = e.getUint8(12), this.fractionalBits = e.getUint8(13), this.flags = e.getUint8(14), this.flagAntiAlias = (this.flags & 1) !== 0, this.reserved = e.getUint8(15), this.parsed = !1;
}
parseSplats(A, e, s, i, n, r) {
if (this.parsed)
throw new Error("SPZ file already parsed");
if (this.parsed = !0, this.version === 1) {
const a = this.reader.read(this.numSplats * 3 * 2), g = new Uint16Array(a.buffer);
for (let I = 0; I < this.numSplats; I++) {
const B = I * 3, o = fA(g[B]), C = fA(g[B + 1]), E = fA(g[B + 2]);
A == null || A(I, o, C, E);
}
} else if (this.version === 2) {
const a = 1 << this.fractionalBits, g = this.reader.read(this.numSplats * 3 * 3);
for (let I = 0; I < this.numSplats; I++) {
const B = I * 9, o = ((g[B + 2] << 24 | g[B + 1] << 16 | g[B] << 8) >> 8) / a, C = ((g[B + 5] << 24 | g[B + 4] << 16 | g[B + 3] << 8) >> 8) / a, E = ((g[B + 8] << 24 | g[B + 7] << 16 | g[B + 6] << 8) >> 8) / a;
A == null || A(I, o, C, E);
}
} else
throw new Error("Unreachable");
{
const a = this.reader.read(this.numSplats);
for (let g = 0; g < this.numSplats; g++)
e == null || e(g, a[g] / 255);
}
{
const a = this.reader.read(this.numSplats * 3), g = Ka / 0.15;
for (let I = 0; I < this.numSplats; I++) {
const B = I * 3, o = (a[B] / 255 - 0.5) * g + 0.5, C = (a[B + 1] / 255 - 0.5) * g + 0.5, E = (a[B + 2] / 255 - 0.5) * g + 0.5;
s == null || s(I, o, C, E);
}
}
{
const a = this.reader.read(this.numSplats * 3);
for (let g = 0; g < this.numSplats; g++) {
const I = g * 3, B = Math.exp(a[I] / 16 - 10), o = Math.exp(a[I + 1] / 16 - 10), C = Math.exp(a[I + 2] / 16 - 10);
i == null || i(g, B, o, C);
}
}
{
const a = this.reader.read(this.numSplats * 3);
for (let g = 0; g < this.numSplats; g++) {
const I = g * 3, B = a[I] / 127.5 - 1, o = a[I + 1] / 127.5 - 1, C = a[I + 2] / 127.5 - 1, E = Math.sqrt(
Math.max(0, 1 - B * B - o * o - C * C)
);
n == null || n(g, B, o, C, E);
}
}
if (r && this.shDegree >= 1) {
const a = new Float32Array(9), g = this.shDegree >= 2 ? new Float32Array(5 * 3) : void 0, I = this.shDegree >= 3 ? new Float32Array(7 * 3) : void 0, B = this.reader.read(
this.numSplats * Ha[this.shDegree] * 3
);
let o = 0;
for (let C = 0; C < this.numSplats; C++) {
for (let E = 0; E < 9; ++E)
a[E] = (B[o + E] - 128) / 128;
if (o += 9, g) {
for (let E = 0; E < 15; ++E)
g[E] = (B[o + E] - 128) / 128;
o += 15;
}
if (I) {
for (let E = 0; E < 21; ++E)
I[E] = (B[o + E] - 128) / 128;
o += 21;
}
r == null || r(C, a, g, I);
}
}
}
}
const Ha = { 1: 3, 2: 8, 3: 15 }, Ka = 0.28209479177387814, xC = 1347635022, MC = 2, SC = 1;
class tt {
constructor({
numSplats: A,
shDegree: e,
fractionalBits: s = 12,
flagAntiAlias: i = !0
}) {
this.clippedCount = 0;
const n = 19 + (e >= 1 ? 9 : 0) + (e >= 2 ? 15 : 0) + (e >= 3 ? 21 : 0), r = 16 + A * n;
this.buffer = new ArrayBuffer(r), this.view = new DataView(this.buffer), this.view.setUint32(0, xC, !0), this.view.setUint32(4, MC, !0), this.view.setUint32(8, A, !0), this.view.setUint8(12, e), this.view.setUint8(13, s), this.view.setUint8(14, i ? SC : 0), this.view.setUint8(15, 0), this.numSplats = A, this.shDegree = e, this.fractionalBits = s, this.fraction = 1 << s, this.flagAntiAlias = i;
}
setCenter(A, e, s, i) {
const n = Math.round(e * this.fraction), r = Math.max(-8388607, Math.min(8388607, n)), a = Math.round(s * this.fraction), g = Math.max(-8388607, Math.min(8388607, a)), I = Math.round(i * this.fraction), B = Math.max(-8388607, Math.min(8388607, I));
(n !== r || a !== g || I !== B) && (this.clippedCount += 1);
const E = 16 + A * 9;
this.view.setUint8(E, r & 255), this.view.setUint8(E + 1, r >> 8 & 255), this.view.setUint8(E + 2, r >> 16 & 255), this.view.setUint8(E + 3, g & 255), this.view.setUint8(E + 4, g >> 8 & 255), this.view.setUint8(E + 5, g >> 16 & 255), this.view.setUint8(E + 6, B & 255), this.view.setUint8(E + 7, B >> 8 & 255), this.view.setUint8(E + 8, B >> 16 & 255);
}
setAlpha(A, e) {
const s = 16 + this.numSplats * 9 + A;
this.view.setUint8(
s,
Math.max(0, Math.min(255, Math.round(e * 255)))
);
}
static scaleRgb(A) {
const e = ((A - 0.5) / (Ka / 0.15) + 0.5) * 255;
return Math.max(0, Math.min(255, Math.round(e)));
}
setRgb(A, e, s, i) {
const n = 16 + this.numSplats * 10 + A * 3;
this.view.setUint8(n, tt.scaleRgb(e)), this.view.setUint8(n + 1, tt.scaleRgb(s)), this.view.setUint8(n + 2, tt.scaleRgb(i));
}
setScale(A, e, s, i) {
const n = 16 + this.numSplats * 13 + A * 3;
this.view.setUint8(
n,
Math.max(0, Math.min(255, Math.round((Math.log(e) + 10) * 16)))
), this.view.setUint8(
n + 1,
Math.max(0, Math.min(255, Math.round((Math.log(s) + 10) * 16)))
), this.view.setUint8(
n + 2,
Math.max(0, Math.min(255, Math.round((Math.log(i) + 10) * 16)))
);
}
setQuat(A, e, s, i, n) {
const r = 16 + this.numSplats * 16 + A * 3, a = n < 0;
this.view.setUint8(
r,
Math.max(
0,
Math.min(255, Math.round(((a ? -e : e) + 1) * 127.5))
)
), this.view.setUint8(
r + 1,
Math.max(
0,
Math.min(255, Math.round(((a ? -s : s) + 1) * 127.5))
)
), this.view.setUint8(
r + 2,
Math.max(
0,
Math.min(255, Math.round(((a ? -i : i) + 1) * 127.5))
)
);
}
static quantizeSh(A, e) {
const s = Math.round(A * 128) + 128, i = 1 << 8 - e, n = Math.floor((s + i / 2) / i) * i;
return Math.max(0, Math.min(255, n));
}
setSh(A, e, s, i) {
const n = Ha[this.shDegree] || 0, r = 16 + this.numSplats * 19 + A * n * 3;
for (let a = 0; a < 9; ++a)
this.view.setUint8(r + a, tt.quantizeSh(e[a], 5));
if (s) {
const a = r + 9;
for (let g = 0; g < 15; ++g)
this.view.setUint8(a + g, tt.quantizeSh(s[g], 4));
if (i) {
const g = a + 15;
for (let I = 0; I < 21; ++I)
this.view.setUint8(g + I, tt.quantizeSh(i[I], 4));
}
}
}
async finalize() {
const A = new Uint8Array(this.buffer), s = new ReadableStream({
async start(r) {
r.enqueue(A), r.close();
}
}).pipeThrough(new CompressionStream("gzip")), n = await new Response(s).arrayBuffer();
return console.log(
"Compressed",
A.length,
"bytes to",
n.byteLength,
"bytes"
), new Uint8Array(n);
}
}
async function BE(t) {
var B, o, C;
const A = new IC(), {
inputs: e,
clipXyz: s,
maxSh: i,
fractionalBits: n = 12,
opacityThreshold: r
} = t;
for (const E of e) {
let l = function(D) {
return D.multiplyScalar(w), D.applyQuaternion(y), D.add(f), D;
}, c = function(D) {
return D.multiplyScalar(w), D;
}, h = function(D) {
return D.premultiply(y), D;
}, u = function(D) {
return !M || M.containsPoint(D);
}, d = function(D) {
return r !== void 0 ? D >= r : !0;
};
const w = ((B = E.transform) == null ? void 0 : B.scale) ?? 1, y = new Q.Quaternion().fromArray(
((o = E.transform) == null ? void 0 : o.quaternion) ?? [0, 0, 0, 1]
), f = new Q.Vector3().fromArray(
((C = E.transform) == null ? void 0 : C.translate) ?? [0, 0, 0]
), M = s ? new Q.Box3(
new Q.Vector3().fromArray(s.min),
new Q.Vector3().fromArray(s.max)
) : void 0;
let x = E.fileType;
switch (x || (x = ba(E.fileBytes), !x && E.pathOrUrl && (x = La(E.pathOrUrl))), x) {
case bt.PLY: {
const D = new Ie({ fileBytes: E.fileBytes });
await D.parseHeader();
let p = null;
D.parseSplats(
(G, S, m, v, F, k, U, L, AA, z, sA, tA, O, T, W) => {
const Z = l(new Q.Vector3(S, m, v));
if (u(Z) && d(tA)) {
p = A.pushSplat(), A.setCenter(p, Z.x, Z.y, Z.z);
const j = c(
new Q.Vector3(F, k, U)
);
A.setScale(p, j.x, j.y, j.z);
const b = h(
new Q.Quaternion(L, AA, z, sA)
);
A.setQuaternion(
p,
b.x,
b.y,
b.z,
b.w
), A.setOpacity(p, tA), A.setColor(p, O, T, W);
} else
p = null;
},
(G, S, m, v) => {
S && p !== null && A.setSh1(p, S), m && p !== null && A.setSh2(p, m), v && p !== null && A.setSh3(p, v);
}
);
break;
}
case bt.SPZ: {
const D = new mC({ fileBytes: E.fileBytes }), p = new Int32Array(D.numSplats);
p.fill(-1);
const G = new Float32Array(D.numSplats * 3), S = new Q.Vector3();
D.parseSplats(
(m, v, F, k) => {
const U = l(new Q.Vector3(v, F, k));
G[m * 3] = U.x, G[m * 3 + 1] = U.y, G[m * 3 + 2] = U.z;
},
(m, v) => {
S.fromArray(G, m * 3), u(S) && d(v) && (p[m] = A.pushSplat(), A.setCenter(p[m], S.x, S.y, S.z), A.setOpacity(p[m], v));
},
(m, v, F, k) => {
p[m] >= 0 && A.setColor(p[m], v, F, k);
},
(m, v, F, k) => {
if (p[m] >= 0) {
const U = c(
new Q.Vector3(v, F, k)
);
A.setScale(p[m], U.x, U.y, U.z);
}
},
(m, v, F, k, U) => {
if (p[m] >= 0) {
const L = h(
new Q.Quaternion(v, F, k, U)
);
A.setQuaternion(
p[m],
L.x,
L.y,
L.z,
L.w
);
}
},
(m, v, F, k) => {
p[m] >= 0 && (A.setSh1(p[m], v), F && A.setSh2(p[m], F), k && A.setSh3(p[m], k));
}
);
break;
}
case bt.SPLAT:
yC(
E.fileBytes,
(D) => {
},
(D, p, G, S, m, v, F, k, U, L, AA, z, sA, tA, O) => {
const T = l(new Q.Vector3(p, G, S));
if (u(T) && d(z)) {
const W = A.pushSplat();
A.setCenter(W, T.x, T.y, T.z);
const Z = c(
new Q.Vector3(m, v, F)
);
A.setScale(W, Z.x, Z.y, Z.z);
const j = h(
new Q.Quaternion(k, U, L, AA)
);
A.setQuaternion(
W,
j.x,
j.y,
j.z,
j.w
), A.setOpacity(W, z), A.setColor(W, sA, tA, O);
}
}
);
break;
case bt.KSPLAT: {
let D = null;
DC(
E.fileBytes,
(p) => {
},
(p, G, S, m, v, F, k, U, L, AA, z, sA, tA, O, T) => {
const W = l(new Q.Vector3(G, S, m));
if (u(W) && d(sA)) {
D = A.pushSplat(), A.setCenter(D, W.x, W.y, W.z);
const Z = c(
new Q.Vector3(v, F, k)
);
A.setScale(D, Z.x, Z.y, Z.z);
const j = h(
new Q.Quaternion(U, L, AA, z)
);
A.setQuaternion(
D,
j.x,
j.y,
j.z,
j.w
), A.setOpacity(D, sA), A.setColor(D, tA, O, T);
} else
D = null;
},
(p, G, S, m) => {
D !== null && (A.setSh1(D, G), S && A.setSh2(D, S), m && A.setSh3(D, m));
}
);
break;
}
default:
throw new Error(`transcodeSpz not implemented for ${x}`);
}
}
const a = Math.min(
i ?? 3,
A.sh3 ? 3 : A.sh2 ? 2 : A.sh1 ? 1 : 0
), g = new tt({
numSplats: A.numSplats,
shDegree: a,
fractionalBits: n,
flagAntiAlias: !0
});
for (let E = 0; E < A.numSplats; ++E) {
const l = E * 3, c = E * 4;
g.setCenter(
E,
A.centers[l],
A.centers[l + 1],
A.centers[l + 2]
), g.setScale(
E,
A.scales[l],
A.scales[l + 1],
A.scales[l + 2]
), g.setQuat(
E,
A.quaternions[c],
A.quaternions[c + 1],
A.quaternions[c + 2],
A.quaternions[c + 3]
), g.setAlpha(E, A.opacities[E]), g.setRgb(
E,
A.colors[l],
A.colors[l + 1],
A.colors[l + 2]
), A.sh1 && a >= 1 && g.setSh(
E,
A.sh1.slice(E * 9, (E + 1) * 9),
a >= 2 && A.sh2 ? A.sh2.slice(E * 15, (E + 1) * 15) : void 0,
a >= 3 && A.sh3 ? A.sh3.slice(E * 21, (E + 1) * 21) : void 0
);
}
return { fileBytes: await g.finalize(), clippedCount: g.clippedCount };
}
class QE {
constructor(A) {
this.mesh = A.mesh, this.numSplats = A.numSplats ?? this.mesh.numSplats;
const { width: e, height: s, depth: i, maxSplats: n } = mA(this.numSplats);
this.skinData = new Uint16Array(n * 4), this.skinTexture = new Q.DataArrayTexture(
this.skinData,
e,
s,
i
), this.skinTexture.format = Q.RGBAIntegerFormat, this.skinTexture.type = Q.UnsignedShortType, this.skinTexture.internalFormat = "RGBA16UI", this.skinTexture.needsUpdate = !0, this.numBones = A.numBones ?? 256, this.boneData = new Float32Array(this.numBones * 16), this.boneTexture = new Q.DataTexture(
this.boneData,
4,
this.numBones,
Q.RGBAFormat,
Q.FloatType
), this.boneTexture.internalFormat = "RGBA32F", this.boneTexture.needsUpdate = !0, this.uniform = new R({
key: "skinning",
type: qa,
globals: () => [za],
value: {
numSplats: this.numSplats,
numBones: this.numBones,
skinTexture: this.skinTexture,
boneTexture: this.boneTexture
}
});
}
// Apply the skeletal animation to a Gsplat in a dyno program.
modify(A) {
return FC(A, this.uniform);
}
// Set the "rest" pose for a bone with position and quaternion orientation.
setRestQuatPos(A, e, s) {
const i = A * 16;
this.boneData[i + 0] = e.x, this.boneData[i + 1] = e.y, this.boneData[i + 2] = e.z, this.boneData[i + 3] = e.w, this.boneData[i + 4] = s.x, this.boneData[i + 5] = s.y, this.boneData[i + 6] = s.z, this.boneData[i + 7] = 0, this.boneData[i + 8] = 0, this.boneData[i + 9] = 0, this.boneData[i + 10] = 0, this.boneData[i + 11] = 1, this.boneData[i + 12] = 0, this.boneData[i + 13] = 0, this.boneData[i + 14] = 0, this.boneData[i + 15] = 0;
}
// Set the "current" position and orientation of a bone.
setBoneQuatPos(A, e, s) {
const i = A * 16, n = new Q.Quaternion(
this.boneData[i + 0],
this.boneData[i + 1],
this.boneData[i + 2],
this.boneData[i + 3]
), r = new Q.Vector3(
this.boneData[i + 4],
this.boneData[i + 5],
this.boneData[i + 6]
), a = n.clone().invert(), g = s.clone().sub(r);
g.applyQuaternion(a), a.multiply(e);
const I = new Q.Quaternion(
g.x,
g.y,
g.z,
0
).multiply(n);
this.boneData[i + 8] = a.x, this.boneData[i + 9] = a.y, this.boneData[i + 10] = a.z, this.boneData[i + 11] = a.w, this.boneData[i + 12] = 0.5 * I.x, this.boneData[i + 13] = 0.5 * I.y, this.boneData[i + 14] = 0.5 * I.z, this.boneData[i + 15] = 0.5 * I.w;
}
// Set up to 4 bone indices and weights for a Gsplat. For fewer than 4 bones,
// you can set the remaining weights to 0 (and index=0).
setSplatBones(A, e, s) {
const i = A * 4;
this.skinData[i + 0] = Math.min(255, Math.max(0, Math.round(s.x * 255))) + (e.x << 8), this.skinData[i + 1] = Math.min(255, Math.max(0, Math.round(s.y * 255))) + (e.y << 8), this.skinData[i + 2] = Math.min(255, Math.max(0, Math.round(s.z * 255))) + (e.z << 8), this.skinData[i + 3] = Math.min(255, Math.max(0, Math.round(s.w * 255))) + (e.w << 8);
}
// Call this to indicate that the bones have changed and the Gsplats need to be
// re-generated with updated skinning.
updateBones() {
this.boneTexture.needsUpdate = !0, this.mesh.needsUpdate = !0;
}
}
const qa = { type: "GsplatSkinning" }, za = EA(`
struct GsplatSkinning {
int numSplats;
int numBones;
usampler2DArray skinTexture;
sampler2D boneTexture;
};
`), NC = EA(`
void applyGsplatSkinning(
int numSplats, int numBones,
usampler2DArray skinTexture, sampler2D boneTexture,
int splatIndex, inout vec3 center, inout vec4 quaternion
) {
if ((splatIndex < 0) || (splatIndex >= numSplats)) {
return;
}
uvec4 skinData = texelFetch(skinTexture, splatTexCoord(splatIndex), 0);
float weights[4];
weights[0] = float(skinData.x & 0xffu) / 255.0;
weights[1] = float(skinData.y & 0xffu) / 255.0;
weights[2] = float(skinData.z & 0xffu) / 255.0;
weights[3] = float(skinData.w & 0xffu) / 255.0;
uint boneIndices[4];
boneIndices[0] = (skinData.x >> 8u) & 0xffu;
boneIndices[1] = (skinData.y >> 8u) & 0xffu;
boneIndices[2] = (skinData.z >> 8u) & 0xffu;
boneIndices[3] = (skinData.w >> 8u) & 0xffu;
vec4 quat = vec4(0.0);
vec4 dual = vec4(0.0);
for (int i = 0; i < 4; i++) {
if (weights[i] > 0.0) {
int boneIndex = int(boneIndices[i]);
vec4 boneQuat = vec4(0.0, 0.0, 0.0, 1.0);
vec4 boneDual = vec4(0.0);
if (boneIndex < numBones) {
boneQuat = texelFetch(boneTexture, ivec2(2, boneIndex), 0);
boneDual = texelFetch(boneTexture, ivec2(3, boneIndex), 0);
}
if ((i > 0) && (dot(quat, boneQuat) < 0.0)) {
// Flip sign if next blend is pointing in the opposite direction
boneQuat = -boneQuat;
boneDual = -boneDual;
}
quat += weights[i] * boneQuat;
dual += weights[i] * boneDual;
}
}
// Normalize dual quaternion
float norm = length(quat);
quat /= norm;
dual /= norm;
vec3 translate = vec3(
2.0 * (-dual.w * quat.x + dual.x * quat.w - dual.y * quat.z + dual.z * quat.y),
2.0 * (-dual.w * quat.y + dual.x * quat.z + dual.y * quat.w - dual.z * quat.x),
2.0 * (-dual.w * quat.z - dual.x * quat.y + dual.y * quat.x + dual.z * quat.w)
);
center = quatVec(quat, center) + translate;
quaternion = quatQuat(quat, quaternion);
}
`);
function FC(t, A) {
return new V({
inTypes: { gsplat: X, skinning: qa },
outTypes: { gsplat: X },
globals: () => [za, NC],
inputs: { gsplat: t, skinning: A },
statements: ({ inputs: s, outputs: i }) => {
const { skinning: n } = s, { gsplat: r } = i;
return UA(`
${r} = ${s.gsplat};
if (isGsplatActive(${r}.flags)) {
applyGsplatSkinning(
${n}.numSplats, ${n}.numBones,
${n}.skinTexture, ${n}.boneTexture,
${r}.index, ${r}.center, ${r}.quaternion
);
}
`);
}
}).outputs.gsplat;
}
function CE({
// PackedSplats object to add splats to
splats: t,
// min and max box extents of the grid
extents: A,
// step size along each grid axis
stepSize: e = 1,
// spherical radius of each Gsplat
pointRadius: s = 0.01,
// relative size of the "shadow copy" of each Gsplat placed behind it
pointShadowScale: i = 2,
// Gsplat opacity
opacity: n = 1,
// Gsplat color (THREE.Color) or function to set color for position:
// ((THREE.Color, THREE.Vector3) => void) (default: RGB-modulated grid)
color: r
}) {
const g = new Q.Vector3(), I = new Q.Vector3(), B = new Q.Quaternion(0, 0, 0, 1);
r == null && (r = (C, E) => C.set(
0.55 + 0.45 * Math.cos(E.x * 1),
0.55 + 0.45 * Math.cos(E.y * 1),
0.55 + 0.45 * Math.cos(E.z * 1)
));
const o = new Q.Color();
for (let C = A.min.z; C < A.max.z + 1e-6; C += e)
for (let E = A.min.y; E < A.max.y + 1e-6; E += e)
for (let l = A.min.x; l < A.max.x + 1e-6; l += e) {
g.set(l, E, C);
for (let c = 0; c < 2; ++c)
I.setScalar(s * (c ? 1 : i)), c ? typeof r == "function" ? r(o, g) : o.copy(r) : o.setScalar(0), t.pushSplat(g, I, B, n, o);
}
}
function EE({
// PackedSplats object to add splats to
splats: t,
// scale (Gsplat scale along axis)
scale: A = 0.25,
// radius of the axes (Gsplat scale orthogonal to axis)
axisRadius: e = 75e-4,
// relative size of the "shadow copy" of each Gsplat placed behind it
axisShadowScale: s = 2,
// origins of the axes (default single axis at origin)
origins: i = [new Q.Vector3()]
}) {
const n = new Q.Vector3(), r = new Q.Vector3(), a = new Q.Quaternion(0, 0, 0, 1), g = new Q.Color(), I = 1;
for (const B of i)
for (let o = 0; o < 3; ++o) {
n.set(
B.x + (o === 0 ? A : 0),
B.y + (o === 1 ? A : 0),
B.z + (o === 2 ? A : 0)
);
for (let C = 0; C < 2; ++C)
r.set(
(o === 0 ? A : e) * (C ? 1 : s),
(o === 1 ? A : e) * (C ? 1 : s),
(o === 2 ? A : e) * (C ? 1 : s)
), g.setRGB(
C === 0 ? 0 : o === 0 ? 1 : 0,
C === 0 ? 0 : o === 1 ? 1 : 0,
C === 0 ? 0 : o === 2 ? 1 : 0
), t.pushSplat(n, r, a, I, g);
}
}
function cE({
// PackedSplats object to add splats to
splats: t,
// center of the sphere (default: origin)
origin: A = new Q.Vector3(),
// radius of the sphere
radius: e = 1,
// maximum depth of recursion for subdividing the sphere
// Warning: Gsplat count grows exponentially with depth
maxDepth: s = 3,
// filter function to apply to each point, for example to select
// points in a certain direction or other function ((THREE.Vector3) => boolean)
// (default: null)
filter: i = null,
// radius of each oriented Gsplat
pointRadius: n = 0.02,
// flatness of each oriented Gsplat
pointThickness: r = 1e-3,
// color of each Gsplat (THREE.Color) or function to set color for point:
// ((THREE.Color, THREE.Vector3) => void) (default: white)
color: a = new Q.Color(1, 1, 1)
}) {
const g = {};
function I(c) {
if (i && !i(c))
return;
const h = `${c.x},${c.y},${c.z}`;
g[h] || (g[h] = c);
}
function B(c, h, u, d) {
if (I(h), I(u), I(d), c >= s)
return;
const w = new Q.Vector3().addVectors(h, u).normalize(), y = new Q.Vector3().addVectors(u, d).normalize(), f = new Q.Vector3().addVectors(d, h).normalize();
B(c + 1, h, w, f), B(c + 1, w, u, y), B(c + 1, f, y, d), B(c + 1, w, y, f);
}
for (const c of [-1, 1])
for (const h of [-1, 1])
for (const u of [-1, 1]) {
const d = new Q.Vector3(c, 0, 0), w = new Q.Vector3(0, h, 0), y = new Q.Vector3(0, 0, u);
B(0, d, w, y);
}
const o = Object.values(g), C = new Q.Vector3(n, n, r), E = new Q.Quaternion(), l = typeof a == "function" ? new Q.Color() : a;
for (const c of o)
E.setFromUnitVectors(new Q.Vector3(0, 0, -1), c), typeof a == "function" && a(l, c), c.multiplyScalar(e), c.add(A), t.pushSplat(c, C, E, 1, l);
}
function hE({
// text string to display
text: t,
// browser font to render text with (default: "Arial")
font: A,
// font size in pixels/Gsplats (default: 32)
fontSize: e,
// SplatMesh.recolor tint assuming white Gsplats (default: white)
color: s,
// Individual Gsplat color (default: white)
rgb: i,
// Gsplat radius (default: 0.8 covers 1-unit spacing well)
dotRadius: n,
// text alignment: "left", "center", "right", "start", "end" (default: "start")
textAlign: r,
// line spacing multiplier, lines delimited by "\n" (default: 1.0)
lineHeight: a,
// Coordinate scale in object-space (default: 1.0)
objectScale: g
}) {
A = A ?? "Arial", e = e ?? 32, s = s ?? new Q.Color(1, 1, 1), n = n ?? 0.8, r = r ?? "start", a = a ?? 1, g = g ?? 1;
const I = t.split(`
`), B = document.createElement("canvas"), o = B.getContext("2d");
if (!o)
throw new Error("Failed to create canvas context");
o.font = `${e}px ${A}`, o.textAlign = r;
const C = o.measureText(""), E = C.fontBoundingBoxAscent + C.fontBoundingBoxDescent;
let l = Number.POSITIVE_INFINITY, c = Number.NEGATIVE_INFINITY, h = Number.POSITIVE_INFINITY, u = Number.NEGATIVE_INFINITY;
for (let F = 0; F < I.length; ++F) {
const k = o.measureText(I[F]), U = E * a * F;
l = Math.min(l, -k.actualBoundingBoxLeft), c = Math.max(c, k.actualBoundingBoxRight), h = Math.min(h, U - k.actualBoundingBoxAscent), u = Math.max(u, U + k.actualBoundingBoxDescent);
}
const d = Math.floor(l), w = Math.floor(h), y = Math.ceil(c) - d, f = Math.ceil(u) - w;
B.width = y, B.height = f, o.font = `${e}px ${A}`, o.textAlign = r, o.textBaseline = "alphabetic", o.fillStyle = "#FFFFFF";
for (let F = 0; F < I.length; ++F) {
const k = E * a * F - w;
o.fillText(I[F], -d, k);
}
const M = o.getImageData(0, 0, y, f), x = new Uint8Array(M.data.buffer), D = new qA(), p = new Q.Vector3(), G = new Q.Vector3().setScalar(n * g), S = new Q.Quaternion(0, 0, 0, 1);
i = i ?? new Q.Color(1, 1, 1);
let m = 0;
for (let F = 0; F < f; ++F)
for (let k = 0; k < y; ++k) {
const U = x[m + 3];
if (U > 0) {
const L = U / 255;
p.set(k - 0.5 * (y - 1), 0.5 * (f - 1) - F, 0), p.multiplyScalar(g), D.pushSplat(p, G, S, L, i);
}
m += 4;
}
const v = new WA({ packedSplats: D });
return v.recolor = s, v;
}
function lE({
// URL of the image to convert to splats (example: `url: "./image.png"`)
url: t,
// Radius of each Gsplat, default covers 1-unit spacing well (default: 0.8)
dotRadius: A,
// Subsampling factor for the image. Higher values reduce resolution,
// for example 2 will halve the width and height by averaging (default: 1)
subXY: e,
// Optional callback function to modify each Gsplat before it's added.
// Return null to skip adding the Gsplat, or a number to set the opacity
// and add the Gsplat with parameter values in the objects center, rgba etc. were
// passed into the forEachSplat callback. Ending the callback in `return opacity;`
// will retain the original opacity.
// ((width: number, height: number, index: number, center: THREE.Vector3, scales: THREE.Vector3, quaternion: THREE.Quaternion, opacity: number, color: THREE.Color) => number | null)
forEachSplat: s
}) {
return A = A ?? 0.8, e = Math.max(1, Math.floor(e ?? 1)), new WA({
constructSplats: async (i) => new Promise((n, r) => {
const a = new Image();
a.crossOrigin = "anonymous", a.onerror = r, a.onload = () => {
const { width: g, height: I } = a, B = document.createElement("canvas");
B.width = g, B.height = I;
const o = B.getContext("2d");
if (!o) {
r(new Error("Failed to create canvas context"));
return;
}
o.imageSmoothingEnabled = !0, o.imageSmoothingQuality = "high";
const C = Math.round(g / e), E = Math.round(I / e);
o.drawImage(a, 0, 0, C, E);
try {
const l = o.getImageData(0, 0, C, E), c = new Uint8Array(l.data.buffer), h = new Q.Vector3(), u = new Q.Vector3().setScalar(A), d = new Q.Quaternion(0, 0, 0, 1), w = new Q.Color();
let y = 0;
for (let f = 0; f < E; ++f)
for (let M = 0; M < C; ++M) {
const x = y * 4, D = c[x + 3];
if (D > 0) {
let p = D / 255;
w.set(
c[x + 0] / 255,
c[x + 1] / 255,
c[x + 2] / 255
), h.set(
M - 0.5 * (C - 1),
0.5 * (E - 1) - f,
0
), u.setScalar(A), d.set(0, 0, 0, 1);
let G = !0;
if (s) {
const S = s(
C,
E,
y,
h,
u,
d,
p,
w
);
p = S ?? p, G = S !== null;
}
G && i.pushSplat(h, u, d, p, w);
}
y += 1;
}
n();
} catch (l) {
r(l);
}
}, a.src = t;
})
});
}
function kC({
box: t,
cells: A,
dotScale: e,
color: s,
opacity: i
}) {
A.x = Math.max(1, Math.round(A.x)), A.y = Math.max(1, Math.round(A.y)), A.z = Math.max(1, Math.round(A.z)), i = i ?? 1;
const n = A.x * A.y * A.z, r = K("int", A.x), a = K("int", A.y);
K("int", A.z);
const g = TA(0), I = new Kt({
numSplats: n,
generator: kA(
{ index: "int" },
{ gsplat: X },
({ index: o }) => {
if (!o)
throw new Error("index is undefined");
const C = ve(o, r), E = se(o, r), l = ve(E, a), c = se(E, a), h = KA({
vectorType: "ivec3",
x: C,
y: l,
z: c
}), u = Jn(g), d = KA({ vectorType: "ivec2", x: o, y: u }), w = zr(d), y = K("vec3", t.min), f = K("vec3", t.max), M = St(f, y), x = se(DA(ct(h), w), K("vec3", A));
let D, p, G;
s ? (D = K("float", s.r), p = K("float", s.g), G = K("float", s.b)) : { r: D, g: p, b: G } = xt(x).outputs;
const S = KA({
vectorType: "vec4",
r: D,
g: p,
b: G,
a: K("float", i)
}), m = DA(y, QA(M, x)), v = ct(K("float", e)), F = K("vec4", new Q.Quaternion(0, 0, 0, 1));
let k = rt({
flags: ne("uint", "GSPLAT_FLAG_ACTIVE"),
index: o,
center: m,
scales: v,
quaternion: F,
rgba: S
});
return k = B.applyGsplat(k), { gsplat: k };
},
{
globals: () => [NA]
}
),
update: ({ time: o }) => {
g.value = o, B.update(I), I.updateVersion();
}
}), B = new yt();
return I;
}
const RC = {
box: new Q.Box3(
new Q.Vector3(-1, -1, -1),
new Q.Vector3(1, 1, 1)
),
density: 100,
fallDirection: new Q.Vector3(-1, -3, 1).normalize(),
fallVelocity: 0.02,
wanderScale: 0.04,
wanderVariance: 2,
color1: new Q.Color(1, 1, 1),
color2: new Q.Color(0.5, 0.5, 1),
minScale: 1e-3,
maxScale: 5e-3,
anisoScale: new Q.Vector3(1, 1, 1)
}, GC = {
box: new Q.Box3(
new Q.Vector3(-2, -1, -2),
new Q.Vector3(2, 5, 2)
),
density: 10,
fallDirection: new Q.Vector3(0, -1, 0),
fallVelocity: 2,
wanderScale: 0.1,
wanderVariance: 1,
color1: new Q.Color(1, 1, 1),
color2: new Q.Color(0.25, 0.25, 0.5),
minScale: 5e-3,
maxScale: 0.01,
anisoScale: new Q.Vector3(0.1, 1, 0.1)
};
function UC({
// min and max box extents of the snowBox
box: t,
// minimum y-coordinate to clamp particle position, which can be used to
// fake hitting a ground plane and lingering there for a bit
minY: A,
// number of Gsplats to generate (default: calculated from box and density)
numSplats: e,
// density of Gsplats per unit volume (default: 100)
density: s,
// The xyz anisotropic scale of the Gsplat, which can be used for example
// to elongate rain particles (default: (1, 1, 1))
anisoScale: i,
// Minimum Gsplat particle scale (default: 0.001)
minScale: n,
// Maximum Gsplat particle scale (default: 0.005)
maxScale: r,
// The average direction of fall (default: (0, -1, 0))
fallDirection: a,
// The average speed of the fall (multiplied with fallDirection) (default: 0.02)
fallVelocity: g,
// The world scale of wandering overlay motion (default: 0.01)
wanderScale: I,
// Controls how uniformly the particles wander in sync, more variance mean
// more randomness in the motion (default: 2)
wanderVariance: B,
// Color 1 of the two colors interpolated between (default: (1, 1, 1))
color1: o,
// Color 2 of the two colors interpolated between (default: (0.5, 0.5, 1))
color2: C,
// The base opacity of the Gsplats (default: 1)
opacity: E,
// Optional callback function to call each frame.
onFrame: l
}) {
t = t ?? new Q.Box3(new Q.Vector3(-1, -1, -1), new Q.Vector3(1, 1, 1));
const c = (t.max.x - t.min.x) * (t.max.y - t.min.y) * (t.max.z - t.min.z);
s = s ?? 100, e = e ?? Math.max(1, Math.min(1e6, Math.round(c * s)));
const h = TA(n ?? 1e-3), u = TA(r ?? 5e-3), d = At(
((i == null ? void 0 : i.clone()) ?? new Q.Vector3(1, 1, 1)).normalize()
), w = At(
(a ?? new Q.Vector3(0, -1, 0)).normalize()
), y = TA(g ?? 0.02), f = TA(I ?? 0.01), M = TA(B ?? 2), x = At(o ?? new Q.Color(1, 1, 1)), D = At(C ?? new Q.Color(0.5, 0.5, 1)), p = TA(E ?? 1), G = TA(0), S = At(new Q.Vector3(0, 0, 0)), m = At(t.min), v = At(t.max), F = TA(A ?? Number.NEGATIVE_INFINITY), k = St(v, m), U = new Kt({
numSplats: e,
generator: kA(
{ index: "int" },
{ gsplat: X },
({ index: AA }) => {
if (!AA)
throw new Error("index not defined");
const z = be(AA), sA = xt(z).outputs.w;
let tA = ct(z), O = ie(QA(sA, K("float", 100)));
O = Le(QA(ne("float", "PI"), O)), O = DA(h, QA(O, St(u, h)));
const T = QA(O, d), W = ie(QA(sA, K("float", 10))), Z = ie(sA), j = Ki(x, D, Z), b = QA(j, W), dA = be(
KA({
vectorType: "ivec2",
x: AA,
y: K("int", 6837)
})
);
let oA = ct(dA), wA = QA(xt(dA).outputs.w, M);
wA = DA(G, wA), tA = DA(tA, S);
const pA = Ji(
tA,
K("vec3", new Q.Vector3(1, 1, 1))
);
tA = DA(m, QA(k, pA));
const xA = K("vec4", new Q.Quaternion(0, 0, 0, 1));
oA = Le(DA(ct(wA), oA)), oA = QA(oA, f);
let cA = DA(tA, oA), vA = xt(cA).outputs.y;
vA = Hi(F, vA), cA = KA({ vector: cA, y: vA });
let MA = rt({
flags: ne("uint", "GSPLAT_FLAG_ACTIVE"),
index: AA,
center: cA,
scales: T,
quaternion: xA,
rgb: b,
opacity: p
});
return MA = L.applyGsplat(MA), { gsplat: MA };
},
{
globals: () => [NA]
}
),
update: ({ object: AA, time: z, deltaTime: sA }) => {
G.value = z, L.update(U);
const tA = w.value.clone().multiplyScalar(y.value * sA);
S.value.add(tA), AA.visible = p.value > 0, l == null || l({ object: AA, time: z, deltaTime: sA }), U.updateVersion();
}
}), L = new yt();
return {
snow: U,
min: m,
max: v,
minY: F,
color1: x,
color2: D,
opacity: p,
fallVelocity: y,
wanderVariance: M,
wanderScale: f,
fallDirection: w,
minScale: h,
maxScale: u,
anisoScale: d
};
}
const uE = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
DEFAULT_RAIN: GC,
DEFAULT_SNOW: RC,
snowBox: UC,
staticBox: kC
}, Symbol.toStringTag, { value: "Module" }));
function _a(t) {
return kA({ gsplat: X }, { gsplat: X }, ({ gsplat: A }) => {
if (!A)
throw new Error("No gsplat input");
let e = Re(A);
const s = t.applyGsplat(A), i = Qt(s).outputs.center, n = Re(s), r = dr(i, n), a = pn(r, K("float", 0));
e = Xe(a, Pe(e), e);
const g = DA(
QA(e, K("float", 0.5)),
K("float", 0.5)
);
return A = rt({ gsplat: A, rgb: g }), { gsplat: A };
});
}
function vC(t) {
t.enableWorldToView = !0, t.worldModifier = _a(t.context.worldToView), t.updateGenerator();
}
function Va(t, A, e, s) {
return kA({ gsplat: X }, { gsplat: X }, ({ gsplat: i }) => {
if (!i)
throw new Error("No gsplat input");
let { center: n } = Qt(i).outputs;
n = t.apply(n);
const { z: r } = xt(n).outputs;
let a = _r(Pe(r), A, e);
return a = Xe(s, St(K("float", 1), a), a), i = rt({ gsplat: i, r: a, g: a, b: a }), { gsplat: i };
});
}
function bC(t, A, e, s) {
t.enableWorldToView = !0;
const i = K("float", A), n = K("float", e), r = K("bool", s ?? !1);
return t.worldModifier = Va(
t.context.worldToView,
i,
n,
r
), t.updateGenerator(), {
minDepth: i,
maxDepth: n,
reverse: r
};
}
const dE = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
makeDepthColorModifier: Va,
makeNormalColorModifier: _a,
setDepthColor: bC,
setWorldNormalColor: vC
}, Symbol.toStringTag, { value: "Module" })), Tt = class Tt {
static createButton(A, e = {}) {
const s = navigator.xr;
if (!s)
return null;
const i = s, n = document.createElement("button");
A.xr.enabled = !0, A.xr.setReferenceSpaceType("local");
function r() {
let o = null;
async function C(c) {
console.log("onSessionStarted"), c.addEventListener("end", E), await A.xr.setSession(c), n.textContent = "EXIT VR", o = c;
}
function E() {
console.log("onSessionEnded"), o == null || o.removeEventListener("end", E), n.textContent = "ENTER VR", o = null;
}
n.style.display = "", n.style.cursor = "pointer", n.style.left = "calc(50% - 100px)", n.style.width = "200px", n.style.height = "100px", n.textContent = "ENTER VR";
const l = {
...e,
optionalFeatures: [
// "local-floor",
// "bounded-floor",
// "layers",
...e.optionalFeatures || []
]
};
n.onmouseenter = () => {
n.style.opacity = "1.0";
}, n.onmouseleave = () => {
n.style.opacity = "0.5";
}, n.onclick = () => {
o === null ? (console.log("requesting session"), i.requestSession("immersive-vr", l).then(
C
)) : (console.log("ending session"), o.end());
};
}
function a() {
n.style.display = "none", n.style.cursor = "auto", n.style.left = "calc(50% - 75px)", n.style.width = "150px", n.onmouseenter = null, n.onmouseleave = null, n.onclick = null;
}
function g() {
a(), n.textContent = "VR NOT SUPPORTED";
}
function I(o) {
a(), console.warn(
"Exception when trying to call xr.isSessionSupported",
o
), n.textContent = "VR NOT ALLOWED";
}
function B(o) {
o.style.position = "absolute", o.style.bottom = "20px", o.style.padding = "12px 6px", o.style.border = "1px solid #fff", o.style.borderRadius = "4px", o.style.background = "rgba(0,0,0,0.1)", o.style.color = "#fff", o.style.font = "normal 13px sans-serif", o.style.textAlign = "center", o.style.opacity = "0.5", o.style.outline = "none", o.style.zIndex = "999";
}
return n.id = "VRButton", n.style.display = "none", B(n), i.isSessionSupported("immersive-vr").then((o) => {
o ? r() : g(), o && Tt.xrSessionIsGranted && n.click();
}).catch(I), n;
}
static registerSessionGrantedListener() {
const A = navigator.xr;
if (!A)
return null;
const e = A;
/WebXRViewer\//i.test(navigator.userAgent) || e.addEventListener("sessiongranted", () => {
Tt.xrSessionIsGranted = !0;
});
}
};
Tt.xrSessionIsGranted = !1;
let Ke = Tt;
Ke.registerSessionGrantedListener();
const LC = 0.5, YC = 0.5, TC = 0;
var ts = /* @__PURE__ */ ((t) => (t.w = "wrist", t.t0 = "thumb-metacarpal", t.t1 = "thumb-phalanx-proximal", t.t2 = "thumb-phalanx-distal", t.t3 = "thumb-tip", t.i0 = "index-finger-metacarpal", t.i1 = "index-finger-phalanx-proximal", t.i2 = "index-finger-phalanx-intermediate", t.i3 = "index-finger-phalanx-distal", t.i4 = "index-finger-tip", t.m0 = "middle-finger-metacarpal", t.m1 = "middle-finger-phalanx-proximal", t.m2 = "middle-finger-phalanx-intermediate", t.m3 = "middle-finger-phalanx-distal", t.m4 = "middle-finger-tip", t.r0 = "ring-finger-metacarpal", t.r1 = "ring-finger-phalanx-proximal", t.r2 = "ring-finger-phalanx-intermediate", t.r3 = "ring-finger-phalanx-distal", t.r4 = "ring-finger-tip", t.p0 = "pinky-finger-metacarpal", t.p1 = "pinky-finger-phalanx-proximal", t.p2 = "pinky-finger-phalanx-intermediate", t.p3 = "pinky-finger-phalanx-distal", t.p4 = "pinky-finger-tip", t))(ts || {});
const Za = Object.keys(ts), wE = Za.length, pE = {
w: 0,
t0: 1,
t1: 2,
t2: 3,
t3: 4,
i0: 5,
i1: 6,
i2: 7,
i3: 8,
i4: 9,
m0: 10,
m1: 11,
m2: 12,
m3: 13,
m4: 14,
r0: 15,
r1: 16,
r2: 17,
r3: 18,
r4: 19,
p0: 20,
p1: 21,
p2: 22,
p3: 23,
p4: 24
}, te = {
w: 0.02,
t0: 0.02,
t1: 0.014,
t2: 0.0115,
t3: 85e-4,
i0: 0.022,
i1: 0.012,
i2: 85e-4,
i3: 75e-4,
i4: 65e-4,
m0: 0.021,
m1: 0.012,
m2: 8e-3,
m3: 75e-4,
m4: 65e-4,
r0: 0.019,
r1: 0.011,
r2: 75e-4,
r3: 7e-3,
r4: 6e-3,
p0: 0.012,
p1: 0.01,
p2: 7e-3,
p3: 65e-4,
p4: 55e-4
}, JC = [
["w", "t0", "t1", "t2", "t3"],
["w", "i0", "i1", "i2", "i3", "i4"],
["w", "m0", "m1", "m2", "m3", "m4"],
["w", "r0", "r1", "r2", "r3", "r4"],
["w", "p0", "p1", "p2", "p3", "p4"]
], HC = [
[8, 10, 8, 6],
[8, 19, 14, 8, 6],
[8, 19, 14, 8, 6],
[8, 19, 14, 8, 6],
[8, 19, 14, 8, 6]
], yE = ["t3", "i4", "m4", "r4", "p4"], fE = ["i4", "m4", "r4", "p4"];
var Oa = /* @__PURE__ */ ((t) => (t.left = "left", t.right = "right", t))(Oa || {});
const qe = Object.keys(Oa);
class DE {
constructor() {
this.hands = {}, this.last = {}, this.values = {}, this.tests = {}, this.lastTests = {}, this.updated = !1;
}
update({ xr: A, xrFrame: e }) {
const s = A.getSession();
if (!s)
return;
const i = A.getReferenceSpace();
if (i && e.getJointPose) {
this.last = this.hands, this.lastTests = this.tests, this.hands = {}, this.values = {}, this.tests = {};
for (const n of s.inputSources) {
if (!n.hand)
continue;
const r = n.handedness;
this.hands[r] = {};
for (const a of Za) {
const g = n.hand.get(ts[a]);
if (g) {
const I = e.getJointPose(g, i);
if (I) {
const { position: B, orientation: o } = I.transform;
this.hands[r][a] = {
position: new LA(B.x, B.y, B.z),
quaternion: new es(
o.x,
o.y,
o.z,
o.w
),
radius: I.radius || 1e-3
};
}
}
}
}
for (const n of qe)
for (const { key: r, value: a } of [
{ key: `${n}AllTips`, value: this.allTipsTouching(n) },
{
key: `${n}IndexThumb`,
value: this.touching(n, "i4", n, "t3")
},
{
key: `${n}MiddleThumb`,
value: this.touching(n, "m4", n, "t3")
},
{
key: `${n}RingThumb`,
value: this.touching(n, "r4", n, "t3")
},
{
key: `${n}PinkyThumb`,
value: this.touching(n, "p4", n, "t3")
},
{ key: `${n}TriTips`, value: this.triTipsTouching(n) }
])
this.values[r] = a, this.tests[r] = a === 1 ? !0 : a === 0 ? !1 : this.lastTests[r] ?? !1;
}
}
makeGhostMesh() {
const A = new LA(), e = new LA(0.01, 0.01, 0.01), s = new es(0, 0, 0, 1), i = new ss(1, 1, 1), n = Math.PI * 3;
new ss(1, 1, 1);
let r = 1;
const a = new WA({
onFrame: () => {
let g = 0;
for (const I of qe) {
const B = this.hands[I];
for (const [o, C] of JC.entries())
for (let E = 1; E < C.length; ++E) {
const l = HC[o][E - 1] * 2, c = E + 1 === C.length, h = B == null ? void 0 : B[C[E - 1]], u = B == null ? void 0 : B[C[E]];
for (let d = 0; d < l; ++d) {
const w = (d + 0.5) / l;
if (r = 0, h && u) {
A.copy(h.position).lerp(u.position, w), s.copy(h.quaternion).slerp(u.quaternion, w);
const y = te[C[E - 1]], f = te[C[E]];
let M = (1 - w) * y + w * f;
c && w > 0.8 && (M *= Math.sqrt(1 - ((w - 0.8) / 0.2) ** 2)), e.set(0.65 * M, 0.5 * M, 3e-3), i.set(
0.55 + 0.45 * Math.sin(A.x * n),
0.55 + 0.45 * Math.sin(A.y * n),
0.55 + 0.45 * Math.sin(A.z * n)
), I === "right" && i.set(1 - i.r, 1 - i.g, 1 - i.b), r = 0.75;
}
a.packedSplats.setSplat(
g,
A,
e,
s,
r,
i
), g += 1;
}
}
}
a.packedSplats.numSplats = g, a.packedSplats.needsUpdate = !0, a.numSplats = g, a.updateVersion();
}
});
return a;
}
distance(A, e, s, i, n = !1) {
const r = n ? this.last[A] : this.hands[A], a = n ? this.last[s] : this.hands[s], g = r == null ? void 0 : r[e], I = a == null ? void 0 : a[i];
return !g || !I ? Number.POSITIVE_INFINITY : g.position.distanceTo(I.position);
}
separation(A, e, s, i, n = !1) {
const r = this.distance(A, e, s, i, n);
return r === Number.POSITIVE_INFINITY ? Number.POSITIVE_INFINITY : r - te[e] - te[i];
}
touching(A, e, s, i, n = !1) {
const r = this.separation(A, e, s, i, n);
return r === Number.POSITIVE_INFINITY ? Number.POSITIVE_INFINITY : 1 - Math.max(0, Math.min(1, r / 0.01 - TC));
}
allTipsTouching(A, e = !1) {
return Math.min(
this.touching(A, "t3", A, "i4", e),
this.touching(A, "i4", A, "m4", e),
this.touching(A, "m4", A, "r4", e),
this.touching(A, "r4", A, "p4", e)
// this.touching(hand, "p4", hand, "t3", last),
);
}
triTipsTouching(A, e = !1) {
return Math.min(
this.touching(A, "t3", A, "i4", e),
this.touching(A, "i4", A, "m4", e),
this.touching(A, "m4", A, "t3", e)
);
}
}
class mE {
constructor({
xrHands: A,
control: e,
moveInertia: s,
rotateInertia: i
}) {
this.lastGrip = {}, this.lastPivot = new LA(), this.rotateVelocity = 0, this.velocity = new LA(), this.xrHands = A, this.control = e, this.moveInertia = s ?? LC, this.rotateInertia = i ?? YC;
}
update(A) {
var n, r, a, g, I;
const e = {};
for (const B of qe) {
const o = this.xrHands.hands[B];
o && this.xrHands.tests[`${B}MiddleThumb`] && (e[B] = new LA().add(((n = o.t3) == null ? void 0 : n.position) ?? new LA()).add(((r = o.i4) == null ? void 0 : r.position) ?? new LA()).add(((a = o.m4) == null ? void 0 : a.position) ?? new LA()).add(((g = o.r4) == null ? void 0 : g.position) ?? new LA()).add(((I = o.p4) == null ? void 0 : I.position) ?? new LA()).multiplyScalar(1 / 5));
}
if (e.left && e.right && this.lastGrip.left && this.lastGrip.right) {
const B = e.left.clone().add(e.right).multiplyScalar(0.5), o = this.lastGrip.left.clone().add(this.lastGrip.right).multiplyScalar(0.5);
this.lastPivot = B;
const C = B.clone().applyMatrix4(this.control.matrix);
C.sub(o.clone().applyMatrix4(this.control.matrix)), C.multiplyScalar(1 / A), this.velocity.lerp(C, 1 - Math.exp(-20 * A));
const E = Math.atan2(e.left.z - B.z, e.left.x - B.x), l = Math.atan2(
this.lastGrip.left.z - o.z,
this.lastGrip.left.x - o.x
);
let c = E - l;
c > Math.PI ? c -= Math.PI * 2 : c < -Math.PI && (c += Math.PI * 2);
const h = c / A, u = Math.exp(-20 * A);
this.rotateVelocity = this.rotateVelocity * u + h * (1 - u);
} else if (this.rotateVelocity *= Math.exp(-A / this.rotateInertia), e.left && this.lastGrip.left) {
const B = e.left.clone().applyMatrix4(this.control.matrix);
B.sub(this.lastGrip.left.clone().applyMatrix4(this.control.matrix)), B.multiplyScalar(1 / A), this.velocity.lerp(B, 1 - Math.exp(-20 * A));
} else if (e.right && this.lastGrip.right) {
const B = e.right.clone().applyMatrix4(this.control.matrix);
B.sub(
this.lastGrip.right.clone().applyMatrix4(this.control.matrix)
), B.multiplyScalar(1 / A), this.velocity.lerp(B, 1 - Math.exp(-20 * A));
} else
this.velocity.multiplyScalar(Math.exp(-A / this.moveInertia));
const s = this.lastPivot.clone().negate(), i = new fe().makeTranslation(s).premultiply(new fe().makeRotationY(this.rotateVelocity * A)).premultiply(new fe().makeTranslation(this.lastPivot));
this.control.matrix.multiply(i), this.control.matrix.decompose(
this.control.position,
this.control.quaternion,
this.control.scale
), this.control.updateMatrixWorld(!0), this.control.position.sub(this.velocity.clone().multiplyScalar(A)), this.lastGrip = e;
}
}
const KC = 1, qC = 2, zC = 2e-3, _C = 6e-3, VC = 15e-4, ZC = 0.15, OC = 0.15, WC = 0.1, jC = 2, PC = 1, XC = 200, $C = 400, AE = 50, tE = {
KeyW: new Q.Vector3(0, 0, -1),
KeyS: new Q.Vector3(0, 0, 1),
KeyA: new Q.Vector3(-1, 0, 0),
KeyD: new Q.Vector3(1, 0, 0),
KeyR: new Q.Vector3(0, 1, 0),
KeyF: new Q.Vector3(0, -1, 0)
}, eE = {
ArrowUp: new Q.Vector3(0, 0, -1),
ArrowDown: new Q.Vector3(0, 0, 1),
ArrowLeft: new Q.Vector3(-1, 0, 0),
ArrowRight: new Q.Vector3(1, 0, 0),
PageUp: new Q.Vector3(0, 1, 0),
PageDown: new Q.Vector3(0, -1, 0)
}, sE = {
KeyQ: new Q.Vector3(0, 0, 1),
KeyE: new Q.Vector3(0, 0, -1)
}, iE = {
Home: new Q.Vector3(0, -1, 0),
End: new Q.Vector3(0, 1, 0),
Insert: new Q.Vector3(-1, 0, 0),
Delete: new Q.Vector3(1, 0, 0)
};
class xE {
constructor({ canvas: A }) {
this.lastTime = 0, this.fpsMovement = new nE({}), this.pointerControls = new rE({ canvas: A });
}
update(A) {
const e = performance.now(), s = (e - (this.lastTime || e)) / 1e3;
this.lastTime = e, this.fpsMovement.update(s, A), this.pointerControls.update(s, A);
}
}
class nE {
constructor({
moveSpeed: A,
rollSpeed: e,
stickThreshold: s,
rotateSpeed: i,
keycodeMoveMapping: n,
keycodeRotateMapping: r,
gamepadMapping: a,
capsMultiplier: g,
shiftMultiplier: I,
ctrlMultiplier: B,
xr: o
} = {}) {
this.enable = !0, this.moveSpeed = A ?? KC, this.rollSpeed = e ?? qC, this.stickThreshold = s ?? WC, this.rotateSpeed = i ?? jC, this.keycodeMoveMapping = n ?? {
...tE,
...eE
}, this.keycodeRotateMapping = r ?? {
...sE,
...iE
}, this.gamepadMapping = a ?? {
4: "rollLeft",
5: "rollRight",
6: "ctrl",
7: "shift"
}, this.capsMultiplier = g ?? 10, this.shiftMultiplier = I ?? 5, this.ctrlMultiplier = B ?? 1 / 5, this.xr = o, this.keydown = {}, this.keycode = {}, document.addEventListener("keydown", (C) => {
this.keydown[C.key] = !0, this.keycode[C.code] = !0;
}), document.addEventListener("keyup", (C) => {
this.keydown[C.key] = !1, this.keycode[C.code] = !1;
}), window.addEventListener("blur", () => {
this.keydown = {}, this.keycode = {};
});
}
// Call this method in your render loop with `control` set to the object to control
// (`THREE.Camera` or a `THREE.Object3D` that contains it), with `deltaTime`
// in seconds since the last update.
update(A, e) {
var B, o;
if (!this.enable)
return;
const s = [new Q.Vector2(), new Q.Vector2()], i = navigator.getGamepads()[0];
i && (s[0].set(i.axes[0], i.axes[1]), s[1].set(i.axes[2], i.axes[3]));
const n = (i == null ? void 0 : i.buttons.map((C) => C.pressed)) || [], r = Array.from(((o = (B = this.xr) == null ? void 0 : B.getSession()) == null ? void 0 : o.inputSources) ?? []);
for (const C of r) {
const E = C.gamepad;
if (E)
switch (C.handedness) {
case "none": {
s[0].x += E.axes[0], s[0].y += E.axes[1], s[1].x += E.axes[2], s[1].y += E.axes[3];
break;
}
case "left": {
s[0].x += E.axes[2], s[0].y += E.axes[3];
break;
}
case "right": {
s[1].x += E.axes[2], s[1].y += E.axes[3];
break;
}
}
}
for (const C of s)
C.x = Math.abs(C.x) >= this.stickThreshold ? C.x : 0, C.y = Math.abs(C.y) >= this.stickThreshold ? C.y : 0;
const a = new Q.Vector3(
s[1].x,
s[1].y,
0
).multiplyScalar(this.rotateSpeed);
for (const [C, E] of Object.entries(this.keycodeRotateMapping))
this.keycode[C] && a.add(E);
for (const C in this.gamepadMapping)
if (n[Number.parseInt(C)])
switch (this.gamepadMapping[C]) {
case "rollLeft":
a.z += 1;
break;
case "rollRight":
a.z -= 1;
break;
}
if (a.multiply(
new Q.Vector3(this.rotateSpeed, this.rotateSpeed, this.rollSpeed)
), a.manhattanLength() > 0) {
a.multiplyScalar(A);
const C = new Q.Euler().setFromQuaternion(
e.quaternion,
"YXZ"
);
C.y -= a.x, C.x = Math.max(
-Math.PI / 2,
Math.min(Math.PI / 2, C.x - a.y)
), C.z = Math.max(-Math.PI, Math.min(Math.PI, C.z + a.z)), e.quaternion.setFromEuler(C);
}
const g = new Q.Vector3(s[0].x, 0, s[0].y);
for (const [C, E] of Object.entries(this.keycodeMoveMapping))
this.keycode[C] && g.add(E);
let I = 1;
this.keydown.CapsLock && (I *= this.capsMultiplier), (this.keycode.ShiftLeft || this.keycode.ShiftRight) && (I *= this.shiftMultiplier), (this.keycode.ControlLeft || this.keycode.ControlRight) && (I *= this.ctrlMultiplier);
for (const C in this.gamepadMapping)
if (n[Number.parseInt(C)])
switch (this.gamepadMapping[C]) {
case "shift":
I *= this.shiftMultiplier;
break;
case "ctrl":
I *= this.ctrlMultiplier;
break;
}
g.applyQuaternion(e.quaternion), e.position.add(
g.multiplyScalar(this.moveSpeed * I * A)
);
}
}
class rE {
constructor({
// The HTML canvas element to attach pointer events to
canvas: A,
// Speed of rotation (default DEFAULT_ROTATE_SPEED)
rotateSpeed: e,
// Speed of sliding when dragging with right/middle mouse button or two fingers
// (default DEFAULT_SLIDE_SPEED)
slideSpeed: s,
// Speed of movement when using mouse scroll wheel (default DEFAULT_SCROLL_SPEED)
scrollSpeed: i,
// Swap the direction of rotation and sliding (default: false)
swapRotateSlide: n,
// Reverse the direction of rotation (default: false)
reverseRotate: r,
// Reverse the direction of sliding (default: false)
reverseSlide: a,
// Reverse the direction of swipe gestures (default: false)
reverseSwipe: g,
// Reverse the direction of scroll wheel movement (default: false)
reverseScroll: I,
// Inertia factor for movement (default: DEFAULT_MOVE_INERTIA)
moveInertia: B,
// Inertia factor for rotation (default: DEFAULT_ROTATE_INERTIA)
rotateInertia: o,
// Pointer rolling scale factor (default: DEFAULT_POINTER_ROLL_SCALE)
pointerRollScale: C,
// Callback for double press events (default: () => {})
doublePress: E
}) {
this.enable = !0, this.canvas = A, this.rotateSpeed = e ?? zC, this.slideSpeed = s ?? _C, this.scrollSpeed = i ?? VC, this.swapRotateSlide = n ?? !1, this.reverseRotate = r ?? !1, this.reverseSlide = a ?? !1, this.reverseSwipe = g ?? !1, this.reverseScroll = I ?? !1, this.moveInertia = B ?? OC, this.rotateInertia = o ?? ZC, this.pointerRollScale = C ?? PC, this.doublePress = E ?? (() => {
}), this.doublePressLimitMs = $C, this.doublePressDistance = AE, this.lastUp = null, this.rotating = null, this.sliding = null, this.dualPress = !1, this.scroll = new Q.Vector3(), this.rotateVelocity = new Q.Vector3(), this.moveVelocity = new Q.Vector3(), A.addEventListener("pointerdown", (c) => {
const h = this.getPointerPosition(c), u = h.clone(), d = h.clone(), w = !this.swapRotateSlide && !this.rotating && (c.pointerType !== "mouse" || c.button === 0) || this.swapRotateSlide && this.sliding && !this.rotating && (c.pointerType !== "mouse" || c.button === 1), { pointerId: y, timeStamp: f } = c;
if (w)
this.rotating = { initial: u, last: d, position: h, pointerId: y, timeStamp: f }, A.setPointerCapture(c.pointerId), this.dualPress = !1;
else if (!this.sliding) {
const M = c.pointerType === "mouse" ? c.button : void 0;
this.sliding = {
initial: u,
last: d,
position: h,
pointerId: y,
button: M,
timeStamp: f
}, A.setPointerCapture(c.pointerId), this.dualPress = this.rotating != null && f - this.rotating.timeStamp < XC;
}
});
const l = (c) => {
var d, w;
((d = this.rotating) == null ? void 0 : d.pointerId) === c.pointerId ? (this.rotating = null, A.releasePointerCapture(c.pointerId), this.dualPress && this.sliding && (A.releasePointerCapture(this.sliding.pointerId), this.sliding = null)) : ((w = this.sliding) == null ? void 0 : w.pointerId) === c.pointerId && (this.sliding = null, A.releasePointerCapture(c.pointerId), this.dualPress && this.rotating && (A.releasePointerCapture(this.rotating.pointerId), this.rotating = null));
const h = this.getPointerPosition(c), u = this.lastUp;
if (this.lastUp = { position: h, time: c.timeStamp }, u && u.position.distanceTo(h) < this.doublePressDistance) {
const f = c.timeStamp - u.time;
f < this.doublePressLimitMs && (this.lastUp = null, this.doublePress({ position: h, intervalMs: f }));
}
};
document.addEventListener("pointerup", l), document.addEventListener("pointercancel", l), document.addEventListener("pointermove", (c) => {
var h, u;
((h = this.rotating) == null ? void 0 : h.pointerId) === c.pointerId ? this.rotating.position = this.getPointerPosition(c) : ((u = this.sliding) == null ? void 0 : u.pointerId) === c.pointerId && (this.sliding.position = this.getPointerPosition(c));
}), A.addEventListener("contextmenu", (c) => {
c.preventDefault();
}), A.addEventListener("wheel", (c) => {
this.scroll.add(
new Q.Vector3(c.deltaX, c.deltaY, c.deltaZ)
), c.preventDefault();
});
}
getPointerPosition(A) {
const e = this.canvas.getBoundingClientRect();
return new Q.Vector2(
A.clientX - e.left,
A.clientY - e.top
);
}
update(A, e) {
if (!this.enable)
return;
if (this.dualPress && this.rotating && this.sliding) {
const i = [
this.rotating.position.clone().sub(this.rotating.last),
this.sliding.position.clone().sub(this.sliding.last)
], n = i[0].dot(i[1]);
if (n >= 0.2) {
const r = i[0].clone().add(i[1]), a = new Q.Vector3(r.x, -r.y, 0);
a.multiplyScalar(this.slideSpeed * (this.reverseSwipe ? 1 : -1)), a.applyQuaternion(e.quaternion), e.position.add(a), this.moveVelocity = a.clone().multiplyScalar(1 / A);
} else if (n <= -0.2) {
const r = this.sliding.last.clone().sub(this.rotating.last), a = r.length();
r.multiplyScalar(1 / a).normalize();
const g = new Q.Vector2(-r.y, r.x), I = [i[0].dot(r), i[1].dot(r)], B = [i[0].dot(g), i[1].dot(g)], o = this.rotating.last.clone().add(this.sliding.last).multiplyScalar(0.5);
let C = new Q.Vector3();
if (e instanceof Q.Camera) {
const d = new Q.Vector2(
o.x / this.canvas.clientWidth * 2 - 1,
-(o.y / this.canvas.clientHeight) * 2 + 1
), w = new Q.Raycaster();
w.setFromCamera(d, e), C = w.ray.direction;
}
const E = I[1] - I[0], l = C.multiplyScalar(E * this.slideSpeed);
e.position.add(l), this.moveVelocity = l.clone().multiplyScalar(1 / A);
const c = [
Math.atan(B[0] / (-0.5 * a)),
Math.atan(B[1] / (0.5 * a))
], h = 0.5 * (c[0] + c[1]) * this.pointerRollScale, u = new Q.Euler().setFromQuaternion(
e.quaternion,
"YXZ"
);
u.z = Math.max(
-Math.PI,
Math.min(Math.PI, u.z + 0.5 * h)
), e.quaternion.setFromEuler(u);
}
this.rotating.last.copy(this.rotating.position), this.sliding.last.copy(this.sliding.position);
} else {
const i = new Q.Vector3();
if (this.rotating && !this.dualPress) {
const r = this.rotating.position.clone().sub(this.rotating.last);
this.rotating.last.copy(this.rotating.position), i.set(r.x, r.y, 0), i.multiplyScalar(this.rotateSpeed * (this.reverseRotate ? -1 : 1)), this.rotateVelocity = i.clone().multiplyScalar(1 / A);
} else
this.rotateVelocity.multiplyScalar(
Math.exp(-A / this.rotateInertia)
), i.addScaledVector(this.rotateVelocity, A);
const n = new Q.Euler().setFromQuaternion(
e.quaternion,
"YXZ"
);
if (n.y -= i.x, n.x = Math.max(
-Math.PI / 2,
Math.min(Math.PI / 2, n.x - i.y)
), n.z *= Math.exp(-0 * A), e.quaternion.setFromEuler(n), this.sliding && !this.dualPress) {
const r = this.sliding.position.clone().sub(this.sliding.last);
this.sliding.last.copy(this.sliding.position);
const a = this.sliding.button !== 2 ? new Q.Vector3(r.x, 0, r.y) : new Q.Vector3(r.x, -r.y, 0);
a.multiplyScalar(this.slideSpeed * (this.reverseSlide ? -1 : 1)), a.applyQuaternion(e.quaternion), e.position.add(a), this.moveVelocity = a.clone().multiplyScalar(1 / A);
} else
this.moveVelocity.multiplyScalar(
Math.exp(-A / this.moveInertia)
), e.position.addScaledVector(this.moveVelocity, A);
}
const s = this.scroll.multiplyScalar(this.scrollSpeed);
s.set(s.x, s.z, s.y), this.reverseScroll && s.multiplyScalar(-1), s.applyQuaternion(e.quaternion), e.position.add(s), this.scroll.set(0, 0, 0);
}
}
export {
fE as FINGER_TIPS,
nE as FpsMovement,
qe as HANDS,
Oa as Hand,
mE as HandMovement,
Za as JOINT_IDS,
pE as JOINT_INDEX,
te as JOINT_RADIUS,
JC as JOINT_SEGMENTS,
HC as JOINT_SEGMENT_STEPS,
yE as JOINT_TIPS,
ts as JointEnum,
wE as NUM_JOINTS,
qA as PackedSplats,
Ie as PlyReader,
rE as PointerControls,
ge as Readback,
Ro as Sint8ToFloat,
xE as SparkControls,
Ce as SparkRenderer,
Qe as SparkViewpoint,
Se as SplatAccumulator,
oe as SplatEdit,
qQ as SplatEditRgbaBlendMode,
_Q as SplatEditSdf,
HQ as SplatEditSdfType,
VQ as SplatEdits,
bt as SplatFileType,
Kt as SplatGenerator,
aC as SplatLoader,
WA as SplatMesh,
OQ as SplatModifier,
QE as SplatSkinning,
yt as SplatTransformer,
mC as SpzReader,
tt as SpzWriter,
ko as Uint8ToFloat,
Ke as VRButton,
DE as XrHands,
EE as constructAxes,
CE as constructGrid,
cE as constructSpherePoints,
oE as dyno,
Xo as flipPixels,
ee as floatToSint8,
FA as floatToUint8,
fA as fromHalf,
uE as generators,
ba as getSplatFileType,
lE as imageSplats,
jo as isAndroid,
Wo as isMobile,
Po as isOculus,
IE as isPcSogs,
dE as modifiers,
$o as pixelsToPngUrl,
Ge as setPackedSplat,
hE as textSplats,
Et as toHalf,
BE as transcodeSpz,
Ue as unpackSplat,
Ya as unpackSplats,
gE as utils
};
//# sourceMappingURL=spark.module.min.js.map