import * as u from "three"; import { Mesh as Co, OrthographicCamera as Bo, BufferGeometry as Qo, Float32BufferAttribute as cs, Loader as Eo, FileLoader as fo, Quaternion as ls, Vector3 as JA, Color as Is, Matrix4 as Se } from "three"; const po = new Bo(-1, 1, 1, -1, 0, 1); class yo extends Qo { constructor() { super(), this.setAttribute("position", new cs([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3)), this.setAttribute("uv", new cs([0, 2, 0, 0, 2, 0], 2)); } } const wo = new yo(); class ys { constructor(A) { this._mesh = new Co(wo, A); } dispose() { this._mesh.geometry.dispose(); } render(A) { A.render(this._mesh, po); } get material() { return this._mesh.material; } set material(A) { this._mesh.material = A; } } var IA = Uint8Array, mt = Uint16Array, mo = Int32Array, ws = new IA([ 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 ]), ms = new IA([ 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 ]), xo = new IA([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]), xs = 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 mo(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 }; }, Ss = xs(ws, 2), Ds = Ss.b, So = Ss.r; Ds[28] = 258, So[258] = 28; var Do = xs(ms, 0), Mo = Do.b, Te = new mt(32768); for (var sA = 0; sA < 32768; ++sA) { var At = (sA & 43690) >> 1 | (sA & 21845) << 1; At = (At & 52428) >> 2 | (At & 13107) << 2, At = (At & 61680) >> 4 | (At & 3855) << 4, Te[sA] = ((At & 65280) >> 8 | (At & 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 c = n << 4 | t[n], l = A - t[n], g = r[t[n] - 1]++ << l, I = g | (1 << l) - 1; g <= I; ++g) a[Te[g] >> o] = c; } 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; }, $t = new IA(288); for (var sA = 0; sA < 144; ++sA) $t[sA] = 8; for (var sA = 144; sA < 256; ++sA) $t[sA] = 9; for (var sA = 256; sA < 280; ++sA) $t[sA] = 7; for (var sA = 280; sA < 288; ++sA) $t[sA] = 8; var Ms = new IA(32); for (var sA = 0; sA < 32; ++sA) Ms[sA] = 5; var vo = /* @__PURE__ */ Lt($t, 9, 1), bo = /* @__PURE__ */ Lt(Ms, 5, 1), De = function(t) { for (var A = t[0], e = 1; e < t.length; ++e) t[e] > A && (A = t[e]); return A; }, YA = 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); }, vs = function(t) { return (t + 7) / 8 | 0; }, Dt = function(t, A, e) { return (A == null || A < 0) && (A = 0), (e == null || e > t.length) && (e = t.length), new IA(t.subarray(A, e)); }, Fo = [ "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 || Fo[t]); if (s.code = t, Error.captureStackTrace && Error.captureStackTrace(s, yA), !e) throw s; return s; }, bs = function(t, A, e, s) { var n = t.length, i = s ? s.length : 0; if (!n || A.f && !A.l) return e || new IA(0); var r = !e, a = r || A.i != 2, o = A.i; r && (e = new IA(n * 3)); var c = function(dA) { var xA = e.length; if (dA > xA) { var hA = new IA(Math.max(xA * 2, dA)); hA.set(e), e = hA; } }, l = A.f || 0, g = A.p || 0, I = A.b || 0, h = A.l, B = A.d, C = A.m, Q = A.n, E = n * 8; do { if (!h) { l = YA(t, g, 1); var f = YA(t, g + 1, 3); if (g += 3, f) if (f == 1) h = vo, B = bo, C = 9, Q = 5; else if (f == 2) { var D = YA(t, g, 31) + 257, x = YA(t, g + 10, 15) + 4, y = D + YA(t, g + 5, 31) + 1; g += 14; for (var m = new IA(y), N = new IA(19), M = 0; M < x; ++M) N[xo[M]] = YA(t, g + M * 3, 7); g += x * 3; for (var S = De(N), U = (1 << S) - 1, F = Lt(N, S, 1), M = 0; M < y; ) { var b = F[YA(t, g, U)]; g += b & 15; var p = b >> 4; if (p < 16) m[M++] = p; else { var T = 0, R = 0; for (p == 16 ? (R = 3 + YA(t, g, 3), g += 2, T = m[M - 1]) : p == 17 ? (R = 3 + YA(t, g, 7), g += 3) : p == 18 && (R = 11 + YA(t, g, 127), g += 7); R--; ) m[M++] = T; } } var W = m.subarray(0, D), L = m.subarray(D); C = De(W), Q = De(L), h = Lt(W, C, 1), B = Lt(L, Q, 1); } else yA(1); else { var p = vs(g) + 4, d = t[p - 4] | t[p - 3] << 8, w = p + d; if (w > n) { o && yA(0); break; } a && c(I + d), e.set(t.subarray(p, w), I), A.b = I += d, A.p = g = w * 8, A.f = l; continue; } if (g > E) { o && yA(0); break; } } a && c(I + 131072); for (var eA = (1 << C) - 1, H = (1 << Q) - 1, O = g; ; O = g) { var T = h[Me(t, g) & eA], _ = T >> 4; if (g += T & 15, g > E) { o && yA(0); break; } if (T || yA(2), _ < 256) e[I++] = _; else if (_ == 256) { O = g, h = null; break; } else { var j = _ - 254; if (_ > 264) { var M = _ - 257, P = ws[M]; j = YA(t, g, (1 << P) - 1) + Ds[M], g += P; } var Z = B[Me(t, g) & H], G = Z >> 4; Z || yA(3), g += Z & 15; var L = Mo[G]; if (G > 3) { var P = ms[G]; L += Me(t, g) & (1 << P) - 1, g += P; } if (g > E) { o && yA(0); break; } a && c(I + 131072); var fA = I + j; if (I < L) { var cA = i - L, pA = Math.min(L, fA); for (cA + I < 0 && yA(3); I < pA; ++I) e[I] = s[cA + I]; } for (; I < fA; ++I) e[I] = e[I - L]; } } A.l = h, A.p = O, A.b = I, A.f = l, h && (l = 1, A.m = C, A.d = B, A.n = Q); } while (!l); return I != e.length && r ? Dt(e, 0, I) : e.subarray(0, I); }, ko = /* @__PURE__ */ new IA(0), zA = 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; }, No = 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 IA(32768), this.p = new IA(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 IA(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 = bs(this.p, this.s, this.o); this.ondata(Dt(s, e, this.s.b), this.d), this.o = Dt(s, this.s.b - 32768), this.s.b = this.o.length, this.p = Dt(this.p, this.s.p / 8 | 0), this.s.p &= 7; }, t.prototype.push = function(A, e) { this.e(A), this.c(e); }, t; }(); function To(t, A) { return bs(t, { i: 2 }, A && A.out, A && A.dictionary); } var Fs = /* @__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 ? No(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 = vs(this.s.p) + 9, this.s = { i: 0 }, this.o = new IA(0), this.push(new IA(0), e)); }, t; }(), Ue = typeof TextDecoder < "u" && /* @__PURE__ */ new TextDecoder(), Uo = 0; try { Ue.decode(ko, { stream: !0 }), Uo = 1; } catch { } var Go = 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: Dt(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 Ro(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 = Go(t), i = n.s, e = n.r; return e.length && yA(8), i; } } var Yo = function(t, A) { return A + 30 + zA(t, A + 26) + zA(t, A + 28); }, Jo = function(t, A, e) { var s = zA(t, A + 28), n = Ro(t.subarray(A + 46, A + 46 + s), !(zA(t, A + 8) & 2048)), i = A + 46 + s, r = LA(t, A + 20), a = e && r == 4294967295 ? Lo(t, i) : [r, LA(t, A + 24), LA(t, A + 42)], o = a[0], c = a[1], l = a[2]; return [zA(t, A + 10), o, c, n, i + zA(t, A + 30) + zA(t, A + 32), l]; }, Lo = function(t, A) { for (; zA(t, A) != 1; A += 4 + zA(t, A + 2)) ; return [ve(t, A + 12), ve(t, A + 4), ve(t, A + 20)]; }; function _o(t, A) { for (var e = {}, s = t.length - 22; LA(t, s) != 101010256; --s) (!s || t.length - s > 65558) && yA(13); var n = zA(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, c = 0; c < n; ++c) { var l = Jo(t, i, r), g = l[0], I = l[1], h = l[2], B = l[3], C = l[4], Q = l[5], E = Yo(t, Q); i = C, (!o || o({ name: B, size: I, originalSize: h, compression: g })) && (g ? g == 8 ? e[B] = To(t.subarray(E, E + I), { out: new IA(h) }) : yA(14, "unknown compression type " + g) : e[B] = Dt(t, E, E + I)); } return e; } let XA; const ks = typeof TextDecoder < "u" ? new TextDecoder("utf-8", { ignoreBOM: !0, fatal: !0 }) : { decode: () => { throw Error("TextDecoder not available"); } }; typeof TextDecoder < "u" && ks.decode(); let Rt = null; function zo() { return (Rt === null || Rt.byteLength === 0) && (Rt = new Uint8Array(XA.memory.buffer)), Rt; } function qo(t, A) { return t = t >>> 0, ks.decode(zo().subarray(t, t + A)); } function Ho(t, A, e, s, n, i, r, a, o, c, l, g, I) { return XA.raycast_splats(t, A, e, s, n, i, r, a, o, c, l, g, I); } async function Ko(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 $o() { 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(qo(A, e)); }, t; } function Vo(t, A) { return XA = t.exports, Ns.__wbindgen_wasm_module = A, Rt = null, XA.__wbindgen_start(), XA; } async function Ns(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/YAF/AX9gA39/fwBgAX8AYAV/f39/fwBgA29/fwFvYAV/f39/fwF/YAFvAW9gA29vfwBgAW8Bf2AAAX9gBH9/f38AYAAAYAR/f39/AX9gA39vbwF/YAF/AW9gAAFvYAF9AX1gBn9/f39/fwBgDX19fX19fX19f29/fX0Bb2AGf39/f39/AX9gBX9/fH9/AGAEf3x/fwBgBX9/fX9/AGAEf31/fwBgBX9/fn9/AGAEf35/fwBgAn19AX0C8gQRA3diZx1fX3diZ19idWZmZXJfNjA5Y2MzZWVlNTFlZDE1OAAJA3diZxpfX3diZ19uZXdfOWZlZTk3YTQwOWIzMmI2OAAJA3diZxpfX3diZ19zZXRfZjRmMWYwZGFhMzA2OTZmYwAKA3diZx1fX3diZ19sZW5ndGhfOGNmZDJjNjQwOWFmODhhZAALA3diZzFfX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9mMWRlYWQ0NGQxZmM3MjEyAAcDd2JnGl9fd2JnX25ld19lM2IzMjFkY2ZlZjg5ZmM3AAkDd2JnGl9fd2JnX3NldF9kMjM2NjFkMTkxNDhiMjI5AAoDd2JnHV9fd2JnX2xlbmd0aF82Y2E1Mjc2NjVkODk2OTRkAAsDd2JnMV9fd2JnX25ld3dpdGhieXRlb2Zmc2V0YW5kbGVuZ3RoX2U2YjdlNjlhY2Q0YzczNTQABwN3YmcaX193Ymdfc2V0XzEwYmFkOWJlZTBlOWM1OGIACgN3YmcdX193YmdfbGVuZ3RoXzNiNGYwMjIxODhhZThkYjYACwN3YmcfX193Ymdfc3ViYXJyYXlfNzY5ZTFlMGY4MWJiMjU5YgAHA3diZx9fX3diZ19zdWJhcnJheV8zYWFlZWM4OWJiMjU0NGYwAAcDd2JnJF9fd2JnX25ld3dpdGhsZW5ndGhfNWE1ZWZlMzEzY2ZkNTlmMQARA3diZxBfX3diaW5kZ2VuX3Rocm93AAEDd2JnEV9fd2JpbmRnZW5fbWVtb3J5ABIDd2JnH19fd2JpbmRnZW5faW5pdF9leHRlcm5yZWZfdGFibGUADgNhYAMAAQIIBQQCEwEMAAEBAgAAAQwBBAYFBQQAAQYFFAENBAAGBQQEAQQOAgECAQAIBAAVARYG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ACIDKAIEQXhxRgRAIAMhAgwBCyABQRkgAkEBdmtBACACQR9HG3QhBQNAIAMgBUEddkEEcWpBEGoiBCgCACICRQ0CIAVBAXQhBSACIQMgAigCBEF4cSABRw0ACwsgAigCCCIBIAA2AgwgAiAANgIIIABBADYCGCAAIAI2AgwgACABNgIIDwsgBCAANgIAIAAgAzYCGCAAIAA2AgwgACAANgIIC/MCAQR/IwBBMGsiACQAAkACQEGQksAAKAIARQRAQaiSwAAoAgAhAUGoksAAQQA2AgAgAUUNASAAQRhqIAERBQAgAEEQaiICIABBJGopAgA3AwAgACAAKQIcNwMIIAAoAhghAUGQksAAKAIAIgMNAgJAIANFDQBBlJLAACgCACICRQ0AQZiSwAAoAgAgAkECdBBlC0GUksAAIAE2AgBBkJLAAEEBNgIAQZiSwAAgACkDCDcCAEGgksAAIABBEGopAwA3AgALIABBMGokAEGUksAADwsgAEEANgIoIABBATYCHCAAQaCHwAA2AhggAEIENwIgIABBGGpBiIjAABBDAAsgAEEoaiACKQMANwIAIAAgACkDCDcCICAAIAE2AhwgAEEBNgIYAkAgAEEYaiIBKAIARQ0AIAEoAgQiAkUNACABKAIIIAJBAnQQZQsgAEEANgIoIABBATYCHCAAQaiIwAA2AhggAEIENwIgIAFBsIjAABBDAAuoAgIDfwF+IwBBQGoiAiQAIAEoAgBBgICAgHhGBEAgASgCDCEDIAJBJGoiBEEANgIAIAJCgICAgBA3AhwgAkEwaiADKAIAIgNBCGopAgA3AwAgAkE4aiADQRBqKQIANwMAIAIgAykCADcDKCACQRxqQcCIwAAgAkEoahAYGiACQRhqIAQoAgAiAzYCACACIAIpAhwiBTcDECABQQhqIAM2AgAgASAFNwIACyABKQIAIQUgAUKAgICAEDcCACACQQhqIgMgAUEIaiIBKAIANgIAIAFBADYCAEGxk8AALQAAGiACIAU3AwBBDEEEEF0iAUUEQEEEQQwQbQALIAEgAikDADcCACABQQhqIAMoAgA2AgAgAEHgisAANgIEIAAgATYCACACQUBrJAAL0gECBH8BfiMAQSBrIgMkACABIAEgAmoiAksEQEEAQQAQUgALQQggACgCACIEQQF0IgEgAiABIAJLGyICIAJBCEkb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QQRqrUKAgICA4ACENwMoIAEgAa1CgICAgOAAhDcDICABIAFBIGo2AhAgAUEIakHIj8AAEEMAC2kCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQfyNwAA2AgggA0ICNwIUIANCgICAgOAAIgQgA62ENwMoIAMgBCADQQRqrYQ3AyAgAyADQSBqNgIQIANBCGogAhBDAAtpAgF/AX4jAEEwayIDJAAgAyAANgIAIAMgATYCBCADQQI2AgwgA0H4kcAANgIIIANCAjcCFCADQoCAgIDgACIEIANBBGqthDcDKCADIAQgA62ENwMgIAMgA0EgajYCECADQQhqIAIQQwALZgAjAEEwayIAJABBsJPAAC0AAARAIABBAjYCDCAAQbCKwAA2AgggAEIBNwIUIAAgATYCLCAAIABBLGqtQoCAgIDgAIQ3AyAgACAAQSBqNgIQIABBCGpB0IrAABBDAAsgAEEwaiQAC5QBAgN/AW8jAEEgayIDJAAgAyAAKAIAEHAiBDYCACADIAI2AgQgAiAERwRAIANBADYCCCADIANBBGogA0EIahBAAAsQWyIEEFMiBSUBEAUhBhAbIgIgBiYBIAVBhAFPBEAgBRAtCyACIAAoAgAgAUECdhBkIAJBhAFPBEAgAhAtCyAEQYQBTwRAIAQQLQsgA0EgaiQAC08BAX8jAEEwayIAJAAgAEEBNgIMIABBwI3AADYCCCAAQgE3AhQgACAAQS9qrUKAgICAoAWENwMgIAAgAEEgajYCECAAQQhqQcSBwAAQQwALQQEBfyACIAAoAgAgACgCCCIDa0sEQCAAIAMgAhAlIAAoAgghAwsgACgCBCADaiABIAIQHxogACACIANqNgIIQQALTQECf0Gxk8AALQAAGiABKAIEIQIgASgCACEDQQhBBBBdIgFFBEBBBEEIEG0ACyABIAI2AgQgASADNgIAIABB8IrAADYCBCAAIAE2AgALQQEBfyACIAAoAgAgACgCCCIDa0sEQCAAIAMgAhApIAAoAgghAwsgACgCBCADaiABIAIQHxogACACIANqNgIIQQALQQEBfyMAQSBrIgIkACACQQA2AhAgAkEBNgIEIAJCBDcCCCACQS42AhwgAiAANgIYIAIgAkEYajYCACACIAEQQwALswIBA38gACgCACECIAEoAhwiAEEQcUUE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ZCByZWN1cnNpdmVseSBvciBhZnRlciBiZWluZyBkcm9wcGVkTGF6eSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkdgMQACoAAAAvVXNlcnMvZG1hcmNvcy8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL29uY2VfY2VsbC0xLjIxLjMvc3JjL2xpYi5ycwCoAxAAXwAAAAgDAAAZAAAAcmVlbnRyYW50IGluaXQAABgEEAAOAAAAqAMQAF8AAAB6AgAADQAAABYAAAAMAAAABAAAABcAAAAYAAAAGQAAAC9ydXN0L2RlcHMvZGxtYWxsb2MtMC4yLjYvc3JjL2RsbWFsbG9jLnJzYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPj0gc2l6ZSArIG1pbl9vdmVyaGVhZABYBBAAKQAAAKgEAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPD0gc2l6ZSArIG1heF9vdmVyaGVhZAAAWAQQACkAAACuBAAADQAAAEFjY2Vzc0Vycm9ybWVtb3J5IGFsbG9jYXRpb24gb2YgIGJ5dGVzIGZhaWxlZAAAAAsFEAAVAAAAIAUQAA0AAABzdGQvc3JjL2FsbG9jLnJzQAUQABAAAABjAQAACQAAABYAAAAMAAAABAAAABoAAAAAAAAACAAAAAQAAAAbAAAAAAAAAAgAAAAEAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAQAAAABAAAACEAAAAiAAAAIwAAACQAAABFcnJvcgAAACUAAAAMAAAABAAAACYAAAAnAAAAKAAAAGNhcGFjaXR5IG92ZXJmbG93AAAA2AUQABEAAABhbGxvYy9zcmMvcmF3X3ZlYy5yc/QFEAAUAAAAGAAAAAUAQaCMwAAL8AUBAAAAKQAAAGEgZm9ybWF0dGluZyB0cmFpdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB3aGVuIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBkaWQgbm90YWxsb2Mvc3JjL2ZtdC5ycwAAfgYQABAAAAB+AgAADgAAAEJvcnJvd011dEVycm9yYWxyZWFkeSBib3Jyb3dlZDogrgYQABIAAABpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAAyAYQACAAAADoBhAAEgAAAD09IT1tYXRjaGVzYXNzZXJ0aW9uIGBsZWZ0ICByaWdodGAgZmFpbGVkCiAgbGVmdDogCiByaWdodDogABcHEAAQAAAAJwcQABcAAAA+BxAACQAAACByaWdodGAgZmFpbGVkOiAKICBsZWZ0OiAAAAAXBxAAEAAAAGAHEAAQAAAAcAcQAAkAAAA+BxAACQAAADogAAABAAAAAAAAAJwHEAACAAAAfSB9Y29yZS9zcmMvZm10L251bS5ycwAAswcQABMAAABmAAAAFwAAADB4MDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTlyYW5nZSBzdGFydCBpbmRleCAgb3V0IG9mIHJhbmdlIGZvciBzbGljZSBvZiBsZW5ndGggAACiCBAAEgAAALQIEAAiAAAAcmFuZ2UgZW5kIGluZGV4IOgIEAAQAAAAtAgQACIAAAAAAAA/AAAAvwBBqJLAAAsBFABwCXByb2R1Y2VycwIIbGFuZ3VhZ2UBBFJ1c3QADHByb2Nlc3NlZC1ieQMFcnVzdGMdMS44My4wICg5MGIzNWE2MjMgMjAyNC0xMS0yNikGd2FscnVzBjAuMjMuMwx3YXNtLWJpbmRnZW4HMC4yLjEwMABJD3RhcmdldF9mZWF0dXJlcwQrD211dGFibGUtZ2xvYmFscysIc2lnbi1leHQrD3JlZmVyZW5jZS10eXBlcysKbXVsdGl2YWx1ZQ==", import.meta.url)); const A = $o(); (typeof t == "string" || typeof Request == "function" && t instanceof Request || typeof URL == "function" && t instanceof URL) && (t = fetch(t)); const { instance: e, module: s } = await Ko(await t, A); return Vo(e, s); } const TA = -12, UA = 9, Po = Math.exp(TA), Xo = Math.exp(UA), Ts = -30, It = Math.exp(Ts), Xe = 11, We = 11, Us = 11, Wo = Xe + We, X = 1 << Xe, qA = 1 << We, Gs = 1 << Us, Oe = 1, Oo = X - 1, jo = qA - 1, Zo = Gs - 1, Ag = !0, Mh = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, LN_SCALE_MAX: UA, LN_SCALE_MIN: TA, LN_SCALE_ZERO: Ts, SCALE_MAX: Xo, SCALE_MIN: Po, SCALE_ZERO: It, SPLAT_TEX_DEPTH: Gs, SPLAT_TEX_DEPTH_BITS: Us, SPLAT_TEX_DEPTH_MASK: Zo, SPLAT_TEX_HEIGHT: qA, SPLAT_TEX_HEIGHT_BITS: We, SPLAT_TEX_HEIGHT_MASK: jo, SPLAT_TEX_LAYER_BITS: Wo, SPLAT_TEX_MIN_HEIGHT: Oe, SPLAT_TEX_WIDTH: X, SPLAT_TEX_WIDTH_BITS: Xe, SPLAT_TEX_WIDTH_MASK: Oo, WASM_SPLAT_SORT: Ag }, Symbol.toStringTag, { value: "Module" })); function ft(t) { return t === "bool" || t === "bvec2" || t === "bvec3" || t === "bvec4"; } function pt(t) { return t === "int" || t === "uint" || t === "float"; } function BA(t) { return t === "int" || t === "ivec2" || t === "ivec3" || t === "ivec4"; } function QA(t) { return t === "uint" || t === "uvec2" || t === "uvec3" || t === "uvec4"; } function Vt(t) { return t === "float" || t === "vec2" || t === "vec3" || t === "vec4"; } function Rs(t) { return t === "mat2" || t === "mat2x2" || t === "mat2x3" || t === "mat2x4" || t === "mat3" || t === "mat3x2" || t === "mat3x3" || t === "mat3x4" || t === "mat4" || t === "mat4x2" || t === "mat4x3" || t === "mat4x4"; } function at(t) { return Vt(t) || Rs(t); } function Ft(t) { return t === "vec2" || t === "ivec2" || t === "uvec2"; } function kt(t) { return t === "vec3" || t === "ivec3" || t === "uvec3"; } function Pt(t) { return t === "vec4" || t === "ivec4" || t === "uvec4"; } function tg(t) { return Ft(t) || kt(t) || Pt(t); } function ot(t) { return t === "mat2" || t === "mat2x2"; } function gt(t) { return t === "mat3" || t === "mat3x3"; } function ct(t) { return t === "mat4" || t === "mat4x4"; } function Ys(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 Js(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 eg(t) { if (pt(t)) return "float"; if (Ft(t)) return "vec2"; if (kt(t)) return "vec3"; if (Pt(t)) return "vec4"; throw new Error(`Invalid vector type: ${t}`); } function Ls(t) { if (pt(t)) return "uint"; if (Ft(t)) return "uvec2"; if (kt(t)) return "uvec3"; if (Pt(t)) return "uvec4"; throw new Error(`Invalid vector type: ${t}`); } function sg(t) { if (pt(t)) return "int"; if (Ft(t)) return "ivec2"; if (kt(t)) return "ivec3"; if (Pt(t)) return "ivec4"; throw new Error(`Invalid vector type: ${t}`); } function _s(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 q(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 it ? t.type : t.dynoOut().type; } class it { constructor(A) { this.__isDynoValue = !0, this.type = A; } } class K extends it { constructor(A, e) { super(A.outTypes[e]), this.dyno = A, this.key = e; } } class Mt extends it { constructor(A, e) { super(A), this.literal = e; } getLiteral() { return this.literal; } } function ae(t, A) { return new Mt(t, A); } class zs extends Mt { constructor(A, e) { super(A, ""), this.value = e; } getLiteral() { const { type: A, value: e } = this; switch (A) { case "bool": return e ? "true" : "false"; case "uint": return aA(e); case "int": return rA(e); case "float": return q(e); case "bvec2": { const s = e; return `bvec2(${s[0]}, ${s[1]})`; } case "uvec2": { if (e instanceof u.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 u.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 u.Vector2) return `vec2(${q(e.x)}, ${q(e.y)})`; const s = e; return `vec2(${q(s[0])}, ${q(s[1])})`; } case "bvec3": { const s = e; return `bvec3(${s[0]}, ${s[1]}, ${s[2]})`; } case "uvec3": { if (e instanceof u.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 u.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 u.Vector3) return `vec3(${q(e.x)}, ${q(e.y)}, ${q(e.z)})`; const s = e; return `vec3(${q(s[0])}, ${q(s[1])}, ${q(s[2])})`; } case "bvec4": { const s = e; return `bvec4(${s[0]}, ${s[1]}, ${s[2]}, ${s[3]})`; } case "uvec4": { if (e instanceof u.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 u.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 u.Vector4) return `vec4(${q(e.x)}, ${q(e.y)}, ${q(e.z)}, ${q(e.w)})`; if (e instanceof u.Quaternion) return `vec4(${q(e.x)}, ${q(e.y)}, ${q(e.z)}, ${q(e.w)})`; const s = e; return `vec4(${q(s[0])}, ${q(s[1])}, ${q(s[2])}, ${q(s[3])})`; } case "mat2": case "mat2x2": { const s = e, n = s instanceof u.Matrix2 ? s.elements : e, i = new Array(4).fill(0).map((r, a) => q(n[a])); return `${A}(${i.join(", ")})`; } case "mat2x3": { const s = e, n = new Array(6).fill(0).map((i, r) => q(s[r])); return `${A}(${n.join(", ")})`; } case "mat2x4": { const s = e, n = new Array(8).fill(0).map((i, r) => q(s[r])); return `${A}(${n.join(", ")})`; } case "mat3": case "mat3x3": { const s = e, n = s instanceof u.Matrix3 ? s.elements : e, i = new Array(9).fill(0).map((r, a) => q(n[a])); return `${A}(${i.join(", ")})`; } case "mat3x2": { const s = e, n = new Array(6).fill(0).map((i, r) => q(s[r])); return `${A}(${n.join(", ")})`; } case "mat3x4": { const s = e, n = new Array(12).fill(0).map((i, r) => q(s[r])); return `${A}(${n.join(", ")})`; } case "mat4": case "mat4x4": { const s = e, n = s instanceof u.Matrix4 ? s.elements : e, i = new Array(16).fill(0).map((r, a) => q(n[a])); return `${A}(${i.join(", ")})`; } case "mat4x2": { const s = e, n = new Array(8).fill(0).map((i, r) => q(s[r])); return `${A}(${n.join(", ")})`; } case "mat4x3": { const s = e, n = new Array(12).fill(0).map((i, r) => q(s[r])); return `${A}(${n.join(", ")})`; } default: throw new Error(`Type not implemented: ${String(A)}`); } } } function J(t, A) { return new zs(t, A); } function Yt(t) { const A = String(t); if (ft(t)) return `${A}(false)`; if (at(t)) return `${A}(0.0)`; if (BA(t)) return `${A}(0)`; if (QA(t)) return `${A}(0u)`; throw new Error(`Type not implemented: ${A}`); } function ng(t) { const A = String(t); if (ft(t)) return `${A}(true)`; if (at(t)) return `${A}(1.0)`; if (BA(t)) return `${A}(1)`; if (QA(t)) return `${A}(1u)`; throw new Error(`Type not implemented: ${A}`); } function ig(t) { const A = String(t); if (ft(t)) return `${A}(true)`; if (at(t)) return `${A}(-1.0)`; if (BA(t)) return `${A}(-1)`; if (QA(t)) return `${A}(0xFFFFFFFFu)`; throw new Error(`Type not implemented: ${A}`); } const us = " "; class qs { constructor({ indent: A } = {}) { this.globals = /* @__PURE__ */ new Set(), this.statements = [], this.uniforms = {}, this.declares = /* @__PURE__ */ new Set(), this.updaters = [], this.sequence = 0, this.indent = us, this.indent = A ?? us; } 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: c, compile: l }) => { var g, I; return { globals: (g = this.globals) == null ? void 0 : g.call(this, { inputs: o, outputs: c, compile: l }), statements: (I = this.statements) == null ? void 0 : I.call(this, { inputs: o, outputs: c, 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 c in e) { const l = e[c]; l && !s.declares.has(l) && (s.declares.add(l), i.push(c)); } const { globals: r, statements: a, uniforms: o } = this.generate({ inputs: A, outputs: e, compile: s }); for (const c of r ?? []) s.globals.add(c); for (const c in o) s.uniforms[c] = o[c]; this.update && s.updaters.push(this.update); for (const c of i) { const l = e[c]; l && (s.uniforms[l] || n.push(`${je(l, this.outTypes[c])};`)); } return a != null && a.length && (n.push("{"), n.push(...a.map((c) => s.indent + c)), n.push("}")), n; } } class $A 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 B, C; const n = {}, i = {}; for (const Q in A) A[Q] != null && (n[Q] = new Mt(this.inTypes[Q], A[Q])); for (const Q in e) e[Q] != null && (i[Q] = new it(this.outTypes[Q])); const r = { roots: [] }, a = this.construct(n, i, r); for (const Q of ((B = this.globals) == null ? void 0 : B.call(this, { inputs: A, outputs: e, compile: s })) ?? []) s.globals.add(Q); const o = [], c = /* @__PURE__ */ new Map(); function l(Q, E, f) { let p = c.get(Q); if (!p) { p = { sequence: s.nextSequence(), outNames: /* @__PURE__ */ new Map(), newOuts: /* @__PURE__ */ new Set() }, c.set(Q, p); for (const d in Q.inputs) { let w = Q.inputs[d]; for (; w; ) { if (w instanceof it) { w instanceof K && l(w.dyno, w.key); break; } w = w.dynoOut(); } } o.push(Q); } E && (f || p.newOuts.add(E), p.outNames.set(E, f ?? `${E}_${p.sequence}`)); } for (const Q of r.roots) l(Q); for (const Q in i) { let E = (a == null ? void 0 : a[Q]) ?? i[Q]; for (; E; ) { if (E instanceof it) { E instanceof K && l(E.dyno, E.key, e[Q]); break; } E = E.dynoOut(); } i[Q] = E; } const g = []; for (const Q of o) { const E = {}, f = {}; for (const w in Q.inputs) { let D = Q.inputs[w]; for (; D; ) { if (D instanceof it) { if (D instanceof Mt) E[w] = D.getLiteral(); else if (D instanceof K) { const x = (C = c.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}` ); E[w] = x; } break; } D = D.dynoOut(); } } const p = c.get(Q) ?? { outNames: /* @__PURE__ */ new Map() }; for (const [w, D] of p.outNames.entries()) f[w] = D; const d = Q.compile({ inputs: E, outputs: f, compile: s }); g.push(d); } const I = []; for (const Q in e) i[Q] instanceof Mt && I.push( `${e[Q]} = ${i[Q].getLiteral()};` ); return I.length > 0 && g.push(I), { statements: g.flatMap((Q, E) => E === 0 ? Q : ["", ...Q]) }; } } function MA(t, A, e, { update: s, globals: n } = {}) { return new $A({ 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 je(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 GA(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 uA(t) { return GA(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 dt 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" }, Wt = { type: "PackedSplats" }, rg = (t) => new Ks({ packedSplats: t }), vt = (t, A) => new Vs({ packedSplats: t, index: A }), Hs = (t, A, e, s) => new Ps({ packedSplats: t, index: A, base: e, count: s }), ut = (t) => new Xs({ gsplat: t }), rt = ({ gsplat: t, flags: A, index: e, center: s, scales: n, quaternion: i, rgba: r, rgb: a, opacity: o, x: c, y: l, z: g, r: I, g: h, b: B }) => new Ws({ gsplat: t, flags: A, index: e, center: s, scales: n, quaternion: i, rgba: r, rgb: a, opacity: o, x: c, y: l, z: g, r: I, g: h, b: B }), Ge = (t) => new js({ gsplat: t }), Ze = (t, { scale: A, rotate: e, translate: s, recolor: n }) => new Zs({ gsplat: t, scale: A, rotate: e, translate: s, recolor: n }), vA = uA(` 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; } `), Qe = uA(` struct PackedSplats { usampler2DArray texture; int numSplats; vec4 rgbMinMaxLnScaleMinMax; }; `); class Ks extends v { constructor({ packedSplats: A }) { super({ a: A, outKey: "numSplats", outTypeFunc: () => "int" }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.numSplats} = ${e.a}.numSplats;` ]; } } const $s = uA(` 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 Vs extends V { constructor({ packedSplats: A, index: e }) { super({ inTypes: { packedSplats: Wt, index: "int" }, outTypes: { gsplat: AA }, inputs: { packedSplats: A, index: e }, globals: () => [vA, Qe, $s], statements: ({ inputs: s, outputs: n }) => { const { gsplat: i } = n; if (!i) return []; const { packedSplats: r, index: a } = s; let o; return r && a ? o = GA(` 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 Ps extends V { constructor({ packedSplats: A, index: e, base: s, count: n }) { super({ inTypes: { packedSplats: Wt, index: "int", base: "int", count: "int" }, outTypes: { gsplat: AA }, inputs: { packedSplats: A, index: e, base: s, count: n }, globals: () => [vA, Qe, $s], statements: ({ inputs: i, outputs: r }) => { const { gsplat: a } = r; if (!a) return []; const { packedSplats: o, index: c, base: l, count: g } = i; let I; return o && c && l && g ? I = GA(` ${a}.flags = 0u; if ((${c} >= ${l}) && (${c} < (${l} + ${g}))) { if (readPackedSplat(${o}.texture, ${o}.numSplats, ${o}.rgbMinMaxLnScaleMinMax, ${c}, ${a})) { bool zeroSize = all(equal(${a}.scales, vec3(0.0, 0.0, 0.0))); ${a}.flags = zeroSize ? 0u : GSPLAT_FLAG_ACTIVE; } } `) : I = [`${a}.flags = 0u;`], I.push(`${a}.index = ${c ?? "0"};`), I; } }); } dynoOut() { return new K(this, "gsplat"); } } class Xs 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: () => [vA], statements: ({ inputs: e, outputs: s }) => { const { gsplat: n } = e, { flags: i, active: r, index: a, center: o, scales: c, quaternion: l, rgba: g, rgb: I, opacity: h, x: B, y: C, z: Q, r: E, g: f, b: p } = 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, c ? `${c} = ${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, g ? `${g} = ${n ? `${n}.rgba` : "vec4(0.0, 0.0, 0.0, 0.0)"};` : null, I ? `${I} = ${n ? `${n}.rgba.rgb` : "vec3(0.0, 0.0, 0.0)"};` : null, h ? `${h} = ${n ? `${n}.rgba.a` : "0.0"};` : null, B ? `${B} = ${n ? `${n}.center.x` : "0.0"};` : null, C ? `${C} = ${n ? `${n}.center.y` : "0.0"};` : null, Q ? `${Q} = ${n ? `${n}.center.z` : "0.0"};` : null, E ? `${E} = ${n ? `${n}.rgba.r` : "0.0"};` : null, f ? `${f} = ${n ? `${n}.rgba.g` : "0.0"};` : null, p ? `${p} = ${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: c, x: l, y: g, z: I, r: h, g: B, 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: c, x: l, y: g, z: I, r: h, g: B, b: C }, globals: () => [vA], statements: ({ inputs: Q, outputs: E }) => { const { gsplat: f } = E; if (!f) return []; const { gsplat: p, flags: d, index: w, center: D, scales: x, quaternion: y, rgba: m, rgb: N, opacity: M, x: S, y: U, z: F, r: b, g: T, b: R } = Q; return [ `${f}.flags = ${d ?? (p ? `${p}.flags` : "0u")};`, `${f}.index = ${w ?? (p ? `${p}.index` : "0")};`, `${f}.center = ${D ?? (p ? `${p}.center` : "vec3(0.0, 0.0, 0.0)")};`, `${f}.scales = ${x ?? (p ? `${p}.scales` : "vec3(0.0, 0.0, 0.0)")};`, `${f}.quaternion = ${y ?? (p ? `${p}.quaternion` : "vec4(0.0, 0.0, 0.0, 1.0)")};`, `${f}.rgba = ${m ?? (p ? `${p}.rgba` : "vec4(0.0, 0.0, 0.0, 0.0)")};`, N ? `${f}.rgba.rgb = ${N};` : null, M ? `${f}.rgba.a = ${M};` : null, S ? `${f}.center.x = ${S};` : null, U ? `${f}.center.y = ${U};` : null, F ? `${f}.center.z = ${F};` : null, b ? `${f}.rgba.r = ${b};` : null, T ? `${f}.rgba.g = ${T};` : null, R ? `${f}.rgba.b = ${R};` : null ].filter(Boolean); } }); } dynoOut() { return new K(this, "gsplat"); } } const Os = uA(` vec3 gsplatNormal(vec3 scales, vec4 quaternion) { float minScale = min(scales.x, min(scales.y, scales.z)); vec3 normal; if (scales.z == minScale) { normal = vec3(0.0, 0.0, 1.0); } else if (scales.y == minScale) { normal = vec3(0.0, 1.0, 0.0); } else { normal = vec3(1.0, 0.0, 0.0); } return quatVec(quaternion, normal); } `); class js extends v { constructor({ gsplat: A }) { super({ a: A, outKey: "normal", outTypeFunc: () => "vec3" }), this.globals = () => [vA, Os], this.statements = ({ inputs: e, outputs: s }) => [ `${s.normal} = gsplatNormal(${e.a}.scales, ${e.a}.quaternion);` ]; } } class Zs 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: () => [vA], statements: ({ inputs: r, outputs: a, compile: o }) => { const { gsplat: c } = a; if (!c || !r.gsplat) return []; const { scale: l, rotate: g, translate: I, recolor: h } = r, B = o.indent; return [ `${c} = ${r.gsplat};`, `if (isGsplatActive(${c}.flags)) {`, l ? `${B}${c}.center *= ${l};` : null, g ? `${B}${c}.center = quatVec(${g}, ${c}.center);` : null, I ? `${B}${c}.center += ${I};` : null, l ? `${B}${c}.scales *= ${l};` : null, g ? `${B}${c}.quaternion = quatQuat(${g}, ${c}.quaternion);` : null, h ? `${B}${c}.rgba *= ${h};` : null, "}" ].filter(Boolean); } }); } dynoOut() { return new K(this, "gsplat"); } } const An = (t, A) => new tn({ gsplat: t, rgbMinMaxLnScaleMinMax: A }), ag = (t) => new As({ rgba8: t }); class tn extends V { constructor({ gsplat: A, rgbMinMaxLnScaleMinMax: e }) { super({ inTypes: { gsplat: AA, rgbMinMaxLnScaleMinMax: "vec4" }, inputs: { gsplat: A, rgbMinMaxLnScaleMinMax: e }, globals: () => [vA], statements: ({ inputs: s, outputs: n }) => { const { output: i } = n; if (!i) return []; const { gsplat: r, rgbMinMaxLnScaleMinMax: a } = s; return r ? GA(` 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 As 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 og = (t, A, e) => new k({ key: t, type: A, value: e }), gg = (t = !1, A) => new oe({ key: A, value: t }), cg = (t = 0, A) => new en({ key: A, value: t }), lg = (t = 0, A) => new Ht({ key: A, value: t }), _A = (t = 0, A) => new ht({ key: A, value: t }), Ig = (t, A) => new sn({ key: A, value: t }), ug = (t, A) => new nn({ key: A, value: t }), hg = (t, A) => new rn({ key: A, value: t }), Cg = (t, A) => new _t({ key: A, value: t }), Bg = (t, A) => new an({ key: A, value: t }), Qg = (t, A) => new on({ key: A, value: t }), Eg = (t, A) => new gn({ key: A, value: t }), tt = (t, A) => new bt({ key: A, value: t }), fg = (t, A) => new cn({ key: A, value: t }), pg = (t, A) => new ln({ key: A, value: t }), dg = (t, A) => new In({ key: A, value: t }), yg = (t, A) => new Nt({ key: A, value: t }), wg = (t, A) => new un({ key: A, value: t }), mg = (t, A) => new hn({ key: A, value: t }), xg = (t, A) => new Cn({ key: A, value: t }), Sg = (t, A) => new Bn({ key: A, value: t }), Dg = (t, A) => new Qn({ key: A, value: t }), Mg = (t, A) => new En({ key: A, value: t }), vg = (t, A) => new fn({ key: A, value: t }), bg = (t, A) => new pn({ key: A, value: t }), Fg = (t, A) => new dn({ key: A, value: t }), kg = (t, A) => new yn({ key: A, value: t }), Ng = (t, A) => new wn({ key: A, value: t }), Tg = (t, A) => new mn({ key: A, value: t }), Ug = (t, A) => new xn({ key: A, value: t }), Gg = (t, A) => new Sn({ key: A, value: t }), Rg = (t, A) => new Dn({ key: A, value: t }), Yg = (t, A) => new zt({ key: A, value: t }), Jg = (t, A) => new Mn({ key: t, value: A }), Lg = (t, A) => new vn({ key: A, value: t }), _g = (t, A) => new bn({ key: A, value: t }), zg = (t, A) => new Fn({ key: A, value: t }), qg = (t, A) => new kn({ key: A, value: t }), Hg = (t, A) => new Nn({ key: A, value: t }), Kg = (t, A) => new Tn({ key: A, value: t }), $g = (t, A) => new Un({ key: A, value: t }), Vg = (t, A) => new Gn({ key: A, value: t }), Pg = (t, A) => new Rn({ key: A, value: t }), Xg = (t, A) => new Yn({ key: A, value: t }); class k 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 c = (r == null ? void 0 : r({ inputs: a, outputs: o })) ?? [], l = {}, g = o[A]; return g && (c.push(`uniform ${je(g, e, s)};`), l[g] = this.uniform), { globals: c, 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 k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "bool", value: e, update: s }); } } class en extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "uint", value: e, update: s }); } } class Ht extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "int", value: e, update: s }); } } class ht extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "float", value: e, update: s }); } } class sn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "bvec2", value: e, update: s }); } } class nn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "uvec2", value: e, update: s }); } } class rn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "ivec2", value: e, update: s }); } } class _t extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "vec2", value: e, update: s }); } } class an extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "bvec3", value: e, update: s }); } } class on extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "uvec3", value: e, update: s }); } } class gn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "ivec3", value: e, update: s }); } } class bt extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "vec3", value: e, update: s }); } } class cn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "bvec4", value: e, update: s }); } } class ln extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "uvec4", value: e, update: s }); } } class In extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "ivec4", value: e, update: s }); } } class Nt extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "vec4", value: e, update: s }); } } class un extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat2", value: e, update: s }); } } class hn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat2x2", value: e, update: s }); } } class Cn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat2x3", value: e, update: s }); } } class Bn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat2x4", value: e, update: s }); } } class Qn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat3", value: e, update: s }); } } class En extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat3x2", value: e, update: s }); } } class fn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat3x3", value: e, update: s }); } } class pn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat3x4", value: e, update: s }); } } class dn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat4", value: e, update: s }); } } class yn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat4x2", value: e, update: s }); } } class wn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat4x3", value: e, update: s }); } } class mn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "mat4x4", value: e, update: s }); } } class xn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "usampler2D", value: e, update: s }); } } class Sn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "isampler2D", value: e, update: s }); } } class Dn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "sampler2D", value: e, update: s }); } } class zt extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "usampler2DArray", value: e, update: s }); } } class Mn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "isampler2DArray", value: e, update: s }); } } class vn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "sampler2DArray", value: e, update: s }); } } class bn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "usampler3D", value: e, update: s }); } } class Fn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "isampler3D", value: e, update: s }); } } class kn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "sampler3D", value: e, update: s }); } } class Nn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "usamplerCube", value: e, update: s }); } } class Tn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "isamplerCube", value: e, update: s }); } } class Un extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "samplerCube", value: e, update: s }); } } class Gn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "sampler2DShadow", value: e, update: s }); } } class Rn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "sampler2DArrayShadow", value: e, update: s }); } } class Yn extends k { constructor({ key: A, value: e, update: s }) { super({ key: A, type: "samplerCubeShadow", value: e, update: s }); } } const Ot = new Float32Array(1), Ee = new Uint32Array(Ot.buffer); function Wg(t) { return Ot[0] = t, Ee[0]; } function Og(t) { return Ee[0] = t, Ot[0]; } function Ct(t) { Ot[0] = t; const A = Ee[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 Ee[0] = n, Ot[0]; } function bA(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 jg(t) { return t / 255; } function Zg(t) { return t / 127; } class Ac { // 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 tc(t, A) { const e = Object.entries(t).map(([s, n]) => [ s, A(n, s) ]); return Object.fromEntries(e); } function ec(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 Jn(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 sc(t, A) { return new Array(t).fill(null).map((e, s) => A(s)); } class Ln { 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, c, l, g, I, h, B, C, Q) { const E = (Q == null ? void 0 : Q.rgbMin) ?? 0, p = ((Q == null ? void 0 : Q.rgbMax) ?? 1) - E, d = bA((h - E) / p), w = bA((B - E) / p), D = bA((C - E) / p), x = bA(I), y = ts( new u.Quaternion(o, c, l, g) ), m = y & 255, N = y >>> 8 & 255, M = y >>> 16 & 255, S = (Q == null ? void 0 : Q.lnScaleMin) ?? TA, F = 254 / (((Q == null ? void 0 : Q.lnScaleMax) ?? UA) - S), b = i < It ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(i) - S) * F) + 1 ) ), T = r < It ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(r) - S) * F) + 1 ) ), R = a < It ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(a) - S) * F) + 1 ) ), W = Ct(e), L = Ct(s), eA = Ct(n), H = A * 4; t[H] = d | w << 8 | D << 16 | x << 24, t[H + 1] = W | L << 16, t[H + 2] = eA | m << 16 | N << 24, t[H + 3] = b | T << 8 | R << 16 | M << 24; } function nc(t, A, e, s, n) { const i = Ct(e), r = Ct(s), a = Ct(n), o = A * 4; t[o + 1] = i | r << 16, t[o + 2] = a | t[o + 2] & 4294901760; } function ic(t, A, e, s, n, i) { const r = (i == null ? void 0 : i.lnScaleMin) ?? TA, o = 254 / (((i == null ? void 0 : i.lnScaleMax) ?? UA) - r), c = e < It ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(e) - r) * o) + 1 ) ), l = s < It ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(s) - r) * o) + 1 ) ), g = n < It ? 0 : Math.min( 255, Math.max( 1, Math.round((Math.log(n) - r) * o) + 1 ) ), I = A * 4; t[I + 3] = c | l << 8 | g << 16 | t[I + 3] & 4278190080; } function rc(t, A, e, s, n, i) { const r = ts( new u.Quaternion(e, s, n, i) ), a = r & 255, o = r >>> 8 & 255, c = r >>> 16 & 255, l = A * 4; t[l + 2] = t[l + 2] & 65535 | a << 16 | o << 24, t[l + 3] = t[l + 3] & 16777215 | c << 24; } function ac(t, A, e, s, n, i, r) { const a = (r == null ? void 0 : r.rgbMin) ?? 0, c = ((r == null ? void 0 : r.rgbMax) ?? 1) - a, l = bA((e - a) / c), g = bA((s - a) / c), I = bA((n - a) / c), h = bA(i), B = A * 4; t[B] = l | g << 8 | I << 16 | h << 24; } function oc(t, A, e, s, n, i) { const r = (i == null ? void 0 : i.rgbMin) ?? 0, o = ((i == null ? void 0 : i.rgbMax) ?? 1) - r, c = bA((e - r) / o), l = bA((s - r) / o), g = bA((n - r) / o), I = A * 4; t[I] = c | l << 8 | g << 16 | t[I] & 4278190080; } function gc(t, A, e) { const s = bA(e), n = A * 4; t[n] = t[n] & 16777215 | s << 24; } const cc = new u.Vector3(), lc = new u.Vector3(), Ic = new u.Quaternion(), uc = new u.Color(), hc = { center: cc, scales: lc, quaternion: Ic, color: uc, opacity: 0 }; function Ye(t, A, e) { const s = hc, n = A * 4, i = t[n], r = t[n + 1], a = t[n + 2], o = t[n + 3], c = (e == null ? void 0 : e.rgbMin) ?? 0, g = ((e == null ? void 0 : e.rgbMax) ?? 1) - c; s.color.set( c + (i & 255) / 255 * g, c + (i >>> 8 & 255) / 255 * g, c + (i >>> 16 & 255) / 255 * g ), s.opacity = (i >>> 24 & 255) / 255, s.center.set( wA(r & 65535), wA(r >>> 16 & 65535), wA(a & 65535) ); const I = (e == null ? void 0 : e.lnScaleMin) ?? TA, B = (((e == null ? void 0 : e.lnScaleMax) ?? UA) - I) / 254, C = o & 255; s.scales.x = C === 0 ? 0 : Math.exp(I + (C - 1) * B); const Q = o >>> 8 & 255; s.scales.y = Q === 0 ? 0 : Math.exp(I + (Q - 1) * B); const E = o >>> 16 & 255; s.scales.z = E === 0 ? 0 : Math.exp(I + (E - 1) * B); const f = a >>> 16 & 65535 | o >>> 8 & 16711680; return Vn(f, s.quaternion), s; } function mA(t) { const A = X, e = Math.max( Oe, Math.min(qA, Math.ceil(t / A)) ), s = Math.ceil(t / (A * e)), n = A * e * s; return { width: A, height: e, depth: s, maxSplats: n }; } function Cc(t) { const A = X, e = Math.max( Oe, Math.min(qA, Math.ceil(t / A)) ), s = Math.ceil(t / (A * e)); return A * e * s; } function Bc() { return navigator.maxTouchPoints > 0 ? !0 : /Mobi|Android|iPhone|iPad|iPod|Opera Mini|IEMobile/.test( navigator.userAgent ); } function Qc() { return /Android/.test(navigator.userAgent); } function Ec() { return /Oculus/.test(navigator.userAgent); } function fc(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 pc(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 _n(t) { const A = new u.Clock(t.autoStart); return A.startTime = t.startTime, A.oldTime = t.oldTime, A.elapsedTime = t.elapsedTime, A.running = t.running, A; } function dc(t) { return Object.fromEntries( Object.entries(t).filter(([A, e]) => e !== void 0) ); } const zn = uA(` precision highp float; in vec3 position; void main() { gl_Position = vec4(position.xy, 0.0, 1.0); } `); function qn(t) { const A = new u.Vector3(); for (const e of t) A.add(e); return A.divideScalar(t.length); } function Hn(t) { if (t.length === 0) return new u.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 Kn(t, A) { const e = new u.Vector3(0, 0, 0).applyMatrix4(t), s = new u.Vector3(0, 0, 0).applyMatrix4(A), n = new u.Vector3(0, 0, -1).applyMatrix4(t).sub(e).normalize(), i = new u.Vector3(0, 0, -1).applyMatrix4(A).sub(s).normalize(), r = e.distanceTo(s), a = n.dot(i); return { distance: r, coincidence: a }; } function yc({ matrix1: t, matrix2: A, maxDistance: e }) { const s = new u.Vector3(0, 0, 0).applyMatrix4(t), n = new u.Vector3(0, 0, 0).applyMatrix4(A); return s.distanceTo(n) <= e; } function wc({ matrix1: t, matrix2: A, maxDistance: e, minCoincidence: s }) { const { distance: n, coincidence: i } = Kn(t, A); return n <= e && (s == null || i >= s); } function $n(t, A) { const [e, s] = [new u.Vector3(), new u.Quaternion()], [n, i] = [new u.Vector3(), new u.Quaternion()]; t.decompose(e, s, new u.Vector3()), A.decompose(n, i, new u.Vector3()); const r = e.distanceTo(n), a = Math.abs(s.dot(i)); return { distance: r, coorient: a }; } function ge({ matrix1: t, matrix2: A, maxDistance: e, minCoorient: s }) { const { distance: n, coorient: i } = $n(t, A); return n <= e && (s == null || i >= s); } function mc(t, A = 1e-3) { return Math.abs(t) < A ? 0 : Math.sign(t); } function xc(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 Sc(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; } function ts(t) { const A = t.clone().normalize(); A.w < 0 && A.set(-A.x, -A.y, -A.z, -A.w); const e = 2 * Math.acos(A.w), s = Math.sqrt( A.x * A.x + A.y * A.y + A.z * A.z ), n = s < 1e-6 ? new u.Vector3(1, 0, 0) : new u.Vector3(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, c = a * 0.5 + 0.5, l = Math.round(o * 255), g = Math.round(c * 255); return Math.round(e * (255 / Math.PI)) << 16 | g << 8 | l; } function Vn(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 c = 1 - (Math.abs(a) + Math.abs(o)), l = Math.max(-c, 0); a += a >= 0 ? -l : l, o += o >= 0 ? -l : l; const g = new u.Vector3(a, o, c).normalize(), h = n / 255 * Math.PI * 0.5, B = Math.sin(h), C = Math.cos(h); return A.set(g.x * B, g.y * B, g.z * B, C), A; } function Dc(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), c = Math.atan2(a, o), l = (n + Math.PI) / (2 * Math.PI), g = (r + Math.PI) / (2 * Math.PI), I = (c + Math.PI) / (2 * Math.PI), h = Math.round(l * 255), B = Math.round(g * 255); return Math.round(I * 255) << 16 | B << 8 | h; } function Mc(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, c = r * (2 * Math.PI) - Math.PI, l = a * (2 * Math.PI) - Math.PI, g = Math.cos(o * 0.5), I = Math.sin(o * 0.5), h = Math.cos(c * 0.5), B = Math.sin(c * 0.5), C = Math.cos(l * 0.5), Q = Math.sin(l * 0.5); return A.w = g * h * C + I * B * Q, A.x = I * h * C - g * B * Q, A.y = g * B * C + I * h * Q, A.z = g * h * Q - I * B * C, A.normalize(), A; } function Zt(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 vc(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 c = 0; c < 9; ++c) { const l = (e[c] - r) * a, g = Math.round(Math.max(-63, Math.min(63, l))) & 127, I = c * 7, h = I + 7, B = Math.floor(I / 32), C = I - B * 32, Q = g << C & 4294967295; if (t[o + B] |= Q, h > B * 32 + 32) { const E = g >>> 32 - C & 4294967295; t[o + B + 1] |= E; } } } function bc(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] = Zt( (e[0] - r) * a, (e[1] - r) * a, (e[2] - r) * a, (e[3] - r) * a ), t[A * 4 + 1] = Zt( (e[4] - r) * a, (e[5] - r) * a, (e[6] - r) * a, (e[7] - r) * a ), t[A * 4 + 2] = Zt( (e[8] - r) * a, (e[9] - r) * a, (e[10] - r) * a, (e[11] - r) * a ), t[A * 4 + 3] = Zt( (e[12] - r) * a, (e[13] - r) * a, (e[14] - r) * a, 0 ); } function Fc(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 c = 0; c < 21; ++c) { const l = (e[c] - r) * a, g = Math.round(Math.max(-31, Math.min(31, l))) & 63, I = c * 6, h = I + 6, B = Math.floor(I / 32), C = I - B * 32, Q = g << C & 4294967295; if (t[o + B] |= Q, h > B * 32 + 32) { const E = g >>> 32 - C & 4294967295; t[o + B + 1] |= E; } } } function Pn(t, A) { const e = []; let s = 0, n = null; const i = new Fs((o, c) => { if (e.push(o), s += o.length, c || s >= A) { const l = new Uint8Array(s); let g = 0; for (const I of e) l.set(I, g), g += I.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 Xn { constructor({ fileBytes: A, chunkBytes: e = 64 * 1024 }) { this.fileBytes = A, this.chunkBytes = e, this.offset = 0, this.chunks = [], this.totalBytes = 0, this.gunzip = new Fs((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 vh = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, DataCache: Ac, FreeList: Ln, GunzipReader: Xn, IDENT_VERTEX_SHADER: zn, Sint8ToFloat: Zg, Uint8ToFloat: jg, averagePositions: qn, averageQuaternions: Hn, cloneClock: _n, coinciDist: Kn, computeMaxSplats: Cc, coorientDist: $n, decodeQuatEulerXyz888: Mc, decodeQuatOctXy88R8: Vn, decodeQuatXyz888: Sc, decompressPartialGzip: Pn, encodeQuatEulerXyz888: Dc, encodeQuatOctXy88R8: ts, encodeQuatXyz888: xc, encodeSh1Rgb: vc, encodeSh2Rgb: bc, encodeSh3Rgb: Fc, epsilonSign: mc, flipPixels: fc, floatBitsToUint: Wg, floatToSint8: ne, floatToUint8: bA, fromHalf: wA, getArrayBuffers: Jn, getTextureSize: mA, isAndroid: Qc, isMobile: Bc, isOculus: Ec, mapFilterObject: ec, mapObject: tc, newArray: sc, omitUndefined: dc, pixelsToPngUrl: pc, setPackedSplat: Re, setPackedSplatCenter: nc, setPackedSplatOpacity: gc, setPackedSplatQuat: rc, setPackedSplatRgb: oc, setPackedSplatRgba: ac, setPackedSplatScales: ic, toHalf: Ct, uintBitsToFloat: Og, unpackSplat: Ye, withinCoinciDist: wc, withinCoorientDist: ge, withinDist: yc }, Symbol.toStringTag, { value: "Module" })); class es { constructor({ graph: A, inputs: e, outputs: s, template: n }) { this.graph = A, this.template = n, this.inputs = e ?? {}, this.outputs = s ?? {}; const i = new qs({ 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 kc(this); } update() { for (const A of this.updaters) A(); } } class ss { 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 hs = /* @__PURE__ */ new Map(); function kc(t) { let A = hs.get(t); return A || (A = new u.RawShaderMaterial({ glslVersion: u.GLSL3, vertexShader: zn, fragmentShader: t.shader, uniforms: t.uniforms }), hs.set(t, A), A); } function ns(t, A, e = "add") { const s = () => { throw new Error(`Invalid ${e} types: ${t}, ${A}`); }; if (t === A) return t; if (t === "int") { if (BA(A)) return A; s(); } if (A === "int") { if (BA(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 (at(A)) return A; s(); } if (A === "float") { if (at(t)) return t; s(); } throw new Error(`Invalid ${e} types: ${t}, ${A}`); } function Nc(t, A) { return ns(t, A, "sub"); } function Tc(t, A) { const e = () => { throw new Error(`Invalid mul types: ${t}, ${A}`); }, s = (n) => n; if (t === "int") { if (BA(A)) return s(A); e(); } if (A === "int") { if (BA(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 (at(A)) return s(A); e(); } if (A === "float") { if (at(t)) return s(t); e(); } if (BA(t) || QA(t) || BA(A) || QA(A)) { if (t === A) return s(t); e(); } if (t === "vec2") { if (A === "vec2" || ot(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" || ct(A)) return s("vec4"); e(); } if (A === "vec2") { if (ot(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 (ct(t)) return s("vec4"); e(); } if (ot(t)) { if (ot(A)) return s("mat2"); if (A === "mat3x2") return s("mat3x2"); if (A === "mat4x2") return s("mat4x2"); e(); } if (t === "mat2x3") { if (ot(A)) return s("mat2x3"); if (A === "mat3x2") return s("mat3"); if (A === "mat4x2") return s("mat4x3"); e(); } if (t === "mat2x4") { if (ot(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 (ct(A)) return s("mat4x2"); e(); } if (t === "mat4x3") { if (A === "mat2x4") return s("mat2x3"); if (A === "mat3x4") return s("mat3"); if (ct(A)) return s("mat4x3"); e(); } if (ct(t)) { if (A === "mat2x4") return s("mat2x4"); if (A === "mat3x4") return s("mat3x4"); if (ct(A)) return s("mat4"); e(); } throw new Error(`Invalid mul types: ${t}, ${A}`); } function Uc(t, A) { return ns(t, A, "div"); } function Gc(t, A) { if (t === A) return t; if (t === "int") { if (BA(A)) return A; } else if (A === "int") { if (BA(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 Rc(t, A) { if (t === A || A === "float") return t; throw new Error(`Invalid mod types: ${t}, ${A}`); } function Yc(t) { return t; } function Jc(t) { return t; } function Lc(t) { return t; } function _c(t) { return t; } function zc(t) { return t; } function qc(t) { return t; } function Hc(t) { return t; } function Kc(t) { return t; } function $c(t) { return t; } function Vc(t) { return t; } function Pc(t) { return t; } function Xc(t) { return t; } function Wc(t) { return t; } function Oc(t) { return t; } function jc(t) { return t; } function Zc(t) { return t; } function Wn(t, A, e = "min") { if (t === A) return t; if (A === "float") { if (Vt(t)) return t; } else if (A === "int") { if (BA(t)) return t; } else if (A === "uint" && QA(t)) return t; throw new Error(`Invalid ${e} types: ${t}, ${A}`); } function Al(t, A) { return Wn(t, A, "max"); } function tl(t, A, e) { if (A === "float") { if (Vt(t)) return t; } else if (A === "int") { if (BA(t)) return t; } else if (A === "uint" && QA(t)) return t; throw new Error(`Invalid clamp types: ${t}, ${A}`); } function el(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 sl(t, A) { if (t === A || A === "float") return A; throw new Error(`Invalid step types: ${t}, ${A}`); } function nl(t, A, e) { if (t === A && (t === e || t === "float")) return e; throw new Error(`Invalid smoothstep types: ${t}, ${A}, ${e}`); } function On(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 il(t) { return On(t, "isInf"); } const CA = (t, A) => new ti({ a: t, b: A }), Et = (t, A) => new ei({ a: t, b: A }), iA = (t, A) => new si({ a: t, b: A }), ie = (t, A) => new ni({ a: t, b: A }), Je = (t, A) => new ii({ a: t, b: A }), jn = (t, A) => new ri({ a: t, b: A }), rl = (t) => new ai({ a: t }).outputs, is = (t) => new oi({ a: t }), al = (t) => new gi({ a: t }), ol = (t) => new ci({ a: t }), gl = (t) => new li({ a: t }), cl = (t) => new Ii({ a: t }), ll = (t) => new ui({ a: t }), Il = (t) => new hi({ a: t }), re = (t) => new Ci({ a: t }), ul = (t, A) => new Bi({ a: t, b: A }), hl = (t) => new Qi({ a: t }), Cl = (t) => new Ei({ a: t }), Bl = (t) => new fi({ a: t }), Ql = (t) => new pi({ a: t }), El = (t) => new di({ a: t }), fl = (t) => new yi({ a: t }), pl = (t) => new wi({ a: t }), dl = (t, A) => new mi({ a: t, b: A }), Zn = (t, A) => new xi({ a: t, b: A }), yl = (t, A, e) => new Si({ a: t, min: A, max: e }), Ai = (t, A, e) => new Di({ a: t, b: A, t: e }), wl = (t, A) => new Mi({ edge: t, x: A }), ml = (t, A, e) => new vi({ edge0: t, edge1: A, x: e }), xl = (t) => new bi({ a: t }), Sl = (t) => new Fi({ a: t }); class ti extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "sum", outTypeFunc: ns }), this.statements = ({ inputs: s, outputs: n }) => [`${n.sum} = ${s.a} + ${s.b};`]; } } class ei extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "difference", outTypeFunc: Nc }), this.statements = ({ inputs: s, outputs: n }) => [`${n.difference} = ${s.a} - ${s.b};`]; } } class si extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "product", outTypeFunc: Tc }), this.statements = ({ inputs: s, outputs: n }) => [`${n.product} = ${s.a} * ${s.b};`]; } } class ni extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "quotient", outTypeFunc: Uc }), this.statements = ({ inputs: s, outputs: n }) => [`${n.quotient} = ${s.a} / ${s.b};`]; } } class ii extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "remainder", outTypeFunc: Gc }), this.statements = ({ inputs: s, outputs: n }) => [`${n.remainder} = ${s.a} % ${s.b};`]; } } class ri extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "remainder", outTypeFunc: Rc }), this.statements = ({ inputs: s, outputs: n }) => [`${n.remainder} = mod(${s.a}, ${s.b});`]; } } class ai 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 oi extends v { constructor({ a: A }) { super({ a: A, outKey: "neg", outTypeFunc: Yc }), this.statements = ({ inputs: e, outputs: s }) => [`${s.neg} = -${e.a};`]; } } class gi extends v { constructor({ a: A }) { super({ a: A, outKey: "abs", outTypeFunc: Jc }), this.statements = ({ inputs: e, outputs: s }) => [`${s.abs} = abs(${e.a});`]; } } class ci extends v { constructor({ a: A }) { super({ a: A, outKey: "sign", outTypeFunc: Lc }), this.statements = ({ inputs: e, outputs: s }) => [`${s.sign} = sign(${e.a});`]; } } class li extends v { constructor({ a: A }) { super({ a: A, outKey: "floor", outTypeFunc: _c }), this.statements = ({ inputs: e, outputs: s }) => [`${s.floor} = floor(${e.a});`]; } } class Ii extends v { constructor({ a: A }) { super({ a: A, outKey: "ceil", outTypeFunc: zc }), this.statements = ({ inputs: e, outputs: s }) => [`${s.ceil} = ceil(${e.a});`]; } } class ui extends v { constructor({ a: A }) { super({ a: A, outKey: "trunc", outTypeFunc: qc }), this.statements = ({ inputs: e, outputs: s }) => [`${s.trunc} = trunc(${e.a});`]; } } class hi extends v { constructor({ a: A }) { super({ a: A, outKey: "round", outTypeFunc: Hc }), this.statements = ({ inputs: e, outputs: s }) => [`${s.round} = round(${e.a});`]; } } class Ci extends v { constructor({ a: A }) { super({ a: A, outKey: "fract", outTypeFunc: Kc }), this.statements = ({ inputs: e, outputs: s }) => [`${s.fract} = fract(${e.a});`]; } } class Bi extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "power", outTypeFunc: $c }), this.statements = ({ inputs: s, outputs: n }) => [`${n.power} = pow(${s.a}, ${s.b});`]; } } class Qi extends v { constructor({ a: A }) { super({ a: A, outKey: "exp", outTypeFunc: Vc }), this.statements = ({ inputs: e, outputs: s }) => [`${s.exp} = exp(${e.a});`]; } } class Ei extends v { constructor({ a: A }) { super({ a: A, outKey: "exp2", outTypeFunc: Pc }), this.statements = ({ inputs: e, outputs: s }) => [`${s.exp2} = exp2(${e.a});`]; } } class fi extends v { constructor({ a: A }) { super({ a: A, outKey: "log", outTypeFunc: Xc }), this.statements = ({ inputs: e, outputs: s }) => [`${s.log} = log(${e.a});`]; } } class pi extends v { constructor({ a: A }) { super({ a: A, outKey: "log2", outTypeFunc: Wc }), this.statements = ({ inputs: e, outputs: s }) => [`${s.log2} = log2(${e.a});`]; } } class di extends v { constructor({ a: A }) { super({ a: A, outKey: "sqr", outTypeFunc: Oc }), this.statements = ({ inputs: e, outputs: s }) => [`${s.sqr} = ${e.a} * ${e.a};`]; } } class yi extends v { constructor({ a: A }) { super({ a: A, outKey: "sqrt", outTypeFunc: jc }), this.statements = ({ inputs: e, outputs: s }) => [`${s.sqrt} = sqrt(${e.a});`]; } } class wi extends v { constructor({ a: A }) { super({ a: A, outKey: "inversesqrt", outTypeFunc: Zc }), this.statements = ({ inputs: e, outputs: s }) => [`${s.inversesqrt} = inversesqrt(${e.a});`]; } } class mi 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 xi extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "max", outTypeFunc: Al }), this.statements = ({ inputs: s, outputs: n }) => [`${n.max} = max(${s.a}, ${s.b});`]; } } class Si extends dt { constructor({ a: A, min: e, max: s }) { super({ a: A, b: e, c: s, outKey: "clamp", outTypeFunc: tl }), this.statements = ({ inputs: n, outputs: i }) => { const { a: r, b: a, c: o } = n; return [`${i.clamp} = clamp(${r}, ${a}, ${o});`]; }; } } class Di extends dt { constructor({ a: A, b: e, t: s }) { super({ a: A, b: e, c: s, outKey: "mix", outTypeFunc: el }), this.statements = ({ inputs: n, outputs: i }) => { const { a: r, b: a, c: o } = n; return [`${i.mix} = mix(${r}, ${a}, ${o});`]; }; } } class Mi extends tA { constructor({ edge: A, x: e }) { super({ a: A, b: e, outKey: "step", outTypeFunc: sl }), this.statements = ({ inputs: s, outputs: n }) => { const { a: i, b: r } = s; return [`${n.step} = step(${i}, ${r});`]; }; } } class vi extends dt { constructor({ edge0: A, edge1: e, x: s }) { super({ a: A, b: e, c: s, outKey: "smoothstep", outTypeFunc: nl }), this.statements = ({ inputs: n, outputs: i }) => { const { a: r, b: a, c: o } = n; return [`${i.smoothstep} = smoothstep(${r}, ${a}, ${o});`]; }; } } class bi extends v { constructor({ a: A }) { super({ a: A, outKey: "isNan", outTypeFunc: On }), this.statements = ({ inputs: e, outputs: s }) => [`${s.isNan} = isNan(${e.a});`]; } } class Fi extends v { constructor({ a: A }) { super({ a: A, outKey: "isInf", outTypeFunc: il }), this.statements = ({ inputs: e, outputs: s }) => [`${s.isInf} = isInf(${e.a});`]; } } const Dl = (t, A) => new Ni({ a: t, b: A }), Ml = (t, A) => new Ti({ a: t, b: A }), vl = (t, A) => new Ui({ a: t, b: A }), bl = (t) => new Gi({ a: t }), Fl = (t, A) => new Ri({ a: t, b: A }), kl = (t, A) => new Yi({ a: t, b: A }), Nl = (t, A) => new Ji({ a: t, b: A }), ki = (t, A) => new Li({ a: t, b: A }), Tl = (t, A) => new _i({ a: t, b: A }), Ul = (t, A) => new zi({ a: t, b: A }), Gl = (t) => new qi({ a: t }), Rl = (t) => new Hi({ a: t }), rs = (t, A, e) => new Ki({ cond: t, t: A, f: e }), Yl = (t) => new Vi({ a: t }); class Ni 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 Ti 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 Ui 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 Gi 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 Ri extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (s, n) => fe(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 Yi extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (s, n) => fe(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 Ji extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (s, n) => fe(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 Li extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: (s, n) => fe(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 _i extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: $i, 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 zi extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outTypeFunc: Jl, 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 qi 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 Hi 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 Ki extends dt { 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 fe(t, A) { if (pt(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 $i(t, A = "equal") { if (pt(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 Jl(t) { return $i(t, "notEqual"); } function Ll(t) { if (ft(t)) return "bool"; if (BA(t)) return "int"; if (QA(t)) return "uint"; throw new Error(`Invalid compXor type: ${t}`); } class Vi extends v { constructor({ a: A }) { const e = Ll($(A)); super({ a: A, outTypeFunc: (s) => e, outKey: "compXor" }), this.statements = ({ inputs: s, outputs: n }) => { if (pt(this.outTypes.compXor)) return [`${n.compXor} = ${s.a};`]; const r = (Ft(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 _l = (t) => new Ar({ value: t }), zl = (t) => new tr({ value: t }), ql = (t) => new er({ value: t }), Pi = (t) => new sr({ value: t }), Hl = (t) => new nr({ value: t }), Kl = (t) => new ir({ value: t }), $l = (t) => new rr({ value: t }), Vl = (t) => new ar({ value: t }), Pl = (t) => new or({ value: t }), Xl = (t) => new gr({ value: t }), Wl = (t) => new cr({ value: t }), Ol = (t) => new lr({ value: t }), jl = (t) => new Ir({ value: t }), Xi = (t) => new ur({ value: t }), Bt = (t) => new hr({ value: t }), Wi = (t) => new Cr({ value: t }), Zl = (t) => new Br({ value: t }), AI = (t) => new Qr({ value: t }), tI = (t) => new Er({ value: t }), Oi = (t) => new fr({ value: t }), ji = (t) => new pr({ value: t }), eI = (t) => new dr({ value: t }), sI = (t) => new yr({ value: t }), nI = (t) => new wr({ value: t }), iI = (t) => new mr({ value: t }), rI = (t) => new xr({ value: t }), aI = (t) => new Sr({ value: t }), Zi = (t) => new Dr({ value: t }), oI = (t) => new Mr({ value: t }), Le = (t) => new vr({ value: t }); class gA extends v { constructor({ value: A, outType: e, outKey: s }) { super({ a: A, outTypeFunc: () => e, outKey: s }), this.statements = ({ inputs: n, outputs: i }) => [ `${i[s]} = ${_s(e)}(${n.a});` ]; } } class Ar extends gA { constructor({ value: A }) { super({ value: A, outType: "bool", outKey: "bool" }); } } class tr extends gA { constructor({ value: A }) { super({ value: A, outType: "int", outKey: "int" }); } } class er extends gA { constructor({ value: A }) { super({ value: A, outType: "uint", outKey: "uint" }); } } class sr extends gA { constructor({ value: A }) { super({ value: A, outType: "float", outKey: "float" }); } } class nr extends gA { constructor({ value: A }) { super({ value: A, outType: "bvec2", outKey: "bvec2" }); } } class ir extends gA { constructor({ value: A }) { super({ value: A, outType: "bvec3", outKey: "bvec3" }); } } class rr extends gA { constructor({ value: A }) { super({ value: A, outType: "bvec4", outKey: "bvec4" }); } } class ar extends gA { constructor({ value: A }) { super({ value: A, outType: "ivec2", outKey: "ivec2" }); } } class or extends gA { constructor({ value: A }) { super({ value: A, outType: "ivec3", outKey: "ivec3" }); } } class gr extends gA { constructor({ value: A }) { super({ value: A, outType: "ivec4", outKey: "ivec4" }); } } class cr extends gA { constructor({ value: A }) { super({ value: A, outType: "uvec2", outKey: "uvec2" }); } } class lr extends gA { constructor({ value: A }) { super({ value: A, outType: "uvec3", outKey: "uvec3" }); } } class Ir extends gA { constructor({ value: A }) { super({ value: A, outType: "uvec4", outKey: "uvec4" }); } } class ur extends gA { constructor({ value: A }) { super({ value: A, outType: "vec2", outKey: "vec2" }); } } class hr extends gA { constructor({ value: A }) { super({ value: A, outType: "vec3", outKey: "vec3" }); } } class Cr extends gA { constructor({ value: A }) { super({ value: A, outType: "vec4", outKey: "vec4" }); } } class Br extends gA { constructor({ value: A }) { super({ value: A, outType: "mat2", outKey: "mat2" }); } } class Qr extends gA { constructor({ value: A }) { super({ value: A, outType: "mat3", outKey: "mat3" }); } } class Er extends gA { constructor({ value: A }) { super({ value: A, outType: "mat4", outKey: "mat4" }); } } class fr extends v { constructor({ value: A }) { super({ a: A, outKey: "int", outTypeFunc: () => "int" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.int} = floatBitsToInt(${e.a});`]; } } class pr extends v { constructor({ value: A }) { super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.uint} = floatBitsToUint(${e.a});`]; } } class dr extends v { constructor({ value: A }) { super({ a: A, outKey: "float", outTypeFunc: () => "float" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.float} = intBitsToFloat(${e.a});`]; } } class yr extends v { constructor({ value: A }) { super({ a: A, outKey: "float", outTypeFunc: () => "float" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.float} = uintBitsToFloat(${e.a});`]; } } class wr extends v { constructor({ value: A }) { super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.uint} = packSnorm2x16(${e.a});`]; } } class mr extends v { constructor({ value: A }) { super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.vec2} = unpackSnorm2x16(${e.a});`]; } } class xr extends v { constructor({ value: A }) { super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.uint} = packUnorm2x16(${e.a});`]; } } class Sr extends v { constructor({ value: A }) { super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.vec2} = unpackUnorm2x16(${e.a});`]; } } class Dr extends v { constructor({ value: A }) { super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.uint} = packHalf2x16(${e.a});`]; } } class Mr extends v { constructor({ value: A }) { super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.vec2} = unpackHalf2x16(${e.a});`]; } } class vr 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 gI = (t) => new Nr({ a: t }), cI = (t, A) => new Tr({ a: t, b: A }), br = (t, A) => new Ur({ a: t, b: A }), lI = (t, A) => new Gr({ a: t, b: A }), Fr = (t) => new Rr({ a: t }), II = (t, A, e) => new Lr({ a: t, b: A, c: e }), uI = (t, A) => new _r({ incident: t, normal: A }), hI = (t, A, e) => new zr({ incident: t, normal: A, eta: e }), Qt = (t) => new Pr({ vector: t }), HA = ({ vector: t, vectorType: A, x: e, y: s, z: n, w: i, r, g: a, b: o, a: c }) => new Xr({ vector: t, vectorType: A, x: e, y: s, z: n, w: i, r, g: a, b: o, a: c }), CI = (t) => new Yr({ a: t }), kr = (t, A) => new Jr({ a: t, b: A }), BI = (t, A) => new Wr({ vector: t, select: A }), QI = (t, A) => new qr({ a: t, b: A }), EI = (t, A) => new Hr({ a: t, b: A }), fI = (t) => new Kr({ a: t }), pI = (t) => new $r({ a: t }), dI = (t) => new Vr({ a: t }); class Nr 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 Tr 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 Ur 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 Gr 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 Rr 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 yI(t) { if (t === "vec3") return "vec2"; if (t === "vec4") return "vec3"; throw new Error("Invalid type"); } class Yr extends v { constructor({ a: A }) { super({ a: A, outTypeFunc: (e) => yI(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 wI(t) { if (t === "float") return "vec2"; if (t === "vec2") return "vec3"; if (t === "vec3") return "vec4"; throw new Error("Invalid type"); } class Jr extends tA { constructor({ a: A, b: e }) { const s = $(A), n = wI(s); super({ a: A, b: e, outKey: "extend", outTypeFunc: () => n }), this.statements = ({ inputs: i, outputs: r }) => [ `${r.extend} = ${n}(${i.a}, ${i.b});` ]; } } class Lr extends dt { 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 _r 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 zr extends dt { 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 qr 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 mI(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 Hr extends tA { constructor({ a: A, b: e }) { super({ a: A, b: e, outKey: "outer", outTypeFunc: mI }), this.statements = ({ inputs: s, outputs: n }) => [ `${n.outer} = outerProduct(${s.a}, ${s.b});` ]; } } function xI(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 Kr extends v { constructor({ a: A }) { super({ a: A, outKey: "transpose", outTypeFunc: xI }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.transpose} = transpose(${e.a});` ]; } } class $r 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 Vr extends v { constructor({ a: A }) { super({ a: A, outKey: "inverse", outTypeFunc: (e) => e }), this.statements = ({ inputs: e, outputs: s }) => [ `${s.inverse} = inverse(${A});` ]; } } function SI(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 Pr extends V { constructor({ vector: A }) { const s = { vector: $(A) }, n = SI(s.vector); super({ inTypes: s, outTypes: n, inputs: { vector: A } }), this.statements = ({ inputs: i, outputs: r }) => { const { x: a, y: o, z: c, w: l, r: g, g: I, b: h, a: B } = r, { vector: C } = i; return [ a ? `${a} = ${C}.x;` : null, o ? `${o} = ${C}.y;` : null, c ? `${c} = ${C}.z;` : null, l ? `${l} = ${C}.w;` : null, g ? `${g} = ${C}.r;` : null, I ? `${I} = ${C}.g;` : null, h ? `${h} = ${C}.b;` : null, B ? `${B} = ${C}.a;` : null ].filter(Boolean); }; } } class Xr extends V { constructor({ vector: A, vectorType: e, x: s, y: n, z: i, w: r, r: a, g: o, b: c, a: l }) { if (!A && !e) throw new Error("Either vector or vectorType must be provided"); const g = e ?? $(A), I = Ys(g), h = Js(g), B = { vector: g, x: I, y: I, r: I, g: I }, C = { vector: A, x: s, y: n, r: a, g: o }; h >= 3 && (Object.assign(B, { z: I, b: I }), Object.assign(C, { z: i, b: c })), h >= 4 && (Object.assign(B, { w: I, a: I }), Object.assign(C, { w: r, a: l })), super({ inTypes: B, outTypes: { vector: g }, inputs: C }), this.statements = ({ inputs: Q, outputs: E }) => { const { vector: f } = E, { vector: p, x: d, y: w, z: D, w: x, r: y, g: m, b: N, a: M } = Q, S = [ `${f}.x = ${d ?? y ?? (p ? `${p}.x` : Yt(I))};`, `${f}.y = ${w ?? m ?? (p ? `${p}.y` : Yt(I))};` ]; return h >= 3 && S.push( `${f}.z = ${D ?? N ?? (p ? `${p}.z` : Yt(I))};` ), h >= 4 && S.push( `${f}.w = ${x ?? M ?? (p ? `${p}.w` : Yt(I))};` ), S; }; } dynoOut() { return new K( this, "vector" ); } } function DI(t, A) { let e = null; if (Vt(t) ? e = A.length === 1 ? "float" : A.length === 2 ? "vec2" : A.length === 3 ? "vec3" : A.length === 4 ? "vec4" : null : BA(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) => DI(s, e) }), this.statements = ({ inputs: s, outputs: n }) => [ `${n.swizzle} = ${s.a}.${e};` ]; } } const MI = (t, A, e) => new sa({ index: t, from: A, to: e }), vI = (t) => new Tt({ value: t }), bI = (t) => new kA({ state: t }), FI = (t) => new NA({ state: t }), Or = (t) => new na({ value: t }), jr = (t) => new ia({ value: t }), Zr = (t) => new ra({ value: t }), Aa = (t) => new aa({ value: t }), kI = (t) => new oa({ value: t }), NI = (t) => new ga({ value: t }), ta = (t) => new ca({ value: t }), _e = (t) => new la({ value: t }), ea = (t, A, e) => new Ia({ z: t, zNear: A, zFar: e }).outputs.depth; class sa 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: () => [ uA(` 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 NA extends V { constructor({ state: A }) { super({ inTypes: { state: "uint" }, outTypes: { hash: "uint" }, inputs: { state: A }, globals: () => [ uA(` 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 Tt extends V { constructor({ value: A }) { const e = $(A), s = Ls(e); super({ inTypes: { value: e }, outTypes: { state: "uint" }, inputs: { value: A }, globals: () => [ uA(` 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}` : BA(e) ? `${s}(${n.value})` : `floatBitsToUint(${n.value})`; return [ `${s} bits = ${r};`, `${i.state} = pcg_mix(bits);` ]; } }); } dynoOut() { return new K(this, "state"); } } class na extends $A { 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 Tt({ value: e }).outputs.state; return s = new kA({ state: s }).outputs.state, new NA({ state: s }).outputs; } }); } dynoOut() { return new K(this, "hash"); } } class ia extends $A { 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 Tt({ value: e }).outputs.state; s = new kA({ state: s }).outputs.state; const n = new NA({ state: s }).outputs.hash; s = new kA({ state: s }).outputs.state; const i = new NA({ state: s }).outputs.hash; return { hash: HA({ vectorType: "uvec2", x: n, y: i }) }; } }); } dynoOut() { return new K(this, "hash"); } } class ra extends $A { 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 Tt({ value: e }).outputs.state; s = new kA({ state: s }).outputs.state; const n = new NA({ state: s }).outputs.hash; s = new kA({ state: s }).outputs.state; const i = new NA({ state: s }).outputs.hash; s = new kA({ state: s }).outputs.state; const r = new NA({ state: s }).outputs.hash; return { hash: HA({ vectorType: "uvec3", x: n, y: i, z: r }) }; } }); } dynoOut() { return new K(this, "hash"); } } class aa extends $A { 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 Tt({ value: e }).outputs.state; s = new kA({ state: s }).outputs.state; const n = new NA({ state: s }).outputs.hash; s = new kA({ state: s }).outputs.state; const i = new NA({ state: s }).outputs.hash; s = new kA({ state: s }).outputs.state; const r = new NA({ state: s }).outputs.hash; s = new kA({ state: s }).outputs.state; const a = new NA({ state: s }).outputs.hash; return { hash: HA({ vectorType: "uvec4", x: n, y: i, z: r, w: a }) }; } }); } dynoOut() { return new K(this, "hash"); } } class oa extends $A { 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 = Or(e); return { hash: iA(Pi(s), J("float", 1 / 2 ** 32)) }; } }); } dynoOut() { return new K(this, "hash"); } } class ga extends $A { 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 = jr(e); return { hash: iA(Xi(s), J("float", 1 / 2 ** 32)) }; } }); } dynoOut() { return new K(this, "hash"); } } class ca extends $A { 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 = Zr(e); return { hash: iA(Bt(s), J("float", 1 / 2 ** 32)) }; } }); } dynoOut() { return new K(this, "hash"); } } class la extends $A { 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 = Aa(e); return { hash: iA(Wi(s), J("float", 1 / 2 ** 32)) }; } }); } dynoOut() { return new K(this, "hash"); } } class Ia 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 ua = (t, { scale: A, scales: e, rotate: s, translate: n }) => new Ca({ position: t, scale: A, scales: e, rotate: s, translate: n }).outputs.position, ha = (t, { scale: A, scales: e, rotate: s }) => new Ba({ dir: t, scale: A, scales: e, rotate: s }).outputs.dir, TI = (t, { rotate: A }) => new Qa({ quaternion: t, rotate: A }).outputs.quaternion; class Ca 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: c, scales: l, rotate: g, translate: I } = r; return [ `${o} = ${r.position ?? "vec3(0.0, 0.0, 0.0)"};`, c ? `${o} *= ${c};` : null, l ? `${o} *= ${l};` : null, g ? `${o} = quatVec(${g}, ${o});` : null, I ? `${o} += ${I};` : null ].filter(Boolean); } }); } } class Ba 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: c, rotate: l } = i; return [ `${a} = ${i.dir ?? "vec3(0.0, 0.0, 0.0)"};`, o ? `${a} *= ${o};` : null, c ? `${a} *= ${c};` : null, l ? `${a} = quatVec(${l}, ${a});` : null ].filter(Boolean); } }); } } class Qa 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 UI = () => { throw new Error("Not implemented"); }, GI = () => { throw new Error("Not implemented"); }, RI = () => { throw new Error("Not implemented"); }, YI = () => { throw new Error("Not implemented"); }, JI = () => { throw new Error("Not implemented"); }, LI = () => { throw new Error("Not implemented"); }, _I = (t, A) => new Ea({ texture: t, lod: A }), zI = (t, A, e) => new fa({ texture: t, coord: A, bias: e }), qI = (t, A, e) => new pa({ texture: t, coord: A, lod: e }); class Ea extends V { constructor({ texture: A, lod: e }) { const s = $(A); super({ inTypes: { texture: s, lod: "int" }, outTypes: { size: da(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 fa extends V { constructor({ texture: A, coord: e, bias: s }) { const n = $(A); super({ inTypes: { texture: n, coord: HI(n), bias: "float" }, outTypes: { sample: ya(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 pa extends V { constructor({ texture: A, coord: e, lod: s }) { const n = $(A); super({ inTypes: { texture: n, coord: da(n), lod: "int" }, outTypes: { texel: ya(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 da(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 HI(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 ya(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 KI = (t) => new wa({ degrees: t }), $I = (t) => new ma({ radians: t }), ze = (t) => new xa({ radians: t }), VI = (t) => new Sa({ radians: t }), PI = (t) => new Da({ radians: t }), XI = (t) => new Ma({ sin: t }), WI = (t) => new va({ cos: t }), OI = (t) => new ba({ tan: t }), jI = (t, A) => new Fa({ y: t, x: A }), ZI = (t) => new ka({ x: t }), Au = (t) => new Na({ x: t }), tu = (t) => new Ta({ x: t }), eu = (t) => new Ua({ x: t }), su = (t) => new Ga({ x: t }), nu = (t) => new Ra({ x: t }); class wa 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 ma 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 xa 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 Sa 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 Da 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 Ma 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 va 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 ba 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 Fa 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 ka 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 Na 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 Ta 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 Ua 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 Ga 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 Ra 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 bh = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, Abs: gi, Acos: va, Acosh: Ga, Add: ti, All: Hi, And: Ni, Any: qi, Asin: Ma, Asinh: Ua, Atan: ba, Atan2: Fa, Atanh: Ra, BVec2: nr, BVec3: ir, BVec4: rr, BinaryOp: tA, Bool: Ar, Ceil: Ii, Clamp: Si, Combine: Xr, CombineGsplat: Ws, CompMult: qr, CompXor: Vi, Compilation: qs, Cos: Sa, Cosh: Na, Cross: Gr, Degrees: ma, Determinant: $r, Distance: Tr, Div: ni, Dot: Ur, Dyno: V, DynoBlock: $A, DynoBool: oe, DynoBvec2: sn, DynoBvec3: an, DynoBvec4: cn, DynoConst: zs, DynoFloat: ht, DynoInt: Ht, DynoIsampler2D: Sn, DynoIsampler2DArray: Mn, DynoIsampler3D: Fn, DynoIsamplerCube: Tn, DynoIvec2: rn, DynoIvec3: gn, DynoIvec4: In, DynoLiteral: Mt, DynoMat2: un, DynoMat2x2: hn, DynoMat2x3: Cn, DynoMat2x4: Bn, DynoMat3: Qn, DynoMat3x2: En, DynoMat3x3: fn, DynoMat3x4: pn, DynoMat4: dn, DynoMat4x2: yn, DynoMat4x3: wn, DynoMat4x4: mn, DynoOutput: K, DynoProgram: es, DynoProgramTemplate: ss, DynoRemapIndex: sa, DynoSampler2D: Dn, DynoSampler2DArray: vn, DynoSampler2DArrayShadow: Rn, DynoSampler2DShadow: Gn, DynoSampler3D: kn, DynoSamplerCube: Un, DynoSamplerCubeShadow: Yn, DynoUint: en, DynoUniform: k, DynoUsampler2D: xn, DynoUsampler2DArray: zt, DynoUsampler3D: bn, DynoUsamplerCube: Nn, DynoUvec2: nn, DynoUvec3: on, DynoUvec4: ln, DynoValue: it, DynoVec2: _t, DynoVec3: bt, DynoVec4: Nt, Equal: _i, Exp: Qi, Exp2: Ei, ExtendVec: Jr, FaceForward: Lr, Float: sr, FloatBitsToInt: fr, FloatBitsToUint: pr, Floor: li, Fract: Ci, GreaterThan: Ji, GreaterThanEqual: Li, Gsplat: AA, GsplatNormal: js, Hash: na, Hash2: ia, Hash3: ra, Hash4: aa, HashFloat: oa, HashVec2: ga, HashVec3: ca, HashVec4: la, IMod: ii, IVec2: ar, IVec3: or, IVec4: gr, Int: tr, IntBitsToFloat: dr, Inverse: Vr, InverseSqrt: wi, IsInf: Fi, IsNan: bi, Length: Nr, LessThan: Ri, LessThanEqual: Yi, Log: fi, Log2: pi, Mat2: Br, Mat3: Qr, Mat4: Er, Max: xi, Min: mi, Mix: Di, Mod: ri, Modf: ai, Mul: si, Neg: oi, Normalize: Rr, NormalizedDepth: Ia, Not: Gi, NotEqual: zi, NumPackedSplats: Ks, Or: Ti, Outer: Hr, OutputPackedSplat: tn, OutputRgba8: As, PackHalf2x16: Dr, PackSnorm2x16: wr, PackUnorm2x16: xr, PcgHash: NA, PcgMix: Tt, PcgNext: kA, Pow: Bi, ProjectH: Yr, Radians: wa, ReadPackedSplat: Vs, ReadPackedSplatRange: Ps, ReflectVec: _r, RefractVec: zr, Round: hi, Select: Ki, Sign: ci, SimpleCast: gA, Sin: xa, Sinh: ka, Smoothstep: vi, Split: Pr, SplitGsplat: Xs, Sqr: di, Sqrt: yi, Step: Mi, Sub: ei, Swizzle: Wr, TPackedSplats: Wt, Tan: Da, Tanh: Ta, TexelFetch: pa, Texture: fa, TextureSize: Ea, TransformDir: Ba, TransformGsplat: Zs, TransformPosition: Ca, TransformQuaternion: Qa, Transpose: Kr, TrinaryOp: dt, Trunc: ui, UVec2: cr, UVec3: lr, UVec4: Ir, Uint: er, UintBitsToFloat: yr, UintToRgba8: vr, UnaryOp: v, UnpackHalf2x16: Mr, UnpackSnorm2x16: mr, UnpackUnorm2x16: Sr, Vec2: ur, Vec3: hr, Vec4: Cr, Xor: Ui, abs: al, acos: WI, acosh: su, add: CA, all: Rl, and: Dl, any: Gl, arrayIndex: JI, arrayLength: LI, asin: XI, asinh: eu, atan: OI, atan2: jI, atanh: nu, bool: _l, bvec2: Hl, bvec3: Kl, bvec4: $l, ceil: cl, clamp: yl, combine: HA, combineGsplat: rt, comment: YI, compMult: QI, compXor: Yl, cos: VI, cosh: Au, cross: lI, defineGsplat: vA, defineGsplatNormal: Os, definePackedSplats: Qe, degrees: $I, determinant: pI, distance: cI, div: ie, dot: br, dyno: Xt, dynoBlock: MA, dynoBool: gg, dynoBvec2: Ig, dynoBvec3: Bg, dynoBvec4: fg, dynoConst: J, dynoDeclare: je, dynoFloat: _A, dynoFor: RI, dynoIf: UI, dynoInt: lg, dynoIsampler2D: Gg, dynoIsampler2DArray: Jg, dynoIsampler3D: zg, dynoIsamplerCube: Kg, dynoIvec2: hg, dynoIvec3: Eg, dynoIvec4: dg, dynoLiteral: ae, dynoMat2: wg, dynoMat2x2: mg, dynoMat2x3: xg, dynoMat2x4: Sg, dynoMat3: Dg, dynoMat3x2: Mg, dynoMat3x3: vg, dynoMat3x4: bg, dynoMat4: Fg, dynoMat4x2: kg, dynoMat4x3: Ng, dynoMat4x4: Tg, dynoSampler2D: Rg, dynoSampler2DArray: Lg, dynoSampler2DArrayShadow: Pg, dynoSampler2DShadow: Vg, dynoSampler3D: qg, dynoSamplerCube: $g, dynoSamplerCubeShadow: Xg, dynoSwitch: GI, dynoUint: cg, dynoUsampler2D: Ug, dynoUsampler2DArray: Yg, dynoUsampler3D: _g, dynoUsamplerCube: Hg, dynoUvec2: ug, dynoUvec3: Qg, dynoUvec4: pg, dynoVec2: Cg, dynoVec3: tt, dynoVec4: yg, equal: Tl, exp: hl, exp2: Cl, extendVec: kr, faceforward: II, float: Pi, floatBitsToInt: Oi, floatBitsToUint: ji, floor: gl, fract: re, greaterThan: Nl, greaterThanEqual: ki, gsplatNormal: Ge, hash: Or, hash2: jr, hash3: Zr, hash4: Aa, hashFloat: kI, hashVec2: NI, hashVec3: ta, hashVec4: _e, imod: Je, int: zl, intBitsToFloat: eI, inverse: dI, inversesqrt: pl, isAllFloatType: at, isBoolType: ft, isFloatType: Vt, isInf: Sl, isIntType: BA, isMat2: ot, isMat3: gt, isMat4: ct, isMatFloatType: Rs, isNan: xl, isScalarType: pt, isUintType: QA, isVector2Type: Ft, isVector3Type: kt, isVector4Type: Pt, isVectorType: tg, ivec2: Vl, ivec3: Pl, ivec4: Xl, length: gI, lessThan: Fl, lessThanEqual: kl, literalNegOne: ig, literalOne: ng, literalZero: Yt, log: Bl, log2: Ql, mat2: Zl, mat3: AI, mat4: tI, max: Zn, min: dl, mix: Ai, mod: jn, modf: rl, mul: iA, neg: is, normalize: Fr, normalizedDepth: ea, not: bl, notEqual: Ul, numPackedSplats: rg, numberAsFloat: q, numberAsInt: rA, numberAsUint: aA, or: Ml, outer: EI, outputPackedSplat: An, outputRgba8: ag, packHalf2x16: Zi, packSnorm2x16: nI, packUnorm2x16: rI, pcgHash: FI, pcgMix: vI, pcgNext: bI, pow: ul, projectH: CI, radians: KI, readPackedSplat: vt, readPackedSplatRange: Hs, reflectVec: uI, refractVec: hI, remapIndex: MI, round: Il, sameSizeIvec: sg, sameSizeUvec: Ls, sameSizeVec: eg, select: rs, sign: ol, sin: ze, sinh: ZI, smoothstep: ml, split: Qt, splitGsplat: ut, sqr: El, sqrt: fl, step: wl, sub: Et, swizzle: BI, tan: PI, tanh: tu, texelFetch: qI, texture: zI, textureSize: _I, transformDir: ha, transformGsplat: Ze, transformPos: ua, transformQuat: TI, transpose: fI, trunc: ll, typeLiteral: _s, uint: ql, uintBitsToFloat: sI, uintToRgba8: Le, uniform: og, unindent: uA, unindentLines: GA, unpackHalf2x16: oI, unpackSnorm2x16: iI, unpackUnorm2x16: aI, uvec2: Wl, uvec3: Ol, uvec4: jl, valType: $, vec2: Xi, vec3: Bt, vec4: Wi, vectorDim: Js, vectorElementType: Ys, xor: vl }, Symbol.toStringTag, { value: "Module" })); var iu = `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 FA = class FA { 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) / X) * X * 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 u.WebGLArrayRenderTarget(e, s, n, { depthBuffer: !1, stencilBuffer: !1, generateMipmaps: !1, magFilter: u.NearestFilter, minFilter: u.NearestFilter }), this.target.texture.format = u.RGBAFormat, this.target.texture.type = u.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 = FA.readbackProgram.get(A); if (!e) { const n = MA( { index: "int" }, { rgba8: "vec4" }, ({ index: i }) => (A.inputs.index = i, { rgba8: new As({ rgba8: A.outputs.rgba8 }) }) ); FA.programTemplate || (FA.programTemplate = new ss(iu)), e = new es({ graph: n, inputs: { index: "index" }, outputs: { rgba8: "target" }, template: FA.programTemplate }), Object.assign(e.uniforms, { targetLayer: { value: 0 }, targetBase: { value: 0 }, targetCount: { value: 0 } }), FA.readbackProgram.set(A, e); } const s = e.prepareMaterial(); return FA.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 = X * qA; 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( qA, Math.ceil((A - a) / X) ); e.uniforms.targetLayer.value = r, this.target.scissor.set(0, 0, X, o), s.setRenderTarget(this.target, r), s.xr.enabled = !1, s.autoClear = !1, FA.fullScreenQuad.render(s), i += X * 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 / X) * X; 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 = X * qA; let r = 0; const a = []; for (; r < this.count; ) { const o = Math.floor(r / i), c = o * i, l = Math.min( qA, Math.ceil((this.count - c) / X) ); e.setRenderTarget(this.target, o); const g = X * l * 4, I = n.subarray( c * 4, c * 4 + g ), h = e == null ? void 0 : e.readRenderTargetPixelsAsync( this.target, 0, 0, X, l, I ); a.push(h), r += X * 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; } }; FA.programTemplate = null, FA.readbackProgram = /* @__PURE__ */ new Map(), FA.fullScreenQuad = new ys( new u.RawShaderMaterial({ visible: !1 }) ); let ce = FA; const lA = class lA { constructor(A = {}) { this.capacity = 0, this.count = 0, this.array = null, this.readback = null, this.source = null, this.needsUpdate = !0, this.dyno = new k({ key: "rgbaArray", type: Ya, globals: () => [Ja], value: { texture: lA.getEmpty(), count: 0 }, update: (e) => { var s; return e.texture = ((s = this.readback) == null ? void 0 : s.getTexture()) ?? this.source ?? lA.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 / X) * X, 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 ?? lA.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 u.DataArrayTexture( this.array, A, e, s ), this.source.format = u.RGBAFormat, this.source.type = u.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 ce({ 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 } = lA.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 (!lA.emptySource) { const A = new Uint8Array(4); lA.emptySource = new u.DataArrayTexture(A, 1, 1, 1), lA.emptySource.format = u.RGBAFormat, lA.emptySource.type = u.UnsignedByteType, lA.emptySource.internalFormat = "RGBA8", lA.emptySource.needsUpdate = !0; } return lA.emptySource; } // Create a dyno program that can extract RGBA8 values from a PackedSplats static makeDynos() { if (!lA.dynos) { const A = new os(), e = new Ht({ value: 0 }), s = new Ht({ value: 0 }), n = MA( { index: "int" }, { rgba8: "vec4" }, ({ index: i }) => { if (!i) throw new Error("index is undefined"); i = CA(i, e); const r = Hs( A, i, e, s ); return { rgba8: ut(r).outputs.rgba }; } ); lA.dynos = { dynoSplats: A, dynoBase: e, dynoCount: s, reader: n }; } return lA.dynos; } }; lA.emptySource = null, lA.dynos = null; let qe = lA; const Ya = { type: "RgbaArray" }, Ja = uA(` struct RgbaArray { sampler2DArray texture; int count; }; `); function ru(t, A) { return new V({ inTypes: { rgba: Ya, index: "int" }, outTypes: { rgba: "vec4" }, inputs: { rgba: t, index: A }, globals: () => [Ja], statements: ({ inputs: s, outputs: n }) => GA(` 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 au = /* @__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))(au || {}); function ou(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 gu = /* @__PURE__ */ ((t) => (t.MULTIPLY = "multiply", t.SET_RGB = "set_rgb", t.ADD_RGBA = "add_rgba", t))(gu || {}); function cu(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 lu extends u.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 u.Color(1, 1, 1), this.displace = r ?? new u.Vector3(0, 0, 0), this.radius = a ?? 0; } } const Be = class Be extends u.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 Iu { 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 k({ key: "sdfArray", type: La, globals: () => [_a], value: { numSdfs: 0, sdfTexture: this.sdfTexture }, update: (s) => (s.numSdfs = this.numSdfs, s.sdfTexture = this.sdfTexture, s) }), this.maxEdits = Math.max(16, e ?? 0), this.numEdits = 0, this.editData = new Uint32Array(this.maxEdits * 4), this.editFloatData = new Float32Array(this.editData.buffer), this.dynoNumEdits = new Ht({ value: 0 }), this.dynoEdits = this.newEdits(this.editData, this.maxEdits); } newSdfTexture(A, e) { const s = new u.DataTexture( A, 8, e, u.RGBAIntegerFormat, u.UnsignedIntType ); return s.internalFormat = "RGBA32UI", s.needsUpdate = !0, s; } newEdits(A, e) { return new k({ key: "edits", type: "uvec4", count: e, globals: () => [za], 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) { yt[0] = e; const s = this.editFloatData[A] !== yt[0]; return s && (this.editFloatData[A] = yt[0]), s; } encodeEdit(A, { sdfFirst: e, sdfCount: s, invert: n, rgbaBlendMode: i, softEdge: r, sdfSmooth: a }) { const o = A * 4; let c = !1; return c = this.updateEditData(o + 0, i | (n ? 256 : 0)) || c, c = this.updateEditData(o + 1, e | s << 16) || c, c = this.updateEditFloatData(o + 2, r) || c, c = this.updateEditFloatData(o + 3, a) || c, c; } updateSdfData(A, e) { const s = this.sdfData[A] !== e; return this.sdfData[A] = e, s; } updateSdfFloatData(A, e) { yt[0] = e; const s = this.sdfFloatData[A] !== yt[0]; return s && (this.sdfFloatData[A] = yt[0]), s; } encodeSdf(A, { sdfType: e, invert: s, center: n, quaternion: i, scale: r, sizes: a }, o) { const c = A * 32, l = e | (s ? 256 : 0); let g = !1; g = this.updateSdfFloatData(c + 0, (n == null ? void 0 : n.x) ?? 0) || g, g = this.updateSdfFloatData(c + 1, (n == null ? void 0 : n.y) ?? 0) || g, g = this.updateSdfFloatData(c + 2, (n == null ? void 0 : n.z) ?? 0) || g, g = this.updateSdfData(c + 3, l) || g, g = this.updateSdfFloatData(c + 4, (i == null ? void 0 : i.x) ?? 0) || g, g = this.updateSdfFloatData(c + 5, (i == null ? void 0 : i.y) ?? 0) || g, g = this.updateSdfFloatData(c + 6, (i == null ? void 0 : i.z) ?? 0) || g, g = this.updateSdfFloatData(c + 7, (i == null ? void 0 : i.w) ?? 0) || g, g = this.updateSdfFloatData(c + 8, (r == null ? void 0 : r.x) ?? 0) || g, g = this.updateSdfFloatData(c + 9, (r == null ? void 0 : r.y) ?? 0) || g, g = this.updateSdfFloatData(c + 10, (r == null ? void 0 : r.z) ?? 0) || g, g = this.updateSdfData(c + 11, 0) || g, g = this.updateSdfFloatData(c + 12, (a == null ? void 0 : a.x) ?? 0) || g, g = this.updateSdfFloatData(c + 13, (a == null ? void 0 : a.y) ?? 0) || g, g = this.updateSdfFloatData(c + 14, (a == null ? void 0 : a.z) ?? 0) || g, g = this.updateSdfFloatData(c + 15, (a == null ? void 0 : a.w) ?? 0) || g; const I = Math.min(4, o.length); for (let h = 0; h < I; ++h) { const B = c + 16 + h * 4; g = this.updateSdfFloatData(B + 0, o[h].x) || g, g = this.updateSdfFloatData(B + 1, o[h].y) || g, g = this.updateSdfFloatData(B + 2, o[h].z) || g, g = this.updateSdfFloatData(B + 3, o[h].w) || g; } return g; } // 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((g, { sdfs: I }) => g + I.length, 0), s = this.ensureCapacity({ maxEdits: A.length, maxSdfs: e }), n = [new u.Vector4(), new u.Vector4()], i = new u.Vector3(), r = new u.Quaternion(), a = new u.Vector3(), o = new u.Vector4(); let c = 0, l = s; A.length !== this.dynoNumEdits.value && (this.dynoNumEdits.value = A.length, this.numEdits = A.length, l = !0); for (const [g, { edit: I, sdfs: h }] of A.entries()) { l = this.encodeEdit(g, { sdfFirst: c, sdfCount: h.length, invert: I.invert, rgbaBlendMode: cu(I.rgbaBlendMode), softEdge: I.softEdge, sdfSmooth: I.sdfSmooth }) || l; let B = !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), B = this.encodeSdf( c, { sdfType: ou(C.type), invert: C.invert, center: i, quaternion: r, scale: a, sizes: o }, n ) || B, c += 1; this.numSdfs = c, B && (this.sdfTexture.needsUpdate = !0), l || (l = B); } return { updated: l, dynoUpdated: s }; } // Modify a Gsplat in a dyno shader program using the current edits and SDFs. modify(A) { return uu( A, this.dynoSdfArray, this.dynoNumEdits, this.dynoEdits ); } } const La = { type: "SdfArray" }, _a = uA(` 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); } `), za = uA(` 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 uu(t, A, e, s) { return new V({ inTypes: { gsplat: AA, sdfArray: La, numEdits: "int", rgbaDisplaceEdits: "uvec4" }, outTypes: { gsplat: AA }, globals: () => [_a, za], inputs: { gsplat: t, sdfArray: A, numEdits: e, rgbaDisplaceEdits: s }, statements: ({ inputs: i, outputs: r }) => { const { sdfArray: a, numEdits: o, rgbaDisplaceEdits: c } = i, { gsplat: l } = r; return GA(` ${l} = ${i.gsplat}; if (isGsplatActive(${l}.flags)) { for (int editIndex = 0; editIndex < ${o}; ++editIndex) { applyPackedRgbaDisplaceEdit( ${c}[editIndex], ${a}.sdfTexture, ${a}.numSdfs, ${l}.center, ${l}.rgba ); } } `); } }).outputs.gsplat; } const yt = new Float32Array(1); class hu { constructor(A) { this.modifier = A, this.cache = /* @__PURE__ */ new Map(); } apply(A) { let e = this.cache.get(A); return e || (e = MA( { 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 ht({ value: Number.NEGATIVE_INFINITY }), this.rotate = new Nt({ value: new u.Quaternion( Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY ) }), this.translate = new bt({ value: new u.Vector3( Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY ) }); } // Apply the transform to a Vec3 position in a dyno program. apply(A) { return ua(A, { scale: this.scale, rotate: this.rotate, translate: this.translate }); } applyDir(A) { return ha(A, { rotate: this.rotate }); } // Apply the transform to a Gsplat in a dyno program. applyGsplat(A) { return Ze(A, { scale: this.scale, rotate: this.rotate, translate: this.translate }); } // Update the uniforms to match the given transform matrix. updateFromMatrix(A) { const e = new u.Vector3(), s = new u.Quaternion(), n = new u.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 Kt extends u.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 st = class st extends Kt { constructor(A = {}) { const e = new xt(), s = new xt(), n = new xt(), i = new xt(), r = new Nt({ value: new u.Vector4( Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY ) }), a = new ht({ value: 0 }), o = new ht({ value: 0 }), c = { transform: e, viewToWorld: s, worldToView: n, viewToObject: i, recolor: r, time: a, deltaTime: o }; if (super({ update: ({ time: l, deltaTime: g, viewToWorld: I, globalEdits: h }) => this.update({ time: l, deltaTime: g, viewToWorld: I, globalEdits: h }) }), this.isInitialized = !1, this.recolor = new u.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 KA(), this.packedSplats.splatEncoding = A.splatEncoding ?? { ...pe }, this.numSplats = this.packedSplats.numSplats, this.editable = A.editable ?? !0, this.onFrame = A.onFrame, this.context = c, this.objectModifier = A.objectModifier, this.worldModifier = A.worldModifier, this.updateGenerator(), A.url || A.fileBytes || A.constructSplats || A.packedSplats && !A.packedSplats.isInitialized) this.initialized = this.asyncInitialize(A).then(async () => { if (this.updateGenerator(), this.isInitialized = !0, A.onLoad) { const 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 c = { url: e, fileBytes: s, fileType: n, fileName: i, maxSplats: r, construct: a, splatEncoding: o }; this.packedSplats.reinitialize(c); } this.packedSplats && (await this.packedSplats.initialized, this.numSplats = this.packedSplats.numSplats, this.updateGenerator()); } static async staticInitialize() { await Ns(), st.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 u.Vector3( Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY ), s = new u.Vector3( Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY ), n = new u.Vector3(), i = [-1, 1]; return this.packedSplats.forEachSplat( (a, o, c, l, g, I) => { if (A) e.min(o), s.max(o); else for (const h of i) for (const B of i) for (const C of i) n.set(h * c.x, B * c.y, C * c.z), n.applyQuaternion(l), n.add(o), e.min(n), s.max(n); } ), new u.Box3(e, s); } constructGenerator(A) { const { transform: e, viewToObject: s, recolor: n } = A, i = MA( { index: "int" }, { gsplat: AA }, ({ index: r }) => { if (!r) throw new Error("index is undefined"); let a = vt(this.packedSplats.dyno, r); if (this.maxSh >= 1) { const { sh1Texture: c, sh2Texture: l, sh3Texture: g } = this.ensureShTextures(); if (c) { let I = function(p, d) { const { x: w, y: D } = Qt(d).outputs, x = iA(CA(w, D), J("float", 0.5)), y = iA(Et(D, w), J("float", 0.5)); return CA(x, iA(p, y)); }; const h = s.translate, { center: B } = ut(a).outputs, C = Fr(Et(B, h)), Q = Eu(a, c, C); let E = I(Q, this.packedSplats.dynoSh1MinMax); if (this.maxSh >= 2 && l) { const p = fu(a, l, C); E = CA( E, I(p, this.packedSplats.dynoSh2MinMax) ); } if (this.maxSh >= 3 && g) { const p = pu(a, g, C); E = CA( E, I(p, this.packedSplats.dynoSh3MinMax) ); } let { rgba: f } = ut(a).outputs; f = CA(f, kr(E, J("float", 0))), a = rt({ gsplat: a, rgba: f }); } } if (this.splatRgba) { const c = ru(this.splatRgba.dyno, r); a = rt({ gsplat: a, rgba: c }); } this.skinning && (a = this.skinning.modify(a)), this.objectModifier && (a = this.objectModifier.apply({ gsplat: a }).gsplat), a = e.applyGsplat(a); const o = iA(n, ut(a).outputs.rgba); return a = rt({ 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 Q; this.numSplats = this.packedSplats.numSplats, this.context.time.value = A, this.context.deltaTime.value = s, st.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 c = e.clone().invert(); this.context.worldToView.updateFromMatrix(c) && this.enableWorldToView && (o = !0); const I = new u.Matrix4().compose( i.translate.value, i.rotate.value, new u.Vector3().setScalar(i.scale.value) ).invert().multiply(e); r.updateFromMatrix(I) && (this.enableViewToObject || this.packedSplats.extra.sh1) && (o = !0); const h = new u.Vector4( this.recolor.r, this.recolor.g, this.recolor.b, this.opacity ); h.equals(a.value) || (a.value.copy(h), o = !0); const B = this.editable ? (this.edits ?? []).concat(n) : []; this.editable && !this.edits && this.traverseVisible((E) => { E instanceof le && B.push(E); }), B.sort((E, f) => E.ordering - f.ordering); const C = B.map((E) => { if (E.sdfs != null) return { edit: E, sdfs: E.sdfs }; const f = []; return E.traverseVisible((p) => { p instanceof lu && f.push(p); }), { edit: E, sdfs: f }; }); if (C.length > 0 && !this.rgbaDisplaceEdits) { const E = C.length, f = C.reduce( (p, d) => p + d.sdfs.length, 0 ); this.rgbaDisplaceEdits = new Iu({ maxEdits: E, maxSdfs: f }), this.updateGenerator(); } if (this.rgbaDisplaceEdits) { const E = this.rgbaDisplaceEdits.update(C); o || (o = E.updated), E.dynoUpdated && this.updateGenerator(); } o && this.updateVersion(), (Q = this.onFrame) == null || Q.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, B; if (!this.packedSplats.packedArray || !this.packedSplats.numSplats) return; const { near: s, far: n, ray: i } = A, r = this.matrixWorld.clone().invert(), a = new u.Matrix3().setFromMatrix4(r), o = i.origin.clone().applyMatrix4(r), c = i.direction.clone().applyMatrix3(a), l = new u.Vector3(); r.decompose(new u.Vector3(), new u.Quaternion(), l), (l.x * l.y * l.z) ** (1 / 3); const I = Ho( o.x, o.y, o.z, c.x, c.y, c.z, s, n, this.packedSplats.numSplats, this.packedSplats.packedArray, !0, ((h = this.packedSplats.splatEncoding) == null ? void 0 : h.lnScaleMin) ?? TA, ((B = this.packedSplats.splatEncoding) == null ? void 0 : B.lnScaleMax) ?? UA ); for (const C of I) { const Q = i.direction.clone().multiplyScalar(C).add(i.origin); e.push({ distance: C, point: Q, 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 c = new u.DataArrayTexture(n, i, r, a); c.format = u.RGIntegerFormat, c.type = u.UnsignedIntType, c.internalFormat = "RG32UI", c.needsUpdate = !0, A = new zt({ value: c, key: "sh1" }), this.packedSplats.extra.sh1Texture = A; } if (!this.packedSplats.extra.sh2) return { sh1Texture: A }; let e = this.packedSplats.extra.sh2Texture; if (!e) { let 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 c = new u.DataArrayTexture(n, i, r, a); c.format = u.RGBAIntegerFormat, c.type = u.UnsignedIntType, c.internalFormat = "RGBA32UI", c.needsUpdate = !0, e = new zt({ value: c, 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 c = new u.DataArrayTexture(n, i, r, a); c.format = u.RGBAIntegerFormat, c.type = u.UnsignedIntType, c.internalFormat = "RGBA32UI", c.needsUpdate = !0, s = new zt({ value: c, key: "sh3" }), this.packedSplats.extra.sh3Texture = s; } return { sh1Texture: A, sh2Texture: e, sh3Texture: s }; } }; st.staticInitialized = st.staticInitialize(), st.isStaticInitialized = !1, st.dynoTime = new ht({ value: 0 }); let WA = st; const Cu = uA(` 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); } `), Bu = uA(` 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)); } `), Qu = uA(` 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 Eu(t, A, e) { return Xt({ inTypes: { gsplat: AA, sh1: "usampler2DArray", viewDir: "vec3" }, outTypes: { rgb: "vec3" }, inputs: { gsplat: t, sh1: A, viewDir: e }, globals: () => [vA, Cu], statements: ({ inputs: s, outputs: n }) => GA(` if (isGsplatActive(${s.gsplat}.flags)) { ${n.rgb} = evaluateSH1(${s.gsplat}, ${s.sh1}, ${s.viewDir}); } else { ${n.rgb} = vec3(0.0); } `) }).outputs.rgb; } function fu(t, A, e) { return Xt({ inTypes: { gsplat: AA, sh2: "usampler2DArray", viewDir: "vec3" }, outTypes: { rgb: "vec3" }, inputs: { gsplat: t, sh2: A, viewDir: e }, globals: () => [vA, Bu], statements: ({ inputs: s, outputs: n }) => GA(` if (isGsplatActive(${s.gsplat}.flags)) { ${n.rgb} = evaluateSH2(${s.gsplat}, ${s.sh2}, ${s.viewDir}); } else { ${n.rgb} = vec3(0.0); } `) }).outputs.rgb; } function pu(t, A, e) { return Xt({ inTypes: { gsplat: AA, sh3: "usampler2DArray", viewDir: "vec3" }, outTypes: { rgb: "vec3" }, inputs: { gsplat: t, sh3: A, viewDir: e }, globals: () => [vA, Qu], statements: ({ inputs: s, outputs: n }) => GA(` if (isGsplatActive(${s.gsplat}.flags)) { ${n.rgb} = evaluateSH3(${s.gsplat}, ${s.sh3}, ${s.viewDir}); } else { ${n.rgb} = vec3(0.0); } `) }).outputs.rgb; } const St = class St { // 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 c = o.split(" "); switch (c[0]) { case "format": if (c[1] === "binary_little_endian") this.littleEndian = !0; else if (c[1] === "binary_big_endian") this.littleEndian = !1; else throw new Error(`Unsupported PLY format: ${c[1]}`); if (c[2] !== "1.0") throw new Error(`Unsupported PLY version: ${c[2]}`); break; case "end_header": break; case "comment": this.comments.push(o.slice(8)); break; case "element": { const l = c[1]; i = { name: l, count: Number.parseInt(c[2]), properties: {} }, this.elements[l] = i; break; } case "property": if (i == null) throw new Error("Property must be inside an element"); c[1] === "list" ? i.properties[c[4]] = { isList: !0, type: c[3], countType: c[2] } : i.properties[c[2]] = { isList: !1, type: c[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 = {}, c = []; for (const [g, I] of Object.entries(a)) I.isList ? (o[g] = [], c.push(() => { const h = o[g]; h.length = te[I.countType]( s, e, this.littleEndian ), e += wt[I.countType]; for (let B = 0; B < h.length; B++) h[B] = te[I.type]( s, e, this.littleEndian ), e += wt[I.type]; })) : (o[g] = 0, c.push(() => { o[g] = te[I.type]( s, e, this.littleEndian ), e += wt[I.type]; })); const l = A(i) ?? (() => { }); for (let g = 0; g < r; g++) { for (const I of c) I(); l(g, 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 = [], c, l, g; function I() { const E = yu[i]; r = new Array(3).fill(null).flatMap( (f, p) => [0, 1, 2].map((d, w) => `f_rest_${p + w * E / 3}`) ), a = new Array(5).fill(null).flatMap( (f, p) => [0, 1, 2].map((d, w) => `f_rest_${3 + p + w * E / 3}`) ), o = new Array(7).fill(null).flatMap( (f, p) => [0, 1, 2].map((d, w) => `f_rest_${8 + p + w * E / 3}`) ), c = i >= 1 ? new Float32Array(3 * 3) : void 0, l = i >= 2 ? new Float32Array(5 * 3) : void 0, g = i >= 3 ? new Float32Array(7 * 3) : void 0; } function h(E, f) { if (!c) throw new Error("Missing sh1"); for (const [p, d] of r.entries()) c[p] = f[d] * 8 / 255 - 4; if (l) for (const [p, d] of a.entries()) l[p] = f[d] * 8 / 255 - 4; if (g) for (const [p, d] of o.entries()) g[p] = f[d] * 8 / 255 - 4; e == null || e(E, c, l, g); } function B(E) { const { min_x: f, min_y: p, min_z: d, max_x: w, max_y: D, max_z: x, min_scale_x: y, min_scale_y: m, min_scale_z: N, max_scale_x: M, max_scale_y: S, max_scale_z: U } = E.properties; if (!f || !p || !d || !w || !D || !x || !y || !m || !N || !M || !S || !U) throw new Error("Missing PLY chunk properties"); return s = !0, (F, b) => { const { min_x: T, min_y: R, min_z: W, max_x: L, max_y: eA, max_z: H, min_scale_x: O, min_scale_y: _, min_scale_z: j, max_scale_x: P, max_scale_y: Z, max_scale_z: G, min_r: fA, min_g: cA, min_b: pA, max_r: dA, max_g: xA, max_b: hA } = b; n.push({ min_x: T, min_y: R, min_z: W, max_x: L, max_y: eA, max_z: H, min_scale_x: O, min_scale_y: _, min_scale_z: j, max_scale_x: P, max_scale_y: Z, max_scale_z: G, min_r: fA, min_g: cA, min_b: pA, max_r: dA, max_g: xA, max_b: hA }); }; } function C(E) { if (e && E.name === "sh") return i = Bs(E.properties), I(), h; if (E.name !== "vertex") return null; const { packed_position: f, packed_rotation: p, packed_scale: d, packed_color: w } = E.properties; if (!f || !p || !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: N, 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: W, max_scale_x: L, max_scale_y: eA, max_scale_z: H, min_r: O, min_g: _, min_b: j, max_r: P, max_g: Z, max_b: G } = m, { packed_position: fA, packed_rotation: cA, packed_scale: pA, packed_color: dA } = y, xA = (fA >>> 21 & 2047) / 2047 * (U - N) + N, hA = (fA >>> 11 & 1023) / 1023 * (F - M) + M, RA = (fA & 2047) / 2047 * (b - S) + S, SA = ((cA >>> 20 & 1023) / 1023 - 0.5) * D, OA = ((cA >>> 10 & 1023) / 1023 - 0.5) * D, jA = ((cA & 1023) / 1023 - 0.5) * D, Y = Math.sqrt(Math.max(0, 1 - SA * SA - OA * OA - jA * jA)), EA = cA >>> 30, VA = EA === 0 ? SA : EA === 1 ? Y : OA, Ut = EA <= 1 ? OA : EA === 2 ? Y : jA, jt = EA <= 2 ? jA : Y, DA = EA === 0 ? Y : SA, z = Math.exp( (pA >>> 21 & 2047) / 2047 * (L - T) + T ), PA = Math.exp( (pA >>> 11 & 1023) / 1023 * (eA - R) + R ), de = Math.exp( (pA & 2047) / 2047 * (H - W) + W ), ye = (dA >>> 24 & 255) / 255 * ((P ?? 1) - (O ?? 0)) + (O ?? 0), we = (dA >>> 16 & 255) / 255 * ((Z ?? 1) - (_ ?? 0)) + (_ ?? 0), me = (dA >>> 8 & 255) / 255 * ((G ?? 1) - (j ?? 0)) + (j ?? 0), xe = (dA & 255) / 255; A( x, xA, hA, RA, z, PA, de, VA, Ut, jt, DA, xe, ye, we, me ); }; } const Q = (E) => { if (E.name === "chunk") return B(E); if (s) return C(E); if (E.name !== "vertex") return null; const { x: f, y: p, z: d, scale_0: w, scale_1: D, scale_2: x, rot_0: y, rot_1: m, rot_2: N, rot_3: M, opacity: S, f_dc_0: U, f_dc_1: F, f_dc_2: b, red: T, green: R, blue: W, alpha: L } = E.properties; if (!f || !p || !d) throw new Error("Missing PLY properties: x, y, z"); const eA = w && D && x, H = y && m && N && M, O = L != null ? ee[L.type] : 1, _ = T != null ? ee[T.type] : 1, j = R != null ? ee[R.type] : 1, P = W != null ? ee[W.type] : 1; return i = Bs(E.properties), I(), (Z, G) => { const fA = eA ? Math.exp(G.scale_0) : St.defaultPointScale, cA = eA ? Math.exp(G.scale_1) : St.defaultPointScale, pA = eA ? Math.exp(G.scale_2) : St.defaultPointScale, dA = H ? G.rot_1 : 0, xA = H ? G.rot_2 : 0, hA = H ? G.rot_3 : 0, RA = H ? G.rot_0 : 1, SA = S != null ? 1 / (1 + Math.exp(-G.opacity)) : L != null ? G.alpha / O : 1, OA = U != null ? G.f_dc_0 * Ae + 0.5 : T != null ? G.red / _ : 1, jA = F != null ? G.f_dc_1 * Ae + 0.5 : R != null ? G.green / j : 1, Y = b != null ? G.f_dc_2 * Ae + 0.5 : W != null ? G.blue / P : 1; if (A( Z, G.x, G.y, G.z, fA, cA, pA, dA, xA, hA, RA, SA, OA, jA, Y ), e && c) { if (c) for (const [EA, VA] of r.entries()) c[EA] = G[VA]; if (l) for (const [EA, VA] of a.entries()) l[EA] = G[VA]; if (g) for (const [EA, VA] of o.entries()) g[EA] = G[VA]; e(Z, c, l, g); } }; }; this.parseData(Q); } // 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 c = 0; const l = n === "vertex"; if (l) { for (const g of ["opacity", "f_dc_0", "f_dc_1", "f_dc_2"]) if (!a[g] || a[g].type !== "float") throw new Error(`Can't injectRgba due to property: ${g}`); } for (const [g, I] of Object.entries(a)) if (I.isList) o.push(() => { const h = te[I.countType]( s, e, this.littleEndian ); e += wt[I.countType], e += h * wt[I.type]; }); else { if (l) if (g === "f_dc_0" || g === "f_dc_1" || g === "f_dc_2") { const h = Number.parseInt( g.slice(5) ); o.push(() => { const B = (A[c + h] / 255 - 0.5) / Ae; Cs[I.type]( s, e, this.littleEndian, B ); }); } else g === "opacity" && o.push(() => { const h = Math.max( -100, Math.min( 100, -Math.log(1 / (A[c + 3] / 255) - 1) ) ); Cs[I.type]( s, e, this.littleEndian, h ); }); o.push(() => { e += wt[I.type]; }); } for (let g = 0; g < r; g++) { for (const I of o) I(); l && (c += 4); } } } }; St.defaultPointScale = 1e-3; let Ie = St; const Ae = 0.28209479177387814, te = { 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) }, Cs = { char: (t, A, e, s) => { t.setInt8(A, s); }, uchar: (t, A, e, s) => { t.setUint8(A, s); }, short: (t, A, e, s) => { t.setInt16(A, s, e); }, ushort: (t, A, e, s) => { t.setUint16(A, s, e); }, int: (t, A, e, s) => { t.setInt32(A, s, e); }, uint: (t, A, e, s) => { t.setUint32(A, s, e); }, float: (t, A, e, s) => { t.setFloat32(A, s, e); }, double: (t, A, e, s) => { t.setFloat64(A, s, e); } }, wt = { char: 1, uchar: 1, short: 2, ushort: 2, int: 4, uint: 4, float: 4, double: 8 }, 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 }, yu = { 0: 0, 1: 9, 2: 24, 3: 45 }; function Bs(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 qa = '(function(){"use strict";let xA;const ss=typeof TextDecoder<"u"?new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}):{decode:()=>{throw Error("TextDecoder not available")}};typeof TextDecoder<"u"&&ss.decode();let jA=null;function Vs(){return(jA===null||jA.byteLength===0)&&(jA=new Uint8Array(xA.memory.buffer)),jA}function js(e,A){return e=e>>>0,ss.decode(Vs().subarray(e,e+A))}function Os(e,A,t){return xA.sort_splats(e,A,t)>>>0}function $s(e,A,t){return xA.sort32_splats(e,A,t)>>>0}async function Ae(e,A){if(typeof Response=="function"&&e instanceof Response){if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(e,A)}catch(s){if(e.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 t=await e.arrayBuffer();return await WebAssembly.instantiate(t,A)}else{const t=await WebAssembly.instantiate(e,A);return t instanceof WebAssembly.Instance?{instance:t,module:e}:t}}function te(){const e={};return e.wbg={},e.wbg.__wbg_buffer_609cc3eee51ed158=function(A){return A.buffer},e.wbg.__wbg_length_3b4f022188ae8db6=function(A){return A.length},e.wbg.__wbg_length_6ca527665d89694d=function(A){return A.length},e.wbg.__wbg_length_8cfd2c6409af88ad=function(A){return A.length},e.wbg.__wbg_new_9fee97a409b32b68=function(A){return new Uint16Array(A)},e.wbg.__wbg_new_e3b321dcfef89fc7=function(A){return new Uint32Array(A)},e.wbg.__wbg_newwithbyteoffsetandlength_e6b7e69acd4c7354=function(A,t,s){return new Float32Array(A,t>>>0,s>>>0)},e.wbg.__wbg_newwithbyteoffsetandlength_f1dead44d1fc7212=function(A,t,s){return new Uint32Array(A,t>>>0,s>>>0)},e.wbg.__wbg_newwithlength_5a5efe313cfd59f1=function(A){return new Float32Array(A>>>0)},e.wbg.__wbg_set_10bad9bee0e9c58b=function(A,t,s){A.set(t,s>>>0)},e.wbg.__wbg_set_d23661d19148b229=function(A,t,s){A.set(t,s>>>0)},e.wbg.__wbg_set_f4f1f0daa30696fc=function(A,t,s){A.set(t,s>>>0)},e.wbg.__wbg_subarray_3aaeec89bb2544f0=function(A,t,s){return A.subarray(t>>>0,s>>>0)},e.wbg.__wbg_subarray_769e1e0f81bb259b=function(A,t,s){return A.subarray(t>>>0,s>>>0)},e.wbg.__wbindgen_init_externref_table=function(){const A=xA.__wbindgen_export_0,t=A.grow(4);A.set(0,void 0),A.set(t+0,void 0),A.set(t+1,null),A.set(t+2,!0),A.set(t+3,!1)},e.wbg.__wbindgen_memory=function(){return xA.memory},e.wbg.__wbindgen_throw=function(A,t){throw new Error(js(A,t))},e}function se(e,A){return xA=e.exports,es.__wbindgen_wasm_module=A,jA=null,xA.__wbindgen_start(),xA}async function es(e){if(xA!==void 0)return xA;typeof e<"u"&&(Object.getPrototypeOf(e)===Object.prototype?{module_or_path:e}=e:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),typeof e>"u"&&(e=new URL("data:application/wasm;base64,AGFzbQEAAAABzAEeYAJ/fwF/YAJ/fwBgA39/fwF/YAF/AX9gA39/fwBgAX8AYAV/f39/fwBgA29/fwFvYAV/f39/fwF/YAFvAW9gA29vfwBgAW8Bf2AAAX9gBH9/f38AYAAAYAR/f39/AX9gA39vbwF/YAF/AW9gAAFvYAF9AX1gBn9/f39/fwBgDX19fX19fX19f29/fX0Bb2AGf39/f39/AX9gBX9/fH9/AGAEf3x/fwBgBX9/fX9/AGAEf31/fwBgBX9/fn9/AGAEf35/fwBgAn19AX0C8gQRA3diZx1fX3diZ19idWZmZXJfNjA5Y2MzZWVlNTFlZDE1OAAJA3diZxpfX3diZ19uZXdfOWZlZTk3YTQwOWIzMmI2OAAJA3diZxpfX3diZ19zZXRfZjRmMWYwZGFhMzA2OTZmYwAKA3diZx1fX3diZ19sZW5ndGhfOGNmZDJjNjQwOWFmODhhZAALA3diZzFfX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9mMWRlYWQ0NGQxZmM3MjEyAAcDd2JnGl9fd2JnX25ld19lM2IzMjFkY2ZlZjg5ZmM3AAkDd2JnGl9fd2JnX3NldF9kMjM2NjFkMTkxNDhiMjI5AAoDd2JnHV9fd2JnX2xlbmd0aF82Y2E1Mjc2NjVkODk2OTRkAAsDd2JnMV9fd2JnX25ld3dpdGhieXRlb2Zmc2V0YW5kbGVuZ3RoX2U2YjdlNjlhY2Q0YzczNTQABwN3YmcaX193Ymdfc2V0XzEwYmFkOWJlZTBlOWM1OGIACgN3YmcdX193YmdfbGVuZ3RoXzNiNGYwMjIxODhhZThkYjYACwN3YmcfX193Ymdfc3ViYXJyYXlfNzY5ZTFlMGY4MWJiMjU5YgAHA3diZx9fX3diZ19zdWJhcnJheV8zYWFlZWM4OWJiMjU0NGYwAAcDd2JnJF9fd2JnX25ld3dpdGhsZW5ndGhfNWE1ZWZlMzEzY2ZkNTlmMQARA3diZxBfX3diaW5kZ2VuX3Rocm93AAEDd2JnEV9fd2JpbmRnZW5fbWVtb3J5ABIDd2JnH19fd2JpbmRnZW5faW5pdF9leHRlcm5yZWZfdGFibGUADgNhYAMAAQIIBQQCEwEMAAEBAgAAAQwBBAYFBQQAAQYFFAENBAAGBQQEAQQOAgECAQAIBAAVARYG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ACIDKAIEQXhxRgRAIAMhAgwBCyABQRkgAkEBdmtBACACQR9HG3QhBQNAIAMgBUEddkEEcWpBEGoiBCgCACICRQ0CIAVBAXQhBSACIQMgAigCBEF4cSABRw0ACwsgAigCCCIBIAA2AgwgAiAANgIIIABBADYCGCAAIAI2AgwgACABNgIIDwsgBCAANgIAIAAgAzYCGCAAIAA2AgwgACAANgIIC/MCAQR/IwBBMGsiACQAAkACQEGQksAAKAIARQRAQaiSwAAoAgAhAUGoksAAQQA2AgAgAUUNASAAQRhqIAERBQAgAEEQaiICIABBJGopAgA3AwAgACAAKQIcNwMIIAAoAhghAUGQksAAKAIAIgMNAgJAIANFDQBBlJLAACgCACICRQ0AQZiSwAAoAgAgAkECdBBlC0GUksAAIAE2AgBBkJLAAEEBNgIAQZiSwAAgACkDCDcCAEGgksAAIABBEGopAwA3AgALIABBMGokAEGUksAADwsgAEEANgIoIABBATYCHCAAQaCHwAA2AhggAEIENwIgIABBGGpBiIjAABBDAAsgAEEoaiACKQMANwIAIAAgACkDCDcCICAAIAE2AhwgAEEBNgIYAkAgAEEYaiIBKAIARQ0AIAEoAgQiAkUNACABKAIIIAJBAnQQZQsgAEEANgIoIABBATYCHCAAQaiIwAA2AhggAEIENwIgIAFBsIjAABBDAAuoAgIDfwF+IwBBQGoiAiQAIAEoAgBBgICAgHhGBEAgASgCDCEDIAJBJGoiBEEANgIAIAJCgICAgBA3AhwgAkEwaiADKAIAIgNBCGopAgA3AwAgAkE4aiADQRBqKQIANwMAIAIgAykCADcDKCACQRxqQcCIwAAgAkEoahAYGiACQRhqIAQoAgAiAzYCACACIAIpAhwiBTcDECABQQhqIAM2AgAgASAFNwIACyABKQIAIQUgAUKAgICAEDcCACACQQhqIgMgAUEIaiIBKAIANgIAIAFBADYCAEGxk8AALQAAGiACIAU3AwBBDEEEEF0iAUUEQEEEQQwQbQALIAEgAikDADcCACABQQhqIAMoAgA2AgAgAEHgisAANgIEIAAgATYCACACQUBrJAAL0gECBH8BfiMAQSBrIgMkACABIAEgAmoiAksEQEEAQQAQUgALQQggACgCACIEQQF0IgEgAiABIAJLGyICIAJBCEkb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QQRqrUKAgICA4ACENwMoIAEgAa1CgICAgOAAhDcDICABIAFBIGo2AhAgAUEIakHIj8AAEEMAC2kCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQfyNwAA2AgggA0ICNwIUIANCgICAgOAAIgQgA62ENwMoIAMgBCADQQRqrYQ3AyAgAyADQSBqNgIQIANBCGogAhBDAAtpAgF/AX4jAEEwayIDJAAgAyAANgIAIAMgATYCBCADQQI2AgwgA0H4kcAANgIIIANCAjcCFCADQoCAgIDgACIEIANBBGqthDcDKCADIAQgA62ENwMgIAMgA0EgajYCECADQQhqIAIQQwALZgAjAEEwayIAJABBsJPAAC0AAARAIABBAjYCDCAAQbCKwAA2AgggAEIBNwIUIAAgATYCLCAAIABBLGqtQoCAgIDgAIQ3AyAgACAAQSBqNgIQIABBCGpB0IrAABBDAAsgAEEwaiQAC5QBAgN/AW8jAEEgayIDJAAgAyAAKAIAEHAiBDYCACADIAI2AgQgAiAERwRAIANBADYCCCADIANBBGogA0EIahBAAAsQWyIEEFMiBSUBEAUhBhAbIgIgBiYBIAVBhAFPBEAgBRAtCyACIAAoAgAgAUECdhBkIAJBhAFPBEAgAhAtCyAEQYQBTwRAIAQQLQsgA0EgaiQAC08BAX8jAEEwayIAJAAgAEEBNgIMIABBwI3AADYCCCAAQgE3AhQgACAAQS9qrUKAgICAoAWENwMgIAAgAEEgajYCECAAQQhqQcSBwAAQQwALQQEBfyACIAAoAgAgACgCCCIDa0sEQCAAIAMgAhAlIAAoAgghAwsgACgCBCADaiABIAIQHxogACACIANqNgIIQQALTQECf0Gxk8AALQAAGiABKAIEIQIgASgCACEDQQhBBBBdIgFFBEBBBEEIEG0ACyABIAI2AgQgASADNgIAIABB8IrAADYCBCAAIAE2AgALQQEBfyACIAAoAgAgACgCCCIDa0sEQCAAIAMgAhApIAAoAgghAwsgACgCBCADaiABIAIQHxogACACIANqNgIIQQALQQEBfyMAQSBrIgIkACACQQA2AhAgAkEBNgIEIAJCBDcCCCACQS42AhwgAiAANgIYIAIgAkEYajYCACACIAEQQwALswIBA38gACgCACECIAEoAhwiAEEQcUUE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ZCByZWN1cnNpdmVseSBvciBhZnRlciBiZWluZyBkcm9wcGVkTGF6eSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkdgMQACoAAAAvVXNlcnMvZG1hcmNvcy8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL29uY2VfY2VsbC0xLjIxLjMvc3JjL2xpYi5ycwCoAxAAXwAAAAgDAAAZAAAAcmVlbnRyYW50IGluaXQAABgEEAAOAAAAqAMQAF8AAAB6AgAADQAAABYAAAAMAAAABAAAABcAAAAYAAAAGQAAAC9ydXN0L2RlcHMvZGxtYWxsb2MtMC4yLjYvc3JjL2RsbWFsbG9jLnJzYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPj0gc2l6ZSArIG1pbl9vdmVyaGVhZABYBBAAKQAAAKgEAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPD0gc2l6ZSArIG1heF9vdmVyaGVhZAAAWAQQACkAAACuBAAADQAAAEFjY2Vzc0Vycm9ybWVtb3J5IGFsbG9jYXRpb24gb2YgIGJ5dGVzIGZhaWxlZAAAAAsFEAAVAAAAIAUQAA0AAABzdGQvc3JjL2FsbG9jLnJzQAUQABAAAABjAQAACQAAABYAAAAMAAAABAAAABoAAAAAAAAACAAAAAQAAAAbAAAAAAAAAAgAAAAEAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAQAAAABAAAACEAAAAiAAAAIwAAACQAAABFcnJvcgAAACUAAAAMAAAABAAAACYAAAAnAAAAKAAAAGNhcGFjaXR5IG92ZXJmbG93AAAA2AUQABEAAABhbGxvYy9zcmMvcmF3X3ZlYy5yc/QFEAAUAAAAGAAAAAUAQaCMwAAL8AUBAAAAKQAAAGEgZm9ybWF0dGluZyB0cmFpdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB3aGVuIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBkaWQgbm90YWxsb2Mvc3JjL2ZtdC5ycwAAfgYQABAAAAB+AgAADgAAAEJvcnJvd011dEVycm9yYWxyZWFkeSBib3Jyb3dlZDogrgYQABIAAABpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAAyAYQACAAAADoBhAAEgAAAD09IT1tYXRjaGVzYXNzZXJ0aW9uIGBsZWZ0ICByaWdodGAgZmFpbGVkCiAgbGVmdDogCiByaWdodDogABcHEAAQAAAAJwcQABcAAAA+BxAACQAAACByaWdodGAgZmFpbGVkOiAKICBsZWZ0OiAAAAAXBxAAEAAAAGAHEAAQAAAAcAcQAAkAAAA+BxAACQAAADogAAABAAAAAAAAAJwHEAACAAAAfSB9Y29yZS9zcmMvZm10L251bS5ycwAAswcQABMAAABmAAAAFwAAADB4MDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTlyYW5nZSBzdGFydCBpbmRleCAgb3V0IG9mIHJhbmdlIGZvciBzbGljZSBvZiBsZW5ndGggAACiCBAAEgAAALQIEAAiAAAAcmFuZ2UgZW5kIGluZGV4IOgIEAAQAAAAtAgQACIAAAAAAAA/AAAAvwBBqJLAAAsBFABwCXByb2R1Y2VycwIIbGFuZ3VhZ2UBBFJ1c3QADHByb2Nlc3NlZC1ieQMFcnVzdGMdMS44My4wICg5MGIzNWE2MjMgMjAyNC0xMS0yNikGd2FscnVzBjAuMjMuMwx3YXNtLWJpbmRnZW4HMC4yLjEwMABJD3RhcmdldF9mZWF0dXJlcwQrD211dGFibGUtZ2xvYmFscysIc2lnbi1leHQrD3JlZmVyZW5jZS10eXBlcysKbXVsdGl2YWx1ZQ==",self.location.href));const A=te();(typeof e=="string"||typeof Request=="function"&&e instanceof Request||typeof URL=="function"&&e instanceof URL)&&(e=fetch(e));const{instance:t,module:s}=await Ae(await e,A);return se(t,s)}var is={},ee=function(e,A,t,s,i){var n=new Worker(is[A]||(is[A]=URL.createObjectURL(new Blob([e+\';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,s),n},V=Uint8Array,JA=Uint16Array,ns=Int32Array,Ft=new V([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]),St=new V([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]),gs=new V([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),rs=function(e,A){for(var t=new JA(31),s=0;s<31;++s)t[s]=A+=1<>1|(X&21845)<<1;SA=(SA&52428)>>2|(SA&13107)<<2,SA=(SA&61680)>>4|(SA&3855)<<4,gt[X]=((SA&65280)>>8|(SA&255)<<8)>>1}for(var HA=function(e,A,t){for(var s=e.length,i=0,n=new JA(A);i>I]=o}else for(r=new JA(s),i=0;i>15-e[i]);return r},OA=new V(288),X=0;X<144;++X)OA[X]=8;for(var X=144;X<256;++X)OA[X]=9;for(var X=256;X<280;++X)OA[X]=7;for(var X=280;X<288;++X)OA[X]=8;for(var as=new V(32),X=0;X<32;++X)as[X]=5;var Cs=HA(OA,9,1),Bs=HA(as,5,1),rt=function(e){for(var A=e[0],t=1;tA&&(A=e[t]);return A},BA=function(e,A,t){var s=A/8|0;return(e[s]|e[s+1]<<8)>>(A&7)&t},It=function(e,A){var t=A/8|0;return(e[t]|e[t+1]<<8|e[t+2]<<16)>>(A&7)},Nt=function(e){return(e+7)/8|0},dA=function(e,A,t){return(A==null||A<0)&&(A=0),(t==null||t>e.length)&&(t=e.length),new V(e.subarray(A,t))},Qs=["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"],j=function(e,A,t){var s=new Error(A||Qs[e]);if(s.code=e,Error.captureStackTrace&&Error.captureStackTrace(s,j),!t)throw s;return s},kt=function(e,A,t,s){var i=e.length,n=s?s.length:0;if(!i||A.f&&!A.l)return t||new V(0);var g=!t,r=g||A.i!=2,I=A.i;g&&(t=new V(i*3));var o=function(gA){var oA=t.length;if(gA>oA){var aA=new V(Math.max(oA*2,gA));aA.set(t),t=aA}},a=A.f||0,C=A.p||0,Q=A.b||0,B=A.l,h=A.d,l=A.m,c=A.n,E=i*8;do{if(!B){a=BA(e,C,1);var u=BA(e,C+1,3);if(C+=3,u)if(u==1)B=Cs,h=Bs,l=9,c=5;else if(u==2){var S=BA(e,C,31)+257,b=BA(e,C+10,15)+4,x=S+BA(e,C+5,31)+1;C+=14;for(var m=new V(x),G=new V(19),p=0;p>4;if(y<16)m[p++]=y;else{var N=0,q=0;for(y==16?(q=3+BA(e,C,3),C+=2,N=m[p-1]):y==17?(q=3+BA(e,C,7),C+=3):y==18&&(q=11+BA(e,C,127),C+=7);q--;)m[p++]=N}}var T=m.subarray(0,S),v=m.subarray(S);l=rt(T),c=rt(v),B=HA(T,l,1),h=HA(v,c,1)}else j(1);else{var y=Nt(C)+4,f=e[y-4]|e[y-3]<<8,D=y+f;if(D>i){I&&j(0);break}r&&o(Q+f),t.set(e.subarray(y,D),Q),A.b=Q+=f,A.p=C=D*8,A.f=a;continue}if(C>E){I&&j(0);break}}r&&o(Q+131072);for(var P=(1<>4;if(C+=N&15,C>E){I&&j(0);break}if(N||j(2),L<256)t[Q++]=L;else if(L==256){W=C,B=null;break}else{var K=L-254;if(L>264){var p=L-257,J=Ft[p];K=BA(e,C,(1<>4;R||j(3),C+=R&15;var v=os[F];if(F>3){var J=St[F];v+=It(e,C)&(1<E){I&&j(0);break}r&&o(Q+131072);var eA=Q+K;if(Q>>0},Gt=function(e,A){return tA(e,A)+tA(e,A+4)*4294967296},Be=function(e){(e[0]!=31||e[1]!=139||e[2]!=8)&&j(6,"invalid gzip data");var A=e[3],t=10;A&4&&(t+=(e[10]|e[11]<<8)+2);for(var s=(A>>3&1)+(A>>4&1);s>0;s-=!e[t++]);return t+(A&2)},Ut=function(){function e(A,t){typeof A=="function"&&(t=A,A={}),this.ondata=t;var s=A&&A.dictionary&&A.dictionary.subarray(-32768);this.s={i:0,b:s?s.length:0},this.o=new V(32768),this.p=new V(0),s&&this.o.set(s)}return e.prototype.e=function(A){if(this.ondata||j(5),this.d&&j(4),!this.p.length)this.p=A;else if(A.length){var t=new V(this.p.length+A.length);t.set(this.p),t.set(A,this.p.length),this.p=t}},e.prototype.c=function(A){this.s.i=+(this.d=A||!1);var t=this.s.b,s=kt(this.p,this.s,this.o);this.ondata(dA(s,t,this.s.b),this.d),this.o=dA(s,this.s.b-32768),this.s.b=this.o.length,this.p=dA(this.p,this.s.p/8|0),this.s.p&=7},e.prototype.push=function(A,t){this.e(A),this.c(t)},e}();function Qe(e,A,t){return t||(t=A,A={}),typeof t!="function"&&j(7),Ce(e,A,[ae],function(s){return Es(at(s.data[0],cs(s.data[1])))},1,t)}function at(e,A){return kt(e,{i:2},A&&A.out,A&&A.dictionary)}var ls=function(){function e(A,t){this.v=1,this.r=0,Ut.call(this,A,t)}return e.prototype.push=function(A,t){if(Ut.prototype.e.call(this,A),this.r+=A.length,this.v){var s=this.p.subarray(this.v-1),i=s.length>3?Be(s):4;if(i>s.length){if(!t)return}else this.v>1&&this.onmember&&this.onmember(this.r-s.length);this.p=s.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 V(0),this.push(new V(0),t))},e}(),Yt=typeof TextDecoder<"u"&&new TextDecoder;try{Yt.decode(ge,{stream:!0})}catch{}var he=function(e){for(var A="",t=0;;){var s=e[t++],i=(s>127)+(s>223)+(s>239);if(t+i>e.length)return{s:A,r:dA(e,t-1)};i?i==3?(s=((s&15)<<18|(e[t++]&63)<<12|(e[t++]&63)<<6|e[t++]&63)-65536,A+=String.fromCharCode(55296|s>>10,56320|s&1023)):i&1?A+=String.fromCharCode((s&31)<<6|e[t++]&63):A+=String.fromCharCode((s&15)<<12|(e[t++]&63)<<6|e[t++]&63):A+=String.fromCharCode(s)}};function Ee(e,A){if(A){for(var t="",s=0;s65558)return g(j(13,0,1),null),i;var I=lA(e,r+8);if(I){var o=I,a=tA(e,r+16),C=a==4294967295||o==65535;if(C){var Q=tA(e,r-12);C=tA(e,Q)==101075792,C&&(o=I=tA(e,Q+32),a=tA(e,Q+48))}for(var B=A&&A.filter,h=function(c){var E=ys(e,a,C),u=E[0],y=E[1],f=E[2],D=E[3],S=E[4],b=E[5],x=us(e,b);a=S;var m=function(p,w){p?(i(),g(p,null)):(w&&(n[D]=w),--I||g(null,n))};if(!B||B({name:D,size:y,originalSize:f,compression:u}))if(!u)m(null,dA(e,x,x+y));else if(u==8){var G=e.subarray(x,x+y);if(f<524288||y>.8*f)try{m(null,at(G,{out:new V(f)}))}catch(p){m(p,null)}else s.push(Qe(G,{size:f},m))}else m(j(14,"unknown compression type "+u,1),null);else m(null,null)},l=0;l65558)&&j(13);var i=lA(e,s+8);if(!i)return{};var n=tA(e,s+16),g=n==4294967295||i==65535;if(g){var r=tA(e,s-12);g=tA(e,r)==101075792,g&&(i=tA(e,r+32),n=tA(e,r+48))}for(var I=A&&A.filter,o=0;o=0?1:-1,y=1-E*E;if(y>Number.EPSILON){const D=Math.sqrt(y),S=Math.atan2(D,E*u);c=Math.sin(c*S)/D,r=Math.sin(r*S)/D}const f=r*u;if(I=I*c+Q*f,o=o*c+B*f,a=a*c+h*f,C=C*c+l*f,c===1-r){const D=1/Math.sqrt(I*I+o*o+a*a+C*C);I*=D,o*=D,a*=D,C*=D}}A[t]=I,A[t+1]=o,A[t+2]=a,A[t+3]=C}static multiplyQuaternionsFlat(A,t,s,i,n,g){const r=s[i],I=s[i+1],o=s[i+2],a=s[i+3],C=n[g],Q=n[g+1],B=n[g+2],h=n[g+3];return A[t]=r*h+a*C+I*B-o*Q,A[t+1]=I*h+a*Q+o*C-r*B,A[t+2]=o*h+a*B+r*Q-I*C,A[t+3]=a*h-r*C-I*Q-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,s,i){return this._x=A,this._y=t,this._z=s,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 s=A._x,i=A._y,n=A._z,g=A._order,r=Math.cos,I=Math.sin,o=r(s/2),a=r(i/2),C=r(n/2),Q=I(s/2),B=I(i/2),h=I(n/2);switch(g){case"XYZ":this._x=Q*a*C+o*B*h,this._y=o*B*C-Q*a*h,this._z=o*a*h+Q*B*C,this._w=o*a*C-Q*B*h;break;case"YXZ":this._x=Q*a*C+o*B*h,this._y=o*B*C-Q*a*h,this._z=o*a*h-Q*B*C,this._w=o*a*C+Q*B*h;break;case"ZXY":this._x=Q*a*C-o*B*h,this._y=o*B*C+Q*a*h,this._z=o*a*h+Q*B*C,this._w=o*a*C-Q*B*h;break;case"ZYX":this._x=Q*a*C-o*B*h,this._y=o*B*C+Q*a*h,this._z=o*a*h-Q*B*C,this._w=o*a*C+Q*B*h;break;case"YZX":this._x=Q*a*C+o*B*h,this._y=o*B*C+Q*a*h,this._z=o*a*h-Q*B*C,this._w=o*a*C-Q*B*h;break;case"XZY":this._x=Q*a*C-o*B*h,this._y=o*B*C-Q*a*h,this._z=o*a*h+Q*B*C,this._w=o*a*C+Q*B*h;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+g)}return t===!0&&this._onChangeCallback(),this}setFromAxisAngle(A,t){const s=t/2,i=Math.sin(s);return this._x=A.x*i,this._y=A.y*i,this._z=A.z*i,this._w=Math.cos(s),this._onChangeCallback(),this}setFromRotationMatrix(A){const t=A.elements,s=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],Q=s+r+C;if(Q>0){const B=.5/Math.sqrt(Q+1);this._w=.25/B,this._x=(a-I)*B,this._y=(n-o)*B,this._z=(g-i)*B}else if(s>r&&s>C){const B=2*Math.sqrt(1+s-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-s-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-s-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 s=A.dot(t)+1;return sMath.abs(A.z)?(this._x=-A.y,this._y=A.x,this._z=0,this._w=s):(this._x=0,this._y=-A.z,this._z=A.y,this._w=s)):(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=s),this.normalize()}angleTo(A){return 2*Math.acos(Math.abs(rA(this.dot(A),-1,1)))}rotateTowards(A,t){const s=this.angleTo(A);if(s===0)return this;const i=Math.min(1,t/s);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 s=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=s*a+g*r+i*o-n*I,this._y=i*a+g*I+n*r-s*o,this._z=n*a+g*o+s*I-i*r,this._w=g*a-s*r-i*I-n*o,this._onChangeCallback(),this}slerp(A,t){if(t===0)return this;if(t===1)return this.copy(A);const s=this._x,i=this._y,n=this._z,g=this._w;let r=g*A._w+s*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=s,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*s+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,Q=Math.sin(t*a)/o;return this._w=g*C+this._w*Q,this._x=s*C+this._x*Q,this._y=i*C+this._y*Q,this._z=n*C+this._z*Q,this._onChangeCallback(),this}slerpQuaternions(A,t,s){return this.copy(A).slerp(t,s)}random(){const A=2*Math.PI*Math.random(),t=2*Math.PI*Math.random(),s=Math.random(),i=Math.sqrt(1-s),n=Math.sqrt(s);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,s=0){d.prototype.isVector3=!0,this.x=A,this.y=t,this.z=s}set(A,t,s){return s===void 0&&(s=this.z),this.x=A,this.y=t,this.z=s,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(Ms.setFromEuler(A))}applyAxisAngle(A,t){return this.applyQuaternion(Ms.setFromAxisAngle(A,t))}applyMatrix3(A){const t=this.x,s=this.y,i=this.z,n=A.elements;return this.x=n[0]*t+n[3]*s+n[6]*i,this.y=n[1]*t+n[4]*s+n[7]*i,this.z=n[2]*t+n[5]*s+n[8]*i,this}applyNormalMatrix(A){return this.applyMatrix3(A).normalize()}applyMatrix4(A){const t=this.x,s=this.y,i=this.z,n=A.elements,g=1/(n[3]*t+n[7]*s+n[11]*i+n[15]);return this.x=(n[0]*t+n[4]*s+n[8]*i+n[12])*g,this.y=(n[1]*t+n[5]*s+n[9]*i+n[13])*g,this.z=(n[2]*t+n[6]*s+n[10]*i+n[14])*g,this}applyQuaternion(A){const t=this.x,s=this.y,i=this.z,n=A.x,g=A.y,r=A.z,I=A.w,o=2*(g*i-r*s),a=2*(r*t-n*i),C=2*(n*s-g*t);return this.x=t+I*o+g*C-r*a,this.y=s+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,s=this.y,i=this.z,n=A.elements;return this.x=n[0]*t+n[4]*s+n[8]*i,this.y=n[1]*t+n[5]*s+n[9]*i,this.z=n[2]*t+n[6]*s+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=rA(this.x,A.x,t.x),this.y=rA(this.y,A.y,t.y),this.z=rA(this.z,A.z,t.z),this}clampScalar(A,t){return this.x=rA(this.x,A,t),this.y=rA(this.y,A,t),this.z=rA(this.z,A,t),this}clampLength(A,t){const s=this.length();return this.divideScalar(s||1).multiplyScalar(rA(s,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,s){return this.x=A.x+(t.x-A.x)*s,this.y=A.y+(t.y-A.y)*s,this.z=A.z+(t.z-A.z)*s,this}cross(A){return this.crossVectors(this,A)}crossVectors(A,t){const s=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-s*I,this.z=s*r-i*g,this}projectOnVector(A){const t=A.lengthSq();if(t===0)return this.set(0,0,0);const s=A.dot(this)/t;return this.copy(A).multiplyScalar(s)}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 s=this.dot(A)/t;return Math.acos(rA(s,-1,1))}distanceTo(A){return Math.sqrt(this.distanceToSquared(A))}distanceToSquared(A){const t=this.x-A.x,s=this.y-A.y,i=this.z-A.z;return t*t+s*s+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,s){const i=Math.sin(t)*A;return this.x=i*Math.sin(s),this.y=Math.cos(t)*A,this.z=i*Math.cos(s),this}setFromCylindrical(A){return this.setFromCylindricalCoords(A.radius,A.theta,A.y)}setFromCylindricalCoords(A,t,s){return this.x=A*Math.sin(t),this.y=s,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(),s=this.setFromMatrixColumn(A,1).length(),i=this.setFromMatrixColumn(A,2).length();return this.x=t,this.y=s,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,s=Math.sqrt(1-t*t);return this.x=s*Math.cos(A),this.y=t,this.z=s*Math.sin(A),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const _t=new d,Ms=new NA;class Fs{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,s=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,fA),fA.distanceToSquared(A.center)<=A.radius*A.radius}intersectsPlane(A){let t,s;return A.normal.x>0?(t=A.normal.x*this.min.x,s=A.normal.x*this.max.x):(t=A.normal.x*this.max.x,s=A.normal.x*this.min.x),A.normal.y>0?(t+=A.normal.y*this.min.y,s+=A.normal.y*this.max.y):(t+=A.normal.y*this.max.y,s+=A.normal.y*this.min.y),A.normal.z>0?(t+=A.normal.z*this.min.z,s+=A.normal.z*this.max.z):(t+=A.normal.z*this.max.z,s+=A.normal.z*this.min.z),t<=-A.constant&&s>=-A.constant}intersectsTriangle(A){if(this.isEmpty())return!1;this.getCenter(At),Bt.subVectors(this.max,At),KA.subVectors(A.a,At),TA.subVectors(A.b,At),ZA.subVectors(A.c,At),kA.subVectors(TA,KA),GA.subVectors(ZA,TA),_A.subVectors(KA,ZA);let t=[0,-kA.z,kA.y,0,-GA.z,GA.y,0,-_A.z,_A.y,kA.z,0,-kA.x,GA.z,0,-GA.x,_A.z,0,-_A.x,-kA.y,kA.x,0,-GA.y,GA.x,0,-_A.y,_A.x,0];return!zt(t,KA,TA,ZA,Bt)||(t=[1,0,0,0,1,0,0,0,1],!zt(t,KA,TA,ZA,Bt))?!1:(Qt.crossVectors(kA,GA),t=[Qt.x,Qt.y,Qt.z],zt(t,KA,TA,ZA,Bt))}clampPoint(A,t){return t.copy(A).clamp(this.min,this.max)}distanceToPoint(A){return this.clampPoint(A,fA).distanceTo(A)}getBoundingSphere(A){return this.isEmpty()?A.makeEmpty():(this.getCenter(A.center),A.radius=this.getSize(fA).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:(MA[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(A),MA[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(A),MA[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(A),MA[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(A),MA[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(A),MA[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(A),MA[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(A),MA[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(A),this.setFromPoints(MA),this)}translate(A){return this.min.add(A),this.max.add(A),this}equals(A){return A.min.equals(this.min)&&A.max.equals(this.max)}}const MA=[new d,new d,new d,new d,new d,new d,new d,new d],fA=new d,Ct=new Fs,KA=new d,TA=new d,ZA=new d,kA=new d,GA=new d,_A=new d,At=new d,Bt=new d,Qt=new d,zA=new d;function zt(e,A,t,s,i){for(let n=0,g=e.length-3;n<=g;n+=3){zA.fromArray(e,n);const r=i.x*Math.abs(zA.x)+i.y*Math.abs(zA.y)+i.z*Math.abs(zA.z),I=A.dot(zA),o=t.dot(zA),a=s.dot(zA);if(Math.max(-Math.max(I,o,a),Math.min(I,o,a))>r)return!1}return!0}const Ss={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},UA={h:0,s:0,l:0},ht={h:0,s:0,l:0};function Lt(e,A,t){return t<0&&(t+=1),t>1&&(t-=1),t<1/6?e+(A-e)*6*t:t<1/2?A:t<2/3?e+(A-e)*6*(2/3-t):e}class Ht{constructor(A,t,s){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(A,t,s)}set(A,t,s){if(t===void 0&&s===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,s);return this}setScalar(A){return this.r=A,this.g=A,this.b=A,this}setHex(A,t=uA){return A=Math.floor(A),this.r=(A>>16&255)/255,this.g=(A>>8&255)/255,this.b=(A&255)/255,yA.toWorkingColorSpace(this,t),this}setRGB(A,t,s,i=yA.workingColorSpace){return this.r=A,this.g=t,this.b=s,yA.toWorkingColorSpace(this,i),this}setHSL(A,t,s,i=yA.workingColorSpace){if(A=fe(A,1),t=rA(t,0,1),s=rA(s,0,1),t===0)this.r=this.g=this.b=s;else{const n=s<=.5?s*(1+t):s+t-s*t,g=2*s-n;this.r=Lt(g,n,A+1/3),this.g=Lt(g,n,A),this.b=Lt(g,n,A-1/3)}return yA.toWorkingColorSpace(this,i),this}setStyle(A,t=uA){function s(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 s(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 s(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 s(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=uA){const s=Ss[A.toLowerCase()];return s!==void 0?this.setHex(s,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=qA(A.r),this.g=qA(A.g),this.b=qA(A.b),this}copyLinearToSRGB(A){return this.r=vA(A.r),this.g=vA(A.g),this.b=vA(A.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(A=uA){return yA.fromWorkingColorSpace(sA.copy(this),A),Math.round(rA(sA.r*255,0,255))*65536+Math.round(rA(sA.g*255,0,255))*256+Math.round(rA(sA.b*255,0,255))}getHexString(A=uA){return("000000"+this.getHex(A).toString(16)).slice(-6)}getHSL(A,t=yA.workingColorSpace){yA.fromWorkingColorSpace(sA.copy(this),t);const s=sA.r,i=sA.g,n=sA.b,g=Math.max(s,i,n),r=Math.min(s,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 s: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 s=(n=t[0].match(/^\\s*/))==null?void 0:n[0];if(!s)return t;const i=new RegExp(`^${s}`);return t.map(g=>g.replace(i,""))}function pe(e){return De(e).join(`\n`)}const qt=new Float32Array(1),Ys=new Uint32Array(qt.buffer);function WA(e){qt[0]=e;const A=Ys[0],t=A>>31&1,s=A>>23&255,i=A&8388607,n=t<<15;if(s===255)return i!==0?n|32767:n|31744;const g=s-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 O(e){const A=e>>15&1,t=e>>10&31,s=e&1023;let i;if(t===0)if(s===0)i=A<<31;else{let n=s,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)s===0?i=A<<31|2139095040:i=A<<31|2143289344;else{const n=t-15+127,g=s<<13;i=A<<31|n<<23|g}return Ys[0]=i,qt[0]}function QA(e){return Math.max(0,Math.min(255,Math.round(e*255)))}function Me(e){const A=[],t=new Set;function s(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(s):Object.values(i).forEach(s))}return s(e),A}function vt(e,A,t,s,i,n,g,r,I,o,a,C,Q,B,h,l,c){const E=(c==null?void 0:c.rgbMin)??0,y=((c==null?void 0:c.rgbMax)??1)-E,f=QA((B-E)/y),D=QA((h-E)/y),S=QA((l-E)/y),b=QA(Q),x=_s(new NA(I,o,a,C)),m=x&255,G=x>>>8&255,p=x>>>16&255,w=(c==null?void 0:c.lnScaleMin)??ds,z=254/(((c==null?void 0:c.lnScaleMax)??Ns)-w),Y=n>>8&255,o=g>>>16&255,a=A*4;e[a+2]=e[a+2]&65535|r<<16|I<<24,e[a+3]=e[a+3]&16777215|o<<24}function Fe(e,A,t,s,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((s-r)/o),Q=QA((i-r)/o),B=QA(n),h=A*4;e[h]=a|C<<8|Q<<16|B<<24}function Se(e,A,t,s,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((s-g)/I),C=QA((i-g)/I),Q=A*4;e[Q]=o|a<<8|C<<16|e[Q]&4278190080}function de(e,A,t){const s=QA(t),i=A*4;e[i]=e[i]&16777215|s<<24}new d,new d,new Ht;function Ne(e){const A=ks,t=Math.max(Us,Math.min(Gs,Math.ceil(e/A))),s=Math.ceil(e/(A*t)),i=A*t*s;return{width:A,height:t,depth:s,maxSplats:i}}function Et(e){const A=ks,t=Math.max(Us,Math.min(Gs,Math.ceil(e/A))),s=Math.ceil(e/(A*t));return A*t*s}pe(`\n precision highp float;\n\n in vec3 position;\n\n void main() {\n gl_Position = vec4(position.xy, 0.0, 1.0);\n }\n`);function _s(e){const A=e.clone().normalize();A.w<0&&A.set(-A.x,-A.y,-A.z,-A.w);const t=2*Math.acos(A.w),s=Math.sqrt(A.x*A.x+A.y*A.y+A.z*A.z),i=s<1e-6?new d(1,0,0):new d(A.x,A.y,A.z).divideScalar(s),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 ct(e,A,t,s){const i=Math.max(-127,Math.min(127,e*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,s*127));return i&255|(n&255)<<8|(g&255)<<16|(r&255)<<24}function lt(e,A,t,s){const i=(s==null?void 0:s.sh1Min)??-1,n=(s==null?void 0:s.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,Q=o*7,B=Q+7,h=Math.floor(Q/32),l=Q-h*32,c=C<h*32+32){const E=C>>>32-l&4294967295;e[I+h+1]|=E}}}function ut(e,A,t,s){const i=(s==null?void 0:s.sh2Min)??-1,n=(s==null?void 0:s.sh2Max)??1,g=.5*(i+n),r=2/(n-i);e[A*4+0]=ct((t[0]-g)*r,(t[1]-g)*r,(t[2]-g)*r,(t[3]-g)*r),e[A*4+1]=ct((t[4]-g)*r,(t[5]-g)*r,(t[6]-g)*r,(t[7]-g)*r),e[A*4+2]=ct((t[8]-g)*r,(t[9]-g)*r,(t[10]-g)*r,(t[11]-g)*r),e[A*4+3]=ct((t[12]-g)*r,(t[13]-g)*r,(t[14]-g)*r,0)}function yt(e,A,t,s){const i=(s==null?void 0:s.sh3Min)??-1,n=(s==null?void 0:s.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,Q=o*6,B=Q+6,h=Math.floor(Q/32),l=Q-h*32,c=C<h*32+32){const E=C>>>32-l&4294967295;e[I+h+1]|=E}}}function ke(e,A){const t=[];let s=0,i=null;const n=new ls((I,o)=>{if(t.push(I),s+=I.length,o||s>=A){const a=new Uint8Array(s);let C=0;for(const Q of t)a.set(Q,C),C+=Q.length;i=a.slice(0,A)}}),g=1024;let r=0;for(;i==null&&r{this.chunks.push(s),this.totalBytes+=s.length})}read(A){for(;this.totalBytes=this.fileBytes.length&&this.gunzip.push(new Uint8Array(0),!0),this.totalBytes{t=n,s=Et(t),i=new Uint32Array(s*4)},(n,g,r,I,o,a,C,Q,B,h,l,c,E,u,y)=>{vt(i,n,g,r,I,o,a,C,Q,B,h,l,c,E,u,y,A)}),{packedArray:i,numSplats:t}}const ft={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}},Ls={0:0,1:9,2:24,3:45};function Ye(e,A,t,s){var l;let g=0;const r=new DataView(e.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 Q=r.getFloat32(36,!0)||-1.5,B=r.getFloat32(40,!0)||1.5;let h=4096+a*1024;for(let c=0;c=1?new Float32Array(3*3):void 0,aA=Y>=2?new Float32Array(5*3):void 0,FA=Y>=3?new Float32Array(7*3):void 0,CA=b/2/m,hA=h+M,EA=h+z,k=new DataView(e.buffer,EA,F),$=new Float32Array(e.buffer,hA,S*3),wA=new Uint32Array(e.buffer,h,w);let H=G,RA=p;for(let nA=0;nA=RA+pA&&(H+=1,RA+=pA),cA=H}const AA=C===0?k.getFloat32(U+0,!0):(k.getUint16(U+0,!0)-m)*CA+$[3*cA+0],_=C===0?k.getFloat32(U+4,!0):(k.getUint16(U+2,!0)-m)*CA+$[3*cA+1],mA=C===0?k.getFloat32(U+8,!0):(k.getUint16(U+4,!0)-m)*CA+$[3*cA+2],et=C===0?k.getFloat32(U+W+0,!0):O(k.getUint16(U+W+0,!0)),it=C===0?k.getFloat32(U+W+4,!0):O(k.getUint16(U+W+2,!0)),Xt=C===0?k.getFloat32(U+W+8,!0):O(k.getUint16(U+W+4,!0)),Wt=C===0?k.getFloat32(U+L+0,!0):O(k.getUint16(U+L+0,!0)),Pt=C===0?k.getFloat32(U+L+4,!0):O(k.getUint16(U+L+2,!0)),Vt=C===0?k.getFloat32(U+L+8,!0):O(k.getUint16(U+L+4,!0)),jt=C===0?k.getFloat32(U+L+12,!0):O(k.getUint16(U+L+6,!0)),Ot=k.getUint8(U+K+0)/255,$t=k.getUint8(U+K+1)/255,As=k.getUint8(U+K+2)/255,ts=k.getUint8(U+K+3)/255;if(t(nA,AA,_,mA,et,it,Xt,Pt,Vt,jt,Wt,ts,Ot,$t,As),Y>=1&&oA){for(const[pA,LA]of iA.entries())oA[pA]=E(U,LA);if(aA)for(const[pA,LA]of IA.entries())aA[pA]=E(U,LA);if(FA)for(const[pA,LA]of gA.entries())FA[pA]=E(U,LA);s==null||s(nA,oA,aA,FA)}}h+=eA}}function Re(e,A){var u;let i=0;const n=new DataView(e.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,Q=n.getFloat32(40,!0)||1.5,B=o,h=Et(B),l=new Uint32Array(h*4),c={};let E=4096+I*1024;for(let y=0;y=1?new Float32Array(3*3):void 0,hA=T>=2?new Float32Array(5*3):void 0,EA=T>=3?new Float32Array(7*3):void 0,k=G/2/w,$=E+N,wA=E+q,H=new DataView(e.buffer,wA,IA),RA=new Float32Array(e.buffer,$,m*3),nA=new Uint32Array(e.buffer,E,Y);let U=M,cA=z;for(let AA=0;AA=cA+bA&&(U+=1,cA+=bA),mA=U}const et=a===0?H.getFloat32(_+0,!0):(H.getUint16(_+0,!0)-w)*k+RA[3*mA+0],it=a===0?H.getFloat32(_+4,!0):(H.getUint16(_+2,!0)-w)*k+RA[3*mA+1],Xt=a===0?H.getFloat32(_+8,!0):(H.getUint16(_+4,!0)-w)*k+RA[3*mA+2],Wt=a===0?H.getFloat32(_+J+0,!0):O(H.getUint16(_+J+0,!0)),Pt=a===0?H.getFloat32(_+J+4,!0):O(H.getUint16(_+J+2,!0)),Vt=a===0?H.getFloat32(_+J+8,!0):O(H.getUint16(_+J+4,!0)),jt=a===0?H.getFloat32(_+R+0,!0):O(H.getUint16(_+R+0,!0)),Ot=a===0?H.getFloat32(_+R+4,!0):O(H.getUint16(_+R+2,!0)),$t=a===0?H.getFloat32(_+R+8,!0):O(H.getUint16(_+R+4,!0)),As=a===0?H.getFloat32(_+R+12,!0):O(H.getUint16(_+R+6,!0)),ts=H.getUint8(_+F+0)/255,pA=H.getUint8(_+F+1)/255,LA=H.getUint8(_+F+2)/255,Oe=H.getUint8(_+F+3)/255;if(vt(l,AA,et,it,Xt,Wt,Pt,Vt,Ot,$t,As,jt,Oe,ts,pA,LA,A),T>=1){if(CA){c.sh1||(c.sh1=new Uint32Array(B*2));for(const[bA,nt]of oA.entries())CA[bA]=f(_,nt);lt(c.sh1,AA,CA,A)}if(hA){c.sh2||(c.sh2=new Uint32Array(B*4));for(const[bA,nt]of aA.entries())hA[bA]=f(_,nt);ut(c.sh2,AA,hA,A)}if(EA){c.sh3||(c.sh3=new Uint32Array(B*4));for(const[bA,nt]of FA.entries())EA[bA]=f(_,nt);yt(c.sh3,AA,EA,A)}}}E+=gA}return{packedArray:l,numSplats:B,extra:c}}const VA=class VA{constructor({fileBytes:A}){this.header="",this.littleEndian=!0,this.elements={},this.comments=[],this.data=null,this.numSplats=0,this.fileBytes=A instanceof ArrayBuffer?new Uint8Array(A):A}async parseHeader(){const t=new ReadableStream({start:g=>{g.enqueue(this.fileBytes.slice(0,65536)),g.close()}}).pipeThrough(new TextDecoderStream).getReader();this.header="";const s=`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(s);if(I>=0){this.header=this.header.slice(0,I+s.length);break}}const i=new TextEncoder().encode(this.header).length;this.data=new DataView(this.fileBytes.buffer,i),this.elements={};let n=null;this.comments=[],this.header.trim().split(`\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 s=this.data;if(s==null)throw new Error("No data to parse");for(const i in this.elements){const n=this.elements[i],{count:g,properties:r}=n,I={},o=[];for(const[C,Q]of Object.entries(r))Q.isList?(I[C]=[],o.push(()=>{const B=I[C];B.length=xt[Q.countType](s,t,this.littleEndian),t+=PA[Q.countType];for(let h=0;h{I[C]=xt[Q.type](s,t,this.littleEndian),t+=PA[Q.type]}));const a=A(n)??(()=>{});for(let C=0;C[0,1,2].map((f,D)=>`f_rest_${y+D*E/3}`)),r=new Array(5).fill(null).flatMap((u,y)=>[0,1,2].map((f,D)=>`f_rest_${3+y+D*E/3}`)),I=new Array(7).fill(null).flatMap((u,y)=>[0,1,2].map((f,D)=>`f_rest_${8+y+D*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,u){if(!o)throw new Error("Missing sh1");for(const[y,f]of g.entries())o[y]=u[f]*8/255-4;if(a)for(const[y,f]of r.entries())a[y]=u[f]*8/255-4;if(C)for(const[y,f]of I.entries())C[y]=u[f]*8/255-4;t==null||t(E,o,a,C)}function h(E){const{min_x:u,min_y:y,min_z:f,max_x:D,max_y:S,max_z:b,min_scale_x:x,min_scale_y:m,min_scale_z:G,max_scale_x:p,max_scale_y:w,max_scale_z:M}=E.properties;if(!u||!y||!f||!D||!S||!b||!x||!m||!G||!p||!w||!M)throw new Error("Missing PLY chunk properties");return s=!0,(z,Y)=>{const{min_x:N,min_y:q,min_z:T,max_x:v,max_y:P,max_z:Z,min_scale_x:W,min_scale_y:L,min_scale_z:K,max_scale_x:J,max_scale_y:R,max_scale_z:F,min_r:eA,min_g:iA,min_b:IA,max_r:gA,max_g:oA,max_b:aA}=Y;i.push({min_x:N,min_y:q,min_z:T,max_x:v,max_y:P,max_z:Z,min_scale_x:W,min_scale_y:L,min_scale_z:K,max_scale_x:J,max_scale_y:R,max_scale_z:F,min_r:eA,min_g:iA,min_b:IA,max_r:gA,max_g:oA,max_b:aA})}}function l(E){if(t&&E.name==="sh")return n=qs(E.properties),Q(),B;if(E.name!=="vertex")return null;const{packed_position:u,packed_rotation:y,packed_scale:f,packed_color:D}=E.properties;if(!u||!y||!f||!D)throw new Error("Missing PLY properties: packed_position, packed_rotation, packed_scale, packed_color");const S=Math.sqrt(2);return(b,x)=>{const m=i[b>>>8];if(m==null)throw new Error("Missing PLY chunk");const{min_x:G,min_y:p,min_z:w,max_x:M,max_y:z,max_z:Y,min_scale_x:N,min_scale_y:q,min_scale_z:T,max_scale_x:v,max_scale_y:P,max_scale_z:Z,min_r:W,min_g:L,min_b:K,max_r:J,max_g:R,max_b:F}=m,{packed_position:eA,packed_rotation:iA,packed_scale:IA,packed_color:gA}=x,oA=(eA>>>21&2047)/2047*(M-G)+G,aA=(eA>>>11&1023)/1023*(z-p)+p,FA=(eA&2047)/2047*(Y-w)+w,CA=((iA>>>20&1023)/1023-.5)*S,hA=((iA>>>10&1023)/1023-.5)*S,EA=((iA&1023)/1023-.5)*S,k=Math.sqrt(Math.max(0,1-CA*CA-hA*hA-EA*EA)),$=iA>>>30,wA=$===0?CA:$===1?k:hA,H=$<=1?hA:$===2?k:EA,RA=$<=2?EA:k,nA=$===0?k:CA,U=Math.exp((IA>>>21&2047)/2047*(v-N)+N),cA=Math.exp((IA>>>11&1023)/1023*(P-q)+q),AA=Math.exp((IA&2047)/2047*(Z-T)+T),_=(gA>>>24&255)/255*((J??1)-(W??0))+(W??0),mA=(gA>>>16&255)/255*((R??1)-(L??0))+(L??0),et=(gA>>>8&255)/255*((F??1)-(K??0))+(K??0),it=(gA&255)/255;A(b,oA,aA,FA,U,cA,AA,wA,H,RA,nA,it,_,mA,et)}}const c=E=>{if(E.name==="chunk")return h(E);if(s)return l(E);if(E.name!=="vertex")return null;const{x:u,y,z:f,scale_0:D,scale_1:S,scale_2:b,rot_0:x,rot_1:m,rot_2:G,rot_3:p,opacity:w,f_dc_0:M,f_dc_1:z,f_dc_2:Y,red:N,green:q,blue:T,alpha:v}=E.properties;if(!u||!y||!f)throw new Error("Missing PLY properties: x, y, z");const P=D&&S&&b,Z=x&&m&&G&&p,W=v!=null?Dt[v.type]:1,L=N!=null?Dt[N.type]:1,K=q!=null?Dt[q.type]:1,J=T!=null?Dt[T.type]:1;return n=qs(E.properties),Q(),(R,F)=>{const eA=P?Math.exp(F.scale_0):VA.defaultPointScale,iA=P?Math.exp(F.scale_1):VA.defaultPointScale,IA=P?Math.exp(F.scale_2):VA.defaultPointScale,gA=Z?F.rot_1:0,oA=Z?F.rot_2:0,aA=Z?F.rot_3:0,FA=Z?F.rot_0:1,CA=w!=null?1/(1+Math.exp(-F.opacity)):v!=null?F.alpha/W:1,hA=M!=null?F.f_dc_0*mt+.5:N!=null?F.red/L:1,EA=z!=null?F.f_dc_1*mt+.5:q!=null?F.green/K:1,k=Y!=null?F.f_dc_2*mt+.5:T!=null?F.blue/J:1;if(A(R,F.x,F.y,F.z,eA,iA,IA,gA,oA,aA,FA,CA,hA,EA,k),t&&o){if(o)for(const[$,wA]of g.entries())o[$]=F[wA];if(a)for(const[$,wA]of r.entries())a[$]=F[wA];if(C)for(const[$,wA]of I.entries())C[$]=F[wA];t(R,o,a,C)}}};this.parseData(c)}injectRgba(A){let t=0;const s=this.data;if(s==null)throw new Error("No parsed data");if(A.length!==this.numSplats*4)throw new Error("Invalid RGBA array length");for(const i in this.elements){const n=this.elements[i],{count:g,properties:r}=n,I=[];let o=0;const a=i==="vertex";if(a){for(const C of["opacity","f_dc_0","f_dc_1","f_dc_2"])if(!r[C]||r[C].type!=="float")throw new Error(`Can\'t injectRgba due to property: ${C}`)}for(const[C,Q]of Object.entries(r))if(Q.isList)I.push(()=>{const B=xt[Q.countType](s,t,this.littleEndian);t+=PA[Q.countType],t+=B*PA[Q.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 h=(A[o+B]/255-.5)/mt;Hs[Q.type](s,t,this.littleEndian,h)})}else C==="opacity"&&I.push(()=>{const B=Math.max(-100,Math.min(100,-Math.log(1/(A[o+3]/255)-1)));Hs[Q.type](s,t,this.littleEndian,B)});I.push(()=>{t+=PA[Q.type]})}for(let C=0;Ce.getInt8(A),uchar:(e,A,t)=>e.getUint8(A),short:(e,A,t)=>e.getInt16(A,t),ushort:(e,A,t)=>e.getUint16(A,t),int:(e,A,t)=>e.getInt32(A,t),uint:(e,A,t)=>e.getUint32(A,t),float:(e,A,t)=>e.getFloat32(A,t),double:(e,A,t)=>e.getFloat64(A,t)},Hs={char:(e,A,t,s)=>{e.setInt8(A,s)},uchar:(e,A,t,s)=>{e.setUint8(A,s)},short:(e,A,t,s)=>{e.setInt16(A,s,t)},ushort:(e,A,t,s)=>{e.setUint16(A,s,t)},int:(e,A,t,s)=>{e.setInt32(A,s,t)},uint:(e,A,t,s)=>{e.setUint32(A,s,t)},float:(e,A,t,s)=>{e.setFloat32(A,s,t)},double:(e,A,t,s)=>{e.setFloat64(A,s,t)}},PA={char:1,uchar:1,short:2,ushort:2,int:4,uint:4,float:4,double:8},Dt={char:127,uchar:255,short:32767,ushort:65535,int:2147483647,uint:4294967295,float:1,double:1},be={0:0,9:1,24:2,45:3},Je={0:0,1:9,2:24,3:45};function qs(e){let A=0;for(;e[`f_rest_${A}`];)A+=1;const t=be[A];if(t==null)throw new Error(`Unsupported number of SH coefficients: ${A}`);return t}var tt=(e=>(e.PLY="ply",e.SPZ="spz",e.SPLAT="splat",e.KSPLAT="ksplat",e.PCSOGS="pcsogs",e.PCSOGSZIP="pcsogszip",e))(tt||{});function _e(e){const A=new DataView(e.buffer);if((A.getUint32(0,!0)&16777215)===7957616)return"ply";if((A.getUint32(0,!0)&16777215)===559903){const t=ke(e,4);return new DataView(t.buffer).getUint32(0,!0)===1347635022?"spz":void 0}if(A.getUint32(0,!0)===67324752)return vs(e)?"pcsogszip":void 0}function ze(e){const A=e.split(/[?#]/,1)[0],t=Math.max(A.lastIndexOf("/"),A.lastIndexOf("\\\\")),s=A.slice(t+1),i=s.lastIndexOf(".");return i<=0||i===s.length-1?"":s.slice(i+1).toLowerCase()}function Le(e){const A=ze(e);if(A==="ply")return"ply";if(A==="spz")return"spz";if(A==="splat")return"splat";if(A==="ksplat")return"ksplat"}function He(e){try{let A;if(typeof e=="string")A=e;else{const s=e instanceof ArrayBuffer?new Uint8Array(e):e;if(s.length>65536)return;A=new TextDecoder().decode(s)}const t=JSON.parse(A);if(!t||typeof t!="object"||Array.isArray(t))return;for(const s of["means","scales","quats","sh0"])if(!t[s]||typeof t[s]!="object"||Array.isArray(t[s])||!t[s].shape||!t[s].files||s!=="quats"&&(!t[s].mins||!t[s].maxs))return;return t}catch{return}}function vs(e){try{const A=e instanceof ArrayBuffer?new Uint8Array(e):e;let t=null;const s=ue(A,{filter:({name:n})=>n.split(/[\\\\/]/).pop()==="meta.json"?(t=n,!0):!1});if(!t)return;const i=He(s[t]);return i?{name:t,json:i}:void 0}catch{return}}class qe{constructor({maxSplats:A=1}={}){this.numSplats=0,this.maxSplats=Ne(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),s=new Float32Array(t*3),i=new Float32Array(t*3),n=new Float32Array(t*4),g=new Float32Array(t),r=new Float32Array(t*3);if(s.set(this.centers),i.set(this.scales),n.set(this.quaternions),g.set(this.opacities),r.set(this.colors),this.centers=s,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,s,i){this.centers[A*3]=t,this.centers[A*3+1]=s,this.centers[A*3+2]=i}setScale(A,t,s,i){this.scales[A*3]=t,this.scales[A*3+1]=s,this.scales[A*3+2]=i}setQuaternion(A,t,s,i,n){this.quaternions[A*4]=t,this.quaternions[A*4+1]=s,this.quaternions[A*4+2]=i,this.quaternions[A*4+3]=n}setOpacity(A,t){this.opacities[A]=t}setColor(A,t,s,i){this.colors[A*3]=t,this.colors[A*3+1]=s,this.colors[A*3+2]=i}setSh1(A,t){this.sh1||(this.sh1=new Float32Array(this.maxSplats*9));for(let s=0;s<9;++s)this.sh1[A*9+s]=t[s]}setSh2(A,t){this.sh2||(this.sh2=new Float32Array(this.maxSplats*15));for(let s=0;s<15;++s)this.sh2[A*15+s]=t[s]}setSh3(A,t){this.sh3||(this.sh3=new Float32Array(this.maxSplats*21));for(let s=0;s<21;++s)this.sh3[A*21+s]=t[s]}}async function Ks(e,A,t){if(e.quats.encoding!=="quaternion_packed")throw new Error("Unsupported quaternion encoding");const s=e.means.shape[0],i=Et(s),n=new Uint32Array(i*4),g={},r=Promise.all([st(A[e.means.files[0]]),st(A[e.means.files[1]])]).then(Q=>{for(let B=0;B{for(let B=0;B{const B=Math.sqrt(2);for(let h=0;h{const B=.28209479177387814;for(let h=0;h=45,B=e.shN.shape[1]>=24,h=e.shN.shape[1]>=9;h&&(g.sh1=new Uint32Array(s*2)),B&&(g.sh2=new Uint32Array(s*4)),Q&&(g.sh3=new Uint32Array(s*4));const l=new Float32Array(9),c=new Float32Array(15),E=new Float32Array(21),u=e.shN,y=Promise.all([Kt(A[e.shN.files[0]]),Kt(A[e.shN.files[1]])]).then(([f,D])=>{for(let S=0;S>>6)*f.width+m;for(let w=0;w<3;++w){if(h)for(let M=0;M<3;++M)l[M*3+w]=u.mins+(u.maxs-u.mins)*f.rgba[(p+M)*4+w]/255;if(B)for(let M=0;M<5;++M)c[M*3+w]=u.mins+(u.maxs-u.mins)*f.rgba[(p+3+M)*4+w]/255;if(Q)for(let M=0;M<7;++M)E[M*3+w]=u.mins+(u.maxs-u.mins)*f.rgba[(p+8+M)*4+w]/255}h&<(g.sh1,S,l,t),B&&ut(g.sh2,S,c,t),Q&&yt(g.sh3,S,E,t)}});C.push(y)}return await Promise.all(C),{packedArray:n,numSplats:s,extra:g}}let pt=null;async function Kt(e){if(!pt&&(pt=new OffscreenCanvas(1,1).getContext("webgl2"),!pt))throw new Error("Failed to create WebGL2 context");const A=new Blob([e]),t=await createImageBitmap(A,{premultiplyAlpha:"none"}),s=pt,i=s.createTexture();s.bindTexture(s.TEXTURE_2D,i),s.pixelStorei(s.UNPACK_FLIP_Y_WEBGL,!0),s.texImage2D(s.TEXTURE_2D,0,s.RGBA,s.RGBA,s.UNSIGNED_BYTE,t),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_MAG_FILTER,s.NEAREST),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_MIN_FILTER,s.NEAREST);const n=s.createFramebuffer();s.bindFramebuffer(s.FRAMEBUFFER,n),s.framebufferTexture2D(s.FRAMEBUFFER,s.COLOR_ATTACHMENT0,s.TEXTURE_2D,i,0);const g=new Uint8Array(t.width*t.height*4);return s.readPixels(0,0,t.width,t.height,s.RGBA,s.UNSIGNED_BYTE,g),s.deleteTexture(i),s.deleteFramebuffer(n),{rgba:g,width:t.width,height:t.height}}async function st(e){const{rgba:A}=await Kt(e);return A}async function ve(e,A){var Q;const t=vs(e);if(!t)throw new Error("Invalid PC SOGS zip file");const{name:s,json:i}=t,n=s.lastIndexOf("/"),g=s.lastIndexOf("\\\\"),r=s.slice(0,Math.max(n,g)+1),I=new Map,o=[...i.means.files,...i.scales.files,...i.quats.files,...i.sh0.files,...((Q=i.shN)==null?void 0:Q.files)??[]];for(const B of o)I.set(r+B,B);const a=await new Promise((B,h)=>{le(e,{filter:({name:l})=>I.has(l)},(l,c)=>{l?h(l):B(c)})}),C={};for(const[B,h]of I.entries())C[h]=a[B];return await Ks(i,C,A)}class Ts{constructor({fileBytes:A}){this.fileBytes=A instanceof ArrayBuffer?new Uint8Array(A):A,this.reader=new Ge({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,s,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,Q=((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,Q,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*Zs[this.shDegree]*3);let C=0;for(let Q=0;Q=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,Ke,!0),this.view.setUint32(4,Te,!0),this.view.setUint32(8,A,!0),this.view.setUint8(12,t),this.view.setUint8(13,s),this.view.setUint8(14,i?Ze:0),this.view.setUint8(15,0),this.numSplats=A,this.shDegree=t,this.fractionalBits=s,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 s=16+this.numSplats*9+A;this.view.setUint8(s,Math.max(0,Math.min(255,Math.round(t*255))))}static scaleRgb(A){const t=((A-.5)/(Xs/.15)+.5)*255;return Math.max(0,Math.min(255,Math.round(t)))}setRgb(A,t,s,i){const n=16+this.numSplats*10+A*3;this.view.setUint8(n,YA.scaleRgb(t)),this.view.setUint8(n+1,YA.scaleRgb(s)),this.view.setUint8(n+2,YA.scaleRgb(i))}setScale(A,t,s,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(s)+10)*16)))),this.view.setUint8(n+2,Math.max(0,Math.min(255,Math.round((Math.log(i)+10)*16))))}setQuat(A,t,s,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?-s:s)+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 s=Math.round(A*128)+128,i=1<<8-t,n=Math.floor((s+i/2)/i)*i;return Math.max(0,Math.min(255,n))}setSh(A,t,s,i){const n=Zs[this.shDegree]||0,g=16+this.numSplats*19+A*n*3;for(let r=0;r<9;++r)this.view.setUint8(g+r,YA.quantizeSh(t[r],5));if(s){const r=g+9;for(let I=0;I<15;++I)this.view.setUint8(r+I,YA.quantizeSh(s[I],4));if(i){const I=r+15;for(let o=0;o<21;++o)this.view.setUint8(I+o,YA.quantizeSh(i[o],4))}}}async finalize(){const A=new Uint8Array(this.buffer),s=new ReadableStream({async start(g){g.enqueue(A),g.close()}}).pipeThrough(new CompressionStream("gzip")),n=await new Response(s).arrayBuffer();return console.log("Compressed",A.length,"bytes to",n.byteLength,"bytes"),new Uint8Array(n)}}async function Xe(e){var a,C,Q;const A=new qe,{inputs:t,clipXyz:s,maxSh:i,fractionalBits:n=12,opacityThreshold:g}=e;for(const B of t){let h=function(x){return x.multiplyScalar(y),x.applyQuaternion(f),x.add(D),x},l=function(x){return x.multiplyScalar(y),x},c=function(x){return x.premultiply(f),x},E=function(x){return!S||S.containsPoint(x)},u=function(x){return g!==void 0?x>=g:!0};const y=((a=B.transform)==null?void 0:a.scale)??1,f=new NA().fromArray(((C=B.transform)==null?void 0:C.quaternion)??[0,0,0,1]),D=new d().fromArray(((Q=B.transform)==null?void 0:Q.translate)??[0,0,0]),S=s?new Fs(new d().fromArray(s.min),new d().fromArray(s.max)):void 0;let b=B.fileType;switch(b||(b=_e(B.fileBytes),!b&&B.pathOrUrl&&(b=Le(B.pathOrUrl))),b){case tt.PLY:{const x=new wt({fileBytes:B.fileBytes});await x.parseHeader();let m=null;x.parseSplats((G,p,w,M,z,Y,N,q,T,v,P,Z,W,L,K)=>{const J=h(new d(p,w,M));if(E(J)&&u(Z)){m=A.pushSplat(),A.setCenter(m,J.x,J.y,J.z);const R=l(new d(z,Y,N));A.setScale(m,R.x,R.y,R.z);const F=c(new NA(q,T,v,P));A.setQuaternion(m,F.x,F.y,F.z,F.w),A.setOpacity(m,Z),A.setColor(m,W,L,K)}else m=null},(G,p,w,M)=>{p&&m!==null&&A.setSh1(m,p),w&&m!==null&&A.setSh2(m,w),M&&m!==null&&A.setSh3(m,M)});break}case tt.SPZ:{const x=new Ts({fileBytes:B.fileBytes}),m=new Int32Array(x.numSplats);m.fill(-1);const G=new Float32Array(x.numSplats*3),p=new d;x.parseSplats((w,M,z,Y)=>{const N=h(new d(M,z,Y));G[w*3]=N.x,G[w*3+1]=N.y,G[w*3+2]=N.z},(w,M)=>{p.fromArray(G,w*3),E(p)&&u(M)&&(m[w]=A.pushSplat(),A.setCenter(m[w],p.x,p.y,p.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 q=c(new NA(M,z,Y,N));A.setQuaternion(m[w],q.x,q.y,q.z,q.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 tt.SPLAT:zs(B.fileBytes,x=>{},(x,m,G,p,w,M,z,Y,N,q,T,v,P,Z,W)=>{const L=h(new d(m,G,p));if(E(L)&&u(v)){const K=A.pushSplat();A.setCenter(K,L.x,L.y,L.z);const J=l(new d(w,M,z));A.setScale(K,J.x,J.y,J.z);const R=c(new NA(Y,N,q,T));A.setQuaternion(K,R.x,R.y,R.z,R.w),A.setOpacity(K,v),A.setColor(K,P,Z,W)}});break;case tt.KSPLAT:{let x=null;Ye(B.fileBytes,m=>{},(m,G,p,w,M,z,Y,N,q,T,v,P,Z,W,L)=>{const K=h(new d(G,p,w));if(E(K)&&u(P)){x=A.pushSplat(),A.setCenter(x,K.x,K.y,K.z);const J=l(new d(M,z,Y));A.setScale(x,J.x,J.y,J.z);const R=c(new NA(N,q,T,v));A.setQuaternion(x,R.x,R.y,R.z,R.w),A.setOpacity(x,P),A.setColor(x,Z,W,L)}else x=null},(m,G,p,w)=>{x!==null&&(A.setSh1(x,G),p&&A.setSh2(x,p),w&&A.setSh3(x,w))});break}default:throw new Error(`transcodeSpz not implemented for ${b}`)}}const r=Math.min(i??3,A.sh3?3:A.sh2?2:A.sh1?1:0),I=new YA({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 Ws(e){const{name:A,args:t,id:s}=e.data;let i,n;try{switch(A){case"unpackPly":{const{packedArray:g,fileBytes:r,splatEncoding:I}=t,o=await We({packedArray:g,fileBytes:r,splatEncoding:I});i={id:s,numSplats:o.numSplats,packedArray:o.packedArray,extra:o.extra};break}case"decodeSpz":{const{fileBytes:g,splatEncoding:r}=t,I=Pe(g,r);i={id:s,numSplats:I.numSplats,packedArray:I.packedArray,extra:I.extra};break}case"decodeAntiSplat":{const{fileBytes:g,splatEncoding:r}=t,I=Ue(g,r);i={id:s,numSplats:I.numSplats,packedArray:I.packedArray};break}case"decodeKsplat":{const{fileBytes:g,splatEncoding:r}=t,I=Re(g,r);i={id:s,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 Ks(o,r,I);i={id:s,numSplats:a.numSplats,packedArray:a.packedArray,extra:a.extra};break}case"decodePcSogsZip":{const{fileBytes:g,splatEncoding:r}=t,I=await ve(g,r);i={id:s,numSplats:I.numSplats,packedArray:I.packedArray,extra:I.extra};break}case"sortSplats":{const{totalSplats:g,readback:r,ordering:I}=t;i={id:s,readback:r,...Ve({totalSplats:g,readback:r,ordering:I})};break}case"sortDoubleSplats":{const{numSplats:g,readback:r,ordering:I}=t;i={id:s,readback:r,ordering:I,activeSplats:Os(g,r,I)};break}case"sort32Splats":{const{numSplats:g,readback:r,ordering:I}=t;i={id:s,readback:r,ordering:I,activeSplats:$s(g,r,I)};break}case"transcodeSpz":{const g=t,r=await Xe(g);i={id:s,fileBytes:r,input:g};break}default:throw new Error(`Unknown name: ${A}`)}}catch(g){n=g,console.error(n)}self.postMessage({id:s,result:i,error:n},{transfer:Me(i)})}async function We({packedArray:e,fileBytes:A,splatEncoding:t}){const s=new wt({fileBytes:A});await s.parseHeader();const i=s.numSplats,n={};return s.parseSplats((g,r,I,o,a,C,Q,B,h,l,c,E,u,y,f)=>{vt(e,g,r,I,o,a,C,Q,B,h,l,c,E,u,y,f,t)},(g,r,I,o)=>{r&&(n.sh1||(n.sh1=new Uint32Array(i*2)),lt(n.sh1,g,r,t)),I&&(n.sh2||(n.sh2=new Uint32Array(i*4)),ut(n.sh2,g,I,t)),o&&(n.sh3||(n.sh3=new Uint32Array(i*4)),yt(n.sh3,g,o,t))}),{packedArray:e,numSplats:i,extra:n}}function Pe(e,A){const t=new Ts({fileBytes:e}),s=t.numSplats,i=Et(s),n=new Uint32Array(i*4),g={};return t.parseSplats((r,I,o,a)=>{Rs(n,r,I,o,a)},(r,I)=>{de(n,r,I)},(r,I,o,a)=>{Se(n,r,I,o,a,A)},(r,I,o,a)=>{bs(n,r,I,o,a,A)},(r,I,o,a,C)=>{Js(n,r,I,o,a,C)},(r,I,o,a)=>{I&&(g.sh1||(g.sh1=new Uint32Array(s*2)),lt(g.sh1,r,I,A)),o&&(g.sh2||(g.sh2=new Uint32Array(s*4)),ut(g.sh2,r,o,A)),a&&(g.sh3||(g.sh3=new Uint32Array(s*4)),yt(g.sh3,r,a,A))}),{packedArray:n,numSplats:s,extra:g}}const Tt=31744,Mt=Tt+1;let DA=null;function Ve({totalSplats:e,readback:A,ordering:t}){DA||(DA=new Uint32Array(Mt)),DA.fill(0);const s=A.map(I=>new Uint32Array(I.buffer)),i=s[0].length,n=Math.ceil(e/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(qa), { name: t == null ? void 0 : t.name } ); } finally { A && (self.URL || self.webkitURL).revokeObjectURL(A); } } class mu { constructor() { this.messages = {}, this.messageIdNext = 0, this.worker = new wu(), 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: Jn(e) } ), n; } } let Ha = 4, ue = 0; const Ka = [], $a = []; async function xu() { const t = Ka.shift(); if (t) return t; if (ue < Ha) { const A = new mu(); return ue += 1, A; } return new Promise((A) => { $a.push(A); }); } function Su(t) { if (ue > Ha) { ue -= 1; return; } const A = $a.shift(); if (A) { A(t); return; } Ka.push(t); } async function lt(t) { const A = await xu(); try { return await t(A); } finally { Su(A); } } class Du extends Eo { constructor(A) { super(A), this.fileLoader = new fo(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 c = this.fileType; this.manager.itemStart(i), Es(o, s).then(async (l) => { var Q; const g = [ new ProgressEvent("progress", { lengthComputable: !0, loaded: l.byteLength, total: l.byteLength }) ]; function I() { if (s) { const E = g.every((d) => d.lengthComputable || d.loaded === 0 && d.total === 0), f = g.reduce((d, w) => d + w.loaded, 0), p = g.reduce((d, w) => d + w.total, 0); s( new ProgressEvent("progress", { lengthComputable: E, loaded: f, total: p }) ); } } const h = {}, B = [], C = as(l); if (c === "pcsogs" && C === void 0) throw new Error("Invalid PC SOGS file"); if (C !== void 0) { c = "pcsogs"; for (const E of ["means", "scales", "quats", "sh0", "shN"]) { const f = C[E]; if (f) for (const p of f.files) { const d = new URL(p, i).toString(), w = g.length; g.push(new ProgressEvent("progress")), this.manager.itemStart(d); const D = new Request(d, { headers: r, credentials: a }), x = Es(D, (y) => { g[w] = y, I(); }).then((y) => { h[p] = y; }).catch((y) => { throw this.manager.itemError(d), y; }).finally(() => { this.manager.itemEnd(d); }); B.push(x); } } } if (await Promise.all(B), e) { const E = ((Q = this.packedSplats) == null ? void 0 : Q.splatEncoding) ?? pe, f = await Xa({ input: l, extraFiles: h, fileType: c, pathOrUrl: i, splatEncoding: E }); this.packedSplats ? (this.packedSplats.initialize(f), e(this.packedSplats)) : e(new KA(f)); } }).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 WA({ packedSplats: A }); } } async function Es(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: g } = await s.read(); if (l) break; a.push(g), r += g.length, A && A( new ProgressEvent("progress", { lengthComputable: i !== 0, loaded: r, total: i }) ); } const o = new Uint8Array(r); let c = 0; for (const l of a) o.set(l, c), c += l.length; return o.buffer; } var Jt = /* @__PURE__ */ ((t) => (t.PLY = "ply", t.SPZ = "spz", t.SPLAT = "splat", t.KSPLAT = "ksplat", t.PCSOGS = "pcsogs", t.PCSOGSZIP = "pcsogszip", t))(Jt || {}); function Va(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 = Pn(t, 4); return new DataView(e.buffer).getUint32(0, !0) === 1347635022 ? "spz" : void 0; } if (A.getUint32(0, !0) === 67324752) return vu(t) ? "pcsogszip" : void 0; } function Mu(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 Pa(t) { const A = Mu(t); if (A === "ply") return "ply"; if (A === "spz") return "spz"; if (A === "splat") return "splat"; if (A === "ksplat") return "ksplat"; } function Fh(t) { return as(t) !== void 0; } function as(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 vu(t) { try { const A = t instanceof ArrayBuffer ? new Uint8Array(t) : t; let e = null; const s = _o(A, { filter: ({ name: i }) => i.split(/[\\/]/).pop() === "meta.json" ? (e = i, !0) : !1 }); if (!e) return; const n = as(s[e]); return n ? { name: e, json: n } : void 0; } catch { return; } } async function Xa({ 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 = Va(i), !r && s && (r = Pa(s))), r) { case "ply": { const a = new Ie({ fileBytes: i }); await a.parseHeader(); const o = a.numSplats, c = mA(o).maxSplats, l = { fileBytes: i, packedArray: new Uint32Array(c * 4), splatEncoding: n }; return await lt(async (g) => { const { packedArray: I, numSplats: h, extra: B } = await g.call( "unpackPly", l ); return { packedArray: I, numSplats: h, extra: B }; }); } case "spz": return await lt(async (a) => { const { packedArray: o, numSplats: c, extra: l } = await a.call( "decodeSpz", { fileBytes: i, splatEncoding: n } ); return { packedArray: o, numSplats: c, extra: l }; }); case "splat": return await lt(async (a) => { const { packedArray: o, numSplats: c } = await a.call( "decodeAntiSplat", { fileBytes: i, splatEncoding: n } ); return { packedArray: o, numSplats: c }; }); case "ksplat": return await lt(async (a) => { const { packedArray: o, numSplats: c, extra: l } = await a.call( "decodeKsplat", { fileBytes: i, splatEncoding: n } ); return { packedArray: o, numSplats: c, extra: l }; }); case "pcsogs": return await lt(async (a) => { const { packedArray: o, numSplats: c, extra: l } = await a.call( "decodePcSogs", { fileBytes: i, extraFiles: A, splatEncoding: n } ); return { packedArray: o, numSplats: c, extra: l }; }); case "pcsogszip": return await lt(async (a) => { const { packedArray: o, numSplats: c, extra: l } = await a.call( "decodePcSogsZip", { fileBytes: i, splatEncoding: n } ); return { packedArray: o, numSplats: c, extra: l }; }); default: throw new Error(`Unknown splat file type: ${r}`); } } class bu { 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 Fu = `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 pe = { rgbMin: 0, rgbMax: 1, lnScaleMin: TA, lnScaleMax: UA, 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 os({ packedSplats: this }), this.dynoRgbMinMaxLnScaleMinMax = new Nt({ key: "rgbMinMaxLnScaleMinMax", value: new u.Vector4(0, 1, TA, UA), 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) ?? TA, ((r = this.splatEncoding) == null ? void 0 : r.lnScaleMax) ?? UA ), e; } }), this.dynoSh1MinMax = new _t({ key: "sh1MinMax", value: new u.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 _t({ key: "sh2MinMax", value: new u.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 _t({ key: "sh3MinMax", value: new u.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 / X) * X, 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 Du(); i.packedSplats = this, await i.loadAsync(e); } else if (s) { const i = await Xa({ input: s, fileType: A.fileType, pathOrUrl: A.fileName ?? e, splatEncoding: A.splatEncoding ?? pe }); 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 u.WebGLArrayRenderTarget(s, n, i, { depthBuffer: !1, stencilBuffer: !1, generateMipmaps: !1, magFilter: u.NearestFilter, minFilter: u.NearestFilter }), this.target.texture.format = u.RGBAIntegerFormat, this.target.texture.type = u.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 / X) * X; 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 u.DataArrayTexture( this.packedArray, A, e, s ), this.source.format = u.RGBAIntegerFormat, this.source.type = u.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 u.DataArrayTexture( i, A, e, s ), nA.emptySource.format = u.RGBAIntegerFormat, nA.emptySource.type = u.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 = MA( { index: "int" }, { output: "uvec4" }, ({ index: i }) => { A.inputs.index = i; const r = A.outputs.gsplat; return { output: An( r, this.dynoRgbMinMaxLnScaleMinMax ) }; } ); nA.programTemplate || (nA.programTemplate = new ss( Fu )), e = new es({ 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) / X) * X, c = X * qA; for (r.uniforms.targetBase.value = e, r.uniforms.targetCount.value = s; e < o; ) { const l = Math.floor(e / c); r.uniforms.targetLayer.value = l; const g = l * c, I = Math.floor((e - g) / X), h = Math.min( qA, Math.ceil((o - g) / X) ); this.target.scissor.set( 0, I, X, h - I ), n.setRenderTarget(this.target, l), n.xr.enabled = !1, n.autoClear = !1, nA.fullScreenQuad.render(n), e += X * (h - I); } return this.resetRenderState(n, a), { nextBase: o }; } }; nA.emptySource = null, nA.programTemplate = null, nA.generatorProgram = /* @__PURE__ */ new Map(), nA.fullScreenQuad = new ys( new u.RawShaderMaterial({ visible: !1 }) ); let KA = nA; class os extends k { constructor({ packedSplats: A } = {}) { super({ key: "packedSplats", type: Wt, globals: () => [Qe], value: { texture: KA.getEmpty(), numSplats: 0, rgbMinMaxLnScaleMinMax: new u.Vector4( 0, 1, TA, UA ) }, update: (e) => { var s, n, i, r, a, o, c, l, g, I; return e.texture = ((s = this.packedSplats) == null ? void 0 : s.getTexture()) ?? KA.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 = (c = this.packedSplats) == null ? void 0 : c.splatEncoding) == null ? void 0 : l.lnScaleMin) ?? TA, ((I = (g = this.packedSplats) == null ? void 0 : g.splatEncoding) == null ? void 0 : I.lnScaleMax) ?? UA ), e; } }), this.packedSplats = A; } } class He extends u.InstancedBufferGeometry { constructor(A, e) { super(), this.ordering = A, this.setAttribute("position", new u.BufferAttribute(ku, 3)), this.setIndex(new u.BufferAttribute(Nu, 1)), this._maxInstanceCount = A.length, this.instanceCount = e, this.attribute = new u.InstancedBufferAttribute(A, 1, !1, 1), this.attribute.setUsage(u.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 ]), Nu = new Uint16Array([0, 1, 2, 0, 2, 3]), nt = class nt { 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 u.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 u.WebGLRenderTarget( e * i, s * i, { format: u.RGBAFormat, type: u.UnsignedByteType, colorSpace: u.SRGBColorSpace } ), n && (this.back = new u.WebGLRenderTarget( e * i, s * i, { format: u.RGBAFormat, type: u.UnsignedByteType, colorSpace: u.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 Ln({ 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 u.PerspectiveCamera) { const i = new u.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: c } = this, l = n * n; for (let g = 0; g < r; g++) { const I = g * i; for (let h = 0; h < i; h++) { const B = h * n; let C = 0, Q = 0, E = 0, f = 0; for (let d = 0; d < n; d++) { const w = (g * n + d) * this.target.width; for (let D = 0; D < n; D++) { const x = (w + B + D) * 4; C += o[x], Q += o[x + 1], E += o[x + 2], f += o[x + 3]; } } const p = (I + h) * 4; c[p] = C / l, c[p + 1] = Q / l, c[p + 2] = E / l, c[p + 3] = f / l; } } return c; } // Render out a viewpoint as a Uint8Array of RGBA values for the provided scene // and any camera/viewToWorld viewpoint overrides. By default update is true, // which triggers its SparkRenderer to check and potentially update the Gsplats. // Setting update to false disables this and sorts the Gsplats as they are. // Setting forceOrigin (default: false) to true forces the view update to // recalculate the splats with this view origin, potentially altering any // view-dependent effects. If you expect view-dependent effects to play a role // in the rendering quality, enable this. // // Underneath, prepareRenderPixels() simply calls await this.prepare(...), // this.renderTarget(...), and finally returns the result this.readTarget(), // a Promise to a Uint8Array with RGBA values for all the pixels (potentially // downsampled if the superXY parameter was used). These steps can also be called // manually, for example if you need to alter the scene before and after // this.renderTarget(...) to hide UI elements from being rendered. async prepareRenderPixels({ scene: A, camera: e, viewToWorld: 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: c } = this.display.accumulator; A.mappingVersion === c && (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 && !ge({ 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: c, sort32Reader: l, dynoSortRadial: g, dynoOrigin: I, dynoDirection: h, dynoDepthBias: B, dynoSort360: C, dynoSplats: Q } = nt.makeSorter(), E = this.sort32 ?? !1; let f; if (E) this.readback32 = o.ensureBuffer(i, this.readback32), f = this.readback32; else { const y = Math.ceil(i / 2); this.readback16 = o.ensureBuffer(y, this.readback16), f = this.readback16; } const p = A.toWorld.clone().invert(), d = e.clone().premultiply(p); g.value = this.sort360 ? !0 : this.sortRadial, I.value.set(0, 0, 0).applyMatrix4(d), h.value.set(0, 0, -1).applyMatrix4(d).sub(I.value).normalize(), B.value = this.depthBias ?? 1, C.value = this.sort360 ?? !1, Q.packedSplats = A.splats; const w = E ? l : c, D = E ? n : Math.ceil(n / 2); await o.renderReadback({ renderer: this.spark.renderer, reader: w, count: D, readback: f }); const x = await lt(async (y) => { const m = E ? "sort32Splats" : "sortDoubleSplats"; return y.call(m, { maxSplats: i, numSplats: n, readback: f, ordering: a }); }); E ? 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 He(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 He(s, n)), this.orderingFreelist.free(r); } this.spark.viewpoint === this && this.spark.prepareViewpoint(this); } static makeSorter() { if (!nt.dynos) { const A = new oe({ value: !0 }), e = new bt({ value: new u.Vector3() }), s = new bt({ value: new u.Vector3() }), n = new ht({ value: 1 }), i = new oe({ value: !1 }), r = new os(), a = new ce(), o = MA( { index: "int" }, { rgba8: "vec4" }, ({ index: l }) => { if (!l) throw new Error("No index"); const g = { sortRadial: A, sortOrigin: e, sortDirection: s, sortDepthBias: n, sort360: i }, I = iA(l, J("int", 2)), h = vt(r, I), B = Fe({ gsplat: h, ...g }), C = vt( r, CA(I, J("int", 1)) ), Q = Fe({ gsplat: C, ...g }), E = HA({ vectorType: "vec2", x: B, y: Q }); return { rgba8: Le(Zi(E)) }; } ), c = MA( { index: "int" }, { rgba8: "vec4" }, ({ index: l }) => { if (!l) throw new Error("No index"); const g = { sortRadial: A, sortOrigin: e, sortDirection: s, sortDepthBias: n, sort360: i }, I = vt(r, l), h = Fe({ gsplat: I, ...g }); return { rgba8: Le(ji(h)) }; } ); nt.dynos = { dynoSortRadial: A, dynoOrigin: e, dynoDirection: s, dynoDepthBias: n, dynoSort360: i, dynoSplats: r, reader: a, doubleSortReader: o, sort32Reader: c }; } return nt.dynos; } }; nt.EMPTY_TEXTURE = new u.Texture(), nt.dynos = null; let he = nt; const Tu = uA(` 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: () => [vA, Tu], inputs: { gsplat: t, sortRadial: A, sortOrigin: e, sortDirection: s, sortDepthBias: n, sort360: i }, statements: ({ inputs: r, outputs: a }) => { const { gsplat: o, sortRadial: c, sortOrigin: l, sortDirection: g, sortDepthBias: I, sort360: h } = r; return GA(` ${a.metric} = computeSort(${o}, ${c}, ${l}, ${g}, ${I}, ${h}); `); } }).outputs.metric; } class ke { constructor() { this.splats = new KA(), this.toWorld = new u.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((c, l) => (c.set(l.node, l), c), /* @__PURE__ */ new Map()); let a = 0, o = 0; for (const { node: c, generator: l, version: g, base: I, count: h } of s) { const B = r.get(c); if ((n || l !== (B == null ? void 0 : B.generator) || g !== (B == null ? void 0 : B.version) || I !== (B == null ? void 0 : B.base) || h !== (B == null ? void 0 : B.count)) && l && h > 0) { const C = e.apply(l); try { this.splats.generate({ generator: C, base: I, count: h, renderer: A }); } catch (Q) { c.generator = void 0, c.generatorError = Q; } a += 1; } o = Math.max(o, I + 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 Uu = `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); }`, Gu = `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 } }`, Ru = `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]); float invZ = 1.0 / viewCenter.z; vec2 J1 = focal * invZ; vec2 J2 = -(J1 * viewCenter.xy) * invZ; mat3 J = mat3( J1.x, 0.0, J2.x, 0.0, J1.y, J2.y, 0.0, 0.0, 0.0 ); mat3 cov2D = transpose(J) * cov3D * J; float a = cov2D[0][0]; float d = cov2D[1][1]; float b = cov2D[0][1]; a += preBlurAmount; d += preBlurAmount; float fullBlurAmount = blurAmount; if ((focalDistance > 0.0) && (apertureAngle > 0.0)) { float focusRadius = 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 Ne = null; function Yu() { return Ne || (u.ShaderChunk.splatDefines = Uu, Ne = { splatVertex: Ru, splatFragment: Gu }), Ne; } const fs = 5; let Ke = !1, $e = !1, Wa; function Ju(t) { let A = !1; return t instanceof WA ? !0 : (t.traverse((e) => { A = A || e instanceof WA; }), A); } const Oa = u.Scene.prototype.add; u.Scene.prototype.add = function(t) { return Ke = Ke || Ju(t), $e = $e || t instanceof Ce, Oa.call(this, t), this; }; const Lu = u.Scene.prototype.onBeforeRender; u.Scene.prototype.onBeforeRender = function(t) { if (Ke) { if (!$e) { const A = Wa || new Ce({ renderer: t }); this.add(A); } u.Scene.prototype.onBeforeRender = Lu, u.Scene.prototype.add = Oa; } }; const oA = class oA extends u.Mesh { constructor(A) { const e = oA.makeUniforms(), s = Yu(), n = A.premultipliedAlpha ?? !0, i = new u.ShaderMaterial({ glslVersion: u.GLSL3, vertexShader: s.splatVertex, fragmentShader: s.splatFragment, uniforms: e, premultipliedAlpha: n, transparent: !0, depthTest: !0, depthWrite: !1, side: u.DoubleSide }); super(ps, i), this.splatTexture = null, this.autoViewpoints = [], this.rotateToAccumulator = new Nt({ value: new u.Quaternion() }), this.translateToAccumulator = new bt({ value: new u.Vector3() }), this.lastFrame = -1, this.lastUpdateTime = null, this.defaultCameras = [], this.lastStochastic = null, this.pendingUpdate = null, this.envViewpoint = null, this.frustumCulled = !1, this.renderer = A.renderer, this.material = i, this.uniforms = e; const r = MA( { gsplat: AA }, { gsplat: AA }, ({ gsplat: a }) => { if (!a) throw new Error("gsplat not defined"); return a = Ze(a, { rotate: this.rotateToAccumulator, translate: this.translateToAccumulator }), { gsplat: a }; } ); this.modifier = new hu(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 ?? { ...pe }, this.active = new ke(), this.accumulatorCount = 1, this.freeAccumulators = []; for (let a = 0; a < 1; ++a) this.freeAccumulators.push(new ke()), 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 ? _n(A.clock) : new u.Clock(), Wa = this; } static makeUniforms() { return { // Size of render viewport in pixels renderSize: { value: new u.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 u.Quaternion() }, // SplatAccumulator to view transformation translation renderToViewPos: { value: new u.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 u.Matrix2() }, // Splat texture UV transform (add) splatTexAdd: { value: new u.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: KA.getEmpty() }, // Splat encoding ranges rgbMinMaxLnScaleMinMax: { value: new u.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 < fs; } maybeAllocAccumulator() { let A = this.freeAccumulators.pop(); if (A === void 0) { if (this.accumulatorCount >= fs) return null; A = new ke(), 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, B; 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((Q) => Q.matrixWorld), this.defaultView.viewToWorld = _u(this.defaultCameras) ?? new u.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 Q = (h = A.xr.getSession()) == null ? void 0 : h.renderState.baseLayer; Q && (C.x = Q.framebufferWidth, C.y = Q.framebufferHeight); } } const c = s; if (this.uniforms.near.value = c.near, this.uniforms.far.value = c.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: Q, multiply: E, add: f, near: p, far: d, mid: w } = this.splatTexture; C && Q ? (this.uniforms.splatTexEnable.value = !0, this.uniforms.splatTexture.value = Q, E ? this.uniforms.splatTexMul.value.fromArray(E.elements) : this.uniforms.splatTexMul.value.set( 0.5 / this.maxStdDev, 0, 0, 0.5 / this.maxStdDev ), this.uniforms.splatTexAdd.value.set((f == null ? void 0 : f.x) ?? 0.5, (f == null ? void 0 : f.y) ?? 0.5), this.uniforms.splatTexNear.value = p ?? 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 = ((B = o.display) == null ? void 0 : B.accumulator.toWorld) ?? new u.Matrix4(), g = s.matrixWorld.clone().invert(); l.clone().premultiply(g).decompose( this.uniforms.renderToViewPos.value, this.uniforms.renderToViewQuat.value, new u.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) ?? TA, ((i = r.splats.splatEncoding) == null ? void 0 : i.lnScaleMax) ?? UA ), 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 = KA.getEmpty(), this.geometry = ps; } // If spark.autoUpdate is false then you must manually call // spark.update({ scene }) to have the scene Gsplats be re-generated. update({ scene: A, viewToWorld: e }) { const s = this.matrixWorld.clone(); this.preUpdate ? this.updateInternal({ scene: A, originToWorld: s, viewToWorld: e }) : (this.pendingUpdate = { scene: A, originToWorld: s }, setTimeout(() => { if (this.pendingUpdate) { const { scene: n, originToWorld: i } = this.pendingUpdate; this.pendingUpdate = null, this.updateInternal({ scene: n, originToWorld: i, viewToWorld: e }); } }, 1)); } updateInternal({ scene: A, originToWorld: e, viewToWorld: s }) { var B; 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, Q) => (C.set(Q.node, Q), C), /* @__PURE__ */ new Map()), { generators: a, visibleGenerators: o, globalEdits: c } = this.compileScene(A); for (const C of a) (B = C.frameUpdate) == null || B.call(C, { object: C, time: n, deltaTime: i, viewToWorld: s, globalEdits: c }); const l = new Set(o.map((C) => C.uuid)); for (const C of a) { const Q = r.get(C), f = C.generator && l.has(C.uuid) ? C.numSplats : 0; (this.needsUpdate || C.generator !== (Q == null ? void 0 : Q.generator) || f !== (Q == null ? void 0 : Q.count)) && C.updateVersion(); } const g = !ge({ matrix1: e, matrix2: this.active.toWorld, maxDistance: this.originDistance }), I = this.needsUpdate || g || a.length !== r.size || a.some((C) => { var Q; return C.version !== ((Q = r.get(C)) == null ? void 0 : Q.version); }); this.needsUpdate = !1; let h = null; if (I) { if (h = this.maybeAllocAccumulator(), !h) throw new Error("Unreachable"); const C = !ge({ matrix1: e, matrix2: this.active.toWorld, maxDistance: 1e-5, minCoorient: 0.99999 }), E = 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), f = E.map((x) => x.numSplats), { maxSplats: p, mapping: d } = h.splats.generateMapping(f), w = E.map((x, y) => { const { base: m, count: N } = d[y]; return { node: x, generator: x.generator, version: x.version, base: m, count: N }; }); e.clone().invert().decompose( this.translateToAccumulator.value, this.rotateToAccumulator.value, new u.Vector3() ), h.ensureGenerate(p), 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 Kt && e.push(i); }); const s = []; A.traverseVisible((i) => { i instanceof Kt && 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 WA); ) 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, B; 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 u.WebGLCubeRenderTarget(n, { format: u.RGBAFormat, generateMipmaps: !0, minFilter: u.LinearMipMapLinearFilter }), Q = new u.CubeCamera(i, r, C); oA.cubeRender = { target: C, camera: Q, near: i, far: r }; } oA.pmrem || (oA.pmrem = new u.PMREMGenerator(A ?? this.renderer)); const c = new u.Matrix4().setPosition(s); await ((h = this.envViewpoint) == null ? void 0 : h.prepare({ scene: e, viewToWorld: c, update: o })); const { target: l, camera: g } = oA.cubeRender; g.position.copy(s); const I = /* @__PURE__ */ new Map(); for (const C of a) I.set(C, C.visible), C.visible = !1; this.prepareViewpoint(this.envViewpoint), g.update(A ?? this.renderer, e), this.prepareViewpoint(this.defaultView); for (const [C, Q] of I.entries()) C.visible = Q; return (B = oA.pmrem) == null ? void 0 : B.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 u.Mesh) if (Array.isArray(s.material)) for (const n of s.material) n instanceof u.MeshStandardMaterial && (n.envMap = e); else s.material instanceof u.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 u.Data3DTexture(); let Ce = oA; const ps = new He(new Uint32Array(1), 0); MA( { packedSplats: Wt, index: "int" }, { gsplat: AA }, ({ packedSplats: t, index: A }) => { if (!t || !A) throw new Error("Invalid input"); return { gsplat: vt(t, A) }; } ); function _u(t) { if (t.length === 0) return null; const A = new u.Vector3(), e = new u.Quaternion(), s = new u.Vector3(), n = [], i = []; for (const r of t) r.decompose(A, e, s), n.push(A), i.push(e); return new u.Matrix4().compose( qn(n), Hn(i), new u.Vector3(1, 1, 1) ); } function zu(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], c = n[a + 1], l = n[a + 2], g = n[a + 3], I = n[a + 4], h = n[a + 5], B = t[r + 24] / 255, C = t[r + 25] / 255, Q = t[r + 26] / 255, E = t[r + 27] / 255, f = (t[r + 28] - 128) / 128, p = (t[r + 29] - 128) / 128, d = (t[r + 30] - 128) / 128, w = (t[r + 31] - 128) / 128; e( i, o, c, l, g, I, h, p, d, w, f, E, B, C, Q ); } } const ds = { 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 } }, qu = { 0: 0, 1: 9, 2: 24, 3: 45 }; function Hu(t, A, e, s) { var C; let r = 0; const a = new DataView(t.buffer, r, 4096); r += 4096; const o = a.getUint8(0), c = a.getUint8(1); if (o !== 0 || c < 1) throw new Error( `Unsupported .ksplat version: ${o}.${c}` ); const l = a.getUint32(4, !0); a.getUint32(16, !0); const g = a.getUint16(20, !0); if (g < 0 || g > 2) throw new Error(`Invalid .ksplat compression level: ${g}`); const I = a.getFloat32(36, !0) || -1.5, h = a.getFloat32(40, !0) || 1.5; let B = 4096 + l * 1024; for (let Q = 0; Q < l; ++Q) { let E = function(DA, z) { if (g === 0) return Y.getFloat32( DA + P + z * 4, !0 ); if (g === 1) return wA( Y.getUint16( DA + P + z * 2, !0 ) ); const PA = Y.getUint8(DA + P + z) / 255; return I + PA * (h - I); }; const f = new DataView(t.buffer, r, 1024); r += 1024; const p = f.getUint32(0, !0), d = f.getUint32(4, !0), w = f.getUint32(8, !0), D = f.getUint32(12, !0), x = f.getFloat32(16, !0), y = f.getUint16(20, !0), m = (f.getUint32(24, !0) || ((C = ds[g]) == null ? void 0 : C.scaleRange)) ?? 1, N = f.getUint32(32, !0), M = N * w, S = f.getUint32(36, !0), U = S * 4, F = y * D + U, b = f.getUint16(40, !0), T = qu[b], { bytesPerCenter: R, bytesPerScale: W, bytesPerRotation: L, bytesPerColor: eA, bytesPerSphericalHarmonicsComponent: H, scaleOffsetBytes: O, rotationOffsetBytes: _, colorOffsetBytes: j, sphericalHarmonicsOffsetBytes: P } = ds[g], Z = R + W + L + eA + T * H, G = Z * d, fA = G + F, cA = [0, 3, 6, 1, 4, 7, 2, 5, 8], pA = [ 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, hA = b >= 2 ? new Float32Array(5 * 3) : void 0, RA = b >= 3 ? new Float32Array(7 * 3) : void 0, SA = x / 2 / m, OA = B + U, jA = B + F, Y = new DataView( t.buffer, jA, G ), EA = new Float32Array( t.buffer, OA, D * 3 ), VA = new Uint32Array( t.buffer, B, S ); let Ut = N, jt = M; for (let DA = 0; DA < p; ++DA) { const z = DA * Z; let PA; if (DA < M) PA = Math.floor(DA / w); else { const ZA = VA[Ut - N]; DA >= jt + ZA && (Ut += 1, jt += ZA), PA = Ut; } const de = g === 0 ? Y.getFloat32(z + 0, !0) : (Y.getUint16(z + 0, !0) - m) * SA + EA[3 * PA + 0], ye = g === 0 ? Y.getFloat32(z + 4, !0) : (Y.getUint16(z + 2, !0) - m) * SA + EA[3 * PA + 1], we = g === 0 ? Y.getFloat32(z + 8, !0) : (Y.getUint16(z + 4, !0) - m) * SA + EA[3 * PA + 2], me = g === 0 ? Y.getFloat32(z + O + 0, !0) : wA(Y.getUint16(z + O + 0, !0)), xe = g === 0 ? Y.getFloat32(z + O + 4, !0) : wA(Y.getUint16(z + O + 2, !0)), ro = g === 0 ? Y.getFloat32(z + O + 8, !0) : wA(Y.getUint16(z + O + 4, !0)), ao = g === 0 ? Y.getFloat32(z + _ + 0, !0) : wA( Y.getUint16(z + _ + 0, !0) ), oo = g === 0 ? Y.getFloat32(z + _ + 4, !0) : wA( Y.getUint16(z + _ + 2, !0) ), go = g === 0 ? Y.getFloat32(z + _ + 8, !0) : wA( Y.getUint16(z + _ + 4, !0) ), co = g === 0 ? Y.getFloat32(z + _ + 12, !0) : wA( Y.getUint16(z + _ + 6, !0) ), lo = Y.getUint8(z + j + 0) / 255, Io = Y.getUint8(z + j + 1) / 255, uo = Y.getUint8(z + j + 2) / 255, ho = Y.getUint8(z + j + 3) / 255; if (e( DA, de, ye, we, me, xe, ro, oo, go, co, ao, ho, lo, Io, uo ), b >= 1 && xA) { for (const [ZA, Gt] of cA.entries()) xA[ZA] = E(z, Gt); if (hA) for (const [ZA, Gt] of pA.entries()) hA[ZA] = E(z, Gt); if (RA) for (const [ZA, Gt] of dA.entries()) RA[ZA] = E(z, Gt); s == null || s(DA, xA, hA, RA); } } B += fA; } } class Ku { constructor({ fileBytes: A }) { this.fileBytes = A instanceof ArrayBuffer ? new Uint8Array(A) : A, this.reader = new Xn({ 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 c = 0; c < this.numSplats; c++) { const l = c * 3, g = wA(o[l]), I = wA(o[l + 1]), h = wA(o[l + 2]); A == null || A(c, g, I, h); } } else if (this.version === 2) { const a = 1 << this.fractionalBits, o = this.reader.read(this.numSplats * 3 * 3); for (let c = 0; c < this.numSplats; c++) { const l = c * 9, g = ((o[l + 2] << 24 | o[l + 1] << 16 | o[l] << 8) >> 8) / a, I = ((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(c, g, I, 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 = Za / 0.15; for (let c = 0; c < this.numSplats; c++) { const l = c * 3, g = (a[l] / 255 - 0.5) * o + 0.5, I = (a[l + 1] / 255 - 0.5) * o + 0.5, h = (a[l + 2] / 255 - 0.5) * o + 0.5; s == null || s(c, g, I, h); } } { const a = this.reader.read(this.numSplats * 3); for (let o = 0; o < this.numSplats; o++) { const c = o * 3, l = Math.exp(a[c] / 16 - 10), g = Math.exp(a[c + 1] / 16 - 10), I = Math.exp(a[c + 2] / 16 - 10); n == null || n(o, l, g, I); } } { const a = this.reader.read(this.numSplats * 3); for (let o = 0; o < this.numSplats; o++) { const c = o * 3, l = a[c] / 127.5 - 1, g = a[c + 1] / 127.5 - 1, I = a[c + 2] / 127.5 - 1, h = Math.sqrt( Math.max(0, 1 - l * l - g * g - I * I) ); i == null || i(o, l, g, I, h); } } if (r && this.shDegree >= 1) { const a = new Float32Array(9), o = this.shDegree >= 2 ? new Float32Array(5 * 3) : void 0, c = this.shDegree >= 3 ? new Float32Array(7 * 3) : void 0, l = this.reader.read( this.numSplats * ja[this.shDegree] * 3 ); let g = 0; for (let I = 0; I < this.numSplats; I++) { for (let h = 0; h < 9; ++h) a[h] = (l[g + h] - 128) / 128; if (g += 9, o) { for (let h = 0; h < 15; ++h) o[h] = (l[g + h] - 128) / 128; g += 15; } if (c) { for (let h = 0; h < 21; ++h) c[h] = (l[g + h] - 128) / 128; g += 21; } r == null || r(I, a, o, c); } } } } const ja = { 1: 3, 2: 8, 3: 15 }, Za = 0.28209479177387814, $u = 1347635022, Vu = 2, Pu = 1; class et { 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, $u, !0), this.view.setUint32(4, Vu, !0), this.view.setUint32(8, A, !0), this.view.setUint8(12, e), this.view.setUint8(13, s), this.view.setUint8(14, n ? Pu : 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)), c = Math.round(n * this.fraction), l = Math.max(-8388607, Math.min(8388607, c)); (i !== r || a !== o || c !== 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) / (Za / 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, et.scaleRgb(e)), this.view.setUint8(i + 1, et.scaleRgb(s)), this.view.setUint8(i + 2, et.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 = ja[this.shDegree] || 0, r = 16 + this.numSplats * 19 + A * i * 3; for (let a = 0; a < 9; ++a) this.view.setUint8(r + a, et.quantizeSh(e[a], 5)); if (s) { const a = r + 9; for (let o = 0; o < 15; ++o) this.view.setUint8(a + o, et.quantizeSh(s[o], 4)); if (n) { const o = a + 15; for (let c = 0; c < 21; ++c) this.view.setUint8(o + c, et.quantizeSh(n[c], 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, g, I; const A = new bu(), { inputs: e, clipXyz: s, maxSh: n, fractionalBits: i = 12, opacityThreshold: r } = t; for (const h of e) { let B = function(y) { return y.multiplyScalar(p), y.applyQuaternion(d), y.add(w), y; }, C = function(y) { return y.multiplyScalar(p), y; }, Q = function(y) { return y.premultiply(d), y; }, E = function(y) { return !D || D.containsPoint(y); }, f = function(y) { return r !== void 0 ? y >= r : !0; }; const p = ((l = h.transform) == null ? void 0 : l.scale) ?? 1, d = new u.Quaternion().fromArray( ((g = h.transform) == null ? void 0 : g.quaternion) ?? [0, 0, 0, 1] ), w = new u.Vector3().fromArray( ((I = h.transform) == null ? void 0 : I.translate) ?? [0, 0, 0] ), D = s ? new u.Box3( new u.Vector3().fromArray(s.min), new u.Vector3().fromArray(s.max) ) : void 0; let x = h.fileType; switch (x || (x = Va(h.fileBytes), !x && h.pathOrUrl && (x = Pa(h.pathOrUrl))), x) { case Jt.PLY: { const y = new Ie({ fileBytes: h.fileBytes }); await y.parseHeader(); let m = null; y.parseSplats( (N, M, S, U, F, b, T, R, W, L, eA, H, O, _, j) => { const P = B(new u.Vector3(M, S, U)); if (E(P) && f(H)) { m = A.pushSplat(), A.setCenter(m, P.x, P.y, P.z); const Z = C( new u.Vector3(F, b, T) ); A.setScale(m, Z.x, Z.y, Z.z); const G = Q( new u.Quaternion(R, W, L, eA) ); A.setQuaternion( m, G.x, G.y, G.z, G.w ), A.setOpacity(m, H), A.setColor(m, O, _, j); } else m = null; }, (N, 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 Jt.SPZ: { const y = new Ku({ fileBytes: h.fileBytes }), m = new Int32Array(y.numSplats); m.fill(-1); const N = new Float32Array(y.numSplats * 3), M = new u.Vector3(); y.parseSplats( (S, U, F, b) => { const T = B(new u.Vector3(U, F, b)); N[S * 3] = T.x, N[S * 3 + 1] = T.y, N[S * 3 + 2] = T.z; }, (S, U) => { M.fromArray(N, S * 3), E(M) && f(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 u.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 = Q( new u.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 Jt.SPLAT: zu( h.fileBytes, (y) => { }, (y, m, N, M, S, U, F, b, T, R, W, L, eA, H, O) => { const _ = B(new u.Vector3(m, N, M)); if (E(_) && f(L)) { const j = A.pushSplat(); A.setCenter(j, _.x, _.y, _.z); const P = C( new u.Vector3(S, U, F) ); A.setScale(j, P.x, P.y, P.z); const Z = Q( new u.Quaternion(b, T, R, W) ); A.setQuaternion( j, Z.x, Z.y, Z.z, Z.w ), A.setOpacity(j, L), A.setColor(j, eA, H, O); } } ); break; case Jt.KSPLAT: { let y = null; Hu( h.fileBytes, (m) => { }, (m, N, M, S, U, F, b, T, R, W, L, eA, H, O, _) => { const j = B(new u.Vector3(N, M, S)); if (E(j) && f(eA)) { y = A.pushSplat(), A.setCenter(y, j.x, j.y, j.z); const P = C( new u.Vector3(U, F, b) ); A.setScale(y, P.x, P.y, P.z); const Z = Q( new u.Quaternion(T, R, W, L) ); A.setQuaternion( y, Z.x, Z.y, Z.z, Z.w ), A.setOpacity(y, eA), A.setColor(y, H, O, _); } else y = null; }, (m, N, M, S) => { y !== null && (A.setSh1(y, N), 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 et({ numSplats: A.numSplats, shDegree: a, fractionalBits: i, flagAntiAlias: !0 }); for (let h = 0; h < A.numSplats; ++h) { const B = h * 3, C = h * 4; o.setCenter( h, A.centers[B], A.centers[B + 1], A.centers[B + 2] ), o.setScale( h, A.scales[B], A.scales[B + 1], A.scales[B + 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[B], A.colors[B + 1], A.colors[B + 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 Nh { 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 u.DataArrayTexture( this.skinData, e, s, n ), this.skinTexture.format = u.RGBAIntegerFormat, this.skinTexture.type = u.UnsignedShortType, this.skinTexture.internalFormat = "RGBA16UI", this.skinTexture.needsUpdate = !0, this.numBones = A.numBones ?? 256, this.boneData = new Float32Array(this.numBones * 16), this.boneTexture = new u.DataTexture( this.boneData, 4, this.numBones, u.RGBAFormat, u.FloatType ), this.boneTexture.internalFormat = "RGBA32F", this.boneTexture.needsUpdate = !0, this.uniform = new k({ key: "skinning", type: Ao, globals: () => [to], 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 Wu(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 u.Quaternion( this.boneData[n + 0], this.boneData[n + 1], this.boneData[n + 2], this.boneData[n + 3] ), r = new u.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 c = new u.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 * c.x, this.boneData[n + 13] = 0.5 * c.y, this.boneData[n + 14] = 0.5 * c.z, this.boneData[n + 15] = 0.5 * c.w; } // Set up to 4 bone indices and weights for a Gsplat. For fewer than 4 bones, // you can set the remaining weights to 0 (and index=0). setSplatBones(A, e, 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 Ao = { type: "GsplatSkinning" }, to = uA(` struct GsplatSkinning { int numSplats; int numBones; usampler2DArray skinTexture; sampler2D boneTexture; }; `), Xu = uA(` 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 Wu(t, A) { return new V({ inTypes: { gsplat: AA, skinning: Ao }, outTypes: { gsplat: AA }, globals: () => [to, Xu], inputs: { gsplat: t, skinning: A }, statements: ({ inputs: s, outputs: n }) => { const { skinning: i } = s, { gsplat: r } = n; return GA(` ${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 Th({ // 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 u.Vector3(), c = new u.Vector3(), l = new u.Quaternion(0, 0, 0, 1); r == null && (r = (I, h) => I.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 g = new u.Color(); for (let I = A.min.z; I < A.max.z + 1e-6; I += e) for (let h = A.min.y; h < A.max.y + 1e-6; h += e) for (let B = A.min.x; B < A.max.x + 1e-6; B += e) { o.set(B, h, I); for (let C = 0; C < 2; ++C) c.setScalar(s * (C ? 1 : n)), C ? typeof r == "function" ? r(g, o) : g.copy(r) : g.setScalar(0), t.pushSplat(o, c, l, i, g); } } function Uh({ // 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 u.Vector3()] }) { const i = new u.Vector3(), r = new u.Vector3(), a = new u.Quaternion(0, 0, 0, 1), o = new u.Color(), c = 1; for (const l of n) for (let g = 0; g < 3; ++g) { i.set( l.x + (g === 0 ? A : 0), l.y + (g === 1 ? A : 0), l.z + (g === 2 ? A : 0) ); for (let I = 0; I < 2; ++I) r.set( (g === 0 ? A : e) * (I ? 1 : s), (g === 1 ? A : e) * (I ? 1 : s), (g === 2 ? A : e) * (I ? 1 : s) ), o.setRGB( I === 0 ? 0 : g === 0 ? 1 : 0, I === 0 ? 0 : g === 1 ? 1 : 0, I === 0 ? 0 : g === 2 ? 1 : 0 ), t.pushSplat(i, r, a, c, o); } } function Gh({ // PackedSplats object to add splats to splats: t, // center of the sphere (default: origin) origin: A = new u.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 u.Color(1, 1, 1) }) { const o = {}; function c(C) { if (n && !n(C)) return; const Q = `${C.x},${C.y},${C.z}`; o[Q] || (o[Q] = C); } function l(C, Q, E, f) { if (c(Q), c(E), c(f), C >= s) return; const p = new u.Vector3().addVectors(Q, E).normalize(), d = new u.Vector3().addVectors(E, f).normalize(), w = new u.Vector3().addVectors(f, Q).normalize(); l(C + 1, Q, p, w), l(C + 1, p, E, d), l(C + 1, w, d, f), l(C + 1, p, d, w); } for (const C of [-1, 1]) for (const Q of [-1, 1]) for (const E of [-1, 1]) { const f = new u.Vector3(C, 0, 0), p = new u.Vector3(0, Q, 0), d = new u.Vector3(0, 0, E); l(0, f, p, d); } const g = Object.values(o), I = new u.Vector3(i, i, r), h = new u.Quaternion(), B = typeof a == "function" ? new u.Color() : a; for (const C of g) h.setFromUnitVectors(new u.Vector3(0, 0, -1), C), typeof a == "function" && a(B, C), C.multiplyScalar(e), C.add(A), t.pushSplat(C, I, h, 1, B); } function Rh({ // 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 u.Color(1, 1, 1), i = i ?? 0.8, r = r ?? "start", a = a ?? 1, o = o ?? 1; const c = t.split(` `), l = document.createElement("canvas"), g = l.getContext("2d"); if (!g) throw new Error("Failed to create canvas context"); g.font = `${e}px ${A}`, g.textAlign = r; const I = g.measureText(""), h = I.fontBoundingBoxAscent + I.fontBoundingBoxDescent; let B = Number.POSITIVE_INFINITY, C = Number.NEGATIVE_INFINITY, Q = Number.POSITIVE_INFINITY, E = Number.NEGATIVE_INFINITY; for (let F = 0; F < c.length; ++F) { const b = g.measureText(c[F]), T = h * a * F; B = Math.min(B, -b.actualBoundingBoxLeft), C = Math.max(C, b.actualBoundingBoxRight), Q = Math.min(Q, T - b.actualBoundingBoxAscent), E = Math.max(E, T + b.actualBoundingBoxDescent); } const f = Math.floor(B), p = Math.floor(Q), d = Math.ceil(C) - f, w = Math.ceil(E) - p; l.width = d, l.height = w, g.font = `${e}px ${A}`, g.textAlign = r, g.textBaseline = "alphabetic", g.fillStyle = "#FFFFFF"; for (let F = 0; F < c.length; ++F) { const b = h * a * F - p; g.fillText(c[F], -f, b); } const D = g.getImageData(0, 0, d, w), x = new Uint8Array(D.data.buffer), y = new KA(), m = new u.Vector3(), N = new u.Vector3().setScalar(i * o), M = new u.Quaternion(0, 0, 0, 1); n = n ?? new u.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, N, M, R, n); } S += 4; } const U = new WA({ packedSplats: y }); return U.recolor = s, U; } function Yh({ // URL of the image to convert to splats (example: `url: "./image.png"`) url: t, // Radius of each Gsplat, default covers 1-unit spacing well (default: 0.8) dotRadius: A, // Subsampling factor for the image. Higher values reduce resolution, // for example 2 will halve the width and height by averaging (default: 1) subXY: e, // Optional callback function to modify each Gsplat before it's added. // Return null to skip adding the Gsplat, or a number to set the opacity // and add the Gsplat with parameter values in the objects center, rgba etc. were // passed into the forEachSplat callback. Ending the callback in `return opacity;` // will retain the original opacity. // ((width: number, height: number, index: number, center: THREE.Vector3, scales: THREE.Vector3, quaternion: THREE.Quaternion, opacity: number, color: THREE.Color) => number | null) forEachSplat: s }) { return A = A ?? 0.8, e = Math.max(1, Math.floor(e ?? 1)), new WA({ constructSplats: async (n) => new Promise((i, r) => { const a = new Image(); a.crossOrigin = "anonymous", a.onerror = r, a.onload = () => { const { width: o, height: c } = a, l = document.createElement("canvas"); l.width = o, l.height = c; const g = l.getContext("2d"); if (!g) { r(new Error("Failed to create canvas context")); return; } g.imageSmoothingEnabled = !0, g.imageSmoothingQuality = "high"; const I = Math.round(o / e), h = Math.round(c / e); g.drawImage(a, 0, 0, I, h); try { const B = g.getImageData(0, 0, I, h), C = new Uint8Array(B.data.buffer), Q = new u.Vector3(), E = new u.Vector3().setScalar(A), f = new u.Quaternion(0, 0, 0, 1), p = new u.Color(); let d = 0; for (let w = 0; w < h; ++w) for (let D = 0; D < I; ++D) { const x = d * 4, y = C[x + 3]; if (y > 0) { let m = y / 255; p.set( C[x + 0] / 255, C[x + 1] / 255, C[x + 2] / 255 ), Q.set( D - 0.5 * (I - 1), 0.5 * (h - 1) - w, 0 ), E.setScalar(A), f.set(0, 0, 0, 1); let N = !0; if (s) { const M = s( I, h, d, Q, E, f, m, p ); m = M ?? m, N = M !== null; } N && n.pushSplat(Q, E, f, m, p); } d += 1; } i(); } catch (B) { r(B); } }, a.src = t; }) }); } function Ou({ 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 = _A(0), c = new Kt({ numSplats: i, generator: MA( { index: "int" }, { gsplat: AA }, ({ index: g }) => { if (!g) throw new Error("index is undefined"); const I = Je(g, r), h = ie(g, r), B = Je(h, a), C = ie(h, a), Q = HA({ vectorType: "ivec3", x: I, y: B, z: C }), E = Oi(o), f = HA({ vectorType: "ivec2", x: g, y: E }), p = ta(f), d = J("vec3", t.min), w = J("vec3", t.max), D = Et(w, d), x = ie(CA(Bt(Q), p), J("vec3", A)); let y, m, N; s ? (y = J("float", s.r), m = J("float", s.g), N = J("float", s.b)) : { r: y, g: m, b: N } = Qt(x).outputs; const M = HA({ vectorType: "vec4", r: y, g: m, b: N, a: J("float", n) }), S = CA(d, iA(D, x)), U = Bt(J("float", e)), F = J("vec4", new u.Quaternion(0, 0, 0, 1)); let b = rt({ flags: ae("uint", "GSPLAT_FLAG_ACTIVE"), index: g, center: S, scales: U, quaternion: F, rgba: M }); return b = l.applyGsplat(b), { gsplat: b }; }, { globals: () => [vA] } ), update: ({ time: g }) => { o.value = g, l.update(c), c.updateVersion(); } }), l = new xt(); return c; } const ju = { box: new u.Box3( new u.Vector3(-1, -1, -1), new u.Vector3(1, 1, 1) ), density: 100, fallDirection: new u.Vector3(-1, -3, 1).normalize(), fallVelocity: 0.02, wanderScale: 0.04, wanderVariance: 2, color1: new u.Color(1, 1, 1), color2: new u.Color(0.5, 0.5, 1), minScale: 1e-3, maxScale: 5e-3, anisoScale: new u.Vector3(1, 1, 1) }, Zu = { box: new u.Box3( new u.Vector3(-2, -1, -2), new u.Vector3(2, 5, 2) ), density: 10, fallDirection: new u.Vector3(0, -1, 0), fallVelocity: 2, wanderScale: 0.1, wanderVariance: 1, color1: new u.Color(1, 1, 1), color2: new u.Color(0.25, 0.25, 0.5), minScale: 5e-3, maxScale: 0.01, anisoScale: new u.Vector3(0.1, 1, 0.1) }; function Ah({ // 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: c, // 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: g, // Color 2 of the two colors interpolated between (default: (0.5, 0.5, 1)) color2: I, // The base opacity of the Gsplats (default: 1) opacity: h, // Optional callback function to call each frame. onFrame: B }) { t = t ?? new u.Box3(new u.Vector3(-1, -1, -1), new u.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 Q = _A(i ?? 1e-3), E = _A(r ?? 5e-3), f = tt( ((n == null ? void 0 : n.clone()) ?? new u.Vector3(1, 1, 1)).normalize() ), p = tt( (a ?? new u.Vector3(0, -1, 0)).normalize() ), d = _A(o ?? 0.02), w = _A(c ?? 0.01), D = _A(l ?? 2), x = tt(g ?? new u.Color(1, 1, 1)), y = tt(I ?? new u.Color(0.5, 0.5, 1)), m = _A(h ?? 1), N = _A(0), M = tt(new u.Vector3(0, 0, 0)), S = tt(t.min), U = tt(t.max), F = _A(A ?? Number.NEGATIVE_INFINITY), b = Et(U, S), T = new Kt({ numSplats: e, generator: MA( { index: "int" }, { gsplat: AA }, ({ index: W }) => { if (!W) throw new Error("index not defined"); const L = _e(W), eA = Qt(L).outputs.w; let H = Bt(L), O = re(iA(eA, J("float", 100))); O = ze(iA(ae("float", "PI"), O)), O = CA(Q, iA(O, Et(E, Q))); const _ = iA(O, f), j = re(iA(eA, J("float", 10))), P = re(eA), Z = Ai(x, y, P), G = iA(Z, j), fA = _e( HA({ vectorType: "ivec2", x: W, y: J("int", 6837) }) ); let cA = Bt(fA), pA = iA(Qt(fA).outputs.w, D); pA = CA(N, pA), H = CA(H, M); const dA = jn( H, J("vec3", new u.Vector3(1, 1, 1)) ); H = CA(S, iA(b, dA)); const xA = J("vec4", new u.Quaternion(0, 0, 0, 1)); cA = ze(CA(Bt(pA), cA)), cA = iA(cA, w); let hA = CA(H, cA), RA = Qt(hA).outputs.y; RA = Zn(F, RA), hA = HA({ vector: hA, y: RA }); let SA = rt({ flags: ae("uint", "GSPLAT_FLAG_ACTIVE"), index: W, center: hA, scales: _, quaternion: xA, rgb: G, opacity: m }); return SA = R.applyGsplat(SA), { gsplat: SA }; }, { globals: () => [vA] } ), update: ({ object: W, time: L, deltaTime: eA }) => { N.value = L, R.update(T); const H = p.value.clone().multiplyScalar(d.value * eA); M.value.add(H), W.visible = m.value > 0, B == null || B({ object: W, time: L, 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: p, minScale: Q, maxScale: E, anisoScale: f }; } const Jh = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, DEFAULT_RAIN: Zu, DEFAULT_SNOW: ju, snowBox: Ah, staticBox: Ou }, Symbol.toStringTag, { value: "Module" })); function eo(t) { return MA({ gsplat: AA }, { gsplat: AA }, ({ gsplat: A }) => { if (!A) throw new Error("No gsplat input"); let e = Ge(A); const s = t.applyGsplat(A), n = ut(s).outputs.center, i = Ge(s), r = br(n, i), a = ki(r, J("float", 0)); e = rs(a, is(e), e); const o = CA( iA(e, J("float", 0.5)), J("float", 0.5) ); return A = rt({ gsplat: A, rgb: o }), { gsplat: A }; }); } function th(t) { t.enableWorldToView = !0, t.worldModifier = eo(t.context.worldToView), t.updateGenerator(); } function so(t, A, e, s) { return MA({ gsplat: AA }, { gsplat: AA }, ({ gsplat: n }) => { if (!n) throw new Error("No gsplat input"); let { center: i } = ut(n).outputs; i = t.apply(i); const { z: r } = Qt(i).outputs; let a = ea(is(r), A, e); return a = rs(s, Et(J("float", 1), a), a), n = rt({ gsplat: n, r: a, g: a, b: a }), { gsplat: n }; }); } function eh(t, A, e, s) { t.enableWorldToView = !0; const n = J("float", A), i = J("float", e), r = J("bool", s ?? !1); return t.worldModifier = so( t.context.worldToView, n, i, r ), t.updateGenerator(), { minDepth: n, maxDepth: i, reverse: r }; } const Lh = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, makeDepthColorModifier: so, makeNormalColorModifier: eo, setDepthColor: eh, setWorldNormalColor: th }, 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 g = null; async function I(C) { console.log("onSessionStarted"), C.addEventListener("end", h), await A.xr.setSession(C), i.textContent = "EXIT VR", g = C; } function h() { console.log("onSessionEnded"), g == null || g.removeEventListener("end", h), i.textContent = "ENTER VR", g = 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 B = { ...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 = () => { g === null ? (console.log("requesting session"), n.requestSession("immersive-vr", B).then( I )) : (console.log("ending session"), g.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 c(g) { a(), console.warn( "Exception when trying to call xr.isSessionSupported", g ), i.textContent = "VR NOT ALLOWED"; } function l(g) { g.style.position = "absolute", g.style.bottom = "20px", g.style.padding = "12px 6px", g.style.border = "1px solid #fff", g.style.borderRadius = "4px", g.style.background = "rgba(0,0,0,0.1)", g.style.color = "#fff", g.style.font = "normal 13px sans-serif", g.style.textAlign = "center", g.style.opacity = "0.5", g.style.outline = "none", g.style.zIndex = "999"; } return i.id = "VRButton", i.style.display = "none", l(i), n.isSessionSupported("immersive-vr").then((g) => { g ? r() : o(), g && qt.xrSessionIsGranted && i.click(); }).catch(c), 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 Ve = qt; Ve.registerSessionGrantedListener(); const sh = 0.5, nh = 0.5, ih = 0; var gs = /* @__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))(gs || {}); const no = Object.keys(gs), _h = no.length, zh = { 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 }, rh = [ ["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"] ], ah = [ [8, 10, 8, 6], [8, 19, 14, 8, 6], [8, 19, 14, 8, 6], [8, 19, 14, 8, 6], [8, 19, 14, 8, 6] ], qh = ["t3", "i4", "m4", "r4", "p4"], Hh = ["i4", "m4", "r4", "p4"]; var io = /* @__PURE__ */ ((t) => (t.left = "left", t.right = "right", t))(io || {}); const Pe = Object.keys(io); class Kh { 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 no) { const o = i.hand.get(gs[a]); if (o) { const c = e.getJointPose(o, n); if (c) { const { position: l, orientation: g } = c.transform; this.hands[r][a] = { position: new JA(l.x, l.y, l.z), quaternion: new ls( g.x, g.y, g.z, g.w ), radius: c.radius || 1e-3 }; } } } } for (const i of Pe) 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 JA(), e = new JA(0.01, 0.01, 0.01), s = new ls(0, 0, 0, 1), n = new Is(1, 1, 1), i = Math.PI * 3; new Is(1, 1, 1); let r = 1; const a = new WA({ onFrame: () => { let o = 0; for (const c of Pe) { const l = this.hands[c]; for (const [g, I] of rh.entries()) for (let h = 1; h < I.length; ++h) { const B = ah[g][h - 1] * 2, C = h + 1 === I.length, Q = l == null ? void 0 : l[I[h - 1]], E = l == null ? void 0 : l[I[h]]; for (let f = 0; f < B; ++f) { const p = (f + 0.5) / B; if (r = 0, Q && E) { A.copy(Q.position).lerp(E.position, p), s.copy(Q.quaternion).slerp(E.quaternion, p); const d = se[I[h - 1]], w = se[I[h]]; let D = (1 - p) * d + p * w; C && p > 0.8 && (D *= Math.sqrt(1 - ((p - 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) ), c === "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], c = a == null ? void 0 : a[n]; return !o || !c ? Number.POSITIVE_INFINITY : o.position.distanceTo(c.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 - ih)); } 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 $h { constructor({ xrHands: A, control: e, moveInertia: s, rotateInertia: n }) { this.lastGrip = {}, this.lastPivot = new JA(), this.rotateVelocity = 0, this.velocity = new JA(), this.xrHands = A, this.control = e, this.moveInertia = s ?? sh, this.rotateInertia = n ?? nh; } update(A) { var i, r, a, o, c; const e = {}; for (const l of Pe) { const g = this.xrHands.hands[l]; g && this.xrHands.tests[`${l}MiddleThumb`] && (e[l] = new JA().add(((i = g.t3) == null ? void 0 : i.position) ?? new JA()).add(((r = g.i4) == null ? void 0 : r.position) ?? new JA()).add(((a = g.m4) == null ? void 0 : a.position) ?? new JA()).add(((o = g.r4) == null ? void 0 : o.position) ?? new JA()).add(((c = g.p4) == null ? void 0 : c.position) ?? new JA()).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), g = this.lastGrip.left.clone().add(this.lastGrip.right).multiplyScalar(0.5); this.lastPivot = l; const I = l.clone().applyMatrix4(this.control.matrix); I.sub(g.clone().applyMatrix4(this.control.matrix)), I.multiplyScalar(1 / A), this.velocity.lerp(I, 1 - Math.exp(-20 * A)); const h = Math.atan2(e.left.z - l.z, e.left.x - l.x), B = Math.atan2( this.lastGrip.left.z - g.z, this.lastGrip.left.x - g.x ); let C = h - B; C > Math.PI ? C -= Math.PI * 2 : C < -Math.PI && (C += Math.PI * 2); const Q = C / A, E = Math.exp(-20 * A); this.rotateVelocity = this.rotateVelocity * E + Q * (1 - E); } 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 oh = 1, gh = 2, ch = 2e-3, lh = 6e-3, Ih = 15e-4, uh = 0.15, hh = 0.15, Ch = 0.1, Bh = 2, Qh = 1, Eh = 200, fh = 400, ph = 50, dh = { KeyW: new u.Vector3(0, 0, -1), KeyS: new u.Vector3(0, 0, 1), KeyA: new u.Vector3(-1, 0, 0), KeyD: new u.Vector3(1, 0, 0), KeyR: new u.Vector3(0, 1, 0), KeyF: new u.Vector3(0, -1, 0) }, yh = { ArrowUp: new u.Vector3(0, 0, -1), ArrowDown: new u.Vector3(0, 0, 1), ArrowLeft: new u.Vector3(-1, 0, 0), ArrowRight: new u.Vector3(1, 0, 0), PageUp: new u.Vector3(0, 1, 0), PageDown: new u.Vector3(0, -1, 0) }, wh = { KeyQ: new u.Vector3(0, 0, 1), KeyE: new u.Vector3(0, 0, -1) }, mh = { Home: new u.Vector3(0, -1, 0), End: new u.Vector3(0, 1, 0), Insert: new u.Vector3(-1, 0, 0), Delete: new u.Vector3(1, 0, 0) }; class Vh { constructor({ canvas: A }) { this.lastTime = 0, this.fpsMovement = new xh({}), this.pointerControls = new Sh({ 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 xh { constructor({ moveSpeed: A, rollSpeed: e, stickThreshold: s, rotateSpeed: n, keycodeMoveMapping: i, keycodeRotateMapping: r, gamepadMapping: a, capsMultiplier: o, shiftMultiplier: c, ctrlMultiplier: l, xr: g } = {}) { this.enable = !0, this.moveSpeed = A ?? oh, this.rollSpeed = e ?? gh, this.stickThreshold = s ?? Ch, this.rotateSpeed = n ?? Bh, this.keycodeMoveMapping = i ?? { ...dh, ...yh }, this.keycodeRotateMapping = r ?? { ...wh, ...mh }, this.gamepadMapping = a ?? { 4: "rollLeft", 5: "rollRight", 6: "ctrl", 7: "shift" }, this.capsMultiplier = o ?? 10, this.shiftMultiplier = c ?? 5, this.ctrlMultiplier = l ?? 1 / 5, this.xr = g, this.keydown = {}, this.keycode = {}, document.addEventListener("keydown", (I) => { this.keydown[I.key] = !0, this.keycode[I.code] = !0; }), document.addEventListener("keyup", (I) => { this.keydown[I.key] = !1, this.keycode[I.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, g; if (!this.enable) return; const s = [new u.Vector2(), new u.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((I) => I.pressed)) || [], r = Array.from(((g = (l = this.xr) == null ? void 0 : l.getSession()) == null ? void 0 : g.inputSources) ?? []); for (const I of r) { const h = I.gamepad; if (h) switch (I.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 I of s) I.x = Math.abs(I.x) >= this.stickThreshold ? I.x : 0, I.y = Math.abs(I.y) >= this.stickThreshold ? I.y : 0; const a = new u.Vector3( s[1].x, s[1].y, 0 ).multiplyScalar(this.rotateSpeed); for (const [I, h] of Object.entries(this.keycodeRotateMapping)) this.keycode[I] && a.add(h); for (const I in this.gamepadMapping) if (i[Number.parseInt(I)]) switch (this.gamepadMapping[I]) { case "rollLeft": a.z += 1; break; case "rollRight": a.z -= 1; break; } if (a.multiply( new u.Vector3(this.rotateSpeed, this.rotateSpeed, this.rollSpeed) ), a.manhattanLength() > 0) { a.multiplyScalar(A); const I = new u.Euler().setFromQuaternion( e.quaternion, "YXZ" ); I.y -= a.x, I.x = Math.max( -Math.PI / 2, Math.min(Math.PI / 2, I.x - a.y) ), I.z = Math.max(-Math.PI, Math.min(Math.PI, I.z + a.z)), e.quaternion.setFromEuler(I); } const o = new u.Vector3(s[0].x, 0, s[0].y); for (const [I, h] of Object.entries(this.keycodeMoveMapping)) this.keycode[I] && o.add(h); let c = 1; this.keydown.CapsLock && (c *= this.capsMultiplier), (this.keycode.ShiftLeft || this.keycode.ShiftRight) && (c *= this.shiftMultiplier), (this.keycode.ControlLeft || this.keycode.ControlRight) && (c *= this.ctrlMultiplier); for (const I in this.gamepadMapping) if (i[Number.parseInt(I)]) switch (this.gamepadMapping[I]) { case "shift": c *= this.shiftMultiplier; break; case "ctrl": c *= this.ctrlMultiplier; break; } o.applyQuaternion(e.quaternion), e.position.add( o.multiplyScalar(this.moveSpeed * c * A) ); } } class Sh { 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: c, // Inertia factor for movement (default: DEFAULT_MOVE_INERTIA) moveInertia: l, // Inertia factor for rotation (default: DEFAULT_ROTATE_INERTIA) rotateInertia: g, // Pointer rolling scale factor (default: DEFAULT_POINTER_ROLL_SCALE) pointerRollScale: I, // Callback for double press events (default: () => {}) doublePress: h }) { this.enable = !0, this.canvas = A, this.rotateSpeed = e ?? ch, this.slideSpeed = s ?? lh, this.scrollSpeed = n ?? Ih, this.swapRotateSlide = i ?? !1, this.reverseRotate = r ?? !1, this.reverseSlide = a ?? !1, this.reverseSwipe = o ?? !1, this.reverseScroll = c ?? !1, this.moveInertia = l ?? hh, this.rotateInertia = g ?? uh, this.pointerRollScale = I ?? Qh, this.doublePress = h ?? (() => { }), this.doublePressLimitMs = fh, this.doublePressDistance = ph, this.lastUp = null, this.rotating = null, this.sliding = null, this.dualPress = !1, this.scroll = new u.Vector3(), this.rotateVelocity = new u.Vector3(), this.moveVelocity = new u.Vector3(), A.addEventListener("pointerdown", (C) => { const Q = this.getPointerPosition(C), E = Q.clone(), f = Q.clone(), p = !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 (p) this.rotating = { initial: E, last: f, position: Q, 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: E, last: f, position: Q, pointerId: d, button: D, timeStamp: w }, A.setPointerCapture(C.pointerId), this.dualPress = this.rotating != null && w - this.rotating.timeStamp < Eh; } }); const B = (C) => { var f, p; ((f = this.rotating) == null ? void 0 : f.pointerId) === C.pointerId ? (this.rotating = null, A.releasePointerCapture(C.pointerId), this.dualPress && this.sliding && (A.releasePointerCapture(this.sliding.pointerId), this.sliding = null)) : ((p = this.sliding) == null ? void 0 : p.pointerId) === C.pointerId && (this.sliding = null, A.releasePointerCapture(C.pointerId), this.dualPress && this.rotating && (A.releasePointerCapture(this.rotating.pointerId), this.rotating = null)); const Q = this.getPointerPosition(C), E = this.lastUp; if (this.lastUp = { position: Q, time: C.timeStamp }, E && E.position.distanceTo(Q) < this.doublePressDistance) { const w = C.timeStamp - E.time; w < this.doublePressLimitMs && (this.lastUp = null, this.doublePress({ position: Q, intervalMs: w })); } }; document.addEventListener("pointerup", B), document.addEventListener("pointercancel", B), document.addEventListener("pointermove", (C) => { var Q, E; ((Q = this.rotating) == null ? void 0 : Q.pointerId) === C.pointerId ? this.rotating.position = this.getPointerPosition(C) : ((E = this.sliding) == null ? void 0 : E.pointerId) === C.pointerId && (this.sliding.position = this.getPointerPosition(C)); }), A.addEventListener("contextmenu", (C) => { C.preventDefault(); }), A.addEventListener("wheel", (C) => { this.scroll.add( new u.Vector3(C.deltaX, C.deltaY, C.deltaZ) ), C.preventDefault(); }); } getPointerPosition(A) { const e = this.canvas.getBoundingClientRect(); return new u.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 u.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 u.Vector2(-r.y, r.x), c = [n[0].dot(r), n[1].dot(r)], l = [n[0].dot(o), n[1].dot(o)], g = this.rotating.last.clone().add(this.sliding.last).multiplyScalar(0.5); let I = new u.Vector3(); if (e instanceof u.Camera) { const f = new u.Vector2( g.x / this.canvas.clientWidth * 2 - 1, -(g.y / this.canvas.clientHeight) * 2 + 1 ), p = new u.Raycaster(); p.setFromCamera(f, e), I = p.ray.direction; } const h = c[1] - c[0], B = I.multiplyScalar(h * this.slideSpeed); e.position.add(B), this.moveVelocity = B.clone().multiplyScalar(1 / A); const C = [ Math.atan(l[0] / (-0.5 * a)), Math.atan(l[1] / (0.5 * a)) ], Q = 0.5 * (C[0] + C[1]) * this.pointerRollScale, E = new u.Euler().setFromQuaternion( e.quaternion, "YXZ" ); E.z = Math.max( -Math.PI, Math.min(Math.PI, E.z + 0.5 * Q) ), e.quaternion.setFromEuler(E); } this.rotating.last.copy(this.rotating.position), this.sliding.last.copy(this.sliding.position); } else { const n = new u.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 u.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 u.Vector3(r.x, 0, r.y) : new u.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 { Hh as FINGER_TIPS, xh as FpsMovement, Pe as HANDS, io as Hand, $h as HandMovement, no as JOINT_IDS, zh as JOINT_INDEX, se as JOINT_RADIUS, rh as JOINT_SEGMENTS, ah as JOINT_SEGMENT_STEPS, qh as JOINT_TIPS, gs as JointEnum, UA as LN_SCALE_MAX, TA as LN_SCALE_MIN, _h as NUM_JOINTS, KA as PackedSplats, Ie as PlyReader, Sh as PointerControls, ce as Readback, Zg as Sint8ToFloat, Vh as SparkControls, Ce as SparkRenderer, he as SparkViewpoint, ke as SplatAccumulator, le as SplatEdit, gu as SplatEditRgbaBlendMode, lu as SplatEditSdf, au as SplatEditSdfType, Iu as SplatEdits, Jt as SplatFileType, Kt as SplatGenerator, Du as SplatLoader, WA as SplatMesh, hu as SplatModifier, Nh as SplatSkinning, xt as SplatTransformer, Ku as SpzReader, et as SpzWriter, jg as Uint8ToFloat, Ve as VRButton, Kh as XrHands, Uh as constructAxes, Th as constructGrid, Gh as constructSpherePoints, Mh as defines, bh as dyno, fc as flipPixels, ne as floatToSint8, bA as floatToUint8, wA as fromHalf, Jh as generators, Va as getSplatFileType, Yh as imageSplats, Qc as isAndroid, Bc as isMobile, Ec as isOculus, Fh as isPcSogs, Lh as modifiers, pc as pixelsToPngUrl, Re as setPackedSplat, Rh as textSplats, Ct as toHalf, kh as transcodeSpz, Ye as unpackSplat, Xa as unpackSplats, vh as utils }; //# sourceMappingURL=spark.module.min.js.map