import * as I from "three"; import { Mesh as Qo, OrthographicCamera as po, BufferGeometry as fo, Float32BufferAttribute as us, Loader as yo, FileLoader as wo, Quaternion as hs, Vector3 as _A, Color as Cs, Matrix4 as Se } from "three"; const mo = new po(-1, 1, 1, -1, 0, 1); class xo extends fo { constructor() { super(), this.setAttribute("position", new us([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3)), this.setAttribute("uv", new us([0, 2, 0, 0, 2, 0], 2)); } } const So = new xo(); class xs { /** * Constructs a new full screen quad. * * @param {?Material} material - The material to render te full screen quad with. */ constructor(A) { this._mesh = new Qo(So, A); } /** * Frees the GPU-related resources allocated by this instance. Call this * method whenever the instance is no longer used in your app. */ dispose() { this._mesh.geometry.dispose(); } /** * Renders the full screen quad. * * @param {WebGLRenderer} renderer - The renderer. */ render(A) { A.render(this._mesh, mo); } /** * The quad's material. * * @type {?Material} */ get material() { return this._mesh.material; } set material(A) { this._mesh.material = A; } } var uA = Uint8Array, mt = Uint16Array, Do = Int32Array, Ss = new uA([ 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 ]), Ds = new uA([ 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 ]), Mo = new uA([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]), Ms = function(t, A) { for (var e = new mt(31), s = 0; s < 31; ++s) e[s] = A += 1 << t[s - 1]; for (var n = new Do(e[30]), s = 1; s < 30; ++s) for (var i = e[s]; i < e[s + 1]; ++i) n[i] = i - e[s] << 5 | s; return { b: e, r: n }; }, vs = Ms(Ss, 2), bs = vs.b, vo = vs.r; bs[28] = 258, vo[258] = 28; var bo = Ms(Ds, 0), Fo = bo.b, Te = new mt(32768); for (var sA = 0; sA < 32768; ++sA) { var tt = (sA & 43690) >> 1 | (sA & 21845) << 1; tt = (tt & 52428) >> 2 | (tt & 13107) << 2, tt = (tt & 61680) >> 4 | (tt & 3855) << 4, Te[sA] = ((tt & 65280) >> 8 | (tt & 255) << 8) >> 1; } var Lt = function(t, A, e) { for (var s = t.length, n = 0, i = new mt(A); n < s; ++n) t[n] && ++i[t[n] - 1]; var r = new mt(A); for (n = 1; n < A; ++n) r[n] = r[n - 1] + i[n - 1] << 1; var a; if (e) { a = new mt(1 << A); var o = 15 - A; for (n = 0; n < s; ++n) if (t[n]) for (var g = n << 4 | t[n], l = A - t[n], c = r[t[n] - 1]++ << l, u = c | (1 << l) - 1; c <= u; ++c) a[Te[c] >> o] = g; } else for (a = new mt(s), n = 0; n < s; ++n) t[n] && (a[n] = Te[r[t[n] - 1]++] >> 15 - t[n]); return a; }, Vt = new uA(288); for (var sA = 0; sA < 144; ++sA) Vt[sA] = 8; for (var sA = 144; sA < 256; ++sA) Vt[sA] = 9; for (var sA = 256; sA < 280; ++sA) Vt[sA] = 7; for (var sA = 280; sA < 288; ++sA) Vt[sA] = 8; var Fs = new uA(32); for (var sA = 0; sA < 32; ++sA) Fs[sA] = 5; var No = /* @__PURE__ */ Lt(Vt, 9, 1), ko = /* @__PURE__ */ Lt(Fs, 5, 1), De = function(t) { for (var A = t[0], e = 1; e < t.length; ++e) t[e] > A && (A = t[e]); return A; }, JA = function(t, A, e) { var s = A / 8 | 0; return (t[s] | t[s + 1] << 8) >> (A & 7) & e; }, Me = function(t, A) { var e = A / 8 | 0; return (t[e] | t[e + 1] << 8 | t[e + 2] << 16) >> (A & 7); }, Ns = function(t) { return (t + 7) / 8 | 0; }, Mt = function(t, A, e) { return (A == null || A < 0) && (A = 0), (e == null || e > t.length) && (e = t.length), new uA(t.subarray(A, e)); }, To = [ "unexpected EOF", "invalid block type", "invalid length/literal", "invalid distance", "stream finished", "no stream handler", , "no callback", "invalid UTF-8 data", "extra field too long", "date not in range 1980-2099", "filename too long", "stream finishing", "invalid zip data" // determined by unknown compression method ], yA = function(t, A, e) { var s = new Error(A || To[t]); if (s.code = t, Error.captureStackTrace && Error.captureStackTrace(s, yA), !e) throw s; return s; }, ks = function(t, A, e, s) { var n = t.length, i = s ? s.length : 0; if (!n || A.f && !A.l) return e || new uA(0); var r = !e, a = r || A.i != 2, o = A.i; r && (e = new uA(n * 3)); var g = function(dA) { var xA = e.length; if (dA > xA) { var CA = new uA(Math.max(xA * 2, dA)); CA.set(e), e = CA; } }, l = A.f || 0, c = A.p || 0, u = A.b || 0, h = A.l, E = A.d, C = A.m, B = A.n, Q = n * 8; do { if (!h) { l = JA(t, c, 1); var p = JA(t, c + 1, 3); if (c += 3, p) if (p == 1) h = No, E = ko, C = 9, B = 5; else if (p == 2) { var D = JA(t, c, 31) + 257, x = JA(t, c + 10, 15) + 4, y = D + JA(t, c + 5, 31) + 1; c += 14; for (var m = new uA(y), k = new uA(19), M = 0; M < x; ++M) k[Mo[M]] = JA(t, c + M * 3, 7); c += x * 3; for (var S = De(k), U = (1 << S) - 1, F = Lt(k, S, 1), M = 0; M < y; ) { var b = F[JA(t, c, U)]; c += b & 15; var f = b >> 4; if (f < 16) m[M++] = f; else { var T = 0, R = 0; for (f == 16 ? (R = 3 + JA(t, c, 3), c += 2, T = m[M - 1]) : f == 17 ? (R = 3 + JA(t, c, 7), c += 3) : f == 18 && (R = 11 + JA(t, c, 127), c += 7); R--; ) m[M++] = T; } } var X = m.subarray(0, D), _ = m.subarray(D); C = De(X), B = De(_), h = Lt(X, C, 1), E = Lt(_, B, 1); } else yA(1); else { var f = Ns(c) + 4, d = t[f - 4] | t[f - 3] << 8, w = f + d; if (w > n) { o && yA(0); break; } a && g(u + d), e.set(t.subarray(f, w), u), A.b = u += d, A.p = c = w * 8, A.f = l; continue; } if (c > Q) { o && yA(0); break; } } a && g(u + 131072); for (var eA = (1 << C) - 1, q = (1 << B) - 1, O = c; ; O = c) { var T = h[Me(t, c) & eA], L = T >> 4; if (c += T & 15, c > Q) { o && yA(0); break; } if (T || yA(2), L < 256) e[u++] = L; else if (L == 256) { O = c, h = null; break; } else { var j = L - 254; if (L > 264) { var M = L - 257, P = Ss[M]; j = JA(t, c, (1 << P) - 1) + bs[M], c += P; } var W = E[Me(t, c) & q], G = W >> 4; W || yA(3), c += W & 15; var _ = Fo[G]; if (G > 3) { var P = Ds[G]; _ += Me(t, c) & (1 << P) - 1, c += P; } if (c > Q) { o && yA(0); break; } a && g(u + 131072); var pA = u + j; if (u < _) { var gA = i - _, fA = Math.min(_, pA); for (gA + u < 0 && yA(3); u < fA; ++u) e[u] = s[gA + u]; } for (; u < pA; ++u) e[u] = e[u - _]; } } A.l = h, A.p = O, A.b = u, A.f = l, h && (l = 1, A.m = C, A.d = E, A.n = B); } while (!l); return u != e.length && r ? Mt(e, 0, u) : e.subarray(0, u); }, Uo = /* @__PURE__ */ new uA(0), qA = function(t, A) { return t[A] | t[A + 1] << 8; }, LA = function(t, A) { return (t[A] | t[A + 1] << 8 | t[A + 2] << 16 | t[A + 3] << 24) >>> 0; }, ve = function(t, A) { return LA(t, A) + LA(t, A + 4) * 4294967296; }, Go = function(t) { (t[0] != 31 || t[1] != 139 || t[2] != 8) && yA(6, "invalid gzip data"); var A = t[3], e = 10; A & 4 && (e += (t[10] | t[11] << 8) + 2); for (var s = (A >> 3 & 1) + (A >> 4 & 1); s > 0; s -= !t[e++]) ; return e + (A & 2); }, be = /* @__PURE__ */ function() { function t(A, e) { typeof A == "function" && (e = A, A = {}), this.ondata = e; var s = A && A.dictionary && A.dictionary.subarray(-32768); this.s = { i: 0, b: s ? s.length : 0 }, this.o = new uA(32768), this.p = new uA(0), s && this.o.set(s); } return t.prototype.e = function(A) { if (this.ondata || yA(5), this.d && yA(4), !this.p.length) this.p = A; else if (A.length) { var e = new uA(this.p.length + A.length); e.set(this.p), e.set(A, this.p.length), this.p = e; } }, t.prototype.c = function(A) { this.s.i = +(this.d = A || !1); var e = this.s.b, s = ks(this.p, this.s, this.o); this.ondata(Mt(s, e, this.s.b), this.d), this.o = Mt(s, this.s.b - 32768), this.s.b = this.o.length, this.p = Mt(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 Ro(t, A) { return ks(t, { i: 2 }, A && A.out, A && A.dictionary); } var Ts = /* @__PURE__ */ function() { function t(A, e) { this.v = 1, this.r = 0, be.call(this, A, e); } return t.prototype.push = function(A, e) { if (be.prototype.e.call(this, A), this.r += A.length, this.v) { var s = this.p.subarray(this.v - 1), n = s.length > 3 ? Go(s) : 4; if (n > s.length) { if (!e) return; } else this.v > 1 && this.onmember && this.onmember(this.r - s.length); this.p = s.subarray(n), this.v = 0; } be.prototype.c.call(this, e), this.s.f && !this.s.l && !e && (this.v = Ns(this.s.p) + 9, this.s = { i: 0 }, this.o = new uA(0), this.push(new uA(0), e)); }, t; }(), Ue = typeof TextDecoder < "u" && /* @__PURE__ */ new TextDecoder(), Yo = 0; try { Ue.decode(Uo, { stream: !0 }), Yo = 1; } catch { } var Jo = function(t) { for (var A = "", e = 0; ; ) { var s = t[e++], n = (s > 127) + (s > 223) + (s > 239); if (e + n > t.length) return { s: A, r: Mt(t, e - 1) }; n ? n == 3 ? (s = ((s & 15) << 18 | (t[e++] & 63) << 12 | (t[e++] & 63) << 6 | t[e++] & 63) - 65536, A += String.fromCharCode(55296 | s >> 10, 56320 | s & 1023)) : n & 1 ? A += String.fromCharCode((s & 31) << 6 | t[e++] & 63) : A += String.fromCharCode((s & 15) << 12 | (t[e++] & 63) << 6 | t[e++] & 63) : A += String.fromCharCode(s); } }; function _o(t, A) { if (A) { for (var e = "", s = 0; s < t.length; s += 16384) e += String.fromCharCode.apply(null, t.subarray(s, s + 16384)); return e; } else { if (Ue) return Ue.decode(t); var n = Jo(t), i = n.s, e = n.r; return e.length && yA(8), i; } } var Lo = function(t, A) { return A + 30 + qA(t, A + 26) + qA(t, A + 28); }, zo = function(t, A, e) { var s = qA(t, A + 28), n = _o(t.subarray(A + 46, A + 46 + s), !(qA(t, A + 8) & 2048)), i = A + 46 + s, r = LA(t, A + 20), a = e && r == 4294967295 ? Ho(t, i) : [r, LA(t, A + 24), LA(t, A + 42)], o = a[0], g = a[1], l = a[2]; return [qA(t, A + 10), o, g, n, i + qA(t, A + 30) + qA(t, A + 32), l]; }, Ho = function(t, A) { for (; qA(t, A) != 1; A += 4 + qA(t, A + 2)) ; return [ve(t, A + 12), ve(t, A + 4), ve(t, A + 20)]; }; function qo(t, A) { for (var e = {}, s = t.length - 22; LA(t, s) != 101010256; --s) (!s || t.length - s > 65558) && yA(13); var n = qA(t, s + 8); if (!n) return {}; var i = LA(t, s + 16), r = i == 4294967295 || n == 65535; if (r) { var a = LA(t, s - 12); r = LA(t, a) == 101075792, r && (n = LA(t, a + 32), i = LA(t, a + 48)); } for (var o = A && A.filter, g = 0; g < n; ++g) { var l = zo(t, i, r), c = l[0], u = l[1], h = l[2], E = l[3], C = l[4], B = l[5], Q = Lo(t, B); i = C, (!o || o({ name: E, size: u, originalSize: h, compression: c })) && (c ? c == 8 ? e[E] = Ro(t.subarray(Q, Q + u), { out: new uA(h) }) : yA(14, "unknown compression type " + c) : e[E] = Mt(t, Q, Q + u)); } return e; } let XA; const Us = typeof TextDecoder < "u" ? new TextDecoder("utf-8", { ignoreBOM: !0, fatal: !0 }) : { decode: () => { throw Error("TextDecoder not available"); } }; typeof TextDecoder < "u" && Us.decode(); let Yt = null; function Ko() { return (Yt === null || Yt.byteLength === 0) && (Yt = new Uint8Array(XA.memory.buffer)), Yt; } function $o(t, A) { return t = t >>> 0, Us.decode(Ko().subarray(t, t + A)); } function Vo(t, A, e, s, n, i, r, a, o, g, l, c, u) { return XA.raycast_splats(t, A, e, s, n, i, r, a, o, g, l, c, u); } async function Po(t, A) { if (typeof Response == "function" && t instanceof Response) { if (typeof WebAssembly.instantiateStreaming == "function") try { return await WebAssembly.instantiateStreaming(t, A); } catch (s) { if (t.headers.get("Content-Type") != "application/wasm") console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", s); else throw s; } const e = await t.arrayBuffer(); return await WebAssembly.instantiate(e, A); } else { const e = await WebAssembly.instantiate(t, A); return e instanceof WebAssembly.Instance ? { instance: e, module: t } : e; } } function Zo() { const t = {}; return t.wbg = {}, t.wbg.__wbg_buffer_609cc3eee51ed158 = function(A) { return A.buffer; }, t.wbg.__wbg_length_3b4f022188ae8db6 = function(A) { return A.length; }, t.wbg.__wbg_length_6ca527665d89694d = function(A) { return A.length; }, t.wbg.__wbg_length_8cfd2c6409af88ad = function(A) { return A.length; }, t.wbg.__wbg_new_9fee97a409b32b68 = function(A) { return new Uint16Array(A); }, t.wbg.__wbg_new_e3b321dcfef89fc7 = function(A) { return new Uint32Array(A); }, t.wbg.__wbg_newwithbyteoffsetandlength_e6b7e69acd4c7354 = function(A, e, s) { return new Float32Array(A, e >>> 0, s >>> 0); }, t.wbg.__wbg_newwithbyteoffsetandlength_f1dead44d1fc7212 = function(A, e, s) { return new Uint32Array(A, e >>> 0, s >>> 0); }, t.wbg.__wbg_newwithlength_5a5efe313cfd59f1 = function(A) { return new Float32Array(A >>> 0); }, t.wbg.__wbg_set_10bad9bee0e9c58b = function(A, e, s) { A.set(e, s >>> 0); }, t.wbg.__wbg_set_d23661d19148b229 = function(A, e, s) { A.set(e, s >>> 0); }, t.wbg.__wbg_set_f4f1f0daa30696fc = function(A, e, s) { A.set(e, s >>> 0); }, t.wbg.__wbg_subarray_3aaeec89bb2544f0 = function(A, e, s) { return A.subarray(e >>> 0, s >>> 0); }, t.wbg.__wbg_subarray_769e1e0f81bb259b = function(A, e, s) { return A.subarray(e >>> 0, s >>> 0); }, t.wbg.__wbindgen_init_externref_table = function() { const A = XA.__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 XA.memory; }, t.wbg.__wbindgen_throw = function(A, e) { throw new Error($o(A, e)); }, t; } function Xo(t, A) { return XA = t.exports, Gs.__wbindgen_wasm_module = A, Yt = null, XA.__wbindgen_start(), XA; } async function Gs(t) { if (XA !== void 0) return XA; 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,AGFzbQEAAAABzAEeYAJ/fwF/YAJ/fwBgA39/fwF/YAN/f38AYAF/AX9gAX8AYANvf38Bb2AFf39/f38Bf2AFf39/f38AYAFvAW9gA29vfwBgAW8Bf2AAAGAAAX9gBH9/f38AYAR/f39/AX9gA39vbwF/YAF/AW9gAAFvYAF9AX1gBn9/f39/fwBgDX19fX19fX19f29/fX0Bb2AGf39/f39/AX9gBX9/fX9/AGAEf31/fwBgBX9/fH9/AGAEf3x/fwBgBX9/fn9/AGAEf35/fwBgAn19AX0C8gQRA3diZx1fX3diZ19idWZmZXJfNjA5Y2MzZWVlNTFlZDE1OAAJA3diZxpfX3diZ19uZXdfOWZlZTk3YTQwOWIzMmI2OAAJA3diZxpfX3diZ19zZXRfZjRmMWYwZGFhMzA2OTZmYwAKA3diZx1fX3diZ19sZW5ndGhfOGNmZDJjNjQwOWFmODhhZAALA3diZzFfX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9mMWRlYWQ0NGQxZmM3MjEyAAYDd2JnGl9fd2JnX25ld19lM2IzMjFkY2ZlZjg5ZmM3AAkDd2JnGl9fd2JnX3NldF9kMjM2NjFkMTkxNDhiMjI5AAoDd2JnHV9fd2JnX2xlbmd0aF82Y2E1Mjc2NjVkODk2OTRkAAsDd2JnMV9fd2JnX25ld3dpdGhieXRlb2Zmc2V0YW5kbGVuZ3RoX2U2YjdlNjlhY2Q0YzczNTQABgN3YmcaX193Ymdfc2V0XzEwYmFkOWJlZTBlOWM1OGIACgN3YmcdX193YmdfbGVuZ3RoXzNiNGYwMjIxODhhZThkYjYACwN3YmcfX193Ymdfc3ViYXJyYXlfNzY5ZTFlMGY4MWJiMjU5YgAGA3diZx9fX3diZ19zdWJhcnJheV8zYWFlZWM4OWJiMjU0NGYwAAYDd2JnJF9fd2JnX25ld3dpdGhsZW5ndGhfNWE1ZWZlMzEzY2ZkNTlmMQARA3diZxBfX3diaW5kZ2VuX3Rocm93AAEDd2JnEV9fd2JpbmRnZW5fbWVtb3J5ABIDd2JnH19fd2JpbmRnZW5faW5pdF9leHRlcm5yZWZfdGFibGUADANeXQQAAQcFAgMCEwEBAA0BAwEAAA0BAwgIAwEBBRQBAw4AAwEDAgwMAgABAQcDABUBFhcIGRsH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QYGABGxBEHYgBGohBCAHRQ0ACwJ/IAMgBkH8AXFBAnRqIgAoAgAiAUF/c0EHdiABQQZ2ckGBgoQIcSIBIAdBAUYNABogASAAKAIEIgFBf3NBB3YgAUEGdnJBgYKECHFqIgEgB0ECRg0AGiAAKAIIIgBBf3NBB3YgAEEGdnJBgYKECHEgAWoLIgFBCHZB/4EccSABQf+B/AdxakGBgARsQRB2IARqDwsgAUUEQEEADwsgAUEDcSEDAkAgAUEESQRADAELIAFBfHEhBQNAIAQgACACaiIBLAAAQb9/SmogAUEBaiwAAEG/f0pqIAFBAmosAABBv39KaiABQQNqLAAAQb9/SmohBCAFIAJBBGoiAkcNAAsLIANFDQAgACACaiEBA0AgBCABLAAAQb9/SmohBCABQQFqIQEgA0EBayIDDQALCyAEC4oGAQZ/IAAoAggiAyABSQRAIAEgAyICayIEIAAoAgAgAmtLBEAgACACIARBBEEEECYgACgCCCECCyAAKAIEIgYgAkECdGohBSAEQQJPBEAgASADQX9zakECdCIHBEAgBUEAIAf8CwALIAEgAmpBAnQgA0ECdGsgBmpBBGshBSACIARqQQFrIQILIAVBADYCACAAIAJBAWo2AggLIAAoAhQiAyABSQRAIAEgAyICayIEIAAoAgwgAmtLBEAgAEEMaiACIARBBEEEECYgACgCFCECCyAAKAIQIgYgAkECdGohBSAEQQJPBEAgASADQX9zakECdCIHBEAgBUEAIAf8CwALIAEgAmpBAnQgA0ECdGsgBmpBBGshBSACIARqQQFrIQILIAVBADYCACAAIAJBAWo2AhQLIAAoAjgiAyABSQRAIAEgAyICayIEIAAoAjAgAmtLBEAgAEEwaiACIARBBEEEECYgACgCOCECCyAAKAI0IgYgAkECdGohBSAEQQJPBEAgASADQX9zakECdCIHBEAgBUEAIAf8CwALIAEgAmpBAnQgA0ECdGsgBmpBBGshBSACIARqQQFrIQILIAVBADYCACAAIAJBAWo2AjgLIAAoAiAiA0H//wNNBEAgAyEBQYCABCADayICIAAoAhggA2tLBEAgAEEYaiADIAJBBEEEECYgACgCICEBCyAAKAIcIgUgAUECdCIEaiECIANB//8DRwRAQfz/DyADQQJ0IgZrIgcEQCACQQAgB/wLAAsg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IAQgA0EUahAvIAMoAghBAUcNASADKAIQIQAgAygCDAsgAEGEj8AAEEwACyADKAIMIQEgACAENgIAIAAgATYCBCADQSBqJAALuQEBBX8jAEEgayICJAAgACgCACIEQf////8BSwRAQQBBACABEEwACwJAQQQgBEEBdCIFIAVBBE0bIgVBAnQiBkH8////B00EfyACIAQEfyACIARBAnQ2AhwgAiAAKAIENgIUQQQFIAMLNgIYIAJBCGpBBCAGIAJBFGoQLyACKAIIQQFHDQEgAigCECEDIAIoAgwFIAMLIAMgARBMAAsgAigCDCEBIAAgBTYCACAAIAE2AgQgAkEgaiQAC8EBAgN/AX4jAEEwayICJAAgASgCAEGAgICAeEYEQCABKAIMIQMgAkEUaiIEQQA2AgAgAkKAgICAEDcCDCACQSBqIAMoAgAiA0EIaikCADcDACACQShqIANBEGopAgA3AwAgAiADKQIANwMYIAJBDGpBuIvAACACQRhqEBgaIAJBCGogBCgCACIDNgIAIAIgAikCDCIFNwMAIAFBCGogAzYCACABIAU3AgALIABB8I3AADYCBCAAIAE2AgAgAkEwaiQAC68BAQZ/AkACQCAAQYQBSQ0AIADQbyYBECMiASgCDCEFIAEoAhAhAiABQgA3AgwgASgCCCEDIAEoAgQhBCABQgQ3AgQgASgCACEGIAFBADYCACAAIAJJDQEgACACayIAIANPDQEgBCAAQQJ0aiAFNgIAIAEgAjYCECABIAA2AgwgASADNgIIIAEoAgQgASAENgIEIAEoAgAhACABIAY2AgAgAEUNACAAQQJ0EGALDwsAC6gBAQF/IwBBEGsiBiQAAkAgAQRAIAZBBGogASADIAQgBSACKAIQEQgAAkAgBigCBCICIAYoAgwiAU0EQCAGKAIIIQUMAQsgAkECdCECIAYoAgghAyABRQRAQQQhBSADIAIQYAwBCyADIAJBBCABQQJ0IgIQUCIFRQ0CCyAAIAE2AgQgACAFNgIAIAZBEGokAA8LQYyKwABBMhBjAAtBBCACQfyJwAAQTAALrQEBA38gASgCDCECAkACQAJAAkACQAJAIAEoAgQOAgABAgsgAg0BQQEhA0EAIQFBASECDAMLIAJFDQELIAAgARAbDwsgASgCACICKAIEIgFBAEgNASACKAIAIQMgAUUEQEEBIQJBACEBDAELQQEhBCABQQEQWCICRQ0BCyABBEAgAiADIAH8CgAACyAAIAE2AgggACACNgIEIAAgATYCAA8LIAQgAUG0hsAAEEwAC5cBAgR/AW8jAEEgayIDJAAgACgCACIGEG0hACADIAI2AgQgAyAANgIAIAAgAkYEQBBWIgQQTyIFJQEgASACEAQhBxAdIgAgByYBIARBhAFPBEAgBBArCyAFQYQBTwRAIAUQKwsgBiAAQQAQXyAAQYQBTwRAIAAQKwsgA0EgaiQADwsgA0EANgIIIAMgA0EEaiADQQhqEDwAC4oBAQF/IAJBAE4EQAJ/AkAgAygCBARAIAMoAggiBEUEQCACDQIgAQwDCyADKAIAIAQgASACEFAMAgsgAg0AIAEMAQsgAiABEFgLIgNFBEAgACACNgIIIAAgATYCBCAAQQE2AgAPCyAAIAI2AgggACADNgIEIABBADYCAA8LIABBADYCBCAAQQE2AgALeQEBfyMAQSBrIgIkAAJ/IAAoAgBBgICAgHhHBEAgASAAKAIEIAAoAggQUQwBCyACQRBqIAAoAgwoAgAiAEEIaikCADcDACACQRhqIABBEGopAgA3AwAgAiAAKQIANwMIIAEoAgAgASgCBCACQQhqEBgLIAJBIGokAAtpAgF/AX4jAEEwayIDJAAgAyABNgIEIAMgADYCACADQQI2AgwgA0HwkMAANgIIIANCAjcCFCADQoCAgIDQACIEIAOthDcDKCADIAQgA0EEaq2ENwMgIAMgA0EgajYCECADQQhqIAIQPwALaAAjAEEwayIAJABBhJbAAC0AAEUEQCAAQTBqJAAPCyAAQQI2AgwgAEHQjcAANgIIIABCATcCFCAAIAE2AiwgACAAQSxqrUKAgICA0ACENwMgIAAgAEEgajYCECAAQQhqQeCNwAAQPwALlAECA38BbyMAQSBrIgMkACADIAAoAgAQbSIENgIAIAMgAjYCBCACIARHBEAgA0EANgIIIAMgA0EEaiADQQhqEDwACxBWIgQQTyIFJQEQBSEGEB0iAiAGJgEgBUGEAU8EQCAFECsLIAIgACgCACABQQJ2EF8gAkGEAU8EQCACECsLIARBhAFPBEAgBBArCyADQSBqJAALRwEBfyAAKAIAIAAoAggiA2sgAkkEQCAAIAMgAhAlIAAoAgghAwsgAgRAIAAoAgQgA2ogASAC/AoAAAsgACACIANqNgIIQQALTwEBfyMAQTBrIgAkACAAQQE2AgwgAEGkjcAANgIIIABCATcCFCAAIABBL2qtQoCAgICwAoQ3AyAgACAAQSBqNgIQIABBCGpBlIbAABA/AAtPAQF/IwBBMGsiACQAIABBATYCDCAAQZyQwAA2AgggAEIBNwIUIAAgAEEvaq1CgICAgJAFhDcDICAAIABBIGo2AhAgAEEIakGkhsAAED8AC0cBAX8gACgCACAAKAIIIgNrIAJJBEAgACADIAIQKCAAKAIIIQMLIAIEQCAAKAIEIANqIAEgAvwKAAALIAAgAiADajYCCEEACzcBAX8jAEEgayICJAAgAkEIaiAAKAIAIAJBFmoQHyABQQFBACACKAIIIAIoAgwQFCACQSBqJAALRAECfyABKAIEIQIgASgCACEDQQhBBBBYIgFFBEBBBEEIEGgACyABIAI2AgQgASADNgIAIABBgI7AADYCBCAAIAE2AgALQQEBfyMAQSBrIgIkACACQQA2AhAgAkEBNgIEIAJCBDcCCCACQS42AhwgAiAANgIYIAIgAkEYajYCACACIAEQPwALOAACQCACQYCAxABGDQAgACACIAEoAhARAABFDQBBAQ8LIANFBEBBAA8LIAAgAyAEIAEoAgwRAgAL2AIBAX8jAEEQayIDJAAgAyABNgIMIAMgADYCCCMAQfAAayIAJAAgAEGAkcAANgIMIAAgA0EIajYCCCAAQYCRwAA2AhQgACADQQxqNgIQIABB0JTAACgCADYCHCAAQcSUwAAoAgA2AhgCQCACKAIABEAgAEEwaiACQRBqKQIANwMAIABBKGogAkEIaikCADcDACAAIAIpAgA3AyAgAEEENgJcIABBgJLAADYCWCAAQgQ3AmQgACAAQRBqrUKAgICAoAWENwNQIAAgAEEIaq1CgICAgKAFhDcDSCAAIABBIGqtQoCAgIDABYQ3A0AMAQsgAEEDNgJcIABBzJHAADYCWCAAQgM3AmQgACAAQRBqrUKAgICAoAWENwNIIAAgAEEIaq1CgICAgKAFhDcDQAsgACAAQRhqrUKAgICAsAWENwM4IAAgAEE4ajYCYCAAQdgAakHsicAAED8AC7MBAQJ/IwBBEGsiACQAIAEoAgBB0IzAAEELIAEoAgQoAgwRAgAhAyAAQQhqIgJBADoABSACIAM6AAQgAiABNgIAIAIiAS0ABCECIAEtAAUEQCABAn9BASACQQFxDQAaIAEoAgAiAS0ACkGAAXFFBEAgASgCAEG1ksAAQQIgASgCBCgCDBECAAwBCyABKAIAQbSSwABBASABKAIEKAIMEQIACyICOgAECyACQQFxIABBEGokAAvcEgIYfxB9EB0iDiAJJgEjAEGAAWsiDSQAIA0gDjYCLCANIAg2AiggDSAHOAIkIA0gBjgCICANIAU4AhwgDSAEOAIYIA0gAzgCFCANIAI4AhAgDSABOAIMIA0gADgCCCANIApBAEc6ADMgDSALOAI0IA0gDDgCOCANQQA2AkQgDUKAgICAwAA3AjwgDSANQThqNgJ8IA0gDUE0ajYCeCANIA1BJGo2AnQgDSANQSBqNgJwIA0gDUEcajYCbCANIA1BGGo2AmggDSANQRRqNgJkIA0gDUEQajYCYCANIA1BDGo2AlwgDSANQQhqNgJYIA0gDUE8ajYCVCANIA1BM2o2AlAgDSANQSxqNgJMIA0gDUEoajYCSCANQcgAaiIYIQgjAEEQayIQJAACQAJAQQBBkIbAACgCABEEACITBEAgEygCAA0BIAgoAjQhGSAIKAIwIRogCCgCLCEbIAgoAighHCAIKAIkIR0gCCgCICEeIAgoAhwhHyAIKAIYISAgCCgCFCEhIAgoAhAhIiAIKAIMIREgCCgCCCEjIAgoAgQhJCAIKAIAIRYgE0F/NgIAIBMgFigCACIIBH8gE0EMaigCACEXIBNBCGooAgAhCkEAIQ4DQCAQICQgDkECdCAOQYCABCAIIA5rIgggCEGAgARPGyIIaiIUQQJ0EGE2AgACQAJAIBcgCEECdCIOTwRAIBAgCiAOEDMgGSoCACEAIBoqAgAhAyAbKgIAIS8gHCoCACEwIB0qAgAhBCAeKgIAIQUgHyoCACEGICAqAgAhMSAhKgIAITIgIioCACEzICMtAAANASAAIAOTQwAAfkOVIQAgBiAGlCAFIAWUkiAEIASUkiELIAohCANAIA5BBCAOQQRJIg8bIRICQCAILQADs0MAAH9DlUPNzMw9XQ0AIBBBBGogCCASEBcCfQJAIA9FBEAgECoCDCEBIBAqAgghAiAQKgIEIQdDAAAAACEMQwAAAAAhJSAIKAIMIg9B/wFxBEAgAyAAIA9BAWtB/wFxs5SSEBkhJQsgD0EIdiIVQf8BcQRAIAMgACAVQQFrQf8BcbOUkhAZIQwLIDEgAZMhASAyIAKTIQIgMyAHkyEHIA9BEHYiD0H/AXENAUMAAAAADAILQQMgEkGEh8AAEDEACyADIAAgD0EBa0H/AXGzlJIQGQshKSAGIAeUIAUgApSSIAQgAZSSIiYgJpQgCyAHIAeUIAIgApSSIAEgAZSSICUgDJIgKZJDAABAQJUiASABlJOUkyIBQwAAAABdDQAgJowgAZGTIAuVIgEgMGBFIAEgL19Fcg0AIBEoAggiDyARKAIARgRAIBFBxIbAABApCyARKAIEIA9BAnRqIAE4AgAgESAPQQFqNgIICyAIIBJBAnRqIQggDiASayIODQALDAILIA4gF0Hch8AAEGIACyAAIAOTQwAAfkOVISwgCiEIA0AgDkEEIA5BBEkiDxshEgJAIAgtAAOzQwAAf0OVQ83MzD1dDQAgEEEEaiAIIBIQFwJ9AkAgD0UEQCAQKgIMIQAgECoCCCEBIBAqAgQhAkMAAAAAIQdDAAAAACELIAgoAgwiD0H/AXEEQCADICwgD0EBa0H/AXGzlJIQGSELCyAPQQh2IhVB/wFxBEAgAyAsIBVBAWtB/wFxs5SSEBkhBwsgMSAAkyEnIDIgAZMhLSAzIAKTIS4gD0EQdiIVQf8BcQ0BQwAAAAAMAgtBAyASQYSHwAAQMQALIAMgLCAVQQFrQf8BcbOUkhAZCyEMIAQgCCgCCCIVQRh1skMAAP5ClSIAIAUgD0EYdbJDAAD+QpUiAZQgBCAAlJMiKJQgFUEQdsCyQwAA/kKVIgIgBCAClCAGIAGUkyIqlJMgBiAAlCAFIAKUkyIrQwAAgD8gAiAClJMgACAAlJMgASABlJNDAAAAABBNkSIllJIiJiAmkpIhJiAFIAIgK5QgASAolJMgKiAllJIiKSApkpIhKSAGIAEgKpQgACArlJMgKCAllJIiKCAokpIhKCAnIAAgLSABlCAnIACUkyIqlCACICcgApQgLiABlJMiK5STIC4gAJQgLSAClJMiNCAllJIiJyAnkpIhJyAtIAIgNJQgASAqlJMgKyAllJIiAiACkpIhAiAuIAEgK5QgACA0lJMgKiAllJIiACAAkpIhAAJAIAwgCyAHEE0gDBBNQwrXIzyUIgFdRQRAIAEgB15FBEAgASALXkUEQEMAAIA/IAyVIgwgJ5QiASAMICaUIgyUQwAAgD8gC5UiCyAAlCIAIAsgKJQiC5RDAACAPyAHlSIHIAKUIgIgByAplCIHlJKSIiUgJZQgDCAMlCALIAuUIAcgB5SSkiIHIAEgAZQgACAAlCACIAKUkpJDAACAv5KUkyIAQwAAAABdDQQgJYwgAJGTIAeVIQAMAwsgKItDvTeGNV0NAyACICkgAIwgKJUiAJSSIAeVIgEgAZQgJyAmIACUkiAMlSIBIAGUkkMAAIA/XkUNAgwDCyApi0O9N4Y1XQ0CIAAgKCACjCAplSIAlJIgC5UiASABlCAnICYgAJSSIAyVIgEgAZSSQwAAgD9eDQIMAQsgJotDvTeGNV0NASAAICggJ4wgJpUiAJSSIAuVIgEgAZQgAiApIACUkiAHlSIBIAGUkkMAAIA/Xg0BCyAAIDBgRSAAIC9fRXINACARKAIIIg8gESgCAEYEQCARQdSGwAAQKQsgESgCBCAPQQJ0aiAAOAIAIBEgD0EBajYCCAsgCCASQQJ0aiEIIA4gEmsiDg0ACwsgECgCACIIQYQBTwRAIAgQKwsgFigCACIIIBQiDksNAAsgEygCAEEBagVBAAs2AgAgEEEQaiQADAILEDUACxA2AAsgDSgCRBANIQkQHSIIIAkmASANIAg2AkggDSgCQCERIA0oAkQhDiMAQSBrIgokACAYKAIAIhMlARAKIRQgCiAONgIEIAogFDYCAAJAIA4gFEYEQBBWIhQQTyIQJQEgESAOEAghCRAdIg4gCSYBIBRBhAFPBEAgFBArCyAQQYQBTwRAIBAQKwsgEyUBIA4lAUEAEAkgDkGEAU8EQCAOECsLIApBIGokAAwBCyAKQQA2AgggCiAKQQRqIApBCGoQPAALIA0oAjwiCgRAIA0oAkAgCkECdBBgCyANKAIsIgpBhAFPBEAgChArCyANQYABaiQAIAglASAIECsL+gECAn8BfiMAQRBrIgIkACACQQE7AQwgAiABNgIIIAIgADYCBCMAQRBrIgEkACACQQRqIgApAgAhBCABIAA2AgwgASAENwIEIwBBEGsiACQAIAFBBGoiASgCACICKAIMIQMCQAJAAkACQCACKAIEDgIAAQILIAMNAUEBIQJBACEDDAILIAMNACACKAIAIgIoAgQhAyACKAIAIQIMAQsgAEGAgICAeDYCACAAIAE2AgwgAEGsjsAAIAEoAgQgASgCCCIALQAIIAAtAAkQJwALIAAgAzYCBCAAIAI2AgAgAEGQjsAAIAEoAgQgASgCCCIALQAIIAAtAAkQJwALJAAgAEUEQEGMisAAQTIQYwALIAAgAiADIAQgBSABKAIQEQcACyIAIABFBEBBjIrAAEEyEGMACyAAIAIgAyAEIAEoAhARGAALIgAgAEUEQEGMisAAQTIQYwALIAAgAiADIAQgASgCEBEOAAsiACAARQRAQYyKwABBMhBjAAsgACACIAMgBCABKAIQERoACyIAIABFBEBBjIrAAEEyEGMACyAAIAIgAyAEIAEoAhARHAALIgAgAEUEQEGMisAAQTIQYwALIAAgAiADIAQgASgCEBEPAAslAQF/IAAoAgAiAUGAgICAeHJBgICAgHhHBEAgACgCBCABEGALCyAAIABFBEBBjIrAAEEyEGMACyAAIAIgAyABKAIQEQMACx4AIABFBEBBjIrAAEEyEGMACyAAIAIgASgCEBEAAAuvDwERfxAdIgMgASYBEB0iBCACJgEjAEEgayILJAAgCyAENgIIIAsgAzYCBCALIAA2AgAgCyALQQRqIgAoAgAQbDYCDCALIAtBCGo2AhwgCyALNgIYIAsgADYCFCALIAtBDGo2AhAgC0EQaiEAIwBB0ABrIgYkAAJAAkACQAJAAkBBAEGIhsAAKAIAEQQAIg8EQCAPKAIADQEgACgCDCERIAAoAgghCCAPQX82AgAgACgCBCAAKAIAKAIAIgUgD0EEaiIOIgQoAggiA0sEQCAFIAMiAGsiCSAEKAIAIABrSwRAIAQgACAJQQJBAhAmIAQoAgghAAsgBCgCBCIHIABBAXRqIQogCUECTwRAIAUgA0F/c2pBAXQiDARAIApBACAM/AsACyAAIAVqQQF0IANBAXRrIAdqQQJrIQogACAJakEBayEACyAKQQA7AQAgBCAAQQFqNgIICyAEKAIUIgMgBUkEQCAFIAMiAGsiCSAEKAIMIABrSwRAIARBDGogACAJQQRBBBAmIAQoAhQhAAsgBCgCECIHIABBAnRqIQogCUECTwRAIAUgA0F/c2pBAnQiDARAIApBACAM/AsACyAAIAVqQQJ0IANBAnRrIAdqQQRrIQogACAJakEBayEACyAKQQA2AgAgBCAAQQFqNgIUCyAEKAIgIgBBgPgBTQRAQYH4ASAAIgNrIgUgBCgCGCAAa0sEQCAEQRhqIAAgBUEEQQQQJiAEKAIgIQMLIAQoAhwiCiADQQJ0IglqIQUgAEGA+AFHBH9BgOAHIABBAnQiB2siDARAIAVBACAM/AsACyADIABrQYD4AWohAyAJIAdrIApqQYDgB2oFIAULQQA2AgAgBCADQQFqNgIgCygCACUBQQAgCCgCABALIQEQHSIAIAEmASAGIAA2AgggCCgCACIDIA8oAgwiAEsNAiAPKAIIIQojAEEgayIAJAAgACAGQQhqIgkoAgAQbCIENgIAIAAgAzYCBCADIARHBEAgAEEANgIIIAAgAEEEaiAAQQhqEDwACxBWIgQQTyIFJQEQASEBEB0iAyABJgEgBUGEAU8EQCAFECsLIAMlASAJKAIAJQEgCkEBdhACIANBhAFPBEAgAxArCyAEQYQBTwRAIAQQKwsgAEEgaiQAIAZBDGohECAIKAIAIQ1BACEFIwBBMGsiCCQAAkAgDigCCCIAIA1PBEAgDigCBCEAIA5BADYCICAOKAIYQYD4AU0EQCAOQRhqQQBBgfgBQQRBBBAmIA4oAiAhBQsgDigCHCIJIAVBAnRqIgNBAEGA4Af8CwAgDiAFQYH4AWoiDDYCICADQYDgB2pBADYCACANQQF0IQoCQCANBEAgCiEEIAAhAwNAIAMvAQAiB0GA+AFJBEAgByAMTw0DIAkgB0ECdGoiByAHKAIAQQFqNgIACyADQQJqIQMgBEECayIEDQALCyAJIAxBAnRqQQhrIgMoAgAhBCADQQA2AgAgCCAENgIEIAMgCUcEQCAFQQNxQQFHBEAgBUEBa0EDcSEHA0AgA0EEayIDKAIAIQUgAyAENgIAIAggBCAFaiIENgIEIAdBAWsiBw0ACwsgA0EQayEDA0AgA0EMaiIFKAIAIQcgBSAENgIAIAggBCAHaiIENgIEIANBCGoiBSgCACEHIAUgBDYCACAIIAQgB2oiBDYCBCADQQRqIgUoAgAhByAFIAQ2AgAgCCAEIAdqIgQ2AgQgAygCACEFIAMgBDYCACAIIAQgBWoiBDYCBCADIAlHIANBEGshAw0ACwsgDUUNAiAAIApqIRIgAEECaiEFIA1BAWtB/////wdxQQFqIQ0gDigCECETIA4oAhQhA0EAIQcDQCAALwEAIgBBgPgBSQRAAkAgACAMSQRAIAkgAEECdGoiACgCACIKIANJDQEgCiADQbyIwAAQMQALIAAgDEGsiMAAEDEACyATIApBAnRqIAc2AgAgACAAKAIAQQFqNgIACyAFIgAgEkdBAXQgAGohBSANIAdBAWoiB0cNAAsMAgsgByAMQcyIwAAQMQALIA0gAEHsh8AAEGIACwJAIAQgCSgCAEYEQCAQQYCAgIB4NgIAIBAgBDYCBAwBCyAIQQI2AgwgCEGciMAANgIIIAhCAjcCFCAIIAmtQoCAgIDQAIQ3AyggCCAIQQRqrUKAgICA0ACENwMgIAggCEEgajYCECAQIAhBCGoQGwsgCEEwaiQAIAYoAgxBgICAgHhHDQMgBigCECIARQ0FIAAgDygCGCIDSw0EIA8oAhQhBCAGIBFBACAAEGEiAzYCMCAGQTBqIAQgABAuIANBhAFJDQUgAxArDAULEDUACxA2AAsgAyAAQZSHwAAQYgALIAZBIGogBkEUaigCADYCACAGIAYpAgw3AxggBkEBNgI0IAZBtIfAADYCMCAGQgE3AjwgBiAGQRhqrUKAgICAwACENwNIIAYgBkHIAGo2AjggBkEkaiAGQTBqEC0gBigCKCAGKAIsEGMACyAAIANBpIfAABBiAAsgBigCCCIDQYQBTwRAIAMQKwsgDyAPKAIAQQFqNgIAIAZB0ABqJAAgCygCCCIDQYQBTwRAIAMQKwsgCygCBCIDQYQBTwRAIAMQKwsgC0EgaiQAIAALohABFX8QHSIKIAEmARAdIgMgAiYBIwBBIGsiDSQAIA0gAzYCCCANIAo2AgQgDSAANgIAIA0gDUEEaiIAKAIAEG02AgwgDSANQQhqNgIcIA0gDTYCGCANIAA2AhQgDSANQQxqNgIQIA1BEGohACMAQdAAayIIJAACQAJAAkACQAJAQQBBjIbAACgCABEEACIPBEAgDygCAA0BIAAoAgwhFiAAKAIIIQogACgCACEDIA9BfzYCACAAKAIEIQAgD0EEaiILIAMoAgAQEyAIIABBACAKKAIAEGE2AgggCigCACIAIA8oAgwiCUsNAiAIQQhqIA8oAgggABAzIAhBDGohFSADKAIAIQAgCigCACETIwBBMGsiDiQAIAsgABATAkAgCygCCCIAIBNPBEAgCygCBCEKIAsoAhwhAwJAIAsoAiAiDEUNACAMQQJ0IgBFDQAgA0EAIAD8CwALIAsoAighFAJAIAsoAiwiEEUNACAQQQJ0IgBFDQAgFEEAIAD8CwALIBNBAnQhCSATBEAgCSEEIAohAANAAkAgACgCACIGQYCAgPwHTw0AIAwgBkF/cyIFQf//A3EiBksEQCADIAZBAnRqIgYgBigCAEEBajYCACAQIAVBEHYiBksEQCAUIAZBAnRqIgYgBigCAEEBajYCAAwCCyAGIBBB3InAABAxAAsgBiAMQcyJwAAQMQALIABBBGohACAEQQRrIgQNAAsLAkAgDEUEQEEAIQQMAQsgDEEBa0H/////A3EiAEEBaiIEQQdxIQUCQCAAQQdJBEBBACEEIAMhAAwBCyAEQfj///8HcSEGQQAhBCADIQADQCAAKAIAIQcgACAENgIAIABBBGoiESgCACESIBEgBCAHaiIENgIAIABBCGoiBygCACERIAcgBCASaiIENgIAIABBDGoiBygCACESIAcgBCARaiIENgIAIABBEGoiBygCACERIAcgBCASaiIENgIAIABBFGoiBygCACESIAcgBCARaiIENgIAIABBGGoiBygCACERIAcgBCASaiIENgIAIABBHGoiBygCACESIAcgBCARaiIENgIAIAQgEmohBCAAQSBqIQAgBkEIayIGDQALCyAFRQ0AA0AgACgCACEGIAAgBDYCACAAQQRqIQAgBCAGaiEEIAVBAWsiBQ0ACwsgDiAENgIEIBMEQCAJIApqIREgCkEEaiEGIBNBAWtB/////wNxQQFqIRIgCygCNCEXIAsoAjghB0EAIQUgCiEJA0AgBiEAAkAgCSgCACIJQYCAgPwHTw0AAkAgDCAJQX9zQf//A3EiCUsEQCADIAlBAnRqIgkoAgAiBiAHTw0BIBcgBkECdGogBTYCACAJIAkoAgBBAWo2AgAMAgsgCSAMQayJwAAQMQALIAYgB0G8icAAEDEACyAAIAAgEUdBAnRqIQYgACEJIBIgBUEBaiIFRw0ACwsCQCAQRQ0AIBBBAWtB/////wNxIgNBAWoiCUEHcSEGQQAhBSAUIQAgA0EHTwRAIAlB+P///wdxIQkDQCAAKAIAIQMgACAFNgIAIABBBGoiDCgCACEHIAwgAyAFaiIDNgIAIABBCGoiBSgCACEMIAUgAyAHaiIDNgIAIABBDGoiBSgCACEHIAUgAyAMaiIDNgIAIABB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uIvAACABEBgLDAAgACABKQIANwMACw0AIABB0I7AACABEBgLDQAgAUHIjsAAQQUQUQsZACAAIAFBkJbAACgCACIAQRQgABsRAQAACw0AIAFBpJDAAEEYEBYLoAIBA38gACgCACEAIwBBkAFrIgMkAAJ/AkAgASgCCCICQYCAgBBxRQRAIAJBgICAIHENASADQQhqIAAoAgAgA0EQahAfIAFBAUEAIAMoAgggAygCDBAUDAILIAAoAgAhAkEAIQADQCAAIANqQY8BaiACQQ9xIgRBMHIgBEHXAGogBEEKSRs6AAAgAEEBayEAIAJBD0sgAkEEdiECDQALIAFBt5LAAEECIAAgA2pBkAFqQQAgAGsQFAwBCyAAKAIAIQJBACEAA0AgACADakGPAWogAkEPcSIEQTByIARBN2ogBEEKSRs6AAAgAEEBayEAIAJBD0sgAkEEdiECDQALIAFBt5LAAEECIAAgA2pBkAFqQQAgAGsQFAsgA0GQAWokAAsJACAAQQA2AgALCAAgACUBEAMLCAAgACUBEAcLC/UUAwBBgIDAAAuhD3NwYXJrLWludGVybmFsLXJzL3NyYy9yYXljYXN0LnJzAHNwYXJrLWludGVybmFsLXJzL3NyYy9zb3J0LnJzAGxpYnJhcnkvYWxsb2Mvc3JjL2ZtdC5ycwAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93YXNtLWJpbmRnZW4tMC4yLjEwMC9zcmMvY29udmVydC9zbGljZXMucnMAL3J1c3RjLzI5NDgzODgzZWVkNjlkNWZiNGRiMDE5NjRjZGYyYWY0ZDg2ZTljYjIvbGlicmFyeS9zdGQvc3JjL3RocmVhZC9sb2NhbC5ycwBsaWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMAL3J1c3RjLzI5NDgzODgzZWVkNjlkNWZiNGRiMDE5NjRjZGYyYWY0ZDg2ZTljYjIvbGlicmFyeS9hbGxvYy9zcmMvc2xpY2UucnMAL3J1c3RjLzI5NDgzODgzZWVkNjlkNWZiNGRiMDE5NjRjZGYyYWY0ZDg2ZTljYjIvbGlicmFyeS9hbGxvYy9zcmMvcmF3X3ZlYy9tb2QucnMAL3J1c3QvZGVwcy9kbG1hbGxvYy0wLjIuOS9zcmMvZGxtYWxsb2MucnMAbGlicmFyeS9zdGQvc3JjL2FsbG9jLnJzAHNwYXJrLWludGVybmFsLXJzL3NyYy9saWIucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvanMtc3lzLTAuMy43Ny9zcmMvbGliLnJzAC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL29uY2VfY2VsbC0xLjIxLjMvc3JjL2xpYi5ycwAAAHwBEABRAAAALgIAABEAAAAQAhAAHQAAABEAAAA9AAAAAQAAAAIAAAADAAAAxQAQAFAAAAAZAQAAGQAAAMUAEABQAAAAGAIAACYAAAAxARAASwAAAMEBAAAdAAAAAAAQACEAAAAqAAAAFwAAAAAAEAAhAAAAeAAAABcAAAAAABAAIQAAAH4AAAAcAAAAAAAQACEAAACAAAAAHAAAAAAAEAAhAAAAhQAAACAAAAAQAhAAHQAAAB0AAAAzAAAAEAIQAB0AAAAoAAAALQAAAAEAAAAAAAAAEAIQAB0AAAA6AAAAMwAAABACEAAdAAAARQAAAC0AAAAQAhAAHQAAAF4AAAAoAAAAIQAQAB4AAAAbAAAAHQAAAEV4cGVjdGVkICBhY3RpdmUgc3BsYXRzIGJ1dCBnb3Qg/AMQAAkAAAAFBBAAFwAAACEAEAAeAAAAMwAAAB0AAAAhABAAHgAAADMAAAAVAAAAIQAQAB4AAAAkAAAAFAAAACEAEAAeAAAAdAAAABkAAAAhABAAHgAAAKcAAAATAAAAIQAQAB4AAACfAAAAEwAAACEAEAAeAAAAogAAAB0AAAAhABAAHgAAAKIAAAARAAAAIQAQAB4AAACQAAAAIAAAACEAEAAeAAAAkAAAABQAAAAhABAAHgAAAHwAAAAYAAAAIQAQAB4AAAB9AAAAGAAAAC0CEABbAAAA+xgAAAEAAABYABAAbQAAACQBAAAOAAAAY2xvc3VyZSBpbnZva2VkIHJlY3Vyc2l2ZWx5IG9yIGFmdGVyIGJlaW5nIGRyb3BwZWRMYXp5IGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWQ+BRAAKgAAAIgCEABeAAAACAMAABkAAAByZWVudHJhbnQgaW5pdAAAgAUQAA4AAACIAhAAXgAAAHoCAAANAAAAfAEQAFEAAAAuAgAAEQAAABUAAAAMAAAABAAAABYAAAAXAAAAGAAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplID49IHNpemUgKyBtaW5fb3ZlcmhlYWQAAM0BEAAqAAAAsAQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAADNARAAKgAAALYEAAANAAAAQWNjZXNzRXJyb3JjYW5ub3QgYWNjZXNzIGEgVGhyZWFkIExvY2FsIFN0b3JhZ2UgdmFsdWUgZHVyaW5nIG9yIGFmdGVyIGRlc3RydWN0aW9uOiAAWwYQAEgAAABtZW1vcnkgYWxsb2NhdGlvbiBvZiAgYnl0ZXMgZmFpbGVkAACsBhAAFQAAAMEGEAANAAAA9wEQABkAAABkAQAACQAAABUAAAAMAAAABAAAABkAAAAAAAAACAAAAAQAAAAaAAAAAAAAAAgAAAAEAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAQAAAABAAAACAAAAAhAAAAIgAAACMAAABFcnJvcgAAACQAAAAMAAAABAAAACUAAAAmAAAAJwAAAGNhcGFjaXR5IG92ZXJmbG93AAAAaAcQABEAAACsARAAIQAAAC4CAAARAAAAFQEQABwAAADoAQAAFwBBrI/AAAu4BQEAAAAoAAAAYSBmb3JtYXR0aW5nIHRyYWl0IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yIHdoZW4gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGRpZCBub3QAAD8AEAAZAAAAigIAAA4AAAABAAAAAAAAAFJlZkNlbGwgYWxyZWFkeSBib3Jyb3dlZGluZGV4IG91dCBvZiBib3VuZHM6IHRoZSBsZW4gaXMgIGJ1dCB0aGUgaW5kZXggaXMgAAA8CBAAIAAAAFwIEAASAAAAAAAAAAQAAAAEAAAALQAAAD09IT1tYXRjaGVzYXNzZXJ0aW9uIGBsZWZ0ICByaWdodGAgZmFpbGVkCiAgbGVmdDogCiByaWdodDogAJsIEAAQAAAAqwgQABcAAADCCBAACQAAACByaWdodGAgZmFpbGVkOiAKICBsZWZ0OiAAAACbCBAAEAAAAOQIEAAQAAAA9AgQAAkAAADCCBAACQAAADogAAABAAAAAAAAACAJEAACAAAAfSB9MHgwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OSBvdXQgb2YgcmFuZ2UgZm9yIHNsaWNlIG9mIGxlbmd0aCByYW5nZSBlbmQgaW5kZXggACMKEAAQAAAAAQoQACIAAACQCBAAkggQAJQIEAACAAAAAgAAAAcAAAAAAAA/AAAAvwBB/JTAAAsBEgB8CXByb2R1Y2VycwIIbGFuZ3VhZ2UBBFJ1c3QADHByb2Nlc3NlZC1ieQMFcnVzdGMdMS44OS4wICgyOTQ4Mzg4M2UgMjAyNS0wOC0wNCkGd2FscnVzBjAuMjMuMwx3YXNtLWJpbmRnZW4TMC4yLjEwMCAoMjQwNWVjMmI0KQBrD3RhcmdldF9mZWF0dXJlcwYrD211dGFibGUtZ2xvYmFscysTbm9udHJhcHBpbmctZnB0b2ludCsLYnVsay1tZW1vcnkrCHNpZ24tZXh0Kw9yZWZlcmVuY2UtdHlwZXMrCm11bHRpdmFsdWU=", import.meta.url)); const A = Zo(); (typeof t == "string" || typeof Request == "function" && t instanceof Request || typeof URL == "function" && t instanceof URL) && (t = fetch(t)); const { instance: e, module: s } = await Po(await t, A); return Xo(e, s); } const UA = -12, GA = 9, Oo = Math.exp(UA), jo = Math.exp(GA), Rs = -30, ut = Math.exp(Rs), Oe = 11, je = 11, Ys = 11, Wo = Oe + je, Z = 1 << Oe, KA = 1 << je, Js = 1 << Ys, We = 1, Ac = Z - 1, tc = KA - 1, ec = Js - 1, sc = !0, nc = !0, Lh = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, LN_SCALE_MAX: GA, LN_SCALE_MIN: UA, LN_SCALE_ZERO: Rs, SCALE_MAX: jo, SCALE_MIN: Oo, SCALE_ZERO: ut, SPLAT_TEX_DEPTH: Js, SPLAT_TEX_DEPTH_BITS: Ys, SPLAT_TEX_DEPTH_MASK: ec, SPLAT_TEX_HEIGHT: KA, SPLAT_TEX_HEIGHT_BITS: je, SPLAT_TEX_HEIGHT_MASK: tc, SPLAT_TEX_LAYER_BITS: Wo, SPLAT_TEX_MIN_HEIGHT: We, SPLAT_TEX_WIDTH: Z, SPLAT_TEX_WIDTH_BITS: Oe, SPLAT_TEX_WIDTH_MASK: Ac, USE_COMPILED_PARSER_FUNCTION: nc, WASM_SPLAT_SORT: sc }, Symbol.toStringTag, { value: "Module" })); function ft(t) { return t === "bool" || t === "bvec2" || t === "bvec3" || t === "bvec4"; } function dt(t) { return t === "int" || t === "uint" || t === "float"; } function EA(t) { return t === "int" || t === "ivec2" || t === "ivec3" || t === "ivec4"; } function QA(t) { return t === "uint" || t === "uvec2" || t === "uvec3" || t === "uvec4"; } function Pt(t) { return t === "float" || t === "vec2" || t === "vec3" || t === "vec4"; } function _s(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 ot(t) { return Pt(t) || _s(t); } function Nt(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 ic(t) { return Nt(t) || kt(t) || Zt(t); } function ct(t) { return t === "mat2" || t === "mat2x2"; } function gt(t) { return t === "mat3" || t === "mat3x3"; } function lt(t) { return t === "mat4" || t === "mat4x4"; } function Ls(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 zs(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 rc(t) { if (dt(t)) return "float"; if (Nt(t)) return "vec2"; if (kt(t)) return "vec3"; if (Zt(t)) return "vec4"; throw new Error(`Invalid vector type: ${t}`); } function Hs(t) { if (dt(t)) return "uint"; if (Nt(t)) return "uvec2"; if (kt(t)) return "uvec3"; if (Zt(t)) return "uvec4"; throw new Error(`Invalid vector type: ${t}`); } function ac(t) { if (dt(t)) return "int"; if (Nt(t)) return "ivec2"; if (kt(t)) return "ivec3"; if (Zt(t)) return "ivec4"; throw new Error(`Invalid vector type: ${t}`); } function qs(t) { if (typeof t == "string") return t; if (typeof t == "object" && t.type) return t.type; throw new Error(`Invalid DynoType: ${String(t)}`); } function rA(t) { return Math.trunc(t).toString(); } function aA(t) { return `${Math.max(0, Math.trunc(t)).toString()}u`; } function H(t) { return t === Number.POSITIVE_INFINITY ? "INFINITY" : t === Number.NEGATIVE_INFINITY ? "-INFINITY" : Number.isInteger(t) ? t.toFixed(1) : t.toString(); } function $(t) { return t instanceof rt ? t.type : t.dynoOut().type; } class rt { constructor(A) { this.__isDynoValue = !0, this.type = A; } } class K extends rt { constructor(A, e) { super(A.outTypes[e]), this.dyno = A, this.key = e; } } class vt extends rt { constructor(A, e) { super(A), this.literal = e; } getLiteral() { return this.literal; } } function ae(t, A) { return new vt(t, A); } class Ks extends vt { 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 aA(e); case "int": return rA(e); case "float": return H(e); case "bvec2": { const s = e; return `bvec2(${s[0]}, ${s[1]})`; } case "uvec2": { if (e instanceof I.Vector2) return `uvec2(${aA(e.x)}, ${aA(e.y)})`; const s = e; return `uvec2(${aA(s[0])}, ${aA(s[1])})`; } case "ivec2": { if (e instanceof I.Vector2) return `ivec2(${rA(e.x)}, ${rA(e.y)})`; const s = e; return `ivec2(${rA(s[0])}, ${rA(s[1])})`; } case "vec2": { if (e instanceof I.Vector2) return `vec2(${H(e.x)}, ${H(e.y)})`; const s = e; return `vec2(${H(s[0])}, ${H(s[1])})`; } case "bvec3": { const s = e; return `bvec3(${s[0]}, ${s[1]}, ${s[2]})`; } case "uvec3": { if (e instanceof I.Vector3) return `uvec3(${aA(e.x)}, ${aA(e.y)}, ${aA(e.z)})`; const s = e; return `uvec3(${aA(s[0])}, ${aA(s[1])}, ${aA(s[2])})`; } case "ivec3": { if (e instanceof I.Vector3) return `ivec3(${rA(e.x)}, ${rA(e.y)}, ${rA(e.z)})`; const s = e; return `ivec3(${rA(s[0])}, ${rA(s[1])}, ${rA(s[2])})`; } case "vec3": { if (e instanceof I.Vector3) return `vec3(${H(e.x)}, ${H(e.y)}, ${H(e.z)})`; const s = e; return `vec3(${H(s[0])}, ${H(s[1])}, ${H(s[2])})`; } case "bvec4": { const s = e; return `bvec4(${s[0]}, ${s[1]}, ${s[2]}, ${s[3]})`; } case "uvec4": { if (e instanceof I.Vector4) return `uvec4(${aA(e.x)}, ${aA(e.y)}, ${aA(e.z)}, ${aA(e.w)})`; const s = e; return `uvec4(${aA(s[0])}, ${aA(s[1])}, ${aA(s[2])}, ${aA(s[3])})`; } case "ivec4": { if (e instanceof I.Vector4) return `ivec4(${rA(e.x)}, ${rA(e.y)}, ${rA(e.z)}, ${rA(e.w)})`; const s = e; return `ivec4(${rA(s[0])}, ${rA(s[1])}, ${rA(s[2])}, ${rA(s[3])})`; } case "vec4": { if (e instanceof I.Vector4) return `vec4(${H(e.x)}, ${H(e.y)}, ${H(e.z)}, ${H(e.w)})`; if (e instanceof I.Quaternion) return `vec4(${H(e.x)}, ${H(e.y)}, ${H(e.z)}, ${H(e.w)})`; const s = e; return `vec4(${H(s[0])}, ${H(s[1])}, ${H(s[2])}, ${H(s[3])})`; } case "mat2": case "mat2x2": { const s = e, n = s instanceof I.Matrix2 ? s.elements : e, i = new Array(4).fill(0).map((r, a) => H(n[a])); return `${A}(${i.join(", ")})`; } case "mat2x3": { const s = e, n = new Array(6).fill(0).map((i, r) => H(s[r])); return `${A}(${n.join(", ")})`; } case "mat2x4": { const s = e, n = new Array(8).fill(0).map((i, r) => H(s[r])); return `${A}(${n.join(", ")})`; } case "mat3": case "mat3x3": { const s = e, n = s instanceof I.Matrix3 ? s.elements : e, i = new Array(9).fill(0).map((r, a) => H(n[a])); return `${A}(${i.join(", ")})`; } case "mat3x2": { const s = e, n = new Array(6).fill(0).map((i, r) => H(s[r])); return `${A}(${n.join(", ")})`; } case "mat3x4": { const s = e, n = new Array(12).fill(0).map((i, r) => H(s[r])); return `${A}(${n.join(", ")})`; } case "mat4": case "mat4x4": { const s = e, n = s instanceof I.Matrix4 ? s.elements : e, i = new Array(16).fill(0).map((r, a) => H(n[a])); return `${A}(${i.join(", ")})`; } case "mat4x2": { const s = e, n = new Array(8).fill(0).map((i, r) => H(s[r])); return `${A}(${n.join(", ")})`; } case "mat4x3": { const s = e, n = new Array(12).fill(0).map((i, r) => H(s[r])); return `${A}(${n.join(", ")})`; } default: throw new Error(`Type not implemented: ${String(A)}`); } } } function J(t, A) { return new Ks(t, A); } function Jt(t) { const A = String(t); if (ft(t)) return `${A}(false)`; if (ot(t)) return `${A}(0.0)`; if (EA(t)) return `${A}(0)`; if (QA(t)) return `${A}(0u)`; throw new Error(`Type not implemented: ${A}`); } function oc(t) { const A = String(t); if (ft(t)) return `${A}(true)`; if (ot(t)) return `${A}(1.0)`; if (EA(t)) return `${A}(1)`; if (QA(t)) return `${A}(1u)`; throw new Error(`Type not implemented: ${A}`); } function cc(t) { const A = String(t); if (ft(t)) return `${A}(true)`; if (ot(t)) return `${A}(-1.0)`; if (EA(t)) return `${A}(-1)`; if (QA(t)) return `${A}(0xFFFFFFFFu)`; throw new Error(`Type not implemented: ${A}`); } const Bs = " "; class $s { constructor({ indent: A } = {}) { this.globals = /* @__PURE__ */ new Set(), this.statements = [], this.uniforms = {}, this.declares = /* @__PURE__ */ new Set(), this.updaters = [], this.sequence = 0, this.indent = Bs, this.indent = A ?? Bs; } nextSequence() { return this.sequence++; } } class V { constructor({ inTypes: A, outTypes: e, inputs: s, update: n, globals: i, statements: r, generate: a }) { this.inTypes = A ?? {}, this.outTypes = e ?? {}, this.inputs = s ?? {}, this.update = n, this.globals = i, this.statements = r, this.generate = a ?? (({ inputs: o, outputs: g, compile: l }) => { var c, u; return { globals: (c = this.globals) == null ? void 0 : c.call(this, { inputs: o, outputs: g, compile: l }), statements: (u = this.statements) == null ? void 0 : u.call(this, { inputs: o, outputs: g, compile: l }) }; }); } get outputs() { const A = {}; for (const e in this.outTypes) A[e] = new K(this, e); return A; } apply(A) { return Object.assign(this.inputs, A), this.outputs; } compile({ inputs: A, outputs: e, compile: s }) { const n = [ `// ${this.constructor.name}(${Object.values(A).join(", ")}) => (${Object.values(e).join(", ")})` ], i = []; for (const g in e) { const l = e[g]; l && !s.declares.has(l) && (s.declares.add(l), i.push(g)); } const { globals: r, statements: a, uniforms: o } = this.generate({ inputs: A, outputs: e, compile: s }); for (const g of r ?? []) s.globals.add(g); for (const g in o) s.uniforms[g] = o[g]; this.update && s.updaters.push(this.update); for (const g of i) { const l = e[g]; l && (s.uniforms[l] || n.push(`${As(l, this.outTypes[g])};`)); } return a != null && a.length && (n.push("{"), n.push(...a.map((g) => s.indent + g)), n.push("}")), n; } } class PA extends V { constructor({ inTypes: A, outTypes: e, inputs: s, update: n, globals: i, construct: r }) { super({ inTypes: A, outTypes: e, inputs: s, update: n, globals: i, generate: (a) => this.generateBlock(a) }), this.construct = r; } generateBlock({ inputs: A, outputs: e, compile: s }) { var E, C; const n = {}, i = {}; for (const B in A) A[B] != null && (n[B] = new vt(this.inTypes[B], A[B])); for (const B in e) e[B] != null && (i[B] = new rt(this.outTypes[B])); const r = { roots: [] }, a = this.construct(n, i, r); for (const B of ((E = this.globals) == null ? void 0 : E.call(this, { inputs: A, outputs: e, compile: s })) ?? []) s.globals.add(B); const o = [], g = /* @__PURE__ */ new Map(); function l(B, Q, p) { let f = g.get(B); if (!f) { f = { sequence: s.nextSequence(), outNames: /* @__PURE__ */ new Map(), newOuts: /* @__PURE__ */ new Set() }, g.set(B, f); for (const d in B.inputs) { let w = B.inputs[d]; for (; w; ) { if (w instanceof rt) { w instanceof K && l(w.dyno, w.key); break; } w = w.dynoOut(); } } o.push(B); } Q && (p || f.newOuts.add(Q), f.outNames.set(Q, p ?? `${Q}_${f.sequence}`)); } for (const B of r.roots) l(B); for (const B in i) { let Q = (a == null ? void 0 : a[B]) ?? i[B]; for (; Q; ) { if (Q instanceof rt) { Q instanceof K && l(Q.dyno, Q.key, e[B]); break; } Q = Q.dynoOut(); } i[B] = Q; } const c = []; for (const B of o) { const Q = {}, p = {}; for (const w in B.inputs) { let D = B.inputs[w]; for (; D; ) { if (D instanceof rt) { if (D instanceof vt) Q[w] = D.getLiteral(); else if (D instanceof K) { const x = (C = g.get(D.dyno)) == null ? void 0 : C.outNames.get(D.key); if (!x) throw new Error( `Source not found for ${D.dyno.constructor.name}.${D.key}` ); Q[w] = x; } break; } D = D.dynoOut(); } } const f = g.get(B) ?? { outNames: /* @__PURE__ */ new Map() }; for (const [w, D] of f.outNames.entries()) p[w] = D; const d = B.compile({ inputs: Q, outputs: p, compile: s }); c.push(d); } const u = []; for (const B in e) i[B] instanceof vt && u.push( `${e[B]} = ${i[B].getLiteral()};` ); return u.length > 0 && c.push(u), { statements: c.flatMap((B, Q) => Q === 0 ? B : ["", ...B]) }; } } function vA(t, A, e, { update: s, globals: n } = {}) { return new PA({ inTypes: t, outTypes: A, construct: e, update: s, globals: n }); } function Xt({ inTypes: t, outTypes: A, inputs: e, update: s, globals: n, statements: i, generate: r }) { return new V({ inTypes: t, outTypes: A, inputs: e, update: s, globals: n, statements: i, generate: r }); } function As(t, A, e) { const s = typeof A == "string" ? A : A.type; if (!s) throw new Error(`Invalid DynoType: ${String(A)}`); return `${s} ${t}${e != null ? `[${e}]` : ""}`; } function RA(t) { var i; let A = !1; const e = t.split(` `).map((r) => { const a = r.trimEnd(); return A ? a : a.length > 0 ? (A = !0, a) : null; }).filter((r) => r != null); for (; e.length > 0 && e[e.length - 1].length === 0; ) e.pop(); if (e.length === 0) return []; const s = (i = e[0].match(/^\s*/)) == null ? void 0 : i[0]; if (!s) return e; const n = new RegExp(`^${s}`); return e.map((r) => r.replace(n, "")); } function hA(t) { return RA(t).join(` `); } class v extends V { constructor({ a: A, outKey: e, outTypeFunc: s }) { const n = { a: $(A) }, i = s($(A)), r = { [e]: i }; super({ inTypes: n, outTypes: r, inputs: { a: A } }), this.outKey = e; } dynoOut() { return new K(this, this.outKey); } } class tA extends V { constructor({ a: A, b: e, outKey: s, outTypeFunc: n }) { const i = { a: $(A), b: $(e) }, r = n($(A), $(e)), a = { [s]: r }; super({ inTypes: i, outTypes: a, inputs: { a: A, b: e } }), this.outKey = s; } dynoOut() { return new K(this, this.outKey); } } class yt extends V { constructor({ a: A, b: e, c: s, outKey: n, outTypeFunc: i }) { const r = { a: $(A), b: $(e), c: $(s) }, a = i($(A), $(e), $(s)), o = { [n]: a }; super({ inTypes: r, outTypes: o, inputs: { a: A, b: e, c: s } }), this.outKey = n; } dynoOut() { return new K(this, this.outKey); } } const AA = { type: "Gsplat" }, Ot = { type: "PackedSplats" }, gc = (t) => new Ps({ packedSplats: t }), bt = (t, A) => new Xs({ packedSplats: t, index: A }), Vs = (t, A, e, s) => new Os({ packedSplats: t, index: A, base: e, count: s }), ht = (t) => new js({ gsplat: t }), at = ({ gsplat: t, flags: A, index: e, center: s, scales: n, quaternion: i, rgba: r, rgb: a, opacity: o, x: g, y: l, z: c, r: u, g: h, b: E }) => new Ws({ gsplat: t, flags: A, index: e, center: s, scales: n, quaternion: i, rgba: r, rgb: a, opacity: o, x: g, y: l, z: c, r: u, g: h, b: E }), Ge = (t) => new tn({ gsplat: t }), ts = (t, { scale: A, rotate: e, translate: s, recolor: n }) => new en({ gsplat: t, scale: A, rotate: e, translate: s, recolor: n }), bA = hA(` 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; } `), Ee = hA(` struct PackedSplats { usampler2DArray texture; int numSplats; vec4 rgbMinMaxLnScaleMinMax; }; `); class Ps extends v { constructor({ packedSplats: A }) { super({ a: A, outKey: "numSplats", outTypeFunc: () => "int" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.numSplats} = ${e.a}.numSplats;` ]; } } const Zs = hA(` bool readPackedSplat(usampler2DArray texture, int numSplats, vec4 rgbMinMaxLnScaleMinMax, int index, out Gsplat gsplat) { if ((index >= 0) && (index < numSplats)) { uvec4 packed = texelFetch(texture, splatTexCoord(index), 0); unpackSplatEncoding(packed, gsplat.center, gsplat.scales, gsplat.quaternion, gsplat.rgba, rgbMinMaxLnScaleMinMax); return true; } else { return false; } } `); class Xs extends V { constructor({ packedSplats: A, index: e }) { super({ inTypes: { packedSplats: Ot, index: "int" }, outTypes: { gsplat: AA }, inputs: { packedSplats: A, index: e }, globals: () => [bA, Ee, Zs], statements: ({ inputs: s, outputs: n }) => { const { gsplat: i } = n; if (!i) return []; const { packedSplats: r, index: a } = s; let o; return r && a ? o = RA(` if (readPackedSplat(${r}.texture, ${r}.numSplats, ${r}.rgbMinMaxLnScaleMinMax, ${a}, ${i})) { bool zeroSize = all(equal(${i}.scales, vec3(0.0, 0.0, 0.0))); ${i}.flags = zeroSize ? 0u : GSPLAT_FLAG_ACTIVE; } else { ${i}.flags = 0u; } `) : o = [`${i}.flags = 0u;`], o.push(`${i}.index = ${a ?? "0"};`), o; } }); } dynoOut() { return new K(this, "gsplat"); } } class Os extends V { constructor({ packedSplats: A, index: e, base: s, count: n }) { super({ inTypes: { packedSplats: Ot, index: "int", base: "int", count: "int" }, outTypes: { gsplat: AA }, inputs: { packedSplats: A, index: e, base: s, count: n }, globals: () => [bA, Ee, Zs], statements: ({ inputs: i, outputs: r }) => { const { gsplat: a } = r; if (!a) return []; const { packedSplats: o, index: g, base: l, count: c } = i; let u; return o && g && l && c ? u = RA(` ${a}.flags = 0u; if ((${g} >= ${l}) && (${g} < (${l} + ${c}))) { if (readPackedSplat(${o}.texture, ${o}.numSplats, ${o}.rgbMinMaxLnScaleMinMax, ${g}, ${a})) { bool zeroSize = all(equal(${a}.scales, vec3(0.0, 0.0, 0.0))); ${a}.flags = zeroSize ? 0u : GSPLAT_FLAG_ACTIVE; } } `) : u = [`${a}.flags = 0u;`], u.push(`${a}.index = ${g ?? "0"};`), u; } }); } dynoOut() { return new K(this, "gsplat"); } } class js extends V { constructor({ gsplat: A }) { super({ inTypes: { gsplat: AA }, 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: () => [bA], statements: ({ inputs: e, outputs: s }) => { const { gsplat: n } = e, { flags: i, active: r, index: a, center: o, scales: g, quaternion: l, rgba: c, rgb: u, opacity: h, x: E, y: C, z: B, r: Q, g: p, b: f } = s; return [ i ? `${i} = ${n ? `${n}.flags` : "0u"};` : null, r ? `${r} = isGsplatActive(${n ? `${n}.flags` : "0u"});` : null, a ? `${a} = ${n ? `${n}.index` : "0"};` : null, o ? `${o} = ${n ? `${n}.center` : "vec3(0.0, 0.0, 0.0)"};` : null, g ? `${g} = ${n ? `${n}.scales` : "vec3(0.0, 0.0, 0.0)"};` : null, l ? `${l} = ${n ? `${n}.quaternion` : "vec4(0.0, 0.0, 0.0, 1.0)"};` : null, c ? `${c} = ${n ? `${n}.rgba` : "vec4(0.0, 0.0, 0.0, 0.0)"};` : null, u ? `${u} = ${n ? `${n}.rgba.rgb` : "vec3(0.0, 0.0, 0.0)"};` : null, h ? `${h} = ${n ? `${n}.rgba.a` : "0.0"};` : null, E ? `${E} = ${n ? `${n}.center.x` : "0.0"};` : null, C ? `${C} = ${n ? `${n}.center.y` : "0.0"};` : null, B ? `${B} = ${n ? `${n}.center.z` : "0.0"};` : null, Q ? `${Q} = ${n ? `${n}.rgba.r` : "0.0"};` : null, p ? `${p} = ${n ? `${n}.rgba.g` : "0.0"};` : null, f ? `${f} = ${n ? `${n}.rgba.b` : "0.0"};` : null ].filter(Boolean); } }); } } class Ws extends V { constructor({ gsplat: A, flags: e, index: s, center: n, scales: i, quaternion: r, rgba: a, rgb: o, opacity: g, x: l, y: c, z: u, r: h, g: E, b: C }) { super({ inTypes: { gsplat: AA, 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: AA }, inputs: { gsplat: A, flags: e, index: s, center: n, scales: i, quaternion: r, rgba: a, rgb: o, opacity: g, x: l, y: c, z: u, r: h, g: E, b: C }, globals: () => [bA], statements: ({ inputs: B, outputs: Q }) => { const { gsplat: p } = Q; if (!p) return []; const { gsplat: f, flags: d, index: w, center: D, scales: x, quaternion: y, rgba: m, rgb: k, opacity: M, x: S, y: U, z: F, r: b, g: T, b: R } = B; return [ `${p}.flags = ${d ?? (f ? `${f}.flags` : "0u")};`, `${p}.index = ${w ?? (f ? `${f}.index` : "0")};`, `${p}.center = ${D ?? (f ? `${f}.center` : "vec3(0.0, 0.0, 0.0)")};`, `${p}.scales = ${x ?? (f ? `${f}.scales` : "vec3(0.0, 0.0, 0.0)")};`, `${p}.quaternion = ${y ?? (f ? `${f}.quaternion` : "vec4(0.0, 0.0, 0.0, 1.0)")};`, `${p}.rgba = ${m ?? (f ? `${f}.rgba` : "vec4(0.0, 0.0, 0.0, 0.0)")};`, k ? `${p}.rgba.rgb = ${k};` : null, M ? `${p}.rgba.a = ${M};` : null, S ? `${p}.center.x = ${S};` : null, U ? `${p}.center.y = ${U};` : null, F ? `${p}.center.z = ${F};` : null, b ? `${p}.rgba.r = ${b};` : null, T ? `${p}.rgba.g = ${T};` : null, R ? `${p}.rgba.b = ${R};` : null ].filter(Boolean); } }); } dynoOut() { return new K(this, "gsplat"); } } const An = hA(` 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 tn extends v { constructor({ gsplat: A }) { super({ a: A, outKey: "normal", outTypeFunc: () => "vec3" }), this.globals = () => [bA, An], this.statements = ({ inputs: e, outputs: s }) => [ `${s.normal} = gsplatNormal(${e.a}.scales, ${e.a}.quaternion);` ]; } } class en extends V { constructor({ gsplat: A, scale: e, rotate: s, translate: n, recolor: i }) { super({ inTypes: { gsplat: AA, scale: "float", rotate: "vec4", translate: "vec3", recolor: "vec4" }, outTypes: { gsplat: AA }, inputs: { gsplat: A, scale: e, rotate: s, translate: n, recolor: i }, globals: () => [bA], statements: ({ inputs: r, outputs: a, compile: o }) => { const { gsplat: g } = a; if (!g || !r.gsplat) return []; const { scale: l, rotate: c, translate: u, recolor: h } = r, E = o.indent; return [ `${g} = ${r.gsplat};`, `if (isGsplatActive(${g}.flags)) {`, l ? `${E}${g}.center *= ${l};` : null, c ? `${E}${g}.center = quatVec(${c}, ${g}.center);` : null, u ? `${E}${g}.center += ${u};` : null, l ? `${E}${g}.scales *= ${l};` : null, c ? `${E}${g}.quaternion = quatQuat(${c}, ${g}.quaternion);` : null, h ? `${E}${g}.rgba *= ${h};` : null, "}" ].filter(Boolean); } }); } dynoOut() { return new K(this, "gsplat"); } } const sn = (t, A) => new nn({ gsplat: t, rgbMinMaxLnScaleMinMax: A }), lc = (t) => new es({ rgba8: t }); class nn extends V { constructor({ gsplat: A, rgbMinMaxLnScaleMinMax: e }) { super({ inTypes: { gsplat: AA, rgbMinMaxLnScaleMinMax: "vec4" }, inputs: { gsplat: A, rgbMinMaxLnScaleMinMax: e }, globals: () => [bA], statements: ({ inputs: s, outputs: n }) => { const { output: i } = n; if (!i) return []; const { gsplat: r, rgbMinMaxLnScaleMinMax: a } = s; return r ? RA(` if (isGsplatActive(${r}.flags)) { ${i} = packSplatEncoding(${r}.center, ${r}.scales, ${r}.quaternion, ${r}.rgba, ${a}); } else { ${i} = uvec4(0u, 0u, 0u, 0u); } `) : [`${i} = uvec4(0u, 0u, 0u, 0u);`]; } }); } dynoOut() { return new K(this, "output"); } } class es extends V { constructor({ rgba8: A }) { super({ inTypes: { rgba8: "vec4" }, inputs: { rgba8: A }, statements: ({ inputs: e, outputs: s }) => [ `target = ${e.rgba8 ?? "vec4(0.0, 0.0, 0.0, 0.0)"};` ] }); } dynoOut() { return new K(this, "rgba8"); } } const Ic = (t, A, e) => new N({ key: t, type: A, value: e }), uc = (t = !1, A) => new oe({ key: A, value: t }), hc = (t = 0, A) => new rn({ key: A, value: t }), Cc = (t = 0, A) => new Kt({ key: A, value: t }), HA = (t = 0, A) => new Ct({ key: A, value: t }), Bc = (t, A) => new an({ key: A, value: t }), Ec = (t, A) => new on({ key: A, value: t }), Qc = (t, A) => new cn({ key: A, value: t }), pc = (t, A) => new zt({ key: A, value: t }), fc = (t, A) => new gn({ key: A, value: t }), dc = (t, A) => new ln({ key: A, value: t }), yc = (t, A) => new In({ key: A, value: t }), et = (t, A) => new Ft({ key: A, value: t }), wc = (t, A) => new un({ key: A, value: t }), mc = (t, A) => new hn({ key: A, value: t }), xc = (t, A) => new Cn({ key: A, value: t }), Sc = (t, A) => new Tt({ key: A, value: t }), Dc = (t, A) => new Bn({ key: A, value: t }), Mc = (t, A) => new En({ key: A, value: t }), vc = (t, A) => new Qn({ key: A, value: t }), bc = (t, A) => new pn({ key: A, value: t }), Fc = (t, A) => new fn({ key: A, value: t }), Nc = (t, A) => new dn({ key: A, value: t }), kc = (t, A) => new yn({ key: A, value: t }), Tc = (t, A) => new wn({ key: A, value: t }), Uc = (t, A) => new mn({ key: A, value: t }), Gc = (t, A) => new xn({ key: A, value: t }), Rc = (t, A) => new Sn({ key: A, value: t }), Yc = (t, A) => new Dn({ key: A, value: t }), Jc = (t, A) => new Mn({ key: A, value: t }), _c = (t, A) => new vn({ key: A, value: t }), Lc = (t, A) => new bn({ key: A, value: t }), zc = (t, A) => new Ht({ key: A, value: t }), Hc = (t, A) => new Fn({ key: t, value: A }), qc = (t, A) => new Nn({ key: A, value: t }), Kc = (t, A) => new kn({ key: A, value: t }), $c = (t, A) => new Tn({ key: A, value: t }), Vc = (t, A) => new Un({ key: A, value: t }), Pc = (t, A) => new Gn({ key: A, value: t }), Zc = (t, A) => new Rn({ key: A, value: t }), Xc = (t, A) => new Yn({ key: A, value: t }), Oc = (t, A) => new Jn({ key: A, value: t }), jc = (t, A) => new _n({ key: A, value: t }), Wc = (t, A) => new Ln({ key: A, value: t }); class N extends V { constructor({ key: A, type: e, count: s, value: n, update: i, globals: r }) { A = A ?? "value", super({ outTypes: { [A]: e }, update: () => { if (i) { const a = i(this.value); a !== void 0 && (this.value = a); } this.uniform.value = this.value; }, generate: ({ inputs: a, outputs: o }) => { const g = (r == null ? void 0 : r({ inputs: a, outputs: o })) ?? [], l = {}, c = o[A]; return c && (g.push(`uniform ${As(c, e, s)};`), l[c] = this.uniform), { globals: g, uniforms: l }; } }), this.type = e, this.count = s, this.value = n, this.uniform = { value: n }, this.outKey = A; } dynoOut() { return new K(this, this.outKey); } } class oe extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "bool", value: e, update: s }); } } class rn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "uint", value: e, update: s }); } } class Kt extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "int", value: e, update: s }); } } class Ct extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "float", value: e, update: s }); } } class an extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "bvec2", value: e, update: s }); } } class on extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "uvec2", value: e, update: s }); } } class cn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "ivec2", value: e, update: s }); } } class zt extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "vec2", value: e, update: s }); } } class gn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "bvec3", value: e, update: s }); } } class ln extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "uvec3", value: e, update: s }); } } class In extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "ivec3", value: e, update: s }); } } class Ft extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "vec3", value: e, update: s }); } } class un extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "bvec4", value: e, update: s }); } } class hn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "uvec4", value: e, update: s }); } } class Cn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "ivec4", value: e, update: s }); } } class Tt extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "vec4", value: e, update: s }); } } class Bn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat2", value: e, update: s }); } } class En extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat2x2", value: e, update: s }); } } class Qn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat2x3", value: e, update: s }); } } class pn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat2x4", value: e, update: s }); } } class fn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat3", value: e, update: s }); } } class dn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat3x2", value: e, update: s }); } } class yn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat3x3", value: e, update: s }); } } class wn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat3x4", value: e, update: s }); } } class mn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat4", value: e, update: s }); } } class xn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat4x2", value: e, update: s }); } } class Sn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat4x3", value: e, update: s }); } } class Dn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat4x4", value: e, update: s }); } } class Mn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "usampler2D", value: e, update: s }); } } class vn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "isampler2D", value: e, update: s }); } } class bn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "sampler2D", value: e, update: s }); } } class Ht extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "usampler2DArray", value: e, update: s }); } } class Fn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "isampler2DArray", value: e, update: s }); } } class Nn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "sampler2DArray", value: e, update: s }); } } class kn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "usampler3D", value: e, update: s }); } } class Tn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "isampler3D", value: e, update: s }); } } class Un extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "sampler3D", value: e, update: s }); } } class Gn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "usamplerCube", value: e, update: s }); } } class Rn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "isamplerCube", value: e, update: s }); } } class Yn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "samplerCube", value: e, update: s }); } } class Jn extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "sampler2DShadow", value: e, update: s }); } } class _n extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "sampler2DArrayShadow", value: e, update: s }); } } class Ln extends N { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "samplerCubeShadow", value: e, update: s }); } } const jt = new Float32Array(1), Qe = new Uint32Array(jt.buffer); function Ag(t) { return jt[0] = t, Qe[0]; } function tg(t) { return Qe[0] = t, jt[0]; } function Bt(t) { jt[0] = t; const A = Qe[0], e = A >> 31 & 1, s = A >> 23 & 255, n = A & 8388607, i = e << 15; if (s === 255) return n !== 0 ? i | 32767 : i | 31744; const r = s - 127 + 15; if (r >= 31) return i | 31744; if (r <= 0) { if (r < -10) return i; const o = (n | 8388608) >> 1 - r + 13; return i | o; } const a = n >> 13; return i | r << 10 | a; } function wA(t) { const A = t >> 15 & 1, e = t >> 10 & 31, s = t & 1023; let n; if (e === 0) if (s === 0) n = A << 31; else { let i = s, r = -14; for (; (i & 1024) === 0; ) i <<= 1, r--; i &= 1023; const a = r + 127, o = i << 13; n = A << 31 | a << 23 | o; } else if (e === 31) s === 0 ? n = A << 31 | 2139095040 : n = A << 31 | 2143289344; else { const i = e - 15 + 127, r = s << 13; n = A << 31 | i << 23 | r; } return Qe[0] = n, jt[0]; } function FA(t) { return Math.max(0, Math.min(255, Math.round(t * 255))); } function ne(t) { return Math.max(-127, Math.min(127, Math.round(t * 127))); } function eg(t) { return t / 255; } function sg(t) { return t / 127; } class ng { // 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((n) => n.key === A); if (e >= 0) { const n = this.items.splice(e, 1)[0]; return this.items.push(n), n.data; } const s = await this.asyncFetch(A); for (this.items.push({ key: A, data: s }); this.items.length > this.maxItems; ) this.items.shift(); return s; } } function ig(t, A) { const e = Object.entries(t).map(([s, n]) => [ s, A(n, s) ]); return Object.fromEntries(e); } function rg(t, A) { const e = Object.entries(t).map(([s, n]) => [s, A(n, s)]).filter(([s, n]) => n !== void 0); return Object.fromEntries(e); } function zn(t) { const A = [], e = /* @__PURE__ */ new Set(); function s(n) { n && typeof n == "object" && !e.has(n) && (e.add(n), n instanceof ArrayBuffer ? A.push(n) : ArrayBuffer.isView(n) ? A.push(n.buffer) : Array.isArray(n) ? n.forEach(s) : Object.values(n).forEach(s)); } return s(t), A; } function ag(t, A) { return new Array(t).fill(null).map((e, s) => A(s)); } class Hn { constructor({ // Allocate a new item with the given args allocate: A, // Dispose of an item (optional, if GC is enough) dispose: e, // Check if an existing item in the list is valid for the given args, // allowing you to store heterogeneous items in the list. valid: s }) { this.items = [], this.allocate = A, this.dispose = e, this.valid = s; } // Allocate a new item from the free list, first checking if a existing item // on the freelist is valid for the given args. alloc(A) { for (; ; ) { const e = this.items.pop(); if (!e) break; if (this.valid(e, A)) return e; this.dispose && this.dispose(e); } return this.allocate(A); } free(A) { this.items.push(A); } disposeAll() { let A; for (A = this.items.pop(); A; ) this.dispose && this.dispose(A), A = this.items.pop(); } } function Re(t, A, e, s, n, i, r, a, o, g, l, c, u, h, E, C, B) { const Q = (B == null ? void 0 : B.rgbMin) ?? 0, f = ((B == null ? void 0 : B.rgbMax) ?? 1) - Q, d = FA((h - Q) / f), w = FA((E - Q) / f), D = FA((C - Q) / f), x = FA(u), y = ss( new I.Quaternion(o, g, l, c) ), m = y & 255, k = y >>> 8 & 255, M = y >>> 16 & 255, S = (B == null ? void 0 : B.lnScaleMin) ?? UA, F = 254 / (((B == null ? void 0 : B.lnScaleMax) ?? GA) - S), b = i < ut ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(i) - S) * F) + 1 ) ), T = r < ut ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(r) - S) * F) + 1 ) ), R = a < ut ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(a) - S) * F) + 1 ) ), X = Bt(e), _ = Bt(s), eA = Bt(n), q = A * 4; t[q] = d | w << 8 | D << 16 | x << 24, t[q + 1] = X | _ << 16, t[q + 2] = eA | m << 16 | k << 24, t[q + 3] = b | T << 8 | R << 16 | M << 24; } function og(t, A, e, s, n) { const i = Bt(e), r = Bt(s), a = Bt(n), o = A * 4; t[o + 1] = i | r << 16, t[o + 2] = a | t[o + 2] & 4294901760; } function cg(t, A, e, s, n, i) { const r = (i == null ? void 0 : i.lnScaleMin) ?? UA, o = 254 / (((i == null ? void 0 : i.lnScaleMax) ?? GA) - r), g = e < ut ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(e) - r) * o) + 1 ) ), l = s < ut ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(s) - r) * o) + 1 ) ), c = n < ut ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(n) - r) * o) + 1 ) ), u = A * 4; t[u + 3] = g | l << 8 | c << 16 | t[u + 3] & 4278190080; } const gg = new I.Quaternion(); function lg(t, A, e, s, n, i) { const r = ss( gg.set(e, s, n, i) ), a = r & 255, o = r >>> 8 & 255, g = r >>> 16 & 255, l = A * 4; t[l + 2] = t[l + 2] & 65535 | a << 16 | o << 24, t[l + 3] = t[l + 3] & 16777215 | g << 24; } function Ig(t, A, e, s, n, i, r) { const a = (r == null ? void 0 : r.rgbMin) ?? 0, g = ((r == null ? void 0 : r.rgbMax) ?? 1) - a, l = FA((e - a) / g), c = FA((s - a) / g), u = FA((n - a) / g), h = FA(i), E = A * 4; t[E] = l | c << 8 | u << 16 | h << 24; } function ug(t, A, e, s, n, i) { const r = (i == null ? void 0 : i.rgbMin) ?? 0, o = ((i == null ? void 0 : i.rgbMax) ?? 1) - r, g = FA((e - r) / o), l = FA((s - r) / o), c = FA((n - r) / o), u = A * 4; t[u] = g | l << 8 | c << 16 | t[u] & 4278190080; } function hg(t, A, e) { const s = FA(e), n = A * 4; t[n] = t[n] & 16777215 | s << 24; } const Cg = new I.Vector3(), Bg = new I.Vector3(), Eg = new I.Quaternion(), Qg = new I.Color(), pg = { center: Cg, scales: Bg, quaternion: Eg, color: Qg, opacity: 0 }; function Ye(t, A, e) { const s = pg, n = A * 4, i = t[n], r = t[n + 1], a = t[n + 2], o = t[n + 3], g = (e == null ? void 0 : e.rgbMin) ?? 0, c = ((e == null ? void 0 : e.rgbMax) ?? 1) - g; s.color.set( g + (i & 255) / 255 * c, g + (i >>> 8 & 255) / 255 * c, g + (i >>> 16 & 255) / 255 * c ), s.opacity = (i >>> 24 & 255) / 255, s.center.set( wA(r & 65535), wA(r >>> 16 & 65535), wA(a & 65535) ); const u = (e == null ? void 0 : e.lnScaleMin) ?? UA, E = (((e == null ? void 0 : e.lnScaleMax) ?? GA) - u) / 254, C = o & 255; s.scales.x = C === 0 ? 0 : Math.exp(u + (C - 1) * E); const B = o >>> 8 & 255; s.scales.y = B === 0 ? 0 : Math.exp(u + (B - 1) * E); const Q = o >>> 16 & 255; s.scales.z = Q === 0 ? 0 : Math.exp(u + (Q - 1) * E); const p = a >>> 16 & 65535 | o >>> 8 & 16711680; return Xn(p, s.quaternion), s; } function mA(t) { const A = Z, e = Math.max( We, Math.min(KA, Math.ceil(t / A)) ), s = Math.ceil(t / (A * e)), n = A * e * s; return { width: A, height: e, depth: s, maxSplats: n }; } function fg(t) { const A = Z, e = Math.max( We, Math.min(KA, Math.ceil(t / A)) ), s = Math.ceil(t / (A * e)); return A * e * s; } function dg() { return navigator.maxTouchPoints > 0 ? !0 : /Mobi|Android|iPhone|iPad|iPod|Opera Mini|IEMobile/.test( navigator.userAgent ); } function yg() { return /Android/.test(navigator.userAgent); } function wg() { return /Oculus/.test(navigator.userAgent); } function mg(t, A, e) { const s = new Uint8Array(A * 4); for (let n = 0; n < e / 2; n++) { const i = n * A * 4, r = (e - 1 - n) * A * 4; s.set(t.subarray(i, i + A * 4)), t.set( t.subarray(r, r + A * 4), i ), t.set(s, r); } return t; } function xg(t, A, e) { const s = document.createElement("canvas"); s.width = A, s.height = e; const n = s.getContext("2d"); if (!n) throw new Error("Can't get 2d context"); const i = n.createImageData(A, e); return i.data.set(t), n.putImageData(i, 0, 0), s.toDataURL("image/png"); } function qn(t) { const A = new I.Clock(t.autoStart); return A.startTime = t.startTime, A.oldTime = t.oldTime, A.elapsedTime = t.elapsedTime, A.running = t.running, A; } function Sg(t) { return Object.fromEntries( Object.entries(t).filter(([A, e]) => e !== void 0) ); } const Kn = hA(` precision highp float; in vec3 position; void main() { gl_Position = vec4(position.xy, 0.0, 1.0); } `); function $n(t) { const A = new I.Vector3(); for (const e of t) A.add(e); return A.divideScalar(t.length); } function Vn(t) { if (t.length === 0) return new I.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 Pn(t, A) { const e = new I.Vector3(0, 0, 0).applyMatrix4(t), s = new I.Vector3(0, 0, 0).applyMatrix4(A), n = new I.Vector3(0, 0, -1).applyMatrix4(t).sub(e).normalize(), i = new I.Vector3(0, 0, -1).applyMatrix4(A).sub(s).normalize(), r = e.distanceTo(s), a = n.dot(i); return { distance: r, coincidence: a }; } function Dg({ matrix1: t, matrix2: A, maxDistance: e }) { const s = new I.Vector3(0, 0, 0).applyMatrix4(t), n = new I.Vector3(0, 0, 0).applyMatrix4(A); return s.distanceTo(n) <= e; } function Mg({ matrix1: t, matrix2: A, maxDistance: e, minCoincidence: s }) { const { distance: n, coincidence: i } = Pn(t, A); return n <= e && (s == null || i >= s); } function Zn(t, A) { const [e, s] = [new I.Vector3(), new I.Quaternion()], [n, i] = [new I.Vector3(), new I.Quaternion()]; t.decompose(e, s, new I.Vector3()), A.decompose(n, i, new I.Vector3()); const r = e.distanceTo(n), a = Math.abs(s.dot(i)); return { distance: r, coorient: a }; } function ce({ matrix1: t, matrix2: A, maxDistance: e, minCoorient: s }) { const { distance: n, coorient: i } = Zn(t, A); return n <= e && (s == null || i >= s); } function vg(t, A = 1e-3) { return Math.abs(t) < A ? 0 : Math.sign(t); } function bg(t) { const A = t.w < 0, e = ne(A ? -t.x : t.x), s = ne(A ? -t.y : t.y), n = ne(A ? -t.z : t.z), i = e & 255, r = s & 255, a = n & 255; return i | r << 8 | a << 16; } function Fg(t, A) { const e = t << 24 >> 24, s = t << 16 >> 24, n = t << 8 >> 24; A.set(e / 127, s / 127, n / 127, 0); const i = A.x * A.x + A.y * A.y + A.z * A.z; return A.w = Math.sqrt(Math.max(0, 1 - i)), A; } const Ng = new I.Quaternion(), Je = new I.Vector3(); function ss(t) { const A = Ng.copy(t).normalize(); A.w < 0 && A.set(-A.x, -A.y, -A.z, -A.w); const e = 2 * Math.acos(A.w), s = Math.sqrt( A.x * A.x + A.y * A.y + A.z * A.z ), n = s < 1e-6 ? Je.set(1, 0, 0) : Je.set(A.x, A.y, A.z).divideScalar(s), i = Math.abs(n.x) + Math.abs(n.y) + Math.abs(n.z); let r = n.x / i, a = n.y / i; if (n.z < 0) { const h = r; r = (1 - Math.abs(a)) * (r >= 0 ? 1 : -1), a = (1 - Math.abs(h)) * (a >= 0 ? 1 : -1); } const o = r * 0.5 + 0.5, g = a * 0.5 + 0.5, l = Math.round(o * 255), c = Math.round(g * 255); return Math.round(e * (255 / Math.PI)) << 16 | c << 8 | l; } function Xn(t, A) { const e = t & 255, s = t >>> 8 & 255, n = t >>> 16 & 255, i = e / 255, r = s / 255; let a = (i - 0.5) * 2, o = (r - 0.5) * 2; const g = 1 - (Math.abs(a) + Math.abs(o)), l = Math.max(-g, 0); a += a >= 0 ? -l : l, o += o >= 0 ? -l : l; const c = Je.set(a, o, g).normalize(), h = n / 255 * Math.PI * 0.5, E = Math.sin(h), C = Math.cos(h); return A.set(c.x * E, c.y * E, c.z * E, C), A; } function kg(t) { const A = t.clone().normalize(), e = 2 * (A.w * A.x + A.y * A.z), s = 1 - 2 * (A.x * A.x + A.y * A.y), n = Math.atan2(e, s), i = 2 * (A.w * A.y - A.z * A.x), r = Math.abs(i) >= 1 ? Math.sign(i) * (Math.PI / 2) : Math.asin(i), a = 2 * (A.w * A.z + A.x * A.y), o = 1 - 2 * (A.y * A.y + A.z * A.z), g = Math.atan2(a, o), l = (n + Math.PI) / (2 * Math.PI), c = (r + Math.PI) / (2 * Math.PI), u = (g + Math.PI) / (2 * Math.PI), h = Math.round(l * 255), E = Math.round(c * 255); return Math.round(u * 255) << 16 | E << 8 | h; } function Tg(t, A) { const e = t & 255, s = t >>> 8 & 255, n = t >>> 16 & 255, i = e / 255, r = s / 255, a = n / 255, o = i * (2 * Math.PI) - Math.PI, g = r * (2 * Math.PI) - Math.PI, l = a * (2 * Math.PI) - Math.PI, c = Math.cos(o * 0.5), u = Math.sin(o * 0.5), h = Math.cos(g * 0.5), E = Math.sin(g * 0.5), C = Math.cos(l * 0.5), B = Math.sin(l * 0.5); return A.w = c * h * C + u * E * B, A.x = u * h * C - c * E * B, A.y = c * E * C + u * h * B, A.z = c * h * B - u * E * C, A.normalize(), A; } function Ae(t, A, e, s) { const n = Math.max(-127, Math.min(127, t * 127)), i = Math.max(-127, Math.min(127, A * 127)), r = Math.max(-127, Math.min(127, e * 127)), a = Math.max(-127, Math.min(127, s * 127)); return n & 255 | (i & 255) << 8 | (r & 255) << 16 | (a & 255) << 24; } function Ug(t, A, e, s) { const n = (s == null ? void 0 : s.sh1Min) ?? -1, i = (s == null ? void 0 : s.sh1Max) ?? 1, r = 0.5 * (n + i), a = 126 / (i - n), o = A * 2; for (let g = 0; g < 9; ++g) { const l = (e[g] - r) * a, c = Math.round(Math.max(-63, Math.min(63, l))) & 127, u = g * 7, h = u + 7, E = Math.floor(u / 32), C = u - E * 32, B = c << C & 4294967295; if (t[o + E] |= B, h > E * 32 + 32) { const Q = c >>> 32 - C & 4294967295; t[o + E + 1] |= Q; } } } function Gg(t, A, e, s) { const n = (s == null ? void 0 : s.sh2Min) ?? -1, i = (s == null ? void 0 : s.sh2Max) ?? 1, r = 0.5 * (n + i), a = 2 / (i - n); t[A * 4 + 0] = Ae( (e[0] - r) * a, (e[1] - r) * a, (e[2] - r) * a, (e[3] - r) * a ), t[A * 4 + 1] = Ae( (e[4] - r) * a, (e[5] - r) * a, (e[6] - r) * a, (e[7] - r) * a ), t[A * 4 + 2] = Ae( (e[8] - r) * a, (e[9] - r) * a, (e[10] - r) * a, (e[11] - r) * a ), t[A * 4 + 3] = Ae( (e[12] - r) * a, (e[13] - r) * a, (e[14] - r) * a, 0 ); } function Rg(t, A, e, s) { const n = (s == null ? void 0 : s.sh3Min) ?? -1, i = (s == null ? void 0 : s.sh3Max) ?? 1, r = 0.5 * (n + i), a = 62 / (i - n), o = A * 4; for (let g = 0; g < 21; ++g) { const l = (e[g] - r) * a, c = Math.round(Math.max(-31, Math.min(31, l))) & 63, u = g * 6, h = u + 6, E = Math.floor(u / 32), C = u - E * 32, B = c << C & 4294967295; if (t[o + E] |= B, h > E * 32 + 32) { const Q = c >>> 32 - C & 4294967295; t[o + E + 1] |= Q; } } } function On(t, A) { const e = []; let s = 0, n = null; const i = new Ts((o, g) => { if (e.push(o), s += o.length, g || s >= A) { const l = new Uint8Array(s); let c = 0; for (const u of e) l.set(u, c), c += u.length; n = l.slice(0, A); } }), r = 1024; let a = 0; for (; n == null && a < t.length; ) { const o = t.slice(a, a + r); i.push(o, !1), a += r; } if (n == null && (i.push(new Uint8Array(), !0), n == null)) throw new Error("Failed to decompress partial gzip"); return n; } class jn { constructor({ fileBytes: A, chunkBytes: e = 64 * 1024 }) { this.fileBytes = A, this.chunkBytes = e, this.offset = 0, this.chunks = [], this.totalBytes = 0, this.gunzip = new Ts((s, n) => { this.chunks.push(s), this.totalBytes += s.length; }); } read(A) { for (; this.totalBytes < A && this.offset < this.fileBytes.length; ) { const i = Math.min( this.offset + this.chunkBytes, this.fileBytes.length ); this.gunzip.push(this.fileBytes.subarray(this.offset, i), !1), this.offset = i; } if (this.totalBytes < A && this.offset >= this.fileBytes.length && this.gunzip.push(new Uint8Array(0), !0), this.totalBytes < A) throw new Error( `Unexpected EOF: needed ${A}, got ${this.totalBytes}` ); const e = new Uint8Array(this.totalBytes); let s = 0; for (const i of this.chunks) e.set(i, s), s += i.length; const n = e.subarray(0, A); return this.chunks = [e.subarray(A)], this.totalBytes -= A, n; } } const zh = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, DataCache: ng, FreeList: Hn, GunzipReader: jn, IDENT_VERTEX_SHADER: Kn, Sint8ToFloat: sg, Uint8ToFloat: eg, averagePositions: $n, averageQuaternions: Vn, cloneClock: qn, coinciDist: Pn, computeMaxSplats: fg, coorientDist: Zn, decodeQuatEulerXyz888: Tg, decodeQuatOctXy88R8: Xn, decodeQuatXyz888: Fg, decompressPartialGzip: On, encodeQuatEulerXyz888: kg, encodeQuatOctXy88R8: ss, encodeQuatXyz888: bg, encodeSh1Rgb: Ug, encodeSh2Rgb: Gg, encodeSh3Rgb: Rg, epsilonSign: vg, flipPixels: mg, floatBitsToUint: Ag, floatToSint8: ne, floatToUint8: FA, fromHalf: wA, getArrayBuffers: zn, getTextureSize: mA, isAndroid: yg, isMobile: dg, isOculus: wg, mapFilterObject: rg, mapObject: ig, newArray: ag, omitUndefined: Sg, pixelsToPngUrl: xg, setPackedSplat: Re, setPackedSplatCenter: og, setPackedSplatOpacity: hg, setPackedSplatQuat: lg, setPackedSplatRgb: ug, setPackedSplatRgba: Ig, setPackedSplatScales: cg, toHalf: Bt, uintBitsToFloat: tg, unpackSplat: Ye, withinCoinciDist: Mg, withinCoorientDist: ce, withinDist: Dg }, Symbol.toStringTag, { value: "Module" })); class ns { constructor({ graph: A, inputs: e, outputs: s, template: n }) { this.graph = A, this.template = n, this.inputs = e ?? {}, this.outputs = s ?? {}; const i = new $s({ indent: this.template.indent }); for (const a in this.outputs) this.outputs[a] && i.declares.add(this.outputs[a]); const r = A.compile({ inputs: this.inputs, outputs: this.outputs, compile: i }); this.shader = n.generate({ globals: i.globals, statements: r }), this.uniforms = i.uniforms, this.updaters = i.updaters; } prepareMaterial() { return Yg(this); } update() { for (const A of this.updaters) A(); } } class is { constructor(A) { const e = A.match(/^([ \t]*)\{\{\s*GLOBALS\s*\}\}/m), s = A.match(/^([ \t]*)\{\{\s*STATEMENTS\s*\}\}/m); if (!e || !s) throw new Error( "Template must contain {{ GLOBALS }} and {{ STATEMENTS }}" ); this.before = A.substring(0, e.index), this.between = A.substring( e.index + e[0].length, s.index ), this.after = A.substring( s.index + s[0].length ), this.indent = s[1]; } generate({ globals: A, statements: e }) { return this.before + Array.from(A).join(` `) + this.between + e.map((s) => this.indent + s).join(` `) + this.after; } } const Es = /* @__PURE__ */ new Map(); function Yg(t) { let A = Es.get(t); return A || (A = new I.RawShaderMaterial({ glslVersion: I.GLSL3, vertexShader: Kn, fragmentShader: t.shader, uniforms: t.uniforms }), Es.set(t, A), A); } function rs(t, A, e = "add") { const s = () => { throw new Error(`Invalid ${e} types: ${t}, ${A}`); }; if (t === A) return t; if (t === "int") { if (EA(A)) return A; s(); } if (A === "int") { if (EA(t)) return t; s(); } if (t === "uint") { if (QA(A)) return A; s(); } if (A === "uint") { if (QA(t)) return t; s(); } if (t === "float") { if (ot(A)) return A; s(); } if (A === "float") { if (ot(t)) return t; s(); } throw new Error(`Invalid ${e} types: ${t}, ${A}`); } function Jg(t, A) { return rs(t, A, "sub"); } function _g(t, A) { const e = () => { throw new Error(`Invalid mul types: ${t}, ${A}`); }, s = (n) => n; if (t === "int") { if (EA(A)) return s(A); e(); } if (A === "int") { if (EA(t)) return s(t); e(); } if (t === "uint") { if (QA(A)) return s(A); e(); } if (A === "uint") { if (QA(t)) return s(t); e(); } if (t === "float") { if (ot(A)) return s(A); e(); } if (A === "float") { if (ot(t)) return s(t); e(); } if (EA(t) || QA(t) || EA(A) || QA(A)) { if (t === A) return s(t); e(); } if (t === "vec2") { if (A === "vec2" || ct(A)) return s("vec2"); if (A === "mat3x2") return s("vec3"); if (A === "mat4x2") return s("vec4"); e(); } if (t === "vec3") { if (A === "mat2x3") return s("vec2"); if (A === "vec3" || gt(A)) return s("vec3"); if (A === "mat4x3") return s("vec4"); e(); } if (t === "vec4") { if (A === "mat2x4") return s("vec2"); if (A === "mat3x4") return s("vec3"); if (A === "vec4" || lt(A)) return s("vec4"); e(); } if (A === "vec2") { if (ct(t)) return s("vec2"); if (t === "mat2x3") return s("vec3"); if (t === "mat2x4") return s("vec4"); e(); } if (A === "vec3") { if (t === "mat3x2") return s("vec2"); if (gt(t)) return s("vec3"); if (t === "mat3x4") return s("vec4"); e(); } if (A === "vec4") { if (t === "mat4x2") return s("vec2"); if (t === "mat4x3") return s("vec3"); if (lt(t)) return s("vec4"); e(); } if (ct(t)) { if (ct(A)) return s("mat2"); if (A === "mat3x2") return s("mat3x2"); if (A === "mat4x2") return s("mat4x2"); e(); } if (t === "mat2x3") { if (ct(A)) return s("mat2x3"); if (A === "mat3x2") return s("mat3"); if (A === "mat4x2") return s("mat4x3"); e(); } if (t === "mat2x4") { if (ct(A)) return s("mat2x4"); if (A === "mat3x2") return s("mat3x4"); if (A === "mat4x2") return s("mat4"); e(); } if (t === "mat3x2") { if (A === "mat2x3") return s("mat2"); if (gt(A)) return s("mat3x2"); if (A === "mat4x3") return s("mat4x2"); e(); } if (gt(t)) { if (A === "mat2x3") return s("mat2x3"); if (gt(A)) return s("mat3"); if (A === "mat4x3") return s("mat4x3"); e(); } if (t === "mat3x4") { if (A === "mat2x3") return s("mat2x4"); if (gt(A)) return s("mat3x4"); if (A === "mat4x3") return s("mat4"); e(); } if (t === "mat4x2") { if (A === "mat2x4") return s("mat2"); if (A === "mat3x4") return s("mat3x2"); if (lt(A)) return s("mat4x2"); e(); } if (t === "mat4x3") { if (A === "mat2x4") return s("mat2x3"); if (A === "mat3x4") return s("mat3"); if (lt(A)) return s("mat4x3"); e(); } if (lt(t)) { if (A === "mat2x4") return s("mat2x4"); if (A === "mat3x4") return s("mat3x4"); if (lt(A)) return s("mat4"); e(); } throw new Error(`Invalid mul types: ${t}, ${A}`); } function Lg(t, A) { return rs(t, A, "div"); } function zg(t, A) { if (t === A) return t; if (t === "int") { if (EA(A)) return A; } else if (A === "int") { if (EA(t)) return t; } else if (t === "uint") { if (QA(A)) return A; } else if (A === "uint" && QA(t)) return t; throw new Error(`Invalid imod types: ${t}, ${A}`); } function Hg(t, A) { if (t === A || A === "float") return t; throw new Error(`Invalid mod types: ${t}, ${A}`); } function qg(t) { return t; } function Kg(t) { return t; } function $g(t) { return t; } function Vg(t) { return t; } function Pg(t) { return t; } function Zg(t) { return t; } function Xg(t) { return t; } function Og(t) { return t; } function jg(t) { return t; } function Wg(t) { return t; } function Al(t) { return t; } function tl(t) { return t; } function el(t) { return t; } function sl(t) { return t; } function nl(t) { return t; } function il(t) { return t; } function Wn(t, A, e = "min") { if (t === A) return t; if (A === "float") { if (Pt(t)) return t; } else if (A === "int") { if (EA(t)) return t; } else if (A === "uint" && QA(t)) return t; throw new Error(`Invalid ${e} types: ${t}, ${A}`); } function rl(t, A) { return Wn(t, A, "max"); } function al(t, A, e) { if (A === "float") { if (Pt(t)) return t; } else if (A === "int") { if (EA(t)) return t; } else if (A === "uint" && QA(t)) return t; throw new Error(`Invalid clamp types: ${t}, ${A}`); } function ol(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 cl(t, A) { if (t === A || A === "float") return A; throw new Error(`Invalid step types: ${t}, ${A}`); } function gl(t, A, e) { if (t === A && (t === e || t === "float")) return e; throw new Error(`Invalid smoothstep types: ${t}, ${A}, ${e}`); } function Ai(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 ll(t) { return Ai(t, "isInf"); } const BA = (t, A) => new ni({ a: t, b: A }), pt = (t, A) => new ii({ a: t, b: A }), iA = (t, A) => new ri({ a: t, b: A }), ie = (t, A) => new ai({ a: t, b: A }), _e = (t, A) => new oi({ a: t, b: A }), ti = (t, A) => new ci({ a: t, b: A }), Il = (t) => new gi({ a: t }).outputs, as = (t) => new li({ a: t }), ul = (t) => new Ii({ a: t }), hl = (t) => new ui({ a: t }), Cl = (t) => new hi({ a: t }), Bl = (t) => new Ci({ a: t }), El = (t) => new Bi({ a: t }), Ql = (t) => new Ei({ a: t }), re = (t) => new Qi({ a: t }), pl = (t, A) => new pi({ a: t, b: A }), fl = (t) => new fi({ a: t }), dl = (t) => new di({ a: t }), yl = (t) => new yi({ a: t }), wl = (t) => new wi({ a: t }), ml = (t) => new mi({ a: t }), xl = (t) => new xi({ a: t }), Sl = (t) => new Si({ a: t }), Dl = (t, A) => new Di({ a: t, b: A }), ei = (t, A) => new Mi({ a: t, b: A }), Ml = (t, A, e) => new vi({ a: t, min: A, max: e }), si = (t, A, e) => new bi({ a: t, b: A, t: e }), vl = (t, A) => new Fi({ edge: t, x: A }), bl = (t, A, e) => new Ni({ edge0: t, edge1: A, x: e }), Fl = (t) => new ki({ a: t }), Nl = (t) => new Ti({ a: t }); class ni extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "sum", outTypeFunc: rs }), this.statements = ({ inputs: s, outputs: n }) => [`${n.sum} = ${s.a} + ${s.b};`]; } } class ii extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "difference", outTypeFunc: Jg }), this.statements = ({ inputs: s, outputs: n }) => [`${n.difference} = ${s.a} - ${s.b};`]; } } class ri extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "product", outTypeFunc: _g }), this.statements = ({ inputs: s, outputs: n }) => [`${n.product} = ${s.a} * ${s.b};`]; } } class ai extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "quotient", outTypeFunc: Lg }), this.statements = ({ inputs: s, outputs: n }) => [`${n.quotient} = ${s.a} / ${s.b};`]; } } class oi extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "remainder", outTypeFunc: zg }), this.statements = ({ inputs: s, outputs: n }) => [`${n.remainder} = ${s.a} % ${s.b};`]; } } class ci extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "remainder", outTypeFunc: Hg }), this.statements = ({ inputs: s, outputs: n }) => [`${n.remainder} = mod(${s.a}, ${s.b});`]; } } class gi extends V { constructor({ a: A }) { const e = { a: $(A) }, s = e.a, n = { fract: s, integer: s }; super({ inTypes: e, outTypes: n, inputs: { a: A } }), this.statements = ({ inputs: i, outputs: r }) => [`${r.fract} = modf(${i.a}, ${r.integer});`]; } } class li extends v { constructor({ a: A }) { super({ a: A, outKey: "neg", outTypeFunc: qg }), this.statements = ({ inputs: e, outputs: s }) => [`${s.neg} = -${e.a};`]; } } class Ii extends v { constructor({ a: A }) { super({ a: A, outKey: "abs", outTypeFunc: Kg }), this.statements = ({ inputs: e, outputs: s }) => [`${s.abs} = abs(${e.a});`]; } } class ui extends v { constructor({ a: A }) { super({ a: A, outKey: "sign", outTypeFunc: $g }), this.statements = ({ inputs: e, outputs: s }) => [`${s.sign} = sign(${e.a});`]; } } class hi extends v { constructor({ a: A }) { super({ a: A, outKey: "floor", outTypeFunc: Vg }), this.statements = ({ inputs: e, outputs: s }) => [`${s.floor} = floor(${e.a});`]; } } class Ci extends v { constructor({ a: A }) { super({ a: A, outKey: "ceil", outTypeFunc: Pg }), this.statements = ({ inputs: e, outputs: s }) => [`${s.ceil} = ceil(${e.a});`]; } } class Bi extends v { constructor({ a: A }) { super({ a: A, outKey: "trunc", outTypeFunc: Zg }), this.statements = ({ inputs: e, outputs: s }) => [`${s.trunc} = trunc(${e.a});`]; } } class Ei extends v { constructor({ a: A }) { super({ a: A, outKey: "round", outTypeFunc: Xg }), this.statements = ({ inputs: e, outputs: s }) => [`${s.round} = round(${e.a});`]; } } class Qi extends v { constructor({ a: A }) { super({ a: A, outKey: "fract", outTypeFunc: Og }), this.statements = ({ inputs: e, outputs: s }) => [`${s.fract} = fract(${e.a});`]; } } class pi extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "power", outTypeFunc: jg }), this.statements = ({ inputs: s, outputs: n }) => [`${n.power} = pow(${s.a}, ${s.b});`]; } } class fi extends v { constructor({ a: A }) { super({ a: A, outKey: "exp", outTypeFunc: Wg }), this.statements = ({ inputs: e, outputs: s }) => [`${s.exp} = exp(${e.a});`]; } } class di extends v { constructor({ a: A }) { super({ a: A, outKey: "exp2", outTypeFunc: Al }), this.statements = ({ inputs: e, outputs: s }) => [`${s.exp2} = exp2(${e.a});`]; } } class yi extends v { constructor({ a: A }) { super({ a: A, outKey: "log", outTypeFunc: tl }), this.statements = ({ inputs: e, outputs: s }) => [`${s.log} = log(${e.a});`]; } } class wi extends v { constructor({ a: A }) { super({ a: A, outKey: "log2", outTypeFunc: el }), this.statements = ({ inputs: e, outputs: s }) => [`${s.log2} = log2(${e.a});`]; } } class mi extends v { constructor({ a: A }) { super({ a: A, outKey: "sqr", outTypeFunc: sl }), this.statements = ({ inputs: e, outputs: s }) => [`${s.sqr} = ${e.a} * ${e.a};`]; } } class xi extends v { constructor({ a: A }) { super({ a: A, outKey: "sqrt", outTypeFunc: nl }), this.statements = ({ inputs: e, outputs: s }) => [`${s.sqrt} = sqrt(${e.a});`]; } } class Si extends v { constructor({ a: A }) { super({ a: A, outKey: "inversesqrt", outTypeFunc: il }), this.statements = ({ inputs: e, outputs: s }) => [`${s.inversesqrt} = inversesqrt(${e.a});`]; } } class Di extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "min", outTypeFunc: Wn }), this.statements = ({ inputs: s, outputs: n }) => [`${n.min} = min(${s.a}, ${s.b});`]; } } class Mi extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "max", outTypeFunc: rl }), this.statements = ({ inputs: s, outputs: n }) => [`${n.max} = max(${s.a}, ${s.b});`]; } } class vi extends yt { constructor({ a: A, min: e, max: s }) { super({ a: A, b: e, c: s, outKey: "clamp", outTypeFunc: al }), this.statements = ({ inputs: n, outputs: i }) => { const { a: r, b: a, c: o } = n; return [`${i.clamp} = clamp(${r}, ${a}, ${o});`]; }; } } class bi extends yt { constructor({ a: A, b: e, t: s }) { super({ a: A, b: e, c: s, outKey: "mix", outTypeFunc: ol }), this.statements = ({ inputs: n, outputs: i }) => { const { a: r, b: a, c: o } = n; return [`${i.mix} = mix(${r}, ${a}, ${o});`]; }; } } class Fi extends tA { constructor({ edge: A, x: e }) { super({ a: A, b: e, outKey: "step", outTypeFunc: cl }), this.statements = ({ inputs: s, outputs: n }) => { const { a: i, b: r } = s; return [`${n.step} = step(${i}, ${r});`]; }; } } class Ni extends yt { constructor({ edge0: A, edge1: e, x: s }) { super({ a: A, b: e, c: s, outKey: "smoothstep", outTypeFunc: gl }), this.statements = ({ inputs: n, outputs: i }) => { const { a: r, b: a, c: o } = n; return [`${i.smoothstep} = smoothstep(${r}, ${a}, ${o});`]; }; } } class ki extends v { constructor({ a: A }) { super({ a: A, outKey: "isNan", outTypeFunc: Ai }), this.statements = ({ inputs: e, outputs: s }) => [`${s.isNan} = isNan(${e.a});`]; } } class Ti extends v { constructor({ a: A }) { super({ a: A, outKey: "isInf", outTypeFunc: ll }), this.statements = ({ inputs: e, outputs: s }) => [`${s.isInf} = isInf(${e.a});`]; } } const kl = (t, A) => new Gi({ a: t, b: A }), Tl = (t, A) => new Ri({ a: t, b: A }), Ul = (t, A) => new Yi({ a: t, b: A }), Gl = (t) => new Ji({ a: t }), Rl = (t, A) => new _i({ a: t, b: A }), Yl = (t, A) => new Li({ a: t, b: A }), Jl = (t, A) => new zi({ a: t, b: A }), Ui = (t, A) => new Hi({ a: t, b: A }), _l = (t, A) => new qi({ a: t, b: A }), Ll = (t, A) => new Ki({ a: t, b: A }), zl = (t) => new $i({ a: t }), Hl = (t) => new Vi({ a: t }), os = (t, A, e) => new Pi({ cond: t, t: A, f: e }), ql = (t) => new Xi({ a: t }); class Gi extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (s, n) => s, outKey: "and" }), this.statements = ({ inputs: s, outputs: n }) => this.outTypes.and === "bool" ? [`${n.and} = ${s.a} && ${s.b};`] : [`${n.and} = ${s.a} & ${s.b};`]; } } class Ri extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (s, n) => s, outKey: "or" }), this.statements = ({ inputs: s, outputs: n }) => this.outTypes.or === "bool" ? [`${n.or} = ${s.a} || ${s.b};`] : [`${n.or} = ${s.a} | ${s.b};`]; } } class Yi extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (s, n) => s, outKey: "xor" }), this.statements = ({ inputs: s, outputs: n }) => this.outTypes.xor === "bool" ? [`${n.xor} = ${s.a} ^^ ${s.b};`] : [`${n.xor} = ${s.a} ^ ${s.b};`]; } } class Ji extends v { constructor({ a: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "not" }), this.statements = ({ inputs: e, outputs: s }) => this.outTypes.not === "bool" ? [`${s.not} = !${e.a};`] : [`${s.not} = not(${e.a});`]; } } class _i extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (s, n) => pe(s, "lessThan"), outKey: "lessThan" }), this.statements = ({ inputs: s, outputs: n }) => this.outTypes.lessThan === "bool" ? [`${n.lessThan} = ${s.a} < ${s.b};`] : [`${n.lessThan} = lessThan(${s.a}, ${s.b});`]; } } class Li extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (s, n) => pe(s, "lessThanEqual"), outKey: "lessThanEqual" }), this.statements = ({ inputs: s, outputs: n }) => this.outTypes.lessThanEqual === "bool" ? [`${n.lessThanEqual} = ${s.a} <= ${s.b};`] : [ `${n.lessThanEqual} = lessThanEqual(${s.a}, ${s.b});` ]; } } class zi extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (s, n) => pe(s, "greaterThan"), outKey: "greaterThan" }), this.statements = ({ inputs: s, outputs: n }) => this.outTypes.greaterThan === "bool" ? [`${n.greaterThan} = ${s.a} > ${s.b};`] : [ `${n.greaterThan} = greaterThan(${s.a}, ${s.b});` ]; } } class Hi extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (s, n) => pe(s, "greaterThanEqual"), outKey: "greaterThanEqual" }), this.statements = ({ inputs: s, outputs: n }) => this.outTypes.greaterThanEqual === "bool" ? [`${n.greaterThanEqual} = ${s.a} >= ${s.b};`] : [ `${n.greaterThanEqual} = greaterThanEqual(${s.a}, ${s.b});` ]; } } class qi extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: Zi, outKey: "equal" }), this.statements = ({ inputs: s, outputs: n }) => this.outTypes.equal === "bool" ? [`${n.equal} = ${s.a} == ${s.b};`] : [`${n.equal} = equal(${s.a}, ${s.b});`]; } } class Ki extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: Kl, outKey: "notEqual" }), this.statements = ({ inputs: s, outputs: n }) => this.outTypes.notEqual === "bool" ? [`${n.notEqual} = ${s.a} != ${s.b};`] : [`${n.notEqual} = notEqual(${s.a}, ${s.b});`]; } } class $i extends v { constructor({ a: A }) { super({ a: A, outTypeFunc: (e) => "bool", outKey: "any" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.any} = any(${e.a});`]; } } class Vi extends v { constructor({ a: A }) { super({ a: A, outTypeFunc: (e) => "bool", outKey: "all" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.all} = all(${e.a});`]; } } class Pi extends yt { constructor({ cond: A, t: e, f: s }) { super({ a: A, b: e, c: s, outKey: "select", outTypeFunc: (n, i, r) => i }), this.statements = ({ inputs: n, outputs: i }) => { const { a: r, b: a, c: o } = n; return [`${i.select} = (${r}) ? (${a}) : (${o});`]; }; } } function pe(t, A) { if (dt(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 Zi(t, A = "equal") { if (dt(t)) return "bool"; if (ft(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 Kl(t) { return Zi(t, "notEqual"); } function $l(t) { if (ft(t)) return "bool"; if (EA(t)) return "int"; if (QA(t)) return "uint"; throw new Error(`Invalid compXor type: ${t}`); } class Xi extends v { constructor({ a: A }) { const e = $l($(A)); super({ a: A, outTypeFunc: (s) => e, outKey: "compXor" }), this.statements = ({ inputs: s, outputs: n }) => { if (dt(this.outTypes.compXor)) return [`${n.compXor} = ${s.a};`]; const r = (Nt(e) ? ["x", "y"] : kt(e) ? ["x", "y", "z"] : ["x", "y", "z", "w"]).map((o) => `${s.a}.${o}`), a = ft(e) ? "^^" : "^"; return [`${n.compXor} = ${r.join(` ${a} `)};`]; }; } } const Vl = (t) => new sr({ value: t }), Pl = (t) => new nr({ value: t }), Zl = (t) => new ir({ value: t }), Oi = (t) => new rr({ value: t }), Xl = (t) => new ar({ value: t }), Ol = (t) => new or({ value: t }), jl = (t) => new cr({ value: t }), Wl = (t) => new gr({ value: t }), AI = (t) => new lr({ value: t }), tI = (t) => new Ir({ value: t }), eI = (t) => new ur({ value: t }), sI = (t) => new hr({ value: t }), nI = (t) => new Cr({ value: t }), ji = (t) => new Br({ value: t }), Et = (t) => new Er({ value: t }), Wi = (t) => new Qr({ value: t }), iI = (t) => new pr({ value: t }), rI = (t) => new fr({ value: t }), aI = (t) => new dr({ value: t }), Ar = (t) => new yr({ value: t }), tr = (t) => new wr({ value: t }), oI = (t) => new mr({ value: t }), cI = (t) => new xr({ value: t }), gI = (t) => new Sr({ value: t }), lI = (t) => new Dr({ value: t }), II = (t) => new Mr({ value: t }), uI = (t) => new vr({ value: t }), er = (t) => new br({ value: t }), hI = (t) => new Fr({ value: t }), Le = (t) => new Nr({ value: t }); class cA extends v { constructor({ value: A, outType: e, outKey: s }) { super({ a: A, outTypeFunc: () => e, outKey: s }), this.statements = ({ inputs: n, outputs: i }) => [ `${i[s]} = ${qs(e)}(${n.a});` ]; } } class sr extends cA { constructor({ value: A }) { super({ value: A, outType: "bool", outKey: "bool" }); } } class nr extends cA { constructor({ value: A }) { super({ value: A, outType: "int", outKey: "int" }); } } class ir extends cA { constructor({ value: A }) { super({ value: A, outType: "uint", outKey: "uint" }); } } class rr extends cA { constructor({ value: A }) { super({ value: A, outType: "float", outKey: "float" }); } } class ar extends cA { constructor({ value: A }) { super({ value: A, outType: "bvec2", outKey: "bvec2" }); } } class or extends cA { constructor({ value: A }) { super({ value: A, outType: "bvec3", outKey: "bvec3" }); } } class cr extends cA { constructor({ value: A }) { super({ value: A, outType: "bvec4", outKey: "bvec4" }); } } class gr extends cA { constructor({ value: A }) { super({ value: A, outType: "ivec2", outKey: "ivec2" }); } } class lr extends cA { constructor({ value: A }) { super({ value: A, outType: "ivec3", outKey: "ivec3" }); } } class Ir extends cA { constructor({ value: A }) { super({ value: A, outType: "ivec4", outKey: "ivec4" }); } } class ur extends cA { constructor({ value: A }) { super({ value: A, outType: "uvec2", outKey: "uvec2" }); } } class hr extends cA { constructor({ value: A }) { super({ value: A, outType: "uvec3", outKey: "uvec3" }); } } class Cr extends cA { constructor({ value: A }) { super({ value: A, outType: "uvec4", outKey: "uvec4" }); } } class Br extends cA { constructor({ value: A }) { super({ value: A, outType: "vec2", outKey: "vec2" }); } } class Er extends cA { constructor({ value: A }) { super({ value: A, outType: "vec3", outKey: "vec3" }); } } class Qr extends cA { constructor({ value: A }) { super({ value: A, outType: "vec4", outKey: "vec4" }); } } class pr extends cA { constructor({ value: A }) { super({ value: A, outType: "mat2", outKey: "mat2" }); } } class fr extends cA { constructor({ value: A }) { super({ value: A, outType: "mat3", outKey: "mat3" }); } } class dr extends cA { constructor({ value: A }) { super({ value: A, outType: "mat4", outKey: "mat4" }); } } class yr extends v { constructor({ value: A }) { super({ a: A, outKey: "int", outTypeFunc: () => "int" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.int} = floatBitsToInt(${e.a});`]; } } class wr extends v { constructor({ value: A }) { super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.uint} = floatBitsToUint(${e.a});`]; } } class mr extends v { constructor({ value: A }) { super({ a: A, outKey: "float", outTypeFunc: () => "float" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.float} = intBitsToFloat(${e.a});`]; } } class xr extends v { constructor({ value: A }) { super({ a: A, outKey: "float", outTypeFunc: () => "float" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.float} = uintBitsToFloat(${e.a});`]; } } class Sr extends v { constructor({ value: A }) { super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.uint} = packSnorm2x16(${e.a});`]; } } class Dr extends v { constructor({ value: A }) { super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.vec2} = unpackSnorm2x16(${e.a});`]; } } class Mr extends v { constructor({ value: A }) { super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.uint} = packUnorm2x16(${e.a});`]; } } class vr extends v { constructor({ value: A }) { super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.vec2} = unpackUnorm2x16(${e.a});`]; } } class br extends v { constructor({ value: A }) { super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.uint} = packHalf2x16(${e.a});`]; } } class Fr extends v { constructor({ value: A }) { super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.vec2} = unpackHalf2x16(${e.a});`]; } } class Nr extends v { constructor({ value: A }) { super({ a: A, outKey: "rgba8", outTypeFunc: () => "vec4" }), this.statements = ({ inputs: e, outputs: s }) => [ `uvec4 uRgba = uvec4(${e.a} & 0xffu, (${e.a} >> 8u) & 0xffu, (${e.a} >> 16u) & 0xffu, (${e.a} >> 24u) & 0xffu);`, `${s.rgba8} = vec4(uRgba) / 255.0;` ]; } } const CI = (t) => new Gr({ a: t }), BI = (t, A) => new Rr({ a: t, b: A }), kr = (t, A) => new Yr({ a: t, b: A }), EI = (t, A) => new Jr({ a: t, b: A }), Tr = (t) => new _r({ a: t }), QI = (t, A, e) => new Hr({ a: t, b: A, c: e }), pI = (t, A) => new qr({ incident: t, normal: A }), fI = (t, A, e) => new Kr({ incident: t, normal: A, eta: e }), Qt = (t) => new Or({ vector: t }), $A = ({ vector: t, vectorType: A, x: e, y: s, z: n, w: i, r, g: a, b: o, a: g }) => new jr({ vector: t, vectorType: A, x: e, y: s, z: n, w: i, r, g: a, b: o, a: g }), dI = (t) => new Lr({ a: t }), Ur = (t, A) => new zr({ a: t, b: A }), yI = (t, A) => new Wr({ vector: t, select: A }), wI = (t, A) => new $r({ a: t, b: A }), mI = (t, A) => new Vr({ a: t, b: A }), xI = (t) => new Pr({ a: t }), SI = (t) => new Zr({ a: t }), DI = (t) => new Xr({ a: t }); class Gr extends v { constructor({ a: A }) { super({ a: A, outTypeFunc: (e) => "float", outKey: "length" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.length} = length(${e.a});` ]; } } class Rr extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "distance", outTypeFunc: (s, n) => "float" }), this.statements = ({ inputs: s, outputs: n }) => [ `${n.distance} = distance(${s.a}, ${s.b});` ]; } } class Yr extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "dot", outTypeFunc: (s, n) => "float" }), this.statements = ({ inputs: s, outputs: n }) => [ `${n.dot} = dot(${s.a}, ${s.b});` ]; } } class Jr extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "cross", outTypeFunc: (s, n) => "vec3" }), this.statements = ({ inputs: s, outputs: n }) => [ `${n.cross} = cross(${s.a}, ${s.b});` ]; } } class _r extends v { constructor({ a: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "normalize" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.normalize} = normalize(${e.a});` ]; } } function MI(t) { if (t === "vec3") return "vec2"; if (t === "vec4") return "vec3"; throw new Error("Invalid type"); } class Lr extends v { constructor({ a: A }) { super({ a: A, outTypeFunc: (e) => MI(e), outKey: "projected" }), this.statements = ({ inputs: e, outputs: s }) => { if (this.inTypes.a === "vec3") return [`${s.projected} = ${e.a}.xy / ${e.a}.z;`]; if (this.inTypes.a === "vec4") return [`${s.projected} = ${e.a}.xyz / ${e.a}.w;`]; throw new Error("Invalid type"); }; } } function vI(t) { if (t === "float") return "vec2"; if (t === "vec2") return "vec3"; if (t === "vec3") return "vec4"; throw new Error("Invalid type"); } class zr extends tA { constructor({ a: A, b: e }) { const s = $(A), n = vI(s); super({ a: A, b: e, outKey: "extend", outTypeFunc: () => n }), this.statements = ({ inputs: i, outputs: r }) => [ `${r.extend} = ${n}(${i.a}, ${i.b});` ]; } } class Hr extends yt { constructor({ a: A, b: e, c: s }) { super({ a: A, b: e, c: s, outKey: "forward", outTypeFunc: (n, i, r) => n }), this.statements = ({ inputs: n, outputs: i }) => [ `${i.forward} = faceforward(${n.a}, ${n.b}, ${n.c});` ]; } } class qr extends tA { constructor({ incident: A, normal: e }) { super({ a: A, b: e, outKey: "reflection", outTypeFunc: (s, n) => s }), this.statements = ({ inputs: s, outputs: n }) => [ `${n.reflection} = reflect(${s.a}, ${s.b});` ]; } } class Kr extends yt { constructor({ incident: A, normal: e, eta: s }) { super({ a: A, b: e, c: s, outKey: "refraction", outTypeFunc: (n, i, r) => n }), this.statements = ({ inputs: n, outputs: i }) => [ `${i.refraction} = refract(${n.a}, ${n.b}, ${n.c});` ]; } } class $r extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "product", outTypeFunc: (s, n) => s }), this.statements = ({ inputs: s, outputs: n }) => [ `${n.product} = matrixCompMult(${A}, ${e});` ]; } } function bI(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 Vr extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "outer", outTypeFunc: bI }), this.statements = ({ inputs: s, outputs: n }) => [ `${n.outer} = outerProduct(${s.a}, ${s.b});` ]; } } function FI(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 Pr extends v { constructor({ a: A }) { super({ a: A, outKey: "transpose", outTypeFunc: FI }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.transpose} = transpose(${e.a});` ]; } } class Zr extends v { constructor({ a: A }) { super({ a: A, outKey: "det", outTypeFunc: (e) => "float" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.det} = determinant(${e.a});` ]; } } class Xr extends v { constructor({ a: A }) { super({ a: A, outKey: "inverse", outTypeFunc: (e) => e }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.inverse} = inverse(${A});` ]; } } function NI(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 Or extends V { constructor({ vector: A }) { const s = { vector: $(A) }, n = NI(s.vector); super({ inTypes: s, outTypes: n, inputs: { vector: A } }), this.statements = ({ inputs: i, outputs: r }) => { const { x: a, y: o, z: g, w: l, r: c, g: u, b: h, a: E } = r, { vector: C } = i; return [ a ? `${a} = ${C}.x;` : null, o ? `${o} = ${C}.y;` : null, g ? `${g} = ${C}.z;` : null, l ? `${l} = ${C}.w;` : null, c ? `${c} = ${C}.r;` : null, u ? `${u} = ${C}.g;` : null, h ? `${h} = ${C}.b;` : null, E ? `${E} = ${C}.a;` : null ].filter(Boolean); }; } } class jr extends V { constructor({ vector: A, vectorType: e, x: s, y: n, z: i, w: r, r: a, g: o, b: g, a: l }) { if (!A && !e) throw new Error("Either vector or vectorType must be provided"); const c = e ?? $(A), u = Ls(c), h = zs(c), E = { vector: c, x: u, y: u, r: u, g: u }, C = { vector: A, x: s, y: n, r: a, g: o }; h >= 3 && (Object.assign(E, { z: u, b: u }), Object.assign(C, { z: i, b: g })), h >= 4 && (Object.assign(E, { w: u, a: u }), Object.assign(C, { w: r, a: l })), super({ inTypes: E, outTypes: { vector: c }, inputs: C }), this.statements = ({ inputs: B, outputs: Q }) => { const { vector: p } = Q, { vector: f, x: d, y: w, z: D, w: x, r: y, g: m, b: k, a: M } = B, S = [ `${p}.x = ${d ?? y ?? (f ? `${f}.x` : Jt(u))};`, `${p}.y = ${w ?? m ?? (f ? `${f}.y` : Jt(u))};` ]; return h >= 3 && S.push( `${p}.z = ${D ?? k ?? (f ? `${f}.z` : Jt(u))};` ), h >= 4 && S.push( `${p}.w = ${x ?? M ?? (f ? `${f}.w` : Jt(u))};` ), S; }; } dynoOut() { return new K( this, "vector" ); } } function kI(t, A) { let e = null; if (Pt(t) ? e = A.length === 1 ? "float" : A.length === 2 ? "vec2" : A.length === 3 ? "vec3" : A.length === 4 ? "vec4" : null : EA(t) ? e = A.length === 1 ? "int" : A.length === 2 ? "ivec2" : A.length === 3 ? "ivec3" : A.length === 4 ? "ivec4" : null : QA(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 Wr extends v { constructor({ vector: A, select: e }) { super({ a: A, outKey: "swizzle", outTypeFunc: (s) => kI(s, e) }), this.statements = ({ inputs: s, outputs: n }) => [ `${n.swizzle} = ${s.a}.${e};` ]; } } const TI = (t, A, e) => new ra({ index: t, from: A, to: e }), UI = (t) => new Ut({ value: t }), GI = (t) => new kA({ state: t }), RI = (t) => new TA({ state: t }), Aa = (t) => new aa({ value: t }), ta = (t) => new oa({ value: t }), ea = (t) => new ca({ value: t }), sa = (t) => new ga({ value: t }), YI = (t) => new la({ value: t }), JI = (t) => new Ia({ value: t }), na = (t) => new ua({ value: t }), ze = (t) => new ha({ value: t }), ia = (t, A, e) => new Ca({ z: t, zNear: A, zFar: e }).outputs.depth; class ra extends V { constructor({ from: A, to: e, index: s }) { super({ inTypes: { from: "int", to: "int", index: "int" }, outTypes: { index: "int" }, inputs: { from: A, to: e, index: s }, statements: ({ inputs: n, outputs: i }) => [ `${i.index} = ${n.index} - ${n.from} + ${n.to};` ] }); } dynoOut() { return new K(this, "index"); } } class kA extends V { constructor({ state: A }) { const e = $(A); super({ inTypes: { state: e }, outTypes: { state: "uint" }, inputs: { state: A }, globals: () => [ hA(` uint pcg_next(uint state) { return state * 747796405u + 2891336453u; } `) ], statements: ({ inputs: s, outputs: n }) => { const i = e === "uint" ? `${s.state}` : e === "int" ? `uint(${s.state})` : `floatBitsToUint(${s.state})`; return [`${n.state} = pcg_next(${i});`]; } }); } dynoOut() { return new K(this, "state"); } } class TA extends V { constructor({ state: A }) { super({ inTypes: { state: "uint" }, outTypes: { hash: "uint" }, inputs: { state: A }, globals: () => [ hA(` uint pcg_hash(uint state) { uint hash = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u; return (hash >> 22u) ^ hash; } `) ], statements: ({ inputs: e, outputs: s }) => [ `${s.hash} = pcg_hash(${e.state});` ] }); } dynoOut() { return new K(this, "hash"); } } class Ut extends V { constructor({ value: A }) { const e = $(A), s = Hs(e); super({ inTypes: { value: e }, outTypes: { state: "uint" }, inputs: { value: A }, globals: () => [ hA(` 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: n, outputs: i }) => { const r = QA(e) ? `${n.value}` : EA(e) ? `${s}(${n.value})` : `floatBitsToUint(${n.value})`; return [ `${s} bits = ${r};`, `${i.state} = pcg_mix(bits);` ]; } }); } dynoOut() { return new K(this, "state"); } } class aa extends PA { constructor({ value: A }) { super({ inTypes: { value: $(A) }, outTypes: { hash: "uint" }, inputs: { value: A }, construct: ({ value: e }) => { if (!e) throw new Error("value is required"); let s = new Ut({ value: e }).outputs.state; return s = new kA({ state: s }).outputs.state, new TA({ state: s }).outputs; } }); } dynoOut() { return new K(this, "hash"); } } class oa extends PA { constructor({ value: A }) { super({ inTypes: { value: $(A) }, outTypes: { hash: "uvec2" }, inputs: { value: A }, construct: ({ value: e }) => { if (!e) throw new Error("value is required"); let s = new Ut({ value: e }).outputs.state; s = new kA({ state: s }).outputs.state; const n = new TA({ state: s }).outputs.hash; s = new kA({ state: s }).outputs.state; const i = new TA({ state: s }).outputs.hash; return { hash: $A({ vectorType: "uvec2", x: n, y: i }) }; } }); } dynoOut() { return new K(this, "hash"); } } class ca extends PA { constructor({ value: A }) { super({ inTypes: { value: $(A) }, outTypes: { hash: "uvec3" }, inputs: { value: A }, construct: ({ value: e }) => { if (!e) throw new Error("value is required"); let s = new Ut({ value: e }).outputs.state; s = new kA({ state: s }).outputs.state; const n = new TA({ state: s }).outputs.hash; s = new kA({ state: s }).outputs.state; const i = new TA({ state: s }).outputs.hash; s = new kA({ state: s }).outputs.state; const r = new TA({ state: s }).outputs.hash; return { hash: $A({ vectorType: "uvec3", x: n, y: i, z: r }) }; } }); } dynoOut() { return new K(this, "hash"); } } class ga extends PA { constructor({ value: A }) { super({ inTypes: { value: $(A) }, outTypes: { hash: "uvec4" }, inputs: { value: A }, construct: ({ value: e }) => { if (!e) throw new Error("value is required"); let s = new Ut({ value: e }).outputs.state; s = new kA({ state: s }).outputs.state; const n = new TA({ state: s }).outputs.hash; s = new kA({ state: s }).outputs.state; const i = new TA({ state: s }).outputs.hash; s = new kA({ state: s }).outputs.state; const r = new TA({ state: s }).outputs.hash; s = new kA({ state: s }).outputs.state; const a = new TA({ state: s }).outputs.hash; return { hash: $A({ vectorType: "uvec4", x: n, y: i, z: r, w: a }) }; } }); } dynoOut() { return new K(this, "hash"); } } class la extends PA { constructor({ value: A }) { super({ inTypes: { value: $(A) }, outTypes: { hash: "float" }, inputs: { value: A }, construct: ({ value: e }) => { if (!e) throw new Error("value is required"); const s = Aa(e); return { hash: iA(Oi(s), J("float", 1 / 2 ** 32)) }; } }); } dynoOut() { return new K(this, "hash"); } } class Ia extends PA { constructor({ value: A }) { super({ inTypes: { value: $(A) }, outTypes: { hash: "vec2" }, inputs: { value: A }, construct: ({ value: e }) => { if (!e) throw new Error("value is required"); const s = ta(e); return { hash: iA(ji(s), J("float", 1 / 2 ** 32)) }; } }); } dynoOut() { return new K(this, "hash"); } } class ua extends PA { constructor({ value: A }) { super({ inTypes: { value: $(A) }, outTypes: { hash: "vec3" }, inputs: { value: A }, construct: ({ value: e }) => { if (!e) throw new Error("value is required"); const s = ea(e); return { hash: iA(Et(s), J("float", 1 / 2 ** 32)) }; } }); } dynoOut() { return new K(this, "hash"); } } class ha extends PA { constructor({ value: A }) { super({ inTypes: { value: $(A) }, outTypes: { hash: "vec4" }, inputs: { value: A }, construct: ({ value: e }) => { if (!e) throw new Error("value is required"); const s = sa(e); return { hash: iA(Wi(s), J("float", 1 / 2 ** 32)) }; } }); } dynoOut() { return new K(this, "hash"); } } class Ca extends V { constructor({ z: A, zNear: e, zFar: s }) { super({ inTypes: { z: "float", zNear: "float", zFar: "float" }, outTypes: { depth: "float" }, inputs: { z: A, zNear: e, zFar: s }, statements: ({ inputs: n, outputs: i }) => [ `float clamped = clamp(${n.z}, ${n.zNear}, ${n.zFar});`, `${i.depth} = (log2(clamped + 1.0) - log2(${n.zNear} + 1.0)) / (log2(${n.zFar} + 1.0) - log2(${n.zNear} + 1.0));` ] }); } dynoOut() { return new K(this, "depth"); } } const Ba = (t, { scale: A, scales: e, rotate: s, translate: n }) => new Qa({ position: t, scale: A, scales: e, rotate: s, translate: n }).outputs.position, Ea = (t, { scale: A, scales: e, rotate: s }) => new pa({ dir: t, scale: A, scales: e, rotate: s }).outputs.dir, _I = (t, { rotate: A }) => new fa({ quaternion: t, rotate: A }).outputs.quaternion; class Qa extends V { constructor({ position: A, scale: e, scales: s, rotate: n, translate: i }) { super({ inTypes: { position: "vec3", scale: "float", scales: "vec3", rotate: "vec4", translate: "vec3" }, outTypes: { position: "vec3" }, inputs: { position: A, scale: e, scales: s, rotate: n, translate: i }, statements: ({ inputs: r, outputs: a }) => { const { position: o } = a; if (!o) return []; const { scale: g, scales: l, rotate: c, translate: u } = r; return [ `${o} = ${r.position ?? "vec3(0.0, 0.0, 0.0)"};`, g ? `${o} *= ${g};` : null, l ? `${o} *= ${l};` : null, c ? `${o} = quatVec(${c}, ${o});` : null, u ? `${o} += ${u};` : null ].filter(Boolean); } }); } } class pa extends V { constructor({ dir: A, scale: e, scales: s, rotate: n }) { super({ inTypes: { dir: "vec3", scale: "float", scales: "vec3", rotate: "vec4" }, outTypes: { dir: "vec3" }, inputs: { dir: A, scale: e, scales: s, rotate: n }, statements: ({ inputs: i, outputs: r }) => { const { dir: a } = r; if (!a) return []; const { scale: o, scales: g, rotate: l } = i; return [ `${a} = ${i.dir ?? "vec3(0.0, 0.0, 0.0)"};`, o ? `${a} *= ${o};` : null, g ? `${a} *= ${g};` : null, l ? `${a} = quatVec(${l}, ${a});` : null ].filter(Boolean); } }); } } class fa extends V { constructor({ quaternion: A, rotate: e }) { super({ inTypes: { quaternion: "vec4", rotate: "vec4" }, outTypes: { quaternion: "vec4" }, inputs: { quaternion: A, rotate: e }, statements: ({ inputs: s, outputs: n }) => { const { quaternion: i } = n; return i ? [ `${i} = ${s.quaternion ?? "vec4(0.0, 0.0, 0.0, 1.0)"};`, e ? `${i} = quatQuat(${s.rotate}, ${i});` : null ].filter(Boolean) : []; } }); } } const LI = () => { throw new Error("Not implemented"); }, zI = () => { throw new Error("Not implemented"); }, HI = () => { throw new Error("Not implemented"); }, qI = () => { throw new Error("Not implemented"); }, KI = () => { throw new Error("Not implemented"); }, $I = () => { throw new Error("Not implemented"); }, VI = (t, A) => new da({ texture: t, lod: A }), PI = (t, A, e) => new ya({ texture: t, coord: A, bias: e }), ZI = (t, A, e) => new wa({ texture: t, coord: A, lod: e }); class da extends V { constructor({ texture: A, lod: e }) { const s = $(A); super({ inTypes: { texture: s, lod: "int" }, outTypes: { size: ma(s) }, inputs: { texture: A, lod: e }, statements: ({ inputs: n, outputs: i }) => [ `${i.size} = textureSize(${n.texture}, ${n.lod ?? "0"});` ] }); } dynoOut() { return new K(this, "size"); } } class ya extends V { constructor({ texture: A, coord: e, bias: s }) { const n = $(A); super({ inTypes: { texture: n, coord: XI(n), bias: "float" }, outTypes: { sample: xa(n) }, inputs: { texture: A, coord: e, bias: s }, statements: ({ inputs: i, outputs: r }) => [ `${r.sample} = texture(${i.texture}, ${i.coord}${i.bias ? `, ${i.bias}` : ""});` ] }); } dynoOut() { return new K(this, "sample"); } } class wa extends V { constructor({ texture: A, coord: e, lod: s }) { const n = $(A); super({ inTypes: { texture: n, coord: ma(n), lod: "int" }, outTypes: { texel: xa(n) }, inputs: { texture: A, coord: e, lod: s }, statements: ({ inputs: i, outputs: r }) => [ `${r.texel} = texelFetch(${i.texture}, ${i.coord}, ${i.lod ?? "0"});` ] }); } dynoOut() { return new K(this, "texel"); } } function ma(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 XI(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 xa(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 OI = (t) => new Sa({ degrees: t }), jI = (t) => new Da({ radians: t }), He = (t) => new Ma({ radians: t }), WI = (t) => new va({ radians: t }), Au = (t) => new ba({ radians: t }), tu = (t) => new Fa({ sin: t }), eu = (t) => new Na({ cos: t }), su = (t) => new ka({ tan: t }), nu = (t, A) => new Ta({ y: t, x: A }), iu = (t) => new Ua({ x: t }), ru = (t) => new Ga({ x: t }), au = (t) => new Ra({ x: t }), ou = (t) => new Ya({ x: t }), cu = (t) => new Ja({ x: t }), gu = (t) => new _a({ x: t }); class Sa extends v { constructor({ degrees: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "radians" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.radians} = radians(${e.a});` ]; } } class Da extends v { constructor({ radians: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "degrees" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.degrees} = degrees(${e.a});` ]; } } class Ma extends v { constructor({ radians: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "sin" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.sin} = sin(${e.a});` ]; } } class va extends v { constructor({ radians: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "cos" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.cos} = cos(${e.a});` ]; } } class ba extends v { constructor({ radians: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "tan" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.tan} = tan(${e.a});` ]; } } class Fa extends v { constructor({ sin: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "asin" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.asin} = asin(${e.a});` ]; } } class Na extends v { constructor({ cos: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "acos" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.acos} = acos(${e.a});` ]; } } class ka extends v { constructor({ tan: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "atan" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.atan} = atan(${e.a});` ]; } } class Ta extends tA { constructor({ y: A, x: e }) { super({ a: A, b: e, outTypeFunc: (s, n) => s, outKey: "atan2" }), this.statements = ({ inputs: s, outputs: n }) => [ `${n.atan2} = atan2(${s.a}, ${s.b});` ]; } } class Ua extends v { constructor({ x: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "sinh" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.sinh} = sinh(${e.a});` ]; } } class Ga extends v { constructor({ x: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "cosh" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.cosh} = cosh(${e.a});` ]; } } class Ra extends v { constructor({ x: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "tanh" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.tanh} = tanh(${e.a});` ]; } } class Ya extends v { constructor({ x: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "asinh" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.asinh} = asinh(${e.a});` ]; } } class Ja extends v { constructor({ x: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "acosh" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.acosh} = acosh(${e.a});` ]; } } class _a extends v { constructor({ x: A }) { super({ a: A, outTypeFunc: (e) => e, outKey: "atanh" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.atanh} = atanh(${e.a});` ]; } } const Hh = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, Abs: Ii, Acos: Na, Acosh: Ja, Add: ni, All: Vi, And: Gi, Any: $i, Asin: Fa, Asinh: Ya, Atan: ka, Atan2: Ta, Atanh: _a, BVec2: ar, BVec3: or, BVec4: cr, BinaryOp: tA, Bool: sr, Ceil: Ci, Clamp: vi, Combine: jr, CombineGsplat: Ws, CompMult: $r, CompXor: Xi, Compilation: $s, Cos: va, Cosh: Ga, Cross: Jr, Degrees: Da, Determinant: Zr, Distance: Rr, Div: ai, Dot: Yr, Dyno: V, DynoBlock: PA, DynoBool: oe, DynoBvec2: an, DynoBvec3: gn, DynoBvec4: un, DynoConst: Ks, DynoFloat: Ct, DynoInt: Kt, DynoIsampler2D: vn, DynoIsampler2DArray: Fn, DynoIsampler3D: Tn, DynoIsamplerCube: Rn, DynoIvec2: cn, DynoIvec3: In, DynoIvec4: Cn, DynoLiteral: vt, DynoMat2: Bn, DynoMat2x2: En, DynoMat2x3: Qn, DynoMat2x4: pn, DynoMat3: fn, DynoMat3x2: dn, DynoMat3x3: yn, DynoMat3x4: wn, DynoMat4: mn, DynoMat4x2: xn, DynoMat4x3: Sn, DynoMat4x4: Dn, DynoOutput: K, DynoProgram: ns, DynoProgramTemplate: is, DynoRemapIndex: ra, DynoSampler2D: bn, DynoSampler2DArray: Nn, DynoSampler2DArrayShadow: _n, DynoSampler2DShadow: Jn, DynoSampler3D: Un, DynoSamplerCube: Yn, DynoSamplerCubeShadow: Ln, DynoUint: rn, DynoUniform: N, DynoUsampler2D: Mn, DynoUsampler2DArray: Ht, DynoUsampler3D: kn, DynoUsamplerCube: Gn, DynoUvec2: on, DynoUvec3: ln, DynoUvec4: hn, DynoValue: rt, DynoVec2: zt, DynoVec3: Ft, DynoVec4: Tt, Equal: qi, Exp: fi, Exp2: di, ExtendVec: zr, FaceForward: Hr, Float: rr, FloatBitsToInt: yr, FloatBitsToUint: wr, Floor: hi, Fract: Qi, GreaterThan: zi, GreaterThanEqual: Hi, Gsplat: AA, GsplatNormal: tn, Hash: aa, Hash2: oa, Hash3: ca, Hash4: ga, HashFloat: la, HashVec2: Ia, HashVec3: ua, HashVec4: ha, IMod: oi, IVec2: gr, IVec3: lr, IVec4: Ir, Int: nr, IntBitsToFloat: mr, Inverse: Xr, InverseSqrt: Si, IsInf: Ti, IsNan: ki, Length: Gr, LessThan: _i, LessThanEqual: Li, Log: yi, Log2: wi, Mat2: pr, Mat3: fr, Mat4: dr, Max: Mi, Min: Di, Mix: bi, Mod: ci, Modf: gi, Mul: ri, Neg: li, Normalize: _r, NormalizedDepth: Ca, Not: Ji, NotEqual: Ki, NumPackedSplats: Ps, Or: Ri, Outer: Vr, OutputPackedSplat: nn, OutputRgba8: es, PackHalf2x16: br, PackSnorm2x16: Sr, PackUnorm2x16: Mr, PcgHash: TA, PcgMix: Ut, PcgNext: kA, Pow: pi, ProjectH: Lr, Radians: Sa, ReadPackedSplat: Xs, ReadPackedSplatRange: Os, ReflectVec: qr, RefractVec: Kr, Round: Ei, Select: Pi, Sign: ui, SimpleCast: cA, Sin: Ma, Sinh: Ua, Smoothstep: Ni, Split: Or, SplitGsplat: js, Sqr: mi, Sqrt: xi, Step: Fi, Sub: ii, Swizzle: Wr, TPackedSplats: Ot, Tan: ba, Tanh: Ra, TexelFetch: wa, Texture: ya, TextureSize: da, TransformDir: pa, TransformGsplat: en, TransformPosition: Qa, TransformQuaternion: fa, Transpose: Pr, TrinaryOp: yt, Trunc: Bi, UVec2: ur, UVec3: hr, UVec4: Cr, Uint: ir, UintBitsToFloat: xr, UintToRgba8: Nr, UnaryOp: v, UnpackHalf2x16: Fr, UnpackSnorm2x16: Dr, UnpackUnorm2x16: vr, Vec2: Br, Vec3: Er, Vec4: Qr, Xor: Yi, abs: ul, acos: eu, acosh: cu, add: BA, all: Hl, and: kl, any: zl, arrayIndex: KI, arrayLength: $I, asin: tu, asinh: ou, atan: su, atan2: nu, atanh: gu, bool: Vl, bvec2: Xl, bvec3: Ol, bvec4: jl, ceil: Bl, clamp: Ml, combine: $A, combineGsplat: at, comment: qI, compMult: wI, compXor: ql, cos: WI, cosh: ru, cross: EI, defineGsplat: bA, defineGsplatNormal: An, definePackedSplats: Ee, degrees: jI, determinant: SI, distance: BI, div: ie, dot: kr, dyno: Xt, dynoBlock: vA, dynoBool: uc, dynoBvec2: Bc, dynoBvec3: fc, dynoBvec4: wc, dynoConst: J, dynoDeclare: As, dynoFloat: HA, dynoFor: HI, dynoIf: LI, dynoInt: Cc, dynoIsampler2D: _c, dynoIsampler2DArray: Hc, dynoIsampler3D: $c, dynoIsamplerCube: Zc, dynoIvec2: Qc, dynoIvec3: yc, dynoIvec4: xc, dynoLiteral: ae, dynoMat2: Dc, dynoMat2x2: Mc, dynoMat2x3: vc, dynoMat2x4: bc, dynoMat3: Fc, dynoMat3x2: Nc, dynoMat3x3: kc, dynoMat3x4: Tc, dynoMat4: Uc, dynoMat4x2: Gc, dynoMat4x3: Rc, dynoMat4x4: Yc, dynoSampler2D: Lc, dynoSampler2DArray: qc, dynoSampler2DArrayShadow: jc, dynoSampler2DShadow: Oc, dynoSampler3D: Vc, dynoSamplerCube: Xc, dynoSamplerCubeShadow: Wc, dynoSwitch: zI, dynoUint: hc, dynoUsampler2D: Jc, dynoUsampler2DArray: zc, dynoUsampler3D: Kc, dynoUsamplerCube: Pc, dynoUvec2: Ec, dynoUvec3: dc, dynoUvec4: mc, dynoVec2: pc, dynoVec3: et, dynoVec4: Sc, equal: _l, exp: fl, exp2: dl, extendVec: Ur, faceforward: QI, float: Oi, floatBitsToInt: Ar, floatBitsToUint: tr, floor: Cl, fract: re, greaterThan: Jl, greaterThanEqual: Ui, gsplatNormal: Ge, hash: Aa, hash2: ta, hash3: ea, hash4: sa, hashFloat: YI, hashVec2: JI, hashVec3: na, hashVec4: ze, imod: _e, int: Pl, intBitsToFloat: oI, inverse: DI, inversesqrt: Sl, isAllFloatType: ot, isBoolType: ft, isFloatType: Pt, isInf: Nl, isIntType: EA, isMat2: ct, isMat3: gt, isMat4: lt, isMatFloatType: _s, isNan: Fl, isScalarType: dt, isUintType: QA, isVector2Type: Nt, isVector3Type: kt, isVector4Type: Zt, isVectorType: ic, ivec2: Wl, ivec3: AI, ivec4: tI, length: CI, lessThan: Rl, lessThanEqual: Yl, literalNegOne: cc, literalOne: oc, literalZero: Jt, log: yl, log2: wl, mat2: iI, mat3: rI, mat4: aI, max: ei, min: Dl, mix: si, mod: ti, modf: Il, mul: iA, neg: as, normalize: Tr, normalizedDepth: ia, not: Gl, notEqual: Ll, numPackedSplats: gc, numberAsFloat: H, numberAsInt: rA, numberAsUint: aA, or: Tl, outer: mI, outputPackedSplat: sn, outputRgba8: lc, packHalf2x16: er, packSnorm2x16: gI, packUnorm2x16: II, pcgHash: RI, pcgMix: UI, pcgNext: GI, pow: pl, projectH: dI, radians: OI, readPackedSplat: bt, readPackedSplatRange: Vs, reflectVec: pI, refractVec: fI, remapIndex: TI, round: Ql, sameSizeIvec: ac, sameSizeUvec: Hs, sameSizeVec: rc, select: os, sign: hl, sin: He, sinh: iu, smoothstep: bl, split: Qt, splitGsplat: ht, sqr: ml, sqrt: xl, step: vl, sub: pt, swizzle: yI, tan: Au, tanh: au, texelFetch: ZI, texture: PI, textureSize: VI, transformDir: Ea, transformGsplat: ts, transformPos: Ba, transformQuat: _I, transpose: xI, trunc: El, typeLiteral: qs, uint: Zl, uintBitsToFloat: cI, uintToRgba8: Le, uniform: Ic, unindent: hA, unindentLines: RA, unpackHalf2x16: hI, unpackSnorm2x16: lI, unpackUnorm2x16: uI, uvec2: eI, uvec3: sI, uvec4: nI, valType: $, vec2: ji, vec3: Et, vec4: Wi, vectorDim: zs, vectorElementType: Ls, xor: Ul }, Symbol.toStringTag, { value: "Module" })); var lu = `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 NA = class NA { 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 n = Math.ceil(Math.max(1, A) / Z) * Z * 4; if (e.byteLength >= n) return e; const i = new ArrayBuffer(n); if (e instanceof ArrayBuffer) return i; const r = e.constructor; return new r(i); } // Ensure our render target is large enough for the readback of capacity indices. ensureCapacity(A) { const { width: e, height: s, depth: n, maxSplats: i } = mA(A); (!this.target || i > this.capacity) && (this.dispose(), this.capacity = i, this.target = new I.WebGLArrayRenderTarget(e, s, n, { depthBuffer: !1, stencilBuffer: !1, generateMipmaps: !1, magFilter: I.NearestFilter, minFilter: I.NearestFilter }), this.target.texture.format = I.RGBAFormat, this.target.texture.type = I.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 = NA.readbackProgram.get(A); if (!e) { const n = vA( { index: "int" }, { rgba8: "vec4" }, ({ index: i }) => (A.inputs.index = i, { rgba8: new es({ rgba8: A.outputs.rgba8 }) }) ); NA.programTemplate || (NA.programTemplate = new is(lu)), e = new ns({ graph: n, inputs: { index: "index" }, outputs: { rgba8: "target" }, template: NA.programTemplate }), Object.assign(e.uniforms, { targetLayer: { value: 0 }, targetBase: { value: 0 }, targetCount: { value: 0 } }), NA.readbackProgram.set(A, e); } const s = e.prepareMaterial(); return NA.fullScreenQuad.material = s, { program: e, material: s }; } saveRenderState(A) { return { xrEnabled: A.xr.enabled, autoClear: A.autoClear }; } resetRenderState(A, e) { A.setRenderTarget(null), A.xr.enabled = e.xrEnabled, A.autoClear = e.autoClear; } process({ count: A, material: e }) { const s = this.renderer; if (!s) throw new Error("No renderer"); if (!this.target) throw new Error("No target"); const n = Z * KA; e.uniforms.targetBase.value = 0, e.uniforms.targetCount.value = A; let i = 0; for (; i < A; ) { const r = Math.floor(i / n), a = r * n, o = Math.min( KA, Math.ceil((A - a) / Z) ); e.uniforms.targetLayer.value = r, this.target.scissor.set(0, 0, Z, o), s.setRenderTarget(this.target, r), s.xr.enabled = !1, s.autoClear = !1, NA.fullScreenQuad.render(s), i += Z * o; } this.count = A; } async read({ readback: A }) { const e = this.renderer; if (!e) throw new Error("No renderer"); if (!this.target) throw new Error("No target"); const s = Math.ceil(this.count / Z) * Z; if (A.byteLength < s * 4) throw new Error( `Readback buffer too small: ${A.byteLength} < ${s * 4}` ); const n = new Uint8Array( A instanceof ArrayBuffer ? A : A.buffer ), i = Z * KA; let r = 0; const a = []; for (; r < this.count; ) { const o = Math.floor(r / i), g = o * i, l = Math.min( KA, Math.ceil((this.count - g) / Z) ); e.setRenderTarget(this.target, o); const c = Z * l * 4, u = n.subarray( g * 4, g * 4 + c ), h = e == null ? void 0 : e.readRenderTargetPixelsAsync( this.target, 0, 0, Z, l, u ); a.push(h), r += Z * l; } return Promise.all(a).then(() => A); } // Perform render operation to run the Rgba8Readback program // but don't perform the readback yet. render({ reader: A, count: e, renderer: s }) { if (this.renderer = s || this.renderer, !this.renderer) throw new Error("No renderer"); this.ensureCapacity(e); const { program: n, material: i } = this.prepareProgramMaterial(A); n.update(); const r = this.saveRenderState(this.renderer); this.process({ count: e, material: i }), this.resetRenderState(this.renderer, r); } // Perform a readback of the render target, returning a buffer of the // given type. async readback({ readback: A }) { if (!this.renderer) throw new Error("No renderer"); const e = this.saveRenderState(this.renderer), s = this.read({ readback: A }); return this.resetRenderState(this.renderer, e), s; } // Perform a render and readback operation for the given Rgba8Readback, // and readback buffer (call ensureBuffer first). async renderReadback({ reader: A, count: e, renderer: s, readback: n }) { if (this.renderer = s || this.renderer, !this.renderer) throw new Error("No renderer"); this.ensureCapacity(e); const { program: i, material: r } = this.prepareProgramMaterial(A); i.update(); const a = this.saveRenderState(this.renderer); this.process({ count: e, material: r }); const o = this.read({ readback: n }); return this.resetRenderState(this.renderer, a), o; } getTexture() { var A; return (A = this.target) == null ? void 0 : A.texture; } }; NA.programTemplate = null, NA.readbackProgram = /* @__PURE__ */ new Map(), NA.fullScreenQuad = new xs( new I.RawShaderMaterial({ visible: !1 }) ); let ge = NA; const IA = class IA { constructor(A = {}) { this.capacity = 0, this.count = 0, this.array = null, this.readback = null, this.source = null, this.needsUpdate = !0, this.dyno = new N({ key: "rgbaArray", type: La, globals: () => [za], value: { texture: IA.getEmpty(), count: 0 }, update: (e) => { var s; return e.texture = ((s = this.readback) == null ? void 0 : s.getTexture()) ?? this.source ?? IA.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 / Z) * Z, this.count = Math.min( this.capacity, A.count ?? Number.POSITIVE_INFINITY )) : (this.capacity = A.capacity ?? 0, this.count = 0); } // Free up resources dispose() { this.readback && (this.readback.dispose(), this.readback = null), this.source && (this.source.dispose(), this.source = null); } // Ensure that our array is large enough to hold capacity RGBA8 values. ensureCapacity(A) { var e; if (!this.array || A > (((e = this.array) == null ? void 0 : e.length) ?? 0) / 4) { this.capacity = mA(A).maxSplats; const s = new Uint8Array(this.capacity * 4); this.array && s.set(this.array), this.array = s; } return this.array; } // Get the THREE.DataArrayTexture from either the readback or the source. getTexture() { var e; let A = (e = this.readback) == null ? void 0 : e.getTexture(); return (this.source || this.array) && (A = this.maybeUpdateSource()), A ?? IA.getEmpty(); } // Create or get a THREE.DataArrayTexture from the data array. maybeUpdateSource() { if (!this.array) throw new Error("No array"); if (this.needsUpdate || !this.source) { if (this.needsUpdate = !1, this.source) { const { width: A, height: e, depth: s } = this.source.image; this.capacity !== A * e * s && (this.source.dispose(), this.source = null); } if (this.source) this.array.buffer !== this.source.image.data.buffer && (this.source.image.data = new Uint8Array(this.array.buffer)); else { const { width: A, height: e, depth: s } = mA(this.capacity); this.source = new I.DataArrayTexture( this.array, A, e, s ), this.source.format = I.RGBAFormat, this.source.type = I.UnsignedByteType, this.source.internalFormat = "RGBA8", this.source.needsUpdate = !0; } this.source.needsUpdate = !0; } return this.source; } // Generate the RGBA8 values from a Rgba8Readback dyno program. render({ reader: A, count: e, renderer: s }) { this.readback || (this.readback = new ge({ renderer: s })), this.readback.render({ reader: A, count: e, renderer: s }), this.capacity = this.readback.capacity, this.count = this.readback.count; } // Extract the RGBA8 values from a PackedSplats collection. fromPackedSplats({ packedSplats: A, base: e, count: s, renderer: n }) { const { dynoSplats: i, dynoBase: r, dynoCount: a, reader: o } = IA.makeDynos(); return i.packedSplats = A, r.value = e, a.value = s, this.render({ reader: o, count: s, renderer: n }), 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 (!IA.emptySource) { const A = new Uint8Array(4); IA.emptySource = new I.DataArrayTexture(A, 1, 1, 1), IA.emptySource.format = I.RGBAFormat, IA.emptySource.type = I.UnsignedByteType, IA.emptySource.internalFormat = "RGBA8", IA.emptySource.needsUpdate = !0; } return IA.emptySource; } // Create a dyno program that can extract RGBA8 values from a PackedSplats static makeDynos() { if (!IA.dynos) { const A = new ls(), e = new Kt({ value: 0 }), s = new Kt({ value: 0 }), n = vA( { index: "int" }, { rgba8: "vec4" }, ({ index: i }) => { if (!i) throw new Error("index is undefined"); i = BA(i, e); const r = Vs( A, i, e, s ); return { rgba8: ht(r).outputs.rgba }; } ); IA.dynos = { dynoSplats: A, dynoBase: e, dynoCount: s, reader: n }; } return IA.dynos; } }; IA.emptySource = null, IA.dynos = null; let qe = IA; const La = { type: "RgbaArray" }, za = hA(` struct RgbaArray { sampler2DArray texture; int count; }; `); function Iu(t, A) { return new V({ inTypes: { rgba: La, index: "int" }, outTypes: { rgba: "vec4" }, inputs: { rgba: t, index: A }, globals: () => [za], statements: ({ inputs: s, outputs: n }) => RA(` if ((index >= 0) && (index < ${s.rgba}.count)) { ${n.rgba} = texelFetch(${s.rgba}.texture, splatTexCoord(index), 0); } else { ${n.rgba} = vec4(0.0, 0.0, 0.0, 0.0); } `) }).outputs.rgba; } var uu = /* @__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))(uu || {}); function hu(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 Cu = /* @__PURE__ */ ((t) => (t.MULTIPLY = "multiply", t.SET_RGB = "set_rgb", t.ADD_RGBA = "add_rgba", t))(Cu || {}); function Bu(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 Eu extends I.Object3D { constructor(A = {}) { super(); const { type: e, invert: s, opacity: n, color: i, displace: r, radius: a } = A; this.type = e ?? "sphere", this.invert = s ?? !1, this.opacity = n ?? 1, this.color = i ?? new I.Color(1, 1, 1), this.displace = r ?? new I.Vector3(0, 0, 0), this.radius = a ?? 0; } } const Be = class Be extends I.Object3D { constructor(A = {}) { const { name: e, rgbaBlendMode: s = "multiply", sdfSmooth: n = 0, softEdge: i = 0, invert: r = !1, sdfs: a = null } = A; super(), this.rgbaBlendMode = s, this.sdfSmooth = n, this.softEdge = i, this.invert = r, this.sdfs = a, this.ordering = Be.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)); } }; Be.nextOrdering = 1; let le = Be; class Qu { 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 N({ key: "sdfArray", type: Ha, globals: () => [qa], value: { numSdfs: 0, sdfTexture: this.sdfTexture }, update: (s) => (s.numSdfs = this.numSdfs, s.sdfTexture = this.sdfTexture, s) }), this.maxEdits = Math.max(16, e ?? 0), this.numEdits = 0, this.editData = new Uint32Array(this.maxEdits * 4), this.editFloatData = new Float32Array(this.editData.buffer), this.dynoNumEdits = new Kt({ value: 0 }), this.dynoEdits = this.newEdits(this.editData, this.maxEdits); } newSdfTexture(A, e) { const s = new I.DataTexture( A, 8, e, I.RGBAIntegerFormat, I.UnsignedIntType ); return s.internalFormat = "RGBA32UI", s.needsUpdate = !0, s; } newEdits(A, e) { return new N({ key: "edits", type: "uvec4", count: e, globals: () => [Ka], value: A }); } // Ensure our SDF texture and edits uniform array have enough capacity. // Reallocate if not. ensureCapacity({ maxSdfs: A, maxEdits: e }) { let s = !1; return A > this.sdfTexture.image.height && (this.sdfTexture.dispose(), this.maxSdfs = Math.max(this.maxSdfs * 2, A), this.sdfData = new Uint32Array(this.maxSdfs * 8 * 4), this.sdfFloatData = new Float32Array(this.sdfData.buffer), this.sdfTexture = this.newSdfTexture(this.sdfData, this.maxSdfs)), e > (this.dynoEdits.count ?? 0) && (this.maxEdits = Math.max(this.maxEdits * 2, e), this.editData = new Uint32Array(this.maxEdits * 4), this.editFloatData = new Float32Array(this.editData.buffer), this.dynoEdits = this.newEdits(this.editData, this.maxEdits), s = !0), s; } updateEditData(A, e) { const s = this.editData[A] !== e; return this.editData[A] = e, s; } updateEditFloatData(A, e) { wt[0] = e; const s = this.editFloatData[A] !== wt[0]; return s && (this.editFloatData[A] = wt[0]), s; } encodeEdit(A, { sdfFirst: e, sdfCount: s, invert: n, rgbaBlendMode: i, softEdge: r, sdfSmooth: a }) { const o = A * 4; let g = !1; return g = this.updateEditData(o + 0, i | (n ? 256 : 0)) || g, g = this.updateEditData(o + 1, e | s << 16) || g, g = this.updateEditFloatData(o + 2, r) || g, g = this.updateEditFloatData(o + 3, a) || g, g; } updateSdfData(A, e) { const s = this.sdfData[A] !== e; return this.sdfData[A] = e, s; } updateSdfFloatData(A, e) { wt[0] = e; const s = this.sdfFloatData[A] !== wt[0]; return s && (this.sdfFloatData[A] = wt[0]), s; } encodeSdf(A, { sdfType: e, invert: s, center: n, quaternion: i, scale: r, sizes: a }, o) { const g = A * 32, l = e | (s ? 256 : 0); let c = !1; c = this.updateSdfFloatData(g + 0, (n == null ? void 0 : n.x) ?? 0) || c, c = this.updateSdfFloatData(g + 1, (n == null ? void 0 : n.y) ?? 0) || c, c = this.updateSdfFloatData(g + 2, (n == null ? void 0 : n.z) ?? 0) || c, c = this.updateSdfData(g + 3, l) || c, c = this.updateSdfFloatData(g + 4, (i == null ? void 0 : i.x) ?? 0) || c, c = this.updateSdfFloatData(g + 5, (i == null ? void 0 : i.y) ?? 0) || c, c = this.updateSdfFloatData(g + 6, (i == null ? void 0 : i.z) ?? 0) || c, c = this.updateSdfFloatData(g + 7, (i == null ? void 0 : i.w) ?? 0) || c, c = this.updateSdfFloatData(g + 8, (r == null ? void 0 : r.x) ?? 0) || c, c = this.updateSdfFloatData(g + 9, (r == null ? void 0 : r.y) ?? 0) || c, c = this.updateSdfFloatData(g + 10, (r == null ? void 0 : r.z) ?? 0) || c, c = this.updateSdfData(g + 11, 0) || c, c = this.updateSdfFloatData(g + 12, (a == null ? void 0 : a.x) ?? 0) || c, c = this.updateSdfFloatData(g + 13, (a == null ? void 0 : a.y) ?? 0) || c, c = this.updateSdfFloatData(g + 14, (a == null ? void 0 : a.z) ?? 0) || c, c = this.updateSdfFloatData(g + 15, (a == null ? void 0 : a.w) ?? 0) || c; const u = Math.min(4, o.length); for (let h = 0; h < u; ++h) { const E = g + 16 + h * 4; c = this.updateSdfFloatData(E + 0, o[h].x) || c, c = this.updateSdfFloatData(E + 1, o[h].y) || c, c = this.updateSdfFloatData(E + 2, o[h].z) || c, c = this.updateSdfFloatData(E + 3, o[h].w) || c; } return c; } // 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((c, { sdfs: u }) => c + u.length, 0), s = this.ensureCapacity({ maxEdits: A.length, maxSdfs: e }), n = [new I.Vector4(), new I.Vector4()], i = new I.Vector3(), r = new I.Quaternion(), a = new I.Vector3(), o = new I.Vector4(); let g = 0, l = s; A.length !== this.dynoNumEdits.value && (this.dynoNumEdits.value = A.length, this.numEdits = A.length, l = !0); for (const [c, { edit: u, sdfs: h }] of A.entries()) { l = this.encodeEdit(c, { sdfFirst: g, sdfCount: h.length, invert: u.invert, rgbaBlendMode: Bu(u.rgbaBlendMode), softEdge: u.softEdge, sdfSmooth: u.sdfSmooth }) || l; let E = !1; for (const C of h) o.set(C.scale.x, C.scale.y, C.scale.z, C.radius), C.scale.setScalar(1), C.updateMatrixWorld(), C.matrixWorld.clone().invert().decompose(i, r, a), C.scale.set(o.x, o.y, o.z), C.updateMatrixWorld(), n[0].set(C.color.r, C.color.g, C.color.b, C.opacity), n[1].set(C.displace.x, C.displace.y, C.displace.z, 1), E = this.encodeSdf( g, { sdfType: hu(C.type), invert: C.invert, center: i, quaternion: r, scale: a, sizes: o }, n ) || E, g += 1; this.numSdfs = g, E && (this.sdfTexture.needsUpdate = !0), l || (l = E); } return { updated: l, dynoUpdated: s }; } // Modify a Gsplat in a dyno shader program using the current edits and SDFs. modify(A) { return pu( A, this.dynoSdfArray, this.dynoNumEdits, this.dynoEdits ); } } const Ha = { type: "SdfArray" }, qa = hA(` struct SdfArray { int numSdfs; usampler2D sdfTexture; }; void unpackSdfArray( usampler2D sdfTexture, int sdfIndex, out uint flags, out vec3 center, out vec4 quaternion, out vec3 scale, out vec4 sizes, int numValues, out vec4 values[4] ) { uvec4 temp = texelFetch(sdfTexture, ivec2(0, sdfIndex), 0); flags = temp.w; center = vec3(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z)); temp = texelFetch(sdfTexture, ivec2(1, sdfIndex), 0); quaternion = vec4(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z), uintBitsToFloat(temp.w)); temp = texelFetch(sdfTexture, ivec2(2, sdfIndex), 0); scale = vec3(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z)); temp = texelFetch(sdfTexture, ivec2(3, sdfIndex), 0); sizes = vec4(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z), uintBitsToFloat(temp.w)); for (int i = 0; i < numValues; ++i) { temp = texelFetch(sdfTexture, ivec2(4 + i, sdfIndex), 0); values[i] = vec4(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z), uintBitsToFloat(temp.w)); } } const uint SDF_FLAG_TYPE = 0xFFu; const uint SDF_FLAG_INVERT = 1u << 8u; const uint SDF_TYPE_ALL = 0u; const uint SDF_TYPE_PLANE = 1u; const uint SDF_TYPE_SPHERE = 2u; const uint SDF_TYPE_BOX = 3u; const uint SDF_TYPE_ELLIPSOID = 4u; const uint SDF_TYPE_CYLINDER = 5u; const uint SDF_TYPE_CAPSULE = 6u; const uint SDF_TYPE_INFINITE_CONE = 7u; float evaluateSdfArray( usampler2D sdfTexture, int numSdfs, int sdfFirst, int sdfCount, vec3 pos, float smoothK, int numValues, out vec4 outValues[4] ) { float distanceAccum = (smoothK == 0.0) ? 1.0 / 0.0 : 0.0; float maxExp = -1.0 / 0.0; for (int i = 0; i < numValues; ++i) { outValues[i] = vec4(0.0); } uint flags; vec3 center, scale; vec4 quaternion, sizes; vec4 values[4]; int sdfLast = min(sdfFirst + sdfCount, numSdfs); for (int index = sdfFirst; index < sdfLast; ++index) { unpackSdfArray(sdfTexture, index, flags, center, quaternion, scale, sizes, numValues, values); uint sdfType = flags & SDF_FLAG_TYPE; vec3 sdfPos = quatVec(quaternion, pos * scale) + center; float distance; switch (sdfType) { case SDF_TYPE_ALL: distance = -1.0 / 0.0; break; case SDF_TYPE_PLANE: { distance = sdfPos.z; break; } case SDF_TYPE_SPHERE: { distance = length(sdfPos) - sizes.w; break; } case SDF_TYPE_BOX: { vec3 q = abs(sdfPos) - sizes.xyz + sizes.w; distance = length(max(q, 0.0)) + min(max(q.x, max(q.y, q.z)), 0.0) - sizes.w; break; } case SDF_TYPE_ELLIPSOID: { vec3 sizes = sizes.xyz; float k0 = length(sdfPos / sizes); float k1 = length(sdfPos / dot(sizes, sizes)); distance = k0 * (k0 - 1.0) / k1; break; } case SDF_TYPE_CYLINDER: { vec2 d = abs(vec2(length(sdfPos.xz), sdfPos.y)) - sizes.wy; distance = min(max(d.x, d.y), 0.0) + length(max(d, 0.0)); break; } case SDF_TYPE_CAPSULE: { sdfPos.y -= clamp(sdfPos.y, -0.5 * sizes.y, 0.5 * sizes.y); distance = length(sdfPos) - sizes.w; break; } case SDF_TYPE_INFINITE_CONE: { float angle = 0.25 * PI * sizes.w; vec2 c = vec2(sin(angle), cos(angle)); vec2 q = vec2(length(sdfPos.xy), -sdfPos.z); float d = length(q - c * max(dot(q, c), 0.0)); distance = d * (((q.x * c.y - q.y * c.x) < 0.0) ? -1.0 : 1.0); break; } } if ((flags & SDF_FLAG_INVERT) != 0u) { distance = -distance; } if (smoothK == 0.0) { if (distance < distanceAccum) { distanceAccum = distance; for (int i = 0; i < numValues; ++i) { outValues[i] = values[i]; } } } else { float scaledDistance = -distance / smoothK; if (scaledDistance > maxExp) { float scale = exp(maxExp - scaledDistance); distanceAccum *= scale; for (int i = 0; i < numValues; ++i) { outValues[i] *= scale; } maxExp = scaledDistance; } float weight = exp(scaledDistance - maxExp); distanceAccum += weight; for (int i = 0; i < numValues; ++i) { outValues[i] += weight * values[i]; } } } if (smoothK == 0.0) { return distanceAccum; } else { // Very distant SDFs may result in 0 accumulation if (distanceAccum == 0.0) { return 1.0 / 0.0; } for (int i = 0; i < numValues; ++i) { outValues[i] /= distanceAccum; } return (-log(distanceAccum) - maxExp) * smoothK; } } float modulateSdfArray( usampler2D sdfTexture, int numSdfs, int sdfFirst, int sdfCount, vec3 pos, float smoothK, int numValues, out vec4 values[4], float softEdge, bool invert ) { float distance = evaluateSdfArray(sdfTexture, numSdfs, sdfFirst, sdfCount, pos, smoothK, numValues, values); if (invert) { distance = -distance; } return (softEdge == 0.0) ? ((distance < 0.0) ? 1.0 : 0.0) : clamp(-distance / softEdge + 0.5, 0.0, 1.0); } `), Ka = hA(` 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 pu(t, A, e, s) { return new V({ inTypes: { gsplat: AA, sdfArray: Ha, numEdits: "int", rgbaDisplaceEdits: "uvec4" }, outTypes: { gsplat: AA }, globals: () => [qa, Ka], inputs: { gsplat: t, sdfArray: A, numEdits: e, rgbaDisplaceEdits: s }, statements: ({ inputs: i, outputs: r }) => { const { sdfArray: a, numEdits: o, rgbaDisplaceEdits: g } = i, { gsplat: l } = r; return RA(` ${l} = ${i.gsplat}; if (isGsplatActive(${l}.flags)) { for (int editIndex = 0; editIndex < ${o}; ++editIndex) { applyPackedRgbaDisplaceEdit( ${g}[editIndex], ${a}.sdfTexture, ${a}.numSdfs, ${l}.center, ${l}.rgba ); } } `); } }).outputs.gsplat; } const wt = new Float32Array(1); class fu { constructor(A) { this.modifier = A, this.cache = /* @__PURE__ */ new Map(); } apply(A) { let e = this.cache.get(A); return e || (e = vA( { index: "int" }, { gsplat: AA }, ({ index: s }) => { const { gsplat: n } = A.apply({ index: s }); return this.modifier.apply({ gsplat: n }); } ), this.cache.set(A, e)), e; } } class xt { // Create the dyno uniforms that parameterize the transform, setting them // to initial values that are different from any valid transform. constructor() { this.scale = new Ct({ value: Number.NEGATIVE_INFINITY }), this.rotate = new Tt({ value: new I.Quaternion( Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY ) }), this.translate = new Ft({ value: new I.Vector3( Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY ) }); } // Apply the transform to a Vec3 position in a dyno program. apply(A) { return Ba(A, { scale: this.scale, rotate: this.rotate, translate: this.translate }); } applyDir(A) { return Ea(A, { rotate: this.rotate }); } // Apply the transform to a Gsplat in a dyno program. applyGsplat(A) { return ts(A, { scale: this.scale, rotate: this.rotate, translate: this.translate }); } // Update the uniforms to match the given transform matrix. updateFromMatrix(A) { const e = new I.Vector3(), s = new I.Quaternion(), n = new I.Vector3(); A.decompose(n, s, e); const i = (e.x + e.y + e.z) / 3; let r = !1; return i !== this.scale.value && (this.scale.value = i, r = !0), n.equals(this.translate.value) || (this.translate.value.copy(n), r = !0), s.equals(this.rotate.value) || (this.rotate.value.copy(s), r = !0), r; } // Update this transform to match the object's to-world transform. update(A) { return A.updateMatrixWorld(), this.updateFromMatrix(A.matrixWorld); } } class $t extends I.Object3D { constructor({ numSplats: A, generator: e, construct: s, update: n }) { if (super(), this.numSplats = A ?? 0, this.generator = e, this.frameUpdate = n, this.version = 0, s) { const i = s(this); Object.assign(this, i); } } updateVersion() { this.version += 1; } set needsUpdate(A) { A && this.updateVersion(); } } const nt = class nt extends $t { constructor(A = {}) { const e = new xt(), s = new xt(), n = new xt(), i = new xt(), r = new Tt({ value: new I.Vector4( Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY ) }), a = new Ct({ value: 0 }), o = new Ct({ value: 0 }), g = { transform: e, viewToWorld: s, worldToView: n, viewToObject: i, recolor: r, time: a, deltaTime: o }; if (super({ update: ({ time: l, deltaTime: c, viewToWorld: u, globalEdits: h }) => this.update({ time: l, deltaTime: c, viewToWorld: u, globalEdits: h }) }), this.isInitialized = !1, this.recolor = new I.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 VA(), this.packedSplats.splatEncoding = A.splatEncoding ?? { ...fe }, this.numSplats = this.packedSplats.numSplats, this.editable = A.editable ?? !0, this.onFrame = A.onFrame, this.context = g, 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 l = A.onLoad(this); l instanceof Promise && await l; } return this; }); else if (this.isInitialized = !0, this.initialized = Promise.resolve(this), A.onLoad) { const l = A.onLoad(this); l instanceof Promise && (this.initialized = l.then(() => this)); } } async asyncInitialize(A) { const { url: e, fileBytes: s, fileType: n, fileName: i, maxSplats: r, constructSplats: a, splatEncoding: o } = A; if (e || s || a) { const g = { url: e, fileBytes: s, fileType: n, fileName: i, maxSplats: r, construct: a, splatEncoding: o }; this.packedSplats.reinitialize(g); } this.packedSplats && (await this.packedSplats.initialized, this.numSplats = this.packedSplats.numSplats, this.updateGenerator()); } static async staticInitialize() { await Gs(), nt.isStaticInitialized = !0; } // Creates a new Gsplat with the provided parameters (all values in "float" space, // i.e. 0-1 for opacity and color) and adds it to the end of the packedSplats, // increasing numSplats by 1. If necessary, reallocates the buffer with an exponential // doubling strategy to fit the new data, so it's fairly efficient to just // pushSplat(...) each Gsplat you want to create in a loop. pushSplat(A, e, s, n, i) { this.packedSplats.pushSplat(A, e, s, n, i); } // 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(); } // Returns axis-aligned bounding box of the SplatMesh. If centers_only is true, // only the centers of the splats are used to compute the bounding box. // IMPORTANT: This should only be called after the SplatMesh is initialized. getBoundingBox(A = !0) { if (!this.initialized) throw new Error( "Cannot get bounding box before SplatMesh is initialized" ); const e = new I.Vector3( Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY ), s = new I.Vector3( Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY ), n = new I.Vector3(), i = [-1, 1]; return this.packedSplats.forEachSplat( (a, o, g, l, c, u) => { if (A) e.min(o), s.max(o); else for (const h of i) for (const E of i) for (const C of i) n.set(h * g.x, E * g.y, C * g.z), n.applyQuaternion(l), n.add(o), e.min(n), s.max(n); } ), new I.Box3(e, s); } constructGenerator(A) { const { transform: e, viewToObject: s, recolor: n } = A, i = vA( { index: "int" }, { gsplat: AA }, ({ index: r }) => { if (!r) throw new Error("index is undefined"); let a = bt(this.packedSplats.dyno, r); if (this.maxSh >= 1) { const { sh1Texture: g, sh2Texture: l, sh3Texture: c } = this.ensureShTextures(); if (g) { let u = function(f, d) { const { x: w, y: D } = Qt(d).outputs, x = iA(BA(w, D), J("float", 0.5)), y = iA(pt(D, w), J("float", 0.5)); return BA(x, iA(f, y)); }; const h = s.translate, { center: E } = ht(a).outputs, C = Tr(pt(E, h)), B = mu(a, g, C); let Q = u(B, this.packedSplats.dynoSh1MinMax); if (this.maxSh >= 2 && l) { const f = xu(a, l, C); Q = BA( Q, u(f, this.packedSplats.dynoSh2MinMax) ); } if (this.maxSh >= 3 && c) { const f = Su(a, c, C); Q = BA( Q, u(f, this.packedSplats.dynoSh3MinMax) ); } let { rgba: p } = ht(a).outputs; p = BA(p, Ur(Q, J("float", 0))), a = at({ gsplat: a, rgba: p }); } } if (this.splatRgba) { const g = Iu(this.splatRgba.dyno, r); a = at({ gsplat: a, rgba: g }); } this.skinning && (a = this.skinning.modify(a)), this.objectModifier && (a = this.objectModifier.apply({ gsplat: a }).gsplat), a = e.applyGsplat(a); const o = iA(n, ht(a).outputs.rgba); return a = at({ gsplat: a, rgba: o }), this.rgbaDisplaceEdits && (a = this.rgbaDisplaceEdits.modify(a)), this.worldModifier && (a = this.worldModifier.apply({ gsplat: a }).gsplat), { gsplat: a }; } ); this.generator = i; } // Call this whenever something changes in the Gsplat processing pipeline, // for example changing maxSh or updating objectModifier or worldModifier. // Compiled generators are cached for efficiency and re-use when the same // pipeline structure emerges after successive changes. updateGenerator() { this.constructGenerator(this.context); } // This is called automatically by SparkRenderer and you should not have to // call it. It updates parameters for the generated pipeline and calls // updateGenerator() if the pipeline needs to change. update({ time: A, viewToWorld: e, deltaTime: s, globalEdits: n }) { var B; this.numSplats = this.packedSplats.numSplats, this.context.time.value = A, this.context.deltaTime.value = s, nt.dynoTime.value = A; const { transform: i, viewToObject: r, recolor: a } = this.context; let o = i.update(this); this.context.viewToWorld.updateFromMatrix(e) && this.enableViewToWorld && (o = !0); const g = e.clone().invert(); this.context.worldToView.updateFromMatrix(g) && this.enableWorldToView && (o = !0); const u = new I.Matrix4().compose( i.translate.value, i.rotate.value, new I.Vector3().setScalar(i.scale.value) ).invert().multiply(e); r.updateFromMatrix(u) && (this.enableViewToObject || this.packedSplats.extra.sh1) && (o = !0); const h = new I.Vector4( this.recolor.r, this.recolor.g, this.recolor.b, this.opacity ); h.equals(a.value) || (a.value.copy(h), o = !0); const E = this.editable ? (this.edits ?? []).concat(n) : []; this.editable && !this.edits && this.traverseVisible((Q) => { Q instanceof le && E.push(Q); }), E.sort((Q, p) => Q.ordering - p.ordering); const C = E.map((Q) => { if (Q.sdfs != null) return { edit: Q, sdfs: Q.sdfs }; const p = []; return Q.traverseVisible((f) => { f instanceof Eu && p.push(f); }), { edit: Q, sdfs: p }; }); if (C.length > 0 && !this.rgbaDisplaceEdits) { const Q = C.length, p = C.reduce( (f, d) => f + d.sdfs.length, 0 ); this.rgbaDisplaceEdits = new Qu({ maxEdits: Q, maxSdfs: p }), this.updateGenerator(); } if (this.rgbaDisplaceEdits) { const Q = this.rgbaDisplaceEdits.update(C); o || (o = Q.updated), Q.dynoUpdated && this.updateGenerator(); } o && this.updateVersion(), (B = this.onFrame) == null || B.call(this, { mesh: this, time: A, deltaTime: s }); } // This method conforms to the standard THREE.Raycaster API, performing object-ray // intersections using this method to populate the provided intersects[] array // with each intersection point. raycast(A, e) { var h, E; if (!this.packedSplats.packedArray || !this.packedSplats.numSplats) return; const { near: s, far: n, ray: i } = A, r = this.matrixWorld.clone().invert(), a = new I.Matrix3().setFromMatrix4(r), o = i.origin.clone().applyMatrix4(r), g = i.direction.clone().applyMatrix3(a), l = new I.Vector3(); r.decompose(new I.Vector3(), new I.Quaternion(), l), (l.x * l.y * l.z) ** (1 / 3); const u = Vo( o.x, o.y, o.z, g.x, g.y, g.z, s, n, this.packedSplats.numSplats, this.packedSplats.packedArray, !0, ((h = this.packedSplats.splatEncoding) == null ? void 0 : h.lnScaleMin) ?? UA, ((E = this.packedSplats.splatEncoding) == null ? void 0 : E.lnScaleMax) ?? GA ); for (const C of u) { const B = i.direction.clone().multiplyScalar(C).add(i.origin); e.push({ distance: C, point: B, object: this }); } } ensureShTextures() { if (!this.packedSplats.extra.sh1) return {}; let A = this.packedSplats.extra.sh1Texture; if (!A) { let n = this.packedSplats.extra.sh1; const { width: i, height: r, depth: a, maxSplats: o } = mA( n.length / 2 ); if (n.length < o * 2) { const l = new Uint32Array(o * 2); l.set(n), this.packedSplats.extra.sh1 = l, n = l; } const g = new I.DataArrayTexture(n, i, r, a); g.format = I.RGIntegerFormat, g.type = I.UnsignedIntType, g.internalFormat = "RG32UI", g.needsUpdate = !0, A = new Ht({ value: g, key: "sh1" }), this.packedSplats.extra.sh1Texture = A; } if (!this.packedSplats.extra.sh2) return { sh1Texture: A }; let e = this.packedSplats.extra.sh2Texture; if (!e) { let n = this.packedSplats.extra.sh2; const { width: i, height: r, depth: a, maxSplats: o } = mA( n.length / 4 ); if (n.length < o * 4) { const l = new Uint32Array(o * 4); l.set(n), this.packedSplats.extra.sh2 = l, n = l; } const g = new I.DataArrayTexture(n, i, r, a); g.format = I.RGBAIntegerFormat, g.type = I.UnsignedIntType, g.internalFormat = "RGBA32UI", g.needsUpdate = !0, e = new Ht({ value: g, key: "sh2" }), this.packedSplats.extra.sh2Texture = e; } if (!this.packedSplats.extra.sh3) return { sh1Texture: A, sh2Texture: e }; let s = this.packedSplats.extra.sh3Texture; if (!s) { let n = this.packedSplats.extra.sh3; const { width: i, height: r, depth: a, maxSplats: o } = mA( n.length / 4 ); if (n.length < o * 4) { const l = new Uint32Array(o * 4); l.set(n), this.packedSplats.extra.sh3 = l, n = l; } const g = new I.DataArrayTexture(n, i, r, a); g.format = I.RGBAIntegerFormat, g.type = I.UnsignedIntType, g.internalFormat = "RGBA32UI", g.needsUpdate = !0, s = new Ht({ value: g, key: "sh3" }), this.packedSplats.extra.sh3Texture = s; } return { sh1Texture: A, sh2Texture: e, sh3Texture: s }; } }; nt.staticInitialized = nt.staticInitialize(), nt.isStaticInitialized = !1, nt.dynoTime = new Ct({ value: 0 }); let OA = nt; const du = hA(` 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); } `), yu = hA(` 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)); } `), wu = hA(` 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 mu(t, A, e) { return Xt({ inTypes: { gsplat: AA, sh1: "usampler2DArray", viewDir: "vec3" }, outTypes: { rgb: "vec3" }, inputs: { gsplat: t, sh1: A, viewDir: e }, globals: () => [bA, du], statements: ({ inputs: s, outputs: n }) => RA(` if (isGsplatActive(${s.gsplat}.flags)) { ${n.rgb} = evaluateSH1(${s.gsplat}, ${s.sh1}, ${s.viewDir}); } else { ${n.rgb} = vec3(0.0); } `) }).outputs.rgb; } function xu(t, A, e) { return Xt({ inTypes: { gsplat: AA, sh2: "usampler2DArray", viewDir: "vec3" }, outTypes: { rgb: "vec3" }, inputs: { gsplat: t, sh2: A, viewDir: e }, globals: () => [bA, yu], statements: ({ inputs: s, outputs: n }) => RA(` if (isGsplatActive(${s.gsplat}.flags)) { ${n.rgb} = evaluateSH2(${s.gsplat}, ${s.sh2}, ${s.viewDir}); } else { ${n.rgb} = vec3(0.0); } `) }).outputs.rgb; } function Su(t, A, e) { return Xt({ inTypes: { gsplat: AA, sh3: "usampler2DArray", viewDir: "vec3" }, outTypes: { rgb: "vec3" }, inputs: { gsplat: t, sh3: A, viewDir: e }, globals: () => [bA, wu], statements: ({ inputs: s, outputs: n }) => RA(` if (isGsplatActive(${s.gsplat}.flags)) { ${n.rgb} = evaluateSH3(${s.gsplat}, ${s.sh3}, ${s.viewDir}); } else { ${n.rgb} = vec3(0.0); } `) }).outputs.rgb; } const Qs = [ "char", "uchar", "short", "ushort", "int", "uint", "float", "double" ], Dt = class Dt { // Create a PlyReader from a Uint8Array/ArrayBuffer, no parsing done yet constructor({ fileBytes: A }) { this.header = "", this.littleEndian = !0, this.elements = {}, this.comments = [], this.data = null, this.numSplats = 0, this.fileBytes = A instanceof ArrayBuffer ? new Uint8Array(A) : A; } // Identify and parse the PLY text header (assumed to be <64KB in size). // this.elements will contain all the elements in the file, typically // "vertex" contains the Gsplat data. async parseHeader() { const e = new ReadableStream({ start: (r) => { r.enqueue(this.fileBytes.slice(0, 65536)), r.close(); } }).pipeThrough(new TextDecoderStream()).getReader(); this.header = ""; const s = `end_header `; for (; ; ) { const { value: r, done: a } = await e.read(); if (a) throw new Error("Failed to read header"); this.header += r; const o = this.header.indexOf(s); if (o >= 0) { this.header = this.header.slice(0, o + s.length); break; } } const n = new TextEncoder().encode(this.header).length; this.data = new DataView(this.fileBytes.buffer, n), this.elements = {}; let i = null; this.comments = [], this.header.trim().split(` `).forEach((r, a) => { const o = r.trim(); if (a === 0) { if (o !== "ply") throw new Error("Invalid PLY header"); return; } if (o.length === 0) return; const g = o.split(" "); switch (g[0]) { case "format": if (g[1] === "binary_little_endian") this.littleEndian = !0; else if (g[1] === "binary_big_endian") this.littleEndian = !1; else throw new Error(`Unsupported PLY format: ${g[1]}`); if (g[2] !== "1.0") throw new Error(`Unsupported PLY version: ${g[2]}`); break; case "end_header": break; case "comment": this.comments.push(o.slice(8)); break; case "element": { const l = g[1]; i = { name: l, count: Number.parseInt(g[2]), properties: {} }, this.elements[l] = i; break; } case "property": if (i == null) throw new Error("Property must be inside an element"); g[1] === "list" ? i.properties[g[4]] = { isList: !0, type: g[3], countType: g[2] } : i.properties[g[2]] = { isList: !1, type: g[1] }; break; } }), this.elements.vertex && (this.numSplats = this.elements.vertex.count); } parseData(A) { let e = 0; const s = this.data; if (s == null) throw new Error("No data to parse"); for (const n in this.elements) { const i = this.elements[n], { count: r, properties: a } = i, o = vu(a), g = bu(a, this.littleEndian), l = A(i) ?? (() => { }); for (let c = 0; c < r; c++) e = g(s, e, o), l(c, o); } } // Parse all the Gsplat data in the PLY file in go, invoking the given // callbacks for each Gsplat. parseSplats(A, e) { if (this.elements.vertex == null) throw new Error("No vertex element found"); let s = !1; const n = []; let i = 0, r = [], a = [], o = [], g, l, c; function u() { const Q = Mu[i]; r = new Array(3).fill(null).flatMap((p, f) => [0, 1, 2].map((d, w) => f + w * Q / 3)), a = new Array(5).fill(null).flatMap( (p, f) => [0, 1, 2].map((d, w) => 3 + f + w * Q / 3) ), o = new Array(7).fill(null).flatMap( (p, f) => [0, 1, 2].map((d, w) => 8 + f + w * Q / 3) ), g = i >= 1 ? new Float32Array(3 * 3) : void 0, l = i >= 2 ? new Float32Array(5 * 3) : void 0, c = i >= 3 ? new Float32Array(7 * 3) : void 0; } function h(Q, p) { if (!g) throw new Error("Missing sh1"); const f = p.f_rest; for (let d = 0; d < r.length; d++) g[d] = f[r[d]] * 8 / 255 - 4; if (l) for (let d = 0; d < a.length; d++) l[d] = f[a[d]] * 8 / 255 - 4; if (c) for (let d = 0; d < o.length; d++) c[d] = f[o[d]] * 8 / 255 - 4; e == null || e(Q, g, l, c); } function E(Q) { const { min_x: p, min_y: f, min_z: d, max_x: w, max_y: D, max_z: x, min_scale_x: y, min_scale_y: m, min_scale_z: k, max_scale_x: M, max_scale_y: S, max_scale_z: U } = Q.properties; if (!p || !f || !d || !w || !D || !x || !y || !m || !k || !M || !S || !U) throw new Error("Missing PLY chunk properties"); return s = !0, (F, b) => { const { min_x: T, min_y: R, min_z: X, max_x: _, max_y: eA, max_z: q, min_scale_x: O, min_scale_y: L, min_scale_z: j, max_scale_x: P, max_scale_y: W, max_scale_z: G, min_r: pA, min_g: gA, min_b: fA, max_r: dA, max_g: xA, max_b: CA } = b; n.push({ min_x: T, min_y: R, min_z: X, max_x: _, max_y: eA, max_z: q, min_scale_x: O, min_scale_y: L, min_scale_z: j, max_scale_x: P, max_scale_y: W, max_scale_z: G, min_r: pA, min_g: gA, min_b: fA, max_r: dA, max_g: xA, max_b: CA }); }; } function C(Q) { if (e && Q.name === "sh") return i = Ke(Q.properties), u(), h; if (Q.name !== "vertex") return null; const { packed_position: p, packed_rotation: f, packed_scale: d, packed_color: w } = Q.properties; if (!p || !f || !d || !w) throw new Error( "Missing PLY properties: packed_position, packed_rotation, packed_scale, packed_color" ); const D = Math.sqrt(2); return (x, y) => { const m = n[x >>> 8]; if (m == null) throw new Error("Missing PLY chunk"); const { min_x: k, min_y: M, min_z: S, max_x: U, max_y: F, max_z: b, min_scale_x: T, min_scale_y: R, min_scale_z: X, max_scale_x: _, max_scale_y: eA, max_scale_z: q, min_r: O, min_g: L, min_b: j, max_r: P, max_g: W, max_b: G } = m, { packed_position: pA, packed_rotation: gA, packed_scale: fA, packed_color: dA } = y, xA = (pA >>> 21 & 2047) / 2047 * (U - k) + k, CA = (pA >>> 11 & 1023) / 1023 * (F - M) + M, YA = (pA & 2047) / 2047 * (b - S) + S, SA = ((gA >>> 20 & 1023) / 1023 - 0.5) * D, jA = ((gA >>> 10 & 1023) / 1023 - 0.5) * D, WA = ((gA & 1023) / 1023 - 0.5) * D, Y = Math.sqrt(Math.max(0, 1 - SA * SA - jA * jA - WA * WA)), DA = gA >>> 30, lA = DA === 0 ? SA : DA === 1 ? Y : jA, Gt = DA <= 1 ? jA : DA === 2 ? Y : WA, Wt = DA <= 2 ? WA : Y, MA = DA === 0 ? Y : SA, z = Math.exp( (fA >>> 21 & 2047) / 2047 * (_ - T) + T ), ZA = Math.exp( (fA >>> 11 & 1023) / 1023 * (eA - R) + R ), de = Math.exp( (fA & 2047) / 2047 * (q - X) + X ), ye = (dA >>> 24 & 255) / 255 * ((P ?? 1) - (O ?? 0)) + (O ?? 0), we = (dA >>> 16 & 255) / 255 * ((W ?? 1) - (L ?? 0)) + (L ?? 0), me = (dA >>> 8 & 255) / 255 * ((G ?? 1) - (j ?? 0)) + (j ?? 0), xe = (dA & 255) / 255; A( x, xA, CA, YA, z, ZA, de, lA, Gt, Wt, MA, xe, ye, we, me ); }; } const B = (Q) => { if (Q.name === "chunk") return E(Q); if (s) return C(Q); if (Q.name !== "vertex") return null; const { x: p, y: f, z: d, scale_0: w, scale_1: D, scale_2: x, rot_0: y, rot_1: m, rot_2: k, rot_3: M, opacity: S, f_dc_0: U, f_dc_1: F, f_dc_2: b, red: T, green: R, blue: X, alpha: _ } = Q.properties; if (!p || !f || !d) throw new Error("Missing PLY properties: x, y, z"); const eA = w && D && x, q = y && m && k && M, O = _ != null ? ee[_.type] : 1, L = T != null ? ee[T.type] : 1, j = R != null ? ee[R.type] : 1, P = X != null ? ee[X.type] : 1; return i = Ke(Q.properties), u(), (W, G) => { const pA = eA ? Math.exp(G.scale_0) : Dt.defaultPointScale, gA = eA ? Math.exp(G.scale_1) : Dt.defaultPointScale, fA = eA ? Math.exp(G.scale_2) : Dt.defaultPointScale, dA = q ? G.rot_1 : 0, xA = q ? G.rot_2 : 0, CA = q ? G.rot_3 : 0, YA = q ? G.rot_0 : 1, SA = S != null ? 1 / (1 + Math.exp(-G.opacity)) : _ != null ? G.alpha / O : 1, jA = U != null ? G.f_dc_0 * te + 0.5 : T != null ? G.red / L : 1, WA = F != null ? G.f_dc_1 * te + 0.5 : R != null ? G.green / j : 1, Y = b != null ? G.f_dc_2 * te + 0.5 : X != null ? G.blue / P : 1; if (A( W, G.x, G.y, G.z, pA, gA, fA, dA, xA, CA, YA, SA, jA, WA, Y ), e && g) { const DA = G.f_rest; if (g) for (let lA = 0; lA < r.length; lA++) g[lA] = DA[r[lA]]; if (l) for (let lA = 0; lA < a.length; lA++) l[lA] = DA[a[lA]]; if (c) for (let lA = 0; lA < o.length; lA++) c[lA] = DA[o[lA]]; e(W, g, l, c); } }; }; this.parseData(B); } // Inject RGBA values into original PLY file, which can be used to modify // the color/opacity of the Gsplats and write out the modified PLY file. injectRgba(A) { let e = 0; const s = this.data; if (s == null) throw new Error("No parsed data"); if (A.length !== this.numSplats * 4) throw new Error("Invalid RGBA array length"); for (const n in this.elements) { const i = this.elements[n], { count: r, properties: a } = i, o = []; let g = 0; const l = n === "vertex"; if (l) { for (const c of ["opacity", "f_dc_0", "f_dc_1", "f_dc_2"]) if (!a[c] || a[c].type !== "float") throw new Error(`Can't injectRgba due to property: ${c}`); } for (const [c, u] of Object.entries(a)) if (u.isList) o.push(() => { const h = St[u.countType]( s, e, this.littleEndian ); e += zA[u.countType], e += h * zA[u.type]; }); else { if (l) if (c === "f_dc_0" || c === "f_dc_1" || c === "f_dc_2") { const h = Number.parseInt( c.slice(5) ); o.push(() => { const E = (A[g + h] / 255 - 0.5) / te; ps[u.type]( s, e, this.littleEndian, E ); }); } else c === "opacity" && o.push(() => { const h = Math.max( -100, Math.min( 100, -Math.log(1 / (A[g + 3] / 255) - 1) ) ); ps[u.type]( s, e, this.littleEndian, h ); }); o.push(() => { e += zA[u.type]; }); } for (let c = 0; c < r; c++) { for (const u of o) u(); l && (g += 4); } } } }; Dt.defaultPointScale = 1e-3; let Ie = Dt; const te = 0.28209479177387814, St = { 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) }, ps = { char: (t, A, e, s) => { t.setInt8(A, s); }, uchar: (t, A, e, s) => { t.setUint8(A, s); }, short: (t, A, e, s) => { t.setInt16(A, s, e); }, ushort: (t, A, e, s) => { t.setUint16(A, s, e); }, int: (t, A, e, s) => { t.setInt32(A, s, e); }, uint: (t, A, e, s) => { t.setUint32(A, s, e); }, float: (t, A, e, s) => { t.setFloat32(A, s, e); }, double: (t, A, e, s) => { t.setFloat64(A, s, e); } }, zA = { char: 1, uchar: 1, short: 2, ushort: 2, int: 4, uint: 4, float: 4, double: 8 }, ee = { char: 127, uchar: 255, short: 32767, ushort: 65535, int: 2147483647, uint: 4294967295, float: 1, double: 1 }, Du = { 0: 0, 9: 1, 24: 2, 45: 3 }, Mu = { 0: 0, 1: 9, 2: 24, 3: 45 }, cs = /^f_rest_([0-9]{1,2})$/; function vu(t) { const A = {}; for (const [e, s] of Object.entries(t)) cs.test(e) ? A.f_rest = new Array(Ke(t)) : A[e] = s.isList ? [] : 0; return A; } function bu(t, A) { return ku(t) ? Tu(t, A) : Uu(t, A); } const Fu = (() => { try { new Function("return 42;"); } catch { return !1; } return !0; })(), Nu = /^[a-zA-Z0-9_]+$/; function ku(t) { if (!Fu) return !1; for (const [A, e] of Object.entries(t)) if (!Nu.test(A) || e.isList && !Qs.includes(e.countType) || !Qs.includes(e.type)) return !1; return !0; } function Tu(t, A) { const e = ["let list;"]; for (const [n, i] of Object.entries(t)) { const r = n.match(cs); if (r) { const a = +r[1]; e.push( /*js*/ ` item.f_rest[${a}] = PARSE_FIELD['${i.type}'](data, offset, ${A}); offset += ${zA[i.type]}; ` ); } else i.isList ? e.push( /*js*/ ` list = item['${n}']; list.length = PARSE_FIELD['${i.countType}'](data, offset, ${A}); offset += ${zA[i.countType]}; for (let i = 0; i < list.length; i++) { list[i] = PARSE_FIELD['${i.type}'](data, offset, ${A}); offset += ${zA[i.type]}; } ` ) : e.push( /*js*/ ` item['${n}'] = PARSE_FIELD['${i.type}'](data, offset, ${A}); offset += ${zA[i.type]}; ` ); } e.push("return offset;"); const s = new Function( "data", "offset", "item", "PARSE_FIELD", e.join(` `) ); return (n, i, r) => s(n, i, r, St); } function Uu(t, A) { const e = []; for (const [s, n] of Object.entries(t)) { const i = s.match(cs); if (i) { const r = +i[1]; e.push( (a, o, g) => (g.f_rest[r] = St[n.type]( a, o, A ), o + zA[n.type]) ); } else n.isList ? e.push( (r, a, o) => { const g = o[s]; g.length = St[n.countType]( r, a, A ); let l = a + zA[n.countType]; for (let c = 0; c < g.length; c++) g[c] = St[n.type]( r, l, A ), l += zA[n.type]; return l; } ) : e.push( (r, a, o) => (o[s] = St[n.type]( r, a, A ), a + zA[n.type]) ); } return (s, n, i) => { let r = n; for (let a = 0; a < e.length; a++) r = e[a](s, r, i); return r; }; } function Ke(t) { let A = 0; for (; t[`f_rest_${A}`]; ) A += 1; const e = Du[A]; if (e == null) throw new Error(`Unsupported number of SH coefficients: ${A}`); return e; } const $a = '(function(){"use strict";let pA;const ie=typeof TextDecoder<"u"?new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}):{decode:()=>{throw Error("TextDecoder not available")}};typeof TextDecoder<"u"&&ie.decode();let OA=null;function ts(){return(OA===null||OA.byteLength===0)&&(OA=new Uint8Array(pA.memory.buffer)),OA}function es(s,A){return s=s>>>0,ie.decode(ts().subarray(s,s+A))}function ss(s,A,t){return pA.sort_splats(s,A,t)>>>0}function is(s,A,t){return pA.sort32_splats(s,A,t)>>>0}async function ns(s,A){if(typeof Response=="function"&&s instanceof Response){if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(s,A)}catch(e){if(s.headers.get("Content-Type")!="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n",e);else throw e}const t=await s.arrayBuffer();return await WebAssembly.instantiate(t,A)}else{const t=await WebAssembly.instantiate(s,A);return t instanceof WebAssembly.Instance?{instance:t,module:s}:t}}function gs(){const s={};return s.wbg={},s.wbg.__wbg_buffer_609cc3eee51ed158=function(A){return A.buffer},s.wbg.__wbg_length_3b4f022188ae8db6=function(A){return A.length},s.wbg.__wbg_length_6ca527665d89694d=function(A){return A.length},s.wbg.__wbg_length_8cfd2c6409af88ad=function(A){return A.length},s.wbg.__wbg_new_9fee97a409b32b68=function(A){return new Uint16Array(A)},s.wbg.__wbg_new_e3b321dcfef89fc7=function(A){return new Uint32Array(A)},s.wbg.__wbg_newwithbyteoffsetandlength_e6b7e69acd4c7354=function(A,t,e){return new Float32Array(A,t>>>0,e>>>0)},s.wbg.__wbg_newwithbyteoffsetandlength_f1dead44d1fc7212=function(A,t,e){return new Uint32Array(A,t>>>0,e>>>0)},s.wbg.__wbg_newwithlength_5a5efe313cfd59f1=function(A){return new Float32Array(A>>>0)},s.wbg.__wbg_set_10bad9bee0e9c58b=function(A,t,e){A.set(t,e>>>0)},s.wbg.__wbg_set_d23661d19148b229=function(A,t,e){A.set(t,e>>>0)},s.wbg.__wbg_set_f4f1f0daa30696fc=function(A,t,e){A.set(t,e>>>0)},s.wbg.__wbg_subarray_3aaeec89bb2544f0=function(A,t,e){return A.subarray(t>>>0,e>>>0)},s.wbg.__wbg_subarray_769e1e0f81bb259b=function(A,t,e){return A.subarray(t>>>0,e>>>0)},s.wbg.__wbindgen_init_externref_table=function(){const A=pA.__wbindgen_export_0,t=A.grow(4);A.set(0,void 0),A.set(t+0,void 0),A.set(t+1,null),A.set(t+2,!0),A.set(t+3,!1)},s.wbg.__wbindgen_memory=function(){return pA.memory},s.wbg.__wbindgen_throw=function(A,t){throw new Error(es(A,t))},s}function rs(s,A){return pA=s.exports,ne.__wbindgen_wasm_module=A,OA=null,pA.__wbindgen_start(),pA}async function ne(s){if(pA!==void 0)return pA;typeof s<"u"&&(Object.getPrototypeOf(s)===Object.prototype?{module_or_path:s}=s:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),typeof s>"u"&&(s=new URL("data:application/wasm;base64,AGFzbQEAAAABzAEeYAJ/fwF/YAJ/fwBgA39/fwF/YAN/f38AYAF/AX9gAX8AYANvf38Bb2AFf39/f38Bf2AFf39/f38AYAFvAW9gA29vfwBgAW8Bf2AAAGAAAX9gBH9/f38AYAR/f39/AX9gA39vbwF/YAF/AW9gAAFvYAF9AX1gBn9/f39/fwBgDX19fX19fX19f29/fX0Bb2AGf39/f39/AX9gBX9/fX9/AGAEf31/fwBgBX9/fH9/AGAEf3x/fwBgBX9/fn9/AGAEf35/fwBgAn19AX0C8gQRA3diZx1fX3diZ19idWZmZXJfNjA5Y2MzZWVlNTFlZDE1OAAJA3diZxpfX3diZ19uZXdfOWZlZTk3YTQwOWIzMmI2OAAJA3diZxpfX3diZ19zZXRfZjRmMWYwZGFhMzA2OTZmYwAKA3diZx1fX3diZ19sZW5ndGhfOGNmZDJjNjQwOWFmODhhZAALA3diZzFfX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9mMWRlYWQ0NGQxZmM3MjEyAAYDd2JnGl9fd2JnX25ld19lM2IzMjFkY2ZlZjg5ZmM3AAkDd2JnGl9fd2JnX3NldF9kMjM2NjFkMTkxNDhiMjI5AAoDd2JnHV9fd2JnX2xlbmd0aF82Y2E1Mjc2NjVkODk2OTRkAAsDd2JnMV9fd2JnX25ld3dpdGhieXRlb2Zmc2V0YW5kbGVuZ3RoX2U2YjdlNjlhY2Q0YzczNTQABgN3YmcaX193Ymdfc2V0XzEwYmFkOWJlZTBlOWM1OGIACgN3YmcdX193YmdfbGVuZ3RoXzNiNGYwMjIxODhhZThkYjYACwN3YmcfX193Ymdfc3ViYXJyYXlfNzY5ZTFlMGY4MWJiMjU5YgAGA3diZx9fX3diZ19zdWJhcnJheV8zYWFlZWM4OWJiMjU0NGYwAAYDd2JnJF9fd2JnX25ld3dpdGhsZW5ndGhfNWE1ZWZlMzEzY2ZkNTlmMQARA3diZxBfX3diaW5kZ2VuX3Rocm93AAEDd2JnEV9fd2JpbmRnZW5fbWVtb3J5ABIDd2JnH19fd2JpbmRnZW5faW5pdF9leHRlcm5yZWZfdGFibGUADANeXQQAAQcFAgMCEwEBAA0BAwEAAA0BAwgIAwEBBRQBAw4AAwEDAgwMAgABAQcDABUBFhcIGRsH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QYGABGxBEHYgBGohBCAHRQ0ACwJ/IAMgBkH8AXFBAnRqIgAoAgAiAUF/c0EHdiABQQZ2ckGBgoQIcSIBIAdBAUYNABogASAAKAIEIgFBf3NBB3YgAUEGdnJBgYKECHFqIgEgB0ECRg0AGiAAKAIIIgBBf3NBB3YgAEEGdnJBgYKECHEgAWoLIgFBCHZB/4EccSABQf+B/AdxakGBgARsQRB2IARqDwsgAUUEQEEADwsgAUEDcSEDAkAgAUEESQRADAELIAFBfHEhBQNAIAQgACACaiIBLAAAQb9/SmogAUEBaiwAAEG/f0pqIAFBAmosAABBv39KaiABQQNqLAAAQb9/SmohBCAFIAJBBGoiAkcNAAsLIANFDQAgACACaiEBA0AgBCABLAAAQb9/SmohBCABQQFqIQEgA0EBayIDDQALCyAEC4oGAQZ/IAAoAggiAyABSQRAIAEgAyICayIEIAAoAgAgAmtLBEAgACACIARBBEEEECYgACgCCCECCyAAKAIEIgYgAkECdGohBSAEQQJPBEAgASADQX9zakECdCIHBEAgBUEAIAf8CwALIAEgAmpBAnQgA0ECdGsgBmpBBGshBSACIARqQQFrIQILIAVBADYCACAAIAJBAWo2AggLIAAoAhQiAyABSQRAIAEgAyICayIEIAAoAgwgAmtLBEAgAEEMaiACIARBBEEEECYgACgCFCECCyAAKAIQIgYgAkECdGohBSAEQQJPBEAgASADQX9zakECdCIHBEAgBUEAIAf8CwALIAEgAmpBAnQgA0ECdGsgBmpBBGshBSACIARqQQFrIQILIAVBADYCACAAIAJBAWo2AhQLIAAoAjgiAyABSQRAIAEgAyICayIEIAAoAjAgAmtLBEAgAEEwaiACIARBBEEEECYgACgCOCECCyAAKAI0IgYgAkECdGohBSAEQQJPBEAgASADQX9zakECdCIHBEAgBUEAIAf8CwALIAEgAmpBAnQgA0ECdGsgBmpBBGshBSACIARqQQFrIQILIAVBADYCACAAIAJBAWo2AjgLIAAoAiAiA0H//wNNBEAgAyEBQYCABCADayICIAAoAhggA2tLBEAgAEEYaiADIAJBBEEEECYgACgCICEBCyAAKAIcIgUgAUECdCIEaiECIANB//8DRwRAQfz/DyADQQJ0IgZrIgcEQCACQQAgB/wLAAsg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IAQgA0EUahAvIAMoAghBAUcNASADKAIQIQAgAygCDAsgAEGEj8AAEEwACyADKAIMIQEgACAENgIAIAAgATYCBCADQSBqJAALuQEBBX8jAEEgayICJAAgACgCACIEQf////8BSwRAQQBBACABEEwACwJAQQQgBEEBdCIFIAVBBE0bIgVBAnQiBkH8////B00EfyACIAQEfyACIARBAnQ2AhwgAiAAKAIENgIUQQQFIAMLNgIYIAJBCGpBBCAGIAJBFGoQLyACKAIIQQFHDQEgAigCECEDIAIoAgwFIAMLIAMgARBMAAsgAigCDCEBIAAgBTYCACAAIAE2AgQgAkEgaiQAC8EBAgN/AX4jAEEwayICJAAgASgCAEGAgICAeEYEQCABKAIMIQMgAkEUaiIEQQA2AgAgAkKAgICAEDcCDCACQSBqIAMoAgAiA0EIaikCADcDACACQShqIANBEGopAgA3AwAgAiADKQIANwMYIAJBDGpBuIvAACACQRhqEBgaIAJBCGogBCgCACIDNgIAIAIgAikCDCIFNwMAIAFBCGogAzYCACABIAU3AgALIABB8I3AADYCBCAAIAE2AgAgAkEwaiQAC68BAQZ/AkACQCAAQYQBSQ0AIADQbyYBECMiASgCDCEFIAEoAhAhAiABQgA3AgwgASgCCCEDIAEoAgQhBCABQgQ3AgQgASgCACEGIAFBADYCACAAIAJJDQEgACACayIAIANPDQEgBCAAQQJ0aiAFNgIAIAEgAjYCECABIAA2AgwgASADNgIIIAEoAgQgASAENgIEIAEoAgAhACABIAY2AgAgAEUNACAAQQJ0EGALDwsAC6gBAQF/IwBBEGsiBiQAAkAgAQRAIAZBBGogASADIAQgBSACKAIQEQgAAkAgBigCBCICIAYoAgwiAU0EQCAGKAIIIQUMAQsgAkECdCECIAYoAgghAyABRQRAQQQhBSADIAIQYAwBCyADIAJBBCABQQJ0IgIQUCIFRQ0CCyAAIAE2AgQgACAFNgIAIAZBEGokAA8LQYyKwABBMhBjAAtBBCACQfyJwAAQTAALrQEBA38gASgCDCECAkACQAJAAkACQAJAIAEoAgQOAgABAgsgAg0BQQEhA0EAIQFBASECDAMLIAJFDQELIAAgARAbDwsgASgCACICKAIEIgFBAEgNASACKAIAIQMgAUUEQEEB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A0EAIAD8CwALIAsoAighFAJAIAsoAiwiEEUNACAQQQJ0IgBFDQAgFEEAIAD8CwALIBNBAnQhCSATBEAgCSEEIAohAANAAkAgACgCACIGQYCAgPwHTw0AIAwgBkF/cyIFQf//A3EiBksEQCADIAZBAnRqIgYgBigCAEEBajYCACAQIAVBEHYiBksEQCAUIAZBAnRqIgYgBigCAEEBajYCAAwCCyAGIBBB3InAABAxAAsgBiAMQcyJwAAQMQALIABBBGohACAEQQRrIgQNAAsLAkAgDEUEQEEAIQQMAQsgDEEBa0H/////A3EiAEEBaiIEQQdxIQUCQCAAQQdJBEBBACEEIAMhAAwBCyAEQfj///8HcSEGQQAhBCADIQADQCAAKAIAIQcgACAENgIAIABBBGoiESgCACESIBEgBCAHaiIENgIAIABBCGoiBygCACERIAcgBCASaiIENgIAIABBDGoiBygCACESIAcgBCARaiIENgIAIABBEGoiBygCACERIAcgBCASaiIENgIAIABBFGoiBygCACESIAcgBCARaiIENgIAIABBGGoiBygCACERIAcgBCASaiIENgIAIABBHGoiBygCACESIAcgBCARaiIENgIAIAQgEmohBCAAQSBqIQAgBkEIayIGDQALCyAFRQ0AA0AgACgCACEGIAAgBDYCACAAQQRqIQAgBCAGaiEEIAVBAWsiBQ0ACwsgDiAENgIEIBMEQCAJIApqIREgCkEEaiEGIBNBAWtB/////wNxQQFqIRIgCygCNCEXIAsoAjghB0EAIQUgCiEJA0AgBiEAAkAgCSgCACIJQYCAgPwHTw0AAkAgDCAJQX9zQf//A3EiCUsEQCADIAlBAnRqIgkoAgAiBiAHTw0BIBcgBkECdGogBTYCACAJIAkoAgBBAWo2AgAMAgsgCSAMQayJwAAQMQALIAYgB0G8icAAEDEACyAAIAAgEUdBAnRqIQYgACEJIBIgBUEBaiIFRw0ACwsCQCAQRQ0AIBBBAWtB/////wNxIgNBAWoiCUEHcSEGQQAhBSAUIQAgA0EHTwRAIAlB+P///wdxIQkDQCAAKAIAIQMgACAFNgIAIABBBGoiDCgCACEHIAwgAyAFaiIDNgIAIABBCGoiBSgCACEMIAUgAyAHaiIDNgIAIABBDGoiBSgCACEHIAUgAyAMaiIDNgIAIABB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uIvAACABEBgLDAAgACABKQIANwMACw0AIABB0I7AACABEBgLDQAgAUHIjsAAQQUQUQsZACAAIAFBkJbAACgCACIAQRQgABsRAQAACw0AIAFBpJDAAEEYEBYLoAIBA38gACgCACEAIwBBkAFrIgMkAAJ/AkAgASgCCCICQYCAgBBxRQRAIAJBgICAIHENASADQQhqIAAoAgAgA0EQahAfIAFBAUEAIAMoAgggAygCDBAUDAILIAAoAgAhAkEAIQADQCAAIANqQY8BaiACQQ9xIgRBMHIgBEHXAGogBEEKSRs6AAAgAEEBayEAIAJBD0sgAkEEdiECDQALIAFBt5LAAEECIAAgA2pBkAFqQQAgAGsQFAwBCyAAKAIAIQJBACEAA0AgACADakGPAWogAkEPcSIEQTByIARBN2ogBEEKSRs6AAAgAEEBayEAIAJBD0sgAkEEdiECDQALIAFBt5LAAEECIAAgA2pBkAFqQQAgAGsQFAsgA0GQAWokAAsJACAAQQA2AgALCAAgACUBEAMLCAAgACUBEAcLC/UUAwBBgIDAAAuhD3NwYXJrLWludGVybmFsLXJzL3NyYy9yYXljYXN0LnJzAHNwYXJrLWludGVybmFsLXJzL3NyYy9zb3J0LnJzAGxpYnJhcnkvYWxsb2Mvc3JjL2ZtdC5ycwAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi93YXNtLWJpbmRnZW4tMC4yLjEwMC9zcmMvY29udmVydC9zbGljZXMucnMAL3J1c3RjLzI5NDgzODgzZWVkNjlkNWZiNGRiMDE5NjRjZGYyYWY0ZDg2ZTljYjIvbGlicmFyeS9zdGQvc3JjL3RocmVhZC9sb2NhbC5ycwBsaWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMAL3J1c3RjLzI5NDgzODgzZWVkNjlkNWZiNGRiMDE5NjRjZGYyYWY0ZDg2ZTljYjIvbGlicmFyeS9hbGxvYy9zcmMvc2xpY2UucnMAL3J1c3RjLzI5NDgzODgzZWVkNjlkNWZiNGRiMDE5NjRjZGYyYWY0ZDg2ZTljYjIvbGlicmFyeS9hbGxvYy9zcmMvcmF3X3ZlYy9tb2QucnMAL3J1c3QvZGVwcy9kbG1hbGxv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dGAgZmFpbGVkOiAKICBsZWZ0OiAAAACbCBAAEAAAAOQIEAAQAAAA9AgQAAkAAADCCBAACQAAADogAAABAAAAAAAAACAJEAACAAAAfSB9MHgwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OSBvdXQgb2YgcmFuZ2UgZm9yIHNsaWNlIG9mIGxlbmd0aCByYW5nZSBlbmQgaW5kZXggACMKEAAQAAAAAQoQACIAAACQCBAAkggQAJQIEAACAAAAAgAAAAcAAAAAAAA/AAAAvwBB/JTAAAsBEgB8CXByb2R1Y2VycwIIbGFuZ3VhZ2UBBFJ1c3QADHByb2Nlc3NlZC1ieQMFcnVzdGMdMS44OS4wICgyOTQ4Mzg4M2UgMjAyNS0wOC0wNCkGd2FscnVzBjAuMjMuMwx3YXNtLWJpbmRnZW4TMC4yLjEwMCAoMjQwNWVjMmI0KQBrD3RhcmdldF9mZWF0dXJlcwYrD211dGFibGUtZ2xvYmFscysTbm9udHJhcHBpbmctZnB0b2ludCsLYnVsay1tZW1vcnkrCHNpZ24tZXh0Kw9yZWZlcmVuY2UtdHlwZXMrCm11bHRpdmFsdWU=",self.location.href));const A=gs();(typeof s=="string"||typeof Request=="function"&&s instanceof Request||typeof URL=="function"&&s instanceof URL)&&(s=fetch(s));const{instance:t,module:e}=await ns(await s,A);return rs(t,e)}var ge={},Is=function(s,A,t,e,i){var n=new Worker(ge[A]||(ge[A]=URL.createObjectURL(new Blob([s+\';addEventListener("error",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})\'],{type:"text/javascript"}))));return n.onmessage=function(g){var r=g.data,I=r.$e$;if(I){var o=new Error(I[0]);o.code=I[1],o.stack=I[2],i(o,null)}else i(null,r)},n.postMessage(t,e),n},j=Uint8Array,bA=Uint16Array,re=Int32Array,St=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]),Ft=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]),Ie=new j([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),oe=function(s,A){for(var t=new bA(31),e=0;e<31;++e)t[e]=A+=1<>1|(X&21845)<<1;NA=(NA&52428)>>2|(NA&13107)<<2,NA=(NA&61680)>>4|(NA&3855)<<4,rt[X]=((NA&65280)>>8|(NA&255)<<8)>>1}for(var vA=function(s,A,t){for(var e=s.length,i=0,n=new bA(A);i>I]=o}else for(r=new bA(e),i=0;i>15-s[i]);return r},$A=new j(288),X=0;X<144;++X)$A[X]=8;for(var X=144;X<256;++X)$A[X]=9;for(var X=256;X<280;++X)$A[X]=7;for(var X=280;X<288;++X)$A[X]=8;for(var Be=new j(32),X=0;X<32;++X)Be[X]=5;var he=vA($A,9,1),Qe=vA(Be,5,1),It=function(s){for(var A=s[0],t=1;tA&&(A=s[t]);return A},hA=function(s,A,t){var e=A/8|0;return(s[e]|s[e+1]<<8)>>(A&7)&t},ot=function(s,A){var t=A/8|0;return(s[t]|s[t+1]<<8|s[t+2]<<16)>>(A&7)},Nt=function(s){return(s+7)/8|0},GA=function(s,A,t){return(A==null||A<0)&&(A=0),(t==null||t>s.length)&&(t=s.length),new j(s.subarray(A,t))},Ee=["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"],V=function(s,A,t){var e=new Error(A||Ee[s]);if(e.code=s,Error.captureStackTrace&&Error.captureStackTrace(e,V),!t)throw e;return e},Gt=function(s,A,t,e){var i=s.length,n=e?e.length:0;if(!i||A.f&&!A.l)return t||new j(0);var g=!t,r=g||A.i!=2,I=A.i;g&&(t=new j(i*3));var o=function(rA){var aA=t.length;if(rA>aA){var CA=new j(Math.max(aA*2,rA));CA.set(t),t=CA}},a=A.f||0,C=A.p||0,h=A.b||0,B=A.l,Q=A.d,l=A.m,c=A.n,E=i*8;do{if(!B){a=hA(s,C,1);var y=hA(s,C+1,3);if(C+=3,y)if(y==1)B=he,Q=Qe,l=9,c=5;else if(y==2){var S=hA(s,C,31)+257,J=hA(s,C+10,15)+4,D=S+hA(s,C+5,31)+1;C+=14;for(var m=new j(D),k=new j(19),x=0;x>4;if(f<16)m[x++]=f;else{var N=0,v=0;for(f==16?(v=3+hA(s,C,3),C+=2,N=m[x-1]):f==17?(v=3+hA(s,C,7),C+=3):f==18&&(v=11+hA(s,C,127),C+=7);v--;)m[x++]=N}}var K=m.subarray(0,S),Z=m.subarray(S);l=It(K),c=It(Z),B=vA(K,l,1),Q=vA(Z,c,1)}else V(1);else{var f=Nt(C)+4,u=s[f-4]|s[f-3]<<8,p=f+u;if(p>i){I&&V(0);break}r&&o(h+u),t.set(s.subarray(f,p),h),A.b=h+=u,A.p=C=p*8,A.f=a;continue}if(C>E){I&&V(0);break}}r&&o(h+131072);for(var W=(1<>4;if(C+=N&15,C>E){I&&V(0);break}if(N||V(2),L<256)t[h++]=L;else if(L==256){P=C,B=null;break}else{var T=L-254;if(L>264){var x=L-257,_=St[x];T=hA(s,C,(1<<_)-1)+dt[x],C+=_}var R=Q[ot(s,C)&q],F=R>>4;R||V(3),C+=R&15;var Z=Ce[F];if(F>3){var _=Ft[F];Z+=ot(s,C)&(1<<_)-1,C+=_}if(C>E){I&&V(0);break}r&&o(h+131072);var sA=h+T;if(h>>0},kt=function(s,A){return tA(s,A)+tA(s,A+4)*4294967296},ls=function(s){(s[0]!=31||s[1]!=139||s[2]!=8)&&V(6,"invalid gzip data");var A=s[3],t=10;A&4&&(t+=(s[10]|s[11]<<8)+2);for(var e=(A>>3&1)+(A>>4&1);e>0;e-=!s[t++]);return t+(A&2)},Ut=function(){function s(A,t){typeof A=="function"&&(t=A,A={}),this.ondata=t;var e=A&&A.dictionary&&A.dictionary.subarray(-32768);this.s={i:0,b:e?e.length:0},this.o=new j(32768),this.p=new j(0),e&&this.o.set(e)}return s.prototype.e=function(A){if(this.ondata||V(5),this.d&&V(4),!this.p.length)this.p=A;else if(A.length){var t=new j(this.p.length+A.length);t.set(this.p),t.set(A,this.p.length),this.p=t}},s.prototype.c=function(A){this.s.i=+(this.d=A||!1);var t=this.s.b,e=Gt(this.p,this.s,this.o);this.ondata(GA(e,t,this.s.b),this.d),this.o=GA(e,this.s.b-32768),this.s.b=this.o.length,this.p=GA(this.p,this.s.p/8|0),this.s.p&=7},s.prototype.push=function(A,t){this.e(A),this.c(t)},s}();function us(s,A,t){return t||(t=A,A={}),typeof t!="function"&&V(7),cs(s,A,[Es],function(e){return le(Ct(e.data[0],ue(e.data[1])))},1,t)}function Ct(s,A){return Gt(s,{i:2},A&&A.out,A&&A.dictionary)}var ye=function(){function s(A,t){this.v=1,this.r=0,Ut.call(this,A,t)}return s.prototype.push=function(A,t){if(Ut.prototype.e.call(this,A),this.r+=A.length,this.v){var e=this.p.subarray(this.v-1),i=e.length>3?ls(e):4;if(i>e.length){if(!t)return}else this.v>1&&this.onmember&&this.onmember(this.r-e.length);this.p=e.subarray(i),this.v=0}Ut.prototype.c.call(this,t),this.s.f&&!this.s.l&&!t&&(this.v=Nt(this.s.p)+9,this.s={i:0},this.o=new j(0),this.push(new j(0),t))},s}(),Yt=typeof TextDecoder<"u"&&new TextDecoder;try{Yt.decode(Cs,{stream:!0})}catch{}var ys=function(s){for(var A="",t=0;;){var e=s[t++],i=(e>127)+(e>223)+(e>239);if(t+i>s.length)return{s:A,r:GA(s,t-1)};i?i==3?(e=((e&15)<<18|(s[t++]&63)<<12|(s[t++]&63)<<6|s[t++]&63)-65536,A+=String.fromCharCode(55296|e>>10,56320|e&1023)):i&1?A+=String.fromCharCode((e&31)<<6|s[t++]&63):A+=String.fromCharCode((e&15)<<12|(s[t++]&63)<<6|s[t++]&63):A+=String.fromCharCode(e)}};function fs(s,A){if(A){for(var t="",e=0;e65558)return g(V(13,0,1),null),i;var I=uA(s,r+8);if(I){var o=I,a=tA(s,r+16),C=a==4294967295||o==65535;if(C){var h=tA(s,r-12);C=tA(s,h)==101075792,C&&(o=I=tA(s,h+32),a=tA(s,h+48))}for(var B=A&&A.filter,Q=function(c){var E=we(s,a,C),y=E[0],f=E[1],u=E[2],p=E[3],S=E[4],J=E[5],D=fe(s,J);a=S;var m=function(x,w){x?(i(),g(x,null)):(w&&(n[p]=w),--I||g(null,n))};if(!B||B({name:p,size:f,originalSize:u,compression:y}))if(!y)m(null,GA(s,D,D+f));else if(y==8){var k=s.subarray(D,D+f);if(u<524288||f>.8*u)try{m(null,Ct(k,{out:new j(u)}))}catch(x){m(x,null)}else e.push(us(k,{size:u},m))}else m(V(14,"unknown compression type "+y,1),null);else m(null,null)},l=0;l65558)&&V(13);var i=uA(s,e+8);if(!i)return{};var n=tA(s,e+16),g=n==4294967295||i==65535;if(g){var r=tA(s,e-12);g=tA(s,r)==101075792,g&&(i=tA(s,r+32),n=tA(s,r+48))}for(var I=A&&A.filter,o=0;o=0?1:-1,f=1-E*E;if(f>Number.EPSILON){const p=Math.sqrt(f),S=Math.atan2(p,E*y);c=Math.sin(c*S)/p,r=Math.sin(r*S)/p}const u=r*y;if(I=I*c+h*u,o=o*c+B*u,a=a*c+Q*u,C=C*c+l*u,c===1-r){const p=1/Math.sqrt(I*I+o*o+a*a+C*C);I*=p,o*=p,a*=p,C*=p}}A[t]=I,A[t+1]=o,A[t+2]=a,A[t+3]=C}static multiplyQuaternionsFlat(A,t,e,i,n,g){const r=e[i],I=e[i+1],o=e[i+2],a=e[i+3],C=n[g],h=n[g+1],B=n[g+2],Q=n[g+3];return A[t]=r*Q+a*C+I*B-o*h,A[t+1]=I*Q+a*h+o*C-r*B,A[t+2]=o*Q+a*B+r*h-I*C,A[t+3]=a*Q-r*C-I*h-o*B,A}get x(){return this._x}set x(A){this._x=A,this._onChangeCallback()}get y(){return this._y}set y(A){this._y=A,this._onChangeCallback()}get z(){return this._z}set z(A){this._z=A,this._onChangeCallback()}get w(){return this._w}set w(A){this._w=A,this._onChangeCallback()}set(A,t,e,i){return this._x=A,this._y=t,this._z=e,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(A){return this._x=A.x,this._y=A.y,this._z=A.z,this._w=A.w,this._onChangeCallback(),this}setFromEuler(A,t=!0){const e=A._x,i=A._y,n=A._z,g=A._order,r=Math.cos,I=Math.sin,o=r(e/2),a=r(i/2),C=r(n/2),h=I(e/2),B=I(i/2),Q=I(n/2);switch(g){case"XYZ":this._x=h*a*C+o*B*Q,this._y=o*B*C-h*a*Q,this._z=o*a*Q+h*B*C,this._w=o*a*C-h*B*Q;break;case"YXZ":this._x=h*a*C+o*B*Q,this._y=o*B*C-h*a*Q,this._z=o*a*Q-h*B*C,this._w=o*a*C+h*B*Q;break;case"ZXY":this._x=h*a*C-o*B*Q,this._y=o*B*C+h*a*Q,this._z=o*a*Q+h*B*C,this._w=o*a*C-h*B*Q;break;case"ZYX":this._x=h*a*C-o*B*Q,this._y=o*B*C+h*a*Q,this._z=o*a*Q-h*B*C,this._w=o*a*C+h*B*Q;break;case"YZX":this._x=h*a*C+o*B*Q,this._y=o*B*C+h*a*Q,this._z=o*a*Q-h*B*C,this._w=o*a*C-h*B*Q;break;case"XZY":this._x=h*a*C-o*B*Q,this._y=o*B*C-h*a*Q,this._z=o*a*Q+h*B*C,this._w=o*a*C+h*B*Q;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+g)}return t===!0&&this._onChangeCallback(),this}setFromAxisAngle(A,t){const e=t/2,i=Math.sin(e);return this._x=A.x*i,this._y=A.y*i,this._z=A.z*i,this._w=Math.cos(e),this._onChangeCallback(),this}setFromRotationMatrix(A){const t=A.elements,e=t[0],i=t[4],n=t[8],g=t[1],r=t[5],I=t[9],o=t[2],a=t[6],C=t[10],h=e+r+C;if(h>0){const B=.5/Math.sqrt(h+1);this._w=.25/B,this._x=(a-I)*B,this._y=(n-o)*B,this._z=(g-i)*B}else if(e>r&&e>C){const B=2*Math.sqrt(1+e-r-C);this._w=(a-I)/B,this._x=.25*B,this._y=(i+g)/B,this._z=(n+o)/B}else if(r>C){const B=2*Math.sqrt(1+r-e-C);this._w=(n-o)/B,this._x=(i+g)/B,this._y=.25*B,this._z=(I+a)/B}else{const B=2*Math.sqrt(1+C-e-r);this._w=(g-i)/B,this._x=(n+o)/B,this._y=(I+a)/B,this._z=.25*B}return this._onChangeCallback(),this}setFromUnitVectors(A,t){let e=A.dot(t)+1;return e<1e-8?(e=0,Math.abs(A.x)>Math.abs(A.z)?(this._x=-A.y,this._y=A.x,this._z=0,this._w=e):(this._x=0,this._y=-A.z,this._z=A.y,this._w=e)):(this._x=A.y*t.z-A.z*t.y,this._y=A.z*t.x-A.x*t.z,this._z=A.x*t.y-A.y*t.x,this._w=e),this.normalize()}angleTo(A){return 2*Math.acos(Math.abs(IA(this.dot(A),-1,1)))}rotateTowards(A,t){const e=this.angleTo(A);if(e===0)return this;const i=Math.min(1,t/e);return this.slerp(A,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(A){return this._x*A._x+this._y*A._y+this._z*A._z+this._w*A._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let A=this.length();return A===0?(this._x=0,this._y=0,this._z=0,this._w=1):(A=1/A,this._x=this._x*A,this._y=this._y*A,this._z=this._z*A,this._w=this._w*A),this._onChangeCallback(),this}multiply(A){return this.multiplyQuaternions(this,A)}premultiply(A){return this.multiplyQuaternions(A,this)}multiplyQuaternions(A,t){const e=A._x,i=A._y,n=A._z,g=A._w,r=t._x,I=t._y,o=t._z,a=t._w;return this._x=e*a+g*r+i*o-n*I,this._y=i*a+g*I+n*r-e*o,this._z=n*a+g*o+e*I-i*r,this._w=g*a-e*r-i*I-n*o,this._onChangeCallback(),this}slerp(A,t){if(t===0)return this;if(t===1)return this.copy(A);const e=this._x,i=this._y,n=this._z,g=this._w;let r=g*A._w+e*A._x+i*A._y+n*A._z;if(r<0?(this._w=-A._w,this._x=-A._x,this._y=-A._y,this._z=-A._z,r=-r):this.copy(A),r>=1)return this._w=g,this._x=e,this._y=i,this._z=n,this;const I=1-r*r;if(I<=Number.EPSILON){const B=1-t;return this._w=B*g+t*this._w,this._x=B*e+t*this._x,this._y=B*i+t*this._y,this._z=B*n+t*this._z,this.normalize(),this}const o=Math.sqrt(I),a=Math.atan2(o,r),C=Math.sin((1-t)*a)/o,h=Math.sin(t*a)/o;return this._w=g*C+this._w*h,this._x=e*C+this._x*h,this._y=i*C+this._y*h,this._z=n*C+this._z*h,this._onChangeCallback(),this}slerpQuaternions(A,t,e){return this.copy(A).slerp(t,e)}random(){const A=2*Math.PI*Math.random(),t=2*Math.PI*Math.random(),e=Math.random(),i=Math.sqrt(1-e),n=Math.sqrt(e);return this.set(i*Math.sin(A),i*Math.cos(A),n*Math.sin(t),n*Math.cos(t))}equals(A){return A._x===this._x&&A._y===this._y&&A._z===this._z&&A._w===this._w}fromArray(A,t=0){return this._x=A[t],this._y=A[t+1],this._z=A[t+2],this._w=A[t+3],this._onChangeCallback(),this}toArray(A=[],t=0){return A[t]=this._x,A[t+1]=this._y,A[t+2]=this._z,A[t+3]=this._w,A}fromBufferAttribute(A,t){return this._x=A.getX(t),this._y=A.getY(t),this._z=A.getZ(t),this._w=A.getW(t),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(A){return this._onChangeCallback=A,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class d{constructor(A=0,t=0,e=0){d.prototype.isVector3=!0,this.x=A,this.y=t,this.z=e}set(A,t,e){return e===void 0&&(e=this.z),this.x=A,this.y=t,this.z=e,this}setScalar(A){return this.x=A,this.y=A,this.z=A,this}setX(A){return this.x=A,this}setY(A){return this.y=A,this}setZ(A){return this.z=A,this}setComponent(A,t){switch(A){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("index is out of range: "+A)}return this}getComponent(A){switch(A){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+A)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(A){return this.x=A.x,this.y=A.y,this.z=A.z,this}add(A){return this.x+=A.x,this.y+=A.y,this.z+=A.z,this}addScalar(A){return this.x+=A,this.y+=A,this.z+=A,this}addVectors(A,t){return this.x=A.x+t.x,this.y=A.y+t.y,this.z=A.z+t.z,this}addScaledVector(A,t){return this.x+=A.x*t,this.y+=A.y*t,this.z+=A.z*t,this}sub(A){return this.x-=A.x,this.y-=A.y,this.z-=A.z,this}subScalar(A){return this.x-=A,this.y-=A,this.z-=A,this}subVectors(A,t){return this.x=A.x-t.x,this.y=A.y-t.y,this.z=A.z-t.z,this}multiply(A){return this.x*=A.x,this.y*=A.y,this.z*=A.z,this}multiplyScalar(A){return this.x*=A,this.y*=A,this.z*=A,this}multiplyVectors(A,t){return this.x=A.x*t.x,this.y=A.y*t.y,this.z=A.z*t.z,this}applyEuler(A){return this.applyQuaternion(Me.setFromEuler(A))}applyAxisAngle(A,t){return this.applyQuaternion(Me.setFromAxisAngle(A,t))}applyMatrix3(A){const t=this.x,e=this.y,i=this.z,n=A.elements;return this.x=n[0]*t+n[3]*e+n[6]*i,this.y=n[1]*t+n[4]*e+n[7]*i,this.z=n[2]*t+n[5]*e+n[8]*i,this}applyNormalMatrix(A){return this.applyMatrix3(A).normalize()}applyMatrix4(A){const t=this.x,e=this.y,i=this.z,n=A.elements,g=1/(n[3]*t+n[7]*e+n[11]*i+n[15]);return this.x=(n[0]*t+n[4]*e+n[8]*i+n[12])*g,this.y=(n[1]*t+n[5]*e+n[9]*i+n[13])*g,this.z=(n[2]*t+n[6]*e+n[10]*i+n[14])*g,this}applyQuaternion(A){const t=this.x,e=this.y,i=this.z,n=A.x,g=A.y,r=A.z,I=A.w,o=2*(g*i-r*e),a=2*(r*t-n*i),C=2*(n*e-g*t);return this.x=t+I*o+g*C-r*a,this.y=e+I*a+r*o-n*C,this.z=i+I*C+n*a-g*o,this}project(A){return this.applyMatrix4(A.matrixWorldInverse).applyMatrix4(A.projectionMatrix)}unproject(A){return this.applyMatrix4(A.projectionMatrixInverse).applyMatrix4(A.matrixWorld)}transformDirection(A){const t=this.x,e=this.y,i=this.z,n=A.elements;return this.x=n[0]*t+n[4]*e+n[8]*i,this.y=n[1]*t+n[5]*e+n[9]*i,this.z=n[2]*t+n[6]*e+n[10]*i,this.normalize()}divide(A){return this.x/=A.x,this.y/=A.y,this.z/=A.z,this}divideScalar(A){return this.multiplyScalar(1/A)}min(A){return this.x=Math.min(this.x,A.x),this.y=Math.min(this.y,A.y),this.z=Math.min(this.z,A.z),this}max(A){return this.x=Math.max(this.x,A.x),this.y=Math.max(this.y,A.y),this.z=Math.max(this.z,A.z),this}clamp(A,t){return this.x=IA(this.x,A.x,t.x),this.y=IA(this.y,A.y,t.y),this.z=IA(this.z,A.z,t.z),this}clampScalar(A,t){return this.x=IA(this.x,A,t),this.y=IA(this.y,A,t),this.z=IA(this.z,A,t),this}clampLength(A,t){const e=this.length();return this.divideScalar(e||1).multiplyScalar(IA(e,A,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(A){return this.x*A.x+this.y*A.y+this.z*A.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(A){return this.normalize().multiplyScalar(A)}lerp(A,t){return this.x+=(A.x-this.x)*t,this.y+=(A.y-this.y)*t,this.z+=(A.z-this.z)*t,this}lerpVectors(A,t,e){return this.x=A.x+(t.x-A.x)*e,this.y=A.y+(t.y-A.y)*e,this.z=A.z+(t.z-A.z)*e,this}cross(A){return this.crossVectors(this,A)}crossVectors(A,t){const e=A.x,i=A.y,n=A.z,g=t.x,r=t.y,I=t.z;return this.x=i*I-n*r,this.y=n*g-e*I,this.z=e*r-i*g,this}projectOnVector(A){const t=A.lengthSq();if(t===0)return this.set(0,0,0);const e=A.dot(this)/t;return this.copy(A).multiplyScalar(e)}projectOnPlane(A){return _t.copy(this).projectOnVector(A),this.sub(_t)}reflect(A){return this.sub(_t.copy(A).multiplyScalar(2*this.dot(A)))}angleTo(A){const t=Math.sqrt(this.lengthSq()*A.lengthSq());if(t===0)return Math.PI/2;const e=this.dot(A)/t;return Math.acos(IA(e,-1,1))}distanceTo(A){return Math.sqrt(this.distanceToSquared(A))}distanceToSquared(A){const t=this.x-A.x,e=this.y-A.y,i=this.z-A.z;return t*t+e*e+i*i}manhattanDistanceTo(A){return Math.abs(this.x-A.x)+Math.abs(this.y-A.y)+Math.abs(this.z-A.z)}setFromSpherical(A){return this.setFromSphericalCoords(A.radius,A.phi,A.theta)}setFromSphericalCoords(A,t,e){const i=Math.sin(t)*A;return this.x=i*Math.sin(e),this.y=Math.cos(t)*A,this.z=i*Math.cos(e),this}setFromCylindrical(A){return this.setFromCylindricalCoords(A.radius,A.theta,A.y)}setFromCylindricalCoords(A,t,e){return this.x=A*Math.sin(t),this.y=e,this.z=A*Math.cos(t),this}setFromMatrixPosition(A){const t=A.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(A){const t=this.setFromMatrixColumn(A,0).length(),e=this.setFromMatrixColumn(A,1).length(),i=this.setFromMatrixColumn(A,2).length();return this.x=t,this.y=e,this.z=i,this}setFromMatrixColumn(A,t){return this.fromArray(A.elements,t*4)}setFromMatrix3Column(A,t){return this.fromArray(A.elements,t*3)}setFromEuler(A){return this.x=A._x,this.y=A._y,this.z=A._z,this}setFromColor(A){return this.x=A.r,this.y=A.g,this.z=A.b,this}equals(A){return A.x===this.x&&A.y===this.y&&A.z===this.z}fromArray(A,t=0){return this.x=A[t],this.y=A[t+1],this.z=A[t+2],this}toArray(A=[],t=0){return A[t]=this.x,A[t+1]=this.y,A[t+2]=this.z,A}fromBufferAttribute(A,t){return this.x=A.getX(t),this.y=A.getY(t),this.z=A.getZ(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const A=Math.random()*Math.PI*2,t=Math.random()*2-1,e=Math.sqrt(1-t*t);return this.x=e*Math.cos(A),this.y=t,this.z=e*Math.sin(A),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const _t=new d,Me=new SA;class At{constructor(A,t,e,i,n,g,r,I,o){At.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],A!==void 0&&this.set(A,t,e,i,n,g,r,I,o)}set(A,t,e,i,n,g,r,I,o){const a=this.elements;return a[0]=A,a[1]=i,a[2]=r,a[3]=t,a[4]=n,a[5]=I,a[6]=e,a[7]=g,a[8]=o,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(A){const t=this.elements,e=A.elements;return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],this}extractBasis(A,t,e){return A.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),e.setFromMatrix3Column(this,2),this}setFromMatrix4(A){const t=A.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(A){return this.multiplyMatrices(this,A)}premultiply(A){return this.multiplyMatrices(A,this)}multiplyMatrices(A,t){const e=A.elements,i=t.elements,n=this.elements,g=e[0],r=e[3],I=e[6],o=e[1],a=e[4],C=e[7],h=e[2],B=e[5],Q=e[8],l=i[0],c=i[3],E=i[6],y=i[1],f=i[4],u=i[7],p=i[2],S=i[5],J=i[8];return n[0]=g*l+r*y+I*p,n[3]=g*c+r*f+I*S,n[6]=g*E+r*u+I*J,n[1]=o*l+a*y+C*p,n[4]=o*c+a*f+C*S,n[7]=o*E+a*u+C*J,n[2]=h*l+B*y+Q*p,n[5]=h*c+B*f+Q*S,n[8]=h*E+B*u+Q*J,this}multiplyScalar(A){const t=this.elements;return t[0]*=A,t[3]*=A,t[6]*=A,t[1]*=A,t[4]*=A,t[7]*=A,t[2]*=A,t[5]*=A,t[8]*=A,this}determinant(){const A=this.elements,t=A[0],e=A[1],i=A[2],n=A[3],g=A[4],r=A[5],I=A[6],o=A[7],a=A[8];return t*g*a-t*r*o-e*n*a+e*r*I+i*n*o-i*g*I}invert(){const A=this.elements,t=A[0],e=A[1],i=A[2],n=A[3],g=A[4],r=A[5],I=A[6],o=A[7],a=A[8],C=a*g-r*o,h=r*I-a*n,B=o*n-g*I,Q=t*C+e*h+i*B;if(Q===0)return this.set(0,0,0,0,0,0,0,0,0);const l=1/Q;return A[0]=C*l,A[1]=(i*o-a*e)*l,A[2]=(r*e-i*g)*l,A[3]=h*l,A[4]=(a*t-i*I)*l,A[5]=(i*n-r*t)*l,A[6]=B*l,A[7]=(e*I-o*t)*l,A[8]=(g*t-e*n)*l,this}transpose(){let A;const t=this.elements;return A=t[1],t[1]=t[3],t[3]=A,A=t[2],t[2]=t[6],t[6]=A,A=t[5],t[5]=t[7],t[7]=A,this}getNormalMatrix(A){return this.setFromMatrix4(A).invert().transpose()}transposeIntoArray(A){const t=this.elements;return A[0]=t[0],A[1]=t[3],A[2]=t[6],A[3]=t[1],A[4]=t[4],A[5]=t[7],A[6]=t[2],A[7]=t[5],A[8]=t[8],this}setUvTransform(A,t,e,i,n,g,r){const I=Math.cos(n),o=Math.sin(n);return this.set(e*I,e*o,-e*(I*g+o*r)+g+A,-i*o,i*I,-i*(-o*g+I*r)+r+t,0,0,1),this}scale(A,t){return this.premultiply(bt.makeScale(A,t)),this}rotate(A){return this.premultiply(bt.makeRotation(-A)),this}translate(A,t){return this.premultiply(bt.makeTranslation(A,t)),this}makeTranslation(A,t){return A.isVector2?this.set(1,0,A.x,0,1,A.y,0,0,1):this.set(1,0,A,0,1,t,0,0,1),this}makeRotation(A){const t=Math.cos(A),e=Math.sin(A);return this.set(t,-e,0,e,t,0,0,0,1),this}makeScale(A,t){return this.set(A,0,0,0,t,0,0,0,1),this}equals(A){const t=this.elements,e=A.elements;for(let i=0;i<9;i++)if(t[i]!==e[i])return!1;return!0}fromArray(A,t=0){for(let e=0;e<9;e++)this.elements[e]=A[e+t];return this}toArray(A=[],t=0){const e=this.elements;return A[t]=e[0],A[t+1]=e[1],A[t+2]=e[2],A[t+3]=e[3],A[t+4]=e[4],A[t+5]=e[5],A[t+6]=e[6],A[t+7]=e[7],A[t+8]=e[8],A}clone(){return new this.constructor().fromArray(this.elements)}}const bt=new At,Se={};function Fe(s){s in Se||(Se[s]=!0,console.warn(s))}const de=new At().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),Ne=new At().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function Ms(){const s={enabled:!0,workingColorSpace:pe,spaces:{},convert:function(i,n,g){return this.enabled===!1||n===g||!n||!g||(this.spaces[n].transfer===Rt&&(i.r=ZA(i.r),i.g=ZA(i.g),i.b=ZA(i.b)),this.spaces[n].primaries!==this.spaces[g].primaries&&(i.applyMatrix3(this.spaces[n].toXYZ),i.applyMatrix3(this.spaces[g].fromXYZ)),this.spaces[g].transfer===Rt&&(i.r=TA(i.r),i.g=TA(i.g),i.b=TA(i.b))),i},workingToColorSpace:function(i,n){return this.convert(i,this.workingColorSpace,n)},colorSpaceToWorking:function(i,n){return this.convert(i,n,this.workingColorSpace)},getPrimaries:function(i){return this.spaces[i].primaries},getTransfer:function(i){return i===ps?xe:this.spaces[i].transfer},getLuminanceCoefficients:function(i,n=this.workingColorSpace){return i.fromArray(this.spaces[n].luminanceCoefficients)},define:function(i){Object.assign(this.spaces,i)},_getMatrix:function(i,n,g){return i.copy(this.spaces[n].toXYZ).multiply(this.spaces[g].fromXYZ)},_getDrawingBufferColorSpace:function(i){return this.spaces[i].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(i=this.workingColorSpace){return this.spaces[i].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(i,n){return Fe("THREE.ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),s.workingToColorSpace(i,n)},toWorkingColorSpace:function(i,n){return Fe("THREE.ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),s.colorSpaceToWorking(i,n)}},A=[.64,.33,.3,.6,.15,.06],t=[.2126,.7152,.0722],e=[.3127,.329];return s.define({[pe]:{primaries:A,whitePoint:e,transfer:xe,toXYZ:de,fromXYZ:Ne,luminanceCoefficients:t,workingColorSpaceConfig:{unpackColorSpace:yA},outputColorSpaceConfig:{drawingBufferColorSpace:yA}},[yA]:{primaries:A,whitePoint:e,transfer:Rt,toXYZ:de,fromXYZ:Ne,luminanceCoefficients:t,outputColorSpaceConfig:{drawingBufferColorSpace:yA}}}),s}const fA=Ms();function ZA(s){return s<.04045?s*.0773993808:Math.pow(s*.9478672986+.0521327014,2.4)}function TA(s){return s<.0031308?s*12.92:1.055*Math.pow(s,.41666)-.055}class Ge{constructor(A=new d(1/0,1/0,1/0),t=new d(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=A,this.max=t}set(A,t){return this.min.copy(A),this.max.copy(t),this}setFromArray(A){this.makeEmpty();for(let t=0,e=A.length;t=this.min.x&&A.x<=this.max.x&&A.y>=this.min.y&&A.y<=this.max.y&&A.z>=this.min.z&&A.z<=this.max.z}containsBox(A){return this.min.x<=A.min.x&&A.max.x<=this.max.x&&this.min.y<=A.min.y&&A.max.y<=this.max.y&&this.min.z<=A.min.z&&A.max.z<=this.max.z}getParameter(A,t){return t.set((A.x-this.min.x)/(this.max.x-this.min.x),(A.y-this.min.y)/(this.max.y-this.min.y),(A.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(A){return A.max.x>=this.min.x&&A.min.x<=this.max.x&&A.max.y>=this.min.y&&A.min.y<=this.max.y&&A.max.z>=this.min.z&&A.min.z<=this.max.z}intersectsSphere(A){return this.clampPoint(A.center,wA),wA.distanceToSquared(A.center)<=A.radius*A.radius}intersectsPlane(A){let t,e;return A.normal.x>0?(t=A.normal.x*this.min.x,e=A.normal.x*this.max.x):(t=A.normal.x*this.max.x,e=A.normal.x*this.min.x),A.normal.y>0?(t+=A.normal.y*this.min.y,e+=A.normal.y*this.max.y):(t+=A.normal.y*this.max.y,e+=A.normal.y*this.min.y),A.normal.z>0?(t+=A.normal.z*this.min.z,e+=A.normal.z*this.max.z):(t+=A.normal.z*this.max.z,e+=A.normal.z*this.min.z),t<=-A.constant&&e>=-A.constant}intersectsTriangle(A){if(this.isEmpty())return!1;this.getCenter(tt),ht.subVectors(this.max,tt),KA.subVectors(A.a,tt),qA.subVectors(A.b,tt),XA.subVectors(A.c,tt),kA.subVectors(qA,KA),UA.subVectors(XA,qA),zA.subVectors(KA,XA);let t=[0,-kA.z,kA.y,0,-UA.z,UA.y,0,-zA.z,zA.y,kA.z,0,-kA.x,UA.z,0,-UA.x,zA.z,0,-zA.x,-kA.y,kA.x,0,-UA.y,UA.x,0,-zA.y,zA.x,0];return!zt(t,KA,qA,XA,ht)||(t=[1,0,0,0,1,0,0,0,1],!zt(t,KA,qA,XA,ht))?!1:(Qt.crossVectors(kA,UA),t=[Qt.x,Qt.y,Qt.z],zt(t,KA,qA,XA,ht))}clampPoint(A,t){return t.copy(A).clamp(this.min,this.max)}distanceToPoint(A){return this.clampPoint(A,wA).distanceTo(A)}getBoundingSphere(A){return this.isEmpty()?A.makeEmpty():(this.getCenter(A.center),A.radius=this.getSize(wA).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:(FA[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(A),FA[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(A),FA[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(A),FA[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(A),FA[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(A),FA[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(A),FA[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(A),FA[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(A),this.setFromPoints(FA),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)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(A){return this.min.fromArray(A.min),this.max.fromArray(A.max),this}}const FA=[new d,new d,new d,new d,new d,new d,new d,new d],wA=new d,Bt=new Ge,KA=new d,qA=new d,XA=new d,kA=new d,UA=new d,zA=new d,tt=new d,ht=new d,Qt=new d,LA=new d;function zt(s,A,t,e,i){for(let n=0,g=s.length-3;n<=g;n+=3){LA.fromArray(s,n);const r=i.x*Math.abs(LA.x)+i.y*Math.abs(LA.y)+i.z*Math.abs(LA.z),I=A.dot(LA),o=t.dot(LA),a=e.dot(LA);if(Math.max(-Math.max(I,o,a),Math.min(I,o,a))>r)return!1}return!0}const ke={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},YA={h:0,s:0,l:0},Et={h:0,s:0,l:0};function Lt(s,A,t){return t<0&&(t+=1),t>1&&(t-=1),t<1/6?s+(A-s)*6*t:t<1/2?A:t<2/3?s+(A-s)*6*(2/3-t):s}class Ht{constructor(A,t,e){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(A,t,e)}set(A,t,e){if(t===void 0&&e===void 0){const i=A;i&&i.isColor?this.copy(i):typeof i=="number"?this.setHex(i):typeof i=="string"&&this.setStyle(i)}else this.setRGB(A,t,e);return this}setScalar(A){return this.r=A,this.g=A,this.b=A,this}setHex(A,t=yA){return A=Math.floor(A),this.r=(A>>16&255)/255,this.g=(A>>8&255)/255,this.b=(A&255)/255,fA.colorSpaceToWorking(this,t),this}setRGB(A,t,e,i=fA.workingColorSpace){return this.r=A,this.g=t,this.b=e,fA.colorSpaceToWorking(this,i),this}setHSL(A,t,e,i=fA.workingColorSpace){if(A=xs(A,1),t=IA(t,0,1),e=IA(e,0,1),t===0)this.r=this.g=this.b=e;else{const n=e<=.5?e*(1+t):e+t-e*t,g=2*e-n;this.r=Lt(g,n,A+1/3),this.g=Lt(g,n,A),this.b=Lt(g,n,A-1/3)}return fA.colorSpaceToWorking(this,i),this}setStyle(A,t=yA){function e(n){n!==void 0&&parseFloat(n)<1&&console.warn("THREE.Color: Alpha component of "+A+" will be ignored.")}let i;if(i=/^(\\w+)\\(([^\\)]*)\\)/.exec(A)){let n;const g=i[1],r=i[2];switch(g){case"rgb":case"rgba":if(n=/^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(r))return e(n[4]),this.setRGB(Math.min(255,parseInt(n[1],10))/255,Math.min(255,parseInt(n[2],10))/255,Math.min(255,parseInt(n[3],10))/255,t);if(n=/^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(r))return e(n[4]),this.setRGB(Math.min(100,parseInt(n[1],10))/100,Math.min(100,parseInt(n[2],10))/100,Math.min(100,parseInt(n[3],10))/100,t);break;case"hsl":case"hsla":if(n=/^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(r))return e(n[4]),this.setHSL(parseFloat(n[1])/360,parseFloat(n[2])/100,parseFloat(n[3])/100,t);break;default:console.warn("THREE.Color: Unknown color model "+A)}}else if(i=/^\\#([A-Fa-f\\d]+)$/.exec(A)){const n=i[1],g=n.length;if(g===3)return this.setRGB(parseInt(n.charAt(0),16)/15,parseInt(n.charAt(1),16)/15,parseInt(n.charAt(2),16)/15,t);if(g===6)return this.setHex(parseInt(n,16),t);console.warn("THREE.Color: Invalid hex color "+A)}else if(A&&A.length>0)return this.setColorName(A,t);return this}setColorName(A,t=yA){const e=ke[A.toLowerCase()];return e!==void 0?this.setHex(e,t):console.warn("THREE.Color: Unknown color "+A),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(A){return this.r=A.r,this.g=A.g,this.b=A.b,this}copySRGBToLinear(A){return this.r=ZA(A.r),this.g=ZA(A.g),this.b=ZA(A.b),this}copyLinearToSRGB(A){return this.r=TA(A.r),this.g=TA(A.g),this.b=TA(A.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(A=yA){return fA.workingToColorSpace(eA.copy(this),A),Math.round(IA(eA.r*255,0,255))*65536+Math.round(IA(eA.g*255,0,255))*256+Math.round(IA(eA.b*255,0,255))}getHexString(A=yA){return("000000"+this.getHex(A).toString(16)).slice(-6)}getHSL(A,t=fA.workingColorSpace){fA.workingToColorSpace(eA.copy(this),t);const e=eA.r,i=eA.g,n=eA.b,g=Math.max(e,i,n),r=Math.min(e,i,n);let I,o;const a=(r+g)/2;if(r===g)I=0,o=0;else{const C=g-r;switch(o=a<=.5?C/(g+r):C/(2-g-r),g){case e:I=(i-n)/C+(i{const r=g.trimEnd();return A?r:r.length>0?(A=!0,r):null}).filter(g=>g!=null);for(;t.length>0&&t[t.length-1].length===0;)t.pop();if(t.length===0)return[];const e=(n=t[0].match(/^\\s*/))==null?void 0:n[0];if(!e)return t;const i=new RegExp(`^${e}`);return t.map(g=>g.replace(i,""))}function Ns(s){return ds(s).join(`\n`)}const vt=new Float32Array(1),be=new Uint32Array(vt.buffer);function WA(s){vt[0]=s;const A=be[0],t=A>>31&1,e=A>>23&255,i=A&8388607,n=t<<15;if(e===255)return i!==0?n|32767:n|31744;const g=e-127+15;if(g>=31)return n|31744;if(g<=0){if(g<-10)return n;const I=(i|8388608)>>1-g+13;return n|I}const r=i>>13;return n|g<<10|r}function $(s){const A=s>>15&1,t=s>>10&31,e=s&1023;let i;if(t===0)if(e===0)i=A<<31;else{let n=e,g=-14;for(;(n&1024)===0;)n<<=1,g--;n&=1023;const r=g+127,I=n<<13;i=A<<31|r<<23|I}else if(t===31)e===0?i=A<<31|2139095040:i=A<<31|2143289344;else{const n=t-15+127,g=e<<13;i=A<<31|n<<23|g}return be[0]=i,vt[0]}function QA(s){return Math.max(0,Math.min(255,Math.round(s*255)))}function Gs(s){const A=[],t=new Set;function e(i){i&&typeof i=="object"&&!t.has(i)&&(t.add(i),i instanceof ArrayBuffer?A.push(i):ArrayBuffer.isView(i)?A.push(i.buffer):Array.isArray(i)?i.forEach(e):Object.values(i).forEach(e))}return e(s),A}function Zt(s,A,t,e,i,n,g,r,I,o,a,C,h,B,Q,l,c){const E=(c==null?void 0:c.rgbMin)??0,f=((c==null?void 0:c.rgbMax)??1)-E,u=QA((B-E)/f),p=QA((Q-E)/f),S=QA((l-E)/f),J=QA(h),D=Ze(new SA(I,o,a,C)),m=D&255,k=D>>>8&255,x=D>>>16&255,w=(c==null?void 0:c.lnScaleMin)??Ue,z=254/(((c==null?void 0:c.lnScaleMax)??Ye)-w),Y=n>>8&255,o=g>>>16&255,a=A*4;s[a+2]=s[a+2]&65535|r<<16|I<<24,s[a+3]=s[a+3]&16777215|o<<24}function Us(s,A,t,e,i,n,g){const r=(g==null?void 0:g.rgbMin)??0,o=((g==null?void 0:g.rgbMax)??1)-r,a=QA((t-r)/o),C=QA((e-r)/o),h=QA((i-r)/o),B=QA(n),Q=A*4;s[Q]=a|C<<8|h<<16|B<<24}function Ys(s,A,t,e,i,n){const g=(n==null?void 0:n.rgbMin)??0,I=((n==null?void 0:n.rgbMax)??1)-g,o=QA((t-g)/I),a=QA((e-g)/I),C=QA((i-g)/I),h=A*4;s[h]=o|a<<8|C<<16|s[h]&4278190080}function Rs(s,A,t){const e=QA(t),i=A*4;s[i]=s[i]&16777215|e<<24}new d,new d,new Ht;function Js(s){const A=Re,t=Math.max(_e,Math.min(Je,Math.ceil(s/A))),e=Math.ceil(s/(A*t)),i=A*t*e;return{width:A,height:t,depth:e,maxSplats:i}}function ct(s){const A=Re,t=Math.max(_e,Math.min(Je,Math.ceil(s/A))),e=Math.ceil(s/(A*t));return A*t*e}Ns(`\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`);const _s=new SA,ve=new d;function Ze(s){const A=_s.copy(s).normalize();A.w<0&&A.set(-A.x,-A.y,-A.z,-A.w);const t=2*Math.acos(A.w),e=Math.sqrt(A.x*A.x+A.y*A.y+A.z*A.z),i=e<1e-6?ve.set(1,0,0):ve.set(A.x,A.y,A.z).divideScalar(e),n=Math.abs(i.x)+Math.abs(i.y)+Math.abs(i.z);let g=i.x/n,r=i.y/n;if(i.z<0){const B=g;g=(1-Math.abs(r))*(g>=0?1:-1),r=(1-Math.abs(B))*(r>=0?1:-1)}const I=g*.5+.5,o=r*.5+.5,a=Math.round(I*255),C=Math.round(o*255);return Math.round(t*(255/Math.PI))<<16|C<<8|a}function lt(s,A,t,e){const i=Math.max(-127,Math.min(127,s*127)),n=Math.max(-127,Math.min(127,A*127)),g=Math.max(-127,Math.min(127,t*127)),r=Math.max(-127,Math.min(127,e*127));return i&255|(n&255)<<8|(g&255)<<16|(r&255)<<24}function ut(s,A,t,e){const i=(e==null?void 0:e.sh1Min)??-1,n=(e==null?void 0:e.sh1Max)??1,g=.5*(i+n),r=126/(n-i),I=A*2;for(let o=0;o<9;++o){const a=(t[o]-g)*r,C=Math.round(Math.max(-63,Math.min(63,a)))&127,h=o*7,B=h+7,Q=Math.floor(h/32),l=h-Q*32,c=C<Q*32+32){const E=C>>>32-l&4294967295;s[I+Q+1]|=E}}}function yt(s,A,t,e){const i=(e==null?void 0:e.sh2Min)??-1,n=(e==null?void 0:e.sh2Max)??1,g=.5*(i+n),r=2/(n-i);s[A*4+0]=lt((t[0]-g)*r,(t[1]-g)*r,(t[2]-g)*r,(t[3]-g)*r),s[A*4+1]=lt((t[4]-g)*r,(t[5]-g)*r,(t[6]-g)*r,(t[7]-g)*r),s[A*4+2]=lt((t[8]-g)*r,(t[9]-g)*r,(t[10]-g)*r,(t[11]-g)*r),s[A*4+3]=lt((t[12]-g)*r,(t[13]-g)*r,(t[14]-g)*r,0)}function ft(s,A,t,e){const i=(e==null?void 0:e.sh3Min)??-1,n=(e==null?void 0:e.sh3Max)??1,g=.5*(i+n),r=62/(n-i),I=A*4;for(let o=0;o<21;++o){const a=(t[o]-g)*r,C=Math.round(Math.max(-31,Math.min(31,a)))&63,h=o*6,B=h+6,Q=Math.floor(h/32),l=h-Q*32,c=C<Q*32+32){const E=C>>>32-l&4294967295;s[I+Q+1]|=E}}}function bs(s,A){const t=[];let e=0,i=null;const n=new ye((I,o)=>{if(t.push(I),e+=I.length,o||e>=A){const a=new Uint8Array(e);let C=0;for(const h of t)a.set(h,C),C+=h.length;i=a.slice(0,A)}}),g=1024;let r=0;for(;i==null&&r{this.chunks.push(e),this.totalBytes+=e.length})}read(A){for(;this.totalBytes=this.fileBytes.length&&this.gunzip.push(new Uint8Array(0),!0),this.totalBytes{t=n,e=ct(t),i=new Uint32Array(e*4)},(n,g,r,I,o,a,C,h,B,Q,l,c,E,y,f)=>{Zt(i,n,g,r,I,o,a,C,h,B,Q,l,c,E,y,f,A)}),{packedArray:i,numSplats:t}}const wt={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}},Ke={0:0,1:9,2:24,3:45};function Hs(s,A,t,e){var l;let g=0;const r=new DataView(s.buffer,g,4096);g+=4096;const I=r.getUint8(0),o=r.getUint8(1);if(I!==0||o<1)throw new Error(`Unsupported .ksplat version: ${I}.${o}`);const a=r.getUint32(4,!0);r.getUint32(16,!0);const C=r.getUint16(20,!0);if(C<0||C>2)throw new Error(`Invalid .ksplat compression level: ${C}`);const h=r.getFloat32(36,!0)||-1.5,B=r.getFloat32(40,!0)||1.5;let Q=4096+a*1024;for(let c=0;c=1?new Float32Array(3*3):void 0,CA=Y>=2?new Float32Array(5*3):void 0,dA=Y>=3?new Float32Array(7*3):void 0,BA=J/2/m,EA=Q+M,cA=Q+z,G=new DataView(s.buffer,cA,F),nA=new Float32Array(s.buffer,EA,S*3),O=new Uint32Array(s.buffer,Q,w);let H=k,JA=x;for(let gA=0;gA=JA+MA&&(H+=1,JA+=MA),lA=H}const AA=C===0?G.getFloat32(U+0,!0):(G.getUint16(U+0,!0)-m)*BA+nA[3*lA+0],b=C===0?G.getFloat32(U+4,!0):(G.getUint16(U+2,!0)-m)*BA+nA[3*lA+1],DA=C===0?G.getFloat32(U+8,!0):(G.getUint16(U+4,!0)-m)*BA+nA[3*lA+2],it=C===0?G.getFloat32(U+P+0,!0):$(G.getUint16(U+P+0,!0)),nt=C===0?G.getFloat32(U+P+4,!0):$(G.getUint16(U+P+2,!0)),Wt=C===0?G.getFloat32(U+P+8,!0):$(G.getUint16(U+P+4,!0)),jt=C===0?G.getFloat32(U+L+0,!0):$(G.getUint16(U+L+0,!0)),Vt=C===0?G.getFloat32(U+L+4,!0):$(G.getUint16(U+L+2,!0)),Ot=C===0?G.getFloat32(U+L+8,!0):$(G.getUint16(U+L+4,!0)),$t=C===0?G.getFloat32(U+L+12,!0):$(G.getUint16(U+L+6,!0)),Ae=G.getUint8(U+T+0)/255,te=G.getUint8(U+T+1)/255,ee=G.getUint8(U+T+2)/255,se=G.getUint8(U+T+3)/255;if(t(gA,AA,b,DA,it,nt,Wt,Vt,Ot,$t,jt,se,Ae,te,ee),Y>=1&&aA){for(const[MA,HA]of iA.entries())aA[MA]=E(U,HA);if(CA)for(const[MA,HA]of oA.entries())CA[MA]=E(U,HA);if(dA)for(const[MA,HA]of rA.entries())dA[MA]=E(U,HA);e==null||e(gA,aA,CA,dA)}}Q+=sA}}function vs(s,A){var y;let i=0;const n=new DataView(s.buffer,i,4096);i+=4096;const g=n.getUint8(0),r=n.getUint8(1);if(g!==0||r<1)throw new Error(`Unsupported .ksplat version: ${g}.${r}`);const I=n.getUint32(4,!0),o=n.getUint32(16,!0),a=n.getUint16(20,!0);if(a<0||a>2)throw new Error(`Invalid .ksplat compression level: ${a}`);const C=n.getFloat32(36,!0)||-1.5,h=n.getFloat32(40,!0)||1.5,B=o,Q=ct(B),l=new Uint32Array(Q*4),c={};let E=4096+I*1024;for(let f=0;f=1?new Float32Array(3*3):void 0,EA=K>=2?new Float32Array(5*3):void 0,cA=K>=3?new Float32Array(7*3):void 0,G=k/2/w,nA=E+N,O=E+v,H=new DataView(s.buffer,O,oA),JA=new Float32Array(s.buffer,nA,m*3),gA=new Uint32Array(s.buffer,E,Y);let U=M,lA=z;for(let AA=0;AA=lA+_A&&(U+=1,lA+=_A),DA=U}const it=a===0?H.getFloat32(b+0,!0):(H.getUint16(b+0,!0)-w)*G+JA[3*DA+0],nt=a===0?H.getFloat32(b+4,!0):(H.getUint16(b+2,!0)-w)*G+JA[3*DA+1],Wt=a===0?H.getFloat32(b+8,!0):(H.getUint16(b+4,!0)-w)*G+JA[3*DA+2],jt=a===0?H.getFloat32(b+_+0,!0):$(H.getUint16(b+_+0,!0)),Vt=a===0?H.getFloat32(b+_+4,!0):$(H.getUint16(b+_+2,!0)),Ot=a===0?H.getFloat32(b+_+8,!0):$(H.getUint16(b+_+4,!0)),$t=a===0?H.getFloat32(b+R+0,!0):$(H.getUint16(b+R+0,!0)),Ae=a===0?H.getFloat32(b+R+4,!0):$(H.getUint16(b+R+2,!0)),te=a===0?H.getFloat32(b+R+8,!0):$(H.getUint16(b+R+4,!0)),ee=a===0?H.getFloat32(b+R+12,!0):$(H.getUint16(b+R+6,!0)),se=H.getUint8(b+F+0)/255,MA=H.getUint8(b+F+1)/255,HA=H.getUint8(b+F+2)/255,Bi=H.getUint8(b+F+3)/255;if(Zt(l,AA,it,nt,Wt,jt,Vt,Ot,Ae,te,ee,$t,Bi,se,MA,HA,A),K>=1){if(BA){c.sh1||(c.sh1=new Uint32Array(B*2));for(const[_A,gt]of aA.entries())BA[_A]=u(b,gt);ut(c.sh1,AA,BA,A)}if(EA){c.sh2||(c.sh2=new Uint32Array(B*4));for(const[_A,gt]of CA.entries())EA[_A]=u(b,gt);yt(c.sh2,AA,EA,A)}if(cA){c.sh3||(c.sh3=new Uint32Array(B*4));for(const[_A,gt]of dA.entries())cA[_A]=u(b,gt);ft(c.sh3,AA,cA,A)}}}E+=rA}return{packedArray:l,numSplats:B,extra:c}}const qe=["char","uchar","short","ushort","int","uint","float","double"],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 t=new ReadableStream({start:g=>{g.enqueue(this.fileBytes.slice(0,65536)),g.close()}}).pipeThrough(new TextDecoderStream).getReader();this.header="";const e=`end_header\n`;for(;;){const{value:g,done:r}=await t.read();if(r)throw new Error("Failed to read header");this.header+=g;const I=this.header.indexOf(e);if(I>=0){this.header=this.header.slice(0,I+e.length);break}}const i=new TextEncoder().encode(this.header).length;this.data=new DataView(this.fileBytes.buffer,i),this.elements={};let n=null;this.comments=[],this.header.trim().split(`\n`).forEach((g,r)=>{const I=g.trim();if(r===0){if(I!=="ply")throw new Error("Invalid PLY header");return}if(I.length===0)return;const o=I.split(" ");switch(o[0]){case"format":if(o[1]==="binary_little_endian")this.littleEndian=!0;else if(o[1]==="binary_big_endian")this.littleEndian=!1;else throw new Error(`Unsupported PLY format: ${o[1]}`);if(o[2]!=="1.0")throw new Error(`Unsupported PLY version: ${o[2]}`);break;case"end_header":break;case"comment":this.comments.push(I.slice(8));break;case"element":{const a=o[1];n={name:a,count:Number.parseInt(o[2]),properties:{}},this.elements[a]=n;break}case"property":if(n==null)throw new Error("Property must be inside an element");o[1]==="list"?n.properties[o[4]]={isList:!0,type:o[3],countType:o[2]}:n.properties[o[2]]={isList:!1,type:o[1]};break}}),this.elements.vertex&&(this.numSplats=this.elements.vertex.count)}parseData(A){let t=0;const e=this.data;if(e==null)throw new Error("No data to parse");for(const i in this.elements){const n=this.elements[i],{count:g,properties:r}=n,I=Ks(r),o=qs(r,this.littleEndian),a=A(n)??(()=>{});for(let C=0;C[0,1,2].map((u,p)=>f+p*E/3)),r=new Array(5).fill(null).flatMap((y,f)=>[0,1,2].map((u,p)=>3+f+p*E/3)),I=new Array(7).fill(null).flatMap((y,f)=>[0,1,2].map((u,p)=>8+f+p*E/3)),o=n>=1?new Float32Array(3*3):void 0,a=n>=2?new Float32Array(5*3):void 0,C=n>=3?new Float32Array(7*3):void 0}function B(E,y){if(!o)throw new Error("Missing sh1");const f=y.f_rest;for(let u=0;u{const{min_x:N,min_y:v,min_z:K,max_x:Z,max_y:W,max_z:q,min_scale_x:P,min_scale_y:L,min_scale_z:T,max_scale_x:_,max_scale_y:R,max_scale_z:F,min_r:sA,min_g:iA,min_b:oA,max_r:rA,max_g:aA,max_b:CA}=Y;i.push({min_x:N,min_y:v,min_z:K,max_x:Z,max_y:W,max_z:q,min_scale_x:P,min_scale_y:L,min_scale_z:T,max_scale_x:_,max_scale_y:R,max_scale_z:F,min_r:sA,min_g:iA,min_b:oA,max_r:rA,max_g:aA,max_b:CA})}}function l(E){if(t&&E.name==="sh")return n=Kt(E.properties),h(),B;if(E.name!=="vertex")return null;const{packed_position:y,packed_rotation:f,packed_scale:u,packed_color:p}=E.properties;if(!y||!f||!u||!p)throw new Error("Missing PLY properties: packed_position, packed_rotation, packed_scale, packed_color");const S=Math.sqrt(2);return(J,D)=>{const m=i[J>>>8];if(m==null)throw new Error("Missing PLY chunk");const{min_x:k,min_y:x,min_z:w,max_x:M,max_y:z,max_z:Y,min_scale_x:N,min_scale_y:v,min_scale_z:K,max_scale_x:Z,max_scale_y:W,max_scale_z:q,min_r:P,min_g:L,min_b:T,max_r:_,max_g:R,max_b:F}=m,{packed_position:sA,packed_rotation:iA,packed_scale:oA,packed_color:rA}=D,aA=(sA>>>21&2047)/2047*(M-k)+k,CA=(sA>>>11&1023)/1023*(z-x)+x,dA=(sA&2047)/2047*(Y-w)+w,BA=((iA>>>20&1023)/1023-.5)*S,EA=((iA>>>10&1023)/1023-.5)*S,cA=((iA&1023)/1023-.5)*S,G=Math.sqrt(Math.max(0,1-BA*BA-EA*EA-cA*cA)),nA=iA>>>30,O=nA===0?BA:nA===1?G:EA,H=nA<=1?EA:nA===2?G:cA,JA=nA<=2?cA:G,gA=nA===0?G:BA,U=Math.exp((oA>>>21&2047)/2047*(Z-N)+N),lA=Math.exp((oA>>>11&1023)/1023*(W-v)+v),AA=Math.exp((oA&2047)/2047*(q-K)+K),b=(rA>>>24&255)/255*((_??1)-(P??0))+(P??0),DA=(rA>>>16&255)/255*((R??1)-(L??0))+(L??0),it=(rA>>>8&255)/255*((F??1)-(T??0))+(T??0),nt=(rA&255)/255;A(J,aA,CA,dA,U,lA,AA,O,H,JA,gA,nt,b,DA,it)}}const c=E=>{if(E.name==="chunk")return Q(E);if(e)return l(E);if(E.name!=="vertex")return null;const{x:y,y:f,z:u,scale_0:p,scale_1:S,scale_2:J,rot_0:D,rot_1:m,rot_2:k,rot_3:x,opacity:w,f_dc_0:M,f_dc_1:z,f_dc_2:Y,red:N,green:v,blue:K,alpha:Z}=E.properties;if(!y||!f||!u)throw new Error("Missing PLY properties: x, y, z");const W=p&&S&&J,q=D&&m&&k&&x,P=Z!=null?pt[Z.type]:1,L=N!=null?pt[N.type]:1,T=v!=null?pt[v.type]:1,_=K!=null?pt[K.type]:1;return n=Kt(E.properties),h(),(R,F)=>{const sA=W?Math.exp(F.scale_0):VA.defaultPointScale,iA=W?Math.exp(F.scale_1):VA.defaultPointScale,oA=W?Math.exp(F.scale_2):VA.defaultPointScale,rA=q?F.rot_1:0,aA=q?F.rot_2:0,CA=q?F.rot_3:0,dA=q?F.rot_0:1,BA=w!=null?1/(1+Math.exp(-F.opacity)):Z!=null?F.alpha/P:1,EA=M!=null?F.f_dc_0*Dt+.5:N!=null?F.red/L:1,cA=z!=null?F.f_dc_1*Dt+.5:v!=null?F.green/T:1,G=Y!=null?F.f_dc_2*Dt+.5:K!=null?F.blue/_:1;if(A(R,F.x,F.y,F.z,sA,iA,oA,rA,aA,CA,dA,BA,EA,cA,G),t&&o){const nA=F.f_rest;if(o)for(let O=0;O{const B=jA[h.countType](e,t,this.littleEndian);t+=mA[h.countType],t+=B*mA[h.type]});else{if(a)if(C==="f_dc_0"||C==="f_dc_1"||C==="f_dc_2"){const B=Number.parseInt(C.slice(5));I.push(()=>{const Q=(A[o+B]/255-.5)/Dt;Xe[h.type](e,t,this.littleEndian,Q)})}else C==="opacity"&&I.push(()=>{const B=Math.max(-100,Math.min(100,-Math.log(1/(A[o+3]/255)-1)));Xe[h.type](e,t,this.littleEndian,B)});I.push(()=>{t+=mA[h.type]})}for(let C=0;Cs.getInt8(A),uchar:(s,A,t)=>s.getUint8(A),short:(s,A,t)=>s.getInt16(A,t),ushort:(s,A,t)=>s.getUint16(A,t),int:(s,A,t)=>s.getInt32(A,t),uint:(s,A,t)=>s.getUint32(A,t),float:(s,A,t)=>s.getFloat32(A,t),double:(s,A,t)=>s.getFloat64(A,t)},Xe={char:(s,A,t,e)=>{s.setInt8(A,e)},uchar:(s,A,t,e)=>{s.setUint8(A,e)},short:(s,A,t,e)=>{s.setInt16(A,e,t)},ushort:(s,A,t,e)=>{s.setUint16(A,e,t)},int:(s,A,t,e)=>{s.setInt32(A,e,t)},uint:(s,A,t,e)=>{s.setUint32(A,e,t)},float:(s,A,t,e)=>{s.setFloat32(A,e,t)},double:(s,A,t,e)=>{s.setFloat64(A,e,t)}},mA={char:1,uchar:1,short:2,ushort:2,int:4,uint:4,float:4,double:8},pt={char:127,uchar:255,short:32767,ushort:65535,int:2147483647,uint:4294967295,float:1,double:1},Zs={0:0,9:1,24:2,45:3},Ts={0:0,1:9,2:24,3:45},Tt=/^f_rest_([0-9]{1,2})$/;function Ks(s){const A={};for(const[t,e]of Object.entries(s))Tt.test(t)?A.f_rest=new Array(Kt(s)):A[t]=e.isList?[]:0;return A}function qs(s,A){return Ws(s)?js(s,A):Vs(s,A)}const Xs=(()=>{try{new Function("return 42;")}catch{return!1}return!0})(),Ps=/^[a-zA-Z0-9_]+$/;function Ws(s){if(!Xs)return!1;for(const[A,t]of Object.entries(s))if(!Ps.test(A)||t.isList&&!qe.includes(t.countType)||!qe.includes(t.type))return!1;return!0}function js(s,A){const t=["let list;"];for(const[i,n]of Object.entries(s)){const g=i.match(Tt);if(g){const r=+g[1];t.push(`\n item.f_rest[${r}] = PARSE_FIELD[\'${n.type}\'](data, offset, ${A});\n offset += ${mA[n.type]};\n `)}else n.isList?t.push(`\n list = item[\'${i}\'];\n list.length = PARSE_FIELD[\'${n.countType}\'](data, offset, ${A});\n offset += ${mA[n.countType]};\n for (let i = 0; i < list.length; i++) {\n list[i] = PARSE_FIELD[\'${n.type}\'](data, offset, ${A});\n offset += ${mA[n.type]};\n }\n `):t.push(`\n item[\'${i}\'] = PARSE_FIELD[\'${n.type}\'](data, offset, ${A});\n offset += ${mA[n.type]};\n `)}t.push("return offset;");const e=new Function("data","offset","item","PARSE_FIELD",t.join(`\n`));return(i,n,g)=>e(i,n,g,jA)}function Vs(s,A){const t=[];for(const[e,i]of Object.entries(s)){const n=e.match(Tt);if(n){const g=+n[1];t.push((r,I,o)=>(o.f_rest[g]=jA[i.type](r,I,A),I+mA[i.type]))}else i.isList?t.push((g,r,I)=>{const o=I[e];o.length=jA[i.countType](g,r,A);let a=r+mA[i.countType];for(let C=0;C(I[e]=jA[i.type](g,r,A),r+mA[i.type]))}return(e,i,n)=>{let g=i;for(let r=0;r(s.PLY="ply",s.SPZ="spz",s.SPLAT="splat",s.KSPLAT="ksplat",s.PCSOGS="pcsogs",s.PCSOGSZIP="pcsogszip",s))(et||{});function Os(s){const A=new DataView(s.buffer);if((A.getUint32(0,!0)&16777215)===7957616)return"ply";if((A.getUint32(0,!0)&16777215)===559903){const t=bs(s,4);return new DataView(t.buffer).getUint32(0,!0)===1347635022?"spz":void 0}if(A.getUint32(0,!0)===67324752)return Pe(s)?"pcsogszip":void 0}function $s(s){const A=s.split(/[?#]/,1)[0],t=Math.max(A.lastIndexOf("/"),A.lastIndexOf("\\\\")),e=A.slice(t+1),i=e.lastIndexOf(".");return i<=0||i===e.length-1?"":e.slice(i+1).toLowerCase()}function Ai(s){const A=$s(s);if(A==="ply")return"ply";if(A==="spz")return"spz";if(A==="splat")return"splat";if(A==="ksplat")return"ksplat"}function ti(s){try{let A;if(typeof s=="string")A=s;else{const e=s instanceof ArrayBuffer?new Uint8Array(s):s;if(e.length>65536)return;A=new TextDecoder().decode(e)}const t=JSON.parse(A);if(!t||typeof t!="object"||Array.isArray(t))return;for(const e of["means","scales","quats","sh0"])if(!t[e]||typeof t[e]!="object"||Array.isArray(t[e])||!t[e].shape||!t[e].files||e!=="quats"&&(!t[e].mins||!t[e].maxs))return;return t}catch{return}}function Pe(s){try{const A=s instanceof ArrayBuffer?new Uint8Array(s):s;let t=null;const e=Ds(A,{filter:({name:n})=>n.split(/[\\\\/]/).pop()==="meta.json"?(t=n,!0):!1});if(!t)return;const i=ti(e[t]);return i?{name:t,json:i}:void 0}catch{return}}class ei{constructor({maxSplats:A=1}={}){this.numSplats=0,this.maxSplats=Js(A).maxSplats,this.centers=new Float32Array(this.maxSplats*3),this.scales=new Float32Array(this.maxSplats*3),this.quaternions=new Float32Array(this.maxSplats*4),this.opacities=new Float32Array(this.maxSplats),this.colors=new Float32Array(this.maxSplats*3)}pushSplat(){const A=this.numSplats;return this.ensureIndex(A),this.numSplats+=1,A}unpushSplat(A){if(A===this.numSplats-1)this.numSplats-=1;else throw new Error("Cannot unpush splat from non-last position")}ensureCapacity(A){if(A>this.maxSplats){const t=Math.max(A,this.maxSplats*2),e=new Float32Array(t*3),i=new Float32Array(t*3),n=new Float32Array(t*4),g=new Float32Array(t),r=new Float32Array(t*3);if(e.set(this.centers),i.set(this.scales),n.set(this.quaternions),g.set(this.opacities),r.set(this.colors),this.centers=e,this.scales=i,this.quaternions=n,this.opacities=g,this.colors=r,this.sh1){const I=new Float32Array(t*9);I.set(this.sh1),this.sh1=I}if(this.sh2){const I=new Float32Array(t*15);I.set(this.sh2),this.sh2=I}if(this.sh3){const I=new Float32Array(t*21);I.set(this.sh3),this.sh3=I}this.maxSplats=t}}ensureIndex(A){this.ensureCapacity(A+1)}setCenter(A,t,e,i){this.centers[A*3]=t,this.centers[A*3+1]=e,this.centers[A*3+2]=i}setScale(A,t,e,i){this.scales[A*3]=t,this.scales[A*3+1]=e,this.scales[A*3+2]=i}setQuaternion(A,t,e,i,n){this.quaternions[A*4]=t,this.quaternions[A*4+1]=e,this.quaternions[A*4+2]=i,this.quaternions[A*4+3]=n}setOpacity(A,t){this.opacities[A]=t}setColor(A,t,e,i){this.colors[A*3]=t,this.colors[A*3+1]=e,this.colors[A*3+2]=i}setSh1(A,t){this.sh1||(this.sh1=new Float32Array(this.maxSplats*9));for(let e=0;e<9;++e)this.sh1[A*9+e]=t[e]}setSh2(A,t){this.sh2||(this.sh2=new Float32Array(this.maxSplats*15));for(let e=0;e<15;++e)this.sh2[A*15+e]=t[e]}setSh3(A,t){this.sh3||(this.sh3=new Float32Array(this.maxSplats*21));for(let e=0;e<21;++e)this.sh3[A*21+e]=t[e]}}async function We(s,A,t){if(s.quats.encoding!=="quaternion_packed")throw new Error("Unsupported quaternion encoding");const e=s.means.shape[0],i=ct(e),n=new Uint32Array(i*4),g={},r=Promise.all([st(A[s.means.files[0]]),st(A[s.means.files[1]])]).then(h=>{for(let B=0;B{for(let B=0;B{const B=Math.sqrt(2);for(let Q=0;Q{const B=.28209479177387814;for(let Q=0;Q=45,B=s.shN.shape[1]>=24,Q=s.shN.shape[1]>=9;Q&&(g.sh1=new Uint32Array(e*2)),B&&(g.sh2=new Uint32Array(e*4)),h&&(g.sh3=new Uint32Array(e*4));const l=new Float32Array(9),c=new Float32Array(15),E=new Float32Array(21),y=s.shN,f=Promise.all([qt(A[s.shN.files[0]]),qt(A[s.shN.files[1]])]).then(([u,p])=>{for(let S=0;S>>6)*u.width+m;for(let w=0;w<3;++w){if(Q)for(let M=0;M<3;++M)l[M*3+w]=y.mins+(y.maxs-y.mins)*u.rgba[(x+M)*4+w]/255;if(B)for(let M=0;M<5;++M)c[M*3+w]=y.mins+(y.maxs-y.mins)*u.rgba[(x+3+M)*4+w]/255;if(h)for(let M=0;M<7;++M)E[M*3+w]=y.mins+(y.maxs-y.mins)*u.rgba[(x+8+M)*4+w]/255}Q&&ut(g.sh1,S,l,t),B&&yt(g.sh2,S,c,t),h&&ft(g.sh3,S,E,t)}});C.push(f)}return await Promise.all(C),{packedArray:n,numSplats:e,extra:g}}let xt=null;async function qt(s){if(!xt&&(xt=new OffscreenCanvas(1,1).getContext("webgl2"),!xt))throw new Error("Failed to create WebGL2 context");const A=new Blob([s]),t=await createImageBitmap(A,{premultiplyAlpha:"none"}),e=xt,i=e.createTexture();e.bindTexture(e.TEXTURE_2D,i),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);const n=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,n),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,i,0);const g=new Uint8Array(t.width*t.height*4);return e.readPixels(0,0,t.width,t.height,e.RGBA,e.UNSIGNED_BYTE,g),e.deleteTexture(i),e.deleteFramebuffer(n),{rgba:g,width:t.width,height:t.height}}async function st(s){const{rgba:A}=await qt(s);return A}async function si(s,A){var h;const t=Pe(s);if(!t)throw new Error("Invalid PC SOGS zip file");const{name:e,json:i}=t,n=e.lastIndexOf("/"),g=e.lastIndexOf("\\\\"),r=e.slice(0,Math.max(n,g)+1),I=new Map,o=[...i.means.files,...i.scales.files,...i.quats.files,...i.sh0.files,...((h=i.shN)==null?void 0:h.files)??[]];for(const B of o)I.set(r+B,B);const a=await new Promise((B,Q)=>{ms(s,{filter:({name:l})=>I.has(l)},(l,c)=>{l?Q(l):B(c)})}),C={};for(const[B,Q]of I.entries())C[Q]=a[B];return await We(i,C,A)}class je{constructor({fileBytes:A}){this.fileBytes=A instanceof ArrayBuffer?new Uint8Array(A):A,this.reader=new zs({fileBytes:this.fileBytes});const t=new DataView(this.reader.read(16).buffer);if(t.getUint32(0,!0)!==1347635022)throw new Error("Invalid SPZ file");if(this.version=t.getUint32(4,!0),this.version<1||this.version>2)throw new Error(`Unsupported SPZ version: ${this.version}`);this.numSplats=t.getUint32(8,!0),this.shDegree=t.getUint8(12),this.fractionalBits=t.getUint8(13),this.flags=t.getUint8(14),this.flagAntiAlias=(this.flags&1)!==0,this.reserved=t.getUint8(15),this.parsed=!1}parseSplats(A,t,e,i,n,g){if(this.parsed)throw new Error("SPZ file already parsed");if(this.parsed=!0,this.version===1){const r=this.reader.read(this.numSplats*3*2),I=new Uint16Array(r.buffer);for(let o=0;o>8)/r,h=((I[a+5]<<24|I[a+4]<<16|I[a+3]<<8)>>8)/r,B=((I[a+8]<<24|I[a+7]<<16|I[a+6]<<8)>>8)/r;A==null||A(o,C,h,B)}}else throw new Error("Unreachable");{const r=this.reader.read(this.numSplats);for(let I=0;I=1){const r=new Float32Array(9),I=this.shDegree>=2?new Float32Array(5*3):void 0,o=this.shDegree>=3?new Float32Array(7*3):void 0,a=this.reader.read(this.numSplats*Ve[this.shDegree]*3);let C=0;for(let h=0;h=1?9:0)+(t>=2?15:0)+(t>=3?21:0),g=16+A*n;this.buffer=new ArrayBuffer(g),this.view=new DataView(this.buffer),this.view.setUint32(0,ii,!0),this.view.setUint32(4,ni,!0),this.view.setUint32(8,A,!0),this.view.setUint8(12,t),this.view.setUint8(13,e),this.view.setUint8(14,i?gi:0),this.view.setUint8(15,0),this.numSplats=A,this.shDegree=t,this.fractionalBits=e,this.fraction=1<>8&255),this.view.setUint8(B+2,g>>16&255),this.view.setUint8(B+3,I&255),this.view.setUint8(B+4,I>>8&255),this.view.setUint8(B+5,I>>16&255),this.view.setUint8(B+6,a&255),this.view.setUint8(B+7,a>>8&255),this.view.setUint8(B+8,a>>16&255)}setAlpha(A,t){const e=16+this.numSplats*9+A;this.view.setUint8(e,Math.max(0,Math.min(255,Math.round(t*255))))}static scaleRgb(A){const t=((A-.5)/(Oe/.15)+.5)*255;return Math.max(0,Math.min(255,Math.round(t)))}setRgb(A,t,e,i){const n=16+this.numSplats*10+A*3;this.view.setUint8(n,RA.scaleRgb(t)),this.view.setUint8(n+1,RA.scaleRgb(e)),this.view.setUint8(n+2,RA.scaleRgb(i))}setScale(A,t,e,i){const n=16+this.numSplats*13+A*3;this.view.setUint8(n,Math.max(0,Math.min(255,Math.round((Math.log(t)+10)*16)))),this.view.setUint8(n+1,Math.max(0,Math.min(255,Math.round((Math.log(e)+10)*16)))),this.view.setUint8(n+2,Math.max(0,Math.min(255,Math.round((Math.log(i)+10)*16))))}setQuat(A,t,e,i,n){const g=16+this.numSplats*16+A*3,r=n<0;this.view.setUint8(g,Math.max(0,Math.min(255,Math.round(((r?-t:t)+1)*127.5)))),this.view.setUint8(g+1,Math.max(0,Math.min(255,Math.round(((r?-e:e)+1)*127.5)))),this.view.setUint8(g+2,Math.max(0,Math.min(255,Math.round(((r?-i:i)+1)*127.5))))}static quantizeSh(A,t){const e=Math.round(A*128)+128,i=1<<8-t,n=Math.floor((e+i/2)/i)*i;return Math.max(0,Math.min(255,n))}setSh(A,t,e,i){const n=Ve[this.shDegree]||0,g=16+this.numSplats*19+A*n*3;for(let r=0;r<9;++r)this.view.setUint8(g+r,RA.quantizeSh(t[r],5));if(e){const r=g+9;for(let I=0;I<15;++I)this.view.setUint8(r+I,RA.quantizeSh(e[I],4));if(i){const I=r+15;for(let o=0;o<21;++o)this.view.setUint8(I+o,RA.quantizeSh(i[o],4))}}}async finalize(){const A=new Uint8Array(this.buffer),e=new ReadableStream({async start(g){g.enqueue(A),g.close()}}).pipeThrough(new CompressionStream("gzip")),n=await new Response(e).arrayBuffer();return console.log("Compressed",A.length,"bytes to",n.byteLength,"bytes"),new Uint8Array(n)}}async function ri(s){var a,C,h;const A=new ei,{inputs:t,clipXyz:e,maxSh:i,fractionalBits:n=12,opacityThreshold:g}=s;for(const B of t){let Q=function(D){return D.multiplyScalar(f),D.applyQuaternion(u),D.add(p),D},l=function(D){return D.multiplyScalar(f),D},c=function(D){return D.premultiply(u),D},E=function(D){return!S||S.containsPoint(D)},y=function(D){return g!==void 0?D>=g:!0};const f=((a=B.transform)==null?void 0:a.scale)??1,u=new SA().fromArray(((C=B.transform)==null?void 0:C.quaternion)??[0,0,0,1]),p=new d().fromArray(((h=B.transform)==null?void 0:h.translate)??[0,0,0]),S=e?new Ge(new d().fromArray(e.min),new d().fromArray(e.max)):void 0;let J=B.fileType;switch(J||(J=Os(B.fileBytes),!J&&B.pathOrUrl&&(J=Ai(B.pathOrUrl))),J){case et.PLY:{const D=new mt({fileBytes:B.fileBytes});await D.parseHeader();let m=null;D.parseSplats((k,x,w,M,z,Y,N,v,K,Z,W,q,P,L,T)=>{const _=Q(new d(x,w,M));if(E(_)&&y(q)){m=A.pushSplat(),A.setCenter(m,_.x,_.y,_.z);const R=l(new d(z,Y,N));A.setScale(m,R.x,R.y,R.z);const F=c(new SA(v,K,Z,W));A.setQuaternion(m,F.x,F.y,F.z,F.w),A.setOpacity(m,q),A.setColor(m,P,L,T)}else m=null},(k,x,w,M)=>{x&&m!==null&&A.setSh1(m,x),w&&m!==null&&A.setSh2(m,w),M&&m!==null&&A.setSh3(m,M)});break}case et.SPZ:{const D=new je({fileBytes:B.fileBytes}),m=new Int32Array(D.numSplats);m.fill(-1);const k=new Float32Array(D.numSplats*3),x=new d;D.parseSplats((w,M,z,Y)=>{const N=Q(new d(M,z,Y));k[w*3]=N.x,k[w*3+1]=N.y,k[w*3+2]=N.z},(w,M)=>{x.fromArray(k,w*3),E(x)&&y(M)&&(m[w]=A.pushSplat(),A.setCenter(m[w],x.x,x.y,x.z),A.setOpacity(m[w],M))},(w,M,z,Y)=>{m[w]>=0&&A.setColor(m[w],M,z,Y)},(w,M,z,Y)=>{if(m[w]>=0){const N=l(new d(M,z,Y));A.setScale(m[w],N.x,N.y,N.z)}},(w,M,z,Y,N)=>{if(m[w]>=0){const v=c(new SA(M,z,Y,N));A.setQuaternion(m[w],v.x,v.y,v.z,v.w)}},(w,M,z,Y)=>{m[w]>=0&&(A.setSh1(m[w],M),z&&A.setSh2(m[w],z),Y&&A.setSh3(m[w],Y))});break}case et.SPLAT:Te(B.fileBytes,D=>{},(D,m,k,x,w,M,z,Y,N,v,K,Z,W,q,P)=>{const L=Q(new d(m,k,x));if(E(L)&&y(Z)){const T=A.pushSplat();A.setCenter(T,L.x,L.y,L.z);const _=l(new d(w,M,z));A.setScale(T,_.x,_.y,_.z);const R=c(new SA(Y,N,v,K));A.setQuaternion(T,R.x,R.y,R.z,R.w),A.setOpacity(T,Z),A.setColor(T,W,q,P)}});break;case et.KSPLAT:{let D=null;Hs(B.fileBytes,m=>{},(m,k,x,w,M,z,Y,N,v,K,Z,W,q,P,L)=>{const T=Q(new d(k,x,w));if(E(T)&&y(W)){D=A.pushSplat(),A.setCenter(D,T.x,T.y,T.z);const _=l(new d(M,z,Y));A.setScale(D,_.x,_.y,_.z);const R=c(new SA(N,v,K,Z));A.setQuaternion(D,R.x,R.y,R.z,R.w),A.setOpacity(D,W),A.setColor(D,q,P,L)}else D=null},(m,k,x,w)=>{D!==null&&(A.setSh1(D,k),x&&A.setSh2(D,x),w&&A.setSh3(D,w))});break}default:throw new Error(`transcodeSpz not implemented for ${J}`)}}const r=Math.min(i??3,A.sh3?3:A.sh2?2:A.sh1?1:0),I=new RA({numSplats:A.numSplats,shDegree:r,fractionalBits:n,flagAntiAlias:!0});for(let B=0;B=1&&I.setSh(B,A.sh1.slice(B*9,(B+1)*9),r>=2&&A.sh2?A.sh2.slice(B*15,(B+1)*15):void 0,r>=3&&A.sh3?A.sh3.slice(B*21,(B+1)*21):void 0)}return{fileBytes:await I.finalize(),clippedCount:I.clippedCount}}async function $e(s){const{name:A,args:t,id:e}=s.data;let i,n;try{switch(A){case"unpackPly":{const{packedArray:g,fileBytes:r,splatEncoding:I}=t,o=await Ii({packedArray:g,fileBytes:r,splatEncoding:I});i={id:e,numSplats:o.numSplats,packedArray:o.packedArray,extra:o.extra};break}case"decodeSpz":{const{fileBytes:g,splatEncoding:r}=t,I=oi(g,r);i={id:e,numSplats:I.numSplats,packedArray:I.packedArray,extra:I.extra};break}case"decodeAntiSplat":{const{fileBytes:g,splatEncoding:r}=t,I=Ls(g,r);i={id:e,numSplats:I.numSplats,packedArray:I.packedArray};break}case"decodeKsplat":{const{fileBytes:g,splatEncoding:r}=t,I=vs(g,r);i={id:e,numSplats:I.numSplats,packedArray:I.packedArray,extra:I.extra};break}case"decodePcSogs":{const{fileBytes:g,extraFiles:r,splatEncoding:I}=t,o=JSON.parse(new TextDecoder().decode(g)),a=await We(o,r,I);i={id:e,numSplats:a.numSplats,packedArray:a.packedArray,extra:a.extra};break}case"decodePcSogsZip":{const{fileBytes:g,splatEncoding:r}=t,I=await si(g,r);i={id:e,numSplats:I.numSplats,packedArray:I.packedArray,extra:I.extra};break}case"sortSplats":{const{totalSplats:g,readback:r,ordering:I}=t;i={id:e,readback:r,...ai({totalSplats:g,readback:r,ordering:I})};break}case"sortDoubleSplats":{const{numSplats:g,readback:r,ordering:I}=t;i={id:e,readback:r,ordering:I,activeSplats:ss(g,r,I)};break}case"sort32Splats":{const{numSplats:g,readback:r,ordering:I}=t;i={id:e,readback:r,ordering:I,activeSplats:is(g,r,I)};break}case"transcodeSpz":{const g=t,r=await ri(g);i={id:e,fileBytes:r,input:g};break}default:throw new Error(`Unknown name: ${A}`)}}catch(g){n=g,console.error(n)}self.postMessage({id:e,result:i,error:n},{transfer:Gs(i)})}async function Ii({packedArray:s,fileBytes:A,splatEncoding:t}){const e=new mt({fileBytes:A});await e.parseHeader();const i=e.numSplats,n={};return e.parseSplats((g,r,I,o,a,C,h,B,Q,l,c,E,y,f,u)=>{Zt(s,g,r,I,o,a,C,h,B,Q,l,c,E,y,f,u,t)},(g,r,I,o)=>{r&&(n.sh1||(n.sh1=new Uint32Array(i*2)),ut(n.sh1,g,r,t)),I&&(n.sh2||(n.sh2=new Uint32Array(i*4)),yt(n.sh2,g,I,t)),o&&(n.sh3||(n.sh3=new Uint32Array(i*4)),ft(n.sh3,g,o,t))}),{packedArray:s,numSplats:i,extra:n}}function oi(s,A){const t=new je({fileBytes:s}),e=t.numSplats,i=ct(e),n=new Uint32Array(i*4),g={};return t.parseSplats((r,I,o,a)=>{ze(n,r,I,o,a)},(r,I)=>{Rs(n,r,I)},(r,I,o,a)=>{Ys(n,r,I,o,a,A)},(r,I,o,a)=>{Le(n,r,I,o,a,A)},(r,I,o,a,C)=>{He(n,r,I,o,a,C)},(r,I,o,a)=>{I&&(g.sh1||(g.sh1=new Uint32Array(e*2)),ut(g.sh1,r,I,A)),o&&(g.sh2||(g.sh2=new Uint32Array(e*4)),yt(g.sh2,r,o,A)),a&&(g.sh3||(g.sh3=new Uint32Array(e*4)),ft(g.sh3,r,a,A))}),{packedArray:n,numSplats:e,extra:g}}const Xt=31744,Mt=Xt+1;let xA=null;function ai({totalSplats:s,readback:A,ordering:t}){xA||(xA=new Uint32Array(Mt)),xA.fill(0);const e=A.map(I=>new Uint32Array(I.buffer)),i=e[0].length,n=Math.ceil(s/i);let g=0;for(let I=0;I { (self.URL || self.webkitURL).revokeObjectURL(A); }), e; } catch { return new Worker( "data:text/javascript;charset=utf-8," + encodeURIComponent($a), { name: t == null ? void 0 : t.name } ); } finally { A && (self.URL || self.webkitURL).revokeObjectURL(A); } } class Ru { constructor() { this.messages = {}, this.messageIdNext = 0, this.worker = new Gu(), this.worker.onmessage = (A) => this.onMessage(A); } makeMessageId() { return ++this.messageIdNext; } makeMessagePromiseId() { const A = this.makeMessageId(), e = new Promise((s, n) => { this.messages[A] = { resolve: s, reject: n }; }); return { id: A, promise: e }; } onMessage(A) { const { id: e, result: s, error: n } = A.data, i = this.messages[e]; i && (delete this.messages[e], n ? i.reject(n) : i.resolve(s)); } // Invoke an RPC on the worker with the given name and arguments. // The normal usage of a worker is to run one activity at a time, // but this function allows for concurrent calls, tagging each request // with a unique message Id and awaiting a response to that same Id. // The method will automatically transfer any ArrayBuffers in the // arguments to the worker. If you'd like to transfer a copy of a // buffer then you must clone it before passing to this function. async call(A, e) { const { id: s, promise: n } = this.makeMessagePromiseId(); return this.worker.postMessage( { name: A, args: e, id: s }, { transfer: zn(e) } ), n; } } let Va = 4, ue = 0; const Pa = [], Za = []; async function Yu() { const t = Pa.shift(); if (t) return t; if (ue < Va) { const A = new Ru(); return ue += 1, A; } return new Promise((A) => { Za.push(A); }); } function Ju(t) { if (ue > Va) { ue -= 1; return; } const A = Za.shift(); if (A) { A(t); return; } Pa.push(t); } async function It(t) { const A = await Yu(); try { return await t(A); } finally { Ju(A); } } class _u extends yo { constructor(A) { super(A), this.fileLoader = new wo(A); } load(A, e, s, n) { const i = this.manager.resolveURL( (this.path ?? "") + (A ?? "") ), r = new Headers(this.requestHeader), a = this.withCredentials ? "include" : "same-origin", o = new Request(i, { headers: r, credentials: a }); let g = this.fileType; this.manager.itemStart(i), ds(o, s).then(async (l) => { var B; const c = [ new ProgressEvent("progress", { lengthComputable: !0, loaded: l.byteLength, total: l.byteLength }) ]; function u() { if (s) { const Q = c.every((d) => d.lengthComputable || d.loaded === 0 && d.total === 0), p = c.reduce((d, w) => d + w.loaded, 0), f = c.reduce((d, w) => d + w.total, 0); s( new ProgressEvent("progress", { lengthComputable: Q, loaded: p, total: f }) ); } } const h = {}, E = [], C = gs(l); if (g === "pcsogs" && C === void 0) throw new Error("Invalid PC SOGS file"); if (C !== void 0) { g = "pcsogs"; for (const Q of ["means", "scales", "quats", "sh0", "shN"]) { const p = C[Q]; if (p) for (const f of p.files) { const d = new URL(f, i).toString(), w = c.length; c.push(new ProgressEvent("progress")), this.manager.itemStart(d); const D = new Request(d, { headers: r, credentials: a }), x = ds(D, (y) => { c[w] = y, u(); }).then((y) => { h[f] = y; }).catch((y) => { throw this.manager.itemError(d), y; }).finally(() => { this.manager.itemEnd(d); }); E.push(x); } } } if (await Promise.all(E), e) { const Q = ((B = this.packedSplats) == null ? void 0 : B.splatEncoding) ?? fe, p = await ja({ input: l, extraFiles: h, fileType: g, pathOrUrl: i, splatEncoding: Q }); this.packedSplats ? (this.packedSplats.initialize(p), e(this.packedSplats)) : e(new VA(p)); } }).catch((l) => { this.manager.itemError(i), n == null || n(l); }).finally(() => { this.manager.itemEnd(i); }); } async loadAsync(A, e) { return new Promise((s, n) => { this.load( A, (i) => { s(i); }, e, n ); }); } parse(A) { return new OA({ packedSplats: A }); } } async function ds(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 s = e.body.getReader(), n = Number.parseInt( e.headers.get("Content-Length") || "0" ), i = Number.isNaN(n) ? 0 : n; let r = 0; const a = []; for (; ; ) { const { done: l, value: c } = await s.read(); if (l) break; a.push(c), r += c.length, A && A( new ProgressEvent("progress", { lengthComputable: i !== 0, loaded: r, total: i }) ); } const o = new Uint8Array(r); let g = 0; for (const l of a) o.set(l, g), g += l.length; return o.buffer; } var _t = /* @__PURE__ */ ((t) => (t.PLY = "ply", t.SPZ = "spz", t.SPLAT = "splat", t.KSPLAT = "ksplat", t.PCSOGS = "pcsogs", t.PCSOGSZIP = "pcsogszip", t))(_t || {}); function Xa(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 = On(t, 4); return new DataView(e.buffer).getUint32(0, !0) === 1347635022 ? "spz" : void 0; } if (A.getUint32(0, !0) === 67324752) return zu(t) ? "pcsogszip" : void 0; } function Lu(t) { const A = t.split(/[?#]/, 1)[0], e = Math.max( A.lastIndexOf("/"), A.lastIndexOf("\\") ), s = A.slice(e + 1), n = s.lastIndexOf("."); return n <= 0 || n === s.length - 1 ? "" : s.slice(n + 1).toLowerCase(); } function Oa(t) { const A = Lu(t); if (A === "ply") return "ply"; if (A === "spz") return "spz"; if (A === "splat") return "splat"; if (A === "ksplat") return "ksplat"; } function qh(t) { return gs(t) !== void 0; } function gs(t) { try { let A; if (typeof t == "string") A = t; else { const s = t instanceof ArrayBuffer ? new Uint8Array(t) : t; if (s.length > 65536) return; A = new TextDecoder().decode(s); } const e = JSON.parse(A); if (!e || typeof e != "object" || Array.isArray(e)) return; for (const s of ["means", "scales", "quats", "sh0"]) if (!e[s] || typeof e[s] != "object" || Array.isArray(e[s]) || !e[s].shape || !e[s].files || s !== "quats" && (!e[s].mins || !e[s].maxs)) return; return e; } catch { return; } } function zu(t) { try { const A = t instanceof ArrayBuffer ? new Uint8Array(t) : t; let e = null; const s = qo(A, { filter: ({ name: i }) => i.split(/[\\/]/).pop() === "meta.json" ? (e = i, !0) : !1 }); if (!e) return; const n = gs(s[e]); return n ? { name: e, json: n } : void 0; } catch { return; } } async function ja({ input: t, extraFiles: A, fileType: e, pathOrUrl: s, splatEncoding: n }) { const i = t instanceof ArrayBuffer ? new Uint8Array(t) : t; let r = e; switch (e || (r = Xa(i), !r && s && (r = Oa(s))), r) { case "ply": { const a = new Ie({ fileBytes: i }); await a.parseHeader(); const o = a.numSplats, g = mA(o).maxSplats, l = { fileBytes: i, packedArray: new Uint32Array(g * 4), splatEncoding: n }; return await It(async (c) => { const { packedArray: u, numSplats: h, extra: E } = await c.call( "unpackPly", l ); return { packedArray: u, numSplats: h, extra: E }; }); } case "spz": return await It(async (a) => { const { packedArray: o, numSplats: g, extra: l } = await a.call( "decodeSpz", { fileBytes: i, splatEncoding: n } ); return { packedArray: o, numSplats: g, extra: l }; }); case "splat": return await It(async (a) => { const { packedArray: o, numSplats: g } = await a.call( "decodeAntiSplat", { fileBytes: i, splatEncoding: n } ); return { packedArray: o, numSplats: g }; }); case "ksplat": return await It(async (a) => { const { packedArray: o, numSplats: g, extra: l } = await a.call( "decodeKsplat", { fileBytes: i, splatEncoding: n } ); return { packedArray: o, numSplats: g, extra: l }; }); case "pcsogs": return await It(async (a) => { const { packedArray: o, numSplats: g, extra: l } = await a.call( "decodePcSogs", { fileBytes: i, extraFiles: A, splatEncoding: n } ); return { packedArray: o, numSplats: g, extra: l }; }); case "pcsogszip": return await It(async (a) => { const { packedArray: o, numSplats: g, extra: l } = await a.call( "decodePcSogsZip", { fileBytes: i, splatEncoding: n } ); return { packedArray: o, numSplats: g, extra: l }; }); default: throw new Error(`Unknown splat file type: ${r}`); } } class Hu { constructor({ maxSplats: A = 1 } = {}) { this.numSplats = 0, this.maxSplats = mA(A).maxSplats, this.centers = new Float32Array(this.maxSplats * 3), this.scales = new Float32Array(this.maxSplats * 3), this.quaternions = new Float32Array(this.maxSplats * 4), this.opacities = new Float32Array(this.maxSplats), this.colors = new Float32Array(this.maxSplats * 3); } pushSplat() { const A = this.numSplats; return this.ensureIndex(A), this.numSplats += 1, A; } unpushSplat(A) { if (A === this.numSplats - 1) this.numSplats -= 1; else throw new Error("Cannot unpush splat from non-last position"); } ensureCapacity(A) { if (A > this.maxSplats) { const e = Math.max(A, this.maxSplats * 2), s = new Float32Array(e * 3), n = new Float32Array(e * 3), i = new Float32Array(e * 4), r = new Float32Array(e), a = new Float32Array(e * 3); if (s.set(this.centers), n.set(this.scales), i.set(this.quaternions), r.set(this.opacities), a.set(this.colors), this.centers = s, this.scales = n, this.quaternions = i, this.opacities = r, this.colors = a, this.sh1) { const o = new Float32Array(e * 9); o.set(this.sh1), this.sh1 = o; } if (this.sh2) { const o = new Float32Array(e * 15); o.set(this.sh2), this.sh2 = o; } if (this.sh3) { const o = new Float32Array(e * 21); o.set(this.sh3), this.sh3 = o; } this.maxSplats = e; } } ensureIndex(A) { this.ensureCapacity(A + 1); } setCenter(A, e, s, n) { this.centers[A * 3] = e, this.centers[A * 3 + 1] = s, this.centers[A * 3 + 2] = n; } setScale(A, e, s, n) { this.scales[A * 3] = e, this.scales[A * 3 + 1] = s, this.scales[A * 3 + 2] = n; } setQuaternion(A, e, s, n, i) { this.quaternions[A * 4] = e, this.quaternions[A * 4 + 1] = s, this.quaternions[A * 4 + 2] = n, this.quaternions[A * 4 + 3] = i; } setOpacity(A, e) { this.opacities[A] = e; } setColor(A, e, s, n) { this.colors[A * 3] = e, this.colors[A * 3 + 1] = s, this.colors[A * 3 + 2] = n; } setSh1(A, e) { this.sh1 || (this.sh1 = new Float32Array(this.maxSplats * 9)); for (let s = 0; s < 9; ++s) this.sh1[A * 9 + s] = e[s]; } setSh2(A, e) { this.sh2 || (this.sh2 = new Float32Array(this.maxSplats * 15)); for (let s = 0; s < 15; ++s) this.sh2[A * 15 + s] = e[s]; } setSh3(A, e) { this.sh3 || (this.sh3 = new Float32Array(this.maxSplats * 21)); for (let s = 0; s < 21; ++s) this.sh3[A * 21 + s] = e[s]; } } var qu = `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 fe = { rgbMin: 0, rgbMax: 1, lnScaleMin: UA, lnScaleMax: GA, sh1Min: -1, sh1Max: 1, sh2Min: -1, sh2Max: 1, sh3Min: -1, sh3Max: 1 }, nA = class nA { 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 ls({ packedSplats: this }), this.dynoRgbMinMaxLnScaleMinMax = new Tt({ key: "rgbMinMaxLnScaleMinMax", value: new I.Vector4(0, 1, UA, GA), update: (e) => { var s, n, i, r; return e.set( ((s = this.splatEncoding) == null ? void 0 : s.rgbMin) ?? 0, ((n = this.splatEncoding) == null ? void 0 : n.rgbMax) ?? 1, ((i = this.splatEncoding) == null ? void 0 : i.lnScaleMin) ?? UA, ((r = this.splatEncoding) == null ? void 0 : r.lnScaleMax) ?? GA ), e; } }), this.dynoSh1MinMax = new zt({ key: "sh1MinMax", value: new I.Vector2(-1, 1), update: (e) => { var s, n; return e.set( ((s = this.splatEncoding) == null ? void 0 : s.sh1Min) ?? -1, ((n = this.splatEncoding) == null ? void 0 : n.sh1Max) ?? 1 ), e; } }), this.dynoSh2MinMax = new zt({ key: "sh2MinMax", value: new I.Vector2(-1, 1), update: (e) => { var s, n; return e.set( ((s = this.splatEncoding) == null ? void 0 : s.sh2Min) ?? -1, ((n = this.splatEncoding) == null ? void 0 : n.sh2Max) ?? 1 ), e; } }), this.dynoSh3MinMax = new zt({ key: "sh3MinMax", value: new I.Vector2(-1, 1), update: (e) => { var s, n; return e.set( ((s = this.splatEncoding) == null ? void 0 : s.sh3Min) ?? -1, ((n = this.splatEncoding) == null ? void 0 : n.sh3Max) ?? 1 ), e; } }), this.initialized = Promise.resolve(this), this.reinitialize(A); } reinitialize(A) { this.isInitialized = !1, this.extra = {}, this.splatEncoding = A.splatEncoding, 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 / Z) * Z, this.numSplats = Math.min( this.maxSplats, A.numSplats ?? Number.POSITIVE_INFINITY )) : (this.maxSplats = A.maxSplats ?? 0, this.numSplats = 0), this.extra = A.extra ?? {}; } async asyncInitialize(A) { const { url: e, fileBytes: s, construct: n } = A; if (e) { const i = new _u(); i.packedSplats = this, await i.loadAsync(e); } else if (s) { const i = await ja({ input: s, fileType: A.fileType, pathOrUrl: A.fileName ?? e, splatEncoding: A.splatEncoding ?? fe }); this.initialize(i); } if (n) { const i = n(this); i instanceof Promise && await i; } } // Call this when you are finished with the PackedSplats and want to free // any buffers it holds. dispose() { this.target && (this.target.dispose(), this.target = null), this.source && (this.source.dispose(), this.source = null); } // Ensures that this.packedArray can fit numSplats Gsplats. If it's too small, // resize exponentially and copy over the original data. // // Typically you don't need to call this, because calling this.setSplat(index, ...) // and this.pushSplat(...) will automatically call ensureSplats() so we have // enough splats. ensureSplats(A) { const e = A <= this.maxSplats ? this.maxSplats : ( // Grow exponentially to avoid frequent reallocations Math.max(A, 2 * this.maxSplats) ), s = this.packedArray ? this.packedArray.length / 4 : 0; if (!this.packedArray || e > s) { this.maxSplats = mA(e).maxSplats; const n = new Uint32Array(this.maxSplats * 4); this.packedArray && n.set(this.packedArray), this.packedArray = n; } return this.packedArray; } // Ensure the extra array for the given level is large enough to hold numSplats ensureSplatsSh(A, e) { let s, n; if (A === 0) return this.ensureSplats(e); if (A === 1) s = 2, n = "sh1"; else if (A === 2) s = 4, n = "sh2"; else if (A === 3) s = 4, n = "sh3"; else throw new Error(`Invalid level: ${A}`); let i = this.extra[n] ? this.extra[n].length / s : 0; const r = e <= i ? i : Math.max(e, 2 * i); if (!this.extra[n] || r > i) { i = mA(r).maxSplats; const a = new Uint32Array(i * s); this.extra[n] && a.set(this.extra[n]), this.extra[n] = a; } return this.extra[n]; } // 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, this.splatEncoding); } // Set all PackedSplat components at index with the provided Gsplat attributes // (can be the same objects returned by getSplat). Ensures there is capacity // for at least index+1 Gsplats. setSplat(A, e, s, n, i, r) { const a = this.ensureSplats(A + 1); Re( a, A, e.x, e.y, e.z, s.x, s.y, s.z, n.x, n.y, n.z, n.w, i, r.r, r.g, r.b ), this.numSplats = Math.max(this.numSplats, A + 1); } // Effectively calls this.setSplat(this.numSplats++, center, ...), useful on // construction where you just want to iterate and create a collection of Gsplats. pushSplat(A, e, s, n, i) { const r = this.ensureSplats(this.numSplats + 1); Re( r, this.numSplats, A.x, A.y, A.z, e.x, e.y, e.z, s.x, s.y, s.z, s.w, n, i.r, i.g, i.b ), ++this.numSplats; } // Iterate over Gsplats index 0..=(this.numSplats-1), unpack each Gsplat // and invoke the callback function with the Gsplat attributes. forEachSplat(A) { if (!(!this.packedArray || !this.numSplats)) for (let e = 0; e < this.numSplats; ++e) { const s = Ye(this.packedArray, e, this.splatEncoding); A( e, s.center, s.scales, s.quaternion, s.opacity, s.color ); } } // Ensures our PackedSplats.target render target has enough space to generate // maxSplats total Gsplats, and reallocate if not large enough. ensureGenerate(A) { if (this.target && (A ?? 1) <= this.maxSplats) return !1; this.dispose(); const e = mA(A ?? 1), { width: s, height: n, depth: i } = e; return this.maxSplats = e.maxSplats, this.target = new I.WebGLArrayRenderTarget(s, n, i, { depthBuffer: !1, stencilBuffer: !1, generateMipmaps: !1, magFilter: I.NearestFilter, minFilter: I.NearestFilter }), this.target.texture.format = I.RGBAIntegerFormat, this.target.texture.type = I.UnsignedIntType, this.target.texture.internalFormat = "RGBA32UI", this.target.scissorTest = !0, !0; } // Given an array of splatCounts (.numSplats for each // SplatGenerator/SplatMesh in the scene), compute a // "mapping layout" in the composite array of generated outputs. generateMapping(A) { let e = 0; const s = A.map((n) => { const i = e, r = Math.ceil(n / Z) * Z; return e += r, { base: i, count: n }; }); return { maxSplats: e, mapping: s }; } // Returns a THREE.DataArrayTexture representing the PackedSplats content as // a Uint32x4 data array texture (2048 x 2048 x depth in size) getTexture() { return this.target ? this.target.texture : this.source || this.packedArray ? this.maybeUpdateSource() : nA.getEmpty(); } // Check if source texture needs to be created/updated maybeUpdateSource() { if (!this.packedArray) throw new Error("No packed splats"); if (this.needsUpdate || !this.source) { if (this.needsUpdate = !1, this.source) { const { width: A, height: e, depth: s } = this.source.image; this.maxSplats !== A * e * s && (this.source.dispose(), this.source = null); } if (this.source) this.packedArray.buffer !== this.source.image.data.buffer && (this.source.image.data = new Uint8Array(this.packedArray.buffer)); else { const { width: A, height: e, depth: s } = mA(this.maxSplats); this.source = new I.DataArrayTexture( this.packedArray, A, e, s ), this.source.format = I.RGBAIntegerFormat, this.source.type = I.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 (!nA.emptySource) { const { width: A, height: e, depth: s, maxSplats: n } = mA(1), i = new Uint32Array(n * 4); nA.emptySource = new I.DataArrayTexture( i, A, e, s ), nA.emptySource.format = I.RGBAIntegerFormat, nA.emptySource.type = I.UnsignedIntType, nA.emptySource.internalFormat = "RGBA32UI", nA.emptySource.needsUpdate = !0; } return nA.emptySource; } // Get a program and THREE.RawShaderMaterial for a given GsplatGenerator, // generating it if necessary and caching the result. prepareProgramMaterial(A) { let e = nA.generatorProgram.get(A); if (!e) { const n = vA( { index: "int" }, { output: "uvec4" }, ({ index: i }) => { A.inputs.index = i; const r = A.outputs.gsplat; return { output: sn( r, this.dynoRgbMinMaxLnScaleMinMax ) }; } ); nA.programTemplate || (nA.programTemplate = new is( qu )), e = new ns({ graph: n, inputs: { index: "index" }, outputs: { output: "target" }, template: nA.programTemplate }), Object.assign(e.uniforms, { targetLayer: { value: 0 }, targetBase: { value: 0 }, targetCount: { value: 0 } }), nA.generatorProgram.set(A, e); } const s = e.prepareMaterial(); return nA.fullScreenQuad.material = s, { program: e, material: s }; } saveRenderState(A) { return { xrEnabled: A.xr.enabled, autoClear: A.autoClear }; } resetRenderState(A, e) { A.setRenderTarget(null), A.xr.enabled = e.xrEnabled, A.autoClear = e.autoClear; } // Executes a dyno program specified by generator which is any DynoBlock that // maps { index: "int" } to { gsplat: Gsplat }. This is called in // SparkRenderer.updateInternal() to re-generate Gsplats in the scene for // SplatGenerator instances whose version is newer than what was generated // for it last time. generate({ generator: A, base: e, count: s, renderer: n }) { if (!this.target) throw new Error("Target must be initialized with ensureSplats"); if (e + s > this.maxSplats) throw new Error("Base + count exceeds maxSplats"); const { program: i, material: r } = this.prepareProgramMaterial(A); i.update(); const a = this.saveRenderState(n), o = Math.ceil((e + s) / Z) * Z, g = Z * KA; for (r.uniforms.targetBase.value = e, r.uniforms.targetCount.value = s; e < o; ) { const l = Math.floor(e / g); r.uniforms.targetLayer.value = l; const c = l * g, u = Math.floor((e - c) / Z), h = Math.min( KA, Math.ceil((o - c) / Z) ); this.target.scissor.set( 0, u, Z, h - u ), n.setRenderTarget(this.target, l), n.xr.enabled = !1, n.autoClear = !1, nA.fullScreenQuad.render(n), e += Z * (h - u); } return this.resetRenderState(n, a), { nextBase: o }; } }; nA.emptySource = null, nA.programTemplate = null, nA.generatorProgram = /* @__PURE__ */ new Map(), nA.fullScreenQuad = new xs( new I.RawShaderMaterial({ visible: !1 }) ); let VA = nA; class ls extends N { constructor({ packedSplats: A } = {}) { super({ key: "packedSplats", type: Ot, globals: () => [Ee], value: { texture: VA.getEmpty(), numSplats: 0, rgbMinMaxLnScaleMinMax: new I.Vector4( 0, 1, UA, GA ) }, update: (e) => { var s, n, i, r, a, o, g, l, c, u; return e.texture = ((s = this.packedSplats) == null ? void 0 : s.getTexture()) ?? VA.getEmpty(), e.numSplats = ((n = this.packedSplats) == null ? void 0 : n.numSplats) ?? 0, e.rgbMinMaxLnScaleMinMax.set( ((r = (i = this.packedSplats) == null ? void 0 : i.splatEncoding) == null ? void 0 : r.rgbMin) ?? 0, ((o = (a = this.packedSplats) == null ? void 0 : a.splatEncoding) == null ? void 0 : o.rgbMax) ?? 1, ((l = (g = this.packedSplats) == null ? void 0 : g.splatEncoding) == null ? void 0 : l.lnScaleMin) ?? UA, ((u = (c = this.packedSplats) == null ? void 0 : c.splatEncoding) == null ? void 0 : u.lnScaleMax) ?? GA ), e; } }), this.packedSplats = A; } } class $e extends I.InstancedBufferGeometry { constructor(A, e) { super(), this.ordering = A, this.setAttribute("position", new I.BufferAttribute(Ku, 3)), this.setIndex(new I.BufferAttribute($u, 1)), this._maxInstanceCount = A.length, this.instanceCount = e, this.attribute = new I.InstancedBufferAttribute(A, 1, !1, 1), this.attribute.setUsage(I.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 Ku = new Float32Array([ -1, -1, 0, 1, -1, 0, 1, 1, 0, -1, 1, 0 ]), $u = new Uint16Array([0, 1, 2, 0, 2, 3]), it = class it { 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.readback16 = new Uint16Array(0), this.readback32 = new Uint32Array(0), this.spark = A.spark, this.camera = A.camera, this.viewToWorld = A.viewToWorld ?? new I.Matrix4(), A.target) { const { width: e, height: s, doubleBuffer: n } = A.target, i = Math.max(1, Math.min(4, A.target.superXY ?? 1)); if (this.superXY = i, e * i > 8192 || s * i > 8192) throw new Error("Target size too large"); this.target = new I.WebGLRenderTarget( e * i, s * i, { format: I.RGBAFormat, type: I.UnsignedByteType, colorSpace: I.SRGBColorSpace } ), n && (this.back = new I.WebGLRenderTarget( e * i, s * i, { format: I.RGBAFormat, type: I.UnsignedByteType, colorSpace: I.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.sort32 = A.sort32, this.stochastic = A.stochastic ?? !1, this.orderingFreelist = new Hn({ allocate: (e) => new Uint32Array(e), valid: (e, s) => e.length === s }), this.autoUpdate = !1, this.setAutoUpdate(A.autoUpdate ?? !1); } // Call this when you are done with the SparkViewpoint and want to // free up its resources (GPU targets, pixel buffers, etc.) dispose() { var A; this.setAutoUpdate(!1), this.target && (this.target.dispose(), this.target = void 0), this.back && (this.back.dispose(), this.back = void 0), this.display && (this.spark.releaseAccumulator(this.display.accumulator), this.display.geometry.dispose(), this.display = null), (A = this.pending) != null && A.accumulator && (this.spark.releaseAccumulator(this.pending.accumulator), this.pending = null); } // Use this function to change whether this viewpoint will auto-update // its sort order whenever the attached SparkRenderer updates the Gsplats. // Turn this on or off depending on whether you expect to do renders from // this viewpoint most frames. setAutoUpdate(A) { !this.autoUpdate && A ? this.spark.autoViewpoints.push(this) : this.autoUpdate && !A && (this.spark.autoViewpoints = this.spark.autoViewpoints.filter( (e) => e !== this )), this.autoUpdate = A; } // See below async prepareRenderPixels() for explanation of parameters. // Awaiting this method updates the Gsplats in the scene and performs a sort of the // Gsplats from this viewpoint, preparing it for a subsequent this.renderTarget() // call in the same tick. async prepare({ scene: A, camera: e, viewToWorld: s, update: n, forceOrigin: i }) { var a; for (s ? this.viewToWorld = s : (this.camera = e ?? this.camera, this.camera && (this.camera.updateMatrixWorld(), this.viewToWorld = this.camera.matrixWorld.clone())); n ?? !0; ) { const o = i ? this.viewToWorld : void 0; if (this.spark.updateInternal({ scene: A, originToWorld: o })) break; await new Promise((l) => setTimeout(l, 10)); } const r = this.spark.active; r !== ((a = this.display) == null ? void 0 : a.accumulator) && (this.spark.active.refCount += 1), await this.sortUpdate({ accumulator: r, viewToWorld: this.viewToWorld }); } // Render out the viewpoint to the view target RGBA buffer. // Swaps buffers if doubleBuffer: true was set. // Calls onTextureUpdated(texture) with the resulting texture. renderTarget({ scene: A, camera: e }) { var n; const s = this.back ?? this.target; if (!s) throw new Error("Must initialize SparkViewpoint with target"); if (e = e ?? this.camera, !e) throw new Error("Must provide camera"); if (e instanceof I.PerspectiveCamera) { const i = new I.PerspectiveCamera().copy(e, !1); i.aspect = s.width / s.height, i.updateProjectionMatrix(), e = i; } this.viewToWorld = e.matrixWorld.clone(); try { this.spark.renderer.setRenderTarget(s), this.spark.prepareViewpoint(this), this.spark.renderer.render(A, e); } finally { this.spark.prepareViewpoint(this.spark.defaultView), this.spark.renderer.setRenderTarget(null); } s !== this.target && ([this.target, this.back] = [this.back, this.target]), (n = this.onTextureUpdated) == null || n.call(this, s.texture); } // Read back the previously rendered target image as a Uint8Array of packed // RGBA values (in that order). If superXY was set greater than 1 then // downsampling is performed in the target pixel array with simple averaging // to derive the returned pixel values. Subsequent calls to this.readTarget() // will reuse the same buffers to minimize memory allocations. async readTarget() { if (!this.target) throw new Error("Must initialize SparkViewpoint with target"); const { width: A, height: e } = this.target, s = A * e * 4; (!this.superPixels || this.superPixels.length < s) && (this.superPixels = new Uint8Array(s)), await this.spark.renderer.readRenderTargetPixelsAsync( this.target, 0, 0, A, e, this.superPixels ); const { superXY: n } = this; if (n === 1) return this.superPixels; const i = A / n, r = e / n, a = i * r * 4; (!this.pixels || this.pixels.length < a) && (this.pixels = new Uint8Array(a)); const { superPixels: o, pixels: g } = this, l = n * n; for (let c = 0; c < r; c++) { const u = c * i; for (let h = 0; h < i; h++) { const E = h * n; let C = 0, B = 0, Q = 0, p = 0; for (let d = 0; d < n; d++) { const w = (c * n + d) * this.target.width; for (let D = 0; D < n; D++) { const x = (w + E + D) * 4; C += o[x], B += o[x + 1], Q += o[x + 2], p += o[x + 3]; } } const f = (u + h) * 4; g[f] = C / l, g[f + 1] = B / l, g[f + 2] = Q / l, g[f + 3] = p / l; } } return g; } // Render out a viewpoint as a Uint8Array of RGBA values for the provided scene // and any camera/viewToWorld viewpoint overrides. By default update is true, // which triggers its SparkRenderer to check and potentially update the Gsplats. // Setting update to false disables this and sorts the Gsplats as they are. // Setting forceOrigin (default: false) to true forces the view update to // recalculate the splats with this view origin, potentially altering any // view-dependent effects. If you expect view-dependent effects to play a role // in the rendering quality, enable this. // // Underneath, prepareRenderPixels() simply calls await this.prepare(...), // this.renderTarget(...), and finally returns the result this.readTarget(), // a Promise to a Uint8Array with RGBA values for all the pixels (potentially // downsampled if the superXY parameter was used). These steps can also be called // manually, for example if you need to alter the scene before and after // this.renderTarget(...) to hide UI elements from being rendered. async prepareRenderPixels({ scene: A, camera: e, viewToWorld: s, update: n, forceOrigin: i }) { return await this.prepare({ scene: A, camera: e, viewToWorld: s, update: n, forceOrigin: i }), 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 i, r, a, o; this.camera && (this.camera.updateMatrixWorld(), this.viewToWorld = this.camera.matrixWorld.clone()); let e = !1, s = !1; if (!this.display) e = !0; else if (A) { e = !0; const { mappingVersion: g } = this.display.accumulator; A.mappingVersion === g && (this.spark.releaseAccumulator(this.display.accumulator), this.display.accumulator = A, s = !0); } const n = ((i = this.sorting) == null ? void 0 : i.viewToWorld) ?? ((r = this.display) == null ? void 0 : r.viewToWorld); n && !ce({ matrix1: this.viewToWorld, matrix2: n, // By default update sort each 1 cm maxDistance: this.sortDistance ?? 0.01, // By default for radial sort, update for intermittent movement so that // we bring back splats culled by being behind the camera. // For depth sort, small rotations can change sort order a lot, so // update sort for even small rotations. minCoorient: this.sortCoorient ?? this.sortRadial ? 0.99 : 0.999 }) && (e = !0), e && (A && (A.refCount += 1), A && ((a = this.pending) != null && a.accumulator) && this.pending.accumulator !== ((o = this.display) == null ? void 0 : o.accumulator) && this.spark.releaseAccumulator(this.pending.accumulator), this.pending = { accumulator: A, viewToWorld: this.viewToWorld, displayed: s }, this.driveSort()); } async driveSort() { var A; for (; ; ) { if (this.sorting || !this.pending) return; const { viewToWorld: e, displayed: s } = this.pending; let n = this.pending.accumulator ?? ((A = this.display) == null ? void 0 : A.accumulator); if (n || (n = this.spark.active, n.refCount += 1), this.pending = null, !n) throw new Error("No accumulator to sort"); this.sorting = { viewToWorld: e }, await this.sortUpdate({ accumulator: n, viewToWorld: e, displayed: s }), this.sorting = null; } } async sortUpdate({ accumulator: A, viewToWorld: e, displayed: s = !1 }) { if (this.sortingCheck) throw new Error("Only one sort at a time"); this.sortingCheck = !0, A = A ?? this.spark.active; const { numSplats: n, maxSplats: i } = A.splats; let r = 0, a = this.orderingFreelist.alloc(i); if (this.stochastic) { r = n; for (let o = 0; o < n; ++o) a[o] = o; } else if (n > 0) { const { reader: o, doubleSortReader: g, sort32Reader: l, dynoSortRadial: c, dynoOrigin: u, dynoDirection: h, dynoDepthBias: E, dynoSort360: C, dynoSplats: B } = it.makeSorter(), Q = this.sort32 ?? !1; let p; if (Q) this.readback32 = o.ensureBuffer(i, this.readback32), p = this.readback32; else { const y = Math.ceil(i / 2); this.readback16 = o.ensureBuffer(y, this.readback16), p = this.readback16; } const f = A.toWorld.clone().invert(), d = e.clone().premultiply(f); c.value = this.sort360 ? !0 : this.sortRadial, u.value.set(0, 0, 0).applyMatrix4(d), h.value.set(0, 0, -1).applyMatrix4(d).sub(u.value).normalize(), E.value = this.depthBias ?? 1, C.value = this.sort360 ?? !1, B.packedSplats = A.splats; const w = Q ? l : g, D = Q ? n : Math.ceil(n / 2); await o.renderReadback({ renderer: this.spark.renderer, reader: w, count: D, readback: p }); const x = await It(async (y) => { const m = Q ? "sort32Splats" : "sortDoubleSplats"; return y.call(m, { maxSplats: i, numSplats: n, readback: p, ordering: a }); }); Q ? this.readback32 = x.readback : this.readback16 = x.readback, a = x.ordering, r = x.activeSplats; } this.updateDisplay({ accumulator: A, viewToWorld: e, ordering: a, activeSplats: r, displayed: s }), this.sortingCheck = !1; } updateDisplay({ accumulator: A, viewToWorld: e, ordering: s, activeSplats: n, displayed: i = !1 }) { if (!this.display) this.display = { accumulator: A, viewToWorld: e, geometry: new $e(s, n) }; else { !i && A !== this.display.accumulator && (this.spark.releaseAccumulator(this.display.accumulator), this.display.accumulator = A), this.display.viewToWorld = e; const r = this.display.geometry.ordering; r.length === s.length ? this.display.geometry.update(s, n) : (this.display.geometry.dispose(), this.display.geometry = new $e(s, n)), this.orderingFreelist.free(r); } this.spark.viewpoint === this && this.spark.prepareViewpoint(this); } static makeSorter() { if (!it.dynos) { const A = new oe({ value: !0 }), e = new Ft({ value: new I.Vector3() }), s = new Ft({ value: new I.Vector3() }), n = new Ct({ value: 1 }), i = new oe({ value: !1 }), r = new ls(), a = new ge(), o = vA( { index: "int" }, { rgba8: "vec4" }, ({ index: l }) => { if (!l) throw new Error("No index"); const c = { sortRadial: A, sortOrigin: e, sortDirection: s, sortDepthBias: n, sort360: i }, u = iA(l, J("int", 2)), h = bt(r, u), E = Fe({ gsplat: h, ...c }), C = bt( r, BA(u, J("int", 1)) ), B = Fe({ gsplat: C, ...c }), Q = $A({ vectorType: "vec2", x: E, y: B }); return { rgba8: Le(er(Q)) }; } ), g = vA( { index: "int" }, { rgba8: "vec4" }, ({ index: l }) => { if (!l) throw new Error("No index"); const c = { sortRadial: A, sortOrigin: e, sortDirection: s, sortDepthBias: n, sort360: i }, u = bt(r, l), h = Fe({ gsplat: u, ...c }); return { rgba8: Le(tr(h)) }; } ); it.dynos = { dynoSortRadial: A, dynoOrigin: e, dynoDirection: s, dynoDepthBias: n, dynoSort360: i, dynoSplats: r, reader: a, doubleSortReader: o, sort32Reader: g }; } return it.dynos; } }; it.EMPTY_TEXTURE = new I.Texture(), it.dynos = null; let he = it; const Vu = hA(` 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 Fe({ gsplat: t, sortRadial: A, sortOrigin: e, sortDirection: s, sortDepthBias: n, sort360: i }) { return Xt({ inTypes: { gsplat: AA, sortRadial: "bool", sortOrigin: "vec3", sortDirection: "vec3", sortDepthBias: "float", sort360: "bool" }, outTypes: { metric: "float" }, globals: () => [bA, Vu], inputs: { gsplat: t, sortRadial: A, sortOrigin: e, sortDirection: s, sortDepthBias: n, sort360: i }, statements: ({ inputs: r, outputs: a }) => { const { gsplat: o, sortRadial: g, sortOrigin: l, sortDirection: c, sortDepthBias: u, sort360: h } = r; return RA(` ${a.metric} = computeSort(${o}, ${g}, ${l}, ${c}, ${u}, ${h}); `); } }).outputs.metric; } class Ne { constructor() { this.splats = new VA(), this.toWorld = new I.Matrix4(), this.mapping = [], this.refCount = 0, this.splatsVersion = -1, this.mappingVersion = -1; } ensureGenerate(A) { this.splats.ensureGenerate(A) && (this.mapping = []); } // Generate all Gsplats from an array of generators generateSplats({ renderer: A, modifier: e, generators: s, forceUpdate: n, originToWorld: i }) { const r = this.mapping.reduce((g, l) => (g.set(l.node, l), g), /* @__PURE__ */ new Map()); let a = 0, o = 0; for (const { node: g, generator: l, version: c, base: u, count: h } of s) { const E = r.get(g); if ((n || l !== (E == null ? void 0 : E.generator) || c !== (E == null ? void 0 : E.version) || u !== (E == null ? void 0 : E.base) || h !== (E == null ? void 0 : E.count)) && l && h > 0) { const C = e.apply(l); try { this.splats.generate({ generator: C, base: u, count: h, renderer: A }); } catch (B) { g.generator = void 0, g.generatorError = B; } a += 1; } o = Math.max(o, u + h); } return this.splats.numSplats = o, this.toWorld = i, this.mapping = s, a !== 0; } // Check if this accumulator has exactly the same generator mapping as // the previous one. If so, we can reuse the Gsplat sort order. hasCorrespondence(A) { return this.mapping.length !== A.mapping.length ? !1 : this.mapping.every(({ node: e, base: s, count: n }, i) => { const { node: r, base: a, count: o } = A.mapping[i]; return e === r && s === a && n === o; }); } } var Pu = `const float LN_SCALE_MIN = -12.0; const float LN_SCALE_MAX = 9.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; 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 packSplatEncoding( vec3 center, vec3 scales, vec4 quaternion, vec4 rgba, vec4 rgbMinMaxLnScaleMinMax ) { float rgbMin = rgbMinMaxLnScaleMinMax.x; float rgbMax = rgbMinMaxLnScaleMinMax.y; vec3 encRgb = (rgba.rgb - vec3(rgbMin)) / (rgbMax - rgbMin); uvec4 uRgba = uvec4(round(clamp(vec4(encRgb, rgba.a) * 255.0, 0.0, 255.0))); uint uQuat = encodeQuatOctXy88R8(quaternion); uvec3 uQuat3 = uvec3(uQuat & 0xffu, (uQuat >> 8u) & 0xffu, (uQuat >> 16u) & 0xffu); float lnScaleMin = rgbMinMaxLnScaleMinMax.z; float lnScaleMax = rgbMinMaxLnScaleMinMax.w; float lnScaleScale = 254.0 / (lnScaleMax - lnScaleMin); uvec3 uScales = uvec3( (scales.x == 0.0) ? 0u : uint(round(clamp((log(scales.x) - lnScaleMin) * lnScaleScale, 0.0, 254.0))) + 1u, (scales.y == 0.0) ? 0u : uint(round(clamp((log(scales.y) - lnScaleMin) * lnScaleScale, 0.0, 254.0))) + 1u, (scales.z == 0.0) ? 0u : uint(round(clamp((log(scales.z) - lnScaleMin) * lnScaleScale, 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); } uvec4 packSplat(vec3 center, vec3 scales, vec4 quaternion, vec4 rgba) { return packSplatEncoding(center, scales, quaternion, rgba, vec4(0.0, 1.0, LN_SCALE_MIN, LN_SCALE_MAX)); } void unpackSplatEncoding(uvec4 packed, out vec3 center, out vec3 scales, out vec4 quaternion, out vec4 rgba, vec4 rgbMinMaxLnScaleMinMax) { 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); float rgbMin = rgbMinMaxLnScaleMinMax.x; float rgbMax = rgbMinMaxLnScaleMinMax.y; rgba = (vec4(uRgba) / 255.0); rgba.rgb = rgba.rgb * (rgbMax - rgbMin) + rgbMin; center = vec4( unpackHalf2x16(word1), unpackHalf2x16(word2 & 0xffffu) ).xyz; uvec3 uScales = uvec3(word3 & 0xffu, (word3 >> 8u) & 0xffu, (word3 >> 16u) & 0xffu); float lnScaleMin = rgbMinMaxLnScaleMinMax.z; float lnScaleMax = rgbMinMaxLnScaleMinMax.w; float lnScaleScale = (lnScaleMax - lnScaleMin) / 254.0; scales = vec3( (uScales.x == 0u) ? 0.0 : exp(lnScaleMin + float(uScales.x - 1u) * lnScaleScale), (uScales.y == 0u) ? 0.0 : exp(lnScaleMin + float(uScales.y - 1u) * lnScaleScale), (uScales.z == 0u) ? 0.0 : exp(lnScaleMin + float(uScales.z - 1u) * lnScaleScale) ); uint uQuat = ((word2 >> 16u) & 0xFFFFu) | ((word3 >> 8u) & 0xFF0000u); quaternion = decodeQuatOctXy88R8(uQuat); } void unpackSplat(uvec4 packed, out vec3 center, out vec3 scales, out vec4 quaternion, out vec4 rgba) { unpackSplatEncoding(packed, center, scales, quaternion, rgba, vec4(0.0, 1.0, LN_SCALE_MIN, LN_SCALE_MAX)); } 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); }`, Zu = `precision highp float; precision highp int; #include uniform float near; uniform float far; uniform bool encodeLinear; uniform float time; uniform bool debugFlag; uniform float maxStdDev; uniform float minAlpha; uniform bool stochastic; 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; flat in uint vSplatIndex; 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 < minAlpha) { discard; } if (encodeLinear) { rgba.rgb = srgbToLinear(rgba.rgb); } if (stochastic) { const bool STEADY = false; uint uTime = STEADY ? 0u : floatBitsToUint(time); uvec2 coord = uvec2(gl_FragCoord.xy); uint state = uTime + 0x9e3779b9u * coord.x + 0x85ebca6bu * coord.y + 0xc2b2ae35u * uint(vSplatIndex); state = state * 747796405u + 2891336453u; uint hash = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u; hash = (hash >> 22u) ^ hash; float rand = float(hash) / 4294967296.0; if (rand < rgba.a) { fragColor = vec4(rgba.rgb, 1.0); } else { discard; } } else { #ifdef PREMULTIPLIED_ALPHA fragColor = vec4(rgba.rgb * rgba.a, rgba.a); #else fragColor = rgba; #endif } }`, Xu = `precision highp float; precision highp int; precision highp usampler2DArray; #include attribute uint splatIndex; out vec4 vRgba; out vec2 vSplatUv; out vec3 vNdc; flat out uint vSplatIndex; uniform vec2 renderSize; uniform uint numSplats; uniform vec4 renderToViewQuat; uniform vec3 renderToViewPos; uniform float maxStdDev; uniform float maxPixelRadius; uniform float time; uniform float deltaTime; uniform bool debugFlag; uniform float minAlpha; uniform bool stochastic; uniform bool enable2DGS; uniform float blurAmount; uniform float preBlurAmount; uniform float focalDistance; uniform float apertureAngle; uniform float clipXY; uniform float focalAdjustment; uniform usampler2DArray packedSplats; uniform vec4 rgbMinMaxLnScaleMinMax; void main() { gl_Position = vec4(0.0, 0.0, 2.0, 1.0); if (uint(gl_InstanceID) >= numSplats) { return; } ivec3 texCoord; if (stochastic) { texCoord = ivec3( uint(gl_InstanceID) & SPLAT_TEX_WIDTH_MASK, (uint(gl_InstanceID) >> SPLAT_TEX_WIDTH_BITS) & SPLAT_TEX_HEIGHT_MASK, (uint(gl_InstanceID) >> SPLAT_TEX_LAYER_BITS) ); } else { if (splatIndex == 0xffffffffu) { return; } 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; unpackSplatEncoding(packed, center, scales, quaternion, rgba, rgbMinMaxLnScaleMinMax); if (rgba.a < minAlpha) { 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; } vSplatIndex = splatIndex; 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]); mat3 J; if(isOrthographic) { J = mat3( focal.x, 0.0, 0.0, 0.0, focal.y, 0.0, 0.0, 0.0, 0.0 ); } else { float invZ = 1.0 / viewCenter.z; vec2 J1 = focal * invZ; vec2 J2 = -(J1 * viewCenter.xy) * invZ; 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 = maxPixelRadius; 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(maxPixelRadius)); } 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 < minAlpha) { 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(maxPixelRadius, maxStdDev * sqrt(eigen1)); float scale2 = position.y * min(maxPixelRadius, 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 ke = null; function Ou() { return ke || (I.ShaderChunk.splatDefines = Pu, ke = { splatVertex: Xu, splatFragment: Zu }), ke; } const ys = 5; let Ve = !1, Pe = !1, Wa; function ju(t) { let A = !1; return t instanceof OA ? !0 : (t.traverse((e) => { A = A || e instanceof OA; }), A); } const Ao = I.Scene.prototype.add; I.Scene.prototype.add = function(t) { return Ve = Ve || ju(t), Pe = Pe || t instanceof Ce, Ao.call(this, t), this; }; const Wu = I.Scene.prototype.onBeforeRender; I.Scene.prototype.onBeforeRender = function(t) { if (Ve) { if (!Pe) { const A = Wa || new Ce({ renderer: t }); this.add(A); } I.Scene.prototype.onBeforeRender = Wu, I.Scene.prototype.add = Ao; } }; const oA = class oA extends I.Mesh { constructor(A) { const e = oA.makeUniforms(), s = Ou(), n = A.premultipliedAlpha ?? !0, i = new I.ShaderMaterial({ glslVersion: I.GLSL3, vertexShader: s.splatVertex, fragmentShader: s.splatFragment, uniforms: e, premultipliedAlpha: n, transparent: !0, depthTest: !0, depthWrite: !1, side: I.DoubleSide }); super(ws, i), this.splatTexture = null, this.autoViewpoints = [], this.rotateToAccumulator = new Tt({ value: new I.Quaternion() }), this.translateToAccumulator = new Ft({ value: new I.Vector3() }), this.lastFrame = -1, this.lastUpdateTime = null, this.defaultCameras = [], this.lastStochastic = null, this.pendingUpdate = { scene: null, originToWorld: new I.Matrix4(), timeoutId: -1 }, this.envViewpoint = null, this.frustumCulled = !1, this.renderer = A.renderer, this.material = i, this.uniforms = e; const r = vA( { gsplat: AA }, { gsplat: AA }, ({ gsplat: a }) => { if (!a) throw new Error("gsplat not defined"); return a = ts(a, { rotate: this.rotateToAccumulator, translate: this.translateToAccumulator }), { gsplat: a }; } ); this.modifier = new fu(r), this.premultipliedAlpha = n, this.autoUpdate = A.autoUpdate ?? !0, this.preUpdate = A.preUpdate ?? !1, this.needsUpdate = !1, this.originDistance = A.originDistance ?? 1, this.maxStdDev = A.maxStdDev ?? Math.sqrt(8), this.maxPixelRadius = A.maxPixelRadius ?? 512, this.minAlpha = A.minAlpha ?? 0.5 * (1 / 255), 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.splatEncoding = A.splatEncoding ?? { ...fe }, this.active = new Ne(), this.accumulatorCount = 1, this.freeAccumulators = []; for (let a = 0; a < 1; ++a) this.freeAccumulators.push(new Ne()), this.accumulatorCount += 1; this.defaultView = new he({ ...A.view, autoUpdate: !0, spark: this }), this.viewpoint = this.defaultView, this.prepareViewpoint(this.viewpoint), this.clock = A.clock ? qn(A.clock) : new I.Clock(), Wa = this; } static makeUniforms() { return { // Size of render viewport in pixels renderSize: { value: new I.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 I.Quaternion() }, // SplatAccumulator to view transformation translation renderToViewPos: { value: new I.Vector3() }, // Maximum distance (in stddevs) from Gsplat center to render maxStdDev: { value: 1 }, // Maximum pixel radius for splat rendering maxPixelRadius: { value: 512 }, // Minimum alpha value for splat rendering minAlpha: { value: 0.00196078431372549 }, // Enable stochastic splat rendering stochastic: { 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: oA.EMPTY_SPLAT_TEXTURE }, // Splat texture UV transform (multiply) splatTexMul: { value: new I.Matrix2() }, // Splat texture UV transform (add) splatTexAdd: { value: new I.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: VA.getEmpty() }, // Splat encoding ranges rgbMinMaxLnScaleMinMax: { value: new I.Vector4() }, // 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 < ys; } maybeAllocAccumulator() { let A = this.freeAccumulators.pop(); if (A === void 0) { if (this.accumulatorCount >= ys) return null; A = new Ne(), this.accumulatorCount += 1; } return A.refCount = 1, A; } releaseAccumulator(A) { A.refCount -= 1, A.refCount === 0 && this.freeAccumulators.push(A); } newViewpoint(A) { return new he({ ...A, spark: this }); } onBeforeRender(A, e, s) { var h, E; const n = this.time ?? this.clock.getElapsedTime(), i = n - (this.viewpoint.lastTime ?? n); this.viewpoint.lastTime = n; const r = A.info.render.frame, a = r !== this.lastFrame; this.lastFrame = r; const o = this.viewpoint; if (o === this.defaultView) { if (a) if (!A.xr.isPresenting) this.defaultView.viewToWorld = s.matrixWorld.clone(), this.defaultCameras = [this.defaultView.viewToWorld]; else { const C = A.xr.getCamera().cameras; this.defaultCameras = C.map((B) => B.matrixWorld), this.defaultView.viewToWorld = Ah(this.defaultCameras) ?? new I.Matrix4(); } this.autoUpdate && this.update({ scene: e, viewToWorld: this.defaultView.viewToWorld }); } if (a && (this.material.premultipliedAlpha !== this.premultipliedAlpha && (this.material.premultipliedAlpha = this.premultipliedAlpha, this.material.needsUpdate = !0), this.uniforms.time.value = n, this.uniforms.deltaTime.value = i, this.uniforms.debugFlag.value = performance.now() / 1e3 % 2 < 1, o.display && o.stochastic && (this.geometry.instanceCount = this.uniforms.numSplats.value)), o.target) this.uniforms.renderSize.value.set( o.target.width, o.target.height ); else { const C = A.getDrawingBufferSize( this.uniforms.renderSize.value ); if (C.x === 1 && C.y === 1) { const B = (h = A.xr.getSession()) == null ? void 0 : h.renderState.baseLayer; B && (C.x = B.framebufferWidth, C.y = B.framebufferHeight); } } const g = s; if (this.uniforms.near.value = g.near, this.uniforms.far.value = g.far, this.uniforms.encodeLinear.value = o.encodeLinear, this.uniforms.maxStdDev.value = this.maxStdDev, this.uniforms.maxPixelRadius.value = this.maxPixelRadius, this.uniforms.minAlpha.value = this.minAlpha, this.uniforms.stochastic.value = o.stochastic, 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.lastStochastic !== !o.stochastic && (this.lastStochastic = !o.stochastic, this.material.transparent = !o.stochastic, this.material.depthWrite = o.stochastic, this.material.needsUpdate = !0), this.splatTexture) { const { enable: C, texture: B, multiply: Q, add: p, near: f, far: d, mid: w } = this.splatTexture; C && B ? (this.uniforms.splatTexEnable.value = !0, this.uniforms.splatTexture.value = B, Q ? this.uniforms.splatTexMul.value.fromArray(Q.elements) : this.uniforms.splatTexMul.value.set( 0.5 / this.maxStdDev, 0, 0, 0.5 / this.maxStdDev ), this.uniforms.splatTexAdd.value.set((p == null ? void 0 : p.x) ?? 0.5, (p == null ? void 0 : p.y) ?? 0.5), this.uniforms.splatTexNear.value = f ?? this.uniforms.near.value, this.uniforms.splatTexFar.value = d ?? this.uniforms.far.value, this.uniforms.splatTexMid.value = w ?? 0) : (this.uniforms.splatTexEnable.value = !1, this.uniforms.splatTexture.value = oA.EMPTY_SPLAT_TEXTURE); } else this.uniforms.splatTexEnable.value = !1, this.uniforms.splatTexture.value = oA.EMPTY_SPLAT_TEXTURE; const l = ((E = o.display) == null ? void 0 : E.accumulator.toWorld) ?? new I.Matrix4(), c = s.matrixWorld.clone().invert(); l.clone().premultiply(c).decompose( this.uniforms.renderToViewPos.value, this.uniforms.renderToViewQuat.value, new I.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) { var e, s, n, i; if (this.viewpoint = A ?? this.viewpoint, this.viewpoint.display) { const { accumulator: r, geometry: a } = this.viewpoint.display; this.uniforms.numSplats.value = r.splats.numSplats, this.uniforms.packedSplats.value = r.splats.getTexture(), this.uniforms.rgbMinMaxLnScaleMinMax.value.set( ((e = r.splats.splatEncoding) == null ? void 0 : e.rgbMin) ?? 0, ((s = r.splats.splatEncoding) == null ? void 0 : s.rgbMax) ?? 1, ((n = r.splats.splatEncoding) == null ? void 0 : n.lnScaleMin) ?? UA, ((i = r.splats.splatEncoding) == null ? void 0 : i.lnScaleMax) ?? GA ), this.geometry = a, this.material.transparent = !this.viewpoint.stochastic, this.material.depthWrite = this.viewpoint.stochastic, this.material.needsUpdate = !0; } else this.uniforms.numSplats.value = 0, this.uniforms.packedSplats.value = VA.getEmpty(), this.geometry = ws; } // If spark.autoUpdate is false then you must manually call // spark.update({ scene }) to have the scene Gsplats be re-generated. update({ scene: A, viewToWorld: e }) { const s = this.matrixWorld; this.preUpdate ? this.updateInternal({ scene: A, originToWorld: s.clone(), viewToWorld: e }) : (this.pendingUpdate.scene = A, this.pendingUpdate.originToWorld.copy(s), this.pendingUpdate.timeoutId === -1 && (this.pendingUpdate.timeoutId = setTimeout(() => { const { scene: n, originToWorld: i } = this.pendingUpdate; this.pendingUpdate.scene = null, this.pendingUpdate.timeoutId = -1, this.updateInternal({ scene: n, originToWorld: i, viewToWorld: e }) && this.renderer.getContext().flush(); }, 1))); } updateInternal({ scene: A, originToWorld: e, viewToWorld: s }) { var E; if (!this.canAllocAccumulator()) return !1; e || (e = this.active.toWorld), s = s ?? e.clone(); const n = this.time ?? this.clock.getElapsedTime(), i = n - (this.lastUpdateTime ?? n); this.lastUpdateTime = n; const r = this.active.mapping.reduce((C, B) => (C.set(B.node, B), C), /* @__PURE__ */ new Map()), { generators: a, visibleGenerators: o, globalEdits: g } = this.compileScene(A); for (const C of a) (E = C.frameUpdate) == null || E.call(C, { object: C, time: n, deltaTime: i, viewToWorld: s, globalEdits: g }); const l = new Set(o.map((C) => C.uuid)); for (const C of a) { const B = r.get(C), p = C.generator && l.has(C.uuid) ? C.numSplats : 0; (this.needsUpdate || C.generator !== (B == null ? void 0 : B.generator) || p !== (B == null ? void 0 : B.count)) && C.updateVersion(); } const c = !ce({ matrix1: e, matrix2: this.active.toWorld, maxDistance: this.originDistance }), u = this.needsUpdate || c || a.length !== r.size || a.some((C) => { var B; return C.version !== ((B = r.get(C)) == null ? void 0 : B.version); }); this.needsUpdate = !1; let h = null; if (u) { if (h = this.maybeAllocAccumulator(), !h) throw new Error("Unreachable"); const C = !ce({ matrix1: e, matrix2: this.active.toWorld, maxDistance: 1e-5, minCoorient: 0.99999 }), Q = o.map((x, y) => { const m = r.get(x); return m ? ( // Sort by version deltas then by previous ordering in the mapping, // attempting to keep unchanging generators near the front // to improve our chances of avoiding a re-generation. [x.version - m.version, m.base, x] ) : [Number.POSITIVE_INFINITY, x.version, x]; }).sort((x, y) => x[0] !== y[0] ? x[0] - y[0] : x[1] - y[1]).map(([x, y, m]) => m), p = Q.map((x) => x.numSplats), { maxSplats: f, mapping: d } = h.splats.generateMapping(p), w = Q.map((x, y) => { const { base: m, count: k } = d[y]; return { node: x, generator: x.generator, version: x.version, base: m, count: k }; }); e.clone().invert().decompose( this.translateToAccumulator.value, this.rotateToAccumulator.value, new I.Vector3() ), h.ensureGenerate(f), h.splats.splatEncoding = { ...this.splatEncoding }, h.generateSplats({ renderer: this.renderer, modifier: this.modifier, generators: w, forceUpdate: C, originToWorld: e }), h.splatsVersion = this.active.splatsVersion + 1; const D = h.hasCorrespondence(this.active); h.mappingVersion = this.active.mappingVersion + (D ? 0 : 1), this.releaseAccumulator(this.active), this.active = h, this.prepareViewpoint(); } return setTimeout(() => { for (const C of this.autoViewpoints) C.autoPoll({ accumulator: h ?? void 0 }); }, 1), !0; } compileScene(A) { const e = []; A.traverse((i) => { i instanceof $t && e.push(i); }); const s = []; A.traverseVisible((i) => { i instanceof $t && s.push(i); }); const n = /* @__PURE__ */ new Set(); return A.traverseVisible((i) => { if (i instanceof le) { let r = i.parent; for (; r != null && !(r instanceof OA); ) r = r.parent; r == null && n.add(i); } }), { generators: e, visibleGenerators: s, globalEdits: Array.from(n) }; } // Renders out the scene to an environment map that can be used for // Image-based lighting or similar applications. First optionally updates Gsplats, // sorts them with respect to the provided worldCenter, renders 6 cube faces, // then pre-filters them using THREE.PMREMGenerator and returns a THREE.Texture // that can assigned directly to a THREE.MeshStandardMaterial.envMap property. async renderEnvMap({ renderer: A, scene: e, worldCenter: s, size: n = 256, near: i = 0.1, far: r = 1e3, hideObjects: a = [], update: o = !1 }) { var h, E; if (this.envViewpoint || (this.envViewpoint = this.newViewpoint({ sort360: !0 })), !oA.cubeRender || oA.cubeRender.target.width !== n || oA.cubeRender.near !== i || oA.cubeRender.far !== r) { oA.cubeRender && oA.cubeRender.target.dispose(); const C = new I.WebGLCubeRenderTarget(n, { format: I.RGBAFormat, generateMipmaps: !0, minFilter: I.LinearMipMapLinearFilter }), B = new I.CubeCamera(i, r, C); oA.cubeRender = { target: C, camera: B, near: i, far: r }; } oA.pmrem || (oA.pmrem = new I.PMREMGenerator(A ?? this.renderer)); const g = new I.Matrix4().setPosition(s); await ((h = this.envViewpoint) == null ? void 0 : h.prepare({ scene: e, viewToWorld: g, update: o })); const { target: l, camera: c } = oA.cubeRender; c.position.copy(s); const u = /* @__PURE__ */ new Map(); for (const C of a) u.set(C, C.visible), C.visible = !1; this.prepareViewpoint(this.envViewpoint), c.update(A ?? this.renderer, e), this.prepareViewpoint(this.defaultView); for (const [C, B] of u.entries()) C.visible = B; return (E = oA.pmrem) == null ? void 0 : E.fromCubemap(l.texture).texture; } // Utility function to recursively set the envMap property for any // THREE.MeshStandardMaterial within the subtree of root. recurseSetEnvMap(A, e) { A.traverse((s) => { if (s instanceof I.Mesh) if (Array.isArray(s.material)) for (const n of s.material) n instanceof I.MeshStandardMaterial && (n.envMap = e); else s.material instanceof I.MeshStandardMaterial && (s.material.envMap = e); }); } // Utility function that helps extract the Gsplat RGBA values from a // SplatGenerator, including the result of any real-time RGBA SDF edits applied // to a SplatMesh. This effectively "bakes" any computed RGBA values, which can // now be used as a pipeline input via SplatMesh.splatRgba to inject these // baked values into the Gsplat data. getRgba({ generator: A, rgba: e }) { const s = this.active.mapping.find(({ node: n }) => n === A); if (!s) throw new Error("Generator not found"); return e = e ?? new qe(), e.fromPackedSplats({ packedSplats: this.active.splats, base: s.base, count: s.count, renderer: this.renderer }), e; } // Utility function that builds on getRgba({ generator }) and additionally // reads back the RGBA values to the CPU in a Uint8Array with packed RGBA // in that byte order. async readRgba({ generator: A, rgba: e }) { return e = this.getRgba({ generator: A, rgba: e }), e.read(); } }; oA.cubeRender = null, oA.pmrem = null, oA.EMPTY_SPLAT_TEXTURE = new I.Data3DTexture(); let Ce = oA; const ws = new $e(new Uint32Array(1), 0); vA( { packedSplats: Ot, index: "int" }, { gsplat: AA }, ({ packedSplats: t, index: A }) => { if (!t || !A) throw new Error("Invalid input"); return { gsplat: bt(t, A) }; } ); function Ah(t) { if (t.length === 0) return null; const A = new I.Vector3(), e = new I.Quaternion(), s = new I.Vector3(), n = [], i = []; for (const r of t) r.decompose(A, e, s), n.push(A), i.push(e); return new I.Matrix4().compose( $n(n), Vn(i), new I.Vector3(1, 1, 1) ); } function th(t, A, e) { const s = Math.floor(t.length / 32); if (s * 32 !== t.length) throw new Error("Invalid .splat file size"); const n = new Float32Array(t.buffer); for (let i = 0; i < s; ++i) { const r = i * 32, a = i * 8, o = n[a + 0], g = n[a + 1], l = n[a + 2], c = n[a + 3], u = n[a + 4], h = n[a + 5], E = t[r + 24] / 255, C = t[r + 25] / 255, B = t[r + 26] / 255, Q = t[r + 27] / 255, p = (t[r + 28] - 128) / 128, f = (t[r + 29] - 128) / 128, d = (t[r + 30] - 128) / 128, w = (t[r + 31] - 128) / 128; e( i, o, g, l, c, u, h, f, d, w, p, Q, E, C, B ); } } const ms = { 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 } }, eh = { 0: 0, 1: 9, 2: 24, 3: 45 }; function sh(t, A, e, s) { var C; let r = 0; const a = new DataView(t.buffer, r, 4096); r += 4096; const o = a.getUint8(0), g = a.getUint8(1); if (o !== 0 || g < 1) throw new Error( `Unsupported .ksplat version: ${o}.${g}` ); const l = a.getUint32(4, !0); a.getUint32(16, !0); const c = a.getUint16(20, !0); if (c < 0 || c > 2) throw new Error(`Invalid .ksplat compression level: ${c}`); const u = a.getFloat32(36, !0) || -1.5, h = a.getFloat32(40, !0) || 1.5; let E = 4096 + l * 1024; for (let B = 0; B < l; ++B) { let Q = function(MA, z) { if (c === 0) return Y.getFloat32( MA + P + z * 4, !0 ); if (c === 1) return wA( Y.getUint16( MA + P + z * 2, !0 ) ); const ZA = Y.getUint8(MA + P + z) / 255; return u + ZA * (h - u); }; const p = new DataView(t.buffer, r, 1024); r += 1024; const f = p.getUint32(0, !0), d = p.getUint32(4, !0), w = p.getUint32(8, !0), D = p.getUint32(12, !0), x = p.getFloat32(16, !0), y = p.getUint16(20, !0), m = (p.getUint32(24, !0) || ((C = ms[c]) == null ? void 0 : C.scaleRange)) ?? 1, k = p.getUint32(32, !0), M = k * w, S = p.getUint32(36, !0), U = S * 4, F = y * D + U, b = p.getUint16(40, !0), T = eh[b], { bytesPerCenter: R, bytesPerScale: X, bytesPerRotation: _, bytesPerColor: eA, bytesPerSphericalHarmonicsComponent: q, scaleOffsetBytes: O, rotationOffsetBytes: L, colorOffsetBytes: j, sphericalHarmonicsOffsetBytes: P } = ms[c], W = R + X + _ + eA + T * q, G = W * d, pA = G + F, gA = [0, 3, 6, 1, 4, 7, 2, 5, 8], fA = [ 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 ], xA = b >= 1 ? new Float32Array(3 * 3) : void 0, CA = b >= 2 ? new Float32Array(5 * 3) : void 0, YA = b >= 3 ? new Float32Array(7 * 3) : void 0, SA = x / 2 / m, jA = E + U, WA = E + F, Y = new DataView( t.buffer, WA, G ), DA = new Float32Array( t.buffer, jA, D * 3 ), lA = new Uint32Array( t.buffer, E, S ); let Gt = k, Wt = M; for (let MA = 0; MA < f; ++MA) { const z = MA * W; let ZA; if (MA < M) ZA = Math.floor(MA / w); else { const At = lA[Gt - k]; MA >= Wt + At && (Gt += 1, Wt += At), ZA = Gt; } const de = c === 0 ? Y.getFloat32(z + 0, !0) : (Y.getUint16(z + 0, !0) - m) * SA + DA[3 * ZA + 0], ye = c === 0 ? Y.getFloat32(z + 4, !0) : (Y.getUint16(z + 2, !0) - m) * SA + DA[3 * ZA + 1], we = c === 0 ? Y.getFloat32(z + 8, !0) : (Y.getUint16(z + 4, !0) - m) * SA + DA[3 * ZA + 2], me = c === 0 ? Y.getFloat32(z + O + 0, !0) : wA(Y.getUint16(z + O + 0, !0)), xe = c === 0 ? Y.getFloat32(z + O + 4, !0) : wA(Y.getUint16(z + O + 2, !0)), co = c === 0 ? Y.getFloat32(z + O + 8, !0) : wA(Y.getUint16(z + O + 4, !0)), go = c === 0 ? Y.getFloat32(z + L + 0, !0) : wA( Y.getUint16(z + L + 0, !0) ), lo = c === 0 ? Y.getFloat32(z + L + 4, !0) : wA( Y.getUint16(z + L + 2, !0) ), Io = c === 0 ? Y.getFloat32(z + L + 8, !0) : wA( Y.getUint16(z + L + 4, !0) ), uo = c === 0 ? Y.getFloat32(z + L + 12, !0) : wA( Y.getUint16(z + L + 6, !0) ), ho = Y.getUint8(z + j + 0) / 255, Co = Y.getUint8(z + j + 1) / 255, Bo = Y.getUint8(z + j + 2) / 255, Eo = Y.getUint8(z + j + 3) / 255; if (e( MA, de, ye, we, me, xe, co, lo, Io, uo, go, Eo, ho, Co, Bo ), b >= 1 && xA) { for (const [At, Rt] of gA.entries()) xA[At] = Q(z, Rt); if (CA) for (const [At, Rt] of fA.entries()) CA[At] = Q(z, Rt); if (YA) for (const [At, Rt] of dA.entries()) YA[At] = Q(z, Rt); s == null || s(MA, xA, CA, YA); } } E += pA; } } class nh { constructor({ fileBytes: A }) { this.fileBytes = A instanceof ArrayBuffer ? new Uint8Array(A) : A, this.reader = new jn({ fileBytes: this.fileBytes }); const e = new DataView(this.reader.read(16).buffer); if (e.getUint32(0, !0) !== 1347635022) throw new Error("Invalid SPZ file"); if (this.version = e.getUint32(4, !0), this.version < 1 || this.version > 2) throw new Error(`Unsupported SPZ version: ${this.version}`); this.numSplats = e.getUint32(8, !0), this.shDegree = e.getUint8(12), this.fractionalBits = e.getUint8(13), this.flags = e.getUint8(14), this.flagAntiAlias = (this.flags & 1) !== 0, this.reserved = e.getUint8(15), this.parsed = !1; } parseSplats(A, e, s, n, i, r) { if (this.parsed) throw new Error("SPZ file already parsed"); if (this.parsed = !0, this.version === 1) { const a = this.reader.read(this.numSplats * 3 * 2), o = new Uint16Array(a.buffer); for (let g = 0; g < this.numSplats; g++) { const l = g * 3, c = wA(o[l]), u = wA(o[l + 1]), h = wA(o[l + 2]); A == null || A(g, c, u, h); } } else if (this.version === 2) { const a = 1 << this.fractionalBits, o = this.reader.read(this.numSplats * 3 * 3); for (let g = 0; g < this.numSplats; g++) { const l = g * 9, c = ((o[l + 2] << 24 | o[l + 1] << 16 | o[l] << 8) >> 8) / a, u = ((o[l + 5] << 24 | o[l + 4] << 16 | o[l + 3] << 8) >> 8) / a, h = ((o[l + 8] << 24 | o[l + 7] << 16 | o[l + 6] << 8) >> 8) / a; A == null || A(g, c, u, h); } } else throw new Error("Unreachable"); { const a = this.reader.read(this.numSplats); for (let o = 0; o < this.numSplats; o++) e == null || e(o, a[o] / 255); } { const a = this.reader.read(this.numSplats * 3), o = eo / 0.15; for (let g = 0; g < this.numSplats; g++) { const l = g * 3, c = (a[l] / 255 - 0.5) * o + 0.5, u = (a[l + 1] / 255 - 0.5) * o + 0.5, h = (a[l + 2] / 255 - 0.5) * o + 0.5; s == null || s(g, c, u, h); } } { const a = this.reader.read(this.numSplats * 3); for (let o = 0; o < this.numSplats; o++) { const g = o * 3, l = Math.exp(a[g] / 16 - 10), c = Math.exp(a[g + 1] / 16 - 10), u = Math.exp(a[g + 2] / 16 - 10); n == null || n(o, l, c, u); } } { const a = this.reader.read(this.numSplats * 3); for (let o = 0; o < this.numSplats; o++) { const g = o * 3, l = a[g] / 127.5 - 1, c = a[g + 1] / 127.5 - 1, u = a[g + 2] / 127.5 - 1, h = Math.sqrt( Math.max(0, 1 - l * l - c * c - u * u) ); i == null || i(o, l, c, u, h); } } if (r && this.shDegree >= 1) { const a = new Float32Array(9), o = this.shDegree >= 2 ? new Float32Array(5 * 3) : void 0, g = this.shDegree >= 3 ? new Float32Array(7 * 3) : void 0, l = this.reader.read( this.numSplats * to[this.shDegree] * 3 ); let c = 0; for (let u = 0; u < this.numSplats; u++) { for (let h = 0; h < 9; ++h) a[h] = (l[c + h] - 128) / 128; if (c += 9, o) { for (let h = 0; h < 15; ++h) o[h] = (l[c + h] - 128) / 128; c += 15; } if (g) { for (let h = 0; h < 21; ++h) g[h] = (l[c + h] - 128) / 128; c += 21; } r == null || r(u, a, o, g); } } } } const to = { 1: 3, 2: 8, 3: 15 }, eo = 0.28209479177387814, ih = 1347635022, rh = 2, ah = 1; class st { constructor({ numSplats: A, shDegree: e, fractionalBits: s = 12, flagAntiAlias: n = !0 }) { this.clippedCount = 0; const i = 19 + (e >= 1 ? 9 : 0) + (e >= 2 ? 15 : 0) + (e >= 3 ? 21 : 0), r = 16 + A * i; this.buffer = new ArrayBuffer(r), this.view = new DataView(this.buffer), this.view.setUint32(0, ih, !0), this.view.setUint32(4, rh, !0), this.view.setUint32(8, A, !0), this.view.setUint8(12, e), this.view.setUint8(13, s), this.view.setUint8(14, n ? ah : 0), this.view.setUint8(15, 0), this.numSplats = A, this.shDegree = e, this.fractionalBits = s, this.fraction = 1 << s, this.flagAntiAlias = n; } setCenter(A, e, s, n) { const i = Math.round(e * this.fraction), r = Math.max(-8388607, Math.min(8388607, i)), a = Math.round(s * this.fraction), o = Math.max(-8388607, Math.min(8388607, a)), g = Math.round(n * this.fraction), l = Math.max(-8388607, Math.min(8388607, g)); (i !== r || a !== o || g !== l) && (this.clippedCount += 1); const h = 16 + A * 9; this.view.setUint8(h, r & 255), this.view.setUint8(h + 1, r >> 8 & 255), this.view.setUint8(h + 2, r >> 16 & 255), this.view.setUint8(h + 3, o & 255), this.view.setUint8(h + 4, o >> 8 & 255), this.view.setUint8(h + 5, o >> 16 & 255), this.view.setUint8(h + 6, l & 255), this.view.setUint8(h + 7, l >> 8 & 255), this.view.setUint8(h + 8, l >> 16 & 255); } setAlpha(A, e) { const s = 16 + this.numSplats * 9 + A; this.view.setUint8( s, Math.max(0, Math.min(255, Math.round(e * 255))) ); } static scaleRgb(A) { const e = ((A - 0.5) / (eo / 0.15) + 0.5) * 255; return Math.max(0, Math.min(255, Math.round(e))); } setRgb(A, e, s, n) { const i = 16 + this.numSplats * 10 + A * 3; this.view.setUint8(i, st.scaleRgb(e)), this.view.setUint8(i + 1, st.scaleRgb(s)), this.view.setUint8(i + 2, st.scaleRgb(n)); } setScale(A, e, s, n) { const i = 16 + this.numSplats * 13 + A * 3; this.view.setUint8( i, Math.max(0, Math.min(255, Math.round((Math.log(e) + 10) * 16))) ), this.view.setUint8( i + 1, Math.max(0, Math.min(255, Math.round((Math.log(s) + 10) * 16))) ), this.view.setUint8( i + 2, Math.max(0, Math.min(255, Math.round((Math.log(n) + 10) * 16))) ); } setQuat(A, e, s, n, i) { const r = 16 + this.numSplats * 16 + A * 3, a = i < 0; this.view.setUint8( r, Math.max( 0, Math.min(255, Math.round(((a ? -e : e) + 1) * 127.5)) ) ), this.view.setUint8( r + 1, Math.max( 0, Math.min(255, Math.round(((a ? -s : s) + 1) * 127.5)) ) ), this.view.setUint8( r + 2, Math.max( 0, Math.min(255, Math.round(((a ? -n : n) + 1) * 127.5)) ) ); } static quantizeSh(A, e) { const s = Math.round(A * 128) + 128, n = 1 << 8 - e, i = Math.floor((s + n / 2) / n) * n; return Math.max(0, Math.min(255, i)); } setSh(A, e, s, n) { const i = to[this.shDegree] || 0, r = 16 + this.numSplats * 19 + A * i * 3; for (let a = 0; a < 9; ++a) this.view.setUint8(r + a, st.quantizeSh(e[a], 5)); if (s) { const a = r + 9; for (let o = 0; o < 15; ++o) this.view.setUint8(a + o, st.quantizeSh(s[o], 4)); if (n) { const o = a + 15; for (let g = 0; g < 21; ++g) this.view.setUint8(o + g, st.quantizeSh(n[g], 4)); } } } async finalize() { const A = new Uint8Array(this.buffer), s = new ReadableStream({ async start(r) { r.enqueue(A), r.close(); } }).pipeThrough(new CompressionStream("gzip")), i = await new Response(s).arrayBuffer(); return console.log( "Compressed", A.length, "bytes to", i.byteLength, "bytes" ), new Uint8Array(i); } } async function Kh(t) { var l, c, u; const A = new Hu(), { inputs: e, clipXyz: s, maxSh: n, fractionalBits: i = 12, opacityThreshold: r } = t; for (const h of e) { let E = function(y) { return y.multiplyScalar(f), y.applyQuaternion(d), y.add(w), y; }, C = function(y) { return y.multiplyScalar(f), y; }, B = function(y) { return y.premultiply(d), y; }, Q = function(y) { return !D || D.containsPoint(y); }, p = function(y) { return r !== void 0 ? y >= r : !0; }; const f = ((l = h.transform) == null ? void 0 : l.scale) ?? 1, d = new I.Quaternion().fromArray( ((c = h.transform) == null ? void 0 : c.quaternion) ?? [0, 0, 0, 1] ), w = new I.Vector3().fromArray( ((u = h.transform) == null ? void 0 : u.translate) ?? [0, 0, 0] ), D = s ? new I.Box3( new I.Vector3().fromArray(s.min), new I.Vector3().fromArray(s.max) ) : void 0; let x = h.fileType; switch (x || (x = Xa(h.fileBytes), !x && h.pathOrUrl && (x = Oa(h.pathOrUrl))), x) { case _t.PLY: { const y = new Ie({ fileBytes: h.fileBytes }); await y.parseHeader(); let m = null; y.parseSplats( (k, M, S, U, F, b, T, R, X, _, eA, q, O, L, j) => { const P = E(new I.Vector3(M, S, U)); if (Q(P) && p(q)) { m = A.pushSplat(), A.setCenter(m, P.x, P.y, P.z); const W = C( new I.Vector3(F, b, T) ); A.setScale(m, W.x, W.y, W.z); const G = B( new I.Quaternion(R, X, _, eA) ); A.setQuaternion( m, G.x, G.y, G.z, G.w ), A.setOpacity(m, q), A.setColor(m, O, L, j); } else m = null; }, (k, M, S, U) => { M && m !== null && A.setSh1(m, M), S && m !== null && A.setSh2(m, S), U && m !== null && A.setSh3(m, U); } ); break; } case _t.SPZ: { const y = new nh({ fileBytes: h.fileBytes }), m = new Int32Array(y.numSplats); m.fill(-1); const k = new Float32Array(y.numSplats * 3), M = new I.Vector3(); y.parseSplats( (S, U, F, b) => { const T = E(new I.Vector3(U, F, b)); k[S * 3] = T.x, k[S * 3 + 1] = T.y, k[S * 3 + 2] = T.z; }, (S, U) => { M.fromArray(k, S * 3), Q(M) && p(U) && (m[S] = A.pushSplat(), A.setCenter(m[S], M.x, M.y, M.z), A.setOpacity(m[S], U)); }, (S, U, F, b) => { m[S] >= 0 && A.setColor(m[S], U, F, b); }, (S, U, F, b) => { if (m[S] >= 0) { const T = C( new I.Vector3(U, F, b) ); A.setScale(m[S], T.x, T.y, T.z); } }, (S, U, F, b, T) => { if (m[S] >= 0) { const R = B( new I.Quaternion(U, F, b, T) ); A.setQuaternion( m[S], R.x, R.y, R.z, R.w ); } }, (S, U, F, b) => { m[S] >= 0 && (A.setSh1(m[S], U), F && A.setSh2(m[S], F), b && A.setSh3(m[S], b)); } ); break; } case _t.SPLAT: th( h.fileBytes, (y) => { }, (y, m, k, M, S, U, F, b, T, R, X, _, eA, q, O) => { const L = E(new I.Vector3(m, k, M)); if (Q(L) && p(_)) { const j = A.pushSplat(); A.setCenter(j, L.x, L.y, L.z); const P = C( new I.Vector3(S, U, F) ); A.setScale(j, P.x, P.y, P.z); const W = B( new I.Quaternion(b, T, R, X) ); A.setQuaternion( j, W.x, W.y, W.z, W.w ), A.setOpacity(j, _), A.setColor(j, eA, q, O); } } ); break; case _t.KSPLAT: { let y = null; sh( h.fileBytes, (m) => { }, (m, k, M, S, U, F, b, T, R, X, _, eA, q, O, L) => { const j = E(new I.Vector3(k, M, S)); if (Q(j) && p(eA)) { y = A.pushSplat(), A.setCenter(y, j.x, j.y, j.z); const P = C( new I.Vector3(U, F, b) ); A.setScale(y, P.x, P.y, P.z); const W = B( new I.Quaternion(T, R, X, _) ); A.setQuaternion( y, W.x, W.y, W.z, W.w ), A.setOpacity(y, eA), A.setColor(y, q, O, L); } else y = null; }, (m, k, M, S) => { y !== null && (A.setSh1(y, k), M && A.setSh2(y, M), S && A.setSh3(y, S)); } ); break; } default: throw new Error(`transcodeSpz not implemented for ${x}`); } } const a = Math.min( n ?? 3, A.sh3 ? 3 : A.sh2 ? 2 : A.sh1 ? 1 : 0 ), o = new st({ numSplats: A.numSplats, shDegree: a, fractionalBits: i, flagAntiAlias: !0 }); for (let h = 0; h < A.numSplats; ++h) { const E = h * 3, C = h * 4; o.setCenter( h, A.centers[E], A.centers[E + 1], A.centers[E + 2] ), o.setScale( h, A.scales[E], A.scales[E + 1], A.scales[E + 2] ), o.setQuat( h, A.quaternions[C], A.quaternions[C + 1], A.quaternions[C + 2], A.quaternions[C + 3] ), o.setAlpha(h, A.opacities[h]), o.setRgb( h, A.colors[E], A.colors[E + 1], A.colors[E + 2] ), A.sh1 && a >= 1 && o.setSh( h, A.sh1.slice(h * 9, (h + 1) * 9), a >= 2 && A.sh2 ? A.sh2.slice(h * 15, (h + 1) * 15) : void 0, a >= 3 && A.sh3 ? A.sh3.slice(h * 21, (h + 1) * 21) : void 0 ); } return { fileBytes: await o.finalize(), clippedCount: o.clippedCount }; } class $h { constructor(A) { this.mesh = A.mesh, this.numSplats = A.numSplats ?? this.mesh.numSplats; const { width: e, height: s, depth: n, maxSplats: i } = mA(this.numSplats); this.skinData = new Uint16Array(i * 4), this.skinTexture = new I.DataArrayTexture( this.skinData, e, s, n ), this.skinTexture.format = I.RGBAIntegerFormat, this.skinTexture.type = I.UnsignedShortType, this.skinTexture.internalFormat = "RGBA16UI", this.skinTexture.needsUpdate = !0, this.numBones = A.numBones ?? 256, this.boneData = new Float32Array(this.numBones * 16), this.boneTexture = new I.DataTexture( this.boneData, 4, this.numBones, I.RGBAFormat, I.FloatType ), this.boneTexture.internalFormat = "RGBA32F", this.boneTexture.needsUpdate = !0, this.uniform = new N({ key: "skinning", type: so, globals: () => [no], 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 ch(A, this.uniform); } // Set the "rest" pose for a bone with position and quaternion orientation. setRestQuatPos(A, e, s) { const n = A * 16; this.boneData[n + 0] = e.x, this.boneData[n + 1] = e.y, this.boneData[n + 2] = e.z, this.boneData[n + 3] = e.w, this.boneData[n + 4] = s.x, this.boneData[n + 5] = s.y, this.boneData[n + 6] = s.z, this.boneData[n + 7] = 0, this.boneData[n + 8] = 0, this.boneData[n + 9] = 0, this.boneData[n + 10] = 0, this.boneData[n + 11] = 1, this.boneData[n + 12] = 0, this.boneData[n + 13] = 0, this.boneData[n + 14] = 0, this.boneData[n + 15] = 0; } // Set the "current" position and orientation of a bone. setBoneQuatPos(A, e, s) { const n = A * 16, i = new I.Quaternion( this.boneData[n + 0], this.boneData[n + 1], this.boneData[n + 2], this.boneData[n + 3] ), r = new I.Vector3( this.boneData[n + 4], this.boneData[n + 5], this.boneData[n + 6] ), a = i.clone().invert(), o = s.clone().sub(r); o.applyQuaternion(a), a.multiply(e); const g = new I.Quaternion( o.x, o.y, o.z, 0 ).multiply(i); this.boneData[n + 8] = a.x, this.boneData[n + 9] = a.y, this.boneData[n + 10] = a.z, this.boneData[n + 11] = a.w, this.boneData[n + 12] = 0.5 * g.x, this.boneData[n + 13] = 0.5 * g.y, this.boneData[n + 14] = 0.5 * g.z, this.boneData[n + 15] = 0.5 * g.w; } // Set up to 4 bone indices and weights for a Gsplat. For fewer than 4 bones, // you can set the remaining weights to 0 (and index=0). setSplatBones(A, e, s) { const n = A * 4; this.skinData[n + 0] = Math.min(255, Math.max(0, Math.round(s.x * 255))) + (e.x << 8), this.skinData[n + 1] = Math.min(255, Math.max(0, Math.round(s.y * 255))) + (e.y << 8), this.skinData[n + 2] = Math.min(255, Math.max(0, Math.round(s.z * 255))) + (e.z << 8), this.skinData[n + 3] = Math.min(255, Math.max(0, Math.round(s.w * 255))) + (e.w << 8); } // Call this to indicate that the bones have changed and the Gsplats need to be // re-generated with updated skinning. updateBones() { this.boneTexture.needsUpdate = !0, this.mesh.needsUpdate = !0; } } const so = { type: "GsplatSkinning" }, no = hA(` struct GsplatSkinning { int numSplats; int numBones; usampler2DArray skinTexture; sampler2D boneTexture; }; `), oh = hA(` 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 ch(t, A) { return new V({ inTypes: { gsplat: AA, skinning: so }, outTypes: { gsplat: AA }, globals: () => [no, oh], inputs: { gsplat: t, skinning: A }, statements: ({ inputs: s, outputs: n }) => { const { skinning: i } = s, { gsplat: r } = n; return RA(` ${r} = ${s.gsplat}; if (isGsplatActive(${r}.flags)) { applyGsplatSkinning( ${i}.numSplats, ${i}.numBones, ${i}.skinTexture, ${i}.boneTexture, ${r}.index, ${r}.center, ${r}.quaternion ); } `); } }).outputs.gsplat; } function Vh({ // PackedSplats object to add splats to splats: t, // min and max box extents of the grid extents: A, // step size along each grid axis stepSize: e = 1, // spherical radius of each Gsplat pointRadius: s = 0.01, // relative size of the "shadow copy" of each Gsplat placed behind it pointShadowScale: n = 2, // Gsplat opacity opacity: i = 1, // Gsplat color (THREE.Color) or function to set color for position: // ((THREE.Color, THREE.Vector3) => void) (default: RGB-modulated grid) color: r }) { const o = new I.Vector3(), g = new I.Vector3(), l = new I.Quaternion(0, 0, 0, 1); r == null && (r = (u, h) => u.set( 0.55 + 0.45 * Math.cos(h.x * 1), 0.55 + 0.45 * Math.cos(h.y * 1), 0.55 + 0.45 * Math.cos(h.z * 1) )); const c = new I.Color(); for (let u = A.min.z; u < A.max.z + 1e-6; u += e) for (let h = A.min.y; h < A.max.y + 1e-6; h += e) for (let E = A.min.x; E < A.max.x + 1e-6; E += e) { o.set(E, h, u); for (let C = 0; C < 2; ++C) g.setScalar(s * (C ? 1 : n)), C ? typeof r == "function" ? r(c, o) : c.copy(r) : c.setScalar(0), t.pushSplat(o, g, l, i, c); } } function Ph({ // PackedSplats object to add splats to splats: t, // scale (Gsplat scale along axis) scale: A = 0.25, // radius of the axes (Gsplat scale orthogonal to axis) axisRadius: e = 75e-4, // relative size of the "shadow copy" of each Gsplat placed behind it axisShadowScale: s = 2, // origins of the axes (default single axis at origin) origins: n = [new I.Vector3()] }) { const i = new I.Vector3(), r = new I.Vector3(), a = new I.Quaternion(0, 0, 0, 1), o = new I.Color(), g = 1; for (const l of n) for (let c = 0; c < 3; ++c) { i.set( l.x + (c === 0 ? A : 0), l.y + (c === 1 ? A : 0), l.z + (c === 2 ? A : 0) ); for (let u = 0; u < 2; ++u) r.set( (c === 0 ? A : e) * (u ? 1 : s), (c === 1 ? A : e) * (u ? 1 : s), (c === 2 ? A : e) * (u ? 1 : s) ), o.setRGB( u === 0 ? 0 : c === 0 ? 1 : 0, u === 0 ? 0 : c === 1 ? 1 : 0, u === 0 ? 0 : c === 2 ? 1 : 0 ), t.pushSplat(i, r, a, g, o); } } function Zh({ // PackedSplats object to add splats to splats: t, // center of the sphere (default: origin) origin: A = new I.Vector3(), // radius of the sphere radius: e = 1, // maximum depth of recursion for subdividing the sphere // Warning: Gsplat count grows exponentially with depth maxDepth: s = 3, // filter function to apply to each point, for example to select // points in a certain direction or other function ((THREE.Vector3) => boolean) // (default: null) filter: n = null, // radius of each oriented Gsplat pointRadius: i = 0.02, // flatness of each oriented Gsplat pointThickness: r = 1e-3, // color of each Gsplat (THREE.Color) or function to set color for point: // ((THREE.Color, THREE.Vector3) => void) (default: white) color: a = new I.Color(1, 1, 1) }) { const o = {}; function g(C) { if (n && !n(C)) return; const B = `${C.x},${C.y},${C.z}`; o[B] || (o[B] = C); } function l(C, B, Q, p) { if (g(B), g(Q), g(p), C >= s) return; const f = new I.Vector3().addVectors(B, Q).normalize(), d = new I.Vector3().addVectors(Q, p).normalize(), w = new I.Vector3().addVectors(p, B).normalize(); l(C + 1, B, f, w), l(C + 1, f, Q, d), l(C + 1, w, d, p), l(C + 1, f, d, w); } for (const C of [-1, 1]) for (const B of [-1, 1]) for (const Q of [-1, 1]) { const p = new I.Vector3(C, 0, 0), f = new I.Vector3(0, B, 0), d = new I.Vector3(0, 0, Q); l(0, p, f, d); } const c = Object.values(o), u = new I.Vector3(i, i, r), h = new I.Quaternion(), E = typeof a == "function" ? new I.Color() : a; for (const C of c) h.setFromUnitVectors(new I.Vector3(0, 0, -1), C), typeof a == "function" && a(E, C), C.multiplyScalar(e), C.add(A), t.pushSplat(C, u, h, 1, E); } function Xh({ // text string to display text: t, // browser font to render text with (default: "Arial") font: A, // font size in pixels/Gsplats (default: 32) fontSize: e, // SplatMesh.recolor tint assuming white Gsplats (default: white) color: s, // Individual Gsplat color (default: white) rgb: n, // Gsplat radius (default: 0.8 covers 1-unit spacing well) dotRadius: i, // text alignment: "left", "center", "right", "start", "end" (default: "start") textAlign: r, // line spacing multiplier, lines delimited by "\n" (default: 1.0) lineHeight: a, // Coordinate scale in object-space (default: 1.0) objectScale: o }) { A = A ?? "Arial", e = e ?? 32, s = s ?? new I.Color(1, 1, 1), i = i ?? 0.8, r = r ?? "start", a = a ?? 1, o = o ?? 1; const g = t.split(` `), l = document.createElement("canvas"), c = l.getContext("2d"); if (!c) throw new Error("Failed to create canvas context"); c.font = `${e}px ${A}`, c.textAlign = r; const u = c.measureText(""), h = u.fontBoundingBoxAscent + u.fontBoundingBoxDescent; let E = Number.POSITIVE_INFINITY, C = Number.NEGATIVE_INFINITY, B = Number.POSITIVE_INFINITY, Q = Number.NEGATIVE_INFINITY; for (let F = 0; F < g.length; ++F) { const b = c.measureText(g[F]), T = h * a * F; E = Math.min(E, -b.actualBoundingBoxLeft), C = Math.max(C, b.actualBoundingBoxRight), B = Math.min(B, T - b.actualBoundingBoxAscent), Q = Math.max(Q, T + b.actualBoundingBoxDescent); } const p = Math.floor(E), f = Math.floor(B), d = Math.ceil(C) - p, w = Math.ceil(Q) - f; l.width = d, l.height = w, c.font = `${e}px ${A}`, c.textAlign = r, c.textBaseline = "alphabetic", c.fillStyle = "#FFFFFF"; for (let F = 0; F < g.length; ++F) { const b = h * a * F - f; c.fillText(g[F], -p, b); } const D = c.getImageData(0, 0, d, w), x = new Uint8Array(D.data.buffer), y = new VA(), m = new I.Vector3(), k = new I.Vector3().setScalar(i * o), M = new I.Quaternion(0, 0, 0, 1); n = n ?? new I.Color(1, 1, 1); let S = 0; for (let F = 0; F < w; ++F) for (let b = 0; b < d; ++b) { const T = x[S + 3]; if (T > 0) { const R = T / 255; m.set(b - 0.5 * (d - 1), 0.5 * (w - 1) - F, 0), m.multiplyScalar(o), y.pushSplat(m, k, M, R, n); } S += 4; } const U = new OA({ packedSplats: y }); return U.recolor = s, U; } function Oh({ // URL of the image to convert to splats (example: `url: "./image.png"`) url: t, // Radius of each Gsplat, default covers 1-unit spacing well (default: 0.8) dotRadius: A, // Subsampling factor for the image. Higher values reduce resolution, // for example 2 will halve the width and height by averaging (default: 1) subXY: e, // Optional callback function to modify each Gsplat before it's added. // Return null to skip adding the Gsplat, or a number to set the opacity // and add the Gsplat with parameter values in the objects center, rgba etc. were // passed into the forEachSplat callback. Ending the callback in `return opacity;` // will retain the original opacity. // ((width: number, height: number, index: number, center: THREE.Vector3, scales: THREE.Vector3, quaternion: THREE.Quaternion, opacity: number, color: THREE.Color) => number | null) forEachSplat: s }) { return A = A ?? 0.8, e = Math.max(1, Math.floor(e ?? 1)), new OA({ constructSplats: async (n) => new Promise((i, r) => { const a = new Image(); a.crossOrigin = "anonymous", a.onerror = r, a.onload = () => { const { width: o, height: g } = a, l = document.createElement("canvas"); l.width = o, l.height = g; const c = l.getContext("2d"); if (!c) { r(new Error("Failed to create canvas context")); return; } c.imageSmoothingEnabled = !0, c.imageSmoothingQuality = "high"; const u = Math.round(o / e), h = Math.round(g / e); c.drawImage(a, 0, 0, u, h); try { const E = c.getImageData(0, 0, u, h), C = new Uint8Array(E.data.buffer), B = new I.Vector3(), Q = new I.Vector3().setScalar(A), p = new I.Quaternion(0, 0, 0, 1), f = new I.Color(); let d = 0; for (let w = 0; w < h; ++w) for (let D = 0; D < u; ++D) { const x = d * 4, y = C[x + 3]; if (y > 0) { let m = y / 255; f.set( C[x + 0] / 255, C[x + 1] / 255, C[x + 2] / 255 ), B.set( D - 0.5 * (u - 1), 0.5 * (h - 1) - w, 0 ), Q.setScalar(A), p.set(0, 0, 0, 1); let k = !0; if (s) { const M = s( u, h, d, B, Q, p, m, f ); m = M ?? m, k = M !== null; } k && n.pushSplat(B, Q, p, m, f); } d += 1; } i(); } catch (E) { r(E); } }, a.src = t; }) }); } function gh({ box: t, cells: A, dotScale: e, color: s, opacity: n }) { 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)), n = n ?? 1; const i = A.x * A.y * A.z, r = J("int", A.x), a = J("int", A.y); J("int", A.z); const o = HA(0), g = new $t({ numSplats: i, generator: vA( { index: "int" }, { gsplat: AA }, ({ index: c }) => { if (!c) throw new Error("index is undefined"); const u = _e(c, r), h = ie(c, r), E = _e(h, a), C = ie(h, a), B = $A({ vectorType: "ivec3", x: u, y: E, z: C }), Q = Ar(o), p = $A({ vectorType: "ivec2", x: c, y: Q }), f = na(p), d = J("vec3", t.min), w = J("vec3", t.max), D = pt(w, d), x = ie(BA(Et(B), f), J("vec3", A)); let y, m, k; s ? (y = J("float", s.r), m = J("float", s.g), k = J("float", s.b)) : { r: y, g: m, b: k } = Qt(x).outputs; const M = $A({ vectorType: "vec4", r: y, g: m, b: k, a: J("float", n) }), S = BA(d, iA(D, x)), U = Et(J("float", e)), F = J("vec4", new I.Quaternion(0, 0, 0, 1)); let b = at({ flags: ae("uint", "GSPLAT_FLAG_ACTIVE"), index: c, center: S, scales: U, quaternion: F, rgba: M }); return b = l.applyGsplat(b), { gsplat: b }; }, { globals: () => [bA] } ), update: ({ time: c }) => { o.value = c, l.update(g), g.updateVersion(); } }), l = new xt(); return g; } const lh = { box: new I.Box3( new I.Vector3(-1, -1, -1), new I.Vector3(1, 1, 1) ), density: 100, fallDirection: new I.Vector3(-1, -3, 1).normalize(), fallVelocity: 0.02, wanderScale: 0.04, wanderVariance: 2, color1: new I.Color(1, 1, 1), color2: new I.Color(0.5, 0.5, 1), minScale: 1e-3, maxScale: 5e-3, anisoScale: new I.Vector3(1, 1, 1) }, Ih = { box: new I.Box3( new I.Vector3(-2, -1, -2), new I.Vector3(2, 5, 2) ), density: 10, fallDirection: new I.Vector3(0, -1, 0), fallVelocity: 2, wanderScale: 0.1, wanderVariance: 1, color1: new I.Color(1, 1, 1), color2: new I.Color(0.25, 0.25, 0.5), minScale: 5e-3, maxScale: 0.01, anisoScale: new I.Vector3(0.1, 1, 0.1) }; function uh({ // min and max box extents of the snowBox box: t, // minimum y-coordinate to clamp particle position, which can be used to // fake hitting a ground plane and lingering there for a bit minY: A, // number of Gsplats to generate (default: calculated from box and density) numSplats: e, // density of Gsplats per unit volume (default: 100) density: s, // The xyz anisotropic scale of the Gsplat, which can be used for example // to elongate rain particles (default: (1, 1, 1)) anisoScale: n, // Minimum Gsplat particle scale (default: 0.001) minScale: i, // Maximum Gsplat particle scale (default: 0.005) maxScale: r, // The average direction of fall (default: (0, -1, 0)) fallDirection: a, // The average speed of the fall (multiplied with fallDirection) (default: 0.02) fallVelocity: o, // The world scale of wandering overlay motion (default: 0.01) wanderScale: g, // Controls how uniformly the particles wander in sync, more variance mean // more randomness in the motion (default: 2) wanderVariance: l, // Color 1 of the two colors interpolated between (default: (1, 1, 1)) color1: c, // Color 2 of the two colors interpolated between (default: (0.5, 0.5, 1)) color2: u, // The base opacity of the Gsplats (default: 1) opacity: h, // Optional callback function to call each frame. onFrame: E }) { t = t ?? new I.Box3(new I.Vector3(-1, -1, -1), new I.Vector3(1, 1, 1)); const C = (t.max.x - t.min.x) * (t.max.y - t.min.y) * (t.max.z - t.min.z); s = s ?? 100, e = e ?? Math.max(1, Math.min(1e6, Math.round(C * s))); const B = HA(i ?? 1e-3), Q = HA(r ?? 5e-3), p = et( ((n == null ? void 0 : n.clone()) ?? new I.Vector3(1, 1, 1)).normalize() ), f = et( (a ?? new I.Vector3(0, -1, 0)).normalize() ), d = HA(o ?? 0.02), w = HA(g ?? 0.01), D = HA(l ?? 2), x = et(c ?? new I.Color(1, 1, 1)), y = et(u ?? new I.Color(0.5, 0.5, 1)), m = HA(h ?? 1), k = HA(0), M = et(new I.Vector3(0, 0, 0)), S = et(t.min), U = et(t.max), F = HA(A ?? Number.NEGATIVE_INFINITY), b = pt(U, S), T = new $t({ numSplats: e, generator: vA( { index: "int" }, { gsplat: AA }, ({ index: X }) => { if (!X) throw new Error("index not defined"); const _ = ze(X), eA = Qt(_).outputs.w; let q = Et(_), O = re(iA(eA, J("float", 100))); O = He(iA(ae("float", "PI"), O)), O = BA(B, iA(O, pt(Q, B))); const L = iA(O, p), j = re(iA(eA, J("float", 10))), P = re(eA), W = si(x, y, P), G = iA(W, j), pA = ze( $A({ vectorType: "ivec2", x: X, y: J("int", 6837) }) ); let gA = Et(pA), fA = iA(Qt(pA).outputs.w, D); fA = BA(k, fA), q = BA(q, M); const dA = ti( q, J("vec3", new I.Vector3(1, 1, 1)) ); q = BA(S, iA(b, dA)); const xA = J("vec4", new I.Quaternion(0, 0, 0, 1)); gA = He(BA(Et(fA), gA)), gA = iA(gA, w); let CA = BA(q, gA), YA = Qt(CA).outputs.y; YA = ei(F, YA), CA = $A({ vector: CA, y: YA }); let SA = at({ flags: ae("uint", "GSPLAT_FLAG_ACTIVE"), index: X, center: CA, scales: L, quaternion: xA, rgb: G, opacity: m }); return SA = R.applyGsplat(SA), { gsplat: SA }; }, { globals: () => [bA] } ), update: ({ object: X, time: _, deltaTime: eA }) => { k.value = _, R.update(T); const q = f.value.clone().multiplyScalar(d.value * eA); M.value.add(q), X.visible = m.value > 0, E == null || E({ object: X, time: _, deltaTime: eA }), T.updateVersion(); } }), R = new xt(); return { snow: T, min: S, max: U, minY: F, color1: x, color2: y, opacity: m, fallVelocity: d, wanderVariance: D, wanderScale: w, fallDirection: f, minScale: B, maxScale: Q, anisoScale: p }; } const jh = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, DEFAULT_RAIN: Ih, DEFAULT_SNOW: lh, snowBox: uh, staticBox: gh }, Symbol.toStringTag, { value: "Module" })); function io(t) { return vA({ gsplat: AA }, { gsplat: AA }, ({ gsplat: A }) => { if (!A) throw new Error("No gsplat input"); let e = Ge(A); const s = t.applyGsplat(A), n = ht(s).outputs.center, i = Ge(s), r = kr(n, i), a = Ui(r, J("float", 0)); e = os(a, as(e), e); const o = BA( iA(e, J("float", 0.5)), J("float", 0.5) ); return A = at({ gsplat: A, rgb: o }), { gsplat: A }; }); } function hh(t) { t.enableWorldToView = !0, t.worldModifier = io(t.context.worldToView), t.updateGenerator(); } function ro(t, A, e, s) { return vA({ gsplat: AA }, { gsplat: AA }, ({ gsplat: n }) => { if (!n) throw new Error("No gsplat input"); let { center: i } = ht(n).outputs; i = t.apply(i); const { z: r } = Qt(i).outputs; let a = ia(as(r), A, e); return a = os(s, pt(J("float", 1), a), a), n = at({ gsplat: n, r: a, g: a, b: a }), { gsplat: n }; }); } function Ch(t, A, e, s) { t.enableWorldToView = !0; const n = J("float", A), i = J("float", e), r = J("bool", s ?? !1); return t.worldModifier = ro( t.context.worldToView, n, i, r ), t.updateGenerator(), { minDepth: n, maxDepth: i, reverse: r }; } const Wh = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, makeDepthColorModifier: ro, makeNormalColorModifier: io, setDepthColor: Ch, setWorldNormalColor: hh }, Symbol.toStringTag, { value: "Module" })), qt = class qt { static createButton(A, e = {}) { const s = navigator.xr; if (!s) return null; const n = s, i = document.createElement("button"); A.xr.enabled = !0, A.xr.setReferenceSpaceType("local"); function r() { let c = null; async function u(C) { console.log("onSessionStarted"), C.addEventListener("end", h), await A.xr.setSession(C), i.textContent = "EXIT VR", c = C; } function h() { console.log("onSessionEnded"), c == null || c.removeEventListener("end", h), i.textContent = "ENTER VR", c = null; } i.style.display = "", i.style.cursor = "pointer", i.style.left = "calc(50% - 100px)", i.style.width = "200px", i.style.height = "100px", i.textContent = "ENTER VR"; const E = { ...e, optionalFeatures: [ // "local-floor", // "bounded-floor", // "layers", ...e.optionalFeatures || [] ] }; i.onmouseenter = () => { i.style.opacity = "1.0"; }, i.onmouseleave = () => { i.style.opacity = "0.5"; }, i.onclick = () => { c === null ? (console.log("requesting session"), n.requestSession("immersive-vr", E).then( u )) : (console.log("ending session"), c.end()); }; } function a() { i.style.display = "none", i.style.cursor = "auto", i.style.left = "calc(50% - 75px)", i.style.width = "150px", i.onmouseenter = null, i.onmouseleave = null, i.onclick = null; } function o() { a(), i.textContent = "VR NOT SUPPORTED"; } function g(c) { a(), console.warn( "Exception when trying to call xr.isSessionSupported", c ), i.textContent = "VR NOT ALLOWED"; } function l(c) { c.style.position = "absolute", c.style.bottom = "20px", c.style.padding = "12px 6px", c.style.border = "1px solid #fff", c.style.borderRadius = "4px", c.style.background = "rgba(0,0,0,0.1)", c.style.color = "#fff", c.style.font = "normal 13px sans-serif", c.style.textAlign = "center", c.style.opacity = "0.5", c.style.outline = "none", c.style.zIndex = "999"; } return i.id = "VRButton", i.style.display = "none", l(i), n.isSessionSupported("immersive-vr").then((c) => { c ? r() : o(), c && qt.xrSessionIsGranted && i.click(); }).catch(g), i; } static registerSessionGrantedListener() { const A = navigator.xr; if (!A) return null; const e = A; /WebXRViewer\//i.test(navigator.userAgent) || e.addEventListener("sessiongranted", () => { qt.xrSessionIsGranted = !0; }); } }; qt.xrSessionIsGranted = !1; let Ze = qt; Ze.registerSessionGrantedListener(); const Bh = 0.5, Eh = 0.5, Qh = 0; var Is = /* @__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))(Is || {}); const ao = Object.keys(Is), AC = ao.length, tC = { 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 }, se = { 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 }, ph = [ ["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"] ], fh = [ [8, 10, 8, 6], [8, 19, 14, 8, 6], [8, 19, 14, 8, 6], [8, 19, 14, 8, 6], [8, 19, 14, 8, 6] ], eC = ["t3", "i4", "m4", "r4", "p4"], sC = ["i4", "m4", "r4", "p4"]; var oo = /* @__PURE__ */ ((t) => (t.left = "left", t.right = "right", t))(oo || {}); const Xe = Object.keys(oo); class nC { constructor() { this.hands = {}, this.last = {}, this.values = {}, this.tests = {}, this.lastTests = {}, this.updated = !1; } update({ xr: A, xrFrame: e }) { const s = A.getSession(); if (!s) return; const n = A.getReferenceSpace(); if (n && e.getJointPose) { this.last = this.hands, this.lastTests = this.tests, this.hands = {}, this.values = {}, this.tests = {}; for (const i of s.inputSources) { if (!i.hand) continue; const r = i.handedness; this.hands[r] = {}; for (const a of ao) { const o = i.hand.get(Is[a]); if (o) { const g = e.getJointPose(o, n); if (g) { const { position: l, orientation: c } = g.transform; this.hands[r][a] = { position: new _A(l.x, l.y, l.z), quaternion: new hs( c.x, c.y, c.z, c.w ), radius: g.radius || 1e-3 }; } } } } for (const i of Xe) for (const { key: r, value: a } of [ { key: `${i}AllTips`, value: this.allTipsTouching(i) }, { key: `${i}IndexThumb`, value: this.touching(i, "i4", i, "t3") }, { key: `${i}MiddleThumb`, value: this.touching(i, "m4", i, "t3") }, { key: `${i}RingThumb`, value: this.touching(i, "r4", i, "t3") }, { key: `${i}PinkyThumb`, value: this.touching(i, "p4", i, "t3") }, { key: `${i}TriTips`, value: this.triTipsTouching(i) } ]) this.values[r] = a, this.tests[r] = a === 1 ? !0 : a === 0 ? !1 : this.lastTests[r] ?? !1; } } makeGhostMesh() { const A = new _A(), e = new _A(0.01, 0.01, 0.01), s = new hs(0, 0, 0, 1), n = new Cs(1, 1, 1), i = Math.PI * 3; new Cs(1, 1, 1); let r = 1; const a = new OA({ onFrame: () => { let o = 0; for (const g of Xe) { const l = this.hands[g]; for (const [c, u] of ph.entries()) for (let h = 1; h < u.length; ++h) { const E = fh[c][h - 1] * 2, C = h + 1 === u.length, B = l == null ? void 0 : l[u[h - 1]], Q = l == null ? void 0 : l[u[h]]; for (let p = 0; p < E; ++p) { const f = (p + 0.5) / E; if (r = 0, B && Q) { A.copy(B.position).lerp(Q.position, f), s.copy(B.quaternion).slerp(Q.quaternion, f); const d = se[u[h - 1]], w = se[u[h]]; let D = (1 - f) * d + f * w; C && f > 0.8 && (D *= Math.sqrt(1 - ((f - 0.8) / 0.2) ** 2)), e.set(0.65 * D, 0.5 * D, 3e-3), n.set( 0.55 + 0.45 * Math.sin(A.x * i), 0.55 + 0.45 * Math.sin(A.y * i), 0.55 + 0.45 * Math.sin(A.z * i) ), g === "right" && n.set(1 - n.r, 1 - n.g, 1 - n.b), r = 0.75; } a.packedSplats.setSplat( o, A, e, s, r, n ), o += 1; } } } a.packedSplats.numSplats = o, a.packedSplats.needsUpdate = !0, a.numSplats = o, a.updateVersion(); } }); return a; } distance(A, e, s, n, i = !1) { const r = i ? this.last[A] : this.hands[A], a = i ? this.last[s] : this.hands[s], o = r == null ? void 0 : r[e], g = a == null ? void 0 : a[n]; return !o || !g ? Number.POSITIVE_INFINITY : o.position.distanceTo(g.position); } separation(A, e, s, n, i = !1) { const r = this.distance(A, e, s, n, i); return r === Number.POSITIVE_INFINITY ? Number.POSITIVE_INFINITY : r - se[e] - se[n]; } touching(A, e, s, n, i = !1) { const r = this.separation(A, e, s, n, i); return r === Number.POSITIVE_INFINITY ? Number.POSITIVE_INFINITY : 1 - Math.max(0, Math.min(1, r / 0.01 - Qh)); } 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 iC { constructor({ xrHands: A, control: e, moveInertia: s, rotateInertia: n }) { this.lastGrip = {}, this.lastPivot = new _A(), this.rotateVelocity = 0, this.velocity = new _A(), this.xrHands = A, this.control = e, this.moveInertia = s ?? Bh, this.rotateInertia = n ?? Eh; } update(A) { var i, r, a, o, g; const e = {}; for (const l of Xe) { const c = this.xrHands.hands[l]; c && this.xrHands.tests[`${l}MiddleThumb`] && (e[l] = new _A().add(((i = c.t3) == null ? void 0 : i.position) ?? new _A()).add(((r = c.i4) == null ? void 0 : r.position) ?? new _A()).add(((a = c.m4) == null ? void 0 : a.position) ?? new _A()).add(((o = c.r4) == null ? void 0 : o.position) ?? new _A()).add(((g = c.p4) == null ? void 0 : g.position) ?? new _A()).multiplyScalar(1 / 5)); } if (e.left && e.right && this.lastGrip.left && this.lastGrip.right) { const l = e.left.clone().add(e.right).multiplyScalar(0.5), c = this.lastGrip.left.clone().add(this.lastGrip.right).multiplyScalar(0.5); this.lastPivot = l; const u = l.clone().applyMatrix4(this.control.matrix); u.sub(c.clone().applyMatrix4(this.control.matrix)), u.multiplyScalar(1 / A), this.velocity.lerp(u, 1 - Math.exp(-20 * A)); const h = Math.atan2(e.left.z - l.z, e.left.x - l.x), E = Math.atan2( this.lastGrip.left.z - c.z, this.lastGrip.left.x - c.x ); let C = h - E; C > Math.PI ? C -= Math.PI * 2 : C < -Math.PI && (C += Math.PI * 2); const B = C / A, Q = Math.exp(-20 * A); this.rotateVelocity = this.rotateVelocity * Q + B * (1 - Q); } else if (this.rotateVelocity *= Math.exp(-A / this.rotateInertia), e.left && this.lastGrip.left) { const l = e.left.clone().applyMatrix4(this.control.matrix); l.sub(this.lastGrip.left.clone().applyMatrix4(this.control.matrix)), l.multiplyScalar(1 / A), this.velocity.lerp(l, 1 - Math.exp(-20 * A)); } else if (e.right && this.lastGrip.right) { const l = e.right.clone().applyMatrix4(this.control.matrix); l.sub( this.lastGrip.right.clone().applyMatrix4(this.control.matrix) ), l.multiplyScalar(1 / A), this.velocity.lerp(l, 1 - Math.exp(-20 * A)); } else this.velocity.multiplyScalar(Math.exp(-A / this.moveInertia)); const s = this.lastPivot.clone().negate(), n = new Se().makeTranslation(s).premultiply(new Se().makeRotationY(this.rotateVelocity * A)).premultiply(new Se().makeTranslation(this.lastPivot)); this.control.matrix.multiply(n), 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 dh = 1, yh = 2, wh = 2e-3, mh = 6e-3, xh = 15e-4, Sh = 0.15, Dh = 0.15, Mh = 0.1, vh = 2, bh = 1, Fh = 200, Nh = 400, kh = 50, Th = { KeyW: new I.Vector3(0, 0, -1), KeyS: new I.Vector3(0, 0, 1), KeyA: new I.Vector3(-1, 0, 0), KeyD: new I.Vector3(1, 0, 0), KeyR: new I.Vector3(0, 1, 0), KeyF: new I.Vector3(0, -1, 0) }, Uh = { ArrowUp: new I.Vector3(0, 0, -1), ArrowDown: new I.Vector3(0, 0, 1), ArrowLeft: new I.Vector3(-1, 0, 0), ArrowRight: new I.Vector3(1, 0, 0), PageUp: new I.Vector3(0, 1, 0), PageDown: new I.Vector3(0, -1, 0) }, Gh = { KeyQ: new I.Vector3(0, 0, 1), KeyE: new I.Vector3(0, 0, -1) }, Rh = { Home: new I.Vector3(0, -1, 0), End: new I.Vector3(0, 1, 0), Insert: new I.Vector3(-1, 0, 0), Delete: new I.Vector3(1, 0, 0) }; class rC { constructor({ canvas: A }) { this.lastTime = 0, this.fpsMovement = new Yh({}), this.pointerControls = new Jh({ canvas: A }); } update(A) { const e = performance.now(), s = (e - (this.lastTime || e)) / 1e3; this.lastTime = e, this.fpsMovement.update(s, A), this.pointerControls.update(s, A); } } class Yh { constructor({ moveSpeed: A, rollSpeed: e, stickThreshold: s, rotateSpeed: n, keycodeMoveMapping: i, keycodeRotateMapping: r, gamepadMapping: a, capsMultiplier: o, shiftMultiplier: g, ctrlMultiplier: l, xr: c } = {}) { this.enable = !0, this.moveSpeed = A ?? dh, this.rollSpeed = e ?? yh, this.stickThreshold = s ?? Mh, this.rotateSpeed = n ?? vh, this.keycodeMoveMapping = i ?? { ...Th, ...Uh }, this.keycodeRotateMapping = r ?? { ...Gh, ...Rh }, this.gamepadMapping = a ?? { 4: "rollLeft", 5: "rollRight", 6: "ctrl", 7: "shift" }, this.capsMultiplier = o ?? 10, this.shiftMultiplier = g ?? 5, this.ctrlMultiplier = l ?? 1 / 5, this.xr = c, this.keydown = {}, this.keycode = {}, document.addEventListener("keydown", (u) => { this.keydown[u.key] = !0, this.keycode[u.code] = !0; }), document.addEventListener("keyup", (u) => { this.keydown[u.key] = !1, this.keycode[u.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 l, c; if (!this.enable) return; const s = [new I.Vector2(), new I.Vector2()], n = navigator.getGamepads()[0]; n && (s[0].set(n.axes[0], n.axes[1]), s[1].set(n.axes[2], n.axes[3])); const i = (n == null ? void 0 : n.buttons.map((u) => u.pressed)) || [], r = Array.from(((c = (l = this.xr) == null ? void 0 : l.getSession()) == null ? void 0 : c.inputSources) ?? []); for (const u of r) { const h = u.gamepad; if (h) switch (u.handedness) { case "none": { s[0].x += h.axes[0], s[0].y += h.axes[1], s[1].x += h.axes[2], s[1].y += h.axes[3]; break; } case "left": { s[0].x += h.axes[2], s[0].y += h.axes[3]; break; } case "right": { s[1].x += h.axes[2], s[1].y += h.axes[3]; break; } } } for (const u of s) u.x = Math.abs(u.x) >= this.stickThreshold ? u.x : 0, u.y = Math.abs(u.y) >= this.stickThreshold ? u.y : 0; const a = new I.Vector3( s[1].x, s[1].y, 0 ).multiplyScalar(this.rotateSpeed); for (const [u, h] of Object.entries(this.keycodeRotateMapping)) this.keycode[u] && a.add(h); for (const u in this.gamepadMapping) if (i[Number.parseInt(u)]) switch (this.gamepadMapping[u]) { case "rollLeft": a.z += 1; break; case "rollRight": a.z -= 1; break; } if (a.multiply( new I.Vector3(this.rotateSpeed, this.rotateSpeed, this.rollSpeed) ), a.manhattanLength() > 0) { a.multiplyScalar(A); const u = new I.Euler().setFromQuaternion( e.quaternion, "YXZ" ); u.y -= a.x, u.x = Math.max( -Math.PI / 2, Math.min(Math.PI / 2, u.x - a.y) ), u.z = Math.max(-Math.PI, Math.min(Math.PI, u.z + a.z)), e.quaternion.setFromEuler(u); } const o = new I.Vector3(s[0].x, 0, s[0].y); for (const [u, h] of Object.entries(this.keycodeMoveMapping)) this.keycode[u] && o.add(h); let g = 1; this.keydown.CapsLock && (g *= this.capsMultiplier), (this.keycode.ShiftLeft || this.keycode.ShiftRight) && (g *= this.shiftMultiplier), (this.keycode.ControlLeft || this.keycode.ControlRight) && (g *= this.ctrlMultiplier); for (const u in this.gamepadMapping) if (i[Number.parseInt(u)]) switch (this.gamepadMapping[u]) { case "shift": g *= this.shiftMultiplier; break; case "ctrl": g *= this.ctrlMultiplier; break; } o.applyQuaternion(e.quaternion), e.position.add( o.multiplyScalar(this.moveSpeed * g * A) ); } } class Jh { constructor({ // The HTML canvas element to attach pointer events to canvas: A, // Speed of rotation (default DEFAULT_ROTATE_SPEED) rotateSpeed: e, // Speed of sliding when dragging with right/middle mouse button or two fingers // (default DEFAULT_SLIDE_SPEED) slideSpeed: s, // Speed of movement when using mouse scroll wheel (default DEFAULT_SCROLL_SPEED) scrollSpeed: n, // Swap the direction of rotation and sliding (default: false) swapRotateSlide: i, // Reverse the direction of rotation (default: false) reverseRotate: r, // Reverse the direction of sliding (default: false) reverseSlide: a, // Reverse the direction of swipe gestures (default: false) reverseSwipe: o, // Reverse the direction of scroll wheel movement (default: false) reverseScroll: g, // Inertia factor for movement (default: DEFAULT_MOVE_INERTIA) moveInertia: l, // Inertia factor for rotation (default: DEFAULT_ROTATE_INERTIA) rotateInertia: c, // Pointer rolling scale factor (default: DEFAULT_POINTER_ROLL_SCALE) pointerRollScale: u, // Callback for double press events (default: () => {}) doublePress: h }) { this.enable = !0, this.canvas = A, this.rotateSpeed = e ?? wh, this.slideSpeed = s ?? mh, this.scrollSpeed = n ?? xh, this.swapRotateSlide = i ?? !1, this.reverseRotate = r ?? !1, this.reverseSlide = a ?? !1, this.reverseSwipe = o ?? !1, this.reverseScroll = g ?? !1, this.moveInertia = l ?? Dh, this.rotateInertia = c ?? Sh, this.pointerRollScale = u ?? bh, this.doublePress = h ?? (() => { }), this.doublePressLimitMs = Nh, this.doublePressDistance = kh, this.lastUp = null, this.rotating = null, this.sliding = null, this.dualPress = !1, this.scroll = new I.Vector3(), this.rotateVelocity = new I.Vector3(), this.moveVelocity = new I.Vector3(), A.addEventListener("pointerdown", (C) => { const B = this.getPointerPosition(C), Q = B.clone(), p = B.clone(), f = !this.swapRotateSlide && !this.rotating && (C.pointerType !== "mouse" || C.button === 0) || this.swapRotateSlide && this.sliding && !this.rotating && (C.pointerType !== "mouse" || C.button === 1), { pointerId: d, timeStamp: w } = C; if (f) this.rotating = { initial: Q, last: p, position: B, pointerId: d, timeStamp: w }, A.setPointerCapture(C.pointerId), this.dualPress = !1; else if (!this.sliding) { const D = C.pointerType === "mouse" ? C.button : void 0; this.sliding = { initial: Q, last: p, position: B, pointerId: d, button: D, timeStamp: w }, A.setPointerCapture(C.pointerId), this.dualPress = this.rotating != null && w - this.rotating.timeStamp < Fh; } }); const E = (C) => { var p, f; ((p = this.rotating) == null ? void 0 : p.pointerId) === C.pointerId ? (this.rotating = null, A.releasePointerCapture(C.pointerId), this.dualPress && this.sliding && (A.releasePointerCapture(this.sliding.pointerId), this.sliding = null)) : ((f = this.sliding) == null ? void 0 : f.pointerId) === C.pointerId && (this.sliding = null, A.releasePointerCapture(C.pointerId), this.dualPress && this.rotating && (A.releasePointerCapture(this.rotating.pointerId), this.rotating = null)); const B = this.getPointerPosition(C), Q = this.lastUp; if (this.lastUp = { position: B, time: C.timeStamp }, Q && Q.position.distanceTo(B) < this.doublePressDistance) { const w = C.timeStamp - Q.time; w < this.doublePressLimitMs && (this.lastUp = null, this.doublePress({ position: B, intervalMs: w })); } }; document.addEventListener("pointerup", E), document.addEventListener("pointercancel", E), document.addEventListener("pointermove", (C) => { var B, Q; ((B = this.rotating) == null ? void 0 : B.pointerId) === C.pointerId ? this.rotating.position = this.getPointerPosition(C) : ((Q = this.sliding) == null ? void 0 : Q.pointerId) === C.pointerId && (this.sliding.position = this.getPointerPosition(C)); }), A.addEventListener("contextmenu", (C) => { C.preventDefault(); }), A.addEventListener("wheel", (C) => { this.scroll.add( new I.Vector3(C.deltaX, C.deltaY, C.deltaZ) ), C.preventDefault(); }); } getPointerPosition(A) { const e = this.canvas.getBoundingClientRect(); return new I.Vector2( A.clientX - e.left, A.clientY - e.top ); } update(A, e) { if (!this.enable) return; if (this.dualPress && this.rotating && this.sliding) { const n = [ this.rotating.position.clone().sub(this.rotating.last), this.sliding.position.clone().sub(this.sliding.last) ], i = n[0].dot(n[1]); if (i >= 0.2) { const r = n[0].clone().add(n[1]), a = new I.Vector3(r.x, -r.y, 0); a.multiplyScalar(this.slideSpeed * (this.reverseSwipe ? 1 : -1)), a.applyQuaternion(e.quaternion), e.position.add(a), this.moveVelocity = a.clone().multiplyScalar(1 / A); } else if (i <= -0.2) { const r = this.sliding.last.clone().sub(this.rotating.last), a = r.length(); r.multiplyScalar(1 / a).normalize(); const o = new I.Vector2(-r.y, r.x), g = [n[0].dot(r), n[1].dot(r)], l = [n[0].dot(o), n[1].dot(o)], c = this.rotating.last.clone().add(this.sliding.last).multiplyScalar(0.5); let u = new I.Vector3(); if (e instanceof I.Camera) { const p = new I.Vector2( c.x / this.canvas.clientWidth * 2 - 1, -(c.y / this.canvas.clientHeight) * 2 + 1 ), f = new I.Raycaster(); f.setFromCamera(p, e), u = f.ray.direction; } const h = g[1] - g[0], E = u.multiplyScalar(h * this.slideSpeed); e.position.add(E), this.moveVelocity = E.clone().multiplyScalar(1 / A); const C = [ Math.atan(l[0] / (-0.5 * a)), Math.atan(l[1] / (0.5 * a)) ], B = 0.5 * (C[0] + C[1]) * this.pointerRollScale, Q = new I.Euler().setFromQuaternion( e.quaternion, "YXZ" ); Q.z = Math.max( -Math.PI, Math.min(Math.PI, Q.z + 0.5 * B) ), e.quaternion.setFromEuler(Q); } this.rotating.last.copy(this.rotating.position), this.sliding.last.copy(this.sliding.position); } else { const n = new I.Vector3(); if (this.rotating && !this.dualPress) { const r = this.rotating.position.clone().sub(this.rotating.last); this.rotating.last.copy(this.rotating.position), n.set(r.x, r.y, 0), n.multiplyScalar(this.rotateSpeed * (this.reverseRotate ? -1 : 1)), this.rotateVelocity = n.clone().multiplyScalar(1 / A); } else this.rotateVelocity.multiplyScalar( Math.exp(-A / this.rotateInertia) ), n.addScaledVector(this.rotateVelocity, A); const i = new I.Euler().setFromQuaternion( e.quaternion, "YXZ" ); if (i.y -= n.x, i.x = Math.max( -Math.PI / 2, Math.min(Math.PI / 2, i.x - n.y) ), i.z *= Math.exp(-0 * A), e.quaternion.setFromEuler(i), this.sliding && !this.dualPress) { const r = this.sliding.position.clone().sub(this.sliding.last); this.sliding.last.copy(this.sliding.position); const a = this.sliding.button !== 2 ? new I.Vector3(r.x, 0, r.y) : new I.Vector3(r.x, -r.y, 0); a.multiplyScalar(this.slideSpeed * (this.reverseSlide ? -1 : 1)), a.applyQuaternion(e.quaternion), e.position.add(a), this.moveVelocity = a.clone().multiplyScalar(1 / A); } else this.moveVelocity.multiplyScalar( Math.exp(-A / this.moveInertia) ), e.position.addScaledVector(this.moveVelocity, A); } const s = this.scroll.multiplyScalar(this.scrollSpeed); s.set(s.x, s.z, s.y), this.reverseScroll && s.multiplyScalar(-1), s.applyQuaternion(e.quaternion), e.position.add(s), this.scroll.set(0, 0, 0); } } export { sC as FINGER_TIPS, Yh as FpsMovement, Xe as HANDS, oo as Hand, iC as HandMovement, ao as JOINT_IDS, tC as JOINT_INDEX, se as JOINT_RADIUS, ph as JOINT_SEGMENTS, fh as JOINT_SEGMENT_STEPS, eC as JOINT_TIPS, Is as JointEnum, GA as LN_SCALE_MAX, UA as LN_SCALE_MIN, AC as NUM_JOINTS, VA as PackedSplats, Ie as PlyReader, Jh as PointerControls, ge as Readback, sg as Sint8ToFloat, rC as SparkControls, Ce as SparkRenderer, he as SparkViewpoint, Ne as SplatAccumulator, le as SplatEdit, Cu as SplatEditRgbaBlendMode, Eu as SplatEditSdf, uu as SplatEditSdfType, Qu as SplatEdits, _t as SplatFileType, $t as SplatGenerator, _u as SplatLoader, OA as SplatMesh, fu as SplatModifier, $h as SplatSkinning, xt as SplatTransformer, nh as SpzReader, st as SpzWriter, eg as Uint8ToFloat, Ze as VRButton, nC as XrHands, Ph as constructAxes, Vh as constructGrid, Zh as constructSpherePoints, Lh as defines, Hh as dyno, mg as flipPixels, ne as floatToSint8, FA as floatToUint8, wA as fromHalf, jh as generators, Xa as getSplatFileType, Oh as imageSplats, yg as isAndroid, dg as isMobile, wg as isOculus, qh as isPcSogs, Wh as modifiers, xg as pixelsToPngUrl, Re as setPackedSplat, Xh as textSplats, Bt as toHalf, Kh as transcodeSpz, Ye as unpackSplat, ja as unpackSplats, zh as utils }; //# sourceMappingURL=spark.module.min.js.map