import * as a from "three"; import { Mesh as iQ, OrthographicCamera as QQ, BufferGeometry as nQ, Float32BufferAttribute as gg, Loader as CQ, FileLoader as EQ, Quaternion as Ig, Vector3 as JA, Color as sg, Matrix4 as de } from "three"; const aQ = new QQ(-1, 1, 1, -1, 0, 1); class oQ extends nQ { constructor() { super(), this.setAttribute("position", new gg([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3)), this.setAttribute("uv", new gg([0, 2, 0, 0, 2, 0], 2)); } } const rQ = new oQ(); class hg { constructor(A) { this._mesh = new iQ(rQ, A); } dispose() { this._mesh.geometry.dispose(); } render(A) { A.render(this._mesh, aQ); } get material() { return this._mesh.material; } set material(A) { this._mesh.material = A; } } var aA = Uint8Array, yt = Uint16Array, cQ = Int32Array, lg = new aA([ 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 ]), ug = new aA([ 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 ]), hQ = new aA([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]), wg = function(t, A) { for (var e = new yt(31), g = 0; g < 31; ++g) e[g] = A += 1 << t[g - 1]; for (var I = new cQ(e[30]), g = 1; g < 30; ++g) for (var s = e[g]; s < e[g + 1]; ++s) I[s] = s - e[g] << 5 | g; return { b: e, r: I }; }, Dg = wg(lg, 2), yg = Dg.b, lQ = Dg.r; yg[28] = 258, lQ[258] = 28; var uQ = wg(ug, 0), wQ = uQ.b, ke = new yt(32768); for (var gA = 0; gA < 32768; ++gA) { var $A = (gA & 43690) >> 1 | (gA & 21845) << 1; $A = ($A & 52428) >> 2 | ($A & 13107) << 2, $A = ($A & 61680) >> 4 | ($A & 3855) << 4, ke[gA] = (($A & 65280) >> 8 | ($A & 255) << 8) >> 1; } var vt = function(t, A, e) { for (var g = t.length, I = 0, s = new yt(A); I < g; ++I) t[I] && ++s[t[I] - 1]; var B = new yt(A); for (I = 1; I < A; ++I) B[I] = B[I - 1] + s[I - 1] << 1; var i; if (e) { i = new yt(1 << A); var Q = 15 - A; for (I = 0; I < g; ++I) if (t[I]) for (var C = I << 4 | t[I], E = A - t[I], n = B[t[I] - 1]++ << E, o = n | (1 << E) - 1; n <= o; ++n) i[ke[n] >> Q] = C; } else for (i = new yt(g), I = 0; I < g; ++I) t[I] && (i[I] = ke[B[t[I] - 1]++] >> 15 - t[I]); return i; }, zt = new aA(288); for (var gA = 0; gA < 144; ++gA) zt[gA] = 8; for (var gA = 144; gA < 256; ++gA) zt[gA] = 9; for (var gA = 256; gA < 280; ++gA) zt[gA] = 7; for (var gA = 280; gA < 288; ++gA) zt[gA] = 8; var pg = new aA(32); for (var gA = 0; gA < 32; ++gA) pg[gA] = 5; var DQ = /* @__PURE__ */ vt(zt, 9, 1), yQ = /* @__PURE__ */ vt(pg, 5, 1), Me = function(t) { for (var A = t[0], e = 1; e < t.length; ++e) t[e] > A && (A = t[e]); return A; }, LA = function(t, A, e) { var g = A / 8 | 0; return (t[g] | t[g + 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); }, fg = 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 aA(t.subarray(A, e)); }, pQ = [ "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 g = new Error(A || pQ[t]); if (g.code = t, Error.captureStackTrace && Error.captureStackTrace(g, yA), !e) throw g; return g; }, dg = function(t, A, e, g) { var I = t.length, s = g ? g.length : 0; if (!I || A.f && !A.l) return e || new aA(0); var B = !e, i = B || A.i != 2, Q = A.i; B && (e = new aA(I * 3)); var C = function(DA) { var MA = e.length; if (DA > MA) { var rA = new aA(Math.max(MA * 2, DA)); rA.set(e), e = rA; } }, E = A.f || 0, n = A.p || 0, o = A.b || 0, r = A.l, l = A.d, c = A.m, h = A.n, u = I * 8; do { if (!r) { E = LA(t, n, 1); var D = LA(t, n + 1, 3); if (n += 3, D) if (D == 1) r = DQ, l = yQ, c = 9, h = 5; else if (D == 2) { var N = LA(t, n, 31) + 257, M = LA(t, n + 10, 15) + 4, d = N + LA(t, n + 5, 31) + 1; n += 14; for (var p = new aA(d), R = new aA(19), S = 0; S < M; ++S) R[hQ[S]] = LA(t, n + S * 3, 7); n += M * 3; for (var m = Me(R), Y = (1 << m) - 1, G = vt(R, m, 1), S = 0; S < d; ) { var k = G[LA(t, n, Y)]; n += k & 15; var w = k >> 4; if (w < 16) p[S++] = w; else { var U = 0, J = 0; for (w == 16 ? (J = 3 + LA(t, n, 3), n += 2, U = p[S - 1]) : w == 17 ? (J = 3 + LA(t, n, 7), n += 3) : w == 18 && (J = 11 + LA(t, n, 127), n += 7); J--; ) p[S++] = U; } } var AA = p.subarray(0, N), z = p.subarray(N); c = Me(AA), h = Me(z), r = vt(AA, c, 1), l = vt(z, h, 1); } else yA(1); else { var w = fg(n) + 4, y = t[w - 4] | t[w - 3] << 8, f = w + y; if (f > I) { Q && yA(0); break; } i && C(o + y), e.set(t.subarray(w, f), o), A.b = o += y, A.p = n = f * 8, A.f = E; continue; } if (n > u) { Q && yA(0); break; } } i && C(o + 131072); for (var eA = (1 << c) - 1, tA = (1 << h) - 1, _ = n; ; _ = n) { var U = r[me(t, n) & eA], b = U >> 4; if (n += U & 15, n > u) { Q && yA(0); break; } if (U || yA(2), b < 256) e[o++] = b; else if (b == 256) { _ = n, r = null; break; } else { var X = b - 254; if (b > 264) { var S = b - 257, j = lg[S]; X = LA(t, n, (1 << j) - 1) + yg[S], n += j; } var O = l[me(t, n) & tA], L = O >> 4; O || yA(3), n += O & 15; var z = wQ[L]; if (L > 3) { var j = ug[L]; z += me(t, n) & (1 << j) - 1, n += j; } if (n > u) { Q && yA(0); break; } i && C(o + 131072); var uA = o + X; if (o < z) { var nA = s - z, wA = Math.min(z, uA); for (nA + o < 0 && yA(3); o < wA; ++o) e[o] = g[nA + o]; } for (; o < uA; ++o) e[o] = e[o - z]; } } A.l = r, A.p = _, A.b = o, A.f = E, r && (E = 1, A.m = c, A.d = l, A.n = h); } while (!E); return o != e.length && B ? dt(e, 0, o) : e.subarray(0, o); }, fQ = /* @__PURE__ */ new aA(0), TA = function(t, A) { return t[A] | t[A + 1] << 8; }, vA = function(t, A) { return (t[A] | t[A + 1] << 8 | t[A + 2] << 16 | t[A + 3] << 24) >>> 0; }, Ne = function(t, A) { return vA(t, A) + vA(t, A + 4) * 4294967296; }, dQ = 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 g = (A >> 3 & 1) + (A >> 4 & 1); g > 0; g -= !t[e++]) ; return e + (A & 2); }, Se = /* @__PURE__ */ function() { function t(A, e) { typeof A == "function" && (e = A, A = {}), this.ondata = e; var g = A && A.dictionary && A.dictionary.subarray(-32768); this.s = { i: 0, b: g ? g.length : 0 }, this.o = new aA(32768), this.p = new aA(0), g && this.o.set(g); } 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 aA(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, g = dg(this.p, this.s, this.o); this.ondata(dt(g, e, this.s.b), this.d), this.o = dt(g, 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 MQ(t, A) { return dg(t, { i: 2 }, A && A.out, A && A.dictionary); } var Mg = /* @__PURE__ */ function() { function t(A, e) { this.v = 1, this.r = 0, Se.call(this, A, e); } return t.prototype.push = function(A, e) { if (Se.prototype.e.call(this, A), this.r += A.length, this.v) { var g = this.p.subarray(this.v - 1), I = g.length > 3 ? dQ(g) : 4; if (I > g.length) { if (!e) return; } else this.v > 1 && this.onmember && this.onmember(this.r - g.length); this.p = g.subarray(I), this.v = 0; } Se.prototype.c.call(this, e), this.s.f && !this.s.l && !e && (this.v = fg(this.s.p) + 9, this.s = { i: 0 }, this.o = new aA(0), this.push(new aA(0), e)); }, t; }(), xe = typeof TextDecoder < "u" && /* @__PURE__ */ new TextDecoder(), mQ = 0; try { xe.decode(fQ, { stream: !0 }), mQ = 1; } catch { } var NQ = function(t) { for (var A = "", e = 0; ; ) { var g = t[e++], I = (g > 127) + (g > 223) + (g > 239); if (e + I > t.length) return { s: A, r: dt(t, e - 1) }; I ? I == 3 ? (g = ((g & 15) << 18 | (t[e++] & 63) << 12 | (t[e++] & 63) << 6 | t[e++] & 63) - 65536, A += String.fromCharCode(55296 | g >> 10, 56320 | g & 1023)) : I & 1 ? A += String.fromCharCode((g & 31) << 6 | t[e++] & 63) : A += String.fromCharCode((g & 15) << 12 | (t[e++] & 63) << 6 | t[e++] & 63) : A += String.fromCharCode(g); } }; function SQ(t, A) { if (A) { for (var e = "", g = 0; g < t.length; g += 16384) e += String.fromCharCode.apply(null, t.subarray(g, g + 16384)); return e; } else { if (xe) return xe.decode(t); var I = NQ(t), s = I.s, e = I.r; return e.length && yA(8), s; } } var FQ = function(t, A) { return A + 30 + TA(t, A + 26) + TA(t, A + 28); }, GQ = function(t, A, e) { var g = TA(t, A + 28), I = SQ(t.subarray(A + 46, A + 46 + g), !(TA(t, A + 8) & 2048)), s = A + 46 + g, B = vA(t, A + 20), i = e && B == 4294967295 ? kQ(t, s) : [B, vA(t, A + 24), vA(t, A + 42)], Q = i[0], C = i[1], E = i[2]; return [TA(t, A + 10), Q, C, I, s + TA(t, A + 30) + TA(t, A + 32), E]; }, kQ = function(t, A) { for (; TA(t, A) != 1; A += 4 + TA(t, A + 2)) ; return [Ne(t, A + 12), Ne(t, A + 4), Ne(t, A + 20)]; }; function xQ(t, A) { for (var e = {}, g = t.length - 22; vA(t, g) != 101010256; --g) (!g || t.length - g > 65558) && yA(13); var I = TA(t, g + 8); if (!I) return {}; var s = vA(t, g + 16), B = s == 4294967295 || I == 65535; if (B) { var i = vA(t, g - 12); B = vA(t, i) == 101075792, B && (I = vA(t, i + 32), s = vA(t, i + 48)); } for (var Q = A && A.filter, C = 0; C < I; ++C) { var E = GQ(t, s, B), n = E[0], o = E[1], r = E[2], l = E[3], c = E[4], h = E[5], u = FQ(t, h); s = c, (!Q || Q({ name: l, size: o, originalSize: r, compression: n })) && (n ? n == 8 ? e[l] = MQ(t.subarray(u, u + o), { out: new aA(r) }) : yA(14, "unknown compression type " + n) : e[l] = dt(t, u, u + o)); } return e; } let jA; const mg = typeof TextDecoder < "u" ? new TextDecoder("utf-8", { ignoreBOM: !0, fatal: !0 }) : { decode: () => { throw Error("TextDecoder not available"); } }; typeof TextDecoder < "u" && mg.decode(); let Yt = null; function RQ() { return (Yt === null || Yt.byteLength === 0) && (Yt = new Uint8Array(jA.memory.buffer)), Yt; } function UQ(t, A) { return t = t >>> 0, mg.decode(RQ().subarray(t, t + A)); } function YQ(t, A, e, g, I, s, B, i, Q, C, E) { return jA.raycast_splats(t, A, e, g, I, s, B, i, Q, C, E); } async function LQ(t, A) { if (typeof Response == "function" && t instanceof Response) { if (typeof WebAssembly.instantiateStreaming == "function") try { return await WebAssembly.instantiateStreaming(t, A); } catch (g) { 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", g); else throw g; } 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 JQ() { 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, g) { return new Float32Array(A, e >>> 0, g >>> 0); }, t.wbg.__wbg_newwithbyteoffsetandlength_f1dead44d1fc7212 = function(A, e, g) { return new Uint32Array(A, e >>> 0, g >>> 0); }, t.wbg.__wbg_newwithlength_5a5efe313cfd59f1 = function(A) { return new Float32Array(A >>> 0); }, t.wbg.__wbg_set_10bad9bee0e9c58b = function(A, e, g) { A.set(e, g >>> 0); }, t.wbg.__wbg_set_d23661d19148b229 = function(A, e, g) { A.set(e, g >>> 0); }, t.wbg.__wbg_set_f4f1f0daa30696fc = function(A, e, g) { A.set(e, g >>> 0); }, t.wbg.__wbg_subarray_3aaeec89bb2544f0 = function(A, e, g) { return A.subarray(e >>> 0, g >>> 0); }, t.wbg.__wbg_subarray_769e1e0f81bb259b = function(A, e, g) { return A.subarray(e >>> 0, g >>> 0); }, t.wbg.__wbindgen_init_externref_table = function() { const A = jA.__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 jA.memory; }, t.wbg.__wbindgen_throw = function(A, e) { throw new Error(UQ(A, e)); }, t; } function vQ(t, A) { return jA = t.exports, Ng.__wbindgen_wasm_module = A, Yt = null, jA.__wbindgen_start(), jA; } async function Ng(t) { if (jA !== void 0) return jA; 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,AGFzbQEAAAAB8gEjYAJ/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+AGALfX19fX19fX1/b38Bb2AGf39/f39/AX9gBX9/fX9/AGAEf31/fwBgBX9/fn9/AGAEf35/fwBgBX9/fH9/AGAEf3x/fwBgA39+fgF/YAN/b28Bf2ACfX0BfQLyBBEDd2JnHV9fd2JnX2J1ZmZlcl82MDljYzNlZWU1MWVkMTU4AAoDd2JnGl9fd2JnX25ld185ZmVlOTdhNDA5YjMyYjY4AAoDd2JnGl9fd2JnX3NldF9mNGYxZjBkYWEzMDY5NmZjAAsDd2JnHV9fd2JnX2xlbmd0aF84Y2ZkMmM2NDA5YWY4OGFkAAwDd2JnMV9fd2JnX25ld3dpdGhieXRlb2Zmc2V0YW5kbGVuZ3RoX2YxZGVhZDQ0ZDFmYzcyMTIABwN3YmcaX193YmdfbmV3X2UzYjMyMWRjZmVmODlmYzcACgN3YmcaX193Ymdfc2V0X2QyMzY2MWQxOTE0OGIyMjkACwN3YmcdX193YmdfbGVuZ3RoXzZjYTUyNzY2NWQ4OTY5NGQADAN3YmcxX193YmdfbmV3d2l0aGJ5dGVvZmZzZXRhbmRsZW5ndGhfZTZiN2U2OWFjZDRjNzM1NAAHA3diZxpfX3diZ19zZXRfMTBiYWQ5YmVlMGU5YzU4YgALA3diZx1fX3diZ19sZW5ndGhfM2I0ZjAyMjE4OGFlOGRiNgAMA3diZx9fX3diZ19zdWJhcnJheV83NjllMWUwZjgxYmIyNTliAAcDd2JnH19fd2JnX3N1YmFycmF5XzNhYWVlYzg5YmIyNTQ0ZjAABwN3YmckX193YmdfbmV3d2l0aGxlbmd0aF81YTVlZmUzMTNjZmQ1OWYxABMDd2JnEF9fd2JpbmRnZW5fdGhyb3cAAgN3YmcRX193YmluZGdlbl9tZW1vcnkAFAN3YmcfX193YmluZGdlbl9pbml0X2V4dGVybnJlZl90YWJsZQAOA7wBugEEAAAGAAQCBAEADwQE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AgBB7NbAAEHk1sAANgIAQYDXwABB9NbAADYCAEH01sAAQezWwAA2AgBBiNfAAEH81sAANgIAQfzWwABB9NbAADYCAEGQ18AAQYTXwAA2AgBBhNfAAEH81sAANgIAQZjXwABBjNfAADYCAEGM18AAQYTXwAA2AgBBoNfAAEGU18AANgIAQZTXwABBjNfAADYCAEGc18AAQZTXwAA2AgBBqNfAAEGc18AANgIAQaTXwABBnNfAADYCAEGw18AAQaTXwAA2AgBBrNfAAEGk18AANgIAQbjXwABBrNfAADYCAEG018AAQazXwAA2AgBBwNfAAEG018AANgIAQbzXwABBtNfAADYCAEHI18AAQbzXwAA2AgBBxNfAAEG818AANgIAQdDXwABBxNfAADYCAEHM18AAQcTXwAA2AgBB2NfAAEHM18AANgIAQdTXwABBzNfAADYCAEHg18AAQdTXwAA2AgBB6NfAAEHc18AANgIAQdzXwABB1NfAADYCAEHw18AAQeTXwAA2AgBB5NfAAEHc18AANgIAQfjXwABB7NfAADYCAEHs18AAQeTXwAA2AgBBgNjAAEH018AANgIAQfTXwABB7NfAADYCAEGI2MAAQfzXwAA2AgBB/NfAAEH018AANgIAQZDYwABBhNjAADYCAEGE2MAAQfzXwAA2AgBBmNjAAEGM2MAANgIAQYzYwABBhNjAADYCAEGg2MAAQZTYwAA2AgBBlNjAAEGM2MAANgIAQajYwABBnNjAADYCAEGc2MAAQZTYwAA2AgBBsNjAAEGk2MAANgIAQaTYwABBnNjAADYCAEG42MAAQazYwAA2AgBBrNjAAEGk2MAANgIAQcDYwABBtNjAADYCAEG02MAAQazYwAA2AgBByNjAAEG82MAANgIAQbzYwABBtNjAADYCAEHQ2MAAQcTYwAA2AgBBxNjAAEG82MAANgIAQdjYwABBzNjAADYCAEHM2MAAQcTYwAA2AgBB8NjAACABQQ9qQXhxIgBBCGsiAjYCAEHU2MAAQczYwAA2AgBB6NjAACAEQShrIgMgASAAa2pBCGoiADYCACACIABBAXI2AgQgASADakEoNgIEQfzYwABBgICAATYCAAwICyACIANJIAEgAk1yDQAgACgCDCIDQQFxDQAgA0EBdiAGRg0DC0GA2cAAQYDZwAAoAgAiACABIAAgAUkb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KAIMIQICQAJAAkAgAUGAAk8EQCAAKAIYIQMCQAJAIAAgAkYEQCAAQRRBECAAKAIUIgIbaigCACIBDQFBACECDAILIAAoAggiASACNgIMIAIgATYCCAwBCyAAQRRqIABBEGogAhshBANAIAQhBSABIgJBFGogAkEQaiACKAIUIgEbIQQgAkEUQRAgARtqKAIAIgENAAsgBUEANgIACyADRQ0CAkAgACgCHEECdEHE1cAAaiIBKAIAIABHBEAgAygCECAARg0BIAMgAjYCFCACDQMMBAsgASACNgIAIAJFDQQMAgsgAyACNgIQIAINAQwCCyAAKAIIIgAgAkcEQCAAIAI2AgwgAiAANgIIDwtB3NjAAEHc2MAAKAIAQX4gAUEDdndxNgIADwsgAiADNgIYIAAoAhAiAQRAIAIgATYCECABIAI2AhgLIAAoAhQiAEUNACACIAA2AhQgACACNgIYDwsPC0Hg2MAAQeDYwAAoAgBBfiAAKAIcd3E2AgAL+QICBH8BfiMAQSBrIgIkAAJAAkACQCAAKAIAIgNFDQAgACgCCCIBIAAoAgRPDQACQAJAAkAgASADaiIDLQAAQcIARgRAIAAgAUEBajYCCCACIAAQXCACKAIADQEgACgCECIBRQ0CQdyrwABBzKvAACACLQAEQQFxIgMbQRlBECADGyABEMMBRQ0CQQIhAQwGCyADLQAAQckARw0DIAAgAUEBajYCCEECIQEgAEEAEBJFDQQMBQsgACgCEEUNASAAKQIAIQUgACACKQIANwIAIAJBGGoiAyAAQQhqIgEpAgA3AwAgASACQQhqKQIANwIAIAIgBTcDECAAEDMgASADKQMANwIAIAAgAikDEDcCAEH/AXEhAQwECyAAIAIpAgA3AgAgAEEIaiACQQhqKQIANwIAC0EAIQEMAgtBAkEAIABBABASGyEBDAELIAAoAhAiAwRAQYCmwABBASADEMMBDQELQQJBASAAEDlBAXEbIQELIAJBIGokACABC/MCAgd/A34jAEEQayIEJAAgASgCACEGAkACQCABKAIIIgIgASgCBCIHSQRAIAIgBmotAABB3wBGDQELIAIgByACIAdLGyEIAkADQAJAIAIgB0kEQCACIAZqLQAAQd8ARg0DCyACIAhGDQACQCACIAZqLQAAIgVBMGsiA0H/AXFBCkkNACAFQeEAa0H/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AgQiBCgCECIBEQAADQAaIAJBBGogACgCAEGBAhAfAkAgAi0ABEGAAUYEQCADIAIoAgggAREAAEUNAUEBDAILIAMgAi0ADiIAIAJBBGpqIAItAA8gAGsgBCgCDBEBAEUNAEEBDAELIANBJyABEQAACyACQRBqJAALlQEBA38CfwJAAkAgASgCACIDRQRADAELA0ACQCABKAIIIgQgASgCBE8NACADIARqLQAAQcUARw0AIAEgBEEBajYCCAwCCwJAIAJFDQAgASgCECIDRQ0AQf2rwABBAiADEMMBDQMLIAEQFg0CIAJBAWohAiABKAIAIgMNAAsLQQAMAQtBAQshASAAIAI2AgQgACABNgIAC5kBAQJ/IwBBIGsiASQAAkAgACgCBEECRw0AAkACQCAALQAYQQFrDgICAAELIAFBATYCCCABQaSHwAA2AgQgAUIANwIQIAEgAUEcajYCDCABQQRqQYiIwAAQfAALIABBCGoQSyAAKAIIIgJFDQAgACgCDCACQQxsQQQQqAELIAAoAhwiAgRAIAAoAiAgAkEBEKgBCyABQSBqJAALlAEBAn8jAEEgayIDJAACQCAAKAIEIgRBA0YgBEECSXINAAJAAkAgAC0AGEEBaw4CAgABCyADQQE2AgggA0Gkh8AANgIEIANCADcCECADIANBHGo2AgwgA0EEakGIiMAAEHwACyAAQQhqEEsgACgCCCIERQ0AIAAoAgwgBEEMbEEEEKgBCyAAQShBBBCoASADQSBqJAALhAEBA38CfwJAIAAoAgAiAUUNAANAAkAgACgCCCIDIAAoAgRPDQAgASADai0AAEHFAEcNACAAIANBAWo2AggMAgsCQCACRQ0AIAAoAhAiAUUNAEH9q8AAQQIgARDDAUUNAEEBDwtBASAAQQEQEw0CGiACQQFrIQIgACgCACIBDQALC0EACwt6AQF/IwBBIGsiAiQAAn8gACgCAEGAgICAeEcEQCABIAAoAgQgACgCCBCRAQwBCyACQRBqIAAoAgwoAgAiAEEIaikCADcDACACQRhqIABBEGopAgA3AwAgAiAAKQIANwMIIAEoAgAgASgCBCACQQhqECYLIAJBIGokAAt7AQF/IwBBQGoiBSQAIAUgATYCDCAFIAA2AgggBSADNgIUIAUgAjYCECAFQQI2AhwgBUHUvcAANgIYIAVCAjcCJCAF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AEEEayEAIAhC/6ziBFYgByEIDQALCyAHQglWBEAgACADakELaiAHpyICIAJB//8DcUHkAG4iAkHkAGxrQf//A3FBAXQiBEGSvsAAai0AADoAACAAQQJrIgAgA0EMamogBEGRvsAAai0AADoAACACrSEHCyAJUEUgB1BxRQRAIABBAWsiACADQQxqaiAHp0EBdEEecUGSvsAAai0AADoAAAsgAUEBQQAgA0EMaiAAakEUIABrECAgA0EgaiQACw0AIABBpIrAACABECYLCgAgACABIAIQJgsOACABQbCMwABBBRCRAQvCAwIGfwF+IAAoAgAhACMAQdAAayICJAAgAkEgaiAAIAAoAgAoAgQRAgAgAiACQcgAaq1CgICAgIAEhDcDKEEBIQMgAkEBNgI0IAJBlI7AADYCMCACQgE3AjwgAiACKQMgNwJIIAIgAkEoajYCOAJAIAEoAgAiBiABKAIEIgcgAkEwahAmDQAgAS0ACkGAAXFFBEBBACEDDAELIAJBGGogACAAKAIAKAIEEQIAIAJBEGogAigCGCACKAIcKAIYEQIAIAIoAhAiBEUEQEEAIQMMAQsgAkEIaiAEIAIoAhQiBSgCGBECACACKAIMIQEgAigCCCEAIAIgBTYCLCACIAQ2AiggAkEBNgI0IAJBoI7AADYCMCACQgE3AjwgAiACQShqrUKAgICAgASEIgg3A0ggAiACQcgAajYCOCAGIAcgAkEwahCxAQ0AA0AgAEUEQEEAIQMMAgsgAiAAIAEoAhgRAgAgAigCBCACKAIAIAIgATYCLCACIAA2AiggAkEBNgI0IAJBoI7AADYCMCACQgE3AjwgAiAINwNIIAIgAkHIAGo2AjghACEBIAYgByACQTBqELEBRQ0ACwsgAkHQAGokACADCw0AIABB2JHAACABECYLCQAgACABEA4ACykAAn8gACgCAC0AAEUEQCABQfS/wABBBRAjDAELIAFB+b/AAEEEECMLCw0AIABBtJfAACABECYLygECA38BfiAAKAIAIQIjAEGAAWsiBCQAAkAgASkCCCIFpyIAQYCAgARxRQ0AIABBgICAwABxBEAgAEGAgIAIciEADAELIAFBCjsBDCAAQYCAgMgAciEACyABIABBgICABHI2AghBACEAA0AgACAEakH/AGogAkEPcSIDQTByIANB1wBqIANBCkkbOgAAIABBAWshACACQQ9LIAJBBHYhAg0ACyABQY++wABBAiAAIARqQYABakEAIABrECAgASAFNwIIIARBgAFqJAALDAAgACABKQIANwMAC8IYAhN/AX4gACgCACEAIwBBIGsiECQAAn8gACgCAEUEQCAQQQA2AhwgECABNgIYIBBCADcCECAQIAApAgQ3AgggEEEIakEBEBIMAQsgASEKIwBBEGsiDSQAIAAoAgghEiAAKAIEIQ8gACgCACEIAkACQAJAA0AgFCIGIBJJIRMgBiASTw0CIAghAQJAAkAgD0UNACAGQQFqIgsgBiATGyEUIA9BAWshCCABLQAAIQRBACEDAkACQANAAkACQCAEwEEASARAIARBH3EhByABIANqIgJBAWotAABBP3EhBSAEQf8BcSIAQd8BSw0BIAdBBnQgBXIhAgwCCyAEQf8BcSECDAELIAJBAmotAABBP3EgBUEGdHIhBSAAQfABSQRAIAUgB0EMdHIhAgwBCyAHQRJ0QYCA8ABxIAJBA2otAABBP3EgBUEGdHJyIgJBgIDEAEYNBAsgAkEwa0EKSQRAIAMgCEYNBCABIANqIgBBAWosAAAiBEG/f0wNAiADQQFqIQMMAQsLIAMNAUEAIQAMBQsgACAPIANrIgBBASAAQcSkwAAQlAEACyABIANqIgksAABBv39KDQEgASAPQQAgA0HUpMAAEJQBAAtBtKTAABCuAQALIAEtAAAhCAJAAkACQAJAIANBAUYEQEEBIQAgASECIAhBK2sOAwYBBgELIAhBK0YEQCADQQFrIQAgAUEBaiECIANBCkkNAQwCCyABIQIgAyEAIANBCU8NAQtBACEFA0AgAi0AAEEwayIIQQlLDQIgAkEBaiECIAggBUEKbGohBSAAQQFrIgANAAsMAgtBACEFIAAhCANAIAhFDQIgAi0AAEEwayIOQQlLDQFBAiEAIAWtQgp+IhVCIIinDQQgAkEBaiECIAhBAWshCCAOIBWnIgdqIgUgB08NAAsMAwtBASEADAILIA8gBWshBwJAAkACQAJAIAVFDQAgDyADayIIIAVNBEAgAyAHRg0BDAQLIAEgBWogA2oiACwAAEFASA0DIAAsAABBv39MDQELIAEgBWogA2ohCCALIBJHDQEgBUUgCigCCEGAgIAEcUUgBEH/AXFB6ABHcnINAQJAIAVBAUcE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igAAABwAAAA0AhAAIAAAAI8AAAAgAAAAL3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9zdGQvc3JjL3RocmVhZC9sb2NhbC5ycwCkAhAATwAAABgCAAAmAAAAZGVzY3JpcHRpb24oKSBpcyBkZXByZWNhdGVkOyB1c2UgRGlzcGxheRoAAAAMAAAABAAAAAIAAAAaAAAADAAAAAQAAAADAAAAAgAAACwDEAAHAAAABQAAABsAAAAHAAAAHAAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGludmFsaWQgT25jZSBzdGF0ZWgDEAA8AAAAL3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9zdGQvc3JjL3N5cy9zeW5jL29uY2Uvbm9fdGhyZWFkcy5ycwCsAxAAWwAAADUAAAASAAAAL3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9hbGxvYy9zcmMvc2xpY2UucnMAABgEEABKAAAAvgEAAB0AAABzcGFyay1pbnRlcm5hbC1ycy9zcmMvbGliLnJzdAQQABwAAAAcAAAAMwAAAHQEEAAcAAAAJwAAAC0AAAABAAAAAAAAAHQEEAAcAAAAPwAAACgAAAAvcnVzdGMvNmIwMGJjMzg4MDE5ODYwMDEzMGUxY2Y2MmI4ZjhhOTM0OTQ0ODhjYy9saWJyYXJ5L2FsbG9jL3NyYy92ZWMvbW9kLnJzyAQQAEwAAABWCgAAJAAAAAAAAAAQAAAABAAAAB0AAAAeAAAAHwAAACAgICA6IAAAAQAAAAAAAABABRAAAgAAAAIAQd6KwAALAQUAQeiKwAALISAAAKggICAgICAgACIAAAAMAAAABAAAACMAAAAkAAAAJQBBlIvAAAu5DgEAAAAmAAAAYSBEaXNwbGF5IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yIHVuZXhwZWN0ZWRseS9ydXN0Yy82YjAwYmMzODgwMTk4NjAwMTMwZTFjZjYyYjhmOGE5MzQ5NDQ4OGNjL2xpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwAA0wUQAEsAAADwCgAADgAAAEVycm9yYXNzZXJ0aW9uIGZhaWxlZDogc2VsZi5pc19jaGFyX2JvdW5kYXJ5KG5ld19sZW4pAAAA0wUQAEsAAAC1BQAADQAAAAAAAAAQAAAABAAAAB0AAAAeAAAAHwAAAGJhY2t0cmFjZSBjYXB0dXJlIGZhaWxlZC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2FueWhvdy0xLjAuOTgvc3JjL2Vycm9yLnJzqAYQAFwAAABnBAAADgAAAAEAAAAAAAAAOiAAABwHEAACAAAACgpDYXVzZWQgYnk6CgAAADQHEAABAAAACgpzdGFjayBiYWNrdHJhY2U6U3RhY2sgYmFja3RyYWNlOgoAUgcQABEAAABTL3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9hbGxvYy9zcmMvcmF3X3ZlYy9tb2QucnMAAABtBxAAUAAAAC4CAAARAAAAL3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9pbmRleC5ycwDQBxAATwAAAEwDAAA0AAAA0AcQAE8AAABTAwAAMgAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuaXNfY2hhcl9ib3VuZGFyeShuKS9ydXN0Yy82YjAwYmMzODgwMTk4NjAwMTMwZTFjZjYyYjhmOGE5MzQ5NDQ4OGNjL2xpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwAAAGoIEABLAAAADAgAAB0AAABqCBAASwAAABQIAAAdAAAAJwAAAAwAAAAEAAAAKAAAACkAAAAlAAAAL3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9jb3JlL3NyYy9pdGVyL3RyYWl0cy9pdGVyYXRvci5yc/AIEABYAAAA0QcAAAkAAAAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9qcy1zeXMtMC4zLjc3L3NyYy9saWIucnMAAFgJEABaAAAA+xgAAAEAAAAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93YXNtLWJpbmRnZW4tMC4yLjEwMC9zcmMvY29udmVydC9zbGljZXMucnPECRAAbAAAACQBAAAOAAAAY2xvc3VyZSBpbnZva2VkIHJlY3Vyc2l2ZWx5IG9yIGFmdGVyIGJlaW5nIGRyb3BwZWRMYXp5IGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWRyChAAKgAAAC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL29uY2VfY2VsbC0xLjIxLjMvc3JjL2xpYi5ycwAAAKQKEABdAAAACAMAABkAAAByZWVudHJhbnQgaW5pdAAAFAsQAA4AAACkChAAXQAAAHoCAAANAAAAOiAAAAAAAAAEAAAABAAAADsAAAAvcnVzdGMvNmIwMGJjMzg4MDE5ODYwMDEzMGUxY2Y2MmI4ZjhhOTM0OTQ0ODhjYy9saWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjL21vZC5yc1ALEABQAAAALgIAABEAAAA6AAAAPAAAAAwAAAAEAAAAPQAAAD4AAAA/AAAAL3J1c3QvZGVwcy9kbG1hbGxvYy0wLjIuOC9zcmMvZGxtYWxsb2MucnNhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA+PSBzaXplICsgbWluX292ZXJoZWFkAMwLEAApAAAArAQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAADMCxAAKQAAALIEAAANAAAAbGlicmFyeS9zdGQvc3JjL3N5bmMvbGF6eV9sb2NrLnJzAAAAdAwQACEAAADRAAAAEwAAAGxpYnJhcnkvc3RkL3NyYy9iYWNrdHJhY2UucnMCAAAAAAAAAAIAQdiZwAALxQQgAIDgb3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybdwMEAAoAAAAJAAAAAIAAAAEDRAAdW5zdXBwb3J0ZWQgYmFja3RyYWNlZGlzYWJsZWQgYmFja3RyYWNlAKgMEAAcAAAAigEAAB0AAABAAAAAEAAAAAQAAABBAAAAQgAAAAEAAAAAAAAAY2Fubm90IHJlY3Vyc2l2ZWx5IGFjcXVpcmUgbXV0ZXhsDRAAIAAAAGxpYnJhcnkvc3RkL3NyYy9zeXMvc3luYy9tdXRleC9ub190aHJlYWRzLnJzlA0QACwAAAATAAAACQAAAGxpYnJhcnkvc3RkL3NyYy9zeW5jL3BvaXNvbi9vbmNlLnJzANANEAAjAAAAmwAAADIAAAA8dW5rbm93bj7vv71tZW1vcnkgYWxsb2NhdGlvbiBvZiAgYnl0ZXMgZmFpbGVkAAAQDhAAFQAAACUOEAANAAAAbGlicmFyeS9zdGQvc3JjL2FsbG9jLnJzRA4QABgAAABkAQAACQAAAAoAAAA8AAAADAAAAAQAAABDAAAAAAAAAAgAAAAEAAAARAAAAAAAAAAIAAAABAAAAEUAAABGAAAARwAAAEgAAABJAAAAEAAAAAQAAABKAAAASwAAAEwAAABNAAAAbGlicmFyeS9zdGQvc3JjLy4uLy4uL2JhY2t0cmFjZS9zcmMvc3ltYm9saXplL21vZC5yc8gOEAA0AAAAZwEAADAAAAABAAAAAAAAADwLEAACAAAAAgBBpp7AAAsBBABBsJ7AAAuFCSAAAOggLSAAAQAAAAAAAAA0DxAAAwAAAAIAAAAAAAAAAQAAAAEAAAAAAAAAIAAA6CAgICAgICAgICAgICAgICAgICBhdCAAALALEAABAAAAT25jZSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkAACADxAAKgAAAG9uZS10aW1lIGluaXRpYWxpemF0aW9uIG1heSBub3QgYmUgcGVyZm9ybWVkIHJlY3Vyc2l2ZWx5tA8QADgAAAAAKCkAAAAAAAQAAAAEAAAAUQAAAC9ydXN0Yy82YjAwYmMzODgwMTk4NjAwMTMwZTFjZjYyYjhmOGE5MzQ5NDQ4OGNjL2xpYnJhcnkvY29yZS9zcmMvb3BzL2Z1bmN0aW9uLnJzCBAQAFAAAACmAAAABQAAAC9ydXN0Yy82YjAwYmMzODgwMTk4NjAwMTMwZTFjZjYyYjhmOGE5MzQ5NDQ4OGNjL2xpYnJhcnkvY29y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rXh5i42iMFdYi4yQHN0OD0tM+/wuLz9cXV/ihI2OkZKpsbq7xcbJyt7k5f8ABBESKTE0Nzo7PUlKXYSOkqmxtLq7xsrOz+TlAAQNDhESKTE0OjtFRklKXmRlhJGbncnOzw0RKTo7RUlXW1xeX2RljZGptLq7xcnf5OXwDRFFSWRlgISyvL6/1dfw8YOFi6Smvr/Fx8/a20iYvc3Gzs9JTk9XWV5fiY6Psba3v8HGx9cRFhdbXPb3/v+AbXHe3w4fbm8cHV99fq6vTbu8FhceH0ZHTk9YWlxefn+1xdTV3PDx9XJzj3R1liYuL6evt7/Hz9ffmgBAl5gwjx/Oz9LUzv9OT1pbBwgPECcv7u9ubzc9P0JFkJFTZ3XIydDR2Nnn/v8AIF8igt8EgkQIGwQGEYGsDoCrBR8IgRwDGQgBBC8ENAQHAwEHBgcRClAPEgdVBwMEHAoJAwgDBwMCAwMDDAQFAwsGAQ4VBU4HGwdXBwIGFwxQBEMDLQMBBBEGDww6BB0lXyBtBGolgMgFgrADGgaC/QNZBxYJGAkUDBQMagYKBhoGWQcrBUYKLAQMBAEDMQssBBoGCwOArAYKBi8xgPQIPAMPAz4FOAgrBYL/ERgILxEtAyEPIQ+AjASCmhYLFYiUBS8FOwcCDhgJgL4idAyA1hqBEAWA4QnyngM3CYFcFIC4CIDdFTsDCgY4CEYIDAZ0Cx4DWgRZCYCDGBwKFglMBICKBqukDBcEMaEEgdomBwwFBYCmEIH1BwEgKgZMBICNBIC+AxsDDw1yYW5nZSBzdGFydCBpbmRleCAgb3V0IG9mIHJhbmdlIGZvciBzbGljZSBvZiBsZW5ndGggAAAAASkQABIAAAATKRAAIgAAAHJhbmdlIGVuZCBpbmRleCBIKRAAEAAAABMpEAAiAAAAc2xpY2UgaW5kZXggc3RhcnRzIGF0ICBidXQgZW5kcyBhdCAAaCkQABYAAAB+KRAADQAAAAADAACDBCAAkQVgAF0ToAASFyAfDCBgH+8sICsqMKArb6ZgLAKo4Cwe++AtAP4gNp7/YDb9AeE2AQohNyQN4TerDmE5LxjhOTAc4UrzHuFOQDShUh5h4VPwamFUT2/hVJ28YVUAz2FWZdGhVgDaIVcA4KFYruIhWuzk4VvQ6GFcIADuXPABf11AHhAAQh4QAEQeEAACAAAAAgAAAAcAAAAAAAA/AAAAvwBB3NTAAAsBNgB8CXByb2R1Y2VycwIIbGFuZ3VhZ2UBBFJ1c3QADHByb2Nlc3NlZC1ieQMFcnVzdGMdMS44OC4wICg2YjAwYmMzODggMjAyNS0wNi0yMykGd2FscnVzBjAuMjMuMwx3YXNtLWJpbmRnZW4TMC4yLjEwMCAoMjQwNWVjMmI0KQBrD3RhcmdldF9mZWF0dXJlcwYrD211dGFibGUtZ2xvYmFscysTbm9udHJhcHBpbmctZnB0b2ludCsLYnVsay1tZW1vcnkrCHNpZ24tZXh0Kw9yZWZlcmVuY2UtdHlwZXMrCm11bHRpdmFsdWU=", import.meta.url)); const A = JQ(); (typeof t == "string" || typeof Request == "function" && t instanceof Request || typeof URL == "function" && t instanceof URL) && (t = fetch(t)); const { instance: e, module: g } = await LQ(await t, A); return vQ(e, g); } const HA = -12, bQ = 9, _A = (bQ - HA) / 254, TQ = -30, Mt = Math.exp(TQ), HQ = 11, KQ = 11, P = 1 << HQ, It = 1 << KQ, Sg = 1; function ht(t) { return t === "bool" || t === "bvec2" || t === "bvec3" || t === "bvec4"; } function lt(t) { return t === "int" || t === "uint" || t === "float"; } function cA(t) { return t === "int" || t === "ivec2" || t === "ivec3" || t === "ivec4"; } function hA(t) { return t === "uint" || t === "uvec2" || t === "uvec3" || t === "uvec4"; } function Vt(t) { return t === "float" || t === "vec2" || t === "vec3" || t === "vec4"; } function Fg(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 it(t) { return Vt(t) || Fg(t); } function Gt(t) { return t === "vec2" || t === "ivec2" || t === "uvec2"; } function kt(t) { return t === "vec3" || t === "ivec3" || t === "uvec3"; } function Zt(t) { return t === "vec4" || t === "ivec4" || t === "uvec4"; } function qQ(t) { return Gt(t) || kt(t) || Zt(t); } function Qt(t) { return t === "mat2" || t === "mat2x2"; } function nt(t) { return t === "mat3" || t === "mat3x3"; } function Ct(t) { return t === "mat4" || t === "mat4x4"; } function Gg(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 kg(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 zQ(t) { if (lt(t)) return "float"; if (Gt(t)) return "vec2"; if (kt(t)) return "vec3"; if (Zt(t)) return "vec4"; throw new Error(`Invalid vector type: ${t}`); } function xg(t) { if (lt(t)) return "uint"; if (Gt(t)) return "uvec2"; if (kt(t)) return "uvec3"; if (Zt(t)) return "uvec4"; throw new Error(`Invalid vector type: ${t}`); } function VQ(t) { if (lt(t)) return "int"; if (Gt(t)) return "ivec2"; if (kt(t)) return "ivec3"; if (Zt(t)) return "ivec4"; throw new Error(`Invalid vector type: ${t}`); } function Rg(t) { if (typeof t == "string") return t; if (typeof t == "object" && t.type) return t.type; throw new Error(`Invalid DynoType: ${String(t)}`); } function sA(t) { return Math.trunc(t).toString(); } function BA(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 V(t) { return t instanceof st ? t.type : t.dynoOut().type; } class st { constructor(A) { this.__isDynoValue = !0, this.type = A; } } class q extends st { constructor(A, e) { super(A.outTypes[e]), this.dyno = A, this.key = e; } } class mt extends st { constructor(A, e) { super(A), this.literal = e; } getLiteral() { return this.literal; } } function Be(t, A) { return new mt(t, A); } class Ug 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 BA(e); case "int": return sA(e); case "float": return H(e); case "bvec2": { const g = e; return `bvec2(${g[0]}, ${g[1]})`; } case "uvec2": { if (e instanceof a.Vector2) return `uvec2(${BA(e.x)}, ${BA(e.y)})`; const g = e; return `uvec2(${BA(g[0])}, ${BA(g[1])})`; } case "ivec2": { if (e instanceof a.Vector2) return `ivec2(${sA(e.x)}, ${sA(e.y)})`; const g = e; return `ivec2(${sA(g[0])}, ${sA(g[1])})`; } case "vec2": { if (e instanceof a.Vector2) return `vec2(${H(e.x)}, ${H(e.y)})`; const g = e; return `vec2(${H(g[0])}, ${H(g[1])})`; } case "bvec3": { const g = e; return `bvec3(${g[0]}, ${g[1]}, ${g[2]})`; } case "uvec3": { if (e instanceof a.Vector3) return `uvec3(${BA(e.x)}, ${BA(e.y)}, ${BA(e.z)})`; const g = e; return `uvec3(${BA(g[0])}, ${BA(g[1])}, ${BA(g[2])})`; } case "ivec3": { if (e instanceof a.Vector3) return `ivec3(${sA(e.x)}, ${sA(e.y)}, ${sA(e.z)})`; const g = e; return `ivec3(${sA(g[0])}, ${sA(g[1])}, ${sA(g[2])})`; } case "vec3": { if (e instanceof a.Vector3) return `vec3(${H(e.x)}, ${H(e.y)}, ${H(e.z)})`; const g = e; return `vec3(${H(g[0])}, ${H(g[1])}, ${H(g[2])})`; } case "bvec4": { const g = e; return `bvec4(${g[0]}, ${g[1]}, ${g[2]}, ${g[3]})`; } case "uvec4": { if (e instanceof a.Vector4) return `uvec4(${BA(e.x)}, ${BA(e.y)}, ${BA(e.z)}, ${BA(e.w)})`; const g = e; return `uvec4(${BA(g[0])}, ${BA(g[1])}, ${BA(g[2])}, ${BA(g[3])})`; } case "ivec4": { if (e instanceof a.Vector4) return `ivec4(${sA(e.x)}, ${sA(e.y)}, ${sA(e.z)}, ${sA(e.w)})`; const g = e; return `ivec4(${sA(g[0])}, ${sA(g[1])}, ${sA(g[2])}, ${sA(g[3])})`; } case "vec4": { if (e instanceof a.Vector4) return `vec4(${H(e.x)}, ${H(e.y)}, ${H(e.z)}, ${H(e.w)})`; if (e instanceof a.Quaternion) return `vec4(${H(e.x)}, ${H(e.y)}, ${H(e.z)}, ${H(e.w)})`; const g = e; return `vec4(${H(g[0])}, ${H(g[1])}, ${H(g[2])}, ${H(g[3])})`; } case "mat2": case "mat2x2": { const g = e, I = g instanceof a.Matrix2 ? g.elements : e, s = new Array(4).fill(0).map((B, i) => H(I[i])); return `${A}(${s.join(", ")})`; } case "mat2x3": { const g = e, I = new Array(6).fill(0).map((s, B) => H(g[B])); return `${A}(${I.join(", ")})`; } case "mat2x4": { const g = e, I = new Array(8).fill(0).map((s, B) => H(g[B])); return `${A}(${I.join(", ")})`; } case "mat3": case "mat3x3": { const g = e, I = g instanceof a.Matrix3 ? g.elements : e, s = new Array(9).fill(0).map((B, i) => H(I[i])); return `${A}(${s.join(", ")})`; } case "mat3x2": { const g = e, I = new Array(6).fill(0).map((s, B) => H(g[B])); return `${A}(${I.join(", ")})`; } case "mat3x4": { const g = e, I = new Array(12).fill(0).map((s, B) => H(g[B])); return `${A}(${I.join(", ")})`; } case "mat4": case "mat4x4": { const g = e, I = g instanceof a.Matrix4 ? g.elements : e, s = new Array(16).fill(0).map((B, i) => H(I[i])); return `${A}(${s.join(", ")})`; } case "mat4x2": { const g = e, I = new Array(8).fill(0).map((s, B) => H(g[B])); return `${A}(${I.join(", ")})`; } case "mat4x3": { const g = e, I = new Array(12).fill(0).map((s, B) => H(g[B])); return `${A}(${I.join(", ")})`; } default: throw new Error(`Type not implemented: ${String(A)}`); } } } function K(t, A) { return new Ug(t, A); } function Lt(t) { const A = String(t); if (ht(t)) return `${A}(false)`; if (it(t)) return `${A}(0.0)`; if (cA(t)) return `${A}(0)`; if (hA(t)) return `${A}(0u)`; throw new Error(`Type not implemented: ${A}`); } function ZQ(t) { const A = String(t); if (ht(t)) return `${A}(true)`; if (it(t)) return `${A}(1.0)`; if (cA(t)) return `${A}(1)`; if (hA(t)) return `${A}(1u)`; throw new Error(`Type not implemented: ${A}`); } function jQ(t) { const A = String(t); if (ht(t)) return `${A}(true)`; if (it(t)) return `${A}(-1.0)`; if (cA(t)) return `${A}(-1)`; if (hA(t)) return `${A}(0xFFFFFFFFu)`; throw new Error(`Type not implemented: ${A}`); } const Bg = " "; class Yg { constructor({ indent: A } = {}) { this.globals = /* @__PURE__ */ new Set(), this.statements = [], this.uniforms = {}, this.declares = /* @__PURE__ */ new Set(), this.updaters = [], this.sequence = 0, this.indent = Bg, this.indent = A ?? Bg; } nextSequence() { return this.sequence++; } } class Z { constructor({ inTypes: A, outTypes: e, inputs: g, update: I, globals: s, statements: B, generate: i }) { this.inTypes = A ?? {}, this.outTypes = e ?? {}, this.inputs = g ?? {}, this.update = I, this.globals = s, this.statements = B, this.generate = i ?? (({ inputs: Q, outputs: C, compile: E }) => { var n, o; return { globals: (n = this.globals) == null ? void 0 : n.call(this, { inputs: Q, outputs: C, compile: E }), statements: (o = this.statements) == null ? void 0 : o.call(this, { inputs: Q, outputs: C, compile: E }) }; }); } 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: g }) { const I = [ `// ${this.constructor.name}(${Object.values(A).join(", ")}) => (${Object.values(e).join(", ")})` ], s = []; for (const C in e) { const E = e[C]; E && !g.declares.has(E) && (g.declares.add(E), s.push(C)); } const { globals: B, statements: i, uniforms: Q } = this.generate({ inputs: A, outputs: e, compile: g }); for (const C of B ?? []) g.globals.add(C); for (const C in Q) g.uniforms[C] = Q[C]; this.update && g.updaters.push(this.update); for (const C of s) { const E = e[C]; E && (g.uniforms[E] || I.push(`${Ve(E, this.outTypes[C])};`)); } return i != null && i.length && (I.push("{"), I.push(...i.map((C) => g.indent + C)), I.push("}")), I; } } class zA extends Z { constructor({ inTypes: A, outTypes: e, inputs: g, update: I, globals: s, construct: B }) { super({ inTypes: A, outTypes: e, inputs: g, update: I, globals: s, generate: (i) => this.generateBlock(i) }), this.construct = B; } generateBlock({ inputs: A, outputs: e, compile: g }) { var l, c; const I = {}, s = {}; 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 && (s[h] = new st(this.outTypes[h])); const B = { roots: [] }, i = this.construct(I, s, B); for (const h of ((l = this.globals) == null ? void 0 : l.call(this, { inputs: A, outputs: e, compile: g })) ?? []) g.globals.add(h); const Q = [], C = /* @__PURE__ */ new Map(); function E(h, u, D) { let w = C.get(h); if (!w) { w = { sequence: g.nextSequence(), outNames: /* @__PURE__ */ new Map(), newOuts: /* @__PURE__ */ new Set() }, C.set(h, w); for (const y in h.inputs) { let f = h.inputs[y]; for (; f; ) { if (f instanceof st) { f instanceof q && E(f.dyno, f.key); break; } f = f.dynoOut(); } } Q.push(h); } u && (D || w.newOuts.add(u), w.outNames.set(u, D ?? `${u}_${w.sequence}`)); } for (const h of B.roots) E(h); for (const h in s) { let u = (i == null ? void 0 : i[h]) ?? s[h]; for (; u; ) { if (u instanceof st) { u instanceof q && E(u.dyno, u.key, e[h]); break; } u = u.dynoOut(); } s[h] = u; } const n = []; for (const h of Q) { const u = {}, D = {}; for (const f in h.inputs) { let N = h.inputs[f]; for (; N; ) { if (N instanceof st) { if (N instanceof mt) u[f] = N.getLiteral(); else if (N instanceof q) { const M = (c = C.get(N.dyno)) == null ? void 0 : c.outNames.get(N.key); if (!M) throw new Error( `Source not found for ${N.dyno.constructor.name}.${N.key}` ); u[f] = M; } break; } N = N.dynoOut(); } } const w = C.get(h) ?? { outNames: /* @__PURE__ */ new Map() }; for (const [f, N] of w.outNames.entries()) D[f] = N; const y = h.compile({ inputs: u, outputs: D, compile: g }); n.push(y); } const o = []; for (const h in e) s[h] instanceof mt && o.push( `${e[h]} = ${s[h].getLiteral()};` ); return o.length > 0 && n.push(o), { statements: n.flatMap((h, u) => u === 0 ? h : ["", ...h]) }; } } function GA(t, A, e, { update: g, globals: I } = {}) { return new zA({ inTypes: t, outTypes: A, construct: e, update: g, globals: I }); } function jt({ inTypes: t, outTypes: A, inputs: e, update: g, globals: I, statements: s, generate: B }) { return new Z({ inTypes: t, outTypes: A, inputs: e, update: g, globals: I, statements: s, generate: B }); } function Ve(t, A, e) { const g = typeof A == "string" ? A : A.type; if (!g) throw new Error(`Invalid DynoType: ${String(A)}`); return `${g} ${t}${e != null ? `[${e}]` : ""}`; } function UA(t) { var s; let A = !1; const e = t.split(` `).map((B) => { const i = B.trimEnd(); return A ? i : i.length > 0 ? (A = !0, i) : null; }).filter((B) => B != null); for (; e.length > 0 && e[e.length - 1].length === 0; ) e.pop(); if (e.length === 0) return []; const g = (s = e[0].match(/^\s*/)) == null ? void 0 : s[0]; if (!g) return e; const I = new RegExp(`^${g}`); return e.map((B) => B.replace(I, "")); } function oA(t) { return UA(t).join(` `); } class F extends Z { constructor({ a: A, outKey: e, outTypeFunc: g }) { const I = { a: V(A) }, s = g(V(A)), B = { [e]: s }; super({ inTypes: I, outTypes: B, inputs: { a: A } }), this.outKey = e; } dynoOut() { return new q(this, this.outKey); } } class $ extends Z { constructor({ a: A, b: e, outKey: g, outTypeFunc: I }) { const s = { a: V(A), b: V(e) }, B = I(V(A), V(e)), i = { [g]: B }; super({ inTypes: s, outTypes: i, inputs: { a: A, b: e } }), this.outKey = g; } dynoOut() { return new q(this, this.outKey); } } class ut extends Z { constructor({ a: A, b: e, c: g, outKey: I, outTypeFunc: s }) { const B = { a: V(A), b: V(e), c: V(g) }, i = s(V(A), V(e), V(g)), Q = { [I]: i }; super({ inTypes: B, outTypes: Q, inputs: { a: A, b: e, c: g } }), this.outKey = I; } dynoOut() { return new q(this, this.outKey); } } const W = { type: "Gsplat" }, _t = { type: "PackedSplats" }, _Q = (t) => new Jg({ packedSplats: t }), Ht = (t, A) => new bg({ packedSplats: t, index: A }), Lg = (t, A, e, g) => new Tg({ packedSplats: t, index: A, base: e, count: g }), at = (t) => new Hg({ gsplat: t }), Bt = ({ gsplat: t, flags: A, index: e, center: g, scales: I, quaternion: s, rgba: B, rgb: i, opacity: Q, x: C, y: E, z: n, r: o, g: r, b: l }) => new Kg({ gsplat: t, flags: A, index: e, center: g, scales: I, quaternion: s, rgba: B, rgb: i, opacity: Q, x: C, y: E, z: n, r: o, g: r, b: l }), Re = (t) => new zg({ gsplat: t }), Ze = (t, { scale: A, rotate: e, translate: g, recolor: I }) => new Vg({ gsplat: t, scale: A, rotate: e, translate: g, recolor: I }), SA = oA(` 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; } `), he = oA(` struct PackedSplats { usampler2DArray texture; int numSplats; }; `); class Jg extends F { constructor({ packedSplats: A }) { super({ a: A, outKey: "numSplats", outTypeFunc: () => "int" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.numSplats} = ${e.a}.numSplats;` ]; } } const vg = oA(` 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 bg extends Z { constructor({ packedSplats: A, index: e }) { super({ inTypes: { packedSplats: _t, index: "int" }, outTypes: { gsplat: W }, inputs: { packedSplats: A, index: e }, globals: () => [SA, he, vg], statements: ({ inputs: g, outputs: I }) => { const { gsplat: s } = I; if (!s) return []; const { packedSplats: B, index: i } = g; let Q; return B && i ? Q = UA(` if (readPackedSplat(${B}.texture, ${B}.numSplats, ${i}, ${s})) { bool zeroSize = all(equal(${s}.scales, vec3(0.0, 0.0, 0.0))); ${s}.flags = zeroSize ? 0u : GSPLAT_FLAG_ACTIVE; } else { ${s}.flags = 0u; } `) : Q = [`${s}.flags = 0u;`], Q.push(`${s}.index = ${i ?? "0"};`), Q; } }); } dynoOut() { return new q(this, "gsplat"); } } class Tg extends Z { constructor({ packedSplats: A, index: e, base: g, count: I }) { super({ inTypes: { packedSplats: _t, index: "int", base: "int", count: "int" }, outTypes: { gsplat: W }, inputs: { packedSplats: A, index: e, base: g, count: I }, globals: () => [SA, he, vg], statements: ({ inputs: s, outputs: B }) => { const { gsplat: i } = B; if (!i) return []; const { packedSplats: Q, index: C, base: E, count: n } = s; let o; return Q && C && E && n ? o = UA(` ${i}.flags = 0u; if ((${C} >= ${E}) && (${C} < (${E} + ${n}))) { if (readPackedSplat(${Q}.texture, ${Q}.numSplats, ${C}, ${i})) { bool zeroSize = all(equal(${i}.scales, vec3(0.0, 0.0, 0.0))); ${i}.flags = zeroSize ? 0u : GSPLAT_FLAG_ACTIVE; } } `) : o = [`${i}.flags = 0u;`], o.push(`${i}.index = ${C ?? "0"};`), o; } }); } dynoOut() { return new q(this, "gsplat"); } } class Hg extends Z { constructor({ gsplat: A }) { super({ inTypes: { gsplat: W }, 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: () => [SA], statements: ({ inputs: e, outputs: g }) => { const { gsplat: I } = e, { flags: s, active: B, index: i, center: Q, scales: C, quaternion: E, rgba: n, rgb: o, opacity: r, x: l, y: c, z: h, r: u, g: D, b: w } = g; return [ s ? `${s} = ${I ? `${I}.flags` : "0u"};` : null, B ? `${B} = isGsplatActive(${I ? `${I}.flags` : "0u"});` : null, i ? `${i} = ${I ? `${I}.index` : "0"};` : null, Q ? `${Q} = ${I ? `${I}.center` : "vec3(0.0, 0.0, 0.0)"};` : null, C ? `${C} = ${I ? `${I}.scales` : "vec3(0.0, 0.0, 0.0)"};` : null, E ? `${E} = ${I ? `${I}.quaternion` : "vec4(0.0, 0.0, 0.0, 1.0)"};` : null, n ? `${n} = ${I ? `${I}.rgba` : "vec4(0.0, 0.0, 0.0, 0.0)"};` : null, o ? `${o} = ${I ? `${I}.rgba.rgb` : "vec3(0.0, 0.0, 0.0)"};` : null, r ? `${r} = ${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 Kg extends Z { constructor({ gsplat: A, flags: e, index: g, center: I, scales: s, quaternion: B, rgba: i, rgb: Q, opacity: C, x: E, y: n, z: o, r, g: l, b: c }) { super({ inTypes: { gsplat: W, 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: W }, inputs: { gsplat: A, flags: e, index: g, center: I, scales: s, quaternion: B, rgba: i, rgb: Q, opacity: C, x: E, y: n, z: o, r, g: l, b: c }, globals: () => [SA], statements: ({ inputs: h, outputs: u }) => { const { gsplat: D } = u; if (!D) return []; const { gsplat: w, flags: y, index: f, center: N, scales: M, quaternion: d, rgba: p, rgb: R, opacity: S, x: m, y: Y, z: G, r: k, g: U, b: J } = h; return [ `${D}.flags = ${y ?? (w ? `${w}.flags` : "0u")};`, `${D}.index = ${f ?? (w ? `${w}.index` : "0")};`, `${D}.center = ${N ?? (w ? `${w}.center` : "vec3(0.0, 0.0, 0.0)")};`, `${D}.scales = ${M ?? (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)")};`, R ? `${D}.rgba.rgb = ${R};` : null, S ? `${D}.rgba.a = ${S};` : null, m ? `${D}.center.x = ${m};` : null, Y ? `${D}.center.y = ${Y};` : null, G ? `${D}.center.z = ${G};` : null, k ? `${D}.rgba.r = ${k};` : null, U ? `${D}.rgba.g = ${U};` : null, J ? `${D}.rgba.b = ${J};` : null ].filter(Boolean); } }); } dynoOut() { return new q(this, "gsplat"); } } const qg = oA(` 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 zg extends F { constructor({ gsplat: A }) { super({ a: A, outKey: "normal", outTypeFunc: () => "vec3" }), this.globals = () => [SA, qg], this.statements = ({ inputs: e, outputs: g }) => [ `${g.normal} = gsplatNormal(${e.a}.scales, ${e.a}.quaternion);` ]; } } class Vg extends Z { constructor({ gsplat: A, scale: e, rotate: g, translate: I, recolor: s }) { super({ inTypes: { gsplat: W, scale: "float", rotate: "vec4", translate: "vec3", recolor: "vec4" }, outTypes: { gsplat: W }, inputs: { gsplat: A, scale: e, rotate: g, translate: I, recolor: s }, globals: () => [SA], statements: ({ inputs: B, outputs: i, compile: Q }) => { const { gsplat: C } = i; if (!C || !B.gsplat) return []; const { scale: E, rotate: n, translate: o, recolor: r } = B, l = Q.indent; return [ `${C} = ${B.gsplat};`, `if (isGsplatActive(${C}.flags)) {`, E ? `${l}${C}.center *= ${E};` : null, n ? `${l}${C}.center = quatVec(${n}, ${C}.center);` : null, o ? `${l}${C}.center += ${o};` : null, E ? `${l}${C}.scales *= ${E};` : null, n ? `${l}${C}.quaternion = quatQuat(${n}, ${C}.quaternion);` : null, r ? `${l}${C}.rgba *= ${r};` : null, "}" ].filter(Boolean); } }); } dynoOut() { return new q(this, "gsplat"); } } const Zg = (t) => new jg({ gsplat: t }), XQ = (t) => new je({ rgba8: t }); class jg extends Z { constructor({ gsplat: A }) { super({ inTypes: { gsplat: W }, inputs: { gsplat: A }, globals: () => [SA], statements: ({ inputs: e, outputs: g }) => { const { output: I } = g; if (!I) return []; const { gsplat: s } = e; return s ? UA(` if (isGsplatActive(${s}.flags)) { ${I} = packSplat(${s}.center, ${s}.scales, ${s}.quaternion, ${s}.rgba); } else { ${I} = uvec4(0u, 0u, 0u, 0u); } `) : [`${I} = uvec4(0u, 0u, 0u, 0u);`]; } }); } dynoOut() { return new q(this, "output"); } } class je extends Z { constructor({ rgba8: A }) { super({ inTypes: { rgba8: "vec4" }, inputs: { rgba8: A }, statements: ({ inputs: e, outputs: g }) => [ `target = ${e.rgba8 ?? "vec4(0.0, 0.0, 0.0, 0.0)"};` ] }); } dynoOut() { return new q(this, "rgba8"); } } const OQ = (t, A, e) => new x({ key: t, type: A, value: e }), PQ = (t = !1, A) => new ie({ key: A, value: t }), WQ = (t = 0, A) => new _g({ key: A, value: t }), $Q = (t = 0, A) => new Kt({ key: A, value: t }), bA = (t = 0, A) => new ot({ key: A, value: t }), An = (t, A) => new Xg({ key: A, value: t }), tn = (t, A) => new Og({ key: A, value: t }), en = (t, A) => new Pg({ key: A, value: t }), gn = (t, A) => new Wg({ key: A, value: t }), In = (t, A) => new $g({ key: A, value: t }), sn = (t, A) => new AI({ key: A, value: t }), Bn = (t, A) => new tI({ key: A, value: t }), At = (t, A) => new St({ key: A, value: t }), Qn = (t, A) => new eI({ key: A, value: t }), nn = (t, A) => new gI({ key: A, value: t }), Cn = (t, A) => new II({ key: A, value: t }), En = (t, A) => new Xt({ key: A, value: t }), an = (t, A) => new sI({ key: A, value: t }), on = (t, A) => new BI({ key: A, value: t }), rn = (t, A) => new iI({ key: A, value: t }), cn = (t, A) => new QI({ key: A, value: t }), hn = (t, A) => new nI({ key: A, value: t }), ln = (t, A) => new CI({ key: A, value: t }), un = (t, A) => new EI({ key: A, value: t }), wn = (t, A) => new aI({ key: A, value: t }), Dn = (t, A) => new oI({ key: A, value: t }), yn = (t, A) => new rI({ key: A, value: t }), pn = (t, A) => new cI({ key: A, value: t }), fn = (t, A) => new hI({ key: A, value: t }), dn = (t, A) => new lI({ key: A, value: t }), Mn = (t, A) => new uI({ key: A, value: t }), mn = (t, A) => new wI({ key: A, value: t }), Nn = (t, A) => new bt({ key: A, value: t }), Sn = (t, A) => new DI({ key: t, value: A }), Fn = (t, A) => new yI({ key: A, value: t }), Gn = (t, A) => new pI({ key: A, value: t }), kn = (t, A) => new fI({ key: A, value: t }), xn = (t, A) => new dI({ key: A, value: t }), Rn = (t, A) => new MI({ key: A, value: t }), Un = (t, A) => new mI({ key: A, value: t }), Yn = (t, A) => new NI({ key: A, value: t }), Ln = (t, A) => new SI({ key: A, value: t }), Jn = (t, A) => new FI({ key: A, value: t }), vn = (t, A) => new GI({ key: A, value: t }); class x extends Z { constructor({ key: A, type: e, count: g, value: I, update: s, globals: B }) { A = A ?? "value", super({ outTypes: { [A]: e }, update: () => { if (s) { const i = s(this.value); i !== void 0 && (this.value = i); } this.uniform.value = this.value; }, generate: ({ inputs: i, outputs: Q }) => { const C = (B == null ? void 0 : B({ inputs: i, outputs: Q })) ?? [], E = {}, n = Q[A]; return n && (C.push(`uniform ${Ve(n, e, g)};`), E[n] = this.uniform), { globals: C, uniforms: E }; } }), this.type = e, this.count = g, this.value = I, this.uniform = { value: I }, this.outKey = A; } dynoOut() { return new q(this, this.outKey); } } class ie extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "bool", value: e, update: g }); } } class _g extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "uint", value: e, update: g }); } } class Kt extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "int", value: e, update: g }); } } class ot extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "float", value: e, update: g }); } } class Xg extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "bvec2", value: e, update: g }); } } class Og extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "uvec2", value: e, update: g }); } } class Pg extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "ivec2", value: e, update: g }); } } class Wg extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "vec2", value: e, update: g }); } } class $g extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "bvec3", value: e, update: g }); } } class AI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "uvec3", value: e, update: g }); } } class tI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "ivec3", value: e, update: g }); } } class St extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "vec3", value: e, update: g }); } } class eI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "bvec4", value: e, update: g }); } } class gI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "uvec4", value: e, update: g }); } } class II extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "ivec4", value: e, update: g }); } } class Xt extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "vec4", value: e, update: g }); } } class sI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "mat2", value: e, update: g }); } } class BI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "mat2x2", value: e, update: g }); } } class iI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "mat2x3", value: e, update: g }); } } class QI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "mat2x4", value: e, update: g }); } } class nI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "mat3", value: e, update: g }); } } class CI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "mat3x2", value: e, update: g }); } } class EI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "mat3x3", value: e, update: g }); } } class aI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "mat3x4", value: e, update: g }); } } class oI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "mat4", value: e, update: g }); } } class rI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "mat4x2", value: e, update: g }); } } class cI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "mat4x3", value: e, update: g }); } } class hI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "mat4x4", value: e, update: g }); } } class lI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "usampler2D", value: e, update: g }); } } class uI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "isampler2D", value: e, update: g }); } } class wI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "sampler2D", value: e, update: g }); } } class bt extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "usampler2DArray", value: e, update: g }); } } class DI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "isampler2DArray", value: e, update: g }); } } class yI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "sampler2DArray", value: e, update: g }); } } class pI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "usampler3D", value: e, update: g }); } } class fI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "isampler3D", value: e, update: g }); } } class dI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "sampler3D", value: e, update: g }); } } class MI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "usamplerCube", value: e, update: g }); } } class mI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "isamplerCube", value: e, update: g }); } } class NI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "samplerCube", value: e, update: g }); } } class SI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "sampler2DShadow", value: e, update: g }); } } class FI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "sampler2DArrayShadow", value: e, update: g }); } } class GI extends x { constructor({ key: A, value: e, update: g }) { super({ key: A, type: "samplerCubeShadow", value: e, update: g }); } } const Ot = new Float32Array(1), le = new Uint32Array(Ot.buffer); function bn(t) { return Ot[0] = t, le[0]; } function Tn(t) { return le[0] = t, Ot[0]; } function rt(t) { Ot[0] = t; const A = le[0], e = A >> 31 & 1, g = A >> 23 & 255, I = A & 8388607, s = e << 15; if (g === 255) return I !== 0 ? s | 32767 : s | 31744; const B = g - 127 + 15; if (B >= 31) return s | 31744; if (B <= 0) { if (B < -10) return s; const Q = (I | 8388608) >> 1 - B + 13; return s | Q; } const i = I >> 13; return s | B << 10 | i; } function pA(t) { const A = t >> 15 & 1, e = t >> 10 & 31, g = t & 1023; let I; if (e === 0) if (g === 0) I = A << 31; else { let s = g, B = -14; for (; (s & 1024) === 0; ) s <<= 1, B--; s &= 1023; const i = B + 127, Q = s << 13; I = A << 31 | i << 23 | Q; } else if (e === 31) g === 0 ? I = A << 31 | 2139095040 : I = A << 31 | 2143289344; else { const s = e - 15 + 127, B = g << 13; I = A << 31 | s << 23 | B; } return le[0] = I, Ot[0]; } function FA(t) { return Math.max(0, Math.min(255, Math.round(t * 255))); } function ge(t) { return Math.max(-127, Math.min(127, Math.round(t * 127))); } function Hn(t) { return t / 255; } function Kn(t) { return t / 127; } class qn { // 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 g = await this.asyncFetch(A); for (this.items.push({ key: A, data: g }); this.items.length > this.maxItems; ) this.items.shift(); return g; } } function zn(t, A) { const e = Object.entries(t).map(([g, I]) => [ g, A(I, g) ]); return Object.fromEntries(e); } function Vn(t, A) { const e = Object.entries(t).map(([g, I]) => [g, A(I, g)]).filter(([g, I]) => I !== void 0); return Object.fromEntries(e); } function kI(t) { const A = [], e = /* @__PURE__ */ new Set(); function g(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(g) : Object.values(I).forEach(g)); } return g(t), A; } function Zn(t, A) { return new Array(t).fill(null).map((e, g) => A(g)); } class xI { 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: g }) { this.items = [], this.allocate = A, this.dispose = e, this.valid = g; } // 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 Ue(t, A, e, g, I, s, B, i, Q, C, E, n, o, r, l, c) { const h = FA(r), u = FA(l), D = FA(c), w = FA(o), y = _e( new a.Quaternion(Q, C, E, n) ), f = y & 255, N = y >>> 8 & 255, M = y >>> 16 & 255, d = s < Mt ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(s) - HA) / _A) + 1 ) ), p = B < Mt ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(B) - HA) / _A) + 1 ) ), R = i < Mt ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(i) - HA) / _A) + 1 ) ), S = rt(e), m = rt(g), Y = rt(I), G = A * 4; t[G] = h | u << 8 | D << 16 | w << 24, t[G + 1] = S | m << 16, t[G + 2] = Y | f << 16 | N << 24, t[G + 3] = d | p << 8 | R << 16 | M << 24; } function jn(t, A, e, g, I) { const s = rt(e), B = rt(g), i = rt(I), Q = A * 4; t[Q + 1] = s | B << 16, t[Q + 2] = i | t[Q + 2] & 4294901760; } function _n(t, A, e, g, I) { const s = e < Mt ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(e) - HA) / _A) + 1 ) ), B = g < Mt ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(g) - HA) / _A) + 1 ) ), i = I < Mt ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(I) - HA) / _A) + 1 ) ), Q = A * 4; t[Q + 3] = s | B << 8 | i << 16 | t[Q + 3] & 4278190080; } function Xn(t, A, e, g, I, s) { const B = _e( new a.Quaternion(e, g, I, s) ), i = B & 255, Q = B >>> 8 & 255, C = B >>> 16 & 255, E = A * 4; t[E + 2] = t[E + 2] & 65535 | i << 16 | Q << 24, t[E + 3] = t[E + 3] & 16777215 | C << 24; } function On(t, A, e, g, I, s) { const B = FA(e), i = FA(g), Q = FA(I), C = FA(s), E = A * 4; t[E] = B | i << 8 | Q << 16 | C << 24; } function Pn(t, A, e, g, I) { const s = FA(e), B = FA(g), i = FA(I), Q = A * 4; t[Q] = s | B << 8 | i << 16 | t[Q] & 4278190080; } function Wn(t, A, e) { const g = FA(e), I = A * 4; t[I] = t[I] & 16777215 | g << 24; } const $n = new a.Vector3(), AC = new a.Vector3(), tC = new a.Quaternion(), eC = new a.Color(), gC = { center: $n, scales: AC, quaternion: tC, color: eC, opacity: 0 }; function Ye(t, A) { const e = gC, g = A * 4, I = t[g], s = t[g + 1], B = t[g + 2], i = t[g + 3]; e.color.set( (I & 255) / 255, (I >>> 8 & 255) / 255, (I >>> 16 & 255) / 255 ), e.opacity = (I >>> 24 & 255) / 255, e.center.set( pA(s & 65535), pA(s >>> 16 & 65535), pA(B & 65535) ); const Q = i & 255; e.scales.x = Q === 0 ? 0 : Math.exp(HA + (Q - 1) * _A); const C = i >>> 8 & 255; e.scales.y = C === 0 ? 0 : Math.exp(HA + (C - 1) * _A); const E = i >>> 16 & 255; e.scales.z = E === 0 ? 0 : Math.exp(HA + (E - 1) * _A); const n = B >>> 16 & 65535 | i >>> 8 & 16711680; return bI(n, e.quaternion), e; } function dA(t) { const A = P, e = Math.max( Sg, Math.min(It, Math.ceil(t / A)) ), g = Math.ceil(t / (A * e)), I = A * e * g; return { width: A, height: e, depth: g, maxSplats: I }; } function IC(t) { const A = P, e = Math.max( Sg, Math.min(It, Math.ceil(t / A)) ), g = Math.ceil(t / (A * e)); return A * e * g; } function sC() { return navigator.maxTouchPoints > 0 ? !0 : /Mobi|Android|iPhone|iPad|iPod|Opera Mini|IEMobile/.test( navigator.userAgent ); } function BC() { return /Android/.test(navigator.userAgent); } function iC() { return /Oculus/.test(navigator.userAgent); } function QC(t, A, e) { const g = new Uint8Array(A * 4); for (let I = 0; I < e / 2; I++) { const s = I * A * 4, B = (e - 1 - I) * A * 4; g.set(t.subarray(s, s + A * 4)), t.set( t.subarray(B, B + A * 4), s ), t.set(g, B); } return t; } function nC(t, A, e) { const g = document.createElement("canvas"); g.width = A, g.height = e; const I = g.getContext("2d"); if (!I) throw new Error("Can't get 2d context"); const s = I.createImageData(A, e); return s.data.set(t), I.putImageData(s, 0, 0), g.toDataURL("image/png"); } function RI(t) { const A = new a.Clock(t.autoStart); return A.startTime = t.startTime, A.oldTime = t.oldTime, A.elapsedTime = t.elapsedTime, A.running = t.running, A; } function CC(t) { return Object.fromEntries( Object.entries(t).filter(([A, e]) => e !== void 0) ); } const UI = oA(` precision highp float; in vec3 position; void main() { gl_Position = vec4(position.xy, 0.0, 1.0); } `); function YI(t) { const A = new a.Vector3(); for (const e of t) A.add(e); return A.divideScalar(t.length); } function LI(t) { if (t.length === 0) return new a.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 JI(t, A) { const e = new a.Vector3(0, 0, 0).applyMatrix4(t), g = new a.Vector3(0, 0, 0).applyMatrix4(A), I = new a.Vector3(0, 0, -1).applyMatrix4(t).sub(e).normalize(), s = new a.Vector3(0, 0, -1).applyMatrix4(A).sub(g).normalize(), B = e.distanceTo(g), i = I.dot(s); return { distance: B, coincidence: i }; } function EC({ matrix1: t, matrix2: A, maxDistance: e }) { const g = new a.Vector3(0, 0, 0).applyMatrix4(t), I = new a.Vector3(0, 0, 0).applyMatrix4(A); return g.distanceTo(I) <= e; } function aC({ matrix1: t, matrix2: A, maxDistance: e, minCoincidence: g }) { const { distance: I, coincidence: s } = JI(t, A); return I <= e && (g == null || s >= g); } function vI(t, A) { const [e, g] = [new a.Vector3(), new a.Quaternion()], [I, s] = [new a.Vector3(), new a.Quaternion()]; t.decompose(e, g, new a.Vector3()), A.decompose(I, s, new a.Vector3()); const B = e.distanceTo(I), i = Math.abs(g.dot(s)); return { distance: B, coorient: i }; } function Qe({ matrix1: t, matrix2: A, maxDistance: e, minCoorient: g }) { const { distance: I, coorient: s } = vI(t, A); return I <= e && (g == null || s >= g); } function oC(t, A = 1e-3) { return Math.abs(t) < A ? 0 : Math.sign(t); } function rC(t) { const A = t.w < 0, e = ge(A ? -t.x : t.x), g = ge(A ? -t.y : t.y), I = ge(A ? -t.z : t.z), s = e & 255, B = g & 255, i = I & 255; return s | B << 8 | i << 16; } function cC(t, A) { const e = t << 24 >> 24, g = t << 16 >> 24, I = t << 8 >> 24; A.set(e / 127, g / 127, I / 127, 0); const s = A.x * A.x + A.y * A.y + A.z * A.z; return A.w = Math.sqrt(Math.max(0, 1 - s)), A; } function _e(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), g = Math.sqrt( A.x * A.x + A.y * A.y + A.z * A.z ), I = g < 1e-6 ? new a.Vector3(1, 0, 0) : new a.Vector3(A.x, A.y, A.z).divideScalar(g), s = Math.abs(I.x) + Math.abs(I.y) + Math.abs(I.z); let B = I.x / s, i = I.y / s; if (I.z < 0) { const r = B; B = (1 - Math.abs(i)) * (B >= 0 ? 1 : -1), i = (1 - Math.abs(r)) * (i >= 0 ? 1 : -1); } const Q = B * 0.5 + 0.5, C = i * 0.5 + 0.5, E = Math.round(Q * 255), n = Math.round(C * 255); return Math.round(e * (255 / Math.PI)) << 16 | n << 8 | E; } function bI(t, A) { const e = t & 255, g = t >>> 8 & 255, I = t >>> 16 & 255, s = e / 255, B = g / 255; let i = (s - 0.5) * 2, Q = (B - 0.5) * 2; const C = 1 - (Math.abs(i) + Math.abs(Q)), E = Math.max(-C, 0); i += i >= 0 ? -E : E, Q += Q >= 0 ? -E : E; const n = new a.Vector3(i, Q, C).normalize(), r = I / 255 * Math.PI * 0.5, l = Math.sin(r), c = Math.cos(r); return A.set(n.x * l, n.y * l, n.z * l, c), A; } function hC(t) { const A = t.clone().normalize(), e = 2 * (A.w * A.x + A.y * A.z), g = 1 - 2 * (A.x * A.x + A.y * A.y), I = Math.atan2(e, g), s = 2 * (A.w * A.y - A.z * A.x), B = Math.abs(s) >= 1 ? Math.sign(s) * (Math.PI / 2) : Math.asin(s), i = 2 * (A.w * A.z + A.x * A.y), Q = 1 - 2 * (A.y * A.y + A.z * A.z), C = Math.atan2(i, Q), E = (I + Math.PI) / (2 * Math.PI), n = (B + Math.PI) / (2 * Math.PI), o = (C + Math.PI) / (2 * Math.PI), r = Math.round(E * 255), l = Math.round(n * 255); return Math.round(o * 255) << 16 | l << 8 | r; } function lC(t, A) { const e = t & 255, g = t >>> 8 & 255, I = t >>> 16 & 255, s = e / 255, B = g / 255, i = I / 255, Q = s * (2 * Math.PI) - Math.PI, C = B * (2 * Math.PI) - Math.PI, E = i * (2 * Math.PI) - Math.PI, n = Math.cos(Q * 0.5), o = Math.sin(Q * 0.5), r = Math.cos(C * 0.5), l = Math.sin(C * 0.5), c = Math.cos(E * 0.5), h = Math.sin(E * 0.5); return A.w = n * r * c + o * l * h, A.x = o * r * c - n * l * h, A.y = n * l * c + o * r * h, A.z = n * r * h - o * l * c, A.normalize(), A; } function Wt(t, A, e, g) { const I = Math.max(-127, Math.min(127, t * 127)), s = Math.max(-127, Math.min(127, A * 127)), B = Math.max(-127, Math.min(127, e * 127)), i = Math.max(-127, Math.min(127, g * 127)); return I & 255 | (s & 255) << 8 | (B & 255) << 16 | (i & 255) << 24; } function uC(t, A, e) { const g = A * 2; for (let I = 0; I < 9; ++I) { const s = Math.max(-63, Math.min(63, e[I] * 63)) & 127, B = I * 7, i = B + 7, Q = Math.floor(B / 32), C = B - Q * 32, E = s << C & 4294967295; if (t[g + Q] |= E, i > Q * 32 + 32) { const n = s >>> 32 - C & 4294967295; t[g + Q + 1] |= n; } } } function wC(t, A, e) { t[A * 4 + 0] = Wt( e[0], e[1], e[2], e[3] ), t[A * 4 + 1] = Wt( e[4], e[5], e[6], e[7] ), t[A * 4 + 2] = Wt( e[8], e[9], e[10], e[11] ), t[A * 4 + 3] = Wt( e[12], e[13], e[14], 0 ); } function DC(t, A, e) { const g = A * 4; for (let I = 0; I < 21; ++I) { const s = Math.max(-31, Math.min(31, e[I] * 31)) & 63, B = I * 6, i = B + 6, Q = Math.floor(B / 32), C = B - Q * 32, E = s << C & 4294967295; if (t[g + Q] |= E, i > Q * 32 + 32) { const n = s >>> 32 - C & 4294967295; t[g + Q + 1] |= n; } } } function TI(t, A) { const e = []; let g = 0, I = null; const s = new Mg((Q, C) => { if (e.push(Q), g += Q.length, C || g >= A) { const E = new Uint8Array(g); let n = 0; for (const o of e) E.set(o, n), n += o.length; I = E.slice(0, A); } }), B = 1024; let i = 0; for (; I == null && i < t.length; ) { const Q = t.slice(i, i + B); s.push(Q, !1), i += B; } if (I == null && (s.push(new Uint8Array(), !0), I == null)) throw new Error("Failed to decompress partial gzip"); return I; } class HI { constructor({ fileBytes: A, chunkBytes: e = 64 * 1024 }) { this.fileBytes = A, this.chunkBytes = e, this.offset = 0, this.chunks = [], this.totalBytes = 0, this.gunzip = new Mg((g, I) => { this.chunks.push(g), this.totalBytes += g.length; }); } read(A) { for (; this.totalBytes < A && this.offset < this.fileBytes.length; ) { const s = Math.min( this.offset + this.chunkBytes, this.fileBytes.length ); this.gunzip.push(this.fileBytes.subarray(this.offset, s), !1), this.offset = s; } 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 g = 0; for (const s of this.chunks) e.set(s, g), g += s.length; const I = e.subarray(0, A); return this.chunks = [e.subarray(A)], this.totalBytes -= A, I; } } const wr = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, DataCache: qn, FreeList: xI, GunzipReader: HI, IDENT_VERTEX_SHADER: UI, Sint8ToFloat: Kn, Uint8ToFloat: Hn, averagePositions: YI, averageQuaternions: LI, cloneClock: RI, coinciDist: JI, computeMaxSplats: IC, coorientDist: vI, decodeQuatEulerXyz888: lC, decodeQuatOctXy88R8: bI, decodeQuatXyz888: cC, decompressPartialGzip: TI, encodeQuatEulerXyz888: hC, encodeQuatOctXy88R8: _e, encodeQuatXyz888: rC, encodeSh1Rgb: uC, encodeSh2Rgb: wC, encodeSh3Rgb: DC, epsilonSign: oC, flipPixels: QC, floatBitsToUint: bn, floatToSint8: ge, floatToUint8: FA, fromHalf: pA, getArrayBuffers: kI, getTextureSize: dA, isAndroid: BC, isMobile: sC, isOculus: iC, mapFilterObject: Vn, mapObject: zn, newArray: Zn, omitUndefined: CC, pixelsToPngUrl: nC, setPackedSplat: Ue, setPackedSplatCenter: jn, setPackedSplatOpacity: Wn, setPackedSplatQuat: Xn, setPackedSplatRgb: Pn, setPackedSplatRgba: On, setPackedSplatScales: _n, toHalf: rt, uintBitsToFloat: Tn, unpackSplat: Ye, withinCoinciDist: aC, withinCoorientDist: Qe, withinDist: EC }, Symbol.toStringTag, { value: "Module" })); class Xe { constructor({ graph: A, inputs: e, outputs: g, template: I }) { this.graph = A, this.template = I, this.inputs = e ?? {}, this.outputs = g ?? {}; const s = new Yg({ indent: this.template.indent }); for (const i in this.outputs) this.outputs[i] && s.declares.add(this.outputs[i]); const B = A.compile({ inputs: this.inputs, outputs: this.outputs, compile: s }); this.shader = I.generate({ globals: s.globals, statements: B }), this.uniforms = s.uniforms, this.updaters = s.updaters; } prepareMaterial() { return yC(this); } update() { for (const A of this.updaters) A(); } } class Oe { constructor(A) { const e = A.match(/^([ \t]*)\{\{\s*GLOBALS\s*\}\}/m), g = A.match(/^([ \t]*)\{\{\s*STATEMENTS\s*\}\}/m); if (!e || !g) 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, g.index ), this.after = A.substring( g.index + g[0].length ), this.indent = g[1]; } generate({ globals: A, statements: e }) { return this.before + Array.from(A).join(` `) + this.between + e.map((g) => this.indent + g).join(` `) + this.after; } } const ig = /* @__PURE__ */ new Map(); function yC(t) { let A = ig.get(t); return A || (A = new a.RawShaderMaterial({ glslVersion: a.GLSL3, vertexShader: UI, fragmentShader: t.shader, uniforms: t.uniforms }), ig.set(t, A), A); } function Pe(t, A, e = "add") { const g = () => { throw new Error(`Invalid ${e} types: ${t}, ${A}`); }; if (t === A) return t; if (t === "int") { if (cA(A)) return A; g(); } if (A === "int") { if (cA(t)) return t; g(); } if (t === "uint") { if (hA(A)) return A; g(); } if (A === "uint") { if (hA(t)) return t; g(); } if (t === "float") { if (it(A)) return A; g(); } if (A === "float") { if (it(t)) return t; g(); } throw new Error(`Invalid ${e} types: ${t}, ${A}`); } function pC(t, A) { return Pe(t, A, "sub"); } function fC(t, A) { const e = () => { throw new Error(`Invalid mul types: ${t}, ${A}`); }, g = (I) => I; if (t === "int") { if (cA(A)) return g(A); e(); } if (A === "int") { if (cA(t)) return g(t); e(); } if (t === "uint") { if (hA(A)) return g(A); e(); } if (A === "uint") { if (hA(t)) return g(t); e(); } if (t === "float") { if (it(A)) return g(A); e(); } if (A === "float") { if (it(t)) return g(t); e(); } if (cA(t) || hA(t) || cA(A) || hA(A)) { if (t === A) return g(t); e(); } if (t === "vec2") { if (A === "vec2" || Qt(A)) return g("vec2"); if (A === "mat3x2") return g("vec3"); if (A === "mat4x2") return g("vec4"); e(); } if (t === "vec3") { if (A === "mat2x3") return g("vec2"); if (A === "vec3" || nt(A)) return g("vec3"); if (A === "mat4x3") return g("vec4"); e(); } if (t === "vec4") { if (A === "mat2x4") return g("vec2"); if (A === "mat3x4") return g("vec3"); if (A === "vec4" || Ct(A)) return g("vec4"); e(); } if (A === "vec2") { if (Qt(t)) return g("vec2"); if (t === "mat2x3") return g("vec3"); if (t === "mat2x4") return g("vec4"); e(); } if (A === "vec3") { if (t === "mat3x2") return g("vec2"); if (nt(t)) return g("vec3"); if (t === "mat3x4") return g("vec4"); e(); } if (A === "vec4") { if (t === "mat4x2") return g("vec2"); if (t === "mat4x3") return g("vec3"); if (Ct(t)) return g("vec4"); e(); } if (Qt(t)) { if (Qt(A)) return g("mat2"); if (A === "mat3x2") return g("mat3x2"); if (A === "mat4x2") return g("mat4x2"); e(); } if (t === "mat2x3") { if (Qt(A)) return g("mat2x3"); if (A === "mat3x2") return g("mat3"); if (A === "mat4x2") return g("mat4x3"); e(); } if (t === "mat2x4") { if (Qt(A)) return g("mat2x4"); if (A === "mat3x2") return g("mat3x4"); if (A === "mat4x2") return g("mat4"); e(); } if (t === "mat3x2") { if (A === "mat2x3") return g("mat2"); if (nt(A)) return g("mat3x2"); if (A === "mat4x3") return g("mat4x2"); e(); } if (nt(t)) { if (A === "mat2x3") return g("mat2x3"); if (nt(A)) return g("mat3"); if (A === "mat4x3") return g("mat4x3"); e(); } if (t === "mat3x4") { if (A === "mat2x3") return g("mat2x4"); if (nt(A)) return g("mat3x4"); if (A === "mat4x3") return g("mat4"); e(); } if (t === "mat4x2") { if (A === "mat2x4") return g("mat2"); if (A === "mat3x4") return g("mat3x2"); if (Ct(A)) return g("mat4x2"); e(); } if (t === "mat4x3") { if (A === "mat2x4") return g("mat2x3"); if (A === "mat3x4") return g("mat3"); if (Ct(A)) return g("mat4x3"); e(); } if (Ct(t)) { if (A === "mat2x4") return g("mat2x4"); if (A === "mat3x4") return g("mat3x4"); if (Ct(A)) return g("mat4"); e(); } throw new Error(`Invalid mul types: ${t}, ${A}`); } function dC(t, A) { return Pe(t, A, "div"); } function MC(t, A) { if (t === A) return t; if (t === "int") { if (cA(A)) return A; } else if (A === "int") { if (cA(t)) return t; } else if (t === "uint") { if (hA(A)) return A; } else if (A === "uint" && hA(t)) return t; throw new Error(`Invalid imod types: ${t}, ${A}`); } function mC(t, A) { if (t === A || A === "float") return t; throw new Error(`Invalid mod types: ${t}, ${A}`); } function NC(t) { return t; } function SC(t) { return t; } function FC(t) { return t; } function GC(t) { return t; } function kC(t) { return t; } function xC(t) { return t; } function RC(t) { return t; } function UC(t) { return t; } function YC(t) { return t; } function LC(t) { return t; } function JC(t) { return t; } function vC(t) { return t; } function bC(t) { return t; } function TC(t) { return t; } function HC(t) { return t; } function KC(t) { return t; } function KI(t, A, e = "min") { if (t === A) return t; if (A === "float") { if (Vt(t)) return t; } else if (A === "int") { if (cA(t)) return t; } else if (A === "uint" && hA(t)) return t; throw new Error(`Invalid ${e} types: ${t}, ${A}`); } function qC(t, A) { return KI(t, A, "max"); } function zC(t, A, e) { if (A === "float") { if (Vt(t)) return t; } else if (A === "int") { if (cA(t)) return t; } else if (A === "uint" && hA(t)) return t; throw new Error(`Invalid clamp types: ${t}, ${A}`); } function VC(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 ZC(t, A) { if (t === A || A === "float") return A; throw new Error(`Invalid step types: ${t}, ${A}`); } function jC(t, A, e) { if (t === A && (t === e || t === "float")) return e; throw new Error(`Invalid smoothstep types: ${t}, ${A}, ${e}`); } function qI(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 _C(t) { return qI(t, "isInf"); } const fA = (t, A) => new jI({ a: t, b: A }), Ft = (t, A) => new _I({ a: t, b: A }), EA = (t, A) => new XI({ a: t, b: A }), Ie = (t, A) => new OI({ a: t, b: A }), Le = (t, A) => new PI({ a: t, b: A }), zI = (t, A) => new WI({ a: t, b: A }), XC = (t) => new $I({ a: t }).outputs, We = (t) => new As({ a: t }), OC = (t) => new ts({ a: t }), PC = (t) => new es({ a: t }), WC = (t) => new gs({ a: t }), $C = (t) => new Is({ a: t }), AE = (t) => new ss({ a: t }), tE = (t) => new Bs({ a: t }), se = (t) => new is({ a: t }), eE = (t, A) => new Qs({ a: t, b: A }), gE = (t) => new ns({ a: t }), IE = (t) => new Cs({ a: t }), sE = (t) => new Es({ a: t }), BE = (t) => new as({ a: t }), iE = (t) => new os({ a: t }), QE = (t) => new rs({ a: t }), nE = (t) => new cs({ a: t }), CE = (t, A) => new hs({ a: t, b: A }), VI = (t, A) => new ls({ a: t, b: A }), EE = (t, A, e) => new us({ a: t, min: A, max: e }), ZI = (t, A, e) => new ws({ a: t, b: A, t: e }), aE = (t, A) => new Ds({ edge: t, x: A }), oE = (t, A, e) => new ys({ edge0: t, edge1: A, x: e }), rE = (t) => new ps({ a: t }), cE = (t) => new fs({ a: t }); class jI extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "sum", outTypeFunc: Pe }), this.statements = ({ inputs: g, outputs: I }) => [`${I.sum} = ${g.a} + ${g.b};`]; } } class _I extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "difference", outTypeFunc: pC }), this.statements = ({ inputs: g, outputs: I }) => [`${I.difference} = ${g.a} - ${g.b};`]; } } class XI extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "product", outTypeFunc: fC }), this.statements = ({ inputs: g, outputs: I }) => [`${I.product} = ${g.a} * ${g.b};`]; } } class OI extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "quotient", outTypeFunc: dC }), this.statements = ({ inputs: g, outputs: I }) => [`${I.quotient} = ${g.a} / ${g.b};`]; } } class PI extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "remainder", outTypeFunc: MC }), this.statements = ({ inputs: g, outputs: I }) => [`${I.remainder} = ${g.a} % ${g.b};`]; } } class WI extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "remainder", outTypeFunc: mC }), this.statements = ({ inputs: g, outputs: I }) => [`${I.remainder} = mod(${g.a}, ${g.b});`]; } } class $I extends Z { constructor({ a: A }) { const e = { a: V(A) }, g = e.a, I = { fract: g, integer: g }; super({ inTypes: e, outTypes: I, inputs: { a: A } }), this.statements = ({ inputs: s, outputs: B }) => [`${B.fract} = modf(${s.a}, ${B.integer});`]; } } class As extends F { constructor({ a: A }) { super({ a: A, outKey: "neg", outTypeFunc: NC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.neg} = -${e.a};`]; } } class ts extends F { constructor({ a: A }) { super({ a: A, outKey: "abs", outTypeFunc: SC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.abs} = abs(${e.a});`]; } } class es extends F { constructor({ a: A }) { super({ a: A, outKey: "sign", outTypeFunc: FC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.sign} = sign(${e.a});`]; } } class gs extends F { constructor({ a: A }) { super({ a: A, outKey: "floor", outTypeFunc: GC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.floor} = floor(${e.a});`]; } } class Is extends F { constructor({ a: A }) { super({ a: A, outKey: "ceil", outTypeFunc: kC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.ceil} = ceil(${e.a});`]; } } class ss extends F { constructor({ a: A }) { super({ a: A, outKey: "trunc", outTypeFunc: xC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.trunc} = trunc(${e.a});`]; } } class Bs extends F { constructor({ a: A }) { super({ a: A, outKey: "round", outTypeFunc: RC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.round} = round(${e.a});`]; } } class is extends F { constructor({ a: A }) { super({ a: A, outKey: "fract", outTypeFunc: UC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.fract} = fract(${e.a});`]; } } class Qs extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "power", outTypeFunc: YC }), this.statements = ({ inputs: g, outputs: I }) => [`${I.power} = pow(${g.a}, ${g.b});`]; } } class ns extends F { constructor({ a: A }) { super({ a: A, outKey: "exp", outTypeFunc: LC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.exp} = exp(${e.a});`]; } } class Cs extends F { constructor({ a: A }) { super({ a: A, outKey: "exp2", outTypeFunc: JC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.exp2} = exp2(${e.a});`]; } } class Es extends F { constructor({ a: A }) { super({ a: A, outKey: "log", outTypeFunc: vC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.log} = log(${e.a});`]; } } class as extends F { constructor({ a: A }) { super({ a: A, outKey: "log2", outTypeFunc: bC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.log2} = log2(${e.a});`]; } } class os extends F { constructor({ a: A }) { super({ a: A, outKey: "sqr", outTypeFunc: TC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.sqr} = ${e.a} * ${e.a};`]; } } class rs extends F { constructor({ a: A }) { super({ a: A, outKey: "sqrt", outTypeFunc: HC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.sqrt} = sqrt(${e.a});`]; } } class cs extends F { constructor({ a: A }) { super({ a: A, outKey: "inversesqrt", outTypeFunc: KC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.inversesqrt} = inversesqrt(${e.a});`]; } } class hs extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "min", outTypeFunc: KI }), this.statements = ({ inputs: g, outputs: I }) => [`${I.min} = min(${g.a}, ${g.b});`]; } } class ls extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "max", outTypeFunc: qC }), this.statements = ({ inputs: g, outputs: I }) => [`${I.max} = max(${g.a}, ${g.b});`]; } } class us extends ut { constructor({ a: A, min: e, max: g }) { super({ a: A, b: e, c: g, outKey: "clamp", outTypeFunc: zC }), this.statements = ({ inputs: I, outputs: s }) => { const { a: B, b: i, c: Q } = I; return [`${s.clamp} = clamp(${B}, ${i}, ${Q});`]; }; } } class ws extends ut { constructor({ a: A, b: e, t: g }) { super({ a: A, b: e, c: g, outKey: "mix", outTypeFunc: VC }), this.statements = ({ inputs: I, outputs: s }) => { const { a: B, b: i, c: Q } = I; return [`${s.mix} = mix(${B}, ${i}, ${Q});`]; }; } } class Ds extends $ { constructor({ edge: A, x: e }) { super({ a: A, b: e, outKey: "step", outTypeFunc: ZC }), this.statements = ({ inputs: g, outputs: I }) => { const { a: s, b: B } = g; return [`${I.step} = step(${s}, ${B});`]; }; } } class ys extends ut { constructor({ edge0: A, edge1: e, x: g }) { super({ a: A, b: e, c: g, outKey: "smoothstep", outTypeFunc: jC }), this.statements = ({ inputs: I, outputs: s }) => { const { a: B, b: i, c: Q } = I; return [`${s.smoothstep} = smoothstep(${B}, ${i}, ${Q});`]; }; } } class ps extends F { constructor({ a: A }) { super({ a: A, outKey: "isNan", outTypeFunc: qI }), this.statements = ({ inputs: e, outputs: g }) => [`${g.isNan} = isNan(${e.a});`]; } } class fs extends F { constructor({ a: A }) { super({ a: A, outKey: "isInf", outTypeFunc: _C }), this.statements = ({ inputs: e, outputs: g }) => [`${g.isInf} = isInf(${e.a});`]; } } const hE = (t, A) => new Ms({ a: t, b: A }), lE = (t, A) => new ms({ a: t, b: A }), uE = (t, A) => new Ns({ a: t, b: A }), wE = (t) => new Ss({ a: t }), DE = (t, A) => new Fs({ a: t, b: A }), yE = (t, A) => new Gs({ a: t, b: A }), pE = (t, A) => new ks({ a: t, b: A }), ds = (t, A) => new xs({ a: t, b: A }), fE = (t, A) => new Rs({ a: t, b: A }), dE = (t, A) => new Us({ a: t, b: A }), ME = (t) => new Ys({ a: t }), mE = (t) => new Ls({ a: t }), $e = (t, A, e) => new Js({ cond: t, t: A, f: e }), NE = (t) => new bs({ a: t }); class Ms extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (g, I) => g, outKey: "and" }), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.and === "bool" ? [`${I.and} = ${g.a} && ${g.b};`] : [`${I.and} = ${g.a} & ${g.b};`]; } } class ms extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (g, I) => g, outKey: "or" }), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.or === "bool" ? [`${I.or} = ${g.a} || ${g.b};`] : [`${I.or} = ${g.a} | ${g.b};`]; } } class Ns extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (g, I) => g, outKey: "xor" }), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.xor === "bool" ? [`${I.xor} = ${g.a} ^^ ${g.b};`] : [`${I.xor} = ${g.a} ^ ${g.b};`]; } } class Ss extends F { constructor({ a: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "not" }), this.statements = ({ inputs: e, outputs: g }) => this.outTypes.not === "bool" ? [`${g.not} = !${e.a};`] : [`${g.not} = not(${e.a});`]; } } class Fs extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (g, I) => ue(g, "lessThan"), outKey: "lessThan" }), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.lessThan === "bool" ? [`${I.lessThan} = ${g.a} < ${g.b};`] : [`${I.lessThan} = lessThan(${g.a}, ${g.b});`]; } } class Gs extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (g, I) => ue(g, "lessThanEqual"), outKey: "lessThanEqual" }), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.lessThanEqual === "bool" ? [`${I.lessThanEqual} = ${g.a} <= ${g.b};`] : [ `${I.lessThanEqual} = lessThanEqual(${g.a}, ${g.b});` ]; } } class ks extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (g, I) => ue(g, "greaterThan"), outKey: "greaterThan" }), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.greaterThan === "bool" ? [`${I.greaterThan} = ${g.a} > ${g.b};`] : [ `${I.greaterThan} = greaterThan(${g.a}, ${g.b});` ]; } } class xs extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (g, I) => ue(g, "greaterThanEqual"), outKey: "greaterThanEqual" }), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.greaterThanEqual === "bool" ? [`${I.greaterThanEqual} = ${g.a} >= ${g.b};`] : [ `${I.greaterThanEqual} = greaterThanEqual(${g.a}, ${g.b});` ]; } } class Rs extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: vs, outKey: "equal" }), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.equal === "bool" ? [`${I.equal} = ${g.a} == ${g.b};`] : [`${I.equal} = equal(${g.a}, ${g.b});`]; } } class Us extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: SE, outKey: "notEqual" }), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.notEqual === "bool" ? [`${I.notEqual} = ${g.a} != ${g.b};`] : [`${I.notEqual} = notEqual(${g.a}, ${g.b});`]; } } class Ys extends F { constructor({ a: A }) { super({ a: A, outTypeFunc: (e) => "bool", outKey: "any" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.any} = any(${e.a});`]; } } class Ls extends F { constructor({ a: A }) { super({ a: A, outTypeFunc: (e) => "bool", outKey: "all" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.all} = all(${e.a});`]; } } class Js extends ut { constructor({ cond: A, t: e, f: g }) { super({ a: A, b: e, c: g, outKey: "select", outTypeFunc: (I, s, B) => s }), this.statements = ({ inputs: I, outputs: s }) => { const { a: B, b: i, c: Q } = I; return [`${s.select} = (${B}) ? (${i}) : (${Q});`]; }; } } function ue(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 vs(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 SE(t) { return vs(t, "notEqual"); } function FE(t) { if (ht(t)) return "bool"; if (cA(t)) return "int"; if (hA(t)) return "uint"; throw new Error(`Invalid compXor type: ${t}`); } class bs extends F { constructor({ a: A }) { const e = FE(V(A)); super({ a: A, outTypeFunc: (g) => e, outKey: "compXor" }), this.statements = ({ inputs: g, outputs: I }) => { if (lt(this.outTypes.compXor)) return [`${I.compXor} = ${g.a};`]; const B = (Gt(e) ? ["x", "y"] : kt(e) ? ["x", "y", "z"] : ["x", "y", "z", "w"]).map((Q) => `${g.a}.${Q}`), i = ht(e) ? "^^" : "^"; return [`${I.compXor} = ${B.join(` ${i} `)};`]; }; } } const GE = (t) => new Zs({ value: t }), kE = (t) => new js({ value: t }), xE = (t) => new _s({ value: t }), Ts = (t) => new Xs({ value: t }), RE = (t) => new Os({ value: t }), UE = (t) => new Ps({ value: t }), YE = (t) => new Ws({ value: t }), LE = (t) => new $s({ value: t }), JE = (t) => new AB({ value: t }), vE = (t) => new tB({ value: t }), bE = (t) => new eB({ value: t }), TE = (t) => new gB({ value: t }), HE = (t) => new IB({ value: t }), Hs = (t) => new sB({ value: t }), ct = (t) => new BB({ value: t }), Ks = (t) => new iB({ value: t }), KE = (t) => new QB({ value: t }), qE = (t) => new nB({ value: t }), zE = (t) => new CB({ value: t }), qs = (t) => new EB({ value: t }), VE = (t) => new aB({ value: t }), ZE = (t) => new oB({ value: t }), jE = (t) => new rB({ value: t }), _E = (t) => new cB({ value: t }), XE = (t) => new hB({ value: t }), OE = (t) => new lB({ value: t }), PE = (t) => new uB({ value: t }), zs = (t) => new wB({ value: t }), WE = (t) => new DB({ value: t }), Vs = (t) => new yB({ value: t }); class QA extends F { constructor({ value: A, outType: e, outKey: g }) { super({ a: A, outTypeFunc: () => e, outKey: g }), this.statements = ({ inputs: I, outputs: s }) => [ `${s[g]} = ${Rg(e)}(${I.a});` ]; } } class Zs extends QA { constructor({ value: A }) { super({ value: A, outType: "bool", outKey: "bool" }); } } class js extends QA { constructor({ value: A }) { super({ value: A, outType: "int", outKey: "int" }); } } class _s extends QA { constructor({ value: A }) { super({ value: A, outType: "uint", outKey: "uint" }); } } class Xs extends QA { constructor({ value: A }) { super({ value: A, outType: "float", outKey: "float" }); } } class Os extends QA { constructor({ value: A }) { super({ value: A, outType: "bvec2", outKey: "bvec2" }); } } class Ps extends QA { constructor({ value: A }) { super({ value: A, outType: "bvec3", outKey: "bvec3" }); } } class Ws extends QA { constructor({ value: A }) { super({ value: A, outType: "bvec4", outKey: "bvec4" }); } } class $s extends QA { constructor({ value: A }) { super({ value: A, outType: "ivec2", outKey: "ivec2" }); } } class AB extends QA { constructor({ value: A }) { super({ value: A, outType: "ivec3", outKey: "ivec3" }); } } class tB extends QA { constructor({ value: A }) { super({ value: A, outType: "ivec4", outKey: "ivec4" }); } } class eB extends QA { constructor({ value: A }) { super({ value: A, outType: "uvec2", outKey: "uvec2" }); } } class gB extends QA { constructor({ value: A }) { super({ value: A, outType: "uvec3", outKey: "uvec3" }); } } class IB extends QA { constructor({ value: A }) { super({ value: A, outType: "uvec4", outKey: "uvec4" }); } } class sB extends QA { constructor({ value: A }) { super({ value: A, outType: "vec2", outKey: "vec2" }); } } class BB extends QA { constructor({ value: A }) { super({ value: A, outType: "vec3", outKey: "vec3" }); } } class iB extends QA { constructor({ value: A }) { super({ value: A, outType: "vec4", outKey: "vec4" }); } } class QB extends QA { constructor({ value: A }) { super({ value: A, outType: "mat2", outKey: "mat2" }); } } class nB extends QA { constructor({ value: A }) { super({ value: A, outType: "mat3", outKey: "mat3" }); } } class CB extends QA { constructor({ value: A }) { super({ value: A, outType: "mat4", outKey: "mat4" }); } } class EB extends F { constructor({ value: A }) { super({ a: A, outKey: "int", outTypeFunc: () => "int" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.int} = floatBitsToInt(${e.a});`]; } } class aB extends F { constructor({ value: A }) { super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.uint} = floatBitsToUint(${e.a});`]; } } class oB extends F { constructor({ value: A }) { super({ a: A, outKey: "float", outTypeFunc: () => "float" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.float} = intBitsToFloat(${e.a});`]; } } class rB extends F { constructor({ value: A }) { super({ a: A, outKey: "float", outTypeFunc: () => "float" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.float} = uintBitsToFloat(${e.a});`]; } } class cB extends F { constructor({ value: A }) { super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.uint} = packSnorm2x16(${e.a});`]; } } class hB extends F { constructor({ value: A }) { super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.vec2} = unpackSnorm2x16(${e.a});`]; } } class lB extends F { constructor({ value: A }) { super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.uint} = packUnorm2x16(${e.a});`]; } } class uB extends F { constructor({ value: A }) { super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.vec2} = unpackUnorm2x16(${e.a});`]; } } class wB extends F { constructor({ value: A }) { super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.uint} = packHalf2x16(${e.a});`]; } } class DB extends F { constructor({ value: A }) { super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.vec2} = unpackHalf2x16(${e.a});`]; } } class yB extends F { constructor({ value: A }) { super({ a: A, outKey: "rgba8", outTypeFunc: () => "vec4" }), this.statements = ({ inputs: e, outputs: g }) => [ `uvec4 uRgba = uvec4(${e.a} & 0xffu, (${e.a} >> 8u) & 0xffu, (${e.a} >> 16u) & 0xffu, (${e.a} >> 24u) & 0xffu);`, `${g.rgba8} = vec4(uRgba) / 255.0;` ]; } } const $E = (t) => new MB({ a: t }), Aa = (t, A) => new mB({ a: t, b: A }), pB = (t, A) => new NB({ a: t, b: A }), ta = (t, A) => new SB({ a: t, b: A }), fB = (t) => new FB({ a: t }), ea = (t, A, e) => new xB({ a: t, b: A, c: e }), ga = (t, A) => new RB({ incident: t, normal: A }), Ia = (t, A, e) => new UB({ incident: t, normal: A, eta: e }), Nt = (t) => new TB({ vector: t }), KA = ({ vector: t, vectorType: A, x: e, y: g, z: I, w: s, r: B, g: i, b: Q, a: C }) => new HB({ vector: t, vectorType: A, x: e, y: g, z: I, w: s, r: B, g: i, b: Q, a: C }), sa = (t) => new GB({ a: t }), dB = (t, A) => new kB({ a: t, b: A }), Ba = (t, A) => new KB({ vector: t, select: A }), ia = (t, A) => new YB({ a: t, b: A }), Qa = (t, A) => new LB({ a: t, b: A }), na = (t) => new JB({ a: t }), Ca = (t) => new vB({ a: t }), Ea = (t) => new bB({ a: t }); class MB extends F { constructor({ a: A }) { super({ a: A, outTypeFunc: (e) => "float", outKey: "length" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.length} = length(${e.a});` ]; } } class mB extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "distance", outTypeFunc: (g, I) => "float" }), this.statements = ({ inputs: g, outputs: I }) => [ `${I.distance} = distance(${g.a}, ${g.b});` ]; } } class NB extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "dot", outTypeFunc: (g, I) => "float" }), this.statements = ({ inputs: g, outputs: I }) => [ `${I.dot} = dot(${g.a}, ${g.b});` ]; } } class SB extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "cross", outTypeFunc: (g, I) => "vec3" }), this.statements = ({ inputs: g, outputs: I }) => [ `${I.cross} = cross(${g.a}, ${g.b});` ]; } } class FB extends F { constructor({ a: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "normalize" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.normalize} = normalize(${e.a});` ]; } } function aa(t) { if (t === "vec3") return "vec2"; if (t === "vec4") return "vec3"; throw new Error("Invalid type"); } class GB extends F { constructor({ a: A }) { super({ a: A, outTypeFunc: (e) => aa(e), outKey: "projected" }), this.statements = ({ inputs: e, outputs: g }) => { if (this.inTypes.a === "vec3") return [`${g.projected} = ${e.a}.xy / ${e.a}.z;`]; if (this.inTypes.a === "vec4") return [`${g.projected} = ${e.a}.xyz / ${e.a}.w;`]; throw new Error("Invalid type"); }; } } function oa(t) { if (t === "float") return "vec2"; if (t === "vec2") return "vec3"; if (t === "vec3") return "vec4"; throw new Error("Invalid type"); } class kB extends $ { constructor({ a: A, b: e }) { const g = V(A), I = oa(g); super({ a: A, b: e, outKey: "extend", outTypeFunc: () => I }), this.statements = ({ inputs: s, outputs: B }) => [ `${B.extend} = ${I}(${s.a}, ${s.b});` ]; } } class xB extends ut { constructor({ a: A, b: e, c: g }) { super({ a: A, b: e, c: g, outKey: "forward", outTypeFunc: (I, s, B) => I }), this.statements = ({ inputs: I, outputs: s }) => [ `${s.forward} = faceforward(${I.a}, ${I.b}, ${I.c});` ]; } } class RB extends $ { constructor({ incident: A, normal: e }) { super({ a: A, b: e, outKey: "reflection", outTypeFunc: (g, I) => g }), this.statements = ({ inputs: g, outputs: I }) => [ `${I.reflection} = reflect(${g.a}, ${g.b});` ]; } } class UB extends ut { constructor({ incident: A, normal: e, eta: g }) { super({ a: A, b: e, c: g, outKey: "refraction", outTypeFunc: (I, s, B) => I }), this.statements = ({ inputs: I, outputs: s }) => [ `${s.refraction} = refract(${I.a}, ${I.b}, ${I.c});` ]; } } class YB extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "product", outTypeFunc: (g, I) => g }), this.statements = ({ inputs: g, outputs: I }) => [ `${I.product} = matrixCompMult(${A}, ${e});` ]; } } function ra(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 LB extends $ { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "outer", outTypeFunc: ra }), this.statements = ({ inputs: g, outputs: I }) => [ `${I.outer} = outerProduct(${g.a}, ${g.b});` ]; } } function ca(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 JB extends F { constructor({ a: A }) { super({ a: A, outKey: "transpose", outTypeFunc: ca }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.transpose} = transpose(${e.a});` ]; } } class vB extends F { constructor({ a: A }) { super({ a: A, outKey: "det", outTypeFunc: (e) => "float" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.det} = determinant(${e.a});` ]; } } class bB extends F { constructor({ a: A }) { super({ a: A, outKey: "inverse", outTypeFunc: (e) => e }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.inverse} = inverse(${A});` ]; } } function ha(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 TB extends Z { constructor({ vector: A }) { const g = { vector: V(A) }, I = ha(g.vector); super({ inTypes: g, outTypes: I, inputs: { vector: A } }), this.statements = ({ inputs: s, outputs: B }) => { const { x: i, y: Q, z: C, w: E, r: n, g: o, b: r, a: l } = B, { vector: c } = s; return [ i ? `${i} = ${c}.x;` : null, Q ? `${Q} = ${c}.y;` : null, C ? `${C} = ${c}.z;` : null, E ? `${E} = ${c}.w;` : null, n ? `${n} = ${c}.r;` : null, o ? `${o} = ${c}.g;` : null, r ? `${r} = ${c}.b;` : null, l ? `${l} = ${c}.a;` : null ].filter(Boolean); }; } } class HB extends Z { constructor({ vector: A, vectorType: e, x: g, y: I, z: s, w: B, r: i, g: Q, b: C, a: E }) { if (!A && !e) throw new Error("Either vector or vectorType must be provided"); const n = e ?? V(A), o = Gg(n), r = kg(n), l = { vector: n, x: o, y: o, r: o, g: o }, c = { vector: A, x: g, y: I, r: i, g: Q }; r >= 3 && (Object.assign(l, { z: o, b: o }), Object.assign(c, { z: s, b: C })), r >= 4 && (Object.assign(l, { w: o, a: o }), Object.assign(c, { w: B, a: E })), super({ inTypes: l, outTypes: { vector: n }, inputs: c }), this.statements = ({ inputs: h, outputs: u }) => { const { vector: D } = u, { vector: w, x: y, y: f, z: N, w: M, r: d, g: p, b: R, a: S } = h, m = [ `${D}.x = ${y ?? d ?? (w ? `${w}.x` : Lt(o))};`, `${D}.y = ${f ?? p ?? (w ? `${w}.y` : Lt(o))};` ]; return r >= 3 && m.push( `${D}.z = ${N ?? R ?? (w ? `${w}.z` : Lt(o))};` ), r >= 4 && m.push( `${D}.w = ${M ?? S ?? (w ? `${w}.w` : Lt(o))};` ), m; }; } dynoOut() { return new q( this, "vector" ); } } function la(t, A) { let e = null; if (Vt(t) ? e = A.length === 1 ? "float" : A.length === 2 ? "vec2" : A.length === 3 ? "vec3" : A.length === 4 ? "vec4" : null : cA(t) ? e = A.length === 1 ? "int" : A.length === 2 ? "ivec2" : A.length === 3 ? "ivec3" : A.length === 4 ? "ivec4" : null : hA(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 KB extends F { constructor({ vector: A, select: e }) { super({ a: A, outKey: "swizzle", outTypeFunc: (g) => la(g, e) }), this.statements = ({ inputs: g, outputs: I }) => [ `${I.swizzle} = ${g.a}.${e};` ]; } } const ua = (t, A, e) => new XB({ index: t, from: A, to: e }), wa = (t) => new xt({ value: t }), Da = (t) => new xA({ state: t }), ya = (t) => new RA({ state: t }), qB = (t) => new OB({ value: t }), zB = (t) => new PB({ value: t }), VB = (t) => new WB({ value: t }), ZB = (t) => new $B({ value: t }), pa = (t) => new Ai({ value: t }), fa = (t) => new ti({ value: t }), jB = (t) => new ei({ value: t }), Je = (t) => new gi({ value: t }), _B = (t, A, e) => new Ii({ z: t, zNear: A, zFar: e }).outputs.depth; class XB extends Z { constructor({ from: A, to: e, index: g }) { super({ inTypes: { from: "int", to: "int", index: "int" }, outTypes: { index: "int" }, inputs: { from: A, to: e, index: g }, statements: ({ inputs: I, outputs: s }) => [ `${s.index} = ${I.index} - ${I.from} + ${I.to};` ] }); } dynoOut() { return new q(this, "index"); } } class xA extends Z { constructor({ state: A }) { const e = V(A); super({ inTypes: { state: e }, outTypes: { state: "uint" }, inputs: { state: A }, globals: () => [ oA(` uint pcg_next(uint state) { return state * 747796405u + 2891336453u; } `) ], statements: ({ inputs: g, outputs: I }) => { const s = e === "uint" ? `${g.state}` : e === "int" ? `uint(${g.state})` : `floatBitsToUint(${g.state})`; return [`${I.state} = pcg_next(${s});`]; } }); } dynoOut() { return new q(this, "state"); } } class RA extends Z { constructor({ state: A }) { super({ inTypes: { state: "uint" }, outTypes: { hash: "uint" }, inputs: { state: A }, globals: () => [ oA(` uint pcg_hash(uint state) { uint hash = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u; return (hash >> 22u) ^ hash; } `) ], statements: ({ inputs: e, outputs: g }) => [ `${g.hash} = pcg_hash(${e.state});` ] }); } dynoOut() { return new q(this, "hash"); } } class xt extends Z { constructor({ value: A }) { const e = V(A), g = xg(e); super({ inTypes: { value: e }, outTypes: { state: "uint" }, inputs: { value: A }, globals: () => [ oA(` 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: s }) => { const B = hA(e) ? `${I.value}` : cA(e) ? `${g}(${I.value})` : `floatBitsToUint(${I.value})`; return [ `${g} bits = ${B};`, `${s.state} = pcg_mix(bits);` ]; } }); } dynoOut() { return new q(this, "state"); } } class OB extends zA { constructor({ value: A }) { super({ inTypes: { value: V(A) }, outTypes: { hash: "uint" }, inputs: { value: A }, construct: ({ value: e }) => { if (!e) throw new Error("value is required"); let g = new xt({ value: e }).outputs.state; return g = new xA({ state: g }).outputs.state, new RA({ state: g }).outputs; } }); } dynoOut() { return new q(this, "hash"); } } class PB extends zA { constructor({ value: A }) { super({ inTypes: { value: V(A) }, outTypes: { hash: "uvec2" }, inputs: { value: A }, construct: ({ value: e }) => { if (!e) throw new Error("value is required"); let g = new xt({ value: e }).outputs.state; g = new xA({ state: g }).outputs.state; const I = new RA({ state: g }).outputs.hash; g = new xA({ state: g }).outputs.state; const s = new RA({ state: g }).outputs.hash; return { hash: KA({ vectorType: "uvec2", x: I, y: s }) }; } }); } dynoOut() { return new q(this, "hash"); } } class WB extends zA { constructor({ value: A }) { super({ inTypes: { value: V(A) }, outTypes: { hash: "uvec3" }, inputs: { value: A }, construct: ({ value: e }) => { if (!e) throw new Error("value is required"); let g = new xt({ value: e }).outputs.state; g = new xA({ state: g }).outputs.state; const I = new RA({ state: g }).outputs.hash; g = new xA({ state: g }).outputs.state; const s = new RA({ state: g }).outputs.hash; g = new xA({ state: g }).outputs.state; const B = new RA({ state: g }).outputs.hash; return { hash: KA({ vectorType: "uvec3", x: I, y: s, z: B }) }; } }); } dynoOut() { return new q(this, "hash"); } } class $B extends zA { constructor({ value: A }) { super({ inTypes: { value: V(A) }, outTypes: { hash: "uvec4" }, inputs: { value: A }, construct: ({ value: e }) => { if (!e) throw new Error("value is required"); let g = new xt({ value: e }).outputs.state; g = new xA({ state: g }).outputs.state; const I = new RA({ state: g }).outputs.hash; g = new xA({ state: g }).outputs.state; const s = new RA({ state: g }).outputs.hash; g = new xA({ state: g }).outputs.state; const B = new RA({ state: g }).outputs.hash; g = new xA({ state: g }).outputs.state; const i = new RA({ state: g }).outputs.hash; return { hash: KA({ vectorType: "uvec4", x: I, y: s, z: B, w: i }) }; } }); } dynoOut() { return new q(this, "hash"); } } class Ai extends zA { constructor({ value: A }) { super({ inTypes: { value: V(A) }, outTypes: { hash: "float" }, inputs: { value: A }, construct: ({ value: e }) => { if (!e) throw new Error("value is required"); const g = qB(e); return { hash: EA(Ts(g), K("float", 1 / 2 ** 32)) }; } }); } dynoOut() { return new q(this, "hash"); } } class ti extends zA { constructor({ value: A }) { super({ inTypes: { value: V(A) }, outTypes: { hash: "vec2" }, inputs: { value: A }, construct: ({ value: e }) => { if (!e) throw new Error("value is required"); const g = zB(e); return { hash: EA(Hs(g), K("float", 1 / 2 ** 32)) }; } }); } dynoOut() { return new q(this, "hash"); } } class ei extends zA { constructor({ value: A }) { super({ inTypes: { value: V(A) }, outTypes: { hash: "vec3" }, inputs: { value: A }, construct: ({ value: e }) => { if (!e) throw new Error("value is required"); const g = VB(e); return { hash: EA(ct(g), K("float", 1 / 2 ** 32)) }; } }); } dynoOut() { return new q(this, "hash"); } } class gi extends zA { constructor({ value: A }) { super({ inTypes: { value: V(A) }, outTypes: { hash: "vec4" }, inputs: { value: A }, construct: ({ value: e }) => { if (!e) throw new Error("value is required"); const g = ZB(e); return { hash: EA(Ks(g), K("float", 1 / 2 ** 32)) }; } }); } dynoOut() { return new q(this, "hash"); } } class Ii extends Z { constructor({ z: A, zNear: e, zFar: g }) { super({ inTypes: { z: "float", zNear: "float", zFar: "float" }, outTypes: { depth: "float" }, inputs: { z: A, zNear: e, zFar: g }, statements: ({ inputs: I, outputs: s }) => [ `float clamped = clamp(${I.z}, ${I.zNear}, ${I.zFar});`, `${s.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 si = (t, { scale: A, scales: e, rotate: g, translate: I }) => new ii({ position: t, scale: A, scales: e, rotate: g, translate: I }).outputs.position, Bi = (t, { scale: A, scales: e, rotate: g }) => new Qi({ dir: t, scale: A, scales: e, rotate: g }).outputs.dir, da = (t, { rotate: A }) => new ni({ quaternion: t, rotate: A }).outputs.quaternion; class ii extends Z { constructor({ position: A, scale: e, scales: g, rotate: I, translate: s }) { super({ inTypes: { position: "vec3", scale: "float", scales: "vec3", rotate: "vec4", translate: "vec3" }, outTypes: { position: "vec3" }, inputs: { position: A, scale: e, scales: g, rotate: I, translate: s }, statements: ({ inputs: B, outputs: i }) => { const { position: Q } = i; if (!Q) return []; const { scale: C, scales: E, rotate: n, translate: o } = B; return [ `${Q} = ${B.position ?? "vec3(0.0, 0.0, 0.0)"};`, C ? `${Q} *= ${C};` : null, E ? `${Q} *= ${E};` : null, n ? `${Q} = quatVec(${n}, ${Q});` : null, o ? `${Q} += ${o};` : null ].filter(Boolean); } }); } } class Qi extends Z { constructor({ dir: A, scale: e, scales: g, rotate: I }) { super({ inTypes: { dir: "vec3", scale: "float", scales: "vec3", rotate: "vec4" }, outTypes: { dir: "vec3" }, inputs: { dir: A, scale: e, scales: g, rotate: I }, statements: ({ inputs: s, outputs: B }) => { const { dir: i } = B; if (!i) return []; const { scale: Q, scales: C, rotate: E } = s; return [ `${i} = ${s.dir ?? "vec3(0.0, 0.0, 0.0)"};`, Q ? `${i} *= ${Q};` : null, C ? `${i} *= ${C};` : null, E ? `${i} = quatVec(${E}, ${i});` : null ].filter(Boolean); } }); } } class ni extends Z { constructor({ quaternion: A, rotate: e }) { super({ inTypes: { quaternion: "vec4", rotate: "vec4" }, outTypes: { quaternion: "vec4" }, inputs: { quaternion: A, rotate: e }, statements: ({ inputs: g, outputs: I }) => { const { quaternion: s } = I; return s ? [ `${s} = ${g.quaternion ?? "vec4(0.0, 0.0, 0.0, 1.0)"};`, e ? `${s} = quatQuat(${g.rotate}, ${s});` : null ].filter(Boolean) : []; } }); } } const Ma = () => { throw new Error("Not implemented"); }, ma = () => { throw new Error("Not implemented"); }, Na = () => { throw new Error("Not implemented"); }, Sa = () => { throw new Error("Not implemented"); }, Fa = () => { throw new Error("Not implemented"); }, Ga = () => { throw new Error("Not implemented"); }, ka = (t, A) => new Ci({ texture: t, lod: A }), xa = (t, A, e) => new Ei({ texture: t, coord: A, bias: e }), Ra = (t, A, e) => new ai({ texture: t, coord: A, lod: e }); class Ci extends Z { constructor({ texture: A, lod: e }) { const g = V(A); super({ inTypes: { texture: g, lod: "int" }, outTypes: { size: oi(g) }, inputs: { texture: A, lod: e }, statements: ({ inputs: I, outputs: s }) => [ `${s.size} = textureSize(${I.texture}, ${I.lod ?? "0"});` ] }); } dynoOut() { return new q(this, "size"); } } class Ei extends Z { constructor({ texture: A, coord: e, bias: g }) { const I = V(A); super({ inTypes: { texture: I, coord: Ua(I), bias: "float" }, outTypes: { sample: ri(I) }, inputs: { texture: A, coord: e, bias: g }, statements: ({ inputs: s, outputs: B }) => [ `${B.sample} = texture(${s.texture}, ${s.coord}${s.bias ? `, ${s.bias}` : ""});` ] }); } dynoOut() { return new q(this, "sample"); } } class ai extends Z { constructor({ texture: A, coord: e, lod: g }) { const I = V(A); super({ inTypes: { texture: I, coord: oi(I), lod: "int" }, outTypes: { texel: ri(I) }, inputs: { texture: A, coord: e, lod: g }, statements: ({ inputs: s, outputs: B }) => [ `${B.texel} = texelFetch(${s.texture}, ${s.coord}, ${s.lod ?? "0"});` ] }); } dynoOut() { return new q(this, "texel"); } } function oi(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 Ua(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 ri(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 Ya = (t) => new ci({ degrees: t }), La = (t) => new hi({ radians: t }), ve = (t) => new li({ radians: t }), Ja = (t) => new ui({ radians: t }), va = (t) => new wi({ radians: t }), ba = (t) => new Di({ sin: t }), Ta = (t) => new yi({ cos: t }), Ha = (t) => new pi({ tan: t }), Ka = (t, A) => new fi({ y: t, x: A }), qa = (t) => new di({ x: t }), za = (t) => new Mi({ x: t }), Va = (t) => new mi({ x: t }), Za = (t) => new Ni({ x: t }), ja = (t) => new Si({ x: t }), _a = (t) => new Fi({ x: t }); class ci extends F { constructor({ degrees: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "radians" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.radians} = radians(${e.a});` ]; } } class hi extends F { constructor({ radians: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "degrees" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.degrees} = degrees(${e.a});` ]; } } class li extends F { constructor({ radians: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "sin" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.sin} = sin(${e.a});` ]; } } class ui extends F { constructor({ radians: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "cos" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.cos} = cos(${e.a});` ]; } } class wi extends F { constructor({ radians: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "tan" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.tan} = tan(${e.a});` ]; } } class Di extends F { constructor({ sin: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "asin" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.asin} = asin(${e.a});` ]; } } class yi extends F { constructor({ cos: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "acos" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.acos} = acos(${e.a});` ]; } } class pi extends F { constructor({ tan: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "atan" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.atan} = atan(${e.a});` ]; } } class fi extends $ { constructor({ y: A, x: e }) { super({ a: A, b: e, outTypeFunc: (g, I) => g, outKey: "atan2" }), this.statements = ({ inputs: g, outputs: I }) => [ `${I.atan2} = atan2(${g.a}, ${g.b});` ]; } } class di extends F { constructor({ x: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "sinh" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.sinh} = sinh(${e.a});` ]; } } class Mi extends F { constructor({ x: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "cosh" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.cosh} = cosh(${e.a});` ]; } } class mi extends F { constructor({ x: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "tanh" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.tanh} = tanh(${e.a});` ]; } } class Ni extends F { constructor({ x: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "asinh" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.asinh} = asinh(${e.a});` ]; } } class Si extends F { constructor({ x: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "acosh" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.acosh} = acosh(${e.a});` ]; } } class Fi extends F { constructor({ x: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "atanh" }), this.statements = ({ inputs: e, outputs: g }) => [ `${g.atanh} = atanh(${e.a});` ]; } } const Dr = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, Abs: ts, Acos: yi, Acosh: Si, Add: jI, All: Ls, And: Ms, Any: Ys, Asin: Di, Asinh: Ni, Atan: pi, Atan2: fi, Atanh: Fi, BVec2: Os, BVec3: Ps, BVec4: Ws, BinaryOp: $, Bool: Zs, Ceil: Is, Clamp: us, Combine: HB, CombineGsplat: Kg, CompMult: YB, CompXor: bs, Compilation: Yg, Cos: ui, Cosh: Mi, Cross: SB, Degrees: hi, Determinant: vB, Distance: mB, Div: OI, Dot: NB, Dyno: Z, DynoBlock: zA, DynoBool: ie, DynoBvec2: Xg, DynoBvec3: $g, DynoBvec4: eI, DynoConst: Ug, DynoFloat: ot, DynoInt: Kt, DynoIsampler2D: uI, DynoIsampler2DArray: DI, DynoIsampler3D: fI, DynoIsamplerCube: mI, DynoIvec2: Pg, DynoIvec3: tI, DynoIvec4: II, DynoLiteral: mt, DynoMat2: sI, DynoMat2x2: BI, DynoMat2x3: iI, DynoMat2x4: QI, DynoMat3: nI, DynoMat3x2: CI, DynoMat3x3: EI, DynoMat3x4: aI, DynoMat4: oI, DynoMat4x2: rI, DynoMat4x3: cI, DynoMat4x4: hI, DynoOutput: q, DynoProgram: Xe, DynoProgramTemplate: Oe, DynoRemapIndex: XB, DynoSampler2D: wI, DynoSampler2DArray: yI, DynoSampler2DArrayShadow: FI, DynoSampler2DShadow: SI, DynoSampler3D: dI, DynoSamplerCube: NI, DynoSamplerCubeShadow: GI, DynoUint: _g, DynoUniform: x, DynoUsampler2D: lI, DynoUsampler2DArray: bt, DynoUsampler3D: pI, DynoUsamplerCube: MI, DynoUvec2: Og, DynoUvec3: AI, DynoUvec4: gI, DynoValue: st, DynoVec2: Wg, DynoVec3: St, DynoVec4: Xt, Equal: Rs, Exp: ns, Exp2: Cs, ExtendVec: kB, FaceForward: xB, Float: Xs, FloatBitsToInt: EB, FloatBitsToUint: aB, Floor: gs, Fract: is, GreaterThan: ks, GreaterThanEqual: xs, Gsplat: W, GsplatNormal: zg, Hash: OB, Hash2: PB, Hash3: WB, Hash4: $B, HashFloat: Ai, HashVec2: ti, HashVec3: ei, HashVec4: gi, IMod: PI, IVec2: $s, IVec3: AB, IVec4: tB, Int: js, IntBitsToFloat: oB, Inverse: bB, InverseSqrt: cs, IsInf: fs, IsNan: ps, Length: MB, LessThan: Fs, LessThanEqual: Gs, Log: Es, Log2: as, Mat2: QB, Mat3: nB, Mat4: CB, Max: ls, Min: hs, Mix: ws, Mod: WI, Modf: $I, Mul: XI, Neg: As, Normalize: FB, NormalizedDepth: Ii, Not: Ss, NotEqual: Us, NumPackedSplats: Jg, Or: ms, Outer: LB, OutputPackedSplat: jg, OutputRgba8: je, PackHalf2x16: wB, PackSnorm2x16: cB, PackUnorm2x16: lB, PcgHash: RA, PcgMix: xt, PcgNext: xA, Pow: Qs, ProjectH: GB, Radians: ci, ReadPackedSplat: bg, ReadPackedSplatRange: Tg, ReflectVec: RB, RefractVec: UB, Round: Bs, Select: Js, Sign: es, SimpleCast: QA, Sin: li, Sinh: di, Smoothstep: ys, Split: TB, SplitGsplat: Hg, Sqr: os, Sqrt: rs, Step: Ds, Sub: _I, Swizzle: KB, TPackedSplats: _t, Tan: wi, Tanh: mi, TexelFetch: ai, Texture: Ei, TextureSize: Ci, TransformDir: Qi, TransformGsplat: Vg, TransformPosition: ii, TransformQuaternion: ni, Transpose: JB, TrinaryOp: ut, Trunc: ss, UVec2: eB, UVec3: gB, UVec4: IB, Uint: _s, UintBitsToFloat: rB, UintToRgba8: yB, UnaryOp: F, UnpackHalf2x16: DB, UnpackSnorm2x16: hB, UnpackUnorm2x16: uB, Vec2: sB, Vec3: BB, Vec4: iB, Xor: Ns, abs: OC, acos: Ta, acosh: ja, add: fA, all: mE, and: hE, any: ME, arrayIndex: Fa, arrayLength: Ga, asin: ba, asinh: Za, atan: Ha, atan2: Ka, atanh: _a, bool: GE, bvec2: RE, bvec3: UE, bvec4: YE, ceil: $C, clamp: EE, combine: KA, combineGsplat: Bt, comment: Sa, compMult: ia, compXor: NE, cos: Ja, cosh: za, cross: ta, defineGsplat: SA, defineGsplatNormal: qg, definePackedSplats: he, degrees: La, determinant: Ca, distance: Aa, div: Ie, dot: pB, dyno: jt, dynoBlock: GA, dynoBool: PQ, dynoBvec2: An, dynoBvec3: In, dynoBvec4: Qn, dynoConst: K, dynoDeclare: Ve, dynoFloat: bA, dynoFor: Na, dynoIf: Ma, dynoInt: $Q, dynoIsampler2D: Mn, dynoIsampler2DArray: Sn, dynoIsampler3D: kn, dynoIsamplerCube: Un, dynoIvec2: en, dynoIvec3: Bn, dynoIvec4: Cn, dynoLiteral: Be, dynoMat2: an, dynoMat2x2: on, dynoMat2x3: rn, dynoMat2x4: cn, dynoMat3: hn, dynoMat3x2: ln, dynoMat3x3: un, dynoMat3x4: wn, dynoMat4: Dn, dynoMat4x2: yn, dynoMat4x3: pn, dynoMat4x4: fn, dynoSampler2D: mn, dynoSampler2DArray: Fn, dynoSampler2DArrayShadow: Jn, dynoSampler2DShadow: Ln, dynoSampler3D: xn, dynoSamplerCube: Yn, dynoSamplerCubeShadow: vn, dynoSwitch: ma, dynoUint: WQ, dynoUsampler2D: dn, dynoUsampler2DArray: Nn, dynoUsampler3D: Gn, dynoUsamplerCube: Rn, dynoUvec2: tn, dynoUvec3: sn, dynoUvec4: nn, dynoVec2: gn, dynoVec3: At, dynoVec4: En, equal: fE, exp: gE, exp2: IE, extendVec: dB, faceforward: ea, float: Ts, floatBitsToInt: qs, floatBitsToUint: VE, floor: WC, fract: se, greaterThan: pE, greaterThanEqual: ds, gsplatNormal: Re, hash: qB, hash2: zB, hash3: VB, hash4: ZB, hashFloat: pa, hashVec2: fa, hashVec3: jB, hashVec4: Je, imod: Le, int: kE, intBitsToFloat: ZE, inverse: Ea, inversesqrt: nE, isAllFloatType: it, isBoolType: ht, isFloatType: Vt, isInf: cE, isIntType: cA, isMat2: Qt, isMat3: nt, isMat4: Ct, isMatFloatType: Fg, isNan: rE, isScalarType: lt, isUintType: hA, isVector2Type: Gt, isVector3Type: kt, isVector4Type: Zt, isVectorType: qQ, ivec2: LE, ivec3: JE, ivec4: vE, length: $E, lessThan: DE, lessThanEqual: yE, literalNegOne: jQ, literalOne: ZQ, literalZero: Lt, log: sE, log2: BE, mat2: KE, mat3: qE, mat4: zE, max: VI, min: CE, mix: ZI, mod: zI, modf: XC, mul: EA, neg: We, normalize: fB, normalizedDepth: _B, not: wE, notEqual: dE, numPackedSplats: _Q, numberAsFloat: H, numberAsInt: sA, numberAsUint: BA, or: lE, outer: Qa, outputPackedSplat: Zg, outputRgba8: XQ, packHalf2x16: zs, packSnorm2x16: _E, packUnorm2x16: OE, pcgHash: ya, pcgMix: wa, pcgNext: Da, pow: eE, projectH: sa, radians: Ya, readPackedSplat: Ht, readPackedSplatRange: Lg, reflectVec: ga, refractVec: Ia, remapIndex: ua, round: tE, sameSizeIvec: VQ, sameSizeUvec: xg, sameSizeVec: zQ, select: $e, sign: PC, sin: ve, sinh: qa, smoothstep: oE, split: Nt, splitGsplat: at, sqr: iE, sqrt: QE, step: aE, sub: Ft, swizzle: Ba, tan: va, tanh: Va, texelFetch: Ra, texture: xa, textureSize: ka, transformDir: Bi, transformGsplat: Ze, transformPos: si, transformQuat: da, transpose: na, trunc: AE, typeLiteral: Rg, uint: xE, uintBitsToFloat: jE, uintToRgba8: Vs, uniform: OQ, unindent: oA, unindentLines: UA, unpackHalf2x16: WE, unpackSnorm2x16: XE, unpackUnorm2x16: PE, uvec2: bE, uvec3: TE, uvec4: HE, valType: V, vec2: Hs, vec3: ct, vec4: Ks, vectorDim: kg, vectorElementType: Gg, xor: uE }, Symbol.toStringTag, { value: "Module" })); var Xa = `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 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 kA = class kA { 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 s = new ArrayBuffer(I); if (e instanceof ArrayBuffer) return s; const B = e.constructor; return new B(s); } // Ensure our render target is large enough for the readback of capacity indices. ensureCapacity(A) { const { width: e, height: g, depth: I, maxSplats: s } = dA(A); (!this.target || s > this.capacity) && (this.dispose(), this.capacity = s, this.target = new a.WebGLArrayRenderTarget(e, g, I, { depthBuffer: !1, stencilBuffer: !1, generateMipmaps: !1, magFilter: a.NearestFilter, minFilter: a.NearestFilter }), this.target.texture.format = a.RGBAFormat, this.target.texture.type = a.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 = kA.readbackProgram.get(A); if (!e) { const I = GA( { index: "int" }, { rgba8: "vec4" }, ({ index: s }) => (A.inputs.index = s, { rgba8: new je({ rgba8: A.outputs.rgba8 }) }) ); kA.programTemplate || (kA.programTemplate = new Oe(Xa)), e = new Xe({ graph: I, inputs: { index: "index" }, outputs: { rgba8: "target" }, template: kA.programTemplate }), Object.assign(e.uniforms, { targetLayer: { value: 0 }, targetBase: { value: 0 }, targetCount: { value: 0 } }), kA.readbackProgram.set(A, e); } const g = e.prepareMaterial(); return kA.fullScreenQuad.material = g, { program: e, material: g }; } 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 g = this.renderer; if (!g) 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 s = 0; for (; s < A; ) { const B = Math.floor(s / I), i = B * I, Q = Math.min( It, Math.ceil((A - i) / P) ); e.uniforms.targetLayer.value = B, this.target.scissor.set(0, 0, P, Q), g.setRenderTarget(this.target, B), g.xr.enabled = !1, g.autoClear = !1, kA.fullScreenQuad.render(g), s += P * Q; } 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 g = Math.ceil(this.count / P) * P; if (A.byteLength < g * 4) throw new Error( `Readback buffer too small: ${A.byteLength} < ${g * 4}` ); const I = new Uint8Array( A instanceof ArrayBuffer ? A : A.buffer ), s = P * It; let B = 0; const i = []; for (; B < this.count; ) { const Q = Math.floor(B / s), C = Q * s, E = Math.min( It, Math.ceil((this.count - C) / P) ); e.setRenderTarget(this.target, Q); const n = P * E * 4, o = I.subarray( C * 4, C * 4 + n ), r = e == null ? void 0 : e.readRenderTargetPixelsAsync( this.target, 0, 0, P, E, o ); i.push(r), B += P * E; } return Promise.all(i).then(() => A); } // Perform render operation to run the Rgba8Readback program // but don't perform the readback yet. render({ reader: A, count: e, renderer: g }) { if (this.renderer = g || this.renderer, !this.renderer) throw new Error("No renderer"); this.ensureCapacity(e); const { program: I, material: s } = this.prepareProgramMaterial(A); I.update(); const B = this.saveRenderState(this.renderer); this.process({ count: e, material: s }), this.resetRenderState(this.renderer, B); } // 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), g = this.read({ readback: A }); return this.resetRenderState(this.renderer, e), g; } // Perform a render and readback operation for the given Rgba8Readback, // and readback buffer (call ensureBuffer first). async renderReadback({ reader: A, count: e, renderer: g, readback: I }) { if (this.renderer = g || this.renderer, !this.renderer) throw new Error("No renderer"); this.ensureCapacity(e); const { program: s, material: B } = this.prepareProgramMaterial(A); s.update(); const i = this.saveRenderState(this.renderer); this.process({ count: e, material: B }); const Q = this.read({ readback: I }); return this.resetRenderState(this.renderer, i), Q; } getTexture() { var A; return (A = this.target) == null ? void 0 : A.texture; } }; kA.programTemplate = null, kA.readbackProgram = /* @__PURE__ */ new Map(), kA.fullScreenQuad = new hg( new a.RawShaderMaterial({ visible: !1 }) ); let ne = kA; const CA = class CA { constructor(A = {}) { this.capacity = 0, this.count = 0, this.array = null, this.readback = null, this.source = null, this.needsUpdate = !0, this.dyno = new x({ key: "rgbaArray", type: Gi, globals: () => [ki], value: { texture: CA.getEmpty(), count: 0 }, update: (e) => { var g; return e.texture = ((g = this.readback) == null ? void 0 : g.getTexture()) ?? this.source ?? CA.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 = dA(A).maxSplats; const g = new Uint8Array(this.capacity * 4); this.array && g.set(this.array), this.array = g; } 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 ?? CA.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: g } = this.source.image; this.capacity !== A * e * g && (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: g } = dA(this.capacity); this.source = new a.DataArrayTexture( this.array, A, e, g ), this.source.format = a.RGBAFormat, this.source.type = a.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: g }) { this.readback || (this.readback = new ne({ renderer: g })), this.readback.render({ reader: A, count: e, renderer: g }), this.capacity = this.readback.capacity, this.count = this.readback.count; } // Extract the RGBA8 values from a PackedSplats collection. fromPackedSplats({ packedSplats: A, base: e, count: g, renderer: I }) { const { dynoSplats: s, dynoBase: B, dynoCount: i, reader: Q } = CA.makeDynos(); return s.packedSplats = A, B.value = e, i.value = g, this.render({ reader: Q, count: g, 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 (!CA.emptySource) { const A = new Uint8Array(4); CA.emptySource = new a.DataArrayTexture(A, 1, 1, 1), CA.emptySource.format = a.RGBAFormat, CA.emptySource.type = a.UnsignedByteType, CA.emptySource.internalFormat = "RGBA8", CA.emptySource.needsUpdate = !0; } return CA.emptySource; } // Create a dyno program that can extract RGBA8 values from a PackedSplats static makeDynos() { if (!CA.dynos) { const A = new tg(), e = new Kt({ value: 0 }), g = new Kt({ value: 0 }), I = GA( { index: "int" }, { rgba8: "vec4" }, ({ index: s }) => { if (!s) throw new Error("index is undefined"); s = fA(s, e); const B = Lg( A, s, e, g ); return { rgba8: at(B).outputs.rgba }; } ); CA.dynos = { dynoSplats: A, dynoBase: e, dynoCount: g, reader: I }; } return CA.dynos; } }; CA.emptySource = null, CA.dynos = null; let be = CA; const Gi = { type: "RgbaArray" }, ki = oA(` struct RgbaArray { sampler2DArray texture; int count; }; `); function Oa(t, A) { return new Z({ inTypes: { rgba: Gi, index: "int" }, outTypes: { rgba: "vec4" }, inputs: { rgba: t, index: A }, globals: () => [ki], statements: ({ inputs: g, outputs: I }) => UA(` if ((index >= 0) && (index < ${g.rgba}.count)) { ${I.rgba} = texelFetch(${g.rgba}.texture, splatTexCoord(index), 0); } else { ${I.rgba} = vec4(0.0, 0.0, 0.0, 0.0); } `) }).outputs.rgba; } var Pa = /* @__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))(Pa || {}); function Wa(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 $a = /* @__PURE__ */ ((t) => (t.MULTIPLY = "multiply", t.SET_RGB = "set_rgb", t.ADD_RGBA = "add_rgba", t))($a || {}); function Ao(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 to extends a.Object3D { constructor(A = {}) { super(); const { type: e, invert: g, opacity: I, color: s, displace: B, radius: i } = A; this.type = e ?? "sphere", this.invert = g ?? !1, this.opacity = I ?? 1, this.color = s ?? new a.Color(1, 1, 1), this.displace = B ?? new a.Vector3(0, 0, 0), this.radius = i ?? 0; } } const ce = class ce extends a.Object3D { constructor(A = {}) { const { name: e, rgbaBlendMode: g = "multiply", sdfSmooth: I = 0, softEdge: s = 0, invert: B = !1, sdfs: i = null } = A; super(), this.rgbaBlendMode = g, this.sdfSmooth = I, this.softEdge = s, this.invert = B, this.sdfs = i, this.ordering = ce.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)); } }; ce.nextOrdering = 1; let Ce = ce; class eo { 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 x({ key: "sdfArray", type: xi, globals: () => [Ri], value: { numSdfs: 0, sdfTexture: this.sdfTexture }, update: (g) => (g.numSdfs = this.numSdfs, g.sdfTexture = this.sdfTexture, g) }), 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 Kt({ value: 0 }), this.dynoEdits = this.newEdits(this.editData, this.maxEdits); } newSdfTexture(A, e) { const g = new a.DataTexture( A, 8, e, a.RGBAIntegerFormat, a.UnsignedIntType ); return g.internalFormat = "RGBA32UI", g.needsUpdate = !0, g; } newEdits(A, e) { return new x({ key: "edits", type: "uvec4", count: e, globals: () => [Ui], value: A }); } // Ensure our SDF texture and edits uniform array have enough capacity. // Reallocate if not. ensureCapacity({ maxSdfs: A, maxEdits: e }) { let g = !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), g = !0), g; } updateEditData(A, e) { const g = this.editData[A] !== e; return this.editData[A] = e, g; } updateEditFloatData(A, e) { wt[0] = e; const g = this.editFloatData[A] !== wt[0]; return g && (this.editFloatData[A] = wt[0]), g; } encodeEdit(A, { sdfFirst: e, sdfCount: g, invert: I, rgbaBlendMode: s, softEdge: B, sdfSmooth: i }) { const Q = A * 4; let C = !1; return C = this.updateEditData(Q + 0, s | (I ? 256 : 0)) || C, C = this.updateEditData(Q + 1, e | g << 16) || C, C = this.updateEditFloatData(Q + 2, B) || C, C = this.updateEditFloatData(Q + 3, i) || C, C; } updateSdfData(A, e) { const g = this.sdfData[A] !== e; return this.sdfData[A] = e, g; } updateSdfFloatData(A, e) { wt[0] = e; const g = this.sdfFloatData[A] !== wt[0]; return g && (this.sdfFloatData[A] = wt[0]), g; } encodeSdf(A, { sdfType: e, invert: g, center: I, quaternion: s, scale: B, sizes: i }, Q) { const C = A * 32, E = e | (g ? 256 : 0); let n = !1; n = this.updateSdfFloatData(C + 0, (I == null ? void 0 : I.x) ?? 0) || n, n = this.updateSdfFloatData(C + 1, (I == null ? void 0 : I.y) ?? 0) || n, n = this.updateSdfFloatData(C + 2, (I == null ? void 0 : I.z) ?? 0) || n, n = this.updateSdfData(C + 3, E) || n, n = this.updateSdfFloatData(C + 4, (s == null ? void 0 : s.x) ?? 0) || n, n = this.updateSdfFloatData(C + 5, (s == null ? void 0 : s.y) ?? 0) || n, n = this.updateSdfFloatData(C + 6, (s == null ? void 0 : s.z) ?? 0) || n, n = this.updateSdfFloatData(C + 7, (s == null ? void 0 : s.w) ?? 0) || n, n = this.updateSdfFloatData(C + 8, (B == null ? void 0 : B.x) ?? 0) || n, n = this.updateSdfFloatData(C + 9, (B == null ? void 0 : B.y) ?? 0) || n, n = this.updateSdfFloatData(C + 10, (B == null ? void 0 : B.z) ?? 0) || n, n = this.updateSdfData(C + 11, 0) || n, n = this.updateSdfFloatData(C + 12, (i == null ? void 0 : i.x) ?? 0) || n, n = this.updateSdfFloatData(C + 13, (i == null ? void 0 : i.y) ?? 0) || n, n = this.updateSdfFloatData(C + 14, (i == null ? void 0 : i.z) ?? 0) || n, n = this.updateSdfFloatData(C + 15, (i == null ? void 0 : i.w) ?? 0) || n; const o = Math.min(4, Q.length); for (let r = 0; r < o; ++r) { const l = C + 16 + r * 4; n = this.updateSdfFloatData(l + 0, Q[r].x) || n, n = this.updateSdfFloatData(l + 1, Q[r].y) || n, n = this.updateSdfFloatData(l + 2, Q[r].z) || n, n = this.updateSdfFloatData(l + 3, Q[r].w) || n; } return n; } // 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((n, { sdfs: o }) => n + o.length, 0), g = this.ensureCapacity({ maxEdits: A.length, maxSdfs: e }), I = [new a.Vector4(), new a.Vector4()], s = new a.Vector3(), B = new a.Quaternion(), i = new a.Vector3(), Q = new a.Vector4(); let C = 0, E = g; A.length !== this.dynoNumEdits.value && (this.dynoNumEdits.value = A.length, this.numEdits = A.length, E = !0); for (const [n, { edit: o, sdfs: r }] of A.entries()) { E = this.encodeEdit(n, { sdfFirst: C, sdfCount: r.length, invert: o.invert, rgbaBlendMode: Ao(o.rgbaBlendMode), softEdge: o.softEdge, sdfSmooth: o.sdfSmooth }) || E; let l = !1; for (const c of r) Q.set(c.scale.x, c.scale.y, c.scale.z, c.radius), c.scale.setScalar(1), c.updateMatrixWorld(), c.matrixWorld.clone().invert().decompose(s, B, i), c.scale.set(Q.x, Q.y, Q.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( C, { sdfType: Wa(c.type), invert: c.invert, center: s, quaternion: B, scale: i, sizes: Q }, I ) || l, C += 1; this.numSdfs = C, l && (this.sdfTexture.needsUpdate = !0), E || (E = l); } return { updated: E, dynoUpdated: g }; } // Modify a Gsplat in a dyno shader program using the current edits and SDFs. modify(A) { return go( A, this.dynoSdfArray, this.dynoNumEdits, this.dynoEdits ); } } const xi = { type: "SdfArray" }, Ri = oA(` 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); } `), Ui = oA(` 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 go(t, A, e, g) { return new Z({ inTypes: { gsplat: W, sdfArray: xi, numEdits: "int", rgbaDisplaceEdits: "uvec4" }, outTypes: { gsplat: W }, globals: () => [Ri, Ui], inputs: { gsplat: t, sdfArray: A, numEdits: e, rgbaDisplaceEdits: g }, statements: ({ inputs: s, outputs: B }) => { const { sdfArray: i, numEdits: Q, rgbaDisplaceEdits: C } = s, { gsplat: E } = B; return UA(` ${E} = ${s.gsplat}; if (isGsplatActive(${E}.flags)) { for (int editIndex = 0; editIndex < ${Q}; ++editIndex) { applyPackedRgbaDisplaceEdit( ${C}[editIndex], ${i}.sdfTexture, ${i}.numSdfs, ${E}.center, ${E}.rgba ); } } `); } }).outputs.gsplat; } const wt = new Float32Array(1); class Io { constructor(A) { this.modifier = A, this.cache = /* @__PURE__ */ new Map(); } apply(A) { let e = this.cache.get(A); return e || (e = GA( { index: "int" }, { gsplat: W }, ({ index: g }) => { const { gsplat: I } = A.apply({ index: g }); return this.modifier.apply({ gsplat: I }); } ), this.cache.set(A, e)), e; } } class pt { // Create the dyno uniforms that parameterize the transform, setting them // to initial values that are different from any valid transform. constructor() { this.scale = new ot({ value: Number.NEGATIVE_INFINITY }), this.rotate = new Xt({ value: new a.Quaternion( Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY ) }), this.translate = new St({ value: new a.Vector3( Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY ) }); } // Apply the transform to a Vec3 position in a dyno program. apply(A) { return si(A, { scale: this.scale, rotate: this.rotate, translate: this.translate }); } applyDir(A) { return Bi(A, { rotate: this.rotate }); } // Apply the transform to a Gsplat in a dyno program. applyGsplat(A) { return Ze(A, { scale: this.scale, rotate: this.rotate, translate: this.translate }); } // Update the uniforms to match the given transform matrix. updateFromMatrix(A) { const e = new a.Vector3(), g = new a.Quaternion(), I = new a.Vector3(); A.decompose(I, g, e); const s = (e.x + e.y + e.z) / 3; let B = !1; return s !== this.scale.value && (this.scale.value = s, B = !0), I.equals(this.translate.value) || (this.translate.value.copy(I), B = !0), g.equals(this.rotate.value) || (this.rotate.value.copy(g), B = !0), B; } // Update this transform to match the object's to-world transform. update(A) { return A.updateMatrixWorld(), this.updateFromMatrix(A.matrixWorld); } } class qt extends a.Object3D { constructor({ numSplats: A, generator: e, construct: g, update: I }) { if (super(), this.numSplats = A ?? 0, this.generator = e, this.frameUpdate = I, this.version = 0, g) { const s = g(this); Object.assign(this, s); } } updateVersion() { this.version += 1; } set needsUpdate(A) { A && this.updateVersion(); } } const et = class et extends qt { constructor(A = {}) { const e = new pt(), g = new pt(), I = new pt(), s = new pt(), B = new Xt({ value: new a.Vector4( Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY ) }), i = new ot({ value: 0 }), Q = new ot({ value: 0 }), C = { transform: e, viewToWorld: g, worldToView: I, viewToObject: s, recolor: B, time: i, deltaTime: Q }; if (super({ update: ({ time: E, deltaTime: n, viewToWorld: o, globalEdits: r }) => this.update({ time: E, deltaTime: n, viewToWorld: o, globalEdits: r }) }), this.isInitialized = !1, this.recolor = new a.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 = C, 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 E = A.onLoad(this); E instanceof Promise && await E; } return this; }); else if (this.isInitialized = !0, this.initialized = Promise.resolve(this), A.onLoad) { const E = A.onLoad(this); E instanceof Promise && (this.initialized = E.then(() => this)); } } async asyncInitialize(A) { const { url: e, fileBytes: g, fileType: I, fileName: s, maxSplats: B, constructSplats: i } = A; if (e || g || i) { const Q = { url: e, fileBytes: g, fileType: I, fileName: s, maxSplats: B, construct: i }; this.packedSplats.reinitialize(Q); } this.packedSplats && (await this.packedSplats.initialized, this.numSplats = this.packedSplats.numSplats, this.updateGenerator()); } static async staticInitialize() { await Ng(), 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, g, I, s) { this.packedSplats.pushSplat(A, e, g, I, s); } // 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: g, recolor: I } = A, s = GA( { index: "int" }, { gsplat: W }, ({ index: B }) => { if (!B) throw new Error("index is undefined"); let i = Ht(this.packedSplats.dyno, B); if (this.maxSh >= 1) { const { sh1Texture: C, sh2Texture: E, sh3Texture: n } = this.ensureShTextures(); if (C) { const o = g.translate, { center: r } = at(i).outputs, l = fB(Ft(r, o)); let c = Qo(i, C, l); this.maxSh >= 2 && E && (c = fA(c, no(i, E, l))), this.maxSh >= 3 && n && (c = fA(c, Co(i, n, l))); let { rgba: h } = at(i).outputs; h = fA(h, dB(c, K("float", 0))), i = Bt({ gsplat: i, rgba: h }); } } if (this.splatRgba) { const C = Oa(this.splatRgba.dyno, B); i = Bt({ gsplat: i, rgba: C }); } this.skinning && (i = this.skinning.modify(i)), this.objectModifier && (i = this.objectModifier.apply({ gsplat: i }).gsplat), i = e.applyGsplat(i); const Q = EA(I, at(i).outputs.rgba); return i = Bt({ gsplat: i, rgba: Q }), this.rgbaDisplaceEdits && (i = this.rgbaDisplaceEdits.modify(i)), this.worldModifier && (i = this.worldModifier.apply({ gsplat: i }).gsplat), { gsplat: i }; } ); this.generator = s; } // 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: g, globalEdits: I }) { var h; this.numSplats = this.packedSplats.numSplats, this.context.time.value = A, this.context.deltaTime.value = g, et.dynoTime.value = A; const { transform: s, viewToObject: B, recolor: i } = this.context; let Q = s.update(this); this.context.viewToWorld.updateFromMatrix(e) && this.enableViewToWorld && (Q = !0); const C = e.clone().invert(); this.context.worldToView.updateFromMatrix(C) && this.enableWorldToView && (Q = !0); const o = new a.Matrix4().compose( s.translate.value, s.rotate.value, new a.Vector3().setScalar(s.scale.value) ).invert().multiply(e); B.updateFromMatrix(o) && (this.enableViewToObject || this.packedSplats.extra.sh1) && (Q = !0); const r = new a.Vector4( this.recolor.r, this.recolor.g, this.recolor.b, this.opacity ); r.equals(i.value) || (i.value.copy(r), Q = !0); const l = this.editable ? (this.edits ?? []).concat(I) : []; this.editable && !this.edits && this.traverseVisible((u) => { u instanceof Ce && 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 to && 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 eo({ maxEdits: u, maxSdfs: D }), this.updateGenerator(); } if (this.rgbaDisplaceEdits) { const u = this.rgbaDisplaceEdits.update(c); Q || (Q = u.updated), u.dynoUpdated && this.updateGenerator(); } Q && this.updateVersion(), (h = this.onFrame) == null || h.call(this, { mesh: this, time: A, deltaTime: g }); } // 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: g, far: I, ray: s } = A, B = this.matrixWorld.clone().invert(), i = new a.Matrix3().setFromMatrix4(B), Q = s.origin.clone().applyMatrix4(B), C = s.direction.clone().applyMatrix3(i), E = new a.Vector3(); B.decompose(new a.Vector3(), new a.Quaternion(), E), (E.x * E.y * E.z) ** (1 / 3); const o = YQ( Q.x, Q.y, Q.z, C.x, C.y, C.z, g, I, this.packedSplats.numSplats, this.packedSplats.packedArray, !0 ); for (const r of o) { const l = s.direction.clone().multiplyScalar(r).add(s.origin); e.push({ distance: r, 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: s, height: B, depth: i, maxSplats: Q } = dA( I.length / 2 ); if (I.length < Q * 2) { const E = new Uint32Array(Q * 2); E.set(I), this.packedSplats.extra.sh1 = E, I = E; } const C = new a.DataArrayTexture(I, s, B, i); C.format = a.RGIntegerFormat, C.type = a.UnsignedIntType, C.internalFormat = "RG32UI", C.needsUpdate = !0, A = new bt({ value: C, 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: s, height: B, depth: i, maxSplats: Q } = dA( I.length / 4 ); if (I.length < Q * 4) { const E = new Uint32Array(Q * 4); E.set(I), this.packedSplats.extra.sh2 = E, I = E; } const C = new a.DataArrayTexture(I, s, B, i); C.format = a.RGBAIntegerFormat, C.type = a.UnsignedIntType, C.internalFormat = "RGBA32UI", C.needsUpdate = !0, e = new bt({ value: C, key: "sh2" }), this.packedSplats.extra.sh2Texture = e; } if (!this.packedSplats.extra.sh3) return { sh1Texture: A, sh2Texture: e }; let g = this.packedSplats.extra.sh3Texture; if (!g) { let I = this.packedSplats.extra.sh3; const { width: s, height: B, depth: i, maxSplats: Q } = dA( I.length / 4 ); if (I.length < Q * 4) { const E = new Uint32Array(Q * 4); E.set(I), this.packedSplats.extra.sh3 = E, I = E; } const C = new a.DataArrayTexture(I, s, B, i); C.format = a.RGBAIntegerFormat, C.type = a.UnsignedIntType, C.internalFormat = "RGBA32UI", C.needsUpdate = !0, g = new bt({ value: C, key: "sh3" }), this.packedSplats.extra.sh3Texture = g; } return { sh1Texture: A, sh2Texture: e, sh3Texture: g }; } }; et.staticInitialized = et.staticInitialize(), et.isStaticInitialized = !1, et.dynoTime = new ot({ value: 0 }); let XA = et; const so = oA(` 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); } `), Bo = oA(` 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)); } `), io = oA(` 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 Qo(t, A, e) { return jt({ inTypes: { gsplat: W, sh1: "usampler2DArray", viewDir: "vec3" }, outTypes: { rgb: "vec3" }, inputs: { gsplat: t, sh1: A, viewDir: e }, globals: () => [SA, so], statements: ({ inputs: g, outputs: I }) => UA(` if (isGsplatActive(${g.gsplat}.flags)) { ${I.rgb} = evaluateSH1(${g.gsplat}, ${g.sh1}, ${g.viewDir}); } else { ${I.rgb} = vec3(0.0); } `) }).outputs.rgb; } function no(t, A, e) { return jt({ inTypes: { gsplat: W, sh2: "usampler2DArray", viewDir: "vec3" }, outTypes: { rgb: "vec3" }, inputs: { gsplat: t, sh2: A, viewDir: e }, globals: () => [SA, Bo], statements: ({ inputs: g, outputs: I }) => UA(` if (isGsplatActive(${g.gsplat}.flags)) { ${I.rgb} = evaluateSH2(${g.gsplat}, ${g.sh2}, ${g.viewDir}); } else { ${I.rgb} = vec3(0.0); } `) }).outputs.rgb; } function Co(t, A, e) { return jt({ inTypes: { gsplat: W, sh3: "usampler2DArray", viewDir: "vec3" }, outTypes: { rgb: "vec3" }, inputs: { gsplat: t, sh3: A, viewDir: e }, globals: () => [SA, io], statements: ({ inputs: g, outputs: I }) => UA(` if (isGsplatActive(${g.gsplat}.flags)) { ${I.rgb} = evaluateSH3(${g.gsplat}, ${g.sh3}, ${g.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: (B) => { B.enqueue(this.fileBytes.slice(0, 65536)), B.close(); } }).pipeThrough(new TextDecoderStream()).getReader(); this.header = ""; const g = `end_header `; for (; ; ) { const { value: B, done: i } = await e.read(); if (i) throw new Error("Failed to read header"); this.header += B; const Q = this.header.indexOf(g); if (Q >= 0) { this.header = this.header.slice(0, Q + g.length); break; } } const I = new TextEncoder().encode(this.header).length; this.data = new DataView(this.fileBytes.buffer, I), this.elements = {}; let s = null; this.comments = [], this.header.trim().split(` `).forEach((B, i) => { const Q = B.trim(); if (i === 0) { if (Q !== "ply") throw new Error("Invalid PLY header"); return; } if (Q.length === 0) return; const C = Q.split(" "); switch (C[0]) { case "format": if (C[1] === "binary_little_endian") this.littleEndian = !0; else if (C[1] === "binary_big_endian") this.littleEndian = !1; else throw new Error(`Unsupported PLY format: ${C[1]}`); if (C[2] !== "1.0") throw new Error(`Unsupported PLY version: ${C[2]}`); break; case "end_header": break; case "comment": this.comments.push(Q.slice(8)); break; case "element": { const E = C[1]; s = { name: E, count: Number.parseInt(C[2]), properties: {} }, this.elements[E] = s; break; } case "property": if (s == null) throw new Error("Property must be inside an element"); C[1] === "list" ? s.properties[C[4]] = { isList: !0, type: C[3], countType: C[2] } : s.properties[C[2]] = { isList: !1, type: C[1] }; break; } }), this.elements.vertex && (this.numSplats = this.elements.vertex.count); } parseData(A) { let e = 0; const g = this.data; if (g == null) throw new Error("No data to parse"); for (const I in this.elements) { const s = this.elements[I], { count: B, properties: i } = s, Q = {}, C = []; for (const [n, o] of Object.entries(i)) o.isList ? (Q[n] = [], C.push(() => { const r = Q[n]; r.length = Ae[o.countType]( g, e, this.littleEndian ), e += Dt[o.countType]; for (let l = 0; l < r.length; l++) r[l] = Ae[o.type]( g, e, this.littleEndian ), e += Dt[o.type]; })) : (Q[n] = 0, C.push(() => { Q[n] = Ae[o.type]( g, e, this.littleEndian ), e += Dt[o.type]; })); const E = A(s) ?? (() => { }); for (let n = 0; n < B; n++) { for (const o of C) o(); E(n, Q); } } } // 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 g = !1; const I = []; let s = 0, B = [], i = [], Q = [], C, E, n; function o() { const u = ao[s]; B = new Array(3).fill(null).flatMap( (D, w) => [0, 1, 2].map((y, f) => `f_rest_${w + f * u / 3}`) ), i = new Array(5).fill(null).flatMap( (D, w) => [0, 1, 2].map((y, f) => `f_rest_${3 + w + f * u / 3}`) ), Q = new Array(7).fill(null).flatMap( (D, w) => [0, 1, 2].map((y, f) => `f_rest_${8 + w + f * u / 3}`) ), C = s >= 1 ? new Float32Array(3 * 3) : void 0, E = s >= 2 ? new Float32Array(5 * 3) : void 0, n = s >= 3 ? new Float32Array(7 * 3) : void 0; } function r(u, D) { if (!C) throw new Error("Missing sh1"); for (const [w, y] of B.entries()) C[w] = D[y] * 8 / 255 - 4; if (E) for (const [w, y] of i.entries()) E[w] = D[y] * 8 / 255 - 4; if (n) for (const [w, y] of Q.entries()) n[w] = D[y] * 8 / 255 - 4; e == null || e(u, C, E, n); } function l(u) { const { min_x: D, min_y: w, min_z: y, max_x: f, max_y: N, max_z: M, min_scale_x: d, min_scale_y: p, min_scale_z: R, max_scale_x: S, max_scale_y: m, max_scale_z: Y } = u.properties; if (!D || !w || !y || !f || !N || !M || !d || !p || !R || !S || !m || !Y) throw new Error("Missing PLY chunk properties"); return g = !0, (G, k) => { const { min_x: U, min_y: J, min_z: AA, max_x: z, max_y: eA, max_z: tA, min_scale_x: _, min_scale_y: b, min_scale_z: X, max_scale_x: j, max_scale_y: O, max_scale_z: L, min_r: uA, min_g: nA, min_b: wA, max_r: DA, max_g: MA, max_b: rA } = k; I.push({ min_x: U, min_y: J, min_z: AA, max_x: z, max_y: eA, max_z: tA, min_scale_x: _, min_scale_y: b, min_scale_z: X, max_scale_x: j, max_scale_y: O, max_scale_z: L, min_r: uA, min_g: nA, min_b: wA, max_r: DA, max_g: MA, max_b: rA }); }; } function c(u) { if (e && u.name === "sh") return s = ng(u.properties), o(), r; 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 N = Math.sqrt(2); return (M, d) => { const p = I[M >>> 8]; if (p == null) throw new Error("Missing PLY chunk"); const { min_x: R, min_y: S, min_z: m, max_x: Y, max_y: G, max_z: k, min_scale_x: U, min_scale_y: J, min_scale_z: AA, max_scale_x: z, max_scale_y: eA, max_scale_z: tA, min_r: _, min_g: b, min_b: X, max_r: j, max_g: O, max_b: L } = p, { packed_position: uA, packed_rotation: nA, packed_scale: wA, packed_color: DA } = d, MA = (uA >>> 21 & 2047) / 2047 * (Y - R) + R, rA = (uA >>> 11 & 1023) / 1023 * (G - S) + S, YA = (uA & 2047) / 2047 * (k - m) + m, mA = ((nA >>> 20 & 1023) / 1023 - 0.5) * N, OA = ((nA >>> 10 & 1023) / 1023 - 0.5) * N, PA = ((nA & 1023) / 1023 - 0.5) * N, v = Math.sqrt(Math.max(0, 1 - mA * mA - OA * OA - PA * PA)), lA = nA >>> 30, VA = lA === 0 ? mA : lA === 1 ? v : OA, Rt = lA <= 1 ? OA : lA === 2 ? v : PA, Pt = lA <= 2 ? PA : v, NA = lA === 0 ? v : mA, T = Math.exp( (wA >>> 21 & 2047) / 2047 * (z - U) + U ), ZA = Math.exp( (wA >>> 11 & 1023) / 1023 * (eA - J) + J ), we = Math.exp( (wA & 2047) / 2047 * (tA - AA) + AA ), De = (DA >>> 24 & 255) / 255 * ((j ?? 1) - (_ ?? 0)) + (_ ?? 0), ye = (DA >>> 16 & 255) / 255 * ((O ?? 1) - (b ?? 0)) + (b ?? 0), pe = (DA >>> 8 & 255) / 255 * ((L ?? 1) - (X ?? 0)) + (X ?? 0), fe = (DA & 255) / 255; A( M, MA, rA, YA, T, ZA, we, VA, Rt, Pt, NA, fe, De, ye, pe ); }; } const h = (u) => { if (u.name === "chunk") return l(u); if (g) return c(u); if (u.name !== "vertex") return null; const { x: D, y: w, z: y, scale_0: f, scale_1: N, scale_2: M, rot_0: d, rot_1: p, rot_2: R, rot_3: S, opacity: m, f_dc_0: Y, f_dc_1: G, f_dc_2: k, red: U, green: J, blue: AA, alpha: z } = u.properties; if (!D || !w || !y) throw new Error("Missing PLY properties: x, y, z"); const eA = f && N && M, tA = d && p && R && S, _ = z != null ? te[z.type] : 1, b = U != null ? te[U.type] : 1, X = J != null ? te[J.type] : 1, j = AA != null ? te[AA.type] : 1; return s = ng(u.properties), o(), (O, L) => { const uA = eA ? Math.exp(L.scale_0) : ft.defaultPointScale, nA = eA ? Math.exp(L.scale_1) : ft.defaultPointScale, wA = eA ? Math.exp(L.scale_2) : ft.defaultPointScale, DA = tA ? L.rot_1 : 0, MA = tA ? L.rot_2 : 0, rA = tA ? L.rot_3 : 0, YA = tA ? L.rot_0 : 1, mA = m != null ? 1 / (1 + Math.exp(-L.opacity)) : z != null ? L.alpha / _ : 1, OA = Y != null ? L.f_dc_0 * $t + 0.5 : U != null ? L.red / b : 1, PA = G != null ? L.f_dc_1 * $t + 0.5 : J != null ? L.green / X : 1, v = k != null ? L.f_dc_2 * $t + 0.5 : AA != null ? L.blue / j : 1; if (A( O, L.x, L.y, L.z, uA, nA, wA, DA, MA, rA, YA, mA, OA, PA, v ), e && C) { if (C) for (const [lA, VA] of B.entries()) C[lA] = L[VA]; if (E) for (const [lA, VA] of i.entries()) E[lA] = L[VA]; if (n) for (const [lA, VA] of Q.entries()) n[lA] = L[VA]; e(O, C, E, n); } }; }; 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 g = this.data; if (g == 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 s = this.elements[I], { count: B, properties: i } = s, Q = []; let C = 0; const E = I === "vertex"; if (E) { for (const n of ["opacity", "f_dc_0", "f_dc_1", "f_dc_2"]) if (!i[n] || i[n].type !== "float") throw new Error(`Can't injectRgba due to property: ${n}`); } for (const [n, o] of Object.entries(i)) if (o.isList) Q.push(() => { const r = Ae[o.countType]( g, e, this.littleEndian ); e += Dt[o.countType], e += r * Dt[o.type]; }); else { if (E) if (n === "f_dc_0" || n === "f_dc_1" || n === "f_dc_2") { const r = Number.parseInt( n.slice(5) ); Q.push(() => { const l = (A[C + r] / 255 - 0.5) / $t; Qg[o.type]( g, e, this.littleEndian, l ); }); } else n === "opacity" && Q.push(() => { const r = Math.max( -100, Math.min( 100, -Math.log(1 / (A[C + 3] / 255) - 1) ) ); Qg[o.type]( g, e, this.littleEndian, r ); }); Q.push(() => { e += Dt[o.type]; }); } for (let n = 0; n < B; n++) { for (const o of Q) o(); E && (C += 4); } } } }; ft.defaultPointScale = 1e-3; let Ee = ft; const $t = 0.28209479177387814, Ae = { 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) }, Qg = { char: (t, A, e, g) => { t.setInt8(A, g); }, uchar: (t, A, e, g) => { t.setUint8(A, g); }, short: (t, A, e, g) => { t.setInt16(A, g, e); }, ushort: (t, A, e, g) => { t.setUint16(A, g, e); }, int: (t, A, e, g) => { t.setInt32(A, g, e); }, uint: (t, A, e, g) => { t.setUint32(A, g, e); }, float: (t, A, e, g) => { t.setFloat32(A, g, e); }, double: (t, A, e, g) => { t.setFloat64(A, g, e); } }, Dt = { char: 1, uchar: 1, short: 2, ushort: 2, int: 4, uint: 4, float: 4, double: 8 }, te = { char: 127, uchar: 255, short: 32767, ushort: 65535, int: 2147483647, uint: 4294967295, float: 1, double: 1 }, Eo = { 0: 0, 9: 1, 24: 2, 45: 3 }, ao = { 0: 0, 1: 9, 2: 24, 3: 45 }; function ng(t) { let A = 0; for (; t[`f_rest_${A}`]; ) A += 1; const e = Eo[A]; if (e == null) throw new Error(`Unsupported number of SH coefficients: ${A}`); return e; } const Yi = '(function(){"use strict";let uA;const Qg=typeof TextDecoder<"u"?new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}):{decode:()=>{throw Error("TextDecoder not available")}};typeof TextDecoder<"u"&&Qg.decode();let PA=null;function Vg(){return(PA===null||PA.byteLength===0)&&(PA=new Uint8Array(uA.memory.buffer)),PA}function Og(B,A){return B=B>>>0,Qg.decode(Vg().subarray(B,B+A))}function Pg(B,A,I){return uA.sort_splats(B,A,I)>>>0}async function $g(B,A){if(typeof Response=="function"&&B instanceof Response){if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(B,A)}catch(g){if(B.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",g);else throw g}const I=await B.arrayBuffer();return await WebAssembly.instantiate(I,A)}else{const I=await WebAssembly.instantiate(B,A);return I instanceof WebAssembly.Instance?{instance:I,module:B}:I}}function AB(){const B={};return B.wbg={},B.wbg.__wbg_buffer_609cc3eee51ed158=function(A){return A.buffer},B.wbg.__wbg_length_3b4f022188ae8db6=function(A){return A.length},B.wbg.__wbg_length_6ca527665d89694d=function(A){return A.length},B.wbg.__wbg_length_8cfd2c6409af88ad=function(A){return A.length},B.wbg.__wbg_new_9fee97a409b32b68=function(A){return new Uint16Array(A)},B.wbg.__wbg_new_e3b321dcfef89fc7=function(A){return new Uint32Array(A)},B.wbg.__wbg_newwithbyteoffsetandlength_e6b7e69acd4c7354=function(A,I,g){return new Float32Array(A,I>>>0,g>>>0)},B.wbg.__wbg_newwithbyteoffsetandlength_f1dead44d1fc7212=function(A,I,g){return new Uint32Array(A,I>>>0,g>>>0)},B.wbg.__wbg_newwithlength_5a5efe313cfd59f1=function(A){return new Float32Array(A>>>0)},B.wbg.__wbg_set_10bad9bee0e9c58b=function(A,I,g){A.set(I,g>>>0)},B.wbg.__wbg_set_d23661d19148b229=function(A,I,g){A.set(I,g>>>0)},B.wbg.__wbg_set_f4f1f0daa30696fc=function(A,I,g){A.set(I,g>>>0)},B.wbg.__wbg_subarray_3aaeec89bb2544f0=function(A,I,g){return A.subarray(I>>>0,g>>>0)},B.wbg.__wbg_subarray_769e1e0f81bb259b=function(A,I,g){return A.subarray(I>>>0,g>>>0)},B.wbg.__wbindgen_init_externref_table=function(){const A=uA.__wbindgen_export_0,I=A.grow(4);A.set(0,void 0),A.set(I+0,void 0),A.set(I+1,null),A.set(I+2,!0),A.set(I+3,!1)},B.wbg.__wbindgen_memory=function(){return uA.memory},B.wbg.__wbindgen_throw=function(A,I){throw new Error(Og(A,I))},B}function IB(B,A){return uA=B.exports,Cg.__wbindgen_wasm_module=A,PA=null,uA.__wbindgen_start(),uA}async function Cg(B){if(uA!==void 0)return uA;typeof B<"u"&&(Object.getPrototypeOf(B)===Object.prototype?{module_or_path:B}=B:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),typeof B>"u"&&(B=new URL("data:application/wasm;base64,AGFzbQEAAAAB8gEjYAJ/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+AGALfX19fX19fX1/b38Bb2AGf39/f39/AX9gBX9/fX9/AGAEf31/fwBgBX9/fn9/AGAEf35/fwBgBX9/fH9/AGAEf3x/fwBgA39+fgF/YAN/b28Bf2ACfX0BfQLyBBEDd2JnHV9fd2JnX2J1ZmZlcl82MDljYzNlZWU1MWVkMTU4AAoDd2JnGl9fd2JnX25ld185ZmVlOTdhNDA5YjMyYjY4AAoDd2JnGl9fd2JnX3NldF9mNGYxZjBkYWEzMDY5NmZjAAsDd2JnHV9fd2JnX2xlbmd0aF84Y2ZkMmM2NDA5YWY4OGFkAAwDd2JnMV9fd2JnX25ld3dpdGhieXRlb2Zmc2V0YW5kbGVuZ3RoX2YxZGVhZDQ0ZDFmYzcyMTIABwN3YmcaX193YmdfbmV3X2UzYjMyMWRjZmVmODlmYzcACgN3YmcaX193Ymdfc2V0X2QyMzY2MWQxOTE0OGIyMjkACwN3YmcdX193YmdfbGVuZ3RoXzZjYTUyNzY2NWQ4OTY5NGQADAN3YmcxX193YmdfbmV3d2l0aGJ5dGVvZmZzZXRhbmRsZW5ndGhfZTZiN2U2OWFjZDRjNzM1NAAHA3diZxpfX3diZ19zZXRfMTBiYWQ5YmVlMGU5YzU4YgALA3diZx1fX3diZ19sZW5ndGhfM2I0ZjAyMjE4OGFlOGRiNgAMA3diZx9fX3diZ19zdWJhcnJheV83NjllMWUwZjgxYmIyNTliAAcDd2JnH19fd2JnX3N1YmFycmF5XzNhYWVlYzg5YmIyNTQ0ZjAABwN3YmckX193YmdfbmV3d2l0aGxlbmd0aF81YTVlZmUzMTNjZmQ1OWYxABMDd2JnEF9fd2JpbmRnZW5fdGhyb3cAAgN3YmcRX193YmluZGdlbl9tZW1vcnkAFAN3YmcfX193YmluZGdlbl9pbml0X2V4dGVybnJlZl90YWJsZQAOA7wBugEEAAAGAAQCBAEADwQE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AgBB7NbAAEHk1sAANgIAQYDXwABB9NbAADYCAEH01sAAQezWwAA2AgBBiNfAAEH81sAANgIAQfzWwABB9NbAADYCAEGQ18AAQYTXwAA2AgBBhNfAAEH81sAANgIAQZjXwABBjNfAADYCAEGM18AAQYTXwAA2AgBBoNfAAEGU18AANgIAQZTXwABBjNfAADYCAEGc18AAQZTXwAA2AgBBqNfAAEGc18AANgIAQaTXwABBnNfAADYCAEGw18AAQaTXwAA2AgBBrNfAAEGk18AANgIAQbjXwABBrNfAADYCAEG018AAQazXwAA2AgBBwNfAAEG018AANgIAQbzXwABBtNfAADYCAEHI18AAQbzXwAA2AgBBxNfAAEG818AANgIAQdDXwABBxNfAADYCAEHM18AAQcTXwAA2AgBB2NfAAEHM18AANgIAQdTXwABBzNfAADYCAEHg18AAQdTXwAA2AgBB6NfAAEHc18AANgIAQdzXwABB1NfAADYCAEHw18AAQeTXwAA2AgBB5NfAAEHc18AANgIAQfjXwABB7NfAADYCAEHs18AAQeTXwAA2AgBBgNjAAEH018AANgIAQfTXwABB7NfAADYCAEGI2MAAQfzXwAA2AgBB/NfAAEH018AANgIAQZDYwABBhNjAADYCAEGE2MAAQfzXwAA2AgBBmNjAAEGM2MAANgIAQYzYwABBhNjAADYCAEGg2MAAQZTYwAA2AgBBlNjAAEGM2MAANgIAQajYwABBnNjAADYCAEGc2MAAQZTYwAA2AgBBsNjAAEGk2MAANgIAQaTYwABBnNjAADYCAEG42MAAQazYwAA2AgBBrNjAAEGk2MAANgIAQcDYwABBtNjAADYCAEG02MAAQazYwAA2AgBByNjAAEG82MAANgIAQbzYwABBtNjAADYCAEHQ2MAAQcTYwAA2AgBBxNjAAEG82MAANgIAQdjYwABBzNjAADYCAEHM2MAAQcTYwAA2AgBB8NjAACABQQ9qQXhxIgBBCGsiAjYCAEHU2MAAQczYwAA2AgBB6NjAACAEQShrIgMgASAAa2pBCGoiADYCACACIABBAXI2AgQgASADakEoNgIEQfzYwABBgICAATYCAAwICyACIANJIAEgAk1yDQAgACgCDCIDQQFxDQAgA0EBdiAGRg0DC0GA2cAAQYDZwAAoAgAiACABIAAgAUkb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KAIMIQICQAJAAkAgAUGAAk8EQCAAKAIYIQMCQAJAIAAgAkYEQCAAQRRBECAAKAIUIgIbaigCACIBDQFBACECDAILIAAoAggiASACNgIMIAIgATYCCAwBCyAAQRRqIABBEGogAhshBANAIAQhBSABIgJBFGogAkEQaiACKAIUIgEbIQQgAkEUQRAgARtqKAIAIgENAAsgBUEANgIACyADRQ0CAkAgACgCHEECdEHE1cAAaiIBKAIAIABHBEAgAygCECAARg0BIAMgAjYCFCACDQMMBAsgASACNgIAIAJFDQQMAgsgAyACNgIQIAINAQwCCyAAKAIIIgAgAkcEQCAAIAI2AgwgAiAANgIIDwtB3NjAAEHc2MAAKAIAQX4gAUEDdndxNgIADwsgAiADNgIYIAAoAhAiAQRAIAIgATYCECABIAI2AhgLIAAoAhQiAEUNACACIAA2AhQgACACNgIYDwsPC0Hg2MAAQeDYwAAoAgBBfiAAKAIcd3E2AgAL+QICBH8BfiMAQSBrIgIkAAJAAkACQCAAKAIAIgNFDQAgACgCCCIBIAAoAgRPDQACQAJAAkAgASADaiIDLQAAQcIARgRAIAAgAUEBajYCCCACIAAQXCACKAIADQEgACgCECIBRQ0CQdyrwABBzKvAACACLQAEQQFxIgMbQRlBECADGyABEMMBRQ0CQQIhAQwGCyADLQAAQckARw0DIAAgAUEBajYCCEECIQEgAEEAEBJFDQQMBQsgACgCEEUNASAAKQIAIQUgACACKQIANwIAIAJBGGoiAyAAQQhqIgEpAgA3AwAgASACQQhqKQIANwIAIAIgBTcDECAAEDMgASADKQMANwIAIAAgAikDEDcCAEH/AXEhAQwECyAAIAIpAgA3AgAgAEEIaiACQQhqKQIANwIAC0EAIQEMAgtBAkEAIABBABASGyEBDAELIAAoAhAiAwRAQYCmwABBASADEMMBDQELQQJBASAAEDlBAXEbIQELIAJBIGokACABC/MCAgd/A34jAEEQayIEJAAgASgCACEGAkACQCABKAIIIgIgASgCBCIHSQRAIAIgBmotAABB3wBGDQELIAIgByACIAdLGyEIAkADQAJAIAIgB0kEQCACIAZqLQAAQd8ARg0DCyACIAhGDQACQCACIAZqLQAAIgVBMGsiA0H/AXFBCkkNACAFQeEAa0H/AXFBGk8EQCAFQcEAa0H/AXFBGk8NAiAFQR1rIQMMAQsgBUHXAGshAwsgASACQQFqIgI2AgggBCAJQv////8Pg0I+fiIKIAlCIIhCPn4iCUIghnwiCzcDACAEIAogC1atIAlCIIh8NwMIIAQpAwhQRQ0AIAQpAwAiCiADrUL/AYN8IgkgCloNAQsLIABBADoAAUEBIQMMAgtBASEDIAEgAkEBajYCCCAJQn9SBEAgACAJQgF8NwMIQQAhAwwCCyAAQQA6AAEMAQsgAEIANwMIIAEgAkEBajYCCAsgACADOgAAIARBEGokAAvWAgEFf0ERQQAgAEGvsARPGyICIAJBCHIiASAAQQt0IgIgAUECdEGc08AAaigCAEELdEkbIgEgAUEEciIBIAFBAnRBnNPAAGooAgBBC3QgAksbIgEgAUECciIBIAFBAnRBnNPAAGooAgBBC3QgAksbIgEgAUEBaiIBIAFBAnRBnNPAAGooAgBBC3QgAksbIgEgAUEBaiIBIAFBAnRBnNPAAGooAgBBC3QgAksbIgFBAnRBnNPAAGooAgBBC3QiBCACRiACIARLaiABaiIEQQJ0QZzTwABqIgUoAgBBFXYhAkHvBSEBAkAgBEEgTQRAIAUoAgRBFXYhASAERQ0BCyAFQQRrKAIAQf///wBxIQMLAkAgASACQQFqRg0AIAAgA2shAyABQQFrIQFBACEAA0AgACACQYyzwABqLQAAaiIAIANLDQEgASACQQFqIgJHDQALCyACQQFxC7ICAQF/IwBB8ABrIgYkACAGIAE2AgwgBiAANgIIIAYgAzYCFCAGIAI2AhAgBkGw1MAAKAIANgIcIAZBpNTAACgCADYCGAJAIAQoAgAEQCAGQTBqIARBEGopAgA3AwAgBkEoaiAEQQhqKQIANwMAIAYgBCkCADcDICAGQQQ2AlwgBkGwvcAANgJYIAZCBDcCZCAGIAZBEGqtQoCAgICADIQ3A1AgBiAGQQhqrUKAgICAgAyENwNIIAYgBkEgaq1CgICAgKAMhDcDQAwBCyAGQQM2AlwgBkH8vMAANgJYIAZCAzcCZCAGIAZBEGqtQoCAgICADIQ3A0ggBiAGQQhqrUKAgICAgAyENwNACyAGIAZBGGqtQoCAgICQDIQ3AzggBiAGQThqNgJgIAZB2ABqIAUQfAALkQMCBX8BfiMAQRBrIgUkACAFQQhqIQQgASgCACEDIAEoAgQhAiMAQdAAayIBJAAgASADIAJBw6jAAEEBEBQDQCABQcQAaiABEBcgASgCRCIGRQ0ACyAEIAICfyAGQQJHBEAgASgCSAwBCyACCyICazYCBCAEIAIgA2o2AgAgAUHQAGokACAAIAUoAgwiAkEQTQR+AkAgAkUNACACIAUoAggiAWohBgNAAn8gASwAACICQQBOBEAgAkH/AXEhAiABQQFqDAELIAEtAAFBP3EhAyACQR9xIQQgAkFfTQRAIARBBnQgA3IhAiABQQJqDAELIAEtAAJBP3EgA0EGdHIhAyACQXBJBEAgAyAEQQx0ciECIAFBA2oMAQsgBEESdEGAgPAAcSABLQADQT9xIANBBnRyciECIAFBBGoLIQEgAkHBAGtBX3FBCmogAkEwayACQTlLGyICQRBJBEAgAq0gB0IEhoQhByABIAZGDQIMAQsLQcSowAAQrgEACyAAIAc3AwhCAQVCAAs3AwAgBUEQaiQAC8oCAQZ/IAEgAkEBdGohCSAAQYD+A3FBCHYhCiAAQf8BcSEMAkACQAJAAkADQCABQQJqIQsgByABLQABIgJqIQggCiABLQAAIgFHBEAgASAKSw0EIAghByALIgEgCUcNAQwECyAHIAhLDQEgBCAISQ0CIAMgB2ohAQNAIAJFBEAgCCEHIAsiASAJRw0CDAULIAJBAWshAiABLQAAIAFBAWohASAMRw0ACwtBACECDAMLIAcgCEHIxsAAEKwBAAsgCCAEQcjGwAAQqwEACyAAQf//A3EhByAFIAZqIQNBASECA0AgBUEBaiEAAkAgBSwAACIBQQBOBEAgACEFDAELIAAgA0cEQCAFLQABIAFB/wBxQQh0ciEBIAVBAmohBQwBC0G4xsAAEK4BAAsgByABayIHQQBIDQEgAkEBcyECIAMgBUcNAAsLIAJBAXEL3QIBBX8jAEEQayIEJAACQAJAAkAgACgCACIBRQ0AA0ACQCAAKAIIIgIgACgCBE8NACABIAJqLQAAQcUARw0AIAAgAkEBajYCCAwCCwJAAkACQCADRQ0AIAAoAhAiAkUNAEH9q8AAQQIgAhDDAQ0FIAAoAgAiAUUNAQsgACgCCCICIAAoAgRPDQACQCABIAJqIgEtAABBzABGBEAgACACQQFqNgIIIAQgABA0IAQtAABFDQEgBC0AASEDIAAoAhAiAgRAQQEhAUHcq8AAQcyrwAAgA0EBcSIFG0EZQRAgBRsgAhDDAQ0ICyAAIAM6AARBACEBIABBADYCAAwHCyABLQAAQcsARw0BQQEhASAAIAJBAWo2AgggAEEAEBNFDQIMBgsgACAEKQMIEFMNBAwBCyAAEBYNAwsgA0EBayEDIAAoAgAiAQ0ACwtBACEBDAELQQEhAQsgBEEQaiQAIAELygIBA38jAEEwayICJAACfwJAAkACQCAAKAIARQRAIAAoAhAiAA0BDAMLIAJBGGogABBFIAIoAhgiA0UEQCACLQAcIQMgACgCECIEBEBBAUHcq8AAQcyrwAAgA0EBcSIBG0EZQRAgARsgBBDDAQ0FGgsgACADOgAEIABBADYCAEEADAQLIAIgAigCHCIENgIUIAIgAzYCECACQRhqIAJBEGoQNwJAIAIoAhhBAUYEQCACIAIpAyA3AyggACgCECIARQ0EIAJBKGogABCvAQ0BDAMLIAAoAhAiAEUNA0HlrMAAQQIgABDDAQ0AIAMgBCAAEMMBRQ0CC0EBDAMLQfWrwABBASAAEMMBDAILIAAtAApBgAFxDQAgAkEIaiABEG0gAigCCCIBBEAgASACKAIMIAAQwwEMAgtB6KzAABCuAQALQQALIAJBMGokAAvEAgEEfyAAQgA3AhAgAAJ/QQAgAUGAAkkNABpBHyABQf///wdLDQAaIAFBBiABQQh2ZyIDa3ZBAXEgA0EBdGtBPmoLIgI2AhwgAkECdEHE1cAAaiEEQQEgAnQiA0Hg2MAAKAIAcUUEQCAEIAA2AgAgACAENgIYIAAgADYCDCAAIAA2AghB4NjAAEHg2MAAKAIAIANyNgIADwsCQAJAIAEgBCgCACIDKAIEQXhxRgRAIAMhAgwBCyABQRkgAkEBdmtBACACQR9HG3QhBQNAIAMgBUEddkEEcWoiBCgCECICRQ0CIAVBAXQhBSACIQMgAigCBEF4cSABRw0ACwsgAigCCCIBIAA2AgwgAiAANgIIIABBADYCGCAAIAI2AgwgACABNgIIDwsgBEEQaiAANgIAIAAgAzYCGCAAIAA2AgwgACAANgIIC5kCAQN/IAAoAggiAyECAn9BASABQYABSQ0AGkECIAFBgBBJDQAaQQNBBCABQYCABEkbCyIEIAAoAgAgA2tLBH8gACADIAQQQiAAKAIIBSACCyAAKAIEaiECAkACQCABQYABTwRAIAFBgBBJDQEgAUGAgARPBEAgAiABQT9xQYABcjoAAyACIAFBEnZB8AFyOgAAIAIgAUEGdkE/cUGAAXI6AAIgAiABQQx2QT9xQYABcjoAAQwDCyACIAFBP3FBgAFyOgACIAIgAUEMdkHgAXI6AAAgAiABQQZ2QT9xQYABcjoAAQwCCyACIAE6AAAMAQsgAiABQT9xQYABcjoAASACIAFBBnZBwAFyOgAACyAAIAMgBGo2AghBAAuZAgEDfyAAKAIIIgMhAgJ/QQEgAUGAAUkNABpBAiABQYAQSQ0AGkEDQQQgAUGAgARJGwsiBCAAKAIAIANrSwR/IAAgAyAEEEYgACgCCAUgAgsgACgCBGohAgJAAkAgAUGAAU8EQCABQYAQSQ0BIAFBgIAETwRAIAIgAUE/cUGAAXI6AAMgAiABQRJ2QfABcjoAACACIAFBBnZBP3FBgAFyOgACIAIgAUEMdkE/cUGAAXI6AAEMAwsgAiABQT9xQYABcjoAAiACIAFBDHZB4AFyOgAAIAIgAUEGdkE/cUGAAXI6AAEMAgsgAiABOgAADAELIAIgAUE/cUGAAXI6AAEgAiABQQZ2QcABcjoAAAsgACADIARqNgIIQQALmQIBA38gACgCCCIDIQICf0EBIAFBgAFJDQAaQQIgAUGAEEkNABpBA0EEIAFBgIAESRsLIgQgACgCACADa0sEfyAAIAMgBBBQIAAoAggFIAILIAAoAgRqIQICQAJAIAFBgAFPBEAgAUGAEEkNASABQYCABE8EQCACIAFBP3FBgAFyOgADIAIgAUESdkHwAXI6AAAgAiABQQZ2QT9xQYABcjoAAiACIAFBDHZBP3FBgAFyOgABDAMLIAIgAUE/cUGAAXI6AAIgAiABQQx2QeABcjoAACACIAFBBnZBP3FBgAFyOgABDAILIAIgAToAAAwBCyACIAFBP3FBgAFyOgABIAIgAUEGdkHAAXI6AAALIAAgAyAEajYCCEEAC/kCAQR/IwBBMGsiACQAAkACQEHE1MAAKAIARQRAQdzUwAAoAgAhAUHc1MAAQQA2AgAgAUUNASAAQRhqIAERBQAgAEEQaiICIABBJGopAgA3AwAgACAAKQIcNwMIIAAoAhghAUHE1MAAKAIAIgMNAgJAIANFDQBByNTAACgCACICRQ0AQczUwAAoAgAgAkECdEEEEKgBC0HI1MAAIAE2AgBBxNTAAEEBNgIAQczUwAAgACkDCDcCAEHU1MAAIABBEGopAwA3AgALIABBMGokAEHI1MAADwsgAEEANgIoIABBATYCHCAAQZyVwAA2AhggAEIENwIgIABBGGpBhJbAABB8AAsgAEEoaiACKQMANwIAIAAgACkDCDcCICAAIAE2AhwgAEEBNgIYAkAgAEEYaiIBKAIARQ0AIAEoAgQiAkUNACABKAIIIAJBAnRBBBCoAQsgAEEANgIoIABBATYCHCAAQaSWwAA2AhggAEIENwIgIAFBrJbAABB8AAudAgEFfwJAAkACQAJAIAJBA2pBfHEiBCACRg0AIAMgBCACayIEIAMgBEkbIgVFDQBBACEEIAFB/wFxIQZBASEHA0AgAiAEai0AACAGRg0EIAUgBEEBaiIERw0ACyAFIANBCGsiCEsNAgwBCyADQQhrIQhBACEFCyABQf8BcUGBgoQIbCEEA0BBgIKECCACIAVqIgcoAgAgBHMiBmsgBnJBgIKECCAHQQRqKAIAIARzIgZrIAZycUGAgYKEeHFBgIGChHhHDQEgBUEIaiIFIAhNDQALCyADIAVHBEAgAUH/AXEhBEEBIQcDQCAEIAIgBWotAABGBEAgBSEEDAMLIAMgBUEBaiIFRw0ACwtBACEHCyAAIAQ2AgQgACAHNgIAC4YCAQN/IwBBgAFrIgQkACAAKAIAIQACfwJAIAEoAggiAkGAgIAQcUUEQCACQYCAgCBxDQEgACgCACABEDEMAgsgACgCACEAQQAhAgNAIAIgBGpB/wBqIABBD3EiA0EwciADQdcAaiADQQpJGzoAACACQQFrIQIgAEEPSyAAQQR2IQANAAsgAUGPvsAAQQIgAiAEakGAAWpBACACaxAgDAELIAAoAgAhAEEAIQIDQCACIARqQf8AaiAAQQ9xIgNBMHIgA0E3aiADQQpJGzoAACACQQFrIQIgAEEPSyAAQQR2IQANAAsgAUGPvsAAQQIgAiAEakGAAWpBACACaxAgCyAEQYABaiQAC8oBAgR/AX4jAEEgayIDJAACQAJAIAEgASACaiICSw0AQQggAiAAKAIAIgFBAXQiBCACIARLGyICIAJBCE0bIgStIgdCIIhQRQ0AIAenIgVB/////wdLDQAgAyABBH8gAyABNgIcIAMgACgCBDYCFEEBBUEACzYCGCADQQhqQQEgBSADQRRqEFkgAygCCEEBRw0BIAMoAhAhAiADKAIMIQYLIAYgAkHAj8AAEIoBAAsgAygCDCEBIAAgBDYCACAAIAE2AgQgA0EgaiQAC4sCAQF/IwBBEGsiAiQAIAAoAgAhAAJ/IAEtAAtBGHFFBEAgASgCACAAIAEoAgQoAhARAAAMAQsgAkEANgIMIAEgAkEMagJ/AkAgAEGAAU8EQCAAQYAQSQ0BIABBgIAETwRAIAIgAEE/cUGAAXI6AA8gAiAAQRJ2QfABcjoADCACIABBBnZBP3FBgAFyOgAOIAIgAEEMdkE/cUGAAXI6AA1BBAwDCyACIABBP3FBgAFyOgAOIAIgAEEMdkHgAXI6AAwgAiAAQQZ2QT9xQYABcjoADUEDDAILIAIgADoADEEBDAELIAIgAEE/cUGAAXI6AA0gAiAAQQZ2QcABcjoADEECCxAjCyACQRBqJAALqgICA38BfiMAQUBqIgIkACABKAIAQYCAgIB4RgRAIAEoAgwhAyACQSRqIgRBADYCACACQoCAgIAQNwIcIAJBMGogAygCACIDQQhqKQIANwMAIAJBOGogA0EQaikCADcDACACIAMpAgA3AyggAkEcakG0l8AAIAJBKGoQJhogAkEYaiAEKAIAIgM2AgAgAiACKQIcIgU3AxAgAUEIaiADNgIAIAEgBTcCAAsgASkCACEFIAFCgICAgBA3AgAgAkEIaiIDIAFBCGoiASgCADYCACABQQA2AgBBodXAAC0AABogAiAFNwMAQQxBBBCdASIBRQRAQQRBDBDBAQALIAEgAikDADcCACABQQhqIAMoAgA2AgAgAEHwnMAANgIEIAAgATYCACACQUBrJAAL+QEBCX8gASgCCCICIAEoAgQiAyACIANLGyEIIAEoAgAhBUF/IQYgAiEEAkACQANAIAQgCEYNASABIARBAWoiCTYCCCAGQQFqIQYgBCAFai0AACIHQeEAayEKIAkhBCAHQTBrQf8BcUEKSSAKQf8BcUEGSXINAAsgB0HfAEcNAAJAIAIgBEEBayIBSw0AIAIEQCACIANPBEAgAiADRw0CIAEgA00NBAwCCyACIAVqLAAAQUBIIAEgA0tyDQEMAwsgASADTQ0CCyAFIAMgAiABQfyqwAAQlAEACyAAQQA2AgAgAEEAOgAEDwsgACAGNgIEIAAgAiAFajYCAAvVAQIEfwF+IwBBIGsiAyQAAkACQCABIAEgAmoiAksEQEEAIQEMAQtBACEBQQggAiAAKAIAIgVBAXQiBCACIARLGyICIAJBCE0bIgStIgdCIIhQRQ0AIAenIgZB/////wdLDQAgAyAFBH8gAyAFNgIcIAMgACgCBDYCFEEBBUEACzYCGCADQQhqQQEgBiADQRRqEFkgAygCCEEBRw0BIAMoAhAhAiADKAIMIQELIAEgAkGgl8AAEIoBAAsgAygCDCEBIAAgBDYCACAAIAE2AgQgA0EgaiQAC+8BAgR/AX4jAEEgayIFJAACQAJAIAEgASACaiICSwRAQQAhAQwBC0EAIQEgAyAEakEBa0EAIANrca1BBCACIAAoAgAiB0EBdCIGIAIgBksbIgIgAkEETRsiBq1+IglCIIhQRQ0AIAmnIghBgICAgHggA2tLDQBBACECIAUgBwR/IAUgBCAHbDYCHCAFIAAoAgQ2AhQgAwUgAgs2AhggBUEIaiADIAggBUEUahBZIAUoAghBAUcNASAFKAIQIQIgBSgCDCEBCyABIAJB+IDAABCKAQALIAUoAgwhASAAIAY2AgAgACABNgIEIAVBIGokAAuAAgEEfyMAQRBrIgJBCGpBADoAACACQQA7AQYgAiABQRR2QeihwABqLQAAOgAJIAIgAUEEdkEPcUHoocAAai0AADoADSACIAFBCHZBD3FB6KHAAGotAAA6AAwgAiABQQx2QQ9xQeihwABqLQAAOgALIAIgAUEQdkEPcUHoocAAai0AADoACiABQQFyZ0ECdiIDIAJBBmoiBWoiBEH7ADoAACAEQQFrQfUAOgAAIAUgA0ECayIDakHcADoAACACQQ5qIgQgAUEPcUHoocAAai0AADoAACAAQQo6AAsgACADOgAKIAAgAikBBjcAACACQf0AOgAPIABBCGogBC8BADsAAAvhAQEBfyMAQRBrIgIkACACQQA2AgwgACACQQxqAn8CQCABQYABTwRAIAFBgBBJDQEgAUGAgARPBEAgAiABQT9xQYABcjoADyACIAFBEnZB8AFyOgAMIAIgAUEGdkE/cUGAAXI6AA4gAiABQQx2QT9xQYABcjoADUEEDAMLIAIgAUE/cUGAAXI6AA4gAiABQQx2QeABcjoADCACIAFBBnZBP3FBgAFyOgANQQMMAgsgAiABOgAMQQEMAQsgAiABQT9xQYABcjoADSACIAFBBnZBwAFyOgAMQQILECggAkEQaiQAC+EBAQF/IwBBEGsiAiQAIAJBADYCDCAAIAJBDGoCfwJAIAFBgAFPBEAgAUGAEEkNASABQYCABE8EQCACIAFBP3FBgAFyOgAPIAIgAUESdkHwAXI6AAwgAiABQQZ2QT9xQYABcjoADiACIAFBDHZBP3FBgAFyOgANQQQMAwsgAiABQT9xQYABcjoADiACIAFBDHZB4AFyOgAMIAIgAUEGdkE/cUGAAXI6AA1BAwwCCyACIAE6AAxBAQwBCyACIAFBP3FBgAFyOgANIAIgAUEGdkHAAXI6AAxBAgsQcyACQRBqJAAL4wEBCH8gACgCCCIGBEAgACgCBCEHA0AgByACQQxsaiIDKAIEIQQgAygCCCIFBEAgBEEkaiEAA0AgAEEEaygCACIBQYCAgIB4ckGAgICAeEcEQCAAKAIAIAFBARCoAQsCQCAAQRRrKAIAIghBAkYNACAAQRBrKAIAIQEgCEUEQCABRQ0BIABBDGsoAgAgAUEBEKgBDAELIAFFDQAgAEEMaygCACABQQF0QQIQqAELIABBLGohACAFQQFrIgUNAAsLIAMoAgAiAARAIAQgAEEsbEEEEKgBCyACQQFqIgIgBkcNAAsLC+YBAQN/IwBBEGsiAyQAIAMCfyACKAIAQQFxBEBBhJzAACEEQQkMAQsgA0EEaiACKAIEIAIoAggQIUGEnMAAIAMoAgggAygCBCICGyEEQQkgAygCDCACGws2AgggAyAENgIEIANBBGogARBYAkAgACgCACIBQYCAgIB4RwRAIAFFDQEgACgCBCABQQEQqAEMAQsgAC0ABEEDRw0AIAAoAggiACgCACEBIABBBGooAgAiAigCACIFBEAgASAFEQUACyACKAIEIgUEQCABIAUgAigCCBCoAQsgAEEMQQQQqAELIANBEGokAAvzAQEDfyMAQSBrIgIkACACQQhqIgMgAUEkaigCADYCAEGh1cAALQAAGiACIAEpAhw3AwBBDEEEEJ0BIgQEQCAEIAIpAwA3AgAgBEEIaiADKAIANgIAAkAgASgCBCIDQQNGIANBAklyDQACQAJAIAEtABhBAWsOAgIAAQsgAkEBNgIEIAJBpIfAADYCACACQgA3AgwgAiACQRxqNgIIIAJBiIjAABB8AAsgAUEIahBLIAEoAggiA0UNACABKAIMIANBDGxBBBCoAQsgAUEoQQQQqAEgAEG8hsAANgIEIAAgBDYCACACQSBqJAAPC0EEQQwQwQEAC6AEAgV/AX4jAEEQayIDJAACfyAAKAIAQQJHBEAjAEFAaiICJABBASEEAkACQAJ/AkAgACgCAEEBRgRAIAIgAEEEajYCCCABKAIIIAIgATYCFCACQoCAgICAyNAHNwIMIAJBCGqtQoCAgICACoQhB0GAgIAEcQ0BIAJBATYCHCACQcytwAA2AhggAkIBNwIkIAIgBzcDMCACIAJBMGo2AiAgAkEMakGIo8AAIAJBGGoQJgwCCyABIAAoAhAgACgCFBCRAQ0DDAILIAJBATYCLCACQdStwAA2AiggAkEBNgIcIAJBzK3AADYCGCACQQE2AiQgAiAHNwMwIAIgAkEwajYCICACQQxqQYijwAAgAkEYahAmCyIFQQAgAigCDCIGG0UEQCAFDQIgBkUNAUGQrsAAQTcgAkE/akGArsAAQciuwAAQYwALIAFB7K3AAEEUEJEBDQELIAEgACgCGCAAKAIcEJEBIQQLIAJBQGskACAEDAELAkACQAJAIAAoAiQiAkUNACAAKAIgIQADQCADQQRqIAAgAhAhAkAgAygCBEEBRgRAIAMtAA0hBCADLQAMIQUgAygCCCEGQY2cwABBAyABEMMBRQ0BDAULIAMoAgggAygCDCABEMMBDQQMAgsgBUEBcUUNASACIAQgBmoiBEkNAiAAIARqIQAgAiAEayICDQALC0EADAILIAQgAkH8ncAAEKoBAAtBAQsgA0EQaiQAC5UCAQJ/IwBBIGsiBSQAQcDVwABBwNXAACgCACIGQQFqNgIAAn9BACAGQQBIDQAaQQFBjNnAAC0AAA0AGkGM2cAAQQE6AABBiNnAAEGI2cAAKAIAQQFqNgIAQQILQf8BcSIGQQJHBEAgBkEBcQRAIAVBCGogACABKAIYEQIACwALAkBBtNXAACgCACIGQQBOBEBBtNXAACAGQQFqNgIAQbjVwAAoAgAEQCAFIAAgASgCFBECACAFIAQ6AB0gBSADOgAcIAUgAjYCGCAFIAUpAwA3AhBBuNXAACgCACAFQRBqQbzVwAAoAgAoAhQRAgALQbTVwABBtNXAACgCAEEBazYCAEGM2cAAQQA6AAAgA0UNAQALAAsAC7sBAQJ/IwBBIGsiAyQAAkACf0EAIAEgASACaiICSw0AGkEAQQggAiAAKAIAIgFBAXQiBCACIARLGyICIAJBCE0bIgRBAEgNABpBACECIAMgAQR/IAMgATYCHCADIAAoAgQ2AhRBAQUgAgs2AhggA0EIakEBIAQgA0EUahBZIAMoAghBAUcNASADKAIQIQAgAygCDAsgAEHAscAAEIoBAAsgAygCDCEBIAAgBDYCACAAIAE2AgQgA0EgaiQAC9kBACAAQSBJBEBBAA8LIABB/wBJBEBBAQ8LIABBgIAETwRAIABBgIAITwRAIABB4P//AHFB4M0KRyAAQf7//wBxQZ7wCkdxIABBwO4Ka0F6SXEgAEGwnQtrQXJJcSAAQfDXC2tBcUlxIABBgPALa0HebElxIABBgIAMa0GedElxIABB0KYMa0F7SXEgAEGAgjhrQbDFVElxIABB8IM4SXEPCyAAQdjGwABBLEGwx8AAQdABQYDJwABB5gMQOA8LIABB5szAAEEoQbbNwABBogJB2M/AAEGpAhA4C7sBAQV/IwBBIGsiAiQAIAAoAgAiBEH/////AUsEQEEAQQAgARCKAQALAkBBBCAEQQF0IgUgBUEETRsiBUECdCIGQfz///8HTQR/IAIgBAR/IAIgBEECdDYCHCACIAAoAgQ2AhRBBAUgAws2AhggAkEIakEEIAYgAkEUahBZIAIoAghBAUcNASACKAIQIQMgAigCDAUgAwsgAyABEIoBAAsgAigCDCEBIAAgBTYCACAAIAE2AgQgAkEgaiQAC8gBAgN/AX4jAEEQayIEJAACQCAAKAIQIgNFBEAMAQtBASECQfarwABBASADEMMBDQAgAVAEQEH2qsAAQQEgAxDDASECDAELAkAgASAANQIUIgVYBEAgBSABfSIBQhpUDQFB9qrAAEEBIAMQwwENAiAEIAE3AwggBEEIaiADEK8BIQIMAgtBzKvAAEEQIAMQwwENAUEAIQIgAEEAOgAEIABBADYCAAwBCyAEIAGnQeEAajYCBCAEQQRqIAMQQyECCyAEQRBqJAAgAgvBAQIDfwF+IwBBMGsiAiQAIAEoAgBBgICAgHhGBEAgASgCDCEDIAJBFGoiBEEANgIAIAJCgICAgBA3AgwgAkEgaiADKAIAIgNBCGopAgA3AwAgAkEoaiADQRBqKQIANwMAIAIgAykCADcDGCACQQxqQbSXwAAgAkEYahAmGiACQQhqIAQoAgAiAzYCACACIAIpAgwiBTcDACABQQhqIAM2AgAgASAFNwIACyAAQfCcwAA2AgQgACABNgIAIAJBMGokAAuyAQEGfwJAAkAgAEGEAUkNACAA0G8mARA/IgEoAgwhBSABKAIQIQIgAUIANwIMIAEoAgghAyABKAIEIQQgAUIENwIEIAEoAgAhBiABQQA2AgAgACACSQ0BIAAgAmsiACADTw0BIAQgAEECdGogBTYCACABIAI2AhAgASAANgIMIAEgAzYCCCABKAIEIAEgBDYCBCABKAIAIQAgASAGNgIAIABFDQAgAEECdEEEEKgBCw8LAAvRAwIMfwF+IwBBIGsiBCQAIARBGGoiCRA/IgVBEGoiBygCADYCACAEQRBqIgogBUEIaiIIKQIANwMAIAdBADYCACAIQgA3AgAgBSkCACEMIAVCgICAgMAANwIAIAQgDDcDCAJ/IwBBIGsiAyQAAkACQCAEQQhqIgAoAgwiASAAKAIIIgJGBEACQCAAKAIAIgIgAUYEQNBvQYABIAEgAUGAAU0bIgb8DwEiAkF/Rg0EAkAgACgCECILRQRAIAAgAjYCEAwBCyABIAtqIAJHDQULIAEgBmoiAkH/////AUsNBCADIAEEfyADIAFBAnQ2AhwgAyAAKAIENgIUQQQFQQALNgIYIANBCGpBBCACQQJ0IANBFGoQWSADKAIIQQFGDQQgAygCDCEGIAAgAjYCACAAIAY2AgQMAQsgASACTw0DCyAAIAFBAWoiAjYCCCAAKAIEIAFBAnRqIAI2AgAMAQsgASACTw0BCyAAIAAoAgQgAUECdGooAgA2AgwgACgCECADQSBqJAAgAWoMAQsACyAIIAopAwA3AgAgByAJKAIANgIAIAUoAgQhAyAFKAIAIQEgBSAEKQMINwIAIAEEQCADIAFBAnRBBBCoAQsgBEEgaiQAC64BAQF/IwBBEGsiBiQAAkAgAQRAIAZBBGogASADIAQgBSACKAIQEQYAAkAgBigCBCICIAYoAgwiAU0EQCAGKAIIIQUMAQsgAkECdCECIAYoAgghAyABRQRAQQQhBSADIAJBBBCoAQwBCyADIAJBBCABQQJ0IgIQjwEiBUUNAgsgACABNgIEIAAgBTYCACAGQRBqJAAPC0HAlMAAQTIQtQEAC0EEIAJBsJTAABCKAQALrwEBA38jAEEgayICJAACQCAAKAIEIgNFBEBBAUEAIAEQwwEhAwwBCyAAKAIAIQAgAiADNgIMIAIgADYCCCACQRBqIAJBCGoQKSACKAIQIgAEQANAIAIoAhQhBCACKAIcRQRAIAAgBCABEMMBIQMMAwtBASEDIAEgACAEEJEBDQIgAUH9/wMQkgENAiACQRBqIAJBCGoQKSACKAIQIgANAAsLQQAhAwsgAkEgaiQAIAMLjwEBAX8gAkEATgRAAn8gAygCBARAAkAgAygCCCIERQRADAELIAMoAgAgBCABIAIQjwEMAgsLIAEgAkUNABpBodXAAC0AABogAiABEJ0BCyIDRQRAIAAgAjYCCCAAIAE2AgQgAEEBNgIADwsgACACNgIIIAAgAzYCBCAAQQA2AgAPCyAAQQA2AgQgAEEBNgIAC6IBAgJ/AX4jAEEQayIDJAACQAJAAkAgASgCCCIEIAEoAgRJBEAgASgCACAEai0AACACQf8BcUYNAQsgAEIANwMIDAELQQEhAiABIARBAWo2AgggAyABEDQgAy0AAEUEQCADKQMIIgVCf1IEQCAAIAVCAXw3AwgMAgsgAEEAOgABDAILIAAgAy0AAToAAQwBC0EAIQILIAAgAjoAACADQRBqJAALqgEBAn8jAEEgayIBJAACQCAAKAIEIgJBA0YgAkECSXINAAJAAkAgAC0AGEEBaw4CAgABCyABQQE2AgggAUGkh8AANgIEIAFCADcCECABIAFBHGo2AgwgAUEEakGIiMAAEHwACyAAQQhqEEsgACgCCCICRQ0AIAAoAgwgAkEMbEEEEKgBCyAAKAIcIgIEQCAAKAIgIAJBARCoAQsgAEEoQQQQqAEgAUEgaiQAC6IBAgJ/AX4jAEEQayICJAAgASgCCCEDIAIgARA0AkAgAi0AAEEBRgRAIAItAAEhASAAQQA2AgAgACABOgAEDAELIAIpAwgiBCADQQFrrVQEQCABKAIMQQFqIgNB9ANNBEAgACADNgIMIAAgBD4CCCAAIAEpAgA3AgAMAgsgAEEANgIAIABBAToABAwBCyAAQQA2AgAgAEEAOgAECyACQRBqJAALlAEBA38jAEEQayICJAACf0EBIAEoAgAiA0EnIAEoAgQiBCgCECIBEQAADQAaIAJBBGogACgCAEGBAhAfAkAgAi0ABEGAAUYEQCADIAIoAgggAREAAEUNAUEBDAILIAMgAi0ADiIAIAJBBGpqIAItAA8gAGsgBCgCDBEBAEUNAEEBDAELIANBJyABEQAACyACQRBqJAALlQEBA38CfwJAAkAgASgCACIDRQRADAELA0ACQCABKAIIIgQgASgCBE8NACADIARqLQAAQcUARw0AIAEgBEEBajYCCAwCCwJAIAJFDQAgASgCECIDRQ0AQf2rwABBAiADEMMBDQMLIAEQFg0CIAJBAWohAiABKAIAIgMNAAsLQQAMAQtBAQshASAAIAI2AgQgACABNgIAC5kBAQJ/IwBBIGsiASQAAkAgACgCBEECRw0AAkACQCAALQAYQQFrDgICAAELIAFBATYCCCABQaSHwAA2AgQgAUIANwIQIAEgAUEcajYCDCABQQRqQYiIwAAQfAALIABBCGoQSyAAKAIIIgJFDQAgACgCDCACQQxsQQQQqAELIAAoAhwiAgRAIAAoAiAgAkEBEKgBCyABQSBqJAALlAEBAn8jAEEgayIDJAACQCAAKAIEIgRBA0YgBEECSXINAAJAAkAgAC0AGEEBaw4CAgABCyADQQE2AgggA0Gkh8AANgIEIANCADcCECADIANBHGo2AgwgA0EEakGIiMAAEHwACyAAQQhqEEsgACgCCCIERQ0AIAAoAgwgBEEMbEEEEKgBCyAAQShBBBCoASADQSBqJAALhAEBA38CfwJAIAAoAgAiAUUNAANAAkAgACgCCCIDIAAoAgRPDQAgASADai0AAEHFAEcNACAAIANBAWo2AggMAgsCQCACRQ0AIAAoAhAiAUUNAEH9q8AAQQIgARDDAUUNAEEBDwtBASAAQQEQEw0CGiACQQFrIQIgACgCACIBDQALC0EACwt6AQF/IwBBIGsiAiQAAn8gACgCAEGAgICAeEcEQCABIAAoAgQgACgCCBCRAQwBCyACQRBqIAAoAgwoAgAiAEEIaikCADcDACACQRhqIABBEGopAgA3AwAgAiAAKQIANwMIIAEoAgAgASgCBCACQQhqECYLIAJBIGokAAt7AQF/IwBBQGoiBSQAIAUgATYCDCAFIAA2AgggBSADNgIUIAUgAjYCECAFQQI2AhwgBUHUvcAANgIYIAVCAjcCJCAF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AEEEayEAIAhC/6ziBFYgByEIDQALCyAHQglWBEAgACADakELaiAHpyICIAJB//8DcUHkAG4iAkHkAGxrQf//A3FBAXQiBEGSvsAAai0AADoAACAAQQJrIgAgA0EMamogBEGRvsAAai0AADoAACACrSEHCyAJUEUgB1BxRQRAIABBAWsiACADQQxqaiAHp0EBdEEecUGSvsAAai0AADoAAAsgAUEBQQAgA0EMaiAAakEUIABrECAgA0EgaiQACw0AIABBpIrAACABECYLCgAgACABIAIQJgsOACABQbCMwABBBRCRAQvCAwIGfwF+IAAoAgAhACMAQdAAayICJAAgAkEgaiAAIAAoAgAoAgQRAgAgAiACQcgAaq1CgICAgIAEhDcDKEEBIQMgAkEBNgI0IAJBlI7AADYCMCACQgE3AjwgAiACKQMgNwJIIAIgAkEoajYCOAJAIAEoAgAiBiABKAIEIgcgAkEwahAmDQAgAS0ACkGAAXFFBEBBACEDDAELIAJBGGogACAAKAIAKAIEEQIAIAJBEGogAigCGCACKAIcKAIYEQIAIAIoAhAiBEUEQEEAIQMMAQsgAkEIaiAEIAIoAhQiBSgCGBECACACKAIMIQEgAigCCCEAIAIgBTYCLCACIAQ2AiggAkEBNgI0IAJBoI7AADYCMCACQgE3AjwgAiACQShqrUKAgICAgASEIgg3A0ggAiACQcgAajYCOCAGIAcgAkEwahCxAQ0AA0AgAEUEQEEAIQMMAgsgAiAAIAEoAhgRAgAgAigCBCACKAIAIAIgATYCLCACIAA2AiggAkEBNgI0IAJBoI7AADYCMCACQgE3AjwgAiAINwNIIAIgAkHIAGo2AjghACEBIAYgByACQTBqELEBRQ0ACwsgAkHQAGokACADCw0AIABB2JHAACABECYLCQAgACABEA4ACykAAn8gACgCAC0AAEUEQCABQfS/wABBBRAjDAELIAFB+b/AAEEEECMLCw0AIABBtJfAACABECYLygECA38BfiAAKAIAIQIjAEGAAWsiBCQAAkAgASkCCCIFpyIAQYCAgARxRQ0AIABBgICAwABxBEAgAEGAgIAIciEADAELIAFBCjsBDCAAQYCAgMgAciEACyABIABBgICABHI2AghBACEAA0AgACAEakH/AGogAkEPcSIDQTByIANB1wBqIANBCkkbOgAAIABBAWshACACQQ9LIAJBBHYhAg0ACyABQY++wABBAiAAIARqQYABakEAIABrECAgASAFNwIIIARBgAFqJAALDAAgACABKQIANwMAC8IYAhN/AX4gACgCACEAIwBBIGsiECQAAn8gACgCAEUEQCAQQQA2AhwgECABNgIYIBBCADcCECAQIAApAgQ3AgggEEEIakEBEBIMAQsgASEKIwBBEGsiDSQAIAAoAgghEiAAKAIEIQ8gACgCACEIAkACQAJAA0AgFCIGIBJJIRMgBiASTw0CIAghAQJAAkAgD0UNACAGQQFqIgsgBiATGyEUIA9BAWshCCABLQAAIQRBACEDAkACQANAAkACQCAEwEEASARAIARBH3EhByABIANqIgJBAWotAABBP3EhBSAEQf8BcSIAQd8BSw0BIAdBBnQgBXIhAgwCCyAEQf8BcSECDAELIAJBAmotAABBP3EgBUEGdHIhBSAAQfABSQRAIAUgB0EMdHIhAgwBCyAHQRJ0QYCA8ABxIAJBA2otAABBP3EgBUEGdHJyIgJBgIDEAEYNBAsgAkEwa0EKSQRAIAMgCEYNBCABIANqIgBBAWosAAAiBEG/f0wNAiADQQFqIQMMAQsLIAMNAUEAIQAMBQsgACAPIANrIgBBASAAQcSkwAAQlAEACyABIANqIgksAABBv39KDQEgASAPQQAgA0HUpMAAEJQBAAtBtKTAABCuAQALIAEtAAAhCAJAAkACQAJAIANBAUYEQEEBIQAgASECIAhBK2sOAwYBBgELIAhBK0YEQCADQQFrIQAgAUEBaiECIANBCkkNAQwCCyABIQIgAyEAIANBCU8NAQtBACEFA0AgAi0AAEEwayIIQQlLDQIgAkEBaiECIAggBUEKbGohBSAAQQFrIgANAAsMAgtBACEFIAAhCANAIAhFDQIgAi0AAEEwayIOQQlLDQFBAiEAIAWtQgp+IhVCIIinDQQgAkEBaiECIAhBAWshCCAOIBWnIgdqIgUgB08NAAsMAwtBASEADAILIA8gBWshBwJAAkACQAJAIAVFDQAgDyADayIIIAVNBEAgAyAHRg0BDAQLIAEgBWogA2oiACwAAEFASA0DIAAsAABBv39MDQELIAEgBWogA2ohCCALIBJHDQEgBUUgCigCCEGAgIAEcUUgBEH/AXFB6ABHcnINAQJAIAVBAUcE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igAAABwAAAA0AhAAIAAAAI8AAAAgAAAAL3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9zdGQvc3JjL3RocmVhZC9sb2NhbC5ycwCkAhAATwAAABgCAAAmAAAAZGVzY3JpcHRpb24oKSBpcyBkZXByZWNhdGVkOyB1c2UgRGlzcGxheRoAAAAMAAAABAAAAAIAAAAaAAAADAAAAAQAAAADAAAAAgAAACwDEAAHAAAABQAAABsAAAAHAAAAHAAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGludmFsaWQgT25jZSBzdGF0ZWgDEAA8AAAAL3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9zdGQvc3JjL3N5cy9zeW5jL29uY2Uvbm9fdGhyZWFkcy5ycwCsAxAAWwAAADUAAAASAAAAL3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9hbGxvYy9zcmMvc2xpY2UucnMAABgEEABKAAAAvgEAAB0AAABzcGFyay1pbnRlcm5hbC1ycy9zcmMvbGliLnJzdAQQABwAAAAcAAAAMwAAAHQEEAAcAAAAJwAAAC0AAAABAAAAAAAAAHQEEAAcAAAAPwAAACgAAAAvcnVzdGMvNmIwMGJjMzg4MDE5ODYwMDEzMGUxY2Y2MmI4ZjhhOTM0OTQ0ODhjYy9saWJyYXJ5L2FsbG9jL3NyYy92ZWMvbW9kLnJzyAQQAEwAAABWCgAAJAAAAAAAAAAQAAAABAAAAB0AAAAeAAAAHwAAACAgICA6IAAAAQAAAAAAAABABRAAAgAAAAIAQd6KwAALAQUAQeiKwAALISAAAKggICAgICAgACIAAAAMAAAABAAAACMAAAAkAAAAJQBBlIvAAAu5DgEAAAAmAAAAYSBEaXNwbGF5IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yIHVuZXhwZWN0ZWRseS9ydXN0Yy82YjAwYmMzODgwMTk4NjAwMTMwZTFjZjYyYjhmOGE5MzQ5NDQ4OGNjL2xpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwAA0wUQAEsAAADwCgAADgAAAEVycm9yYXNzZXJ0aW9uIGZhaWxlZDogc2VsZi5pc19jaGFyX2JvdW5kYXJ5KG5ld19sZW4pAAAA0wUQAEsAAAC1BQAADQAAAAAAAAAQAAAABAAAAB0AAAAeAAAAHwAAAGJhY2t0cmFjZSBjYXB0dXJlIGZhaWxlZC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2FueWhvdy0xLjAuOTgvc3JjL2Vycm9yLnJzqAYQAFwAAABnBAAADgAAAAEAAAAAAAAAOiAAABwHEAACAAAACgpDYXVzZWQgYnk6CgAAADQHEAABAAAACgpzdGFjayBiYWNrdHJhY2U6U3RhY2sgYmFja3RyYWNlOgoAUgcQABEAAABTL3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9hbGxvYy9zcmMvcmF3X3ZlYy9tb2QucnMAAABtBxAAUAAAAC4CAAARAAAAL3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9pbmRleC5ycwDQBxAATwAAAEwDAAA0AAAA0AcQAE8AAABTAwAAMgAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuaXNfY2hhcl9ib3VuZGFyeShuKS9ydXN0Yy82YjAwYmMzODgwMTk4NjAwMTMwZTFjZjYyYjhmOGE5MzQ5NDQ4OGNjL2xpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwAAAGoIEABLAAAADAgAAB0AAABqCBAASwAAABQIAAAdAAAAJwAAAAwAAAAEAAAAKAAAACkAAAAlAAAAL3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9jb3JlL3NyYy9pdGVyL3RyYWl0cy9pdGVyYXRvci5yc/AIEABYAAAA0QcAAAkAAAAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9qcy1zeXMtMC4zLjc3L3NyYy9saWIucnMAAFgJEABaAAAA+xgAAAEAAAAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93YXNtLWJpbmRnZW4tMC4yLjEwMC9zcmMvY29udmVydC9zbGljZXMucnPECRAAbAAAACQBAAAOAAAAY2xvc3VyZSBpbnZva2VkIHJlY3Vyc2l2ZWx5IG9yIGFmdGVyIGJlaW5nIGRyb3BwZWRMYXp5IGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWRyChAAKgAAAC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL29uY2VfY2VsbC0xLjIxLjMvc3JjL2xpYi5ycwAAAKQKEABdAAAACAMAABkAAAByZWVudHJhbnQgaW5pdAAAFAsQAA4AAACkChAAXQAAAHoCAAANAAAAOiAAAAAAAAAEAAAABAAAADsAAAAvcnVzdGMvNmIwMGJjMzg4MDE5ODYwMDEzMGUxY2Y2MmI4ZjhhOTM0OTQ0ODhjYy9saWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjL21vZC5yc1ALEABQAAAALgIAABEAAAA6AAAAPAAAAAwAAAAEAAAAPQAAAD4AAAA/AAAAL3J1c3QvZGVwcy9kbG1hbGxvYy0wLjIuOC9zcmMvZGxtYWxsb2MucnNhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA+PSBzaXplICsgbWluX292ZXJoZWFkAMwLEAApAAAArAQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAADMCxAAKQAAALIEAAANAAAAbGlicmFyeS9zdGQvc3JjL3N5bmMvbGF6eV9sb2NrLnJzAAAAdAwQACEAAADRAAAAEwAAAGxpYnJhcnkvc3RkL3NyYy9iYWNrdHJhY2UucnMCAAAAAAAAAAIAQdiZwAALxQQgAIDgb3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybdwMEAAoAAAAJAAAAAIAAAAEDRAAdW5zdXBwb3J0ZWQgYmFja3RyYWNlZGlzYWJsZWQgYmFja3RyYWNlAKgMEAAcAAAAigEAAB0AAABAAAAAEAAAAAQAAABBAAAAQgAAAAEAAAAAAAAAY2Fubm90IHJlY3Vyc2l2ZWx5IGFjcXVpcmUgbXV0ZXhsDRAAIAAAAGxpYnJhcnkvc3RkL3NyYy9zeXMvc3luYy9tdXRleC9ub190aHJlYWRzLnJzlA0QACwAAAATAAAACQAAAGxpYnJhcnkvc3RkL3NyYy9zeW5jL3BvaXNvbi9vbmNlLnJzANANEAAjAAAAmwAAADIAAAA8dW5rbm93bj7vv71tZW1vcnkgYWxsb2NhdGlvbiBvZiAgYnl0ZXMgZmFpbGVkAAAQDhAAFQAAACUOEAANAAAAbGlicmFyeS9zdGQvc3JjL2FsbG9jLnJzRA4QABgAAABkAQAACQAAAAoAAAA8AAAADAAAAAQAAABDAAAAAAAAAAgAAAAEAAAARAAAAAAAAAAIAAAABAAAAEUAAABGAAAARwAAAEgAAABJAAAAEAAAAAQAAABKAAAASwAAAEwAAABNAAAAbGlicmFyeS9zdGQvc3JjLy4uLy4uL2JhY2t0cmFjZS9zcmMvc3ltYm9saXplL21vZC5yc8gOEAA0AAAAZwEAADAAAAABAAAAAAAAADwLEAACAAAAAgBBpp7AAAsBBABBsJ7AAAuFCSAAAOggLSAAAQAAAAAAAAA0DxAAAwAAAAIAAAAAAAAAAQAAAAEAAAAAAAAAIAAA6CAgICAgICAgICAgICAgICAgICBhdCAAALALEAABAAAAT25jZSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkAACADxAAKgAAAG9uZS10aW1lIGluaXRpYWxpemF0aW9uIG1heSBub3QgYmUgcGVyZm9ybWVkIHJlY3Vyc2l2ZWx5tA8QADgAAAAAKCkAAAAAAAQAAAAEAAAAUQAAAC9ydXN0Yy82YjAwYmMzODgwMTk4NjAwMTMwZTFjZjYyYjhmOGE5MzQ5NDQ4OGNjL2xpYnJhcnkvY29yZS9zcmMvb3BzL2Z1bmN0aW9uLnJzCBAQAFAAAACmAAAABQAAAC9ydXN0Yy82YjAwYmMzODgwMTk4NjAwMTMwZTFjZjYyYjhmOGE5MzQ5NDQ4OGNjL2xpYnJhcnkvY29y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rXh5i42iMFdYi4yQHN0OD0tM+/wuLz9cXV/ihI2OkZKpsbq7xcbJyt7k5f8ABBESKTE0Nzo7PUlKXYSOkqmxtLq7xsrOz+TlAAQNDhESKTE0OjtFRklKXmRlhJGbncnOzw0RKTo7RUlXW1xeX2RljZGptLq7xcnf5OXwDRFFSWRlgISyvL6/1dfw8YOFi6Smvr/Fx8/a20iYvc3Gzs9JTk9XWV5fiY6Psba3v8HGx9cRFhdbXPb3/v+AbXHe3w4fbm8cHV99fq6vTbu8FhceH0ZHTk9YWlxefn+1xdTV3PDx9XJzj3R1liYuL6evt7/Hz9ffmgBAl5gwjx/Oz9LUzv9OT1pbBwgPECcv7u9ubzc9P0JFkJFTZ3XIydDR2Nnn/v8AIF8igt8EgkQIGwQGEYGsDoCrBR8IgRwDGQgBBC8ENAQHAwEHBgcRClAPEgdVBwMEHAoJAwgDBwMCAwMDDAQFAwsGAQ4VBU4HGwdXBwIGFwxQBEMDLQMBBBEGDww6BB0lXyBtBGolgMgFgrADGgaC/QNZBxYJGAkUDBQMagYKBhoGWQcrBUYKLAQMBAEDMQssBBoGCwOArAYKBi8xgPQIPAMPAz4FOAgrBYL/ERgILxEtAyEPIQ+AjASCmhYLFYiUBS8FOwcCDhgJgL4idAyA1hqBEAWA4QnyngM3CYFcFIC4CIDdFTsDCgY4CEYIDAZ0Cx4DWgRZCYCDGBwKFglMBICKBqukDBcEMaEEgdomBwwFBYCmEIH1BwEgKgZMBICNBIC+AxsDDw1yYW5nZSBzdGFydCBpbmRleCAgb3V0IG9mIHJhbmdlIGZvciBzbGljZSBvZiBsZW5ndGggAAAAASkQABIAAAATKRAAIgAAAHJhbmdlIGVuZCBpbmRleCBIKRAAEAAAABMpEAAiAAAAc2xpY2UgaW5kZXggc3RhcnRzIGF0ICBidXQgZW5kcyBhdCAAaCkQABYAAAB+KRAADQAAAAADAACDBCAAkQVgAF0ToAASFyAfDCBgH+8sICsqMKArb6ZgLAKo4Cwe++AtAP4gNp7/YDb9AeE2AQohNyQN4TerDmE5LxjhOTAc4UrzHuFOQDShUh5h4VPwamFUT2/hVJ28YVUAz2FWZdGhVgDaIVcA4KFYruIhWuzk4VvQ6GFcIADuXPABf11AHhAAQh4QAEQeEAACAAAAAgAAAAcAAAAAAAA/AAAAvwBB3NTAAAsBNgB8CXByb2R1Y2VycwIIbGFuZ3VhZ2UBBFJ1c3QADHByb2Nlc3NlZC1ieQMFcnVzdGMdMS44OC4wICg2YjAwYmMzODggMjAyNS0wNi0yMykGd2FscnVzBjAuMjMuMwx3YXNtLWJpbmRnZW4TMC4yLjEwMCAoMjQwNWVjMmI0KQBrD3RhcmdldF9mZWF0dXJlcwYrD211dGFibGUtZ2xvYmFscysTbm9udHJhcHBpbmctZnB0b2ludCsLYnVsay1tZW1vcnkrCHNpZ24tZXh0Kw9yZWZlcmVuY2UtdHlwZXMrCm11bHRpdmFsdWU=",self.location.href));const A=AB();(typeof B=="string"||typeof Request=="function"&&B instanceof Request||typeof URL=="function"&&B instanceof URL)&&(B=fetch(B));const{instance:I,module:g}=await $g(await B,A);return IB(I,g)}var Eg={},gB=function(B,A,I,g,Q){var C=new Worker(Eg[A]||(Eg[A]=URL.createObjectURL(new Blob([B+\';addEventListener("error",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})\'],{type:"text/javascript"}))));return C.onmessage=function(t){var E=t.data,i=E.$e$;if(i){var s=new Error(i[0]);s.code=i[1],s.stack=i[2],Q(s,null)}else Q(null,E)},C.postMessage(I,g),C},j=Uint8Array,xA=Uint16Array,tg=Int32Array,RI=new j([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]),UI=new j([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]),ig=new j([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),sg=function(B,A){for(var I=new xA(31),g=0;g<31;++g)I[g]=A+=1<>1|(_&21845)<<1;fA=(fA&52428)>>2|(fA&13107)<<2,fA=(fA&61680)>>4|(fA&3855)<<4,iI[_]=((fA&65280)>>8|(fA&255)<<8)>>1}for(var bA=function(B,A,I){for(var g=B.length,Q=0,C=new xA(A);Q>i]=s}else for(E=new xA(g),Q=0;Q>15-B[Q]);return E},$A=new j(288),_=0;_<144;++_)$A[_]=8;for(var _=144;_<256;++_)$A[_]=9;for(var _=256;_<280;++_)$A[_]=7;for(var _=280;_<288;++_)$A[_]=8;for(var og=new j(32),_=0;_<32;++_)og[_]=5;var rg=bA($A,9,1),ag=bA(og,5,1),sI=function(B){for(var A=B[0],I=1;IA&&(A=B[I]);return A},oA=function(B,A,I){var g=A/8|0;return(B[g]|B[g+1]<<8)>>(A&7)&I},eI=function(B,A){var I=A/8|0;return(B[I]|B[I+1]<<8|B[I+2]<<16)>>(A&7)},mI=function(B){return(B+7)/8|0},kA=function(B,A,I){return(A==null||A<0)&&(A=0),(I==null||I>B.length)&&(I=B.length),new j(B.subarray(A,I))},hg=["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"],O=function(B,A,I){var g=new Error(A||hg[B]);if(g.code=B,Error.captureStackTrace&&Error.captureStackTrace(g,O),!I)throw g;return g},JI=function(B,A,I,g){var Q=B.length,C=g?g.length:0;if(!Q||A.f&&!A.l)return I||new j(0);var t=!I,E=t||A.i!=2,i=A.i;t&&(I=new j(Q*3));var s=function(EA){var iA=I.length;if(EA>iA){var sA=new j(Math.max(iA*2,EA));sA.set(I),I=sA}},n=A.f||0,e=A.p||0,r=A.b||0,o=A.l,a=A.d,c=A.m,M=A.n,h=Q*8;do{if(!o){n=oA(B,e,1);var D=oA(B,e+1,3);if(e+=3,D)if(D==1)o=rg,a=ag,c=9,M=5;else if(D==2){var R=oA(B,e,31)+257,p=oA(B,e+10,15)+4,u=R+oA(B,e+5,31)+1;e+=14;for(var l=new j(u),k=new j(19),N=0;N>4;if(w<16)l[N++]=w;else{var J=0,z=0;for(w==16?(z=3+oA(B,e,3),e+=2,J=l[N-1]):w==17?(z=3+oA(B,e,7),e+=3):w==18&&(z=11+oA(B,e,127),e+=7);z--;)l[N++]=J}}var W=l.subarray(0,R),Z=l.subarray(R);c=sI(W),M=sI(Z),o=bA(W,c,1),a=bA(Z,M,1)}else O(1);else{var w=mI(e)+4,F=B[w-4]|B[w-3]<<8,G=w+F;if(G>Q){i&&O(0);break}E&&s(r+F),I.set(B.subarray(w,G),r),A.b=r+=F,A.p=e=G*8,A.f=n;continue}if(e>h){i&&O(0);break}}E&&s(r+131072);for(var P=(1<>4;if(e+=J&15,e>h){i&&O(0);break}if(J||O(2),q<256)I[r++]=q;else if(q==256){v=e,o=null;break}else{var b=q-254;if(q>264){var N=q-257,Y=RI[N];b=oA(B,e,(1<>4;T||O(3),e+=T&15;var Z=ng[S];if(S>3){var Y=UI[S];Z+=eI(B,e)&(1<h){i&&O(0);break}E&&s(r+131072);var CA=r+b;if(r>>0},LI=function(B,A){return gA(B,A)+gA(B,A+4)*4294967296},nB=function(B){(B[0]!=31||B[1]!=139||B[2]!=8)&&O(6,"invalid gzip data");var A=B[3],I=10;A&4&&(I+=(B[10]|B[11]<<8)+2);for(var g=(A>>3&1)+(A>>4&1);g>0;g-=!B[I++]);return I+(A&2)},xI=function(){function B(A,I){typeof A=="function"&&(I=A,A={}),this.ondata=I;var g=A&&A.dictionary&&A.dictionary.subarray(-32768);this.s={i:0,b:g?g.length:0},this.o=new j(32768),this.p=new j(0),g&&this.o.set(g)}return B.prototype.e=function(A){if(this.ondata||O(5),this.d&&O(4),!this.p.length)this.p=A;else if(A.length){var I=new j(this.p.length+A.length);I.set(this.p),I.set(A,this.p.length),this.p=I}},B.prototype.c=function(A){this.s.i=+(this.d=A||!1);var I=this.s.b,g=JI(this.p,this.s,this.o);this.ondata(kA(g,I,this.s.b),this.d),this.o=kA(g,this.s.b-32768),this.s.b=this.o.length,this.p=kA(this.p,this.s.p/8|0),this.s.p&=7},B.prototype.push=function(A,I){this.e(A),this.c(I)},B}();function oB(B,A,I){return I||(I=A,A={}),typeof I!="function"&&O(7),eB(B,A,[sB],function(g){return wg(oI(g.data[0],Dg(g.data[1])))},1,I)}function oI(B,A){return JI(B,{i:2},A&&A.out,A&&A.dictionary)}var yg=function(){function B(A,I){this.v=1,this.r=0,xI.call(this,A,I)}return B.prototype.push=function(A,I){if(xI.prototype.e.call(this,A),this.r+=A.length,this.v){var g=this.p.subarray(this.v-1),Q=g.length>3?nB(g):4;if(Q>g.length){if(!I)return}else this.v>1&&this.onmember&&this.onmember(this.r-g.length);this.p=g.subarray(Q),this.v=0}xI.prototype.c.call(this,I),this.s.f&&!this.s.l&&!I&&(this.v=mI(this.s.p)+9,this.s={i:0},this.o=new j(0),this.push(new j(0),I))},B}(),pI=typeof TextDecoder<"u"&&new TextDecoder;try{pI.decode(CB,{stream:!0})}catch{}var rB=function(B){for(var A="",I=0;;){var g=B[I++],Q=(g>127)+(g>223)+(g>239);if(I+Q>B.length)return{s:A,r:kA(B,I-1)};Q?Q==3?(g=((g&15)<<18|(B[I++]&63)<<12|(B[I++]&63)<<6|B[I++]&63)-65536,A+=String.fromCharCode(55296|g>>10,56320|g&1023)):Q&1?A+=String.fromCharCode((g&31)<<6|B[I++]&63):A+=String.fromCharCode((g&15)<<12|(B[I++]&63)<<6|B[I++]&63):A+=String.fromCharCode(g)}};function aB(B,A){if(A){for(var I="",g=0;g65558)return t(O(13,0,1),null),Q;var i=cA(B,E+8);if(i){var s=i,n=gA(B,E+16),e=n==4294967295||s==65535;if(e){var r=gA(B,E-12);e=gA(B,r)==101075792,e&&(s=i=gA(B,r+32),n=gA(B,r+48))}for(var o=A&&A.filter,a=function(M){var h=Mg(B,n,e),D=h[0],w=h[1],F=h[2],G=h[3],R=h[4],p=h[5],u=lg(B,p);n=R;var l=function(N,y){N?(Q(),t(N,null)):(y&&(C[G]=y),--i||t(null,C))};if(!o||o({name:G,size:w,originalSize:F,compression:D}))if(!D)l(null,kA(B,u,u+w));else if(D==8){var k=B.subarray(u,u+w);if(F<524288||w>.8*F)try{l(null,oI(k,{out:new j(F)}))}catch(N){l(N,null)}else g.push(oB(k,{size:F},l))}else l(O(14,"unknown compression type "+D,1),null);else l(null,null)},c=0;c65558)&&O(13);var Q=cA(B,g+8);if(!Q)return{};var C=gA(B,g+16),t=C==4294967295||Q==65535;if(t){var E=gA(B,g-12);t=gA(B,E)==101075792,t&&(Q=gA(B,E+32),C=gA(B,E+48))}for(var i=A&&A.filter,s=0;s=0?1:-1,w=1-h*h;if(w>Number.EPSILON){const G=Math.sqrt(w),R=Math.atan2(G,h*D);M=Math.sin(M*R)/G,E=Math.sin(E*R)/G}const F=E*D;if(i=i*M+r*F,s=s*M+o*F,n=n*M+a*F,e=e*M+c*F,M===1-E){const G=1/Math.sqrt(i*i+s*s+n*n+e*e);i*=G,s*=G,n*=G,e*=G}}A[I]=i,A[I+1]=s,A[I+2]=n,A[I+3]=e}static multiplyQuaternionsFlat(A,I,g,Q,C,t){const E=g[Q],i=g[Q+1],s=g[Q+2],n=g[Q+3],e=C[t],r=C[t+1],o=C[t+2],a=C[t+3];return A[I]=E*a+n*e+i*o-s*r,A[I+1]=i*a+n*r+s*e-E*o,A[I+2]=s*a+n*o+E*r-i*e,A[I+3]=n*a-E*e-i*r-s*o,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,I,g,Q){return this._x=A,this._y=I,this._z=g,this._w=Q,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,I=!0){const g=A._x,Q=A._y,C=A._z,t=A._order,E=Math.cos,i=Math.sin,s=E(g/2),n=E(Q/2),e=E(C/2),r=i(g/2),o=i(Q/2),a=i(C/2);switch(t){case"XYZ":this._x=r*n*e+s*o*a,this._y=s*o*e-r*n*a,this._z=s*n*a+r*o*e,this._w=s*n*e-r*o*a;break;case"YXZ":this._x=r*n*e+s*o*a,this._y=s*o*e-r*n*a,this._z=s*n*a-r*o*e,this._w=s*n*e+r*o*a;break;case"ZXY":this._x=r*n*e-s*o*a,this._y=s*o*e+r*n*a,this._z=s*n*a+r*o*e,this._w=s*n*e-r*o*a;break;case"ZYX":this._x=r*n*e-s*o*a,this._y=s*o*e+r*n*a,this._z=s*n*a-r*o*e,this._w=s*n*e+r*o*a;break;case"YZX":this._x=r*n*e+s*o*a,this._y=s*o*e+r*n*a,this._z=s*n*a-r*o*e,this._w=s*n*e-r*o*a;break;case"XZY":this._x=r*n*e-s*o*a,this._y=s*o*e-r*n*a,this._z=s*n*a+r*o*e,this._w=s*n*e+r*o*a;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+t)}return I===!0&&this._onChangeCallback(),this}setFromAxisAngle(A,I){const g=I/2,Q=Math.sin(g);return this._x=A.x*Q,this._y=A.y*Q,this._z=A.z*Q,this._w=Math.cos(g),this._onChangeCallback(),this}setFromRotationMatrix(A){const I=A.elements,g=I[0],Q=I[4],C=I[8],t=I[1],E=I[5],i=I[9],s=I[2],n=I[6],e=I[10],r=g+E+e;if(r>0){const o=.5/Math.sqrt(r+1);this._w=.25/o,this._x=(n-i)*o,this._y=(C-s)*o,this._z=(t-Q)*o}else if(g>E&&g>e){const o=2*Math.sqrt(1+g-E-e);this._w=(n-i)/o,this._x=.25*o,this._y=(Q+t)/o,this._z=(C+s)/o}else if(E>e){const o=2*Math.sqrt(1+E-g-e);this._w=(C-s)/o,this._x=(Q+t)/o,this._y=.25*o,this._z=(i+n)/o}else{const o=2*Math.sqrt(1+e-g-E);this._w=(t-Q)/o,this._x=(C+s)/o,this._y=(i+n)/o,this._z=.25*o}return this._onChangeCallback(),this}setFromUnitVectors(A,I){let g=A.dot(I)+1;return gMath.abs(A.z)?(this._x=-A.y,this._y=A.x,this._z=0,this._w=g):(this._x=0,this._y=-A.z,this._z=A.y,this._w=g)):(this._x=A.y*I.z-A.z*I.y,this._y=A.z*I.x-A.x*I.z,this._z=A.x*I.y-A.y*I.x,this._w=g),this.normalize()}angleTo(A){return 2*Math.acos(Math.abs(tA(this.dot(A),-1,1)))}rotateTowards(A,I){const g=this.angleTo(A);if(g===0)return this;const Q=Math.min(1,I/g);return this.slerp(A,Q),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,I){const g=A._x,Q=A._y,C=A._z,t=A._w,E=I._x,i=I._y,s=I._z,n=I._w;return this._x=g*n+t*E+Q*s-C*i,this._y=Q*n+t*i+C*E-g*s,this._z=C*n+t*s+g*i-Q*E,this._w=t*n-g*E-Q*i-C*s,this._onChangeCallback(),this}slerp(A,I){if(I===0)return this;if(I===1)return this.copy(A);const g=this._x,Q=this._y,C=this._z,t=this._w;let E=t*A._w+g*A._x+Q*A._y+C*A._z;if(E<0?(this._w=-A._w,this._x=-A._x,this._y=-A._y,this._z=-A._z,E=-E):this.copy(A),E>=1)return this._w=t,this._x=g,this._y=Q,this._z=C,this;const i=1-E*E;if(i<=Number.EPSILON){const o=1-I;return this._w=o*t+I*this._w,this._x=o*g+I*this._x,this._y=o*Q+I*this._y,this._z=o*C+I*this._z,this.normalize(),this}const s=Math.sqrt(i),n=Math.atan2(s,E),e=Math.sin((1-I)*n)/s,r=Math.sin(I*n)/s;return this._w=t*e+this._w*r,this._x=g*e+this._x*r,this._y=Q*e+this._y*r,this._z=C*e+this._z*r,this._onChangeCallback(),this}slerpQuaternions(A,I,g){return this.copy(A).slerp(I,g)}random(){const A=2*Math.PI*Math.random(),I=2*Math.PI*Math.random(),g=Math.random(),Q=Math.sqrt(1-g),C=Math.sqrt(g);return this.set(Q*Math.sin(A),Q*Math.cos(A),C*Math.sin(I),C*Math.cos(I))}equals(A){return A._x===this._x&&A._y===this._y&&A._z===this._z&&A._w===this._w}fromArray(A,I=0){return this._x=A[I],this._y=A[I+1],this._z=A[I+2],this._w=A[I+3],this._onChangeCallback(),this}toArray(A=[],I=0){return A[I]=this._x,A[I+1]=this._y,A[I+2]=this._z,A[I+3]=this._w,A}fromBufferAttribute(A,I){return this._x=A.getX(I),this._y=A.getY(I),this._z=A.getZ(I),this._w=A.getW(I),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,I=0,g=0){f.prototype.isVector3=!0,this.x=A,this.y=I,this.z=g}set(A,I,g){return g===void 0&&(g=this.z),this.x=A,this.y=I,this.z=g,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,I){switch(A){case 0:this.x=I;break;case 1:this.y=I;break;case 2:this.z=I;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,I){return this.x=A.x+I.x,this.y=A.y+I.y,this.z=A.z+I.z,this}addScaledVector(A,I){return this.x+=A.x*I,this.y+=A.y*I,this.z+=A.z*I,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,I){return this.x=A.x-I.x,this.y=A.y-I.y,this.z=A.z-I.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,I){return this.x=A.x*I.x,this.y=A.y*I.y,this.z=A.z*I.z,this}applyEuler(A){return this.applyQuaternion(kg.setFromEuler(A))}applyAxisAngle(A,I){return this.applyQuaternion(kg.setFromAxisAngle(A,I))}applyMatrix3(A){const I=this.x,g=this.y,Q=this.z,C=A.elements;return this.x=C[0]*I+C[3]*g+C[6]*Q,this.y=C[1]*I+C[4]*g+C[7]*Q,this.z=C[2]*I+C[5]*g+C[8]*Q,this}applyNormalMatrix(A){return this.applyMatrix3(A).normalize()}applyMatrix4(A){const I=this.x,g=this.y,Q=this.z,C=A.elements,t=1/(C[3]*I+C[7]*g+C[11]*Q+C[15]);return this.x=(C[0]*I+C[4]*g+C[8]*Q+C[12])*t,this.y=(C[1]*I+C[5]*g+C[9]*Q+C[13])*t,this.z=(C[2]*I+C[6]*g+C[10]*Q+C[14])*t,this}applyQuaternion(A){const I=this.x,g=this.y,Q=this.z,C=A.x,t=A.y,E=A.z,i=A.w,s=2*(t*Q-E*g),n=2*(E*I-C*Q),e=2*(C*g-t*I);return this.x=I+i*s+t*e-E*n,this.y=g+i*n+E*s-C*e,this.z=Q+i*e+C*n-t*s,this}project(A){return this.applyMatrix4(A.matrixWorldInverse).applyMatrix4(A.projectionMatrix)}unproject(A){return this.applyMatrix4(A.projectionMatrixInverse).applyMatrix4(A.matrixWorld)}transformDirection(A){const I=this.x,g=this.y,Q=this.z,C=A.elements;return this.x=C[0]*I+C[4]*g+C[8]*Q,this.y=C[1]*I+C[5]*g+C[9]*Q,this.z=C[2]*I+C[6]*g+C[10]*Q,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,I){return this.x=tA(this.x,A.x,I.x),this.y=tA(this.y,A.y,I.y),this.z=tA(this.z,A.z,I.z),this}clampScalar(A,I){return this.x=tA(this.x,A,I),this.y=tA(this.y,A,I),this.z=tA(this.z,A,I),this}clampLength(A,I){const g=this.length();return this.divideScalar(g||1).multiplyScalar(tA(g,A,I))}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,I){return this.x+=(A.x-this.x)*I,this.y+=(A.y-this.y)*I,this.z+=(A.z-this.z)*I,this}lerpVectors(A,I,g){return this.x=A.x+(I.x-A.x)*g,this.y=A.y+(I.y-A.y)*g,this.z=A.z+(I.z-A.z)*g,this}cross(A){return this.crossVectors(this,A)}crossVectors(A,I){const g=A.x,Q=A.y,C=A.z,t=I.x,E=I.y,i=I.z;return this.x=Q*i-C*E,this.y=C*t-g*i,this.z=g*E-Q*t,this}projectOnVector(A){const I=A.lengthSq();if(I===0)return this.set(0,0,0);const g=A.dot(this)/I;return this.copy(A).multiplyScalar(g)}projectOnPlane(A){return bI.copy(this).projectOnVector(A),this.sub(bI)}reflect(A){return this.sub(bI.copy(A).multiplyScalar(2*this.dot(A)))}angleTo(A){const I=Math.sqrt(this.lengthSq()*A.lengthSq());if(I===0)return Math.PI/2;const g=this.dot(A)/I;return Math.acos(tA(g,-1,1))}distanceTo(A){return Math.sqrt(this.distanceToSquared(A))}distanceToSquared(A){const I=this.x-A.x,g=this.y-A.y,Q=this.z-A.z;return I*I+g*g+Q*Q}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,I,g){const Q=Math.sin(I)*A;return this.x=Q*Math.sin(g),this.y=Math.cos(I)*A,this.z=Q*Math.cos(g),this}setFromCylindrical(A){return this.setFromCylindricalCoords(A.radius,A.theta,A.y)}setFromCylindricalCoords(A,I,g){return this.x=A*Math.sin(I),this.y=g,this.z=A*Math.cos(I),this}setFromMatrixPosition(A){const I=A.elements;return this.x=I[12],this.y=I[13],this.z=I[14],this}setFromMatrixScale(A){const I=this.setFromMatrixColumn(A,0).length(),g=this.setFromMatrixColumn(A,1).length(),Q=this.setFromMatrixColumn(A,2).length();return this.x=I,this.y=g,this.z=Q,this}setFromMatrixColumn(A,I){return this.fromArray(A.elements,I*4)}setFromMatrix3Column(A,I){return this.fromArray(A.elements,I*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,I=0){return this.x=A[I],this.y=A[I+1],this.z=A[I+2],this}toArray(A=[],I=0){return A[I]=this.x,A[I+1]=this.y,A[I+2]=this.z,A}fromBufferAttribute(A,I){return this.x=A.getX(I),this.y=A.getY(I),this.z=A.getZ(I),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const A=Math.random()*Math.PI*2,I=Math.random()*2-1,g=Math.sqrt(1-I*I);return this.x=g*Math.cos(A),this.y=I,this.z=g*Math.sin(A),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const bI=new f,kg=new RA;class Rg{constructor(A=new f(1/0,1/0,1/0),I=new f(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=A,this.max=I}set(A,I){return this.min.copy(A),this.max.copy(I),this}setFromArray(A){this.makeEmpty();for(let I=0,g=A.length;I=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,I){return I.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,yA),yA.distanceToSquared(A.center)<=A.radius*A.radius}intersectsPlane(A){let I,g;return A.normal.x>0?(I=A.normal.x*this.min.x,g=A.normal.x*this.max.x):(I=A.normal.x*this.max.x,g=A.normal.x*this.min.x),A.normal.y>0?(I+=A.normal.y*this.min.y,g+=A.normal.y*this.max.y):(I+=A.normal.y*this.max.y,g+=A.normal.y*this.min.y),A.normal.z>0?(I+=A.normal.z*this.min.z,g+=A.normal.z*this.max.z):(I+=A.normal.z*this.max.z,g+=A.normal.z*this.min.z),I<=-A.constant&&g>=-A.constant}intersectsTriangle(A){if(this.isEmpty())return!1;this.getCenter(II),aI.subVectors(this.max,II),TA.subVectors(A.a,II),ZA.subVectors(A.b,II),_A.subVectors(A.c,II),UA.subVectors(ZA,TA),YA.subVectors(_A,ZA),pA.subVectors(TA,_A);let I=[0,-UA.z,UA.y,0,-YA.z,YA.y,0,-pA.z,pA.y,UA.z,0,-UA.x,YA.z,0,-YA.x,pA.z,0,-pA.x,-UA.y,UA.x,0,-YA.y,YA.x,0,-pA.y,pA.x,0];return!qI(I,TA,ZA,_A,aI)||(I=[1,0,0,0,1,0,0,0,1],!qI(I,TA,ZA,_A,aI))?!1:(hI.crossVectors(UA,YA),I=[hI.x,hI.y,hI.z],qI(I,TA,ZA,_A,aI))}clampPoint(A,I){return I.copy(A).clamp(this.min,this.max)}distanceToPoint(A){return this.clampPoint(A,yA).distanceTo(A)}getBoundingSphere(A){return this.isEmpty()?A.makeEmpty():(this.getCenter(A.center),A.radius=this.getSize(yA).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:(GA[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(A),GA[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(A),GA[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(A),GA[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(A),GA[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(A),GA[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(A),GA[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(A),GA[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(A),this.setFromPoints(GA),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 GA=[new f,new f,new f,new f,new f,new f,new f,new f],yA=new f,rI=new Rg,TA=new f,ZA=new f,_A=new f,UA=new f,YA=new f,pA=new f,II=new f,aI=new f,hI=new f,dA=new f;function qI(B,A,I,g,Q){for(let C=0,t=B.length-3;C<=t;C+=3){dA.fromArray(B,C);const E=Q.x*Math.abs(dA.x)+Q.y*Math.abs(dA.y)+Q.z*Math.abs(dA.z),i=A.dot(dA),s=I.dot(dA),n=g.dot(dA);if(Math.max(-Math.max(i,s,n),Math.min(i,s,n))>E)return!1}return!0}const Ug={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},mA={h:0,s:0,l:0},cI={h:0,s:0,l:0};function zI(B,A,I){return I<0&&(I+=1),I>1&&(I-=1),I<1/6?B+(A-B)*6*I:I<1/2?A:I<2/3?B+(A-B)*6*(2/3-I):B}class TI{constructor(A,I,g){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(A,I,g)}set(A,I,g){if(I===void 0&&g===void 0){const Q=A;Q&&Q.isColor?this.copy(Q):typeof Q=="number"?this.setHex(Q):typeof Q=="string"&&this.setStyle(Q)}else this.setRGB(A,I,g);return this}setScalar(A){return this.r=A,this.g=A,this.b=A,this}setHex(A,I=wA){return A=Math.floor(A),this.r=(A>>16&255)/255,this.g=(A>>8&255)/255,this.b=(A&255)/255,DA.toWorkingColorSpace(this,I),this}setRGB(A,I,g,Q=DA.workingColorSpace){return this.r=A,this.g=I,this.b=g,DA.toWorkingColorSpace(this,Q),this}setHSL(A,I,g,Q=DA.workingColorSpace){if(A=yB(A,1),I=tA(I,0,1),g=tA(g,0,1),I===0)this.r=this.g=this.b=g;else{const C=g<=.5?g*(1+I):g+I-g*I,t=2*g-C;this.r=zI(t,C,A+1/3),this.g=zI(t,C,A),this.b=zI(t,C,A-1/3)}return DA.toWorkingColorSpace(this,Q),this}setStyle(A,I=wA){function g(C){C!==void 0&&parseFloat(C)<1&&console.warn("THREE.Color: Alpha component of "+A+" will be ignored.")}let Q;if(Q=/^(\\w+)\\(([^\\)]*)\\)/.exec(A)){let C;const t=Q[1],E=Q[2];switch(t){case"rgb":case"rgba":if(C=/^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(E))return g(C[4]),this.setRGB(Math.min(255,parseInt(C[1],10))/255,Math.min(255,parseInt(C[2],10))/255,Math.min(255,parseInt(C[3],10))/255,I);if(C=/^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(E))return g(C[4]),this.setRGB(Math.min(100,parseInt(C[1],10))/100,Math.min(100,parseInt(C[2],10))/100,Math.min(100,parseInt(C[3],10))/100,I);break;case"hsl":case"hsla":if(C=/^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(E))return g(C[4]),this.setHSL(parseFloat(C[1])/360,parseFloat(C[2])/100,parseFloat(C[3])/100,I);break;default:console.warn("THREE.Color: Unknown color model "+A)}}else if(Q=/^\\#([A-Fa-f\\d]+)$/.exec(A)){const C=Q[1],t=C.length;if(t===3)return this.setRGB(parseInt(C.charAt(0),16)/15,parseInt(C.charAt(1),16)/15,parseInt(C.charAt(2),16)/15,I);if(t===6)return this.setHex(parseInt(C,16),I);console.warn("THREE.Color: Invalid hex color "+A)}else if(A&&A.length>0)return this.setColorName(A,I);return this}setColorName(A,I=wA){const g=Ug[A.toLowerCase()];return g!==void 0?this.setHex(g,I):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=qA(A.r),this.g=qA(A.g),this.b=qA(A.b),this}copyLinearToSRGB(A){return this.r=zA(A.r),this.g=zA(A.g),this.b=zA(A.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(A=wA){return DA.fromWorkingColorSpace(BA.copy(this),A),Math.round(tA(BA.r*255,0,255))*65536+Math.round(tA(BA.g*255,0,255))*256+Math.round(tA(BA.b*255,0,255))}getHexString(A=wA){return("000000"+this.getHex(A).toString(16)).slice(-6)}getHSL(A,I=DA.workingColorSpace){DA.fromWorkingColorSpace(BA.copy(this),I);const g=BA.r,Q=BA.g,C=BA.b,t=Math.max(g,Q,C),E=Math.min(g,Q,C);let i,s;const n=(E+t)/2;if(E===t)i=0,s=0;else{const e=t-E;switch(s=n<=.5?e/(t+E):e/(2-t-E),t){case g:i=(Q-C)/e+(Q{const E=t.trimEnd();return A?E:E.length>0?(A=!0,E):null}).filter(t=>t!=null);for(;I.length>0&&I[I.length-1].length===0;)I.pop();if(I.length===0)return[];const g=(C=I[0].match(/^\\s*/))==null?void 0:C[0];if(!g)return I;const Q=new RegExp(`^${g}`);return I.map(t=>t.replace(Q,""))}function uB(B){return NB(B).join(`\n`)}const ZI=new Float32Array(1),Lg=new Uint32Array(ZI.buffer);function jA(B){ZI[0]=B;const A=Lg[0],I=A>>31&1,g=A>>23&255,Q=A&8388607,C=I<<15;if(g===255)return Q!==0?C|32767:C|31744;const t=g-127+15;if(t>=31)return C|31744;if(t<=0){if(t<-10)return C;const i=(Q|8388608)>>1-t+13;return C|i}const E=Q>>13;return C|t<<10|E}function $(B){const A=B>>15&1,I=B>>10&31,g=B&1023;let Q;if(I===0)if(g===0)Q=A<<31;else{let C=g,t=-14;for(;(C&1024)===0;)C<<=1,t--;C&=1023;const E=t+127,i=C<<13;Q=A<<31|E<<23|i}else if(I===31)g===0?Q=A<<31|2139095040:Q=A<<31|2143289344;else{const C=I-15+127,t=g<<13;Q=A<<31|C<<23|t}return Lg[0]=Q,ZI[0]}function rA(B){return Math.max(0,Math.min(255,Math.round(B*255)))}function GB(B){const A=[],I=new Set;function g(Q){Q&&typeof Q=="object"&&!I.has(Q)&&(I.add(Q),Q instanceof ArrayBuffer?A.push(Q):ArrayBuffer.isView(Q)?A.push(Q.buffer):Array.isArray(Q)?Q.forEach(g):Object.values(Q).forEach(g))}return g(B),A}function _I(B,A,I,g,Q,C,t,E,i,s,n,e,r,o,a,c){const M=rA(o),h=rA(a),D=rA(c),w=rA(r),F=Hg(new RA(i,s,n,e)),G=F&255,R=F>>>8&255,p=F>>>16&255,u=C>>8&255,s=t>>>16&255,n=A*4;B[n+2]=B[n+2]&65535|E<<16|i<<24,B[n+3]=B[n+3]&16777215|s<<24}function SB(B,A,I,g,Q,C){const t=rA(I),E=rA(g),i=rA(Q),s=rA(C),n=A*4;B[n]=t|E<<8|i<<16|s<<24}function fB(B,A,I,g,Q){const C=rA(I),t=rA(g),E=rA(Q),i=A*4;B[i]=C|t<<8|E<<16|B[i]&4278190080}function kB(B,A,I){const g=rA(I),Q=A*4;B[Q]=B[Q]&16777215|g<<24}new f,new f,new TI;function RB(B){const A=Yg,I=Math.max(Jg,Math.min(mg,Math.ceil(B/A))),g=Math.ceil(B/(A*I)),Q=A*I*g;return{width:A,height:I,depth:g,maxSplats:Q}}function wI(B){const A=Yg,I=Math.max(Jg,Math.min(mg,Math.ceil(B/A))),g=Math.ceil(B/(A*I));return A*I*g}uB(`\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 Hg(B){const A=B.clone().normalize();A.w<0&&A.set(-A.x,-A.y,-A.z,-A.w);const I=2*Math.acos(A.w),g=Math.sqrt(A.x*A.x+A.y*A.y+A.z*A.z),Q=g<1e-6?new f(1,0,0):new f(A.x,A.y,A.z).divideScalar(g),C=Math.abs(Q.x)+Math.abs(Q.y)+Math.abs(Q.z);let t=Q.x/C,E=Q.y/C;if(Q.z<0){const o=t;t=(1-Math.abs(E))*(t>=0?1:-1),E=(1-Math.abs(o))*(E>=0?1:-1)}const i=t*.5+.5,s=E*.5+.5,n=Math.round(i*255),e=Math.round(s*255);return Math.round(I*(255/Math.PI))<<16|e<<8|n}function DI(B,A,I,g){const Q=Math.max(-127,Math.min(127,B*127)),C=Math.max(-127,Math.min(127,A*127)),t=Math.max(-127,Math.min(127,I*127)),E=Math.max(-127,Math.min(127,g*127));return Q&255|(C&255)<<8|(t&255)<<16|(E&255)<<24}function yI(B,A,I){const g=A*2;for(let Q=0;Q<9;++Q){const C=Math.max(-63,Math.min(63,I[Q]*63))&127,t=Q*7,E=t+7,i=Math.floor(t/32),s=t-i*32,n=C<i*32+32){const e=C>>>32-s&4294967295;B[g+i+1]|=e}}}function lI(B,A,I){B[A*4+0]=DI(I[0],I[1],I[2],I[3]),B[A*4+1]=DI(I[4],I[5],I[6],I[7]),B[A*4+2]=DI(I[8],I[9],I[10],I[11]),B[A*4+3]=DI(I[12],I[13],I[14],0)}function MI(B,A,I){const g=A*4;for(let Q=0;Q<21;++Q){const C=Math.max(-31,Math.min(31,I[Q]*31))&63,t=Q*6,E=t+6,i=Math.floor(t/32),s=t-i*32,n=C<i*32+32){const e=C>>>32-s&4294967295;B[g+i+1]|=e}}}function UB(B,A){const I=[];let g=0,Q=null;const C=new yg((i,s)=>{if(I.push(i),g+=i.length,s||g>=A){const n=new Uint8Array(g);let e=0;for(const r of I)n.set(r,e),e+=r.length;Q=n.slice(0,A)}}),t=1024;let E=0;for(;Q==null&&E{this.chunks.push(g),this.totalBytes+=g.length})}read(A){for(;this.totalBytes=this.fileBytes.length&&this.gunzip.push(new Uint8Array(0),!0),this.totalBytes{A=Q,I=wI(A),g=new Uint32Array(I*4)},(Q,C,t,E,i,s,n,e,r,o,a,c,M,h,D)=>{_I(g,Q,C,t,E,i,s,n,e,r,o,a,c,M,h,D)}),{packedArray:g,numSplats:A}}const FI={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}},bg={0:0,1:9,2:24,3:45};function JB(B,A,I,g){var c;let t=0;const E=new DataView(B.buffer,t,4096);t+=4096;const i=E.getUint8(0),s=E.getUint8(1);if(i!==0||s<1)throw new Error(`Unsupported .ksplat version: ${i}.${s}`);const n=E.getUint32(4,!0);E.getUint32(16,!0);const e=E.getUint16(20,!0);if(e<0||e>2)throw new Error(`Invalid .ksplat compression level: ${e}`);const r=E.getFloat32(36,!0)||-1.5,o=E.getFloat32(40,!0)||1.5;let a=4096+n*1024;for(let M=0;M=1?new Float32Array(3*3):void 0,sA=K>=2?new Float32Array(5*3):void 0,lA=K>=3?new Float32Array(7*3):void 0,eA=p/2/l,aA=a+U,hA=a+H,L=new DataView(B.buffer,hA,S),AA=new Float32Array(B.buffer,aA,R*3),m=new Uint32Array(B.buffer,a,y);let SA=k,OA=N;for(let IA=0;IA=OA+NA&&(SA+=1,OA+=NA),X=SA}const d=e===0?L.getFloat32(x+0,!0):(L.getUint16(x+0,!0)-l)*eA+AA[3*X+0],MA=e===0?L.getFloat32(x+4,!0):(L.getUint16(x+2,!0)-l)*eA+AA[3*X+1],QI=e===0?L.getFloat32(x+8,!0):(L.getUint16(x+4,!0)-l)*eA+AA[3*X+2],CI=e===0?L.getFloat32(x+v+0,!0):$(L.getUint16(x+v+0,!0)),EI=e===0?L.getFloat32(x+v+4,!0):$(L.getUint16(x+v+2,!0)),WI=e===0?L.getFloat32(x+v+8,!0):$(L.getUint16(x+v+4,!0)),VI=e===0?L.getFloat32(x+q+0,!0):$(L.getUint16(x+q+0,!0)),OI=e===0?L.getFloat32(x+q+4,!0):$(L.getUint16(x+q+2,!0)),PI=e===0?L.getFloat32(x+q+8,!0):$(L.getUint16(x+q+4,!0)),$I=e===0?L.getFloat32(x+q+12,!0):$(L.getUint16(x+q+6,!0)),Ag=L.getUint8(x+b+0)/255,Ig=L.getUint8(x+b+1)/255,gg=L.getUint8(x+b+2)/255,Bg=L.getUint8(x+b+3)/255;if(I(IA,d,MA,QI,CI,EI,WI,OI,PI,$I,VI,Bg,Ag,Ig,gg),K>=1&&iA){for(const[NA,KA]of QA.entries())iA[NA]=h(x,KA);if(sA)for(const[NA,KA]of nA.entries())sA[NA]=h(x,KA);if(lA)for(const[NA,KA]of EA.entries())lA[NA]=h(x,KA);g==null||g(IA,iA,sA,lA)}}a+=CA}}function LB(B){var h;let g=0;const Q=new DataView(B.buffer,g,4096);g+=4096;const C=Q.getUint8(0),t=Q.getUint8(1);if(C!==0||t<1)throw new Error(`Unsupported .ksplat version: ${C}.${t}`);const E=Q.getUint32(4,!0),i=Q.getUint32(16,!0),s=Q.getUint16(20,!0);if(s<0||s>2)throw new Error(`Invalid .ksplat compression level: ${s}`);const n=Q.getFloat32(36,!0)||-1.5,e=Q.getFloat32(40,!0)||1.5,r=i,o=wI(r),a=new Uint32Array(o*4),c={};let M=4096+E*1024;for(let D=0;D=1?new Float32Array(3*3):void 0,eA=z>=2?new Float32Array(5*3):void 0,aA=z>=3?new Float32Array(7*3):void 0,hA=l/2/N,L=M+K,AA=M+J,m=new DataView(B.buffer,AA,QA),SA=new Float32Array(B.buffer,L,u*3),OA=new Uint32Array(B.buffer,M,H);let IA=y,x=U;for(let X=0;X=x+LA&&(IA+=1,x+=LA),MA=IA}const QI=s===0?m.getFloat32(d+0,!0):(m.getUint16(d+0,!0)-N)*hA+SA[3*MA+0],CI=s===0?m.getFloat32(d+4,!0):(m.getUint16(d+2,!0)-N)*hA+SA[3*MA+1],EI=s===0?m.getFloat32(d+8,!0):(m.getUint16(d+4,!0)-N)*hA+SA[3*MA+2],WI=s===0?m.getFloat32(d+b+0,!0):$(m.getUint16(d+b+0,!0)),VI=s===0?m.getFloat32(d+b+4,!0):$(m.getUint16(d+b+2,!0)),OI=s===0?m.getFloat32(d+b+8,!0):$(m.getUint16(d+b+4,!0)),PI=s===0?m.getFloat32(d+Y+0,!0):$(m.getUint16(d+Y+0,!0)),$I=s===0?m.getFloat32(d+Y+4,!0):$(m.getUint16(d+Y+2,!0)),Ag=s===0?m.getFloat32(d+Y+8,!0):$(m.getUint16(d+Y+4,!0)),Ig=s===0?m.getFloat32(d+Y+12,!0):$(m.getUint16(d+Y+6,!0)),gg=m.getUint8(d+T+0)/255,Bg=m.getUint8(d+T+1)/255,NA=m.getUint8(d+T+2)/255,KA=m.getUint8(d+T+3)/255;if(_I(a,X,QI,CI,EI,WI,VI,OI,$I,Ag,Ig,PI,KA,gg,Bg,NA),z>=1){if(lA){c.sh1||(c.sh1=new Uint32Array(r*2));for(const[LA,tI]of EA.entries())lA[LA]=w(d,tI);yI(c.sh1,X,lA)}if(eA){c.sh2||(c.sh2=new Uint32Array(r*4));for(const[LA,tI]of iA.entries())eA[LA]=w(d,tI);lI(c.sh2,X,eA)}if(aA){c.sh3||(c.sh3=new Uint32Array(r*4));for(const[LA,tI]of sA.entries())aA[LA]=w(d,tI);MI(c.sh3,X,aA)}}}M+=nA}return{packedArray:a,numSplats:r,extra:c}}const VA=class VA{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 I=new ReadableStream({start:t=>{t.enqueue(this.fileBytes.slice(0,65536)),t.close()}}).pipeThrough(new TextDecoderStream).getReader();this.header="";const g=`end_header\n`;for(;;){const{value:t,done:E}=await I.read();if(E)throw new Error("Failed to read header");this.header+=t;const i=this.header.indexOf(g);if(i>=0){this.header=this.header.slice(0,i+g.length);break}}const Q=new TextEncoder().encode(this.header).length;this.data=new DataView(this.fileBytes.buffer,Q),this.elements={};let C=null;this.comments=[],this.header.trim().split(`\n`).forEach((t,E)=>{const i=t.trim();if(E===0){if(i!=="ply")throw new Error("Invalid PLY header");return}if(i.length===0)return;const s=i.split(" ");switch(s[0]){case"format":if(s[1]==="binary_little_endian")this.littleEndian=!0;else if(s[1]==="binary_big_endian")this.littleEndian=!1;else throw new Error(`Unsupported PLY format: ${s[1]}`);if(s[2]!=="1.0")throw new Error(`Unsupported PLY version: ${s[2]}`);break;case"end_header":break;case"comment":this.comments.push(i.slice(8));break;case"element":{const n=s[1];C={name:n,count:Number.parseInt(s[2]),properties:{}},this.elements[n]=C;break}case"property":if(C==null)throw new Error("Property must be inside an element");s[1]==="list"?C.properties[s[4]]={isList:!0,type:s[3],countType:s[2]}:C.properties[s[2]]={isList:!1,type:s[1]};break}}),this.elements.vertex&&(this.numSplats=this.elements.vertex.count)}parseData(A){let I=0;const g=this.data;if(g==null)throw new Error("No data to parse");for(const Q in this.elements){const C=this.elements[Q],{count:t,properties:E}=C,i={},s=[];for(const[e,r]of Object.entries(E))r.isList?(i[e]=[],s.push(()=>{const o=i[e];o.length=GI[r.countType](g,I,this.littleEndian),I+=WA[r.countType];for(let a=0;a{i[e]=GI[r.type](g,I,this.littleEndian),I+=WA[r.type]}));const n=A(C)??(()=>{});for(let e=0;e[0,1,2].map((F,G)=>`f_rest_${w+G*h/3}`)),E=new Array(5).fill(null).flatMap((D,w)=>[0,1,2].map((F,G)=>`f_rest_${3+w+G*h/3}`)),i=new Array(7).fill(null).flatMap((D,w)=>[0,1,2].map((F,G)=>`f_rest_${8+w+G*h/3}`)),s=C>=1?new Float32Array(3*3):void 0,n=C>=2?new Float32Array(5*3):void 0,e=C>=3?new Float32Array(7*3):void 0}function o(h,D){if(!s)throw new Error("Missing sh1");for(const[w,F]of t.entries())s[w]=D[F]*8/255-4;if(n)for(const[w,F]of E.entries())n[w]=D[F]*8/255-4;if(e)for(const[w,F]of i.entries())e[w]=D[F]*8/255-4;I==null||I(h,s,n,e)}function a(h){const{min_x:D,min_y:w,min_z:F,max_x:G,max_y:R,max_z:p,min_scale_x:u,min_scale_y:l,min_scale_z:k,max_scale_x:N,max_scale_y:y,max_scale_z:U}=h.properties;if(!D||!w||!F||!G||!R||!p||!u||!l||!k||!N||!y||!U)throw new Error("Missing PLY chunk properties");return g=!0,(H,K)=>{const{min_x:J,min_y:z,min_z:W,max_x:Z,max_y:P,max_z:V,min_scale_x:v,min_scale_y:q,min_scale_z:b,max_scale_x:Y,max_scale_y:T,max_scale_z:S,min_r:CA,min_g:QA,min_b:nA,max_r:EA,max_g:iA,max_b:sA}=K;Q.push({min_x:J,min_y:z,min_z:W,max_x:Z,max_y:P,max_z:V,min_scale_x:v,min_scale_y:q,min_scale_z:b,max_scale_x:Y,max_scale_y:T,max_scale_z:S,min_r:CA,min_g:QA,min_b:nA,max_r:EA,max_g:iA,max_b:sA})}}function c(h){if(I&&h.name==="sh")return C=zg(h.properties),r(),o;if(h.name!=="vertex")return null;const{packed_position:D,packed_rotation:w,packed_scale:F,packed_color:G}=h.properties;if(!D||!w||!F||!G)throw new Error("Missing PLY properties: packed_position, packed_rotation, packed_scale, packed_color");const R=Math.sqrt(2);return(p,u)=>{const l=Q[p>>>8];if(l==null)throw new Error("Missing PLY chunk");const{min_x:k,min_y:N,min_z:y,max_x:U,max_y:H,max_z:K,min_scale_x:J,min_scale_y:z,min_scale_z:W,max_scale_x:Z,max_scale_y:P,max_scale_z:V,min_r:v,min_g:q,min_b:b,max_r:Y,max_g:T,max_b:S}=l,{packed_position:CA,packed_rotation:QA,packed_scale:nA,packed_color:EA}=u,iA=(CA>>>21&2047)/2047*(U-k)+k,sA=(CA>>>11&1023)/1023*(H-N)+N,lA=(CA&2047)/2047*(K-y)+y,eA=((QA>>>20&1023)/1023-.5)*R,aA=((QA>>>10&1023)/1023-.5)*R,hA=((QA&1023)/1023-.5)*R,L=Math.sqrt(Math.max(0,1-eA*eA-aA*aA-hA*hA)),AA=QA>>>30,m=AA===0?eA:AA===1?L:aA,SA=AA<=1?aA:AA===2?L:hA,OA=AA<=2?hA:L,IA=AA===0?L:eA,x=Math.exp((nA>>>21&2047)/2047*(Z-J)+J),X=Math.exp((nA>>>11&1023)/1023*(P-z)+z),d=Math.exp((nA&2047)/2047*(V-W)+W),MA=(EA>>>24&255)/255*((Y??1)-(v??0))+(v??0),QI=(EA>>>16&255)/255*((T??1)-(q??0))+(q??0),CI=(EA>>>8&255)/255*((S??1)-(b??0))+(b??0),EI=(EA&255)/255;A(p,iA,sA,lA,x,X,d,m,SA,OA,IA,EI,MA,QI,CI)}}const M=h=>{if(h.name==="chunk")return a(h);if(g)return c(h);if(h.name!=="vertex")return null;const{x:D,y:w,z:F,scale_0:G,scale_1:R,scale_2:p,rot_0:u,rot_1:l,rot_2:k,rot_3:N,opacity:y,f_dc_0:U,f_dc_1:H,f_dc_2:K,red:J,green:z,blue:W,alpha:Z}=h.properties;if(!D||!w||!F)throw new Error("Missing PLY properties: x, y, z");const P=G&&R&&p,V=u&&l&&k&&N,v=Z!=null?SI[Z.type]:1,q=J!=null?SI[J.type]:1,b=z!=null?SI[z.type]:1,Y=W!=null?SI[W.type]:1;return C=zg(h.properties),r(),(T,S)=>{const CA=P?Math.exp(S.scale_0):VA.defaultPointScale,QA=P?Math.exp(S.scale_1):VA.defaultPointScale,nA=P?Math.exp(S.scale_2):VA.defaultPointScale,EA=V?S.rot_1:0,iA=V?S.rot_2:0,sA=V?S.rot_3:0,lA=V?S.rot_0:1,eA=y!=null?1/(1+Math.exp(-S.opacity)):Z!=null?S.alpha/v:1,aA=U!=null?S.f_dc_0*uI+.5:J!=null?S.red/q:1,hA=H!=null?S.f_dc_1*uI+.5:z!=null?S.green/b:1,L=K!=null?S.f_dc_2*uI+.5:W!=null?S.blue/Y:1;if(A(T,S.x,S.y,S.z,CA,QA,nA,EA,iA,sA,lA,eA,aA,hA,L),I&&s){if(s)for(const[AA,m]of t.entries())s[AA]=S[m];if(n)for(const[AA,m]of E.entries())n[AA]=S[m];if(e)for(const[AA,m]of i.entries())e[AA]=S[m];I(T,s,n,e)}}};this.parseData(M)}injectRgba(A){let I=0;const g=this.data;if(g==null)throw new Error("No parsed data");if(A.length!==this.numSplats*4)throw new Error("Invalid RGBA array length");for(const Q in this.elements){const C=this.elements[Q],{count:t,properties:E}=C,i=[];let s=0;const n=Q==="vertex";if(n){for(const e of["opacity","f_dc_0","f_dc_1","f_dc_2"])if(!E[e]||E[e].type!=="float")throw new Error(`Can\'t injectRgba due to property: ${e}`)}for(const[e,r]of Object.entries(E))if(r.isList)i.push(()=>{const o=GI[r.countType](g,I,this.littleEndian);I+=WA[r.countType],I+=o*WA[r.type]});else{if(n)if(e==="f_dc_0"||e==="f_dc_1"||e==="f_dc_2"){const o=Number.parseInt(e.slice(5));i.push(()=>{const a=(A[s+o]/255-.5)/uI;qg[r.type](g,I,this.littleEndian,a)})}else e==="opacity"&&i.push(()=>{const o=Math.max(-100,Math.min(100,-Math.log(1/(A[s+3]/255)-1)));qg[r.type](g,I,this.littleEndian,o)});i.push(()=>{I+=WA[r.type]})}for(let e=0;eB.getInt8(A),uchar:(B,A,I)=>B.getUint8(A),short:(B,A,I)=>B.getInt16(A,I),ushort:(B,A,I)=>B.getUint16(A,I),int:(B,A,I)=>B.getInt32(A,I),uint:(B,A,I)=>B.getUint32(A,I),float:(B,A,I)=>B.getFloat32(A,I),double:(B,A,I)=>B.getFloat64(A,I)},qg={char:(B,A,I,g)=>{B.setInt8(A,g)},uchar:(B,A,I,g)=>{B.setUint8(A,g)},short:(B,A,I,g)=>{B.setInt16(A,g,I)},ushort:(B,A,I,g)=>{B.setUint16(A,g,I)},int:(B,A,I,g)=>{B.setInt32(A,g,I)},uint:(B,A,I,g)=>{B.setUint32(A,g,I)},float:(B,A,I,g)=>{B.setFloat32(A,g,I)},double:(B,A,I,g)=>{B.setFloat64(A,g,I)}},WA={char:1,uchar:1,short:2,ushort:2,int:4,uint:4,float:4,double:8},SI={char:127,uchar:255,short:32767,ushort:65535,int:2147483647,uint:4294967295,float:1,double:1},xB={0:0,9:1,24:2,45:3},pB={0:0,1:9,2:24,3:45};function zg(B){let A=0;for(;B[`f_rest_${A}`];)A+=1;const I=xB[A];if(I==null)throw new Error(`Unsupported number of SH coefficients: ${A}`);return I}var gI=(B=>(B.PLY="ply",B.SPZ="spz",B.SPLAT="splat",B.KSPLAT="ksplat",B.PCSOGS="pcsogs",B.PCSOGSZIP="pcsogszip",B))(gI||{});function dB(B){const A=new DataView(B.buffer);if((A.getUint32(0,!0)&16777215)===7957616)return"ply";if((A.getUint32(0,!0)&16777215)===559903){const I=UB(B,4);return new DataView(I.buffer).getUint32(0,!0)===1347635022?"spz":void 0}if(A.getUint32(0,!0)===67324752)return Tg(B)?"pcsogszip":void 0}function HB(B){const A=B.split(/[?#]/,1)[0],I=Math.max(A.lastIndexOf("/"),A.lastIndexOf("\\\\")),g=A.slice(I+1),Q=g.lastIndexOf(".");return Q<=0||Q===g.length-1?"":g.slice(Q+1).toLowerCase()}function KB(B){const A=HB(B);if(A==="ply")return"ply";if(A==="spz")return"spz";if(A==="splat")return"splat";if(A==="ksplat")return"ksplat"}function bB(B){try{let A;if(typeof B=="string")A=B;else{const g=B instanceof ArrayBuffer?new Uint8Array(B):B;if(g.length>65536)return;A=new TextDecoder().decode(g)}const I=JSON.parse(A);if(!I||typeof I!="object"||Array.isArray(I))return;for(const g of["means","scales","quats","sh0"])if(!I[g]||typeof I[g]!="object"||Array.isArray(I[g])||!I[g].shape||!I[g].files||g!=="quats"&&(!I[g].mins||!I[g].maxs))return;return I}catch{return}}function Tg(B){try{const A=B instanceof ArrayBuffer?new Uint8Array(B):B;let I=null;const g=wB(A,{filter:({name:C})=>C.split(/[\\\\/]/).pop()==="meta.json"?(I=C,!0):!1});if(!I)return;const Q=bB(g[I]);return Q?{name:I,json:Q}:void 0}catch{return}}class qB{constructor({maxSplats:A=1}={}){this.numSplats=0,this.maxSplats=RB(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 I=Math.max(A,this.maxSplats*2),g=new Float32Array(I*3),Q=new Float32Array(I*3),C=new Float32Array(I*4),t=new Float32Array(I),E=new Float32Array(I*3);if(g.set(this.centers),Q.set(this.scales),C.set(this.quaternions),t.set(this.opacities),E.set(this.colors),this.centers=g,this.scales=Q,this.quaternions=C,this.opacities=t,this.colors=E,this.sh1){const i=new Float32Array(I*9);i.set(this.sh1),this.sh1=i}if(this.sh2){const i=new Float32Array(I*15);i.set(this.sh2),this.sh2=i}if(this.sh3){const i=new Float32Array(I*21);i.set(this.sh3),this.sh3=i}this.maxSplats=I}}ensureIndex(A){this.ensureCapacity(A+1)}setCenter(A,I,g,Q){this.centers[A*3]=I,this.centers[A*3+1]=g,this.centers[A*3+2]=Q}setScale(A,I,g,Q){this.scales[A*3]=I,this.scales[A*3+1]=g,this.scales[A*3+2]=Q}setQuaternion(A,I,g,Q,C){this.quaternions[A*4]=I,this.quaternions[A*4+1]=g,this.quaternions[A*4+2]=Q,this.quaternions[A*4+3]=C}setOpacity(A,I){this.opacities[A]=I}setColor(A,I,g,Q){this.colors[A*3]=I,this.colors[A*3+1]=g,this.colors[A*3+2]=Q}setSh1(A,I){this.sh1||(this.sh1=new Float32Array(this.maxSplats*9));for(let g=0;g<9;++g)this.sh1[A*9+g]=I[g]}setSh2(A,I){this.sh2||(this.sh2=new Float32Array(this.maxSplats*15));for(let g=0;g<15;++g)this.sh2[A*15+g]=I[g]}setSh3(A,I){this.sh3||(this.sh3=new Float32Array(this.maxSplats*21));for(let g=0;g<21;++g)this.sh3[A*21+g]=I[g]}}async function Zg(B,A){if(B.quats.encoding!=="quaternion_packed")throw new Error("Unsupported quaternion encoding");const I=B.means.shape[0],g=wI(I),Q=new Uint32Array(g*4),C={},t=Promise.all([BI(A[B.means.files[0]]),BI(A[B.means.files[1]])]).then(e=>{for(let r=0;r{for(let r=0;r{const r=Math.sqrt(2);for(let o=0;o{const r=.28209479177387814;for(let o=0;o=45,r=B.shN.shape[1]>=24,o=B.shN.shape[1]>=9;o&&(C.sh1=new Uint32Array(I*2)),r&&(C.sh2=new Uint32Array(I*4)),e&&(C.sh3=new Uint32Array(I*4));const a=new Float32Array(9),c=new Float32Array(15),M=new Float32Array(21),h=B.shN,D=Promise.all([vI(A[B.shN.files[0]]),vI(A[B.shN.files[1]])]).then(([w,F])=>{for(let G=0;G>>6)*w.width+u;for(let N=0;N<3;++N){if(o)for(let y=0;y<3;++y)a[y*3+N]=h.mins+(h.maxs-h.mins)*w.rgba[(k+y)*4+N]/255;if(r)for(let y=0;y<5;++y)c[y*3+N]=h.mins+(h.maxs-h.mins)*w.rgba[(k+3+y)*4+N]/255;if(e)for(let y=0;y<7;++y)M[y*3+N]=h.mins+(h.maxs-h.mins)*w.rgba[(k+8+y)*4+N]/255}o&&yI(C.sh1,G,a),r&&lI(C.sh2,G,c),e&&MI(C.sh3,G,M)}});n.push(D)}return await Promise.all(n),{packedArray:Q,numSplats:I,extra:C}}let fI=null;async function vI(B){if(!fI&&(fI=new OffscreenCanvas(1,1).getContext("webgl2"),!fI))throw new Error("Failed to create WebGL2 context");const A=new Blob([B]),I=await createImageBitmap(A,{premultiplyAlpha:"none"}),g=fI,Q=g.createTexture();g.bindTexture(g.TEXTURE_2D,Q),g.pixelStorei(g.UNPACK_FLIP_Y_WEBGL,!0),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,I),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,g.NEAREST),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MIN_FILTER,g.NEAREST);const C=g.createFramebuffer();g.bindFramebuffer(g.FRAMEBUFFER,C),g.framebufferTexture2D(g.FRAMEBUFFER,g.COLOR_ATTACHMENT0,g.TEXTURE_2D,Q,0);const t=new Uint8Array(I.width*I.height*4);return g.readPixels(0,0,I.width,I.height,g.RGBA,g.UNSIGNED_BYTE,t),g.deleteTexture(Q),g.deleteFramebuffer(C),{rgba:t,width:I.width,height:I.height}}async function BI(B){const{rgba:A}=await vI(B);return A}async function zB(B){var e;const A=Tg(B);if(!A)throw new Error("Invalid PC SOGS zip file");const{name:I,json:g}=A,Q=I.lastIndexOf("/"),C=I.lastIndexOf("\\\\"),t=I.slice(0,Math.max(Q,C)+1),E=new Map,i=[...g.means.files,...g.scales.files,...g.quats.files,...g.sh0.files,...((e=g.shN)==null?void 0:e.files)??[]];for(const r of i)E.set(t+r,r);const s=await new Promise((r,o)=>{cB(B,{filter:({name:a})=>E.has(a)},(a,c)=>{a?o(a):r(c)})}),n={};for(const[r,o]of E.entries())n[o]=s[r];return await Zg(g,n)}class _g{constructor({fileBytes:A}){this.fileBytes=A instanceof ArrayBuffer?new Uint8Array(A):A,this.reader=new YB({fileBytes:this.fileBytes});const I=new DataView(this.reader.read(16).buffer);if(I.getUint32(0,!0)!==1347635022)throw new Error("Invalid SPZ file");if(this.version=I.getUint32(4,!0),this.version<1||this.version>2)throw new Error(`Unsupported SPZ version: ${this.version}`);this.numSplats=I.getUint32(8,!0),this.shDegree=I.getUint8(12),this.fractionalBits=I.getUint8(13),this.flags=I.getUint8(14),this.flagAntiAlias=(this.flags&1)!==0,this.reserved=I.getUint8(15),this.parsed=!1}parseSplats(A,I,g,Q,C,t){if(this.parsed)throw new Error("SPZ file already parsed");if(this.parsed=!0,this.version===1){const E=this.reader.read(this.numSplats*3*2),i=new Uint16Array(E.buffer);for(let s=0;s>8)/E,r=((i[n+5]<<24|i[n+4]<<16|i[n+3]<<8)>>8)/E,o=((i[n+8]<<24|i[n+7]<<16|i[n+6]<<8)>>8)/E;A==null||A(s,e,r,o)}}else throw new Error("Unreachable");{const E=this.reader.read(this.numSplats);for(let i=0;i=1){const E=new Float32Array(9),i=this.shDegree>=2?new Float32Array(5*3):void 0,s=this.shDegree>=3?new Float32Array(7*3):void 0,n=this.reader.read(this.numSplats*vg[this.shDegree]*3);let e=0;for(let r=0;r=1?9:0)+(I>=2?15:0)+(I>=3?21:0),t=16+A*C;this.buffer=new ArrayBuffer(t),this.view=new DataView(this.buffer),this.view.setUint32(0,TB,!0),this.view.setUint32(4,ZB,!0),this.view.setUint32(8,A,!0),this.view.setUint8(12,I),this.view.setUint8(13,g),this.view.setUint8(14,Q?_B:0),this.view.setUint8(15,0),this.numSplats=A,this.shDegree=I,this.fractionalBits=g,this.fraction=1<>8&255),this.view.setUint8(o+2,t>>16&255),this.view.setUint8(o+3,i&255),this.view.setUint8(o+4,i>>8&255),this.view.setUint8(o+5,i>>16&255),this.view.setUint8(o+6,n&255),this.view.setUint8(o+7,n>>8&255),this.view.setUint8(o+8,n>>16&255)}setAlpha(A,I){const g=16+this.numSplats*9+A;this.view.setUint8(g,Math.max(0,Math.min(255,Math.round(I*255))))}static scaleRgb(A){const I=((A-.5)/(Xg/.15)+.5)*255;return Math.max(0,Math.min(255,Math.round(I)))}setRgb(A,I,g,Q){const C=16+this.numSplats*10+A*3;this.view.setUint8(C,JA.scaleRgb(I)),this.view.setUint8(C+1,JA.scaleRgb(g)),this.view.setUint8(C+2,JA.scaleRgb(Q))}setScale(A,I,g,Q){const C=16+this.numSplats*13+A*3;this.view.setUint8(C,Math.max(0,Math.min(255,Math.round((Math.log(I)+10)*16)))),this.view.setUint8(C+1,Math.max(0,Math.min(255,Math.round((Math.log(g)+10)*16)))),this.view.setUint8(C+2,Math.max(0,Math.min(255,Math.round((Math.log(Q)+10)*16))))}setQuat(A,I,g,Q,C){const t=16+this.numSplats*16+A*3,E=C<0;this.view.setUint8(t,Math.max(0,Math.min(255,Math.round(((E?-I:I)+1)*127.5)))),this.view.setUint8(t+1,Math.max(0,Math.min(255,Math.round(((E?-g:g)+1)*127.5)))),this.view.setUint8(t+2,Math.max(0,Math.min(255,Math.round(((E?-Q:Q)+1)*127.5))))}static quantizeSh(A,I){const g=Math.round(A*128)+128,Q=1<<8-I,C=Math.floor((g+Q/2)/Q)*Q;return Math.max(0,Math.min(255,C))}setSh(A,I,g,Q){const C=vg[this.shDegree]||0,t=16+this.numSplats*19+A*C*3;for(let E=0;E<9;++E)this.view.setUint8(t+E,JA.quantizeSh(I[E],5));if(g){const E=t+9;for(let i=0;i<15;++i)this.view.setUint8(E+i,JA.quantizeSh(g[i],4));if(Q){const i=E+15;for(let s=0;s<21;++s)this.view.setUint8(i+s,JA.quantizeSh(Q[s],4))}}}async finalize(){const A=new Uint8Array(this.buffer),g=new ReadableStream({async start(t){t.enqueue(A),t.close()}}).pipeThrough(new CompressionStream("gzip")),C=await new Response(g).arrayBuffer();return console.log("Compressed",A.length,"bytes to",C.byteLength,"bytes"),new Uint8Array(C)}}async function vB(B){var n,e,r;const A=new qB,{inputs:I,clipXyz:g,maxSh:Q,fractionalBits:C=12,opacityThreshold:t}=B;for(const o of I){let a=function(u){return u.multiplyScalar(w),u.applyQuaternion(F),u.add(G),u},c=function(u){return u.multiplyScalar(w),u},M=function(u){return u.premultiply(F),u},h=function(u){return!R||R.containsPoint(u)},D=function(u){return t!==void 0?u>=t:!0};const w=((n=o.transform)==null?void 0:n.scale)??1,F=new RA().fromArray(((e=o.transform)==null?void 0:e.quaternion)??[0,0,0,1]),G=new f().fromArray(((r=o.transform)==null?void 0:r.translate)??[0,0,0]),R=g?new Rg(new f().fromArray(g.min),new f().fromArray(g.max)):void 0;let p=o.fileType;switch(p||(p=dB(o.fileBytes),!p&&o.pathOrUrl&&(p=KB(o.pathOrUrl))),p){case gI.PLY:{const u=new NI({fileBytes:o.fileBytes});await u.parseHeader();let l=null;u.parseSplats((k,N,y,U,H,K,J,z,W,Z,P,V,v,q,b)=>{const Y=a(new f(N,y,U));if(h(Y)&&D(V)){l=A.pushSplat(),A.setCenter(l,Y.x,Y.y,Y.z);const T=c(new f(H,K,J));A.setScale(l,T.x,T.y,T.z);const S=M(new RA(z,W,Z,P));A.setQuaternion(l,S.x,S.y,S.z,S.w),A.setOpacity(l,V),A.setColor(l,v,q,b)}else l=null},(k,N,y,U)=>{N&&l!==null&&A.setSh1(l,N),y&&l!==null&&A.setSh2(l,y),U&&l!==null&&A.setSh3(l,U)});break}case gI.SPZ:{const u=new _g({fileBytes:o.fileBytes}),l=new Int32Array(u.numSplats);l.fill(-1);const k=new Float32Array(u.numSplats*3),N=new f;u.parseSplats((y,U,H,K)=>{const J=a(new f(U,H,K));k[y*3]=J.x,k[y*3+1]=J.y,k[y*3+2]=J.z},(y,U)=>{N.fromArray(k,y*3),h(N)&&D(U)&&(l[y]=A.pushSplat(),A.setCenter(l[y],N.x,N.y,N.z),A.setOpacity(l[y],U))},(y,U,H,K)=>{l[y]>=0&&A.setColor(l[y],U,H,K)},(y,U,H,K)=>{if(l[y]>=0){const J=c(new f(U,H,K));A.setScale(l[y],J.x,J.y,J.z)}},(y,U,H,K,J)=>{if(l[y]>=0){const z=M(new RA(U,H,K,J));A.setQuaternion(l[y],z.x,z.y,z.z,z.w)}},(y,U,H,K)=>{l[y]>=0&&(A.setSh1(l[y],U),H&&A.setSh2(l[y],H),K&&A.setSh3(l[y],K))});break}case gI.SPLAT:Kg(o.fileBytes,u=>{},(u,l,k,N,y,U,H,K,J,z,W,Z,P,V,v)=>{const q=a(new f(l,k,N));if(h(q)&&D(Z)){const b=A.pushSplat();A.setCenter(b,q.x,q.y,q.z);const Y=c(new f(y,U,H));A.setScale(b,Y.x,Y.y,Y.z);const T=M(new RA(K,J,z,W));A.setQuaternion(b,T.x,T.y,T.z,T.w),A.setOpacity(b,Z),A.setColor(b,P,V,v)}});break;case gI.KSPLAT:{let u=null;JB(o.fileBytes,l=>{},(l,k,N,y,U,H,K,J,z,W,Z,P,V,v,q)=>{const b=a(new f(k,N,y));if(h(b)&&D(P)){u=A.pushSplat(),A.setCenter(u,b.x,b.y,b.z);const Y=c(new f(U,H,K));A.setScale(u,Y.x,Y.y,Y.z);const T=M(new RA(J,z,W,Z));A.setQuaternion(u,T.x,T.y,T.z,T.w),A.setOpacity(u,P),A.setColor(u,V,v,q)}else u=null},(l,k,N,y)=>{u!==null&&(A.setSh1(u,k),N&&A.setSh2(u,N),y&&A.setSh3(u,y))});break}default:throw new Error(`transcodeSpz not implemented for ${p}`)}}const E=Math.min(Q??3,A.sh3?3:A.sh2?2:A.sh1?1:0),i=new JA({numSplats:A.numSplats,shDegree:E,fractionalBits:C,flagAntiAlias:!0});for(let o=0;o=1&&i.setSh(o,A.sh1.slice(o*9,(o+1)*9),E>=2&&A.sh2?A.sh2.slice(o*15,(o+1)*15):void 0,E>=3&&A.sh3?A.sh3.slice(o*21,(o+1)*21):void 0)}return{fileBytes:await i.finalize(),clippedCount:i.clippedCount}}async function jg(B){const{name:A,args:I,id:g}=B.data;let Q,C;try{switch(A){case"unpackPly":{const{packedArray:t,fileBytes:E}=I,i=await XB({packedArray:t,fileBytes:E});Q={id:g,numSplats:i.numSplats,packedArray:i.packedArray,extra:i.extra};break}case"decodeSpz":{const{fileBytes:t}=I,E=jB(t);Q={id:g,numSplats:E.numSplats,packedArray:E.packedArray,extra:E.extra};break}case"decodeAntiSplat":{const{fileBytes:t}=I,E=mB(t);Q={id:g,numSplats:E.numSplats,packedArray:E.packedArray};break}case"decodeKsplat":{const{fileBytes:t}=I,E=LB(t);Q={id:g,numSplats:E.numSplats,packedArray:E.packedArray,extra:E.extra};break}case"decodePcSogs":{const{fileBytes:t,extraFiles:E}=I,i=JSON.parse(new TextDecoder().decode(t)),s=await Zg(i,E);Q={id:g,numSplats:s.numSplats,packedArray:s.packedArray,extra:s.extra};break}case"decodePcSogsZip":{const{fileBytes:t}=I,E=await zB(t);Q={id:g,numSplats:E.numSplats,packedArray:E.packedArray,extra:E.extra};break}case"sortSplats":{const{totalSplats:t,readback:E,ordering:i}=I;Q={id:g,readback:E,...WB({totalSplats:t,readback:E,ordering:i})};break}case"sortDoubleSplats":{const{numSplats:t,readback:E,ordering:i}=I;Q={id:g,readback:E,ordering:i},Q={id:g,readback:E,ordering:i,activeSplats:Pg(t,E,i)};break}case"transcodeSpz":{const t=I,E=await vB(t);Q={id:g,fileBytes:E,input:t};break}default:throw new Error(`Unknown name: ${A}`)}}catch(t){C=t}self.postMessage({id:g,result:Q,error:C},{transfer:GB(Q)})}async function XB({packedArray:B,fileBytes:A}){const I=new NI({fileBytes:A});await I.parseHeader();const g=I.numSplats,Q={};return I.parseSplats((C,t,E,i,s,n,e,r,o,a,c,M,h,D,w)=>{_I(B,C,t,E,i,s,n,e,r,o,a,c,M,h,D,w)},(C,t,E,i)=>{t&&(Q.sh1||(Q.sh1=new Uint32Array(g*2)),yI(Q.sh1,C,t)),E&&(Q.sh2||(Q.sh2=new Uint32Array(g*4)),lI(Q.sh2,C,E)),i&&(Q.sh3||(Q.sh3=new Uint32Array(g*4)),MI(Q.sh3,C,i))}),{packedArray:B,numSplats:g,extra:Q}}function jB(B){const A=new _g({fileBytes:B}),I=A.numSplats,g=wI(I),Q=new Uint32Array(g*4),C={};return A.parseSplats((t,E,i,s)=>{xg(Q,t,E,i,s)},(t,E)=>{kB(Q,t,E)},(t,E,i,s)=>{fB(Q,t,E,i,s)},(t,E,i,s)=>{pg(Q,t,E,i,s)},(t,E,i,s,n)=>{dg(Q,t,E,i,s,n)},(t,E,i,s)=>{E&&(C.sh1||(C.sh1=new Uint32Array(I*2)),yI(C.sh1,t,E)),i&&(C.sh2||(C.sh2=new Uint32Array(I*4)),lI(C.sh2,t,i)),s&&(C.sh3||(C.sh3=new Uint32Array(I*4)),MI(C.sh3,t,s))}),{packedArray:Q,numSplats:I,extra:C}}const XI=31744,kI=XI+1;let FA=null;function WB({totalSplats:B,readback:A,ordering:I}){FA||(FA=new Uint32Array(kI)),FA.fill(0);const g=A.map(i=>new Uint32Array(i.buffer)),Q=g[0].length,C=Math.ceil(B/Q);let t=0;for(let i=0;i { (self.URL || self.webkitURL).revokeObjectURL(A); }), e; } catch { return new Worker( "data:text/javascript;charset=utf-8," + encodeURIComponent(Yi), { name: t == null ? void 0 : t.name } ); } finally { A && (self.URL || self.webkitURL).revokeObjectURL(A); } } class ro { constructor() { this.messages = {}, this.messageIdNext = 0, this.worker = new oo(), this.worker.onmessage = (A) => this.onMessage(A); } makeMessageId() { return ++this.messageIdNext; } makeMessagePromiseId() { const A = this.makeMessageId(), e = new Promise((g, I) => { this.messages[A] = { resolve: g, reject: I }; }); return { id: A, promise: e }; } onMessage(A) { const { id: e, result: g, error: I } = A.data, s = this.messages[e]; s && (delete this.messages[e], I ? s.reject(I) : s.resolve(g)); } // 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: g, promise: I } = this.makeMessagePromiseId(); return this.worker.postMessage( { name: A, args: e, id: g }, { transfer: kI(e) } ), I; } } let Li = 4, ae = 0; const Ji = [], vi = []; async function co() { const t = Ji.shift(); if (t) return t; if (ae < Li) { const A = new ro(); return ae += 1, A; } return new Promise((A) => { vi.push(A); }); } function ho(t) { if (ae > Li) { ae -= 1; return; } const A = vi.shift(); if (A) { A(t); return; } Ji.push(t); } async function Et(t) { const A = await co(); try { return await t(A); } finally { ho(A); } } class lo extends CQ { constructor(A) { super(A), this.fileLoader = new EQ(A); } load(A, e, g, I) { const s = this.manager.resolveURL( (this.path ?? "") + (A ?? "") ), B = new Headers(this.requestHeader), i = this.withCredentials ? "include" : "same-origin", Q = new Request(s, { headers: B, credentials: i }); let C = this.fileType; this.manager.itemStart(s), Eg(Q, g).then(async (E) => { const n = [ new ProgressEvent("progress", { lengthComputable: !0, loaded: E.byteLength, total: E.byteLength }) ]; function o() { if (g) { const h = n.every((w) => w.lengthComputable || w.loaded === 0 && w.total === 0), u = n.reduce((w, y) => w + y.loaded, 0), D = n.reduce((w, y) => w + y.total, 0); g( new ProgressEvent("progress", { lengthComputable: h, loaded: u, total: D }) ); } } const r = {}, l = [], c = Ag(E); if (C === "pcsogs" && c === void 0) throw new Error("Invalid PC SOGS file"); if (c !== void 0) { C = "pcsogs"; for (const h of ["means", "scales", "quats", "sh0", "shN"]) { const u = c[h]; if (u) for (const D of u.files) { const w = new URL(D, s).toString(), y = n.length; n.push(new ProgressEvent("progress")), this.manager.itemStart(w); const f = new Request(w, { headers: B, credentials: i }), N = Eg(f, (M) => { n[y] = M, o(); }).then((M) => { r[D] = M; }).catch((M) => { throw this.manager.itemError(w), M; }).finally(() => { this.manager.itemEnd(w); }); l.push(N); } } } if (await Promise.all(l), e) { const h = await Hi({ input: E, extraFiles: r, fileType: C, pathOrUrl: s }); this.packedSplats ? (this.packedSplats.initialize(h), e(this.packedSplats)) : e(new qA(h)); } }).catch((E) => { this.manager.itemError(s), I == null || I(E); }).finally(() => { this.manager.itemEnd(s); }); } async loadAsync(A, e) { return new Promise((g, I) => { this.load( A, (s) => { g(s); }, e, I ); }); } parse(A) { return new XA({ packedSplats: A }); } } async function Eg(t, A) { const e = await fetch(t); if (!e.ok) throw new Error( `${e.status} "${e.statusText}" fetching URL: ${t.url}` ); if (!e.body) throw new Error(`Response body is null for URL: ${t.url}`); const g = e.body.getReader(), I = Number.parseInt( e.headers.get("Content-Length") || "0" ), s = Number.isNaN(I) ? 0 : I; let B = 0; const i = []; for (; ; ) { const { done: E, value: n } = await g.read(); if (E) break; i.push(n), B += n.length, A && A( new ProgressEvent("progress", { lengthComputable: s !== 0, loaded: B, total: s }) ); } const Q = new Uint8Array(B); let C = 0; for (const E of i) Q.set(E, C), C += E.length; return Q.buffer; } var Jt = /* @__PURE__ */ ((t) => (t.PLY = "ply", t.SPZ = "spz", t.SPLAT = "splat", t.KSPLAT = "ksplat", t.PCSOGS = "pcsogs", t.PCSOGSZIP = "pcsogszip", t))(Jt || {}); function bi(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 = TI(t, 4); return new DataView(e.buffer).getUint32(0, !0) === 1347635022 ? "spz" : void 0; } if (A.getUint32(0, !0) === 67324752) return wo(t) ? "pcsogszip" : void 0; } function uo(t) { const A = t.split(/[?#]/, 1)[0], e = Math.max( A.lastIndexOf("/"), A.lastIndexOf("\\") ), g = A.slice(e + 1), I = g.lastIndexOf("."); return I <= 0 || I === g.length - 1 ? "" : g.slice(I + 1).toLowerCase(); } function Ti(t) { const A = uo(t); if (A === "ply") return "ply"; if (A === "spz") return "spz"; if (A === "splat") return "splat"; if (A === "ksplat") return "ksplat"; } function yr(t) { return Ag(t) !== void 0; } function Ag(t) { try { let A; if (typeof t == "string") A = t; else { const g = t instanceof ArrayBuffer ? new Uint8Array(t) : t; if (g.length > 65536) return; A = new TextDecoder().decode(g); } const e = JSON.parse(A); if (!e || typeof e != "object" || Array.isArray(e)) return; for (const g of ["means", "scales", "quats", "sh0"]) if (!e[g] || typeof e[g] != "object" || Array.isArray(e[g]) || !e[g].shape || !e[g].files || g !== "quats" && (!e[g].mins || !e[g].maxs)) return; return e; } catch { return; } } function wo(t) { try { const A = t instanceof ArrayBuffer ? new Uint8Array(t) : t; let e = null; const g = xQ(A, { filter: ({ name: s }) => s.split(/[\\/]/).pop() === "meta.json" ? (e = s, !0) : !1 }); if (!e) return; const I = Ag(g[e]); return I ? { name: e, json: I } : void 0; } catch { return; } } async function Hi({ input: t, extraFiles: A, fileType: e, pathOrUrl: g }) { const I = t instanceof ArrayBuffer ? new Uint8Array(t) : t; let s = e; switch (e || (s = bi(I), !s && g && (s = Ti(g))), s) { case "ply": { const B = new Ee({ fileBytes: I }); await B.parseHeader(); const i = B.numSplats, Q = dA(i).maxSplats, C = { fileBytes: I, packedArray: new Uint32Array(Q * 4) }; return await Et(async (E) => { const { packedArray: n, numSplats: o, extra: r } = await E.call( "unpackPly", C ); return { packedArray: n, numSplats: o, extra: r }; }); } case "spz": return await Et(async (B) => { const { packedArray: i, numSplats: Q, extra: C } = await B.call( "decodeSpz", { fileBytes: I } ); return { packedArray: i, numSplats: Q, extra: C }; }); case "splat": return await Et(async (B) => { const { packedArray: i, numSplats: Q } = await B.call( "decodeAntiSplat", { fileBytes: I } ); return { packedArray: i, numSplats: Q }; }); case "ksplat": return await Et(async (B) => { const { packedArray: i, numSplats: Q, extra: C } = await B.call( "decodeKsplat", { fileBytes: I } ); return { packedArray: i, numSplats: Q, extra: C }; }); case "pcsogs": return await Et(async (B) => { const { packedArray: i, numSplats: Q, extra: C } = await B.call( "decodePcSogs", { fileBytes: I, extraFiles: A } ); return { packedArray: i, numSplats: Q, extra: C }; }); case "pcsogszip": return await Et(async (B) => { const { packedArray: i, numSplats: Q, extra: C } = await B.call( "decodePcSogsZip", { fileBytes: I } ); return { packedArray: i, numSplats: Q, extra: C }; }); default: throw new Error(`Unknown splat file type: ${s}`); } } class Do { constructor({ maxSplats: A = 1 } = {}) { this.numSplats = 0, this.maxSplats = dA(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), g = new Float32Array(e * 3), I = new Float32Array(e * 3), s = new Float32Array(e * 4), B = new Float32Array(e), i = new Float32Array(e * 3); if (g.set(this.centers), I.set(this.scales), s.set(this.quaternions), B.set(this.opacities), i.set(this.colors), this.centers = g, this.scales = I, this.quaternions = s, this.opacities = B, this.colors = i, this.sh1) { const Q = new Float32Array(e * 9); Q.set(this.sh1), this.sh1 = Q; } if (this.sh2) { const Q = new Float32Array(e * 15); Q.set(this.sh2), this.sh2 = Q; } if (this.sh3) { const Q = new Float32Array(e * 21); Q.set(this.sh3), this.sh3 = Q; } this.maxSplats = e; } } ensureIndex(A) { this.ensureCapacity(A + 1); } setCenter(A, e, g, I) { this.centers[A * 3] = e, this.centers[A * 3 + 1] = g, this.centers[A * 3 + 2] = I; } setScale(A, e, g, I) { this.scales[A * 3] = e, this.scales[A * 3 + 1] = g, this.scales[A * 3 + 2] = I; } setQuaternion(A, e, g, I, s) { this.quaternions[A * 4] = e, this.quaternions[A * 4 + 1] = g, this.quaternions[A * 4 + 2] = I, this.quaternions[A * 4 + 3] = s; } setOpacity(A, e) { this.opacities[A] = e; } setColor(A, e, g, I) { this.colors[A * 3] = e, this.colors[A * 3 + 1] = g, this.colors[A * 3 + 2] = I; } setSh1(A, e) { this.sh1 || (this.sh1 = new Float32Array(this.maxSplats * 9)); for (let g = 0; g < 9; ++g) this.sh1[A * 9 + g] = e[g]; } setSh2(A, e) { this.sh2 || (this.sh2 = new Float32Array(this.maxSplats * 15)); for (let g = 0; g < 15; ++g) this.sh2[A * 15 + g] = e[g]; } setSh3(A, e) { this.sh3 || (this.sh3 = new Float32Array(this.maxSplats * 21)); for (let g = 0; g < 21; ++g) this.sh3[A * 21 + g] = e[g]; } } var yo = `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 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 IA = class IA { 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 tg({ 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: g, construct: I } = A; if (e) { const s = new lo(); s.packedSplats = this, await s.loadAsync(e); } else if (g) { const s = await Hi({ input: g, fileType: A.fileType, pathOrUrl: A.fileName ?? e }); this.initialize(s); } if (I) { const s = I(this); s instanceof Promise && await s; } } // 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) ), g = this.packedArray ? this.packedArray.length / 4 : 0; if (!this.packedArray || e > g) { this.maxSplats = dA(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 g, I; if (A === 0) return this.ensureSplats(e); if (A === 1) g = 2, I = "sh1"; else if (A === 2) g = 4, I = "sh2"; else if (A === 3) g = 4, I = "sh3"; else throw new Error(`Invalid level: ${A}`); let s = this.extra[I] ? this.extra[I].length / g : 0; const B = e <= s ? s : Math.max(e, 2 * s); if (!this.extra[I] || B > s) { s = dA(B).maxSplats; const i = new Uint32Array(s * g); this.extra[I] && i.set(this.extra[I]), this.extra[I] = i; } 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 Ye(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, g, I, s, B) { const i = this.ensureSplats(A + 1); Ue( i, A, e.x, e.y, e.z, g.x, g.y, g.z, I.x, I.y, I.z, I.w, s, B.r, B.g, B.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, g, I, s) { const B = this.ensureSplats(this.numSplats + 1); Ue( B, this.numSplats, A.x, A.y, A.z, e.x, e.y, e.z, g.x, g.y, g.z, g.w, I, s.r, s.g, s.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 g = Ye(this.packedArray, e); A( e, g.center, g.scales, g.quaternion, g.opacity, g.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 = dA(A ?? 1), { width: g, height: I, depth: s } = e; return this.maxSplats = e.maxSplats, this.target = new a.WebGLArrayRenderTarget(g, I, s, { depthBuffer: !1, stencilBuffer: !1, generateMipmaps: !1, magFilter: a.NearestFilter, minFilter: a.NearestFilter }), this.target.texture.format = a.RGBAIntegerFormat, this.target.texture.type = a.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 g = A.map((I) => { const s = e, B = Math.ceil(I / P) * P; return e += B, { base: s, count: I }; }); return { maxSplats: e, mapping: g }; } // 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() : IA.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: g } = this.source.image; this.maxSplats !== A * e * g && (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: g } = dA(this.maxSplats); this.source = new a.DataArrayTexture( this.packedArray, A, e, g ), this.source.format = a.RGBAIntegerFormat, this.source.type = a.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 (!IA.emptySource) { const { width: A, height: e, depth: g, maxSplats: I } = dA(1), s = new Uint32Array(I * 4); IA.emptySource = new a.DataArrayTexture( s, A, e, g ), IA.emptySource.format = a.RGBAIntegerFormat, IA.emptySource.type = a.UnsignedIntType, IA.emptySource.internalFormat = "RGBA32UI", IA.emptySource.needsUpdate = !0; } return IA.emptySource; } // Get a program and THREE.RawShaderMaterial for a given GsplatGenerator, // generating it if necessary and caching the result. prepareProgramMaterial(A) { let e = IA.generatorProgram.get(A); if (!e) { const I = GA( { index: "int" }, { output: "uvec4" }, ({ index: s }) => { A.inputs.index = s; const B = A.outputs.gsplat; return { output: Zg(B) }; } ); IA.programTemplate || (IA.programTemplate = new Oe( yo )), e = new Xe({ graph: I, inputs: { index: "index" }, outputs: { output: "target" }, template: IA.programTemplate }), Object.assign(e.uniforms, { targetLayer: { value: 0 }, targetBase: { value: 0 }, targetCount: { value: 0 } }), IA.generatorProgram.set(A, e); } const g = e.prepareMaterial(); return IA.fullScreenQuad.material = g, { program: e, material: g }; } 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: g, renderer: I }) { if (!this.target) throw new Error("Target must be initialized with ensureSplats"); if (e + g > this.maxSplats) throw new Error("Base + count exceeds maxSplats"); const { program: s, material: B } = this.prepareProgramMaterial(A); s.update(); const i = this.saveRenderState(I), Q = Math.ceil((e + g) / P) * P, C = P * It; for (B.uniforms.targetBase.value = e, B.uniforms.targetCount.value = g; e < Q; ) { const E = Math.floor(e / C); B.uniforms.targetLayer.value = E; const n = E * C, o = Math.floor((e - n) / P), r = Math.min( It, Math.ceil((Q - n) / P) ); this.target.scissor.set( 0, o, P, r - o ), I.setRenderTarget(this.target, E), I.xr.enabled = !1, I.autoClear = !1, IA.fullScreenQuad.render(I), e += P * (r - o); } return this.resetRenderState(I, i), { nextBase: Q }; } }; IA.emptySource = null, IA.programTemplate = null, IA.generatorProgram = /* @__PURE__ */ new Map(), IA.fullScreenQuad = new hg( new a.RawShaderMaterial({ visible: !1 }) ); let qA = IA; class tg extends x { constructor({ packedSplats: A } = {}) { super({ key: "packedSplats", type: _t, globals: () => [he], value: { texture: qA.getEmpty(), numSplats: 0 }, update: (e) => { var g, I; return e.texture = ((g = this.packedSplats) == null ? void 0 : g.getTexture()) ?? qA.getEmpty(), e.numSplats = ((I = this.packedSplats) == null ? void 0 : I.numSplats) ?? 0, e; } }), this.packedSplats = A; } } class Te extends a.InstancedBufferGeometry { constructor(A, e) { super(), this.ordering = A, this.setAttribute("position", new a.BufferAttribute(po, 3)), this.setIndex(new a.BufferAttribute(fo, 1)), this._maxInstanceCount = A.length, this.instanceCount = e, this.attribute = new a.InstancedBufferAttribute(A, 1, !1, 1), this.attribute.setUsage(a.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 po = new Float32Array([ -1, -1, 0, 1, -1, 0, 1, 1, 0, -1, 1, 0 ]), fo = new Uint16Array([0, 1, 2, 0, 2, 3]), gt = class gt { 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 a.Matrix4(), A.target) { const { width: e, height: g, doubleBuffer: I } = A.target, s = Math.max(1, Math.min(4, A.target.superXY ?? 1)); if (this.superXY = s, e * s > 8192 || g * s > 8192) throw new Error("Target size too large"); this.target = new a.WebGLRenderTarget( e * s, g * s, { format: a.RGBAFormat, type: a.UnsignedByteType, colorSpace: a.SRGBColorSpace } ), I && (this.back = new a.WebGLRenderTarget( e * s, g * s, { format: a.RGBAFormat, type: a.UnsignedByteType, colorSpace: a.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 xI({ allocate: (e) => new Uint32Array(e), valid: (e, g) => e.length === g }), 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: g, update: I, forceOrigin: s }) { var i; for (g ? this.viewToWorld = g : (this.camera = e ?? this.camera, this.camera && (this.camera.updateMatrixWorld(), this.viewToWorld = this.camera.matrixWorld.clone())); I ?? !0; ) { const Q = s ? this.viewToWorld : void 0; if (this.spark.updateInternal({ scene: A, originToWorld: Q })) break; await new Promise((E) => setTimeout(E, 10)); } const B = this.spark.active; B !== ((i = this.display) == null ? void 0 : i.accumulator) && (this.spark.active.refCount += 1), await this.sortUpdate({ accumulator: B, 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 g = this.back ?? this.target; if (!g) throw new Error("Must initialize SparkViewpoint with target"); if (e = e ?? this.camera, !e) throw new Error("Must provide camera"); if (e instanceof a.PerspectiveCamera) { const s = new a.PerspectiveCamera().copy(e, !1); s.aspect = g.width / g.height, s.updateProjectionMatrix(), e = s; } this.viewToWorld = e.matrixWorld.clone(); try { this.spark.renderer.setRenderTarget(g), this.spark.prepareViewpoint(this), this.spark.renderer.render(A, e); } finally { this.spark.prepareViewpoint(this.spark.defaultView), this.spark.renderer.setRenderTarget(null); } g !== this.target && ([this.target, this.back] = [this.back, this.target]), (I = this.onTextureUpdated) == null || I.call(this, g.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, g = A * e * 4; (!this.superPixels || this.superPixels.length < g) && (this.superPixels = new Uint8Array(g)), await this.spark.renderer.readRenderTargetPixelsAsync( this.target, 0, 0, A, e, this.superPixels ); const { superXY: I } = this; if (I === 1) return this.superPixels; const s = A / I, B = e / I, i = s * B * 4; (!this.pixels || this.pixels.length < i) && (this.pixels = new Uint8Array(i)); const { superPixels: Q, pixels: C } = this, E = I * I; for (let n = 0; n < B; n++) { const o = n * s; for (let r = 0; r < s; r++) { const l = r * I; let c = 0, h = 0, u = 0, D = 0; for (let y = 0; y < I; y++) { const f = (n * I + y) * this.target.width; for (let N = 0; N < I; N++) { const M = (f + l + N) * 4; c += Q[M], h += Q[M + 1], u += Q[M + 2], D += Q[M + 3]; } } const w = (o + r) * 4; C[w] = c / E, C[w + 1] = h / E, C[w + 2] = u / E, C[w + 3] = D / E; } } return C; } // 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: g, update: I, forceOrigin: s }) { return await this.prepare({ scene: A, camera: e, viewToWorld: g, update: I, forceOrigin: s }), 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 s, B, i, Q; this.camera && (this.camera.updateMatrixWorld(), this.viewToWorld = this.camera.matrixWorld.clone()); let e = !1, g = !1; if (!this.display) e = !0; else if (A) { e = !0; const { mappingVersion: C } = this.display.accumulator; A.mappingVersion === C && (this.spark.releaseAccumulator(this.display.accumulator), this.display.accumulator = A, g = !0); } const I = ((s = this.sorting) == null ? void 0 : s.viewToWorld) ?? ((B = this.display) == null ? void 0 : B.viewToWorld); I && !Qe({ 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 && ((i = this.pending) != null && i.accumulator) && this.pending.accumulator !== ((Q = this.display) == null ? void 0 : Q.accumulator) && this.spark.releaseAccumulator(this.pending.accumulator), this.pending = { accumulator: A, viewToWorld: this.viewToWorld, displayed: g }, this.driveSort()); } async driveSort() { var A; for (; ; ) { if (this.sorting || !this.pending) return; const { viewToWorld: e, displayed: g } = 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: g }), this.sorting = null; } } async sortUpdate({ accumulator: A, viewToWorld: e, displayed: g = !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: s } = A.splats; let B = 0, i = this.orderingFreelist.alloc(s); if (I > 0) { const { reader: Q, doubleSortReader: C, dynoSortRadial: E, dynoOrigin: n, dynoDirection: o, dynoDepthBias: r, dynoSort360: l, dynoSplats: c } = gt.makeSorter(), h = Math.ceil(s / 2); this.readback = Q.ensureBuffer(h, this.readback); const u = A.toWorld.clone().invert(), D = e.clone().premultiply(u); E.value = this.sort360 ? !0 : this.sortRadial, n.value.set(0, 0, 0).applyMatrix4(D), o.value.set(0, 0, -1).applyMatrix4(D).sub(n.value).normalize(), r.value = this.depthBias ?? 1, l.value = this.sort360 ?? !1, c.packedSplats = A.splats, await Q.renderReadback({ renderer: this.spark.renderer, reader: C, count: Math.ceil(I / 2), readback: this.readback }); const w = await Et(async (y) => y.call("sortDoubleSplats", { numSplats: I, readback: this.readback, ordering: i })); this.readback = w.readback, i = w.ordering, B = w.activeSplats; } this.updateDisplay({ accumulator: A, viewToWorld: e, ordering: i, activeSplats: B, displayed: g }), this.sortingCheck = !1; } updateDisplay({ accumulator: A, viewToWorld: e, ordering: g, activeSplats: I, displayed: s = !1 }) { if (!this.display) this.display = { accumulator: A, viewToWorld: e, geometry: new Te(g, I) }; else { !s && A !== this.display.accumulator && (this.spark.releaseAccumulator(this.display.accumulator), this.display.accumulator = A), this.display.viewToWorld = e; const B = this.display.geometry.ordering; B.length === g.length ? this.display.geometry.update(g, I) : (this.display.geometry.dispose(), this.display.geometry = new Te(g, I)), this.orderingFreelist.free(B); } this.spark.viewpoint === this && this.spark.prepareViewpoint(this); } static makeSorter() { if (!gt.dynos) { const A = new ie({ value: !0 }), e = new St({ value: new a.Vector3() }), g = new St({ value: new a.Vector3() }), I = new ot({ value: 1 }), s = new ie({ value: !1 }), B = new tg(), i = new ne(), Q = GA( { index: "int" }, { rgba8: "vec4" }, ({ index: C }) => { if (!C) throw new Error("No index"); const E = { sortRadial: A, sortOrigin: e, sortDirection: g, sortDepthBias: I, sort360: s }, n = EA(C, K("int", 2)), o = Ht(B, n), r = ag({ gsplat: o, ...E }), l = Ht( B, fA(n, K("int", 1)) ), c = ag({ gsplat: l, ...E }), h = KA({ vectorType: "vec2", x: r, y: c }); return { rgba8: Vs(zs(h)) }; } ); gt.dynos = { dynoSortRadial: A, dynoOrigin: e, dynoDirection: g, dynoDepthBias: I, dynoSort360: s, dynoSplats: B, reader: i, doubleSortReader: Q }; } return gt.dynos; } }; gt.EMPTY_TEXTURE = new a.Texture(), gt.dynos = null; let oe = gt; const Mo = oA(` 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 ag({ gsplat: t, sortRadial: A, sortOrigin: e, sortDirection: g, sortDepthBias: I, sort360: s }) { return jt({ inTypes: { gsplat: W, sortRadial: "bool", sortOrigin: "vec3", sortDirection: "vec3", sortDepthBias: "float", sort360: "bool" }, outTypes: { metric: "float" }, globals: () => [SA, Mo], inputs: { gsplat: t, sortRadial: A, sortOrigin: e, sortDirection: g, sortDepthBias: I, sort360: s }, statements: ({ inputs: B, outputs: i }) => { const { gsplat: Q, sortRadial: C, sortOrigin: E, sortDirection: n, sortDepthBias: o, sort360: r } = B; return UA(` ${i.metric} = computeSort(${Q}, ${C}, ${E}, ${n}, ${o}, ${r}); `); } }).outputs.metric; } class Fe { constructor() { this.splats = new qA(), this.toWorld = new a.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: g, forceUpdate: I, originToWorld: s }) { const B = this.mapping.reduce((C, E) => (C.set(E.node, E), C), /* @__PURE__ */ new Map()); let i = 0, Q = 0; for (const { node: C, generator: E, version: n, base: o, count: r } of g) { const l = B.get(C); if ((I || E !== (l == null ? void 0 : l.generator) || n !== (l == null ? void 0 : l.version) || o !== (l == null ? void 0 : l.base) || r !== (l == null ? void 0 : l.count)) && E && r > 0) { const c = e.apply(E); try { this.splats.generate({ generator: c, base: o, count: r, renderer: A }); } catch (h) { C.generator = void 0, C.generatorError = h; } i += 1; } Q = Math.max(Q, o + r); } return this.splats.numSplats = Q, this.toWorld = s, this.mapping = g, i !== 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: g, count: I }, s) => { const { node: B, base: i, count: Q } = A.mapping[s]; return e === B && g === i && I === Q; }); } } var mo = `const float LN_SCALE_MIN = -12.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); }`, No = `precision highp float; precision highp int; #include 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; }`, So = `precision highp float; precision highp int; precision highp usampler2DArray; #include 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 focalAdjustment; 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 * focalAdjustment; 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 Ge = null; function Fo() { return Ge || (a.ShaderChunk.splatDefines = mo, Ge = { splatVertex: So, splatFragment: No }), Ge; } const og = 5; let He = !1, Ke = !1, Ki; function Go(t) { let A = !1; return t instanceof XA ? !0 : (t.traverse((e) => { A = A || e instanceof XA; }), A); } const qi = a.Scene.prototype.add; a.Scene.prototype.add = function(t) { return He = He || Go(t), Ke = Ke || t instanceof re, qi.call(this, t), this; }; const ko = a.Scene.prototype.onBeforeRender; a.Scene.prototype.onBeforeRender = function(t) { if (He) { if (!Ke) { const A = Ki || new re({ renderer: t }); this.add(A); } a.Scene.prototype.onBeforeRender = ko, a.Scene.prototype.add = qi; } }; const iA = class iA extends a.Mesh { constructor(A) { const e = iA.makeUniforms(), g = Fo(), I = new a.ShaderMaterial({ glslVersion: a.GLSL3, vertexShader: g.splatVertex, fragmentShader: g.splatFragment, uniforms: e, transparent: !0, blending: a.NormalBlending, depthTest: !0, depthWrite: !1, side: a.DoubleSide }); super(rg, I), this.splatTexture = null, this.autoViewpoints = [], this.rotateToAccumulator = new Xt({ value: new a.Quaternion() }), this.translateToAccumulator = new St({ value: new a.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 s = GA( { gsplat: W }, { gsplat: W }, ({ gsplat: B }) => { if (!B) throw new Error("gsplat not defined"); return B = Ze(B, { rotate: this.rotateToAccumulator, translate: this.translateToAccumulator }), { gsplat: B }; } ); this.modifier = new Io(s), 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.focalAdjustment = A.focalAdjustment ?? 1, this.active = new Fe(), this.accumulatorCount = 1, this.freeAccumulators = []; for (let B = 0; B < 1; ++B) this.freeAccumulators.push(new Fe()), this.accumulatorCount += 1; this.defaultView = new oe({ ...A.view, autoUpdate: !0, spark: this }), this.viewpoint = this.defaultView, this.prepareViewpoint(this.viewpoint), this.clock = A.clock ? RI(A.clock) : new a.Clock(), Ki = this; } static makeUniforms() { return { // Size of render viewport in pixels renderSize: { value: new a.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 a.Quaternion() }, // SplatAccumulator to view transformation translation renderToViewPos: { value: new a.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 focalAdjustment: { value: 1 }, // Enable splat texture rendering splatTexEnable: { value: !1 }, // Splat texture to render splatTexture: { type: "t", value: iA.EMPTY_SPLAT_TEXTURE }, // Splat texture UV transform (multiply) splatTexMul: { value: new a.Matrix2() }, // Splat texture UV transform (add) splatTexAdd: { value: new a.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 < og; } maybeAllocAccumulator() { let A = this.freeAccumulators.pop(); if (A === void 0) { if (this.accumulatorCount >= og) return null; A = new Fe(), this.accumulatorCount += 1; } return A.refCount = 1, A; } releaseAccumulator(A) { A.refCount -= 1, A.refCount === 0 && this.freeAccumulators.push(A); } newViewpoint(A) { return new oe({ ...A, spark: this }); } onBeforeRender(A, e, g) { var r, l; const I = this.time ?? this.clock.getElapsedTime(), s = I - (this.viewpoint.lastTime ?? I); this.viewpoint.lastTime = I; const B = A.info.render.frame, i = B !== this.lastFrame; this.lastFrame = B; const Q = this.viewpoint; if (Q === this.defaultView) { if (i) if (!A.xr.isPresenting) this.defaultView.viewToWorld = g.matrixWorld.clone(), this.defaultCameras = [this.defaultView.viewToWorld]; else { const c = A.xr.getCamera().cameras; this.defaultCameras = c.map((h) => h.matrixWorld), this.defaultView.viewToWorld = xo(this.defaultCameras) ?? new a.Matrix4(); } this.autoUpdate && this.update({ scene: e, viewToWorld: this.defaultView.viewToWorld }); } if (i && (this.uniforms.time.value = I, this.uniforms.deltaTime.value = s, this.uniforms.debugFlag.value = performance.now() / 1e3 % 2 < 1), Q.target) this.uniforms.renderSize.value.set( Q.target.width, Q.target.height ); else { const c = A.getDrawingBufferSize( this.uniforms.renderSize.value ); if (c.x === 1 && c.y === 1) { const h = (r = A.xr.getSession()) == null ? void 0 : r.renderState.baseLayer; h && (c.x = h.framebufferWidth, c.y = h.framebufferHeight); } } const C = g; if (this.uniforms.near.value = C.near, this.uniforms.far.value = C.far, this.uniforms.encodeLinear.value = Q.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.focalAdjustment.value = this.focalAdjustment, 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 = iA.EMPTY_SPLAT_TEXTURE); } else this.uniforms.splatTexEnable.value = !1, this.uniforms.splatTexture.value = iA.EMPTY_SPLAT_TEXTURE; const E = ((l = Q.display) == null ? void 0 : l.accumulator.toWorld) ?? new a.Matrix4(), n = g.matrixWorld.clone().invert(); E.clone().premultiply(n).decompose( this.uniforms.renderToViewPos.value, this.uniforms.renderToViewQuat.value, new a.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: g } = this.viewpoint.display; this.uniforms.numSplats.value = e.splats.numSplats, this.uniforms.packedSplats.value = e.splats.getTexture(), this.geometry = g; } else this.uniforms.numSplats.value = 0, this.uniforms.packedSplats.value = qA.getEmpty(), this.geometry = rg; } // 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 g = this.matrixWorld.clone(); this.preUpdate ? this.updateInternal({ scene: A, originToWorld: g, viewToWorld: e }) : (this.pendingUpdate = { scene: A, originToWorld: g }, setTimeout(() => { if (this.pendingUpdate) { const { scene: I, originToWorld: s } = this.pendingUpdate; this.pendingUpdate = null, this.updateInternal({ scene: I, originToWorld: s, viewToWorld: e }); } }, 1)); } updateInternal({ scene: A, originToWorld: e, viewToWorld: g }) { var l; if (!this.canAllocAccumulator()) return !1; e || (e = this.active.toWorld), g = g ?? e.clone(); const I = this.time ?? this.clock.getElapsedTime(), s = I - (this.lastUpdateTime ?? I); this.lastUpdateTime = I; const B = this.active.mapping.reduce((c, h) => (c.set(h.node, h), c), /* @__PURE__ */ new Map()), { generators: i, visibleGenerators: Q, globalEdits: C } = this.compileScene(A); for (const c of i) (l = c.frameUpdate) == null || l.call(c, { object: c, time: I, deltaTime: s, viewToWorld: g, globalEdits: C }); const E = new Set(Q.map((c) => c.uuid)); for (const c of i) { const h = B.get(c), D = c.generator && E.has(c.uuid) ? c.numSplats : 0; (c.generator !== (h == null ? void 0 : h.generator) || D !== (h == null ? void 0 : h.count)) && c.updateVersion(); } const o = !Qe({ matrix1: e, matrix2: this.active.toWorld, maxDistance: this.originDistance }) || i.length !== B.size || i.some((c) => { var h; return c.version !== ((h = B.get(c)) == null ? void 0 : h.version); }); let r = null; if (o) { if (r = this.maybeAllocAccumulator(), !r) throw new Error("Unreachable"); const c = !Qe({ matrix1: e, matrix2: this.active.toWorld, maxDistance: 1e-5, minCoorient: 0.99999 }), u = Q.map((M, d) => { const p = B.get(M); 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. [M.version - p.version, p.base, M] ) : [Number.POSITIVE_INFINITY, M.version, M]; }).sort((M, d) => M[0] !== d[0] ? M[0] - d[0] : M[1] - d[1]).map(([M, d, p]) => p), D = u.map((M) => M.numSplats), { maxSplats: w, mapping: y } = r.splats.generateMapping(D), f = u.map((M, d) => { const { base: p, count: R } = y[d]; return { node: M, generator: M.generator, version: M.version, base: p, count: R }; }); e.clone().invert().decompose( this.translateToAccumulator.value, this.rotateToAccumulator.value, new a.Vector3() ), r.ensureGenerate(w), r.generateSplats({ renderer: this.renderer, modifier: this.modifier, generators: f, forceUpdate: c, originToWorld: e }), r.splatsVersion = this.active.splatsVersion + 1; const N = r.hasCorrespondence(this.active); r.mappingVersion = this.active.mappingVersion + (N ? 0 : 1), this.releaseAccumulator(this.active), this.active = r, this.prepareViewpoint(); } return setTimeout(() => { for (const c of this.autoViewpoints) c.autoPoll({ accumulator: r ?? void 0 }); }, 1), !0; } compileScene(A) { const e = []; A.traverse((s) => { s instanceof qt && e.push(s); }); const g = []; A.traverseVisible((s) => { s instanceof qt && g.push(s); }); const I = /* @__PURE__ */ new Set(); return A.traverseVisible((s) => { if (s instanceof Ce) { let B = s.parent; for (; B != null && !(B instanceof XA); ) B = B.parent; B == null && I.add(s); } }), { generators: e, visibleGenerators: g, 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: g, size: I = 256, near: s = 0.1, far: B = 1e3, hideObjects: i = [], update: Q = !1 }) { var r, l; if (this.envViewpoint || (this.envViewpoint = this.newViewpoint({ sort360: !0 })), !iA.cubeRender || iA.cubeRender.target.width !== I || iA.cubeRender.near !== s || iA.cubeRender.far !== B) { iA.cubeRender && iA.cubeRender.target.dispose(); const c = new a.WebGLCubeRenderTarget(I, { format: a.RGBAFormat, generateMipmaps: !0, minFilter: a.LinearMipMapLinearFilter }), h = new a.CubeCamera(s, B, c); iA.cubeRender = { target: c, camera: h, near: s, far: B }; } iA.pmrem || (iA.pmrem = new a.PMREMGenerator(A ?? this.renderer)); const C = new a.Matrix4().setPosition(g); await ((r = this.envViewpoint) == null ? void 0 : r.prepare({ scene: e, viewToWorld: C, update: Q })); const { target: E, camera: n } = iA.cubeRender; n.position.copy(g); const o = /* @__PURE__ */ new Map(); for (const c of i) o.set(c, c.visible), c.visible = !1; this.prepareViewpoint(this.envViewpoint), n.update(A ?? this.renderer, e), this.prepareViewpoint(this.defaultView); for (const [c, h] of o.entries()) c.visible = h; return (l = iA.pmrem) == null ? void 0 : l.fromCubemap(E.texture).texture; } // Utility function to recursively set the envMap property for any // THREE.MeshStandardMaterial within the subtree of root. recurseSetEnvMap(A, e) { A.traverse((g) => { if (g instanceof a.Mesh) if (Array.isArray(g.material)) for (const I of g.material) I instanceof a.MeshStandardMaterial && (I.envMap = e); else g.material instanceof a.MeshStandardMaterial && (g.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 g = this.active.mapping.find(({ node: I }) => I === A); if (!g) throw new Error("Generator not found"); return e = e ?? new be(), e.fromPackedSplats({ packedSplats: this.active.splats, base: g.base, count: g.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(); } }; iA.cubeRender = null, iA.pmrem = null, iA.EMPTY_SPLAT_TEXTURE = new a.Data3DTexture(); let re = iA; const rg = new Te(new Uint32Array(1), 0); GA( { packedSplats: _t, index: "int" }, { gsplat: W }, ({ packedSplats: t, index: A }) => { if (!t || !A) throw new Error("Invalid input"); return { gsplat: Ht(t, A) }; } ); function xo(t) { if (t.length === 0) return null; const A = new a.Vector3(), e = new a.Quaternion(), g = new a.Vector3(), I = [], s = []; for (const B of t) B.decompose(A, e, g), I.push(A), s.push(e); return new a.Matrix4().compose( YI(I), LI(s), new a.Vector3(1, 1, 1) ); } function Ro(t, A, e) { const g = Math.floor(t.length / 32); if (g * 32 !== t.length) throw new Error("Invalid .splat file size"); const I = new Float32Array(t.buffer); for (let s = 0; s < g; ++s) { const B = s * 32, i = s * 8, Q = I[i + 0], C = I[i + 1], E = I[i + 2], n = I[i + 3], o = I[i + 4], r = I[i + 5], l = t[B + 24] / 255, c = t[B + 25] / 255, h = t[B + 26] / 255, u = t[B + 27] / 255, D = (t[B + 28] - 128) / 128, w = (t[B + 29] - 128) / 128, y = (t[B + 30] - 128) / 128, f = (t[B + 31] - 128) / 128; e( s, Q, C, E, n, o, r, w, y, f, D, u, l, c, h ); } } const cg = { 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 } }, Uo = { 0: 0, 1: 9, 2: 24, 3: 45 }; function Yo(t, A, e, g) { var c; let B = 0; const i = new DataView(t.buffer, B, 4096); B += 4096; const Q = i.getUint8(0), C = i.getUint8(1); if (Q !== 0 || C < 1) throw new Error( `Unsupported .ksplat version: ${Q}.${C}` ); const E = i.getUint32(4, !0); i.getUint32(16, !0); const n = i.getUint16(20, !0); if (n < 0 || n > 2) throw new Error(`Invalid .ksplat compression level: ${n}`); const o = i.getFloat32(36, !0) || -1.5, r = i.getFloat32(40, !0) || 1.5; let l = 4096 + E * 1024; for (let h = 0; h < E; ++h) { let u = function(NA, T) { if (n === 0) return v.getFloat32( NA + j + T * 4, !0 ); if (n === 1) return pA( v.getUint16( NA + j + T * 2, !0 ) ); const ZA = v.getUint8(NA + j + T) / 255; return o + ZA * (r - o); }; const D = new DataView(t.buffer, B, 1024); B += 1024; const w = D.getUint32(0, !0), y = D.getUint32(4, !0), f = D.getUint32(8, !0), N = D.getUint32(12, !0), M = D.getFloat32(16, !0), d = D.getUint16(20, !0), p = (D.getUint32(24, !0) || ((c = cg[n]) == null ? void 0 : c.scaleRange)) ?? 1, R = D.getUint32(32, !0), S = R * f, m = D.getUint32(36, !0), Y = m * 4, G = d * N + Y, k = D.getUint16(40, !0), U = Uo[k], { bytesPerCenter: J, bytesPerScale: AA, bytesPerRotation: z, bytesPerColor: eA, bytesPerSphericalHarmonicsComponent: tA, scaleOffsetBytes: _, rotationOffsetBytes: b, colorOffsetBytes: X, sphericalHarmonicsOffsetBytes: j } = cg[n], O = J + AA + z + eA + U * tA, L = O * y, uA = L + G, nA = [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 ], DA = [ 24, 31, 38, 25, 32, 39, 26, 33, 40, 27, 34, 41, 28, 35, 42, 29, 36, 43, 30, 37, 44 ], MA = k >= 1 ? new Float32Array(3 * 3) : void 0, rA = k >= 2 ? new Float32Array(5 * 3) : void 0, YA = k >= 3 ? new Float32Array(7 * 3) : void 0, mA = M / 2 / p, OA = l + Y, PA = l + G, v = new DataView( t.buffer, PA, L ), lA = new Float32Array( t.buffer, OA, N * 3 ), VA = new Uint32Array( t.buffer, l, m ); let Rt = R, Pt = S; for (let NA = 0; NA < w; ++NA) { const T = NA * O; let ZA; if (NA < S) ZA = Math.floor(NA / f); else { const WA = VA[Rt - R]; NA >= Pt + WA && (Rt += 1, Pt += WA), ZA = Rt; } const we = n === 0 ? v.getFloat32(T + 0, !0) : (v.getUint16(T + 0, !0) - p) * mA + lA[3 * ZA + 0], De = n === 0 ? v.getFloat32(T + 4, !0) : (v.getUint16(T + 2, !0) - p) * mA + lA[3 * ZA + 1], ye = n === 0 ? v.getFloat32(T + 8, !0) : (v.getUint16(T + 4, !0) - p) * mA + lA[3 * ZA + 2], pe = n === 0 ? v.getFloat32(T + _ + 0, !0) : pA(v.getUint16(T + _ + 0, !0)), fe = n === 0 ? v.getFloat32(T + _ + 4, !0) : pA(v.getUint16(T + _ + 2, !0)), Wi = n === 0 ? v.getFloat32(T + _ + 8, !0) : pA(v.getUint16(T + _ + 4, !0)), $i = n === 0 ? v.getFloat32(T + b + 0, !0) : pA( v.getUint16(T + b + 0, !0) ), AQ = n === 0 ? v.getFloat32(T + b + 4, !0) : pA( v.getUint16(T + b + 2, !0) ), tQ = n === 0 ? v.getFloat32(T + b + 8, !0) : pA( v.getUint16(T + b + 4, !0) ), eQ = n === 0 ? v.getFloat32(T + b + 12, !0) : pA( v.getUint16(T + b + 6, !0) ), gQ = v.getUint8(T + X + 0) / 255, IQ = v.getUint8(T + X + 1) / 255, sQ = v.getUint8(T + X + 2) / 255, BQ = v.getUint8(T + X + 3) / 255; if (e( NA, we, De, ye, pe, fe, Wi, AQ, tQ, eQ, $i, BQ, gQ, IQ, sQ ), k >= 1 && MA) { for (const [WA, Ut] of nA.entries()) MA[WA] = u(T, Ut); if (rA) for (const [WA, Ut] of wA.entries()) rA[WA] = u(T, Ut); if (YA) for (const [WA, Ut] of DA.entries()) YA[WA] = u(T, Ut); g == null || g(NA, MA, rA, YA); } } l += uA; } } class Lo { constructor({ fileBytes: A }) { this.fileBytes = A instanceof ArrayBuffer ? new Uint8Array(A) : A, this.reader = new HI({ 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, g, I, s, B) { if (this.parsed) throw new Error("SPZ file already parsed"); if (this.parsed = !0, this.version === 1) { const i = this.reader.read(this.numSplats * 3 * 2), Q = new Uint16Array(i.buffer); for (let C = 0; C < this.numSplats; C++) { const E = C * 3, n = pA(Q[E]), o = pA(Q[E + 1]), r = pA(Q[E + 2]); A == null || A(C, n, o, r); } } else if (this.version === 2) { const i = 1 << this.fractionalBits, Q = this.reader.read(this.numSplats * 3 * 3); for (let C = 0; C < this.numSplats; C++) { const E = C * 9, n = ((Q[E + 2] << 24 | Q[E + 1] << 16 | Q[E] << 8) >> 8) / i, o = ((Q[E + 5] << 24 | Q[E + 4] << 16 | Q[E + 3] << 8) >> 8) / i, r = ((Q[E + 8] << 24 | Q[E + 7] << 16 | Q[E + 6] << 8) >> 8) / i; A == null || A(C, n, o, r); } } else throw new Error("Unreachable"); { const i = this.reader.read(this.numSplats); for (let Q = 0; Q < this.numSplats; Q++) e == null || e(Q, i[Q] / 255); } { const i = this.reader.read(this.numSplats * 3), Q = Vi / 0.15; for (let C = 0; C < this.numSplats; C++) { const E = C * 3, n = (i[E] / 255 - 0.5) * Q + 0.5, o = (i[E + 1] / 255 - 0.5) * Q + 0.5, r = (i[E + 2] / 255 - 0.5) * Q + 0.5; g == null || g(C, n, o, r); } } { const i = this.reader.read(this.numSplats * 3); for (let Q = 0; Q < this.numSplats; Q++) { const C = Q * 3, E = Math.exp(i[C] / 16 - 10), n = Math.exp(i[C + 1] / 16 - 10), o = Math.exp(i[C + 2] / 16 - 10); I == null || I(Q, E, n, o); } } { const i = this.reader.read(this.numSplats * 3); for (let Q = 0; Q < this.numSplats; Q++) { const C = Q * 3, E = i[C] / 127.5 - 1, n = i[C + 1] / 127.5 - 1, o = i[C + 2] / 127.5 - 1, r = Math.sqrt( Math.max(0, 1 - E * E - n * n - o * o) ); s == null || s(Q, E, n, o, r); } } if (B && this.shDegree >= 1) { const i = new Float32Array(9), Q = this.shDegree >= 2 ? new Float32Array(5 * 3) : void 0, C = this.shDegree >= 3 ? new Float32Array(7 * 3) : void 0, E = this.reader.read( this.numSplats * zi[this.shDegree] * 3 ); let n = 0; for (let o = 0; o < this.numSplats; o++) { for (let r = 0; r < 9; ++r) i[r] = (E[n + r] - 128) / 128; if (n += 9, Q) { for (let r = 0; r < 15; ++r) Q[r] = (E[n + r] - 128) / 128; n += 15; } if (C) { for (let r = 0; r < 21; ++r) C[r] = (E[n + r] - 128) / 128; n += 21; } B == null || B(o, i, Q, C); } } } } const zi = { 1: 3, 2: 8, 3: 15 }, Vi = 0.28209479177387814, Jo = 1347635022, vo = 2, bo = 1; class tt { constructor({ numSplats: A, shDegree: e, fractionalBits: g = 12, flagAntiAlias: I = !0 }) { this.clippedCount = 0; const s = 19 + (e >= 1 ? 9 : 0) + (e >= 2 ? 15 : 0) + (e >= 3 ? 21 : 0), B = 16 + A * s; this.buffer = new ArrayBuffer(B), this.view = new DataView(this.buffer), this.view.setUint32(0, Jo, !0), this.view.setUint32(4, vo, !0), this.view.setUint32(8, A, !0), this.view.setUint8(12, e), this.view.setUint8(13, g), this.view.setUint8(14, I ? bo : 0), this.view.setUint8(15, 0), this.numSplats = A, this.shDegree = e, this.fractionalBits = g, this.fraction = 1 << g, this.flagAntiAlias = I; } setCenter(A, e, g, I) { const s = Math.round(e * this.fraction), B = Math.max(-8388607, Math.min(8388607, s)), i = Math.round(g * this.fraction), Q = Math.max(-8388607, Math.min(8388607, i)), C = Math.round(I * this.fraction), E = Math.max(-8388607, Math.min(8388607, C)); (s !== B || i !== Q || C !== E) && (this.clippedCount += 1); const r = 16 + A * 9; this.view.setUint8(r, B & 255), this.view.setUint8(r + 1, B >> 8 & 255), this.view.setUint8(r + 2, B >> 16 & 255), this.view.setUint8(r + 3, Q & 255), this.view.setUint8(r + 4, Q >> 8 & 255), this.view.setUint8(r + 5, Q >> 16 & 255), this.view.setUint8(r + 6, E & 255), this.view.setUint8(r + 7, E >> 8 & 255), this.view.setUint8(r + 8, E >> 16 & 255); } setAlpha(A, e) { const g = 16 + this.numSplats * 9 + A; this.view.setUint8( g, Math.max(0, Math.min(255, Math.round(e * 255))) ); } static scaleRgb(A) { const e = ((A - 0.5) / (Vi / 0.15) + 0.5) * 255; return Math.max(0, Math.min(255, Math.round(e))); } setRgb(A, e, g, I) { const s = 16 + this.numSplats * 10 + A * 3; this.view.setUint8(s, tt.scaleRgb(e)), this.view.setUint8(s + 1, tt.scaleRgb(g)), this.view.setUint8(s + 2, tt.scaleRgb(I)); } setScale(A, e, g, I) { const s = 16 + this.numSplats * 13 + A * 3; this.view.setUint8( s, Math.max(0, Math.min(255, Math.round((Math.log(e) + 10) * 16))) ), this.view.setUint8( s + 1, Math.max(0, Math.min(255, Math.round((Math.log(g) + 10) * 16))) ), this.view.setUint8( s + 2, Math.max(0, Math.min(255, Math.round((Math.log(I) + 10) * 16))) ); } setQuat(A, e, g, I, s) { const B = 16 + this.numSplats * 16 + A * 3, i = s < 0; this.view.setUint8( B, Math.max( 0, Math.min(255, Math.round(((i ? -e : e) + 1) * 127.5)) ) ), this.view.setUint8( B + 1, Math.max( 0, Math.min(255, Math.round(((i ? -g : g) + 1) * 127.5)) ) ), this.view.setUint8( B + 2, Math.max( 0, Math.min(255, Math.round(((i ? -I : I) + 1) * 127.5)) ) ); } static quantizeSh(A, e) { const g = Math.round(A * 128) + 128, I = 1 << 8 - e, s = Math.floor((g + I / 2) / I) * I; return Math.max(0, Math.min(255, s)); } setSh(A, e, g, I) { const s = zi[this.shDegree] || 0, B = 16 + this.numSplats * 19 + A * s * 3; for (let i = 0; i < 9; ++i) this.view.setUint8(B + i, tt.quantizeSh(e[i], 5)); if (g) { const i = B + 9; for (let Q = 0; Q < 15; ++Q) this.view.setUint8(i + Q, tt.quantizeSh(g[Q], 4)); if (I) { const Q = i + 15; for (let C = 0; C < 21; ++C) this.view.setUint8(Q + C, tt.quantizeSh(I[C], 4)); } } } async finalize() { const A = new Uint8Array(this.buffer), g = new ReadableStream({ async start(B) { B.enqueue(A), B.close(); } }).pipeThrough(new CompressionStream("gzip")), s = await new Response(g).arrayBuffer(); return console.log( "Compressed", A.length, "bytes to", s.byteLength, "bytes" ), new Uint8Array(s); } } async function pr(t) { var E, n, o; const A = new Do(), { inputs: e, clipXyz: g, maxSh: I, fractionalBits: s = 12, opacityThreshold: B } = t; for (const r 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 !N || N.containsPoint(d); }, D = function(d) { return B !== void 0 ? d >= B : !0; }; const w = ((E = r.transform) == null ? void 0 : E.scale) ?? 1, y = new a.Quaternion().fromArray( ((n = r.transform) == null ? void 0 : n.quaternion) ?? [0, 0, 0, 1] ), f = new a.Vector3().fromArray( ((o = r.transform) == null ? void 0 : o.translate) ?? [0, 0, 0] ), N = g ? new a.Box3( new a.Vector3().fromArray(g.min), new a.Vector3().fromArray(g.max) ) : void 0; let M = r.fileType; switch (M || (M = bi(r.fileBytes), !M && r.pathOrUrl && (M = Ti(r.pathOrUrl))), M) { case Jt.PLY: { const d = new Ee({ fileBytes: r.fileBytes }); await d.parseHeader(); let p = null; d.parseSplats( (R, S, m, Y, G, k, U, J, AA, z, eA, tA, _, b, X) => { const j = l(new a.Vector3(S, m, Y)); if (u(j) && D(tA)) { p = A.pushSplat(), A.setCenter(p, j.x, j.y, j.z); const O = c( new a.Vector3(G, k, U) ); A.setScale(p, O.x, O.y, O.z); const L = h( new a.Quaternion(J, AA, z, eA) ); A.setQuaternion( p, L.x, L.y, L.z, L.w ), A.setOpacity(p, tA), A.setColor(p, _, b, X); } else p = null; }, (R, S, m, Y) => { S && p !== null && A.setSh1(p, S), m && p !== null && A.setSh2(p, m), Y && p !== null && A.setSh3(p, Y); } ); break; } case Jt.SPZ: { const d = new Lo({ fileBytes: r.fileBytes }), p = new Int32Array(d.numSplats); p.fill(-1); const R = new Float32Array(d.numSplats * 3), S = new a.Vector3(); d.parseSplats( (m, Y, G, k) => { const U = l(new a.Vector3(Y, G, k)); R[m * 3] = U.x, R[m * 3 + 1] = U.y, R[m * 3 + 2] = U.z; }, (m, Y) => { S.fromArray(R, m * 3), u(S) && D(Y) && (p[m] = A.pushSplat(), A.setCenter(p[m], S.x, S.y, S.z), A.setOpacity(p[m], Y)); }, (m, Y, G, k) => { p[m] >= 0 && A.setColor(p[m], Y, G, k); }, (m, Y, G, k) => { if (p[m] >= 0) { const U = c( new a.Vector3(Y, G, k) ); A.setScale(p[m], U.x, U.y, U.z); } }, (m, Y, G, k, U) => { if (p[m] >= 0) { const J = h( new a.Quaternion(Y, G, k, U) ); A.setQuaternion( p[m], J.x, J.y, J.z, J.w ); } }, (m, Y, G, k) => { p[m] >= 0 && (A.setSh1(p[m], Y), G && A.setSh2(p[m], G), k && A.setSh3(p[m], k)); } ); break; } case Jt.SPLAT: Ro( r.fileBytes, (d) => { }, (d, p, R, S, m, Y, G, k, U, J, AA, z, eA, tA, _) => { const b = l(new a.Vector3(p, R, S)); if (u(b) && D(z)) { const X = A.pushSplat(); A.setCenter(X, b.x, b.y, b.z); const j = c( new a.Vector3(m, Y, G) ); A.setScale(X, j.x, j.y, j.z); const O = h( new a.Quaternion(k, U, J, AA) ); A.setQuaternion( X, O.x, O.y, O.z, O.w ), A.setOpacity(X, z), A.setColor(X, eA, tA, _); } } ); break; case Jt.KSPLAT: { let d = null; Yo( r.fileBytes, (p) => { }, (p, R, S, m, Y, G, k, U, J, AA, z, eA, tA, _, b) => { const X = l(new a.Vector3(R, S, m)); if (u(X) && D(eA)) { d = A.pushSplat(), A.setCenter(d, X.x, X.y, X.z); const j = c( new a.Vector3(Y, G, k) ); A.setScale(d, j.x, j.y, j.z); const O = h( new a.Quaternion(U, J, AA, z) ); A.setQuaternion( d, O.x, O.y, O.z, O.w ), A.setOpacity(d, eA), A.setColor(d, tA, _, b); } else d = null; }, (p, R, S, m) => { d !== null && (A.setSh1(d, R), S && A.setSh2(d, S), m && A.setSh3(d, m)); } ); break; } default: throw new Error(`transcodeSpz not implemented for ${M}`); } } const i = Math.min( I ?? 3, A.sh3 ? 3 : A.sh2 ? 2 : A.sh1 ? 1 : 0 ), Q = new tt({ numSplats: A.numSplats, shDegree: i, fractionalBits: s, flagAntiAlias: !0 }); for (let r = 0; r < A.numSplats; ++r) { const l = r * 3, c = r * 4; Q.setCenter( r, A.centers[l], A.centers[l + 1], A.centers[l + 2] ), Q.setScale( r, A.scales[l], A.scales[l + 1], A.scales[l + 2] ), Q.setQuat( r, A.quaternions[c], A.quaternions[c + 1], A.quaternions[c + 2], A.quaternions[c + 3] ), Q.setAlpha(r, A.opacities[r]), Q.setRgb( r, A.colors[l], A.colors[l + 1], A.colors[l + 2] ), A.sh1 && i >= 1 && Q.setSh( r, A.sh1.slice(r * 9, (r + 1) * 9), i >= 2 && A.sh2 ? A.sh2.slice(r * 15, (r + 1) * 15) : void 0, i >= 3 && A.sh3 ? A.sh3.slice(r * 21, (r + 1) * 21) : void 0 ); } return { fileBytes: await Q.finalize(), clippedCount: Q.clippedCount }; } class fr { constructor(A) { this.mesh = A.mesh, this.numSplats = A.numSplats ?? this.mesh.numSplats; const { width: e, height: g, depth: I, maxSplats: s } = dA(this.numSplats); this.skinData = new Uint16Array(s * 4), this.skinTexture = new a.DataArrayTexture( this.skinData, e, g, I ), this.skinTexture.format = a.RGBAIntegerFormat, this.skinTexture.type = a.UnsignedShortType, this.skinTexture.internalFormat = "RGBA16UI", this.skinTexture.needsUpdate = !0, this.numBones = A.numBones ?? 256, this.boneData = new Float32Array(this.numBones * 16), this.boneTexture = new a.DataTexture( this.boneData, 4, this.numBones, a.RGBAFormat, a.FloatType ), this.boneTexture.internalFormat = "RGBA32F", this.boneTexture.needsUpdate = !0, this.uniform = new x({ key: "skinning", type: Zi, globals: () => [ji], 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 Ho(A, this.uniform); } // Set the "rest" pose for a bone with position and quaternion orientation. setRestQuatPos(A, e, g) { 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] = g.x, this.boneData[I + 5] = g.y, this.boneData[I + 6] = g.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, g) { const I = A * 16, s = new a.Quaternion( this.boneData[I + 0], this.boneData[I + 1], this.boneData[I + 2], this.boneData[I + 3] ), B = new a.Vector3( this.boneData[I + 4], this.boneData[I + 5], this.boneData[I + 6] ), i = s.clone().invert(), Q = g.clone().sub(B); Q.applyQuaternion(i), i.multiply(e); const C = new a.Quaternion( Q.x, Q.y, Q.z, 0 ).multiply(s); this.boneData[I + 8] = i.x, this.boneData[I + 9] = i.y, this.boneData[I + 10] = i.z, this.boneData[I + 11] = i.w, this.boneData[I + 12] = 0.5 * C.x, this.boneData[I + 13] = 0.5 * C.y, this.boneData[I + 14] = 0.5 * C.z, this.boneData[I + 15] = 0.5 * C.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, g) { const I = A * 4; this.skinData[I + 0] = Math.min(255, Math.max(0, Math.round(g.x * 255))) + (e.x << 8), this.skinData[I + 1] = Math.min(255, Math.max(0, Math.round(g.y * 255))) + (e.y << 8), this.skinData[I + 2] = Math.min(255, Math.max(0, Math.round(g.z * 255))) + (e.z << 8), this.skinData[I + 3] = Math.min(255, Math.max(0, Math.round(g.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 Zi = { type: "GsplatSkinning" }, ji = oA(` struct GsplatSkinning { int numSplats; int numBones; usampler2DArray skinTexture; sampler2D boneTexture; }; `), To = oA(` 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 Ho(t, A) { return new Z({ inTypes: { gsplat: W, skinning: Zi }, outTypes: { gsplat: W }, globals: () => [ji, To], inputs: { gsplat: t, skinning: A }, statements: ({ inputs: g, outputs: I }) => { const { skinning: s } = g, { gsplat: B } = I; return UA(` ${B} = ${g.gsplat}; if (isGsplatActive(${B}.flags)) { applyGsplatSkinning( ${s}.numSplats, ${s}.numBones, ${s}.skinTexture, ${s}.boneTexture, ${B}.index, ${B}.center, ${B}.quaternion ); } `); } }).outputs.gsplat; } function dr({ // 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: g = 0.01, // relative size of the "shadow copy" of each Gsplat placed behind it pointShadowScale: I = 2, // Gsplat opacity opacity: s = 1, // Gsplat color (THREE.Color) or function to set color for position: // ((THREE.Color, THREE.Vector3) => void) (default: RGB-modulated grid) color: B }) { const Q = new a.Vector3(), C = new a.Vector3(), E = new a.Quaternion(0, 0, 0, 1); B == null && (B = (o, r) => o.set( 0.55 + 0.45 * Math.cos(r.x * 1), 0.55 + 0.45 * Math.cos(r.y * 1), 0.55 + 0.45 * Math.cos(r.z * 1) )); const n = new a.Color(); for (let o = A.min.z; o < A.max.z + 1e-6; o += e) for (let r = A.min.y; r < A.max.y + 1e-6; r += e) for (let l = A.min.x; l < A.max.x + 1e-6; l += e) { Q.set(l, r, o); for (let c = 0; c < 2; ++c) C.setScalar(g * (c ? 1 : I)), c ? typeof B == "function" ? B(n, Q) : n.copy(B) : n.setScalar(0), t.pushSplat(Q, C, E, s, n); } } function Mr({ // 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: g = 2, // origins of the axes (default single axis at origin) origins: I = [new a.Vector3()] }) { const s = new a.Vector3(), B = new a.Vector3(), i = new a.Quaternion(0, 0, 0, 1), Q = new a.Color(), C = 1; for (const E of I) for (let n = 0; n < 3; ++n) { s.set( E.x + (n === 0 ? A : 0), E.y + (n === 1 ? A : 0), E.z + (n === 2 ? A : 0) ); for (let o = 0; o < 2; ++o) B.set( (n === 0 ? A : e) * (o ? 1 : g), (n === 1 ? A : e) * (o ? 1 : g), (n === 2 ? A : e) * (o ? 1 : g) ), Q.setRGB( o === 0 ? 0 : n === 0 ? 1 : 0, o === 0 ? 0 : n === 1 ? 1 : 0, o === 0 ? 0 : n === 2 ? 1 : 0 ), t.pushSplat(s, B, i, C, Q); } } function mr({ // PackedSplats object to add splats to splats: t, // center of the sphere (default: origin) origin: A = new a.Vector3(), // radius of the sphere radius: e = 1, // maximum depth of recursion for subdividing the sphere // Warning: Gsplat count grows exponentially with depth maxDepth: g = 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: s = 0.02, // flatness of each oriented Gsplat pointThickness: B = 1e-3, // color of each Gsplat (THREE.Color) or function to set color for point: // ((THREE.Color, THREE.Vector3) => void) (default: white) color: i = new a.Color(1, 1, 1) }) { const Q = {}; function C(c) { if (I && !I(c)) return; const h = `${c.x},${c.y},${c.z}`; Q[h] || (Q[h] = c); } function E(c, h, u, D) { if (C(h), C(u), C(D), c >= g) return; const w = new a.Vector3().addVectors(h, u).normalize(), y = new a.Vector3().addVectors(u, D).normalize(), f = new a.Vector3().addVectors(D, h).normalize(); E(c + 1, h, w, f), E(c + 1, w, u, y), E(c + 1, f, y, D), E(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 a.Vector3(c, 0, 0), w = new a.Vector3(0, h, 0), y = new a.Vector3(0, 0, u); E(0, D, w, y); } const n = Object.values(Q), o = new a.Vector3(s, s, B), r = new a.Quaternion(), l = typeof i == "function" ? new a.Color() : i; for (const c of n) r.setFromUnitVectors(new a.Vector3(0, 0, -1), c), typeof i == "function" && i(l, c), c.multiplyScalar(e), c.add(A), t.pushSplat(c, o, r, 1, l); } function Nr({ // 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: g, // Individual Gsplat color (default: white) rgb: I, // Gsplat radius (default: 0.8 covers 1-unit spacing well) dotRadius: s, // text alignment: "left", "center", "right", "start", "end" (default: "start") textAlign: B, // line spacing multiplier, lines delimited by "\n" (default: 1.0) lineHeight: i, // Coordinate scale in object-space (default: 1.0) objectScale: Q }) { A = A ?? "Arial", e = e ?? 32, g = g ?? new a.Color(1, 1, 1), s = s ?? 0.8, B = B ?? "start", i = i ?? 1, Q = Q ?? 1; const C = t.split(` `), E = document.createElement("canvas"), n = E.getContext("2d"); if (!n) throw new Error("Failed to create canvas context"); n.font = `${e}px ${A}`, n.textAlign = B; const o = n.measureText(""), r = o.fontBoundingBoxAscent + o.fontBoundingBoxDescent; let l = Number.POSITIVE_INFINITY, c = Number.NEGATIVE_INFINITY, h = Number.POSITIVE_INFINITY, u = Number.NEGATIVE_INFINITY; for (let G = 0; G < C.length; ++G) { const k = n.measureText(C[G]), U = r * i * G; 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; E.width = y, E.height = f, n.font = `${e}px ${A}`, n.textAlign = B, n.textBaseline = "alphabetic", n.fillStyle = "#FFFFFF"; for (let G = 0; G < C.length; ++G) { const k = r * i * G - w; n.fillText(C[G], -D, k); } const N = n.getImageData(0, 0, y, f), M = new Uint8Array(N.data.buffer), d = new qA(), p = new a.Vector3(), R = new a.Vector3().setScalar(s * Q), S = new a.Quaternion(0, 0, 0, 1); I = I ?? new a.Color(1, 1, 1); let m = 0; for (let G = 0; G < f; ++G) for (let k = 0; k < y; ++k) { const U = M[m + 3]; if (U > 0) { const J = U / 255; p.set(k - 0.5 * (y - 1), 0.5 * (f - 1) - G, 0), p.multiplyScalar(Q), d.pushSplat(p, R, S, J, I); } m += 4; } const Y = new XA({ packedSplats: d }); return Y.recolor = g, Y; } function Sr({ // 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: g }) { return A = A ?? 0.8, e = Math.max(1, Math.floor(e ?? 1)), new XA({ constructSplats: async (I) => new Promise((s, B) => { const i = new Image(); i.crossOrigin = "anonymous", i.onerror = B, i.onload = () => { const { width: Q, height: C } = i, E = document.createElement("canvas"); E.width = Q, E.height = C; const n = E.getContext("2d"); if (!n) { B(new Error("Failed to create canvas context")); return; } n.imageSmoothingEnabled = !0, n.imageSmoothingQuality = "high"; const o = Math.round(Q / e), r = Math.round(C / e); n.drawImage(i, 0, 0, o, r); try { const l = n.getImageData(0, 0, o, r), c = new Uint8Array(l.data.buffer), h = new a.Vector3(), u = new a.Vector3().setScalar(A), D = new a.Quaternion(0, 0, 0, 1), w = new a.Color(); let y = 0; for (let f = 0; f < r; ++f) for (let N = 0; N < o; ++N) { const M = y * 4, d = c[M + 3]; if (d > 0) { let p = d / 255; w.set( c[M + 0] / 255, c[M + 1] / 255, c[M + 2] / 255 ), h.set( N - 0.5 * (o - 1), 0.5 * (r - 1) - f, 0 ), u.setScalar(A), D.set(0, 0, 0, 1); let R = !0; if (g) { const S = g( o, r, y, h, u, D, p, w ); p = S ?? p, R = S !== null; } R && I.pushSplat(h, u, D, p, w); } y += 1; } s(); } catch (l) { B(l); } }, i.src = t; }) }); } function Ko({ box: t, cells: A, dotScale: e, color: g, 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 s = A.x * A.y * A.z, B = K("int", A.x), i = K("int", A.y); K("int", A.z); const Q = bA(0), C = new qt({ numSplats: s, generator: GA( { index: "int" }, { gsplat: W }, ({ index: n }) => { if (!n) throw new Error("index is undefined"); const o = Le(n, B), r = Ie(n, B), l = Le(r, i), c = Ie(r, i), h = KA({ vectorType: "ivec3", x: o, y: l, z: c }), u = qs(Q), D = KA({ vectorType: "ivec2", x: n, y: u }), w = jB(D), y = K("vec3", t.min), f = K("vec3", t.max), N = Ft(f, y), M = Ie(fA(ct(h), w), K("vec3", A)); let d, p, R; g ? (d = K("float", g.r), p = K("float", g.g), R = K("float", g.b)) : { r: d, g: p, b: R } = Nt(M).outputs; const S = KA({ vectorType: "vec4", r: d, g: p, b: R, a: K("float", I) }), m = fA(y, EA(N, M)), Y = ct(K("float", e)), G = K("vec4", new a.Quaternion(0, 0, 0, 1)); let k = Bt({ flags: Be("uint", "GSPLAT_FLAG_ACTIVE"), index: n, center: m, scales: Y, quaternion: G, rgba: S }); return k = E.applyGsplat(k), { gsplat: k }; }, { globals: () => [SA] } ), update: ({ time: n }) => { Q.value = n, E.update(C), C.updateVersion(); } }), E = new pt(); return C; } const qo = { box: new a.Box3( new a.Vector3(-1, -1, -1), new a.Vector3(1, 1, 1) ), density: 100, fallDirection: new a.Vector3(-1, -3, 1).normalize(), fallVelocity: 0.02, wanderScale: 0.04, wanderVariance: 2, color1: new a.Color(1, 1, 1), color2: new a.Color(0.5, 0.5, 1), minScale: 1e-3, maxScale: 5e-3, anisoScale: new a.Vector3(1, 1, 1) }, zo = { box: new a.Box3( new a.Vector3(-2, -1, -2), new a.Vector3(2, 5, 2) ), density: 10, fallDirection: new a.Vector3(0, -1, 0), fallVelocity: 2, wanderScale: 0.1, wanderVariance: 1, color1: new a.Color(1, 1, 1), color2: new a.Color(0.25, 0.25, 0.5), minScale: 5e-3, maxScale: 0.01, anisoScale: new a.Vector3(0.1, 1, 0.1) }; function Vo({ // 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: g, // 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: s, // Maximum Gsplat particle scale (default: 0.005) maxScale: B, // The average direction of fall (default: (0, -1, 0)) fallDirection: i, // The average speed of the fall (multiplied with fallDirection) (default: 0.02) fallVelocity: Q, // The world scale of wandering overlay motion (default: 0.01) wanderScale: C, // Controls how uniformly the particles wander in sync, more variance mean // more randomness in the motion (default: 2) wanderVariance: E, // Color 1 of the two colors interpolated between (default: (1, 1, 1)) color1: n, // Color 2 of the two colors interpolated between (default: (0.5, 0.5, 1)) color2: o, // The base opacity of the Gsplats (default: 1) opacity: r, // Optional callback function to call each frame. onFrame: l }) { t = t ?? new a.Box3(new a.Vector3(-1, -1, -1), new a.Vector3(1, 1, 1)); const c = (t.max.x - t.min.x) * (t.max.y - t.min.y) * (t.max.z - t.min.z); g = g ?? 100, e = e ?? Math.max(1, Math.min(1e6, Math.round(c * g))); const h = bA(s ?? 1e-3), u = bA(B ?? 5e-3), D = At( ((I == null ? void 0 : I.clone()) ?? new a.Vector3(1, 1, 1)).normalize() ), w = At( (i ?? new a.Vector3(0, -1, 0)).normalize() ), y = bA(Q ?? 0.02), f = bA(C ?? 0.01), N = bA(E ?? 2), M = At(n ?? new a.Color(1, 1, 1)), d = At(o ?? new a.Color(0.5, 0.5, 1)), p = bA(r ?? 1), R = bA(0), S = At(new a.Vector3(0, 0, 0)), m = At(t.min), Y = At(t.max), G = bA(A ?? Number.NEGATIVE_INFINITY), k = Ft(Y, m), U = new qt({ numSplats: e, generator: GA( { index: "int" }, { gsplat: W }, ({ index: AA }) => { if (!AA) throw new Error("index not defined"); const z = Je(AA), eA = Nt(z).outputs.w; let tA = ct(z), _ = se(EA(eA, K("float", 100))); _ = ve(EA(Be("float", "PI"), _)), _ = fA(h, EA(_, Ft(u, h))); const b = EA(_, D), X = se(EA(eA, K("float", 10))), j = se(eA), O = ZI(M, d, j), L = EA(O, X), uA = Je( KA({ vectorType: "ivec2", x: AA, y: K("int", 6837) }) ); let nA = ct(uA), wA = EA(Nt(uA).outputs.w, N); wA = fA(R, wA), tA = fA(tA, S); const DA = zI( tA, K("vec3", new a.Vector3(1, 1, 1)) ); tA = fA(m, EA(k, DA)); const MA = K("vec4", new a.Quaternion(0, 0, 0, 1)); nA = ve(fA(ct(wA), nA)), nA = EA(nA, f); let rA = fA(tA, nA), YA = Nt(rA).outputs.y; YA = VI(G, YA), rA = KA({ vector: rA, y: YA }); let mA = Bt({ flags: Be("uint", "GSPLAT_FLAG_ACTIVE"), index: AA, center: rA, scales: b, quaternion: MA, rgb: L, opacity: p }); return mA = J.applyGsplat(mA), { gsplat: mA }; }, { globals: () => [SA] } ), update: ({ object: AA, time: z, deltaTime: eA }) => { R.value = z, J.update(U); const tA = w.value.clone().multiplyScalar(y.value * eA); S.value.add(tA), AA.visible = p.value > 0, l == null || l({ object: AA, time: z, deltaTime: eA }), U.updateVersion(); } }), J = new pt(); return { snow: U, min: m, max: Y, minY: G, color1: M, color2: d, opacity: p, fallVelocity: y, wanderVariance: N, wanderScale: f, fallDirection: w, minScale: h, maxScale: u, anisoScale: D }; } const Fr = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, DEFAULT_RAIN: zo, DEFAULT_SNOW: qo, snowBox: Vo, staticBox: Ko }, Symbol.toStringTag, { value: "Module" })); function _i(t) { return GA({ gsplat: W }, { gsplat: W }, ({ gsplat: A }) => { if (!A) throw new Error("No gsplat input"); let e = Re(A); const g = t.applyGsplat(A), I = at(g).outputs.center, s = Re(g), B = pB(I, s), i = ds(B, K("float", 0)); e = $e(i, We(e), e); const Q = fA( EA(e, K("float", 0.5)), K("float", 0.5) ); return A = Bt({ gsplat: A, rgb: Q }), { gsplat: A }; }); } function Zo(t) { t.enableWorldToView = !0, t.worldModifier = _i(t.context.worldToView), t.updateGenerator(); } function Xi(t, A, e, g) { return GA({ gsplat: W }, { gsplat: W }, ({ gsplat: I }) => { if (!I) throw new Error("No gsplat input"); let { center: s } = at(I).outputs; s = t.apply(s); const { z: B } = Nt(s).outputs; let i = _B(We(B), A, e); return i = $e(g, Ft(K("float", 1), i), i), I = Bt({ gsplat: I, r: i, g: i, b: i }), { gsplat: I }; }); } function jo(t, A, e, g) { t.enableWorldToView = !0; const I = K("float", A), s = K("float", e), B = K("bool", g ?? !1); return t.worldModifier = Xi( t.context.worldToView, I, s, B ), t.updateGenerator(), { minDepth: I, maxDepth: s, reverse: B }; } const Gr = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, makeDepthColorModifier: Xi, makeNormalColorModifier: _i, setDepthColor: jo, setWorldNormalColor: Zo }, Symbol.toStringTag, { value: "Module" })), Tt = class Tt { static createButton(A, e = {}) { const g = navigator.xr; if (!g) return null; const I = g, s = document.createElement("button"); A.xr.enabled = !0, A.xr.setReferenceSpaceType("local"); function B() { let n = null; async function o(c) { console.log("onSessionStarted"), c.addEventListener("end", r), await A.xr.setSession(c), s.textContent = "EXIT VR", n = c; } function r() { console.log("onSessionEnded"), n == null || n.removeEventListener("end", r), s.textContent = "ENTER VR", n = null; } s.style.display = "", s.style.cursor = "pointer", s.style.left = "calc(50% - 100px)", s.style.width = "200px", s.style.height = "100px", s.textContent = "ENTER VR"; const l = { ...e, optionalFeatures: [ // "local-floor", // "bounded-floor", // "layers", ...e.optionalFeatures || [] ] }; s.onmouseenter = () => { s.style.opacity = "1.0"; }, s.onmouseleave = () => { s.style.opacity = "0.5"; }, s.onclick = () => { n === null ? (console.log("requesting session"), I.requestSession("immersive-vr", l).then( o )) : (console.log("ending session"), n.end()); }; } function i() { s.style.display = "none", s.style.cursor = "auto", s.style.left = "calc(50% - 75px)", s.style.width = "150px", s.onmouseenter = null, s.onmouseleave = null, s.onclick = null; } function Q() { i(), s.textContent = "VR NOT SUPPORTED"; } function C(n) { i(), console.warn( "Exception when trying to call xr.isSessionSupported", n ), s.textContent = "VR NOT ALLOWED"; } function E(n) { n.style.position = "absolute", n.style.bottom = "20px", n.style.padding = "12px 6px", n.style.border = "1px solid #fff", n.style.borderRadius = "4px", n.style.background = "rgba(0,0,0,0.1)", n.style.color = "#fff", n.style.font = "normal 13px sans-serif", n.style.textAlign = "center", n.style.opacity = "0.5", n.style.outline = "none", n.style.zIndex = "999"; } return s.id = "VRButton", s.style.display = "none", E(s), I.isSessionSupported("immersive-vr").then((n) => { n ? B() : Q(), n && Tt.xrSessionIsGranted && s.click(); }).catch(C), s; } 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 qe = Tt; qe.registerSessionGrantedListener(); const _o = 0.5, Xo = 0.5, Oo = 0; var eg = /* @__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))(eg || {}); const Oi = Object.keys(eg), kr = Oi.length, xr = { 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 }, ee = { 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 }, Po = [ ["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"] ], Wo = [ [8, 10, 8, 6], [8, 19, 14, 8, 6], [8, 19, 14, 8, 6], [8, 19, 14, 8, 6], [8, 19, 14, 8, 6] ], Rr = ["t3", "i4", "m4", "r4", "p4"], Ur = ["i4", "m4", "r4", "p4"]; var Pi = /* @__PURE__ */ ((t) => (t.left = "left", t.right = "right", t))(Pi || {}); const ze = Object.keys(Pi); class Yr { constructor() { this.hands = {}, this.last = {}, this.values = {}, this.tests = {}, this.lastTests = {}, this.updated = !1; } update({ xr: A, xrFrame: e }) { const g = A.getSession(); if (!g) 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 s of g.inputSources) { if (!s.hand) continue; const B = s.handedness; this.hands[B] = {}; for (const i of Oi) { const Q = s.hand.get(eg[i]); if (Q) { const C = e.getJointPose(Q, I); if (C) { const { position: E, orientation: n } = C.transform; this.hands[B][i] = { position: new JA(E.x, E.y, E.z), quaternion: new Ig( n.x, n.y, n.z, n.w ), radius: C.radius || 1e-3 }; } } } } for (const s of ze) for (const { key: B, value: i } of [ { key: `${s}AllTips`, value: this.allTipsTouching(s) }, { key: `${s}IndexThumb`, value: this.touching(s, "i4", s, "t3") }, { key: `${s}MiddleThumb`, value: this.touching(s, "m4", s, "t3") }, { key: `${s}RingThumb`, value: this.touching(s, "r4", s, "t3") }, { key: `${s}PinkyThumb`, value: this.touching(s, "p4", s, "t3") }, { key: `${s}TriTips`, value: this.triTipsTouching(s) } ]) this.values[B] = i, this.tests[B] = i === 1 ? !0 : i === 0 ? !1 : this.lastTests[B] ?? !1; } } makeGhostMesh() { const A = new JA(), e = new JA(0.01, 0.01, 0.01), g = new Ig(0, 0, 0, 1), I = new sg(1, 1, 1), s = Math.PI * 3; new sg(1, 1, 1); let B = 1; const i = new XA({ onFrame: () => { let Q = 0; for (const C of ze) { const E = this.hands[C]; for (const [n, o] of Po.entries()) for (let r = 1; r < o.length; ++r) { const l = Wo[n][r - 1] * 2, c = r + 1 === o.length, h = E == null ? void 0 : E[o[r - 1]], u = E == null ? void 0 : E[o[r]]; for (let D = 0; D < l; ++D) { const w = (D + 0.5) / l; if (B = 0, h && u) { A.copy(h.position).lerp(u.position, w), g.copy(h.quaternion).slerp(u.quaternion, w); const y = ee[o[r - 1]], f = ee[o[r]]; let N = (1 - w) * y + w * f; c && w > 0.8 && (N *= Math.sqrt(1 - ((w - 0.8) / 0.2) ** 2)), e.set(0.65 * N, 0.5 * N, 3e-3), I.set( 0.55 + 0.45 * Math.sin(A.x * s), 0.55 + 0.45 * Math.sin(A.y * s), 0.55 + 0.45 * Math.sin(A.z * s) ), C === "right" && I.set(1 - I.r, 1 - I.g, 1 - I.b), B = 0.75; } i.packedSplats.setSplat( Q, A, e, g, B, I ), Q += 1; } } } i.packedSplats.numSplats = Q, i.packedSplats.needsUpdate = !0, i.numSplats = Q, i.updateVersion(); } }); return i; } distance(A, e, g, I, s = !1) { const B = s ? this.last[A] : this.hands[A], i = s ? this.last[g] : this.hands[g], Q = B == null ? void 0 : B[e], C = i == null ? void 0 : i[I]; return !Q || !C ? Number.POSITIVE_INFINITY : Q.position.distanceTo(C.position); } separation(A, e, g, I, s = !1) { const B = this.distance(A, e, g, I, s); return B === Number.POSITIVE_INFINITY ? Number.POSITIVE_INFINITY : B - ee[e] - ee[I]; } touching(A, e, g, I, s = !1) { const B = this.separation(A, e, g, I, s); return B === Number.POSITIVE_INFINITY ? Number.POSITIVE_INFINITY : 1 - Math.max(0, Math.min(1, B / 0.01 - Oo)); } 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 Lr { constructor({ xrHands: A, control: e, moveInertia: g, rotateInertia: I }) { this.lastGrip = {}, this.lastPivot = new JA(), this.rotateVelocity = 0, this.velocity = new JA(), this.xrHands = A, this.control = e, this.moveInertia = g ?? _o, this.rotateInertia = I ?? Xo; } update(A) { var s, B, i, Q, C; const e = {}; for (const E of ze) { const n = this.xrHands.hands[E]; n && this.xrHands.tests[`${E}MiddleThumb`] && (e[E] = new JA().add(((s = n.t3) == null ? void 0 : s.position) ?? new JA()).add(((B = n.i4) == null ? void 0 : B.position) ?? new JA()).add(((i = n.m4) == null ? void 0 : i.position) ?? new JA()).add(((Q = n.r4) == null ? void 0 : Q.position) ?? new JA()).add(((C = n.p4) == null ? void 0 : C.position) ?? new JA()).multiplyScalar(1 / 5)); } if (e.left && e.right && this.lastGrip.left && this.lastGrip.right) { const E = e.left.clone().add(e.right).multiplyScalar(0.5), n = this.lastGrip.left.clone().add(this.lastGrip.right).multiplyScalar(0.5); this.lastPivot = E; const o = E.clone().applyMatrix4(this.control.matrix); o.sub(n.clone().applyMatrix4(this.control.matrix)), o.multiplyScalar(1 / A), this.velocity.lerp(o, 1 - Math.exp(-20 * A)); const r = Math.atan2(e.left.z - E.z, e.left.x - E.x), l = Math.atan2( this.lastGrip.left.z - n.z, this.lastGrip.left.x - n.x ); let c = r - 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 E = e.left.clone().applyMatrix4(this.control.matrix); E.sub(this.lastGrip.left.clone().applyMatrix4(this.control.matrix)), E.multiplyScalar(1 / A), this.velocity.lerp(E, 1 - Math.exp(-20 * A)); } else if (e.right && this.lastGrip.right) { const E = e.right.clone().applyMatrix4(this.control.matrix); E.sub( this.lastGrip.right.clone().applyMatrix4(this.control.matrix) ), E.multiplyScalar(1 / A), this.velocity.lerp(E, 1 - Math.exp(-20 * A)); } else this.velocity.multiplyScalar(Math.exp(-A / this.moveInertia)); const g = this.lastPivot.clone().negate(), I = new de().makeTranslation(g).premultiply(new de().makeRotationY(this.rotateVelocity * A)).premultiply(new de().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 $o = 1, Ar = 2, tr = 2e-3, er = 6e-3, gr = 15e-4, Ir = 0.15, sr = 0.15, Br = 0.1, ir = 2, Qr = 1, nr = 200, Cr = 400, Er = 50, ar = { KeyW: new a.Vector3(0, 0, -1), KeyS: new a.Vector3(0, 0, 1), KeyA: new a.Vector3(-1, 0, 0), KeyD: new a.Vector3(1, 0, 0), KeyR: new a.Vector3(0, 1, 0), KeyF: new a.Vector3(0, -1, 0) }, or = { ArrowUp: new a.Vector3(0, 0, -1), ArrowDown: new a.Vector3(0, 0, 1), ArrowLeft: new a.Vector3(-1, 0, 0), ArrowRight: new a.Vector3(1, 0, 0), PageUp: new a.Vector3(0, 1, 0), PageDown: new a.Vector3(0, -1, 0) }, rr = { KeyQ: new a.Vector3(0, 0, 1), KeyE: new a.Vector3(0, 0, -1) }, cr = { Home: new a.Vector3(0, -1, 0), End: new a.Vector3(0, 1, 0), Insert: new a.Vector3(-1, 0, 0), Delete: new a.Vector3(1, 0, 0) }; class Jr { constructor({ canvas: A }) { this.lastTime = 0, this.fpsMovement = new hr({}), this.pointerControls = new lr({ canvas: A }); } update(A) { const e = performance.now(), g = (e - (this.lastTime || e)) / 1e3; this.lastTime = e, this.fpsMovement.update(g, A), this.pointerControls.update(g, A); } } class hr { constructor({ moveSpeed: A, rollSpeed: e, stickThreshold: g, rotateSpeed: I, keycodeMoveMapping: s, keycodeRotateMapping: B, gamepadMapping: i, capsMultiplier: Q, shiftMultiplier: C, ctrlMultiplier: E, xr: n } = {}) { this.enable = !0, this.moveSpeed = A ?? $o, this.rollSpeed = e ?? Ar, this.stickThreshold = g ?? Br, this.rotateSpeed = I ?? ir, this.keycodeMoveMapping = s ?? { ...ar, ...or }, this.keycodeRotateMapping = B ?? { ...rr, ...cr }, this.gamepadMapping = i ?? { 4: "rollLeft", 5: "rollRight", 6: "ctrl", 7: "shift" }, this.capsMultiplier = Q ?? 10, this.shiftMultiplier = C ?? 5, this.ctrlMultiplier = E ?? 1 / 5, this.xr = n, this.keydown = {}, this.keycode = {}, document.addEventListener("keydown", (o) => { this.keydown[o.key] = !0, this.keycode[o.code] = !0; }), document.addEventListener("keyup", (o) => { this.keydown[o.key] = !1, this.keycode[o.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 E, n; if (!this.enable) return; const g = [new a.Vector2(), new a.Vector2()], I = navigator.getGamepads()[0]; I && (g[0].set(I.axes[0], I.axes[1]), g[1].set(I.axes[2], I.axes[3])); const s = (I == null ? void 0 : I.buttons.map((o) => o.pressed)) || [], B = Array.from(((n = (E = this.xr) == null ? void 0 : E.getSession()) == null ? void 0 : n.inputSources) ?? []); for (const o of B) { const r = o.gamepad; if (r) switch (o.handedness) { case "none": { g[0].x += r.axes[0], g[0].y += r.axes[1], g[1].x += r.axes[2], g[1].y += r.axes[3]; break; } case "left": { g[0].x += r.axes[2], g[0].y += r.axes[3]; break; } case "right": { g[1].x += r.axes[2], g[1].y += r.axes[3]; break; } } } for (const o of g) o.x = Math.abs(o.x) >= this.stickThreshold ? o.x : 0, o.y = Math.abs(o.y) >= this.stickThreshold ? o.y : 0; const i = new a.Vector3( g[1].x, g[1].y, 0 ).multiplyScalar(this.rotateSpeed); for (const [o, r] of Object.entries(this.keycodeRotateMapping)) this.keycode[o] && i.add(r); for (const o in this.gamepadMapping) if (s[Number.parseInt(o)]) switch (this.gamepadMapping[o]) { case "rollLeft": i.z += 1; break; case "rollRight": i.z -= 1; break; } if (i.multiply( new a.Vector3(this.rotateSpeed, this.rotateSpeed, this.rollSpeed) ), i.manhattanLength() > 0) { i.multiplyScalar(A); const o = new a.Euler().setFromQuaternion( e.quaternion, "YXZ" ); o.y -= i.x, o.x = Math.max( -Math.PI / 2, Math.min(Math.PI / 2, o.x - i.y) ), o.z = Math.max(-Math.PI, Math.min(Math.PI, o.z + i.z)), e.quaternion.setFromEuler(o); } const Q = new a.Vector3(g[0].x, 0, g[0].y); for (const [o, r] of Object.entries(this.keycodeMoveMapping)) this.keycode[o] && Q.add(r); let C = 1; this.keydown.CapsLock && (C *= this.capsMultiplier), (this.keycode.ShiftLeft || this.keycode.ShiftRight) && (C *= this.shiftMultiplier), (this.keycode.ControlLeft || this.keycode.ControlRight) && (C *= this.ctrlMultiplier); for (const o in this.gamepadMapping) if (s[Number.parseInt(o)]) switch (this.gamepadMapping[o]) { case "shift": C *= this.shiftMultiplier; break; case "ctrl": C *= this.ctrlMultiplier; break; } Q.applyQuaternion(e.quaternion), e.position.add( Q.multiplyScalar(this.moveSpeed * C * A) ); } } class lr { 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: g, // Speed of movement when using mouse scroll wheel (default DEFAULT_SCROLL_SPEED) scrollSpeed: I, // Swap the direction of rotation and sliding (default: false) swapRotateSlide: s, // Reverse the direction of rotation (default: false) reverseRotate: B, // Reverse the direction of sliding (default: false) reverseSlide: i, // Reverse the direction of swipe gestures (default: false) reverseSwipe: Q, // Reverse the direction of scroll wheel movement (default: false) reverseScroll: C, // Inertia factor for movement (default: DEFAULT_MOVE_INERTIA) moveInertia: E, // Inertia factor for rotation (default: DEFAULT_ROTATE_INERTIA) rotateInertia: n, // Pointer rolling scale factor (default: DEFAULT_POINTER_ROLL_SCALE) pointerRollScale: o, // Callback for double press events (default: () => {}) doublePress: r }) { this.enable = !0, this.canvas = A, this.rotateSpeed = e ?? tr, this.slideSpeed = g ?? er, this.scrollSpeed = I ?? gr, this.swapRotateSlide = s ?? !1, this.reverseRotate = B ?? !1, this.reverseSlide = i ?? !1, this.reverseSwipe = Q ?? !1, this.reverseScroll = C ?? !1, this.moveInertia = E ?? sr, this.rotateInertia = n ?? Ir, this.pointerRollScale = o ?? Qr, this.doublePress = r ?? (() => { }), this.doublePressLimitMs = Cr, this.doublePressDistance = Er, this.lastUp = null, this.rotating = null, this.sliding = null, this.dualPress = !1, this.scroll = new a.Vector3(), this.rotateVelocity = new a.Vector3(), this.moveVelocity = new a.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 N = c.pointerType === "mouse" ? c.button : void 0; this.sliding = { initial: u, last: D, position: h, pointerId: y, button: N, timeStamp: f }, A.setPointerCapture(c.pointerId), this.dualPress = this.rotating != null && f - this.rotating.timeStamp < nr; } }); 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 a.Vector3(c.deltaX, c.deltaY, c.deltaZ) ), c.preventDefault(); }); } getPointerPosition(A) { const e = this.canvas.getBoundingClientRect(); return new a.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) ], s = I[0].dot(I[1]); if (s >= 0.2) { const B = I[0].clone().add(I[1]), i = new a.Vector3(B.x, -B.y, 0); i.multiplyScalar(this.slideSpeed * (this.reverseSwipe ? 1 : -1)), i.applyQuaternion(e.quaternion), e.position.add(i), this.moveVelocity = i.clone().multiplyScalar(1 / A); } else if (s <= -0.2) { const B = this.sliding.last.clone().sub(this.rotating.last), i = B.length(); B.multiplyScalar(1 / i).normalize(); const Q = new a.Vector2(-B.y, B.x), C = [I[0].dot(B), I[1].dot(B)], E = [I[0].dot(Q), I[1].dot(Q)], n = this.rotating.last.clone().add(this.sliding.last).multiplyScalar(0.5); let o = new a.Vector3(); if (e instanceof a.Camera) { const D = new a.Vector2( n.x / this.canvas.clientWidth * 2 - 1, -(n.y / this.canvas.clientHeight) * 2 + 1 ), w = new a.Raycaster(); w.setFromCamera(D, e), o = w.ray.direction; } const r = C[1] - C[0], l = o.multiplyScalar(r * this.slideSpeed); e.position.add(l), this.moveVelocity = l.clone().multiplyScalar(1 / A); const c = [ Math.atan(E[0] / (-0.5 * i)), Math.atan(E[1] / (0.5 * i)) ], h = 0.5 * (c[0] + c[1]) * this.pointerRollScale, u = new a.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 a.Vector3(); if (this.rotating && !this.dualPress) { const B = this.rotating.position.clone().sub(this.rotating.last); this.rotating.last.copy(this.rotating.position), I.set(B.x, B.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 s = new a.Euler().setFromQuaternion( e.quaternion, "YXZ" ); if (s.y -= I.x, s.x = Math.max( -Math.PI / 2, Math.min(Math.PI / 2, s.x - I.y) ), s.z *= Math.exp(-0 * A), e.quaternion.setFromEuler(s), this.sliding && !this.dualPress) { const B = this.sliding.position.clone().sub(this.sliding.last); this.sliding.last.copy(this.sliding.position); const i = this.sliding.button !== 2 ? new a.Vector3(B.x, 0, B.y) : new a.Vector3(B.x, -B.y, 0); i.multiplyScalar(this.slideSpeed * (this.reverseSlide ? -1 : 1)), i.applyQuaternion(e.quaternion), e.position.add(i), this.moveVelocity = i.clone().multiplyScalar(1 / A); } else this.moveVelocity.multiplyScalar( Math.exp(-A / this.moveInertia) ), e.position.addScaledVector(this.moveVelocity, A); } const g = this.scroll.multiplyScalar(this.scrollSpeed); g.set(g.x, g.z, g.y), this.reverseScroll && g.multiplyScalar(-1), g.applyQuaternion(e.quaternion), e.position.add(g), this.scroll.set(0, 0, 0); } } export { Ur as FINGER_TIPS, hr as FpsMovement, ze as HANDS, Pi as Hand, Lr as HandMovement, Oi as JOINT_IDS, xr as JOINT_INDEX, ee as JOINT_RADIUS, Po as JOINT_SEGMENTS, Wo as JOINT_SEGMENT_STEPS, Rr as JOINT_TIPS, eg as JointEnum, kr as NUM_JOINTS, qA as PackedSplats, Ee as PlyReader, lr as PointerControls, ne as Readback, Kn as Sint8ToFloat, Jr as SparkControls, re as SparkRenderer, oe as SparkViewpoint, Fe as SplatAccumulator, Ce as SplatEdit, $a as SplatEditRgbaBlendMode, to as SplatEditSdf, Pa as SplatEditSdfType, eo as SplatEdits, Jt as SplatFileType, qt as SplatGenerator, lo as SplatLoader, XA as SplatMesh, Io as SplatModifier, fr as SplatSkinning, pt as SplatTransformer, Lo as SpzReader, tt as SpzWriter, Hn as Uint8ToFloat, qe as VRButton, Yr as XrHands, Mr as constructAxes, dr as constructGrid, mr as constructSpherePoints, Dr as dyno, QC as flipPixels, ge as floatToSint8, FA as floatToUint8, pA as fromHalf, Fr as generators, bi as getSplatFileType, Sr as imageSplats, BC as isAndroid, sC as isMobile, iC as isOculus, yr as isPcSogs, Gr as modifiers, nC as pixelsToPngUrl, Ue as setPackedSplat, Nr as textSplats, rt as toHalf, pr as transcodeSpz, Ye as unpackSplat, Hi as unpackSplats, wr as utils }; //# sourceMappingURL=spark.module.min.js.map