Files
spark/dist/spark.module.min.js
T
Diego Marcos Segura 73add78912 Bump builds
2025-07-31 16:16:49 -07:00

10783 lines
502 KiB
JavaScript

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/fwBgAn19AX0C8gQRA3diZx1fX3diZ19idWZmZXJfNjA5Y2MzZWVlNTFlZDE1OAAJA3diZxpfX3diZ19uZXdfOWZlZTk3YTQwOWIzMmI2OAAJA3diZxpfX3diZ19zZXRfZjRmMWYwZGFhMzA2OTZmYwAKA3diZx1fX3diZ19sZW5ndGhfOGNmZDJjNjQwOWFmODhhZAALA3diZzFfX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9mMWRlYWQ0NGQxZmM3MjEyAAcDd2JnGl9fd2JnX25ld19lM2IzMjFkY2ZlZjg5ZmM3AAkDd2JnGl9fd2JnX3NldF9kMjM2NjFkMTkxNDhiMjI5AAoDd2JnHV9fd2JnX2xlbmd0aF82Y2E1Mjc2NjVkODk2OTRkAAsDd2JnMV9fd2JnX25ld3dpdGhieXRlb2Zmc2V0YW5kbGVuZ3RoX2U2YjdlNjlhY2Q0YzczNTQABwN3YmcaX193Ymdfc2V0XzEwYmFkOWJlZTBlOWM1OGIACgN3YmcdX193YmdfbGVuZ3RoXzNiNGYwMjIxODhhZThkYjYACwN3YmcfX193Ymdfc3ViYXJyYXlfNzY5ZTFlMGY4MWJiMjU5YgAHA3diZx9fX3diZ19zdWJhcnJheV8zYWFlZWM4OWJiMjU0NGYwAAcDd2JnJF9fd2JnX25ld3dpdGhsZW5ndGhfNWE1ZWZlMzEzY2ZkNTlmMQARA3diZxBfX3diaW5kZ2VuX3Rocm93AAEDd2JnEV9fd2JpbmRnZW5fbWVtb3J5ABIDd2JnH19fd2JpbmRnZW5faW5pdF9leHRlcm5yZWZfdGFibGUADgNhYAMAAQIIBQQCEwEMAAEBAgAAAQwBBAYFBQQAAQYFFAENBAAGBQQEAQQOAgECAQAIBAAVARYGCBcZGwUNAhAQBR0FAQMPAAIDAwMADAAAAQEBAAAABAECAAEAAQAAAQEDAwQJAnABLi5vAIABBQMBABEGCQF/AUGAgMAACwdiBgZtZW1vcnkCAAtzb3J0X3NwbGF0cwBNDXNvcnQzMl9zcGxhdHMATg5yYXljYXN0X3NwbGF0cwBCE19fd2JpbmRnZW5fZXhwb3J0XzABARBfX3diaW5kZ2VuX3N0YXJ0ABAJMwEAQQELLVhZV1xBZ0YuRUZETEtFRUhHST5RN086IWlfXmE7YGpKMiQrbk88IGtsVVpiYwrF3wFghCQCCX8BfiMAQRBrIggkAAJ/AkACQAJAAkACQAJAIABB9QFPBEBBACAAQc3/e08NBxogAEELaiIBQXhxIQVB7JbAACgCACIJRQ0EQR8hB0EAIAVrIQQgAEH0//8HTQRAIAVBBiABQQh2ZyIAa3ZBAXEgAEEBdGtBPmohBwsgB0ECdEHQk8AAaigCACIBRQRAQQAhAAwCC0EAIQAgBUEZIAdBAXZrQQAgB0EfRxt0IQMDQAJAIAEoAgRBeHEiBiAFSQ0AIAYgBWsiBiAETw0AIAEhAiAGIgQNAEEAIQQgASEADAQLIAEoAhQiBiAAIAYgASADQR12QQRxakEQaigCACIBRxsgACAGGyEAIANBAXQhAyABDQALDAELQeiWwAAoAgAiAkEQIABBC2pB+ANxIABBC0kbIgVBA3YiAHYiAUEDcQRAAkAgAUF/c0EBcSAAaiIGQQN0IgBB4JTAAGoiAyAAQeiUwABqKAIAIgEoAggiBEcEQCAEIAM2AgwgAyAENgIIDAELQeiWwAAgAkF+IAZ3cTYCAAsgASAAQQNyNgIEIAAgAWoiACAAKAIEQQFyNgIEIAFBCGoMBwsgBUHwlsAAKAIATQ0DAkACQCABRQRAQeyWwAAoAgAiAEUNBiAAaEECdEHQk8AAaigCACICKAIEQXhxIAVrIQQgAiEBA0ACQCACKAIQIgANACACKAIUIgANACABKAIYIQcCQAJAIAEgASgCDCIARgRAIAFBFEEQIAEoAhQiABtqKAIAIgINAUEAIQAMAgsgASgCCCICIAA2AgwgACACNgIIDAELIAFBFGogAUEQaiAAGyEDA0AgAyEGIAIiAEEUaiAAQRBqIAAoAhQiAhshAyAAQRRBECACG2ooAgAiAg0ACyAGQQA2AgALIAdFDQQgASABKAIcQQJ0QdCTwABqIgIoAgBHBEAgB0EQQRQgBygCECABRhtqIAA2AgAgAEUNBQwECyACIAA2AgAgAA0DQeyWwABB7JbAACgCAEF+IAEoAhx3cTYCAAwECyAAKAIEQXhxIAVrIgIgBCACIARJIgIbIQQgACABIAIbIQEgACECDAALAAsCQEECIAB0IgNBACADa3IgASAAdHFoIgZBA3QiAUHglMAAaiIDIAFB6JTAAGooAgAiACgCCCIERwRAIAQgAzYCDCADIAQ2AggMAQtB6JbAACACQX4gBndxNgIACyAAIAVBA3I2AgQgACAFaiIGIAEgBWsiA0EBcjYCBCAAIAFqIAM2AgBB8JbAACgCACIEBEAgBEF4cUHglMAAaiEBQfiWwAAoAgAhAgJ/QeiWwAAoAgAiBUEBIARBA3Z0IgRxRQRAQeiWwAAgBCAFcjYCACABDAELIAEoAggLIQQgASACNgIIIAQgAjYCDCACIAE2AgwgAiAENgIIC0H4lsAAIAY2AgBB8JbAACADNgIAIABBCGoMCAsgACAHNgIYIAEoAhAiAgRAIAAgAjYCECACIAA2AhgLIAEoAhQiAkUNACAAIAI2AhQgAiAANgIYCwJAAkAgBEEQTwRAIAEgBUEDcjYCBCABIAVqIgMgBEEBcjYCBCADIARqIAQ2AgBB8JbAACgCACIGRQ0BIAZBeHFB4JTAAGohAEH4lsAAKAIAIQICf0HolsAAKAIAIgVBASAGQQN2dCIGcUUEQEHolsAAIAUgBnI2AgAgAAwBCyAAKAIICyEGIAAgAjYCCCAGIAI2AgwgAiAANgIMIAIgBjYCCAwBCyABIAQgBWoiAEEDcjYCBCAAIAFqIgAgACgCBEEBcjYCBAwBC0H4lsAAIAM2AgBB8JbAACAENgIACyABQQhqDAYLIAAgAnJFBEBBACECQQIgB3QiAEEAIABrciAJcSIARQ0DIABoQQJ0QdCTwABqKAIAIQALIABFDQELA0AgACACIAAoAgRBeHEiAyAFayIGIARJIgcbIQkgACgCECIBRQRAIAAoAhQhAQsgAiAJIAMgBUkiABshAiAEIAYgBCAHGyAAGyEEIAEiAA0ACwsgAkUNACAFQfCWwAAoAgAiAE0gBCAAIAVrT3ENACACKAIYIQcCQAJAIAIgAigCDCIARgRAIAJBFEEQIAIoAhQiABtqKAIAIgENAUEAIQAMAgsgAigCCCIBIAA2AgwgACABNgIIDAELIAJBFGogAkEQaiAAGyEDA0AgAyEGIAEiAEEUaiAAQRBqIAAoAhQiARshAyAAQRRBECABG2ooAgAiAQ0ACyAGQQA2AgALIAdFDQIgAiACKAIcQQJ0QdCTwABqIgEoAgBHBEAgB0EQQRQgBygCECACRhtqIAA2AgAgAEUNAwwCCyABIAA2AgAgAA0BQeyWwABB7JbAACgCAEF+IAIoAhx3cTYCAAwCCwJAAkACQAJAAkAgBUHwlsAAKAIAIgFLBEAgBUH0lsAAKAIAIgBPBEAgBUGvgARqQYCAfHEiAkEQdkAAIQAgCEEEaiIBQQA2AgggAUEAIAJBgIB8cSAAQX9GIgIbNgIEIAFBACAAQRB0IAIbNgIAQQAgCCgCBCIBRQ0JGiAIKAIMIQZBgJfAACAIKAIIIgRBgJfAACgCAGoiADYCAEGEl8AAQYSXwAAoAgAiAiAAIAAgAkkbNgIAAkACQEH8lsAAKAIAIgIEQEHQlMAAIQADQCABIAAoAgAiAyAAKAIEIgdqRg0CIAAoAggiAA0ACwwCC0GMl8AAKAIAIgBBACAAIAFNG0UEQEGMl8AAIAE2AgALQZCXwABB/x82AgBB3JTAACAGNgIAQdSUwAAgBDYCAEHQlMAAIAE2AgBB7JTAAEHglMAANgIAQfSUwABB6JTAADYCAEHolMAAQeCUwAA2AgBB/JTAAEHwlMAANgIAQfCUwABB6JTAADYCAEGElcAAQfiUwAA2AgBB+JTAAEHwlMAANgIAQYyVwABBgJXAADYCAEGAlcAAQfiUwAA2AgBBlJXAAEGIlcAANgIAQYiVwABBgJXAADYCAEGclcAAQZCVwAA2AgBBkJXAAEGIlcAANgIAQaSVwABBmJXAADYCAEGYlcAAQZCVwAA2AgBBrJXAAEGglcAANgIAQaCVwABBmJXAADYCAEGolcAAQaCVwAA2AgBBtJXAAEGolcAANgIAQbCVwABBqJXAADYCAEG8lcAAQbCVwAA2AgBBuJXAAEGwlcAANgIAQcSVwABBuJXAADYCAEHAlcAAQbiVwAA2AgBBzJXAAEHAlcAANgIAQciVwABBwJXAADYCAEHUlcAAQciVwAA2AgBB0JXAAEHIlcAANgIAQdyVwABB0JXAADYCAEHYlcAAQdCVwAA2AgBB5JXAAEHYlcAANgIAQeCVwABB2JXAADYCAEHslcAAQeCVwAA2AgBB9JXAAEHolcAANgIAQeiVwABB4JXAADYCAEH8lcAAQfCVwAA2AgBB8JXAAEHolcAANgIAQYSWwABB+JXAADYCAEH4lcAAQfCVwAA2AgBBjJbAAEGAlsAANgIAQYCWwABB+JXAADYCAEGUlsAAQYiWwAA2AgBBiJbAAEGAlsAANgIAQZyWwABBkJbAADYCAEGQlsAAQYiWwAA2AgBBpJbAAEGYlsAANgIAQZiWwABBkJbAADYCAEGslsAAQaCWwAA2AgBBoJbAAEGYlsAANgIAQbSWwABBqJbAADYCAEGolsAAQaCWwAA2AgBBvJbAAEGwlsAANgIAQbCWwABBqJbAADYCAEHElsAAQbiWwAA2AgBBuJbAAEGwlsAANgIAQcyWwABBwJbAADYCAEHAlsAAQbiWwAA2AgBB1JbAAEHIlsAANgIAQciWwABBwJbAADYCAEHclsAAQdCWwAA2AgBB0JbAAEHIlsAANgIAQeSWwABB2JbAADYCAEHYlsAAQdCWwAA2AgBB/JbAACABQQ9qQXhxIgBBCGsiAjYCAEHglsAAQdiWwAA2AgBB9JbAACAEQShrIgMgASAAa2pBCGoiADYCACACIABBAXI2AgQgASADakEoNgIEQYiXwABBgICAATYCAAwICyACIANJIAEgAk1yDQAgACgCDCIDQQFxDQAgA0EBdiAGRg0DC0GMl8AAQYyXwAAoAgAiACABIAAgAUkbNgIAIAEgBGohA0HQlMAAIQACQAJAA0AgAyAAKAIAIgdHBEAgACgCCCIADQEMAgsLIAAoAgwiA0EBcQ0AIANBAXYgBkYNAQtB0JTAACEAA0ACQCACIAAoAgAiA08EQCACIAMgACgCBGoiB0kNAQsgACgCCCEADAELC0H8lsAAIAFBD2pBeHEiAEEIayIDNgIAQfSWwAAgBEEoayIJIAEgAGtqQQhqIgA2AgAgAyAAQQFyNgIEIAEgCWpBKDYCBEGIl8AAQYCAgAE2AgAgAiAHQSBrQXhxQQhrIgAgACACQRBqSRsiA0EbNgIEQdCUwAApAgAhCiADQRBqQdiUwAApAgA3AgAgAyAKNwIIQdyUwAAgBjYCAEHUlMAAIAQ2AgBB0JTAACABNgIAQdiUwAAgA0EIajYCACADQRxqIQADQCAAQQc2AgAgAEEEaiIAIAdJDQALIAIgA0YNByADIAMoAgRBfnE2AgQgAiADIAJrIgBBAXI2AgQgAyAANgIAIABBgAJPBEAgAiAAECIMCAsgAEH4AXFB4JTAAGohAQJ/QeiWwAAoAgAiA0EBIABBA3Z0IgBxRQRAQeiWwAAgACADcjYCACABDAELIAEoAggLIQAgASACNgIIIAAgAjYCDCACIAE2AgwgAiAANgIIDAcLIAAgATYCACAAIAAoAgQgBGo2AgQgAUEPakF4cUEIayICIAVBA3I2AgQgB0EPakF4cUEIayIEIAIgBWoiAGshBSAEQfyWwAAoAgBGDQMgBEH4lsAAKAIARg0EIAQoAgQiAUEDcUEBRgRAIAQgAUF4cSIBEB4gASAFaiEFIAEgBGoiBCgCBCEBCyAEIAFBfnE2AgQgACAFQQFyNgIEIAAgBWogBTYCACAFQYACTwRAIAAgBRAiDAYLIAVB+AFxQeCUwABqIQECf0HolsAAKAIAIgNBASAFQQN2dCIEcUUEQEHolsAAIAMgBHI2AgAgAQwBCyABKAIICyEDIAEgADYCCCADIAA2AgwgACABNgIMIAAgAzYCCAwFC0H0lsAAIAAgBWsiATYCAEH8lsAAQfyWwAAoAgAiACAFaiICNgIAIAIgAUEBcjYCBCAAIAVBA3I2AgQgAEEIagwIC0H4lsAAKAIAIQACQCABIAVrIgJBD00EQEH4lsAAQQA2AgBB8JbAAEEANgIAIAAgAUEDcjYCBCAAIAFqIgEgASgCBEEBcjYCBAwBC0HwlsAAIAI2AgBB+JbAACAAIAVqIgM2AgAgAyACQQFyNgIEIAAgAWogAjYCACAAIAVBA3I2AgQLIABBCGoMBwsgACAEIAdqNgIEQfyWwABB/JbAACgCACIAQQ9qQXhxIgFBCGsiAjYCAEH0lsAAQfSWwAAoAgAgBGoiAyAAIAFrakEIaiIBNgIAIAIgAUEBcjYCBCAAIANqQSg2AgRBiJfAAEGAgIABNgIADAMLQfyWwAAgADYCAEH0lsAAQfSWwAAoAgAgBWoiATYCACAAIAFBAXI2AgQMAQtB+JbAACAANgIAQfCWwABB8JbAACgCACAFaiIBNgIAIAAgAUEBcjYCBCAAIAFqIAE2AgALIAJBCGoMAwtBAEH0lsAAKAIAIgAgBU0NAhpB9JbAACAAIAVrIgE2AgBB/JbAAEH8lsAAKAIAIgAgBWoiAjYCACACIAFBAXI2AgQgACAFQQNyNgIEIABBCGoMAgsgACAHNgIYIAIoAhAiAQRAIAAgATYCECABIAA2AhgLIAIoAhQiAUUNACAAIAE2AhQgASAANgIYCwJAIARBEE8EQCACIAVBA3I2AgQgAiAFaiIAIARBAXI2AgQgACAEaiAENgIAIARBgAJPBEAgACAEECIMAgsgBEH4AXFB4JTAAGohAQJ/QeiWwAAoAgAiA0EBIARBA3Z0IgRxRQRAQeiWwAAgAyAEcjYCACABDAELIAEoAggLIQMgASAANgIIIAMgADYCDCAAIAE2AgwgACADNgIIDAELIAIgBCAFaiIAQQNyNgIEIAAgAmoiACAAKAIEQQFyNgIECyACQQhqCyAIQRBqJAALxgYBCH8CQAJAIAEgAEEDakF8cSICIABrIghJDQAgASAIayIGQQRJDQAgBkEDcSEHQQAhAQJAIAAgAkYiCQ0AAkAgACACayIEQXxLBEBBACECDAELQQAhAgNAIAEgACACaiIDLAAAQb9/SmogA0EBaiwAAEG/f0pqIANBAmosAABBv39KaiADQQNqLAAAQb9/SmohASACQQRqIgINAAsLIAkNACAAIAJqIQMDQCABIAMsAABBv39KaiEBIANBAWohAyAEQQFqIgQNAAsLIAAgCGohAgJAIAdFDQAgAiAGQXxxaiIALAAAQb9/SiEFIAdBAUYNACAFIAAsAAFBv39KaiEFIAdBAkYNACAFIAAsAAJBv39KaiEFCyAGQQJ2IQYgASAFaiEEA0AgAiEAIAZFDQJBwAEgBiAGQcABTxsiBUEDcSEHIAVBAnQhCEEAIQMgBkEETwRAIAAgCEHwB3FqIQkgACEBA0AgASgCACICQX9zQQd2IAJBBnZyQYGChAhxIANqIAEoAgQiAkF/c0EHdiACQQZ2ckGBgoQIcWogASgCCCICQX9zQQd2IAJBBnZyQYGChAhxaiABKAIMIgJBf3NBB3YgAkEGdnJBgYKECHFqIQMgAUEQaiIBIAlHDQALCyAGIAVrIQYgACAIaiECIANBCHZB/4H8B3EgA0H/gfwHcWpBgYAEbEEQdiAEaiEEIAdFDQALAn8gACAFQfwBcUECdGoiACgCACIBQX9zQQd2IAFBBnZyQYGChAhxIgEgB0EBRg0AGiABIAAoAgQiAUF/c0EHdiABQQZ2ckGBgoQIcWoiASAHQQJGDQAaIAAoAggiAEF/c0EHdiAAQQZ2ckGBgoQIcSABagsiAUEIdkH/gRxxIAFB/4H8B3FqQYGABGxBEHYgBGoPCyABRQRAQQAPCyABQQNxIQICQCABQQRJBEAMAQsgAUF8cSEFA0AgBCAAIANqIgEsAABBv39KaiABQQFqLAAAQb9/SmogAUECaiwAAEG/f0pqIAFBA2osAABBv39KaiEEIAUgA0EEaiIDRw0ACwsgAkUNACAAIANqIQEDQCAEIAEsAABBv39KaiEEIAFBAWohASACQQFrIgINAAsLIAQL3QUBBX8gACgCCCIDIAFJBEAgASADIgJrIgQgACgCACACa0sEQCAAIAIgBEEEQQQQJiAAKAIIIQILIAAoAgQiBiACQQJ0aiEFIARBAk8EQCAFIANBf3MgAWpBAnQQKhogASACakECdCADQQJ0ayAGakEEayEFIAIgBGpBAWshAgsgBUEANgIAIAAgAkEBajYCCAsgACgCFCIDIAFJBEAgASADIgJrIgQgACgCDCACa0sEQCAAQQxqIAIgBEEEQQQQJiAAKAIUIQILIAAoAhAiBiACQQJ0aiEFIARBAk8EQCAFIANBf3MgAWpBAnQQKhogASACakECdCADQQJ0ayAGakEEayEFIAIgBGpBAWshAgsgBUEANgIAIAAgAkEBajYCFAsgACgCOCIDIAFJBEAgASADIgJrIgQgACgCMCACa0sEQCAAQTBqIAIgBEEEQQQQJiAAKAI4IQILIAAoAjQiBiACQQJ0aiEFIARBAk8EQCAFIANBf3MgAWpBAnQQKhogASACakECdCADQQJ0ayAGakEEayEFIAIgBGpBAWshAgsgBUEANgIAIAAgAkEBajYCOAsgACgCICIDQf//A00EQCADIQFBgIAEIANrIgIgACgCGCADa0sEQCAAQRhqIAMgAkEEQQQQJiAAKAIgIQELIAAoAhwiBSABQQJ0IgRqIQIgA0H//wNHBEAgAkH8/w8gA0ECdCICaxAqGiAEIAJrIAVqQfz/D2ohAiABIANrQf//A2ohAQsgAkEANgIAIAAgAUEBajYCIAsgACgCLCIDQf//A00EQCADIQFBgIAEIANrIgIgACgCJCADa0sEQCAAQSRqIAMgAkEEQQQQJiAAKAIsIQELIAAoAigiBSABQQJ0IgRqIQIgA0H//wNHBEAgAkH8/w8gA0ECdCICaxAqGiAEIAJrIAVqQfz/D2ohAiABIANrQf//A2ohAQsgAkEANgIAIAAgAUEBajYCLAsLqQUBB38CQCAAKAIIQQFxRSIEIAAoAgAiCUVxRQRAAkAgBA0AIAEgAmohBwJAIAAoAgwiBkUEQCABIQQMAQsgASEEA0AgBCIDIAdGDQICfyADQQFqIAMsAAAiCEEATg0AGiADQQJqIAhBYEkNABogA0EDaiAIQXBJDQAaIANBBGoLIgQgA2sgBWohBSAGQQFrIgYNAAsLIAQgB0YNACAELAAAGiAFIAICfwJAIAVFDQAgAiAFSwRAIAEgBWosAABBv39KDQFBAAwCCyACIAVGDQBBAAwBCyABCyIDGyECIAMgASADGyEBCyAJRQ0BIAAoAgQhBwJAIAJBEE8EQCABIAIQEiEDDAELIAJFBEBBACEDDAELIAJBA3EhBgJAIAJBBEkEQEEAIQNBACEFDAELIAJBDHEhCEEAIQNBACEFA0AgAyABIAVqIgQsAABBv39KaiAEQQFqLAAAQb9/SmogBEECaiwAAEG/f0pqIARBA2osAABBv39KaiEDIAggBUEEaiIFRw0ACwsgBkUNACABIAVqIQQDQCADIAQsAABBv39KaiEDIARBAWohBCAGQQFrIgYNAAsLAkAgAyAHSQRAIAcgA2shBEEAIQMCQAJAAkAgAC0AIEEBaw4CAAECCyAEIQNBACEEDAELIARBAXYhAyAEQQFqQQF2IQQLIANBAWohAyAAKAIQIQYgACgCGCEFIAAoAhQhAANAIANBAWsiA0UNAiAAIAYgBSgCEBEAAEUNAAtBAQ8LDAILIAAgASACIAUoAgwRAgAEQEEBDwtBACEDA0AgAyAERgRAQQAPCyADQQFqIQMgACAGIAUoAhARAABFDQALIANBAWsgBEkPCyAAKAIUIAEgAiAAKAIYKAIMEQIADwsgACgCFCABIAIgACgCGCgCDBECAAu/BQEIf0ErQYCAxAAgACgCHCIIQQFxIgYbIQwgBCAGaiEGAkAgCEEEcUUEQEEAIQEMAQsCQCACQRBPBEAgASACEBIhBQwBCyACRQRADAELIAJBA3EhCQJAIAJBBEkEQAwBCyACQQxxIQoDQCAFIAEgB2oiCywAAEG/f0pqIAtBAWosAABBv39KaiALQQJqLAAAQb9/SmogC0EDaiwAAEG/f0pqIQUgCiAHQQRqIgdHDQALCyAJRQ0AIAEgB2ohBwNAIAUgBywAAEG/f0pqIQUgB0EBaiEHIAlBAWsiCQ0ACwsgBSAGaiEGCyAAKAIARQRAIAAoAhQiBiAAKAIYIgAgDCABIAIQPwRAQQEPCyAGIAMgBCAAKAIMEQIADwsCQAJAAkAgBiAAKAIEIgdPBEAgACgCFCIGIAAoAhgiACAMIAEgAhA/RQ0BQQEPCyAIQQhxRQ0BIAAoAhAhCCAAQTA2AhAgAC0AICEKQQEhBSAAQQE6ACAgACgCFCIJIAAoAhgiCyAMIAEgAhA/DQIgByAGa0EBaiEFAkADQCAFQQFrIgVFDQEgCUEwIAsoAhARAABFDQALQQEPCyAJIAMgBCALKAIMEQIABEBBAQ8LIAAgCjoAICAAIAg2AhBBAA8LIAYgAyAEIAAoAgwRAgAhBQwBCyAHIAZrIQYCQAJAAkAgAC0AICIFQQFrDgMAAQACCyAGIQVBACEGDAELIAZBAXYhBSAGQQFqQQF2IQYLIAVBAWohBSAAKAIQIQogACgCGCEIIAAoAhQhAAJAA0AgBUEBayIFRQ0BIAAgCiAIKAIQEQAARQ0AC0EBDwtBASEFIAAgCCAMIAEgAhA/DQAgACADIAQgCCgCDBECAA0AQQAhBQNAIAUgBkYEQEEADwsgBUEBaiEFIAAgCiAIKAIQEQAARQ0ACyAFQQFrIAZJDwsgBQv+BQEFfyAAQQhrIgEgAEEEaygCACIDQXhxIgBqIQICQAJAIANBAXENACADQQJxRQ0BIAEoAgAiAyAAaiEAIAEgA2siAUH4lsAAKAIARgRAIAIoAgRBA3FBA0cNAUHwlsAAIAA2AgAgAiACKAIEQX5xNgIEIAEgAEEBcjYCBCACIAA2AgAPCyABIAMQHgsCQAJAAkACQAJAIAIoAgQiA0ECcUUEQCACQfyWwAAoAgBGDQIgAkH4lsAAKAIARg0DIAIgA0F4cSICEB4gASAAIAJqIgBBAXI2AgQgACABaiAANgIAIAFB+JbAACgCAEcNAUHwlsAAIAA2AgAPCyACIANBfnE2AgQgASAAQQFyNgIEIAAgAWogADYCAAsgAEGAAkkNAiABIAAQIkEAIQFBkJfAAEGQl8AAKAIAQQFrIgA2AgAgAA0EQdiUwAAoAgAiAARAA0AgAUEBaiEBIAAoAggiAA0ACwtBkJfAAEH/HyABIAFB/x9NGzYCAA8LQfyWwAAgATYCAEH0lsAAQfSWwAAoAgAgAGoiADYCACABIABBAXI2AgRB+JbAACgCACABRgRAQfCWwABBADYCAEH4lsAAQQA2AgALIABBiJfAACgCACIDTQ0DQfyWwAAoAgAiAkUNA0EAIQBB9JbAACgCACIEQSlJDQJB0JTAACEBA0AgAiABKAIAIgVPBEAgAiAFIAEoAgRqSQ0ECyABKAIIIQEMAAsAC0H4lsAAIAE2AgBB8JbAAEHwlsAAKAIAIABqIgA2AgAgASAAQQFyNgIEIAAgAWogADYCAA8LIABB+AFxQeCUwABqIQICf0HolsAAKAIAIgNBASAAQQN2dCIAcUUEQEHolsAAIAAgA3I2AgAgAgwBCyACKAIICyEAIAIgATYCCCAAIAE2AgwgASACNgIMIAEgADYCCA8LQdiUwAAoAgAiAQRAA0AgAEEBaiEAIAEoAggiAQ0ACwtBkJfAAEH/HyAAIABB/x9NGzYCACADIARPDQBBiJfAAEF/NgIACwvpBAEFfwJ/AkAgAkECTwRAIAEoAgQiBEH//wFxRQRAIARBEHQMAwsgBEH/B3EhBSAEQYCAAnEhAyAEQYD4AXEiBkGA+AFGBEAgA0EQdCEDIANBgICA/AdyIAVFDQMaIAMgBUENdHJBgICA/gdyDAMLIANBEHQhAyAGRQ0BIAZBDXRBgICA/ABxIAVBDXRyQYCAgMADaiADcgwCC0EBQQFB9IHAABA1AAsgBSAFZ0EQayIFQf//A3FBCGp0Qf///wNxIANBgICA2ANyIAVBF3RrcgshBQJ/IARBgIB8cSAEQRB2IgNB//8BcUUNABogA0H/B3EhBCADQYCAAnEhBiADQYD4AXEiB0GA+AFGBEAgBkEQdCEGIAZBgICA/AdyIARFDQEaIAYgA0ENdHJBgICA/gdyDAELIAZBEHQhAyAHQQ10QYCAgPwAcSAEQQ10ckGAgIDAA2ogA3IgBw0AGiAEIARnQRBrIgRB//8DcUEIanRB////A3EgA0GAgIDYA3IgBEEXdGtyCyEEIAACfwJAIAJBAkcEQCABKAIIIgJB//8BcUUEQCACQRB0DAMLIAJB/wdxIQEgAkGAgAJxIQMgAkGA+AFxIgJBgPgBRgRAIANBEHQhAiACQYCAgPwHciABRQ0DGiACIAFBDXRyQYCAgP4HcgwDCyADQRB0IQMgAkUNASACQQ10QYCAgPwAcSABQQ10ckGAgIDAA2ogA3IMAgtBAkECQYSCwAAQNQALIAEgAWdBEGsiAUH//wNxQQhqdEH///8DcSADQYCAgNgDciABQRd0a3ILNgIIIAAgBDYCBCAAIAU2AgAL6wQBCn8jAEEwayIDJAAgA0EDOgAsIANBIDYCHCADQQA2AiggAyABNgIkIAMgADYCICADQQA2AhQgA0EANgIMAn8CQAJAAkAgAigCECIKRQRAIAIoAgwiAEUNASACKAIIIgEgAEEDdGohBCAAQQFrQf////8BcUEBaiEHIAIoAgAhAANAIABBBGooAgAiBQRAIAMoAiAgACgCACAFIAMoAiQoAgwRAgANBAsgASgCACADQQxqIAEoAgQRAAANAyAAQQhqIQAgAUEIaiIBIARHDQALDAELIAIoAhQiAEUNACAAQQV0IQsgAEEBa0H///8/cUEBaiEHIAIoAgghBSACKAIAIQADQCAAQQRqKAIAIgEEQCADKAIgIAAoAgAgASADKAIkKAIMEQIADQMLIAMgCCAKaiIBQRBqKAIANgIcIAMgAUEcai0AADoALCADIAFBGGooAgA2AiggAUEMaigCACEEQQAhCUEAIQYCQAJAAkAgAUEIaigCAEEBaw4CAAIBCyAEQQN0IAVqIgwoAgANASAMKAIEIQQLQQEhBgsgAyAENgIQIAMgBjYCDCABQQRqKAIAIQQCQAJAAkAgASgCAEEBaw4CAAIBCyAEQQN0IAVqIgYoAgANASAGKAIEIQQLQQEhCQsgAyAENgIYIAMgCTYCFCAFIAFBFGooAgBBA3RqIgEoAgAgA0EMaiABKAIEEQAADQIgAEEIaiEAIAsgCEEgaiIIRw0ACwsgByACKAIETw0BIAMoAiAgAigCACAHQQN0aiIAKAIAIAAoAgQgAygCJCgCDBECAEUNAQtBAQwBC0EACyADQTBqJAALsgQCAn0EfyMAQRBrIQQgALwiBUEfdiEGAkACfSAAAn8CQAJAAkACQCAFQf////8HcSIDQdDYupUETwRAIANBgICA/AdLBEAgAA8LIAVBAEgiBUUgA0GX5MWVBEtxDQIgBUUNASAEQwAAgIAgAJU4AgggBCoCCBogA0G047+WBE0NAQwHCyADQZjkxfUDTQRAIANBgICAyANNDQNBACEDIAAMBgsgA0GSq5T8A00NAwsgAEM7qrg/lCAGQQJ0QYiSwABqKgIAkiIBQwAAAM9gIQRB/////wcCfyABi0MAAABPXQRAIAGoDAELQYCAgIB4C0GAgICAeCAEGyABQ////05eG0EAIAEgAVsbDAMLIABDAAAAf5QPCyAEIABDAAAAf5I4AgwgBCoCDBogAEMAAIA/kg8LIAZFIAZrCyIDsiIBQwByMb+UkiIAIAFDjr6/NZQiApMLIQEgACABIAEgASABlCIAIABDFVI1u5RDj6oqPpKUkyIAlEMAAABAIACTlSACk5JDAACAP5IhASADRQ0AAkACQAJAIANB/wBMBEAgA0GCf04NAyABQwAAgAyUIQEgA0Gbfk0NASADQeYAaiEDDAMLIAFDAAAAf5QhASADQf4BSw0BIANB/wBrIQMMAgsgAUMAAIAMlCEBQbZ9IAMgA0G2fU0bQcwBaiEDDAELIAFDAAAAf5QhAUH9AiADIANB/QJPG0H+AWshAwsgASADQRd0QYCAgPwDar6UIQELIAEL+QMBAn8gACABaiECAkACQCAAKAIEIgNBAXENACADQQJxRQ0BIAAoAgAiAyABaiEBIAAgA2siAEH4lsAAKAIARgRAIAIoAgRBA3FBA0cNAUHwlsAAIAE2AgAgAiACKAIEQX5xNgIEIAAgAUEBcjYCBCACIAE2AgAMAgsgACADEB4LAkACQAJAIAIoAgQiA0ECcUUEQCACQfyWwAAoAgBGDQIgAkH4lsAAKAIARg0DIAIgA0F4cSICEB4gACABIAJqIgFBAXI2AgQgACABaiABNgIAIABB+JbAACgCAEcNAUHwlsAAIAE2AgAPCyACIANBfnE2AgQgACABQQFyNgIEIAAgAWogATYCAAsgAUGAAk8EQCAAIAEQIg8LIAFB+AFxQeCUwABqIQICf0HolsAAKAIAIgNBASABQQN2dCIBcUUEQEHolsAAIAEgA3I2AgAgAgwBCyACKAIICyEBIAIgADYCCCABIAA2AgwgACACNgIMIAAgATYCCA8LQfyWwAAgADYCAEH0lsAAQfSWwAAoAgAgAWoiATYCACAAIAFBAXI2AgQgAEH4lsAAKAIARw0BQfCWwABBADYCAEH4lsAAQQA2AgAPC0H4lsAAIAA2AgBB8JbAAEHwlsAAKAIAIAFqIgE2AgAgACABQQFyNgIEIAAgAWogATYCAAsLggMBCX8jAEEgayIEJAAQIyIAKAIQIQUgACgCDCEIIABCADcCDCAAKAIEIQYgACgCCCEDIABCBDcCBCAAKAIAIQIgAEEANgIAAkAgAyAIRgRAAkAgAiADRgRA0G9BgAEgAiACQYABTRsiB/wPASIBQX9GDQMCQCAFRQRAIAEhBQwBCyACIAVqIAFHDQQLIAIgB2oiByACSSAHQf////8DS3INAyAHQQJ0IgFB/P///wdLDQMgBCACBH8gBCAGNgIUIAQgAkECdDYCHEEEBUEACzYCGCAEQQhqQQQgASAEQRRqEDAgBCgCCEEBRg0DIAQoAgwhBiACIQEgByECDAELIAIgAyIBTQ0CCyAGIAFBAnRqIANBAWo2AgAgAUEBaiEDCyADIAhNDQAgBiAIQQJ0aigCACEBIAAgBTYCECAAIAE2AgwgACADNgIIIAAoAgQhAyAAIAY2AgQgACgCACEBIAAgAjYCACABBEAgAyABQQJ0EGULIARBIGokACAFIAhqDwsAC+cCAQV/AkBBzf97QRAgACAAQRBNGyIAayABTQ0AIABBECABQQtqQXhxIAFBC0kbIgRqQQxqEBEiAkUNACACQQhrIQECQCAAQQFrIgMgAnFFBEAgASEADAELIAJBBGsiBSgCACIGQXhxIAIgA2pBACAAa3FBCGsiAiAAQQAgAiABa0EQTRtqIgAgAWsiAmshAyAGQQNxBEAgACADIAAoAgRBAXFyQQJyNgIEIAAgA2oiAyADKAIEQQFyNgIEIAUgAiAFKAIAQQFxckECcjYCACABIAJqIgMgAygCBEEBcjYCBCABIAIQGgwBCyABKAIAIQEgACADNgIEIAAgASACajYCAAsCQCAAKAIEIgFBA3FFDQAgAUF4cSICIARBEGpNDQAgACAEIAFBAXFyQQJyNgIEIAAgBGoiASACIARrIgRBA3I2AgQgACACaiICIAIoAgRBAXI2AgQgASAEEBoLIABBCGohAwsgAwv7AgEHfyMAQRBrIgQkAAJAAkACQAJAAkAgASgCBCICRQ0AIAEoAgAhByACQQNxIQUCQCACQQRJBEBBACECDAELIAdBHGohAyACQXxxIQhBACECA0AgAygCACADQQhrKAIAIANBEGsoAgAgA0EYaygCACACampqaiECIANBIGohAyAIIAZBBGoiBkcNAAsLIAUEQCAGQQN0IAdqQQRqIQMDQCADKAIAIAJqIQIgA0EIaiEDIAVBAWsiBQ0ACwsgASgCDARAIAJBAEgNASAHKAIERSACQRBJcQ0BIAJBAXQhAgtBACEFIAJBAEgNAyACDQELQQEhA0EAIQIMAQtBsZPAAC0AABpBASEFIAJBARBdIgNFDQELIARBADYCCCAEIAM2AgQgBCACNgIAIARBwIvAACABEBhFDQFBqIzAAEHWACAEQQ9qQZiMwABBkI3AABAzAAsgBSACEFIACyAAIAQpAgA3AgAgAEEIaiAEQQhqKAIANgIAIARBEGokAAvxAgEEfyAAKAIMIQICQAJAIAFBgAJPBEAgACgCGCEDAkACQCAAIAJGBEAgAEEUQRAgACgCFCICG2ooAgAiAQ0BQQAhAgwCCyAAKAIIIgEgAjYCDCACIAE2AggMAQsgAEEUaiAAQRBqIAIbIQQDQCAEIQUgASICQRRqIAJBEGogAigCFCIBGyEEIAJBFEEQIAEbaigCACIBDQALIAVBADYCAAsgA0UNAiAAIAAoAhxBAnRB0JPAAGoiASgCAEcEQCADQRBBFCADKAIQIABGG2ogAjYCACACRQ0DDAILIAEgAjYCACACDQFB7JbAAEHslsAAKAIAQX4gACgCHHdxNgIADAILIAAoAggiACACRwRAIAAgAjYCDCACIAA2AggPC0HolsAAQeiWwAAoAgBBfiABQQN2d3E2AgAPCyACIAM2AhggACgCECIBBEAgAiABNgIQIAEgAjYCGAsgACgCFCIARQ0AIAIgADYCFCAAIAI2AhgLC7YCAQd/AkAgAkEQSQRAIAAhAwwBCyAAQQAgAGtBA3EiBGohBSAEBEAgACEDIAEhBgNAIAMgBi0AADoAACAGQQFqIQYgA0EBaiIDIAVJDQALCyAFIAIgBGsiCEF8cSIHaiEDAkAgASAEaiIEQQNxBEAgB0EATA0BIARBA3QiAkEYcSEJIARBfHEiBkEEaiEBQQAgAmtBGHEhAiAGKAIAIQYDQCAFIAYgCXYgASgCACIGIAJ0cjYCACABQQRqIQEgBUEEaiIFIANJDQALDAELIAdBAEwNACAEIQEDQCAFIAEoAgA2AgAgAUEEaiEBIAVBBGoiBSADSQ0ACwsgCEEDcSECIAQgB2ohAQsgAgRAIAIgA2ohAgNAIAMgAS0AADoAACABQQFqIQEgA0EBaiIDIAJJDQALCyAAC78CAQN/IwBBEGsiAiQAAkAgAUGAAU8EQCACQQA2AgwCfyABQYAQTwRAIAFBgIAETwRAIAJBDGpBA3IhBCACIAFBEnZB8AFyOgAMIAIgAUEGdkE/cUGAAXI6AA4gAiABQQx2QT9xQYABcjoADUEEDAILIAJBDGpBAnIhBCACIAFBDHZB4AFyOgAMIAIgAUEGdkE/cUGAAXI6AA1BAwwBCyACQQxqQQFyIQQgAiABQQZ2QcABcjoADEECCyEDIAQgAUE/cUGAAXI6AAAgAyAAKAIAIAAoAggiAWtLBEAgACABIAMQKSAAKAIIIQELIAAoAgQgAWogAkEMaiADEB8aIAAgASADajYCCAwBCyAAKAIIIgMgACgCAEYEQCAAECgLIAAgA0EBajYCCCAAKAIEIANqIAE6AAALIAJBEGokAEEAC70CAQJ/IwBBEGsiAiQAAkAgAUGAAU8EQCACQQA2AgwCfyABQYAQTwRAIAFBgIAETwRAIAIgAUE/cUGAAXI6AA8gAiABQRJ2QfABcjoADCACIAFBBnZBP3FBgAFyOgAOIAIgAUEMdkE/cUGAAXI6AA1BBAwCCyACIAFBP3FBgAFyOgAOIAIgAUEMdkHgAXI6AAwgAiABQQZ2QT9xQYABcjoADUEDDAELIAIgAUE/cUGAAXI6AA0gAiABQQZ2QcABcjoADEECCyEBIAEgACgCACAAKAIIIgNrSwRAIAAgAyABECUgACgCCCEDCyAAKAIEIANqIAJBDGogARAfGiAAIAEgA2o2AggMAQsgACgCCCIDIAAoAgBGBEAgABAoCyAAIANBAWo2AgggACgCBCADaiABOgAACyACQRBqJABBAAvEAgEEfyAAQgA3AhAgAAJ/QQAgAUGAAkkNABpBHyABQf///wdLDQAaIAFBBiABQQh2ZyIDa3ZBAXEgA0EBdGtBPmoLIgI2AhwgAkECdEHQk8AAaiEEQQEgAnQiA0HslsAAKAIAcUUEQCAEIAA2AgAgACAENgIYIAAgADYCDCAAIAA2AghB7JbAAEHslsAAKAIAIANyNgIADwsCQAJAIAEgBCgCACIDKAIEQXhxRgRAIAMhAgwBCyABQRkgAkEBdmtBACACQR9HG3QhBQNAIAMgBUEddkEEcWpBEGoiBCgCACICRQ0CIAVBAXQhBSACIQMgAigCBEF4cSABRw0ACwsgAigCCCIBIAA2AgwgAiAANgIIIABBADYCGCAAIAI2AgwgACABNgIIDwsgBCAANgIAIAAgAzYCGCAAIAA2AgwgACAANgIIC/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 <splatDefines>
uniform uint targetLayer;
uniform int targetBase;
uniform int targetCount;
out vec4 target;
{{ GLOBALS }}
void computeReadback(int index) {
{{ STATEMENTS }}
}
void main() {
int targetIndex = int(targetLayer << SPLAT_TEX_LAYER_BITS) + int(uint(gl_FragCoord.y) << SPLAT_TEX_WIDTH_BITS) + int(gl_FragCoord.x);
int index = targetIndex - targetBase;
if ((index >= 0) && (index < targetCount)) {
computeReadback(index);
} else {
target = vec4(0.0, 0.0, 0.0, 0.0);
}
}`;
const 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<<e[s-1];for(var i=new ns(t[30]),s=1;s<30;++s)for(var n=t[s];n<t[s+1];++n)i[n]=n-t[s]<<5|s;return{b:t,r:i}},Is=rs(Ft,2),dt=Is.b,ie=Is.r;dt[28]=258,ie[258]=28;for(var ne=rs(St,0),os=ne.b,gt=new JA(32768),X=0;X<32768;++X){var SA=(X&43690)>>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<s;++i)e[i]&&++n[e[i]-1];var g=new JA(A);for(i=1;i<A;++i)g[i]=g[i-1]+n[i-1]<<1;var r;if(t){r=new JA(1<<A);var I=15-A;for(i=0;i<s;++i)if(e[i])for(var o=i<<4|e[i],a=A-e[i],C=g[e[i]-1]++<<a,Q=C|(1<<a)-1;C<=Q;++C)r[gt[C]>>I]=o}else for(r=new JA(s),i=0;i<s;++i)e[i]&&(r[i]=gt[g[e[i]-1]++]>>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;t<e.length;++t)e[t]>A&&(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<b;++p)G[gs[p]]=BA(e,C+p*3,7);C+=b*3;for(var w=rt(G),M=(1<<w)-1,z=HA(G,w,1),p=0;p<x;){var Y=z[BA(e,C,M)];C+=Y&15;var y=Y>>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<<l)-1,Z=(1<<c)-1,W=C;;W=C){var N=B[It(e,C)&P],L=N>>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<<J)-1)+dt[p],C+=J}var R=h[It(e,C)&Z],F=R>>4;R||j(3),C+=R&15;var v=os[F];if(F>3){var J=St[F];v+=It(e,C)&(1<<J)-1,C+=J}if(C>E){I&&j(0);break}r&&o(Q+131072);var eA=Q+K;if(Q<v){var iA=n-v,IA=Math.min(v,eA);for(iA+Q<0&&j(3);Q<IA;++Q)t[Q]=s[iA+Q]}for(;Q<eA;++Q)t[Q]=t[Q-v]}}A.l=B,A.p=W,A.b=Q,A.f=a,B&&(a=1,A.m=l,A.d=h,A.n=c)}while(!a);return Q!=t.length&&g?dA(t,0,Q):t.subarray(0,Q)},ge=new V(0),re=function(e,A){var t={};for(var s in e)t[s]=e[s];for(var s in A)t[s]=A[s];return t},hs=function(e,A,t){for(var s=e(),i=e.toString(),n=i.slice(i.indexOf("[")+1,i.lastIndexOf("]")).replace(/\\s+/g,"").split(","),g=0;g<s.length;++g){var r=s[g],I=n[g];if(typeof r=="function"){A+=";"+I+"=";var o=r.toString();if(r.prototype)if(o.indexOf("[native code]")!=-1){var a=o.indexOf(" ",8)+1;A+=o.slice(a,o.indexOf("(",a))}else{A+=o;for(var C in r.prototype)A+=";"+I+".prototype."+C+"="+r.prototype[C].toString()}else A+=o}else t[I]=r}return A},ot=[],Ie=function(e){var A=[];for(var t in e)e[t].buffer&&A.push((e[t]=new e[t].constructor(e[t])).buffer);return A},oe=function(e,A,t,s){if(!ot[t]){for(var i="",n={},g=e.length-1,r=0;r<g;++r)i=hs(e[r],i,n);ot[t]={c:hs(e[g],i,n),e:n}}var I=re({},ot[t].e);return ee(ot[t].c+";onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage="+A.toString()+"}",t,I,Ie(I),s)},ae=function(){return[V,JA,ns,Ft,St,gs,dt,os,Cs,Bs,gt,Qs,HA,rt,BA,It,Nt,dA,j,kt,at,Es,cs]},Es=function(e){return postMessage(e,[e.buffer])},cs=function(e){return e&&{out:e.size&&new V(e.size),dictionary:e.dictionary}},Ce=function(e,A,t,s,i,n){var g=oe(t,s,i,function(r,I){g.terminate(),n(r,I)});return g.postMessage([e,A],A.consume?[e.buffer]:[]),function(){g.terminate()}},lA=function(e,A){return e[A]|e[A+1]<<8},tA=function(e,A){return(e[A]|e[A+1]<<8|e[A+2]<<16|e[A+3]<<24)>>>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;s<e.length;s+=16384)t+=String.fromCharCode.apply(null,e.subarray(s,s+16384));return t}else{if(Yt)return Yt.decode(e);var i=he(e),n=i.s,t=i.r;return t.length&&j(8),n}}var us=function(e,A){return A+30+lA(e,A+26)+lA(e,A+28)},ys=function(e,A,t){var s=lA(e,A+28),i=Ee(e.subarray(A+46,A+46+s),!(lA(e,A+8)&2048)),n=A+46+s,g=tA(e,A+20),r=t&&g==4294967295?ce(e,n):[g,tA(e,A+24),tA(e,A+42)],I=r[0],o=r[1],a=r[2];return[lA(e,A+10),I,o,i,n+lA(e,A+30)+lA(e,A+32),a]},ce=function(e,A){for(;lA(e,A)!=1;A+=4+lA(e,A+2));return[Gt(e,A+12),Gt(e,A+4),Gt(e,A+20)]},fs=typeof queueMicrotask=="function"?queueMicrotask:typeof setTimeout=="function"?setTimeout:function(e){e()};function le(e,A,t){t||(t=A,A={}),typeof t!="function"&&j(7);var s=[],i=function(){for(var c=0;c<s.length;++c)s[c]()},n={},g=function(c,E){fs(function(){t(c,E)})};fs(function(){g=t});for(var r=e.length-22;tA(e,r)!=101010256;--r)if(!r||e.length-r>65558)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;l<o;++l)h(l)}else g(null,{});return i}function ue(e,A){for(var t={},s=e.length-22;tA(e,s)!=101010256;--s)(!s||e.length-s>65558)&&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<i;++o){var a=ys(e,n,g),C=a[0],Q=a[1],B=a[2],h=a[3],l=a[4],c=a[5],E=us(e,c);n=l,(!I||I({name:h,size:Q,originalSize:B,compression:C}))&&(C?C==8?t[h]=at(e.subarray(E,E+Q),{out:new V(B)}):j(14,"unknown compression type "+C):t[h]=dA(e,E,E+Q))}return t}/**\n * @license\n * Copyright 2010-2024 Three.js Authors\n * SPDX-License-Identifier: MIT\n */const ws="172",ye="",uA="srgb",ms="srgb-linear",xs="linear",Rt="srgb";function rA(e,A,t){return Math.max(A,Math.min(t,e))}function fe(e,A){return(e%A+A)%A}function bt(e,A,t){return(1-t)*e+t*A}class $A{constructor(A,t,s,i,n,g,r,I,o){$A.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],A!==void 0&&this.set(A,t,s,i,n,g,r,I,o)}set(A,t,s,i,n,g,r,I,o){const a=this.elements;return a[0]=A,a[1]=i,a[2]=r,a[3]=t,a[4]=n,a[5]=I,a[6]=s,a[7]=g,a[8]=o,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(A){const t=this.elements,s=A.elements;return t[0]=s[0],t[1]=s[1],t[2]=s[2],t[3]=s[3],t[4]=s[4],t[5]=s[5],t[6]=s[6],t[7]=s[7],t[8]=s[8],this}extractBasis(A,t,s){return A.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),s.setFromMatrix3Column(this,2),this}setFromMatrix4(A){const t=A.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(A){return this.multiplyMatrices(this,A)}premultiply(A){return this.multiplyMatrices(A,this)}multiplyMatrices(A,t){const s=A.elements,i=t.elements,n=this.elements,g=s[0],r=s[3],I=s[6],o=s[1],a=s[4],C=s[7],Q=s[2],B=s[5],h=s[8],l=i[0],c=i[3],E=i[6],u=i[1],y=i[4],f=i[7],D=i[2],S=i[5],b=i[8];return n[0]=g*l+r*u+I*D,n[3]=g*c+r*y+I*S,n[6]=g*E+r*f+I*b,n[1]=o*l+a*u+C*D,n[4]=o*c+a*y+C*S,n[7]=o*E+a*f+C*b,n[2]=Q*l+B*u+h*D,n[5]=Q*c+B*y+h*S,n[8]=Q*E+B*f+h*b,this}multiplyScalar(A){const t=this.elements;return t[0]*=A,t[3]*=A,t[6]*=A,t[1]*=A,t[4]*=A,t[7]*=A,t[2]*=A,t[5]*=A,t[8]*=A,this}determinant(){const A=this.elements,t=A[0],s=A[1],i=A[2],n=A[3],g=A[4],r=A[5],I=A[6],o=A[7],a=A[8];return t*g*a-t*r*o-s*n*a+s*r*I+i*n*o-i*g*I}invert(){const A=this.elements,t=A[0],s=A[1],i=A[2],n=A[3],g=A[4],r=A[5],I=A[6],o=A[7],a=A[8],C=a*g-r*o,Q=r*I-a*n,B=o*n-g*I,h=t*C+s*Q+i*B;if(h===0)return this.set(0,0,0,0,0,0,0,0,0);const l=1/h;return A[0]=C*l,A[1]=(i*o-a*s)*l,A[2]=(r*s-i*g)*l,A[3]=Q*l,A[4]=(a*t-i*I)*l,A[5]=(i*n-r*t)*l,A[6]=B*l,A[7]=(s*I-o*t)*l,A[8]=(g*t-s*n)*l,this}transpose(){let A;const t=this.elements;return A=t[1],t[1]=t[3],t[3]=A,A=t[2],t[2]=t[6],t[6]=A,A=t[5],t[5]=t[7],t[7]=A,this}getNormalMatrix(A){return this.setFromMatrix4(A).invert().transpose()}transposeIntoArray(A){const t=this.elements;return A[0]=t[0],A[1]=t[3],A[2]=t[6],A[3]=t[1],A[4]=t[4],A[5]=t[7],A[6]=t[2],A[7]=t[5],A[8]=t[8],this}setUvTransform(A,t,s,i,n,g,r){const I=Math.cos(n),o=Math.sin(n);return this.set(s*I,s*o,-s*(I*g+o*r)+g+A,-i*o,i*I,-i*(-o*g+I*r)+r+t,0,0,1),this}scale(A,t){return this.premultiply(Jt.makeScale(A,t)),this}rotate(A){return this.premultiply(Jt.makeRotation(-A)),this}translate(A,t){return this.premultiply(Jt.makeTranslation(A,t)),this}makeTranslation(A,t){return A.isVector2?this.set(1,0,A.x,0,1,A.y,0,0,1):this.set(1,0,A,0,1,t,0,0,1),this}makeRotation(A){const t=Math.cos(A),s=Math.sin(A);return this.set(t,-s,0,s,t,0,0,0,1),this}makeScale(A,t){return this.set(A,0,0,0,t,0,0,0,1),this}equals(A){const t=this.elements,s=A.elements;for(let i=0;i<9;i++)if(t[i]!==s[i])return!1;return!0}fromArray(A,t=0){for(let s=0;s<9;s++)this.elements[s]=A[s+t];return this}toArray(A=[],t=0){const s=this.elements;return A[t]=s[0],A[t+1]=s[1],A[t+2]=s[2],A[t+3]=s[3],A[t+4]=s[4],A[t+5]=s[5],A[t+6]=s[6],A[t+7]=s[7],A[t+8]=s[8],A}clone(){return new this.constructor().fromArray(this.elements)}}const Jt=new $A,Ds=new $A().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),ps=new $A().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function we(){const e={enabled:!0,workingColorSpace:ms,spaces:{},convert:function(i,n,g){return this.enabled===!1||n===g||!n||!g||(this.spaces[n].transfer===Rt&&(i.r=qA(i.r),i.g=qA(i.g),i.b=qA(i.b)),this.spaces[n].primaries!==this.spaces[g].primaries&&(i.applyMatrix3(this.spaces[n].toXYZ),i.applyMatrix3(this.spaces[g].fromXYZ)),this.spaces[g].transfer===Rt&&(i.r=vA(i.r),i.g=vA(i.g),i.b=vA(i.b))),i},fromWorkingColorSpace:function(i,n){return this.convert(i,this.workingColorSpace,n)},toWorkingColorSpace:function(i,n){return this.convert(i,n,this.workingColorSpace)},getPrimaries:function(i){return this.spaces[i].primaries},getTransfer:function(i){return i===ye?xs:this.spaces[i].transfer},getLuminanceCoefficients:function(i,n=this.workingColorSpace){return i.fromArray(this.spaces[n].luminanceCoefficients)},define:function(i){Object.assign(this.spaces,i)},_getMatrix:function(i,n,g){return i.copy(this.spaces[n].toXYZ).multiply(this.spaces[g].fromXYZ)},_getDrawingBufferColorSpace:function(i){return this.spaces[i].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(i=this.workingColorSpace){return this.spaces[i].workingColorSpaceConfig.unpackColorSpace}},A=[.64,.33,.3,.6,.15,.06],t=[.2126,.7152,.0722],s=[.3127,.329];return e.define({[ms]:{primaries:A,whitePoint:s,transfer:xs,toXYZ:Ds,fromXYZ:ps,luminanceCoefficients:t,workingColorSpaceConfig:{unpackColorSpace:uA},outputColorSpaceConfig:{drawingBufferColorSpace:uA}},[uA]:{primaries:A,whitePoint:s,transfer:Rt,toXYZ:Ds,fromXYZ:ps,luminanceCoefficients:t,outputColorSpaceConfig:{drawingBufferColorSpace:uA}}}),e}const yA=we();function qA(e){return e<.04045?e*.0773993808:Math.pow(e*.9478672986+.0521327014,2.4)}function vA(e){return e<.0031308?e*12.92:1.055*Math.pow(e,.41666)-.055}class NA{constructor(A=0,t=0,s=0,i=1){this.isQuaternion=!0,this._x=A,this._y=t,this._z=s,this._w=i}static slerpFlat(A,t,s,i,n,g,r){let I=s[i+0],o=s[i+1],a=s[i+2],C=s[i+3];const Q=n[g+0],B=n[g+1],h=n[g+2],l=n[g+3];if(r===0){A[t+0]=I,A[t+1]=o,A[t+2]=a,A[t+3]=C;return}if(r===1){A[t+0]=Q,A[t+1]=B,A[t+2]=h,A[t+3]=l;return}if(C!==l||I!==Q||o!==B||a!==h){let c=1-r;const E=I*Q+o*B+a*h+C*l,u=E>=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 s<Number.EPSILON?(s=0,Math.abs(A.x)>Math.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<s;t+=3)this.expandByPoint(fA.fromArray(A,t));return this}setFromBufferAttribute(A){this.makeEmpty();for(let t=0,s=A.count;t<s;t++)this.expandByPoint(fA.fromBufferAttribute(A,t));return this}setFromPoints(A){this.makeEmpty();for(let t=0,s=A.length;t<s;t++)this.expandByPoint(A[t]);return this}setFromCenterAndSize(A,t){const s=fA.copy(t).multiplyScalar(.5);return this.min.copy(A).sub(s),this.max.copy(A).add(s),this}setFromObject(A,t=!1){return this.makeEmpty(),this.expandByObject(A,t)}clone(){return new this.constructor().copy(this)}copy(A){return this.min.copy(A.min),this.max.copy(A.max),this}makeEmpty(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-1/0,this}isEmpty(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z}getCenter(A){return this.isEmpty()?A.set(0,0,0):A.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(A){return this.isEmpty()?A.set(0,0,0):A.subVectors(this.max,this.min)}expandByPoint(A){return this.min.min(A),this.max.max(A),this}expandByVector(A){return this.min.sub(A),this.max.add(A),this}expandByScalar(A){return this.min.addScalar(-A),this.max.addScalar(A),this}expandByObject(A,t=!1){A.updateWorldMatrix(!1,!1);const s=A.geometry;if(s!==void 0){const n=s.getAttribute("position");if(t===!0&&n!==void 0&&A.isInstancedMesh!==!0)for(let g=0,r=n.count;g<r;g++)A.isMesh===!0?A.getVertexPosition(g,fA):fA.fromBufferAttribute(n,g),fA.applyMatrix4(A.matrixWorld),this.expandByPoint(fA);else A.boundingBox!==void 0?(A.boundingBox===null&&A.computeBoundingBox(),Ct.copy(A.boundingBox)):(s.boundingBox===null&&s.computeBoundingBox(),Ct.copy(s.boundingBox)),Ct.applyMatrix4(A.matrixWorld),this.union(Ct)}const i=A.children;for(let n=0,g=i.length;n<g;n++)this.expandByObject(i[n],t);return this}containsPoint(A){return A.x>=this.min.x&&A.x<=this.max.x&&A.y>=this.min.y&&A.y<=this.max.y&&A.z>=this.min.z&&A.z<=this.max.z}containsBox(A){return this.min.x<=A.min.x&&A.max.x<=this.max.x&&this.min.y<=A.min.y&&A.max.y<=this.max.y&&this.min.z<=A.min.z&&A.max.z<=this.max.z}getParameter(A,t){return t.set((A.x-this.min.x)/(this.max.x-this.min.x),(A.y-this.min.y)/(this.max.y-this.min.y),(A.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(A){return A.max.x>=this.min.x&&A.min.x<=this.max.x&&A.max.y>=this.min.y&&A.min.y<=this.max.y&&A.max.z>=this.min.z&&A.min.z<=this.max.z}intersectsSphere(A){return this.clampPoint(A.center,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<n?6:0);break;case i:I=(n-s)/C+2;break;case n:I=(s-i)/C+4;break}I/=6}return A.h=I,A.s=o,A.l=a,A}getRGB(A,t=yA.workingColorSpace){return yA.fromWorkingColorSpace(sA.copy(this),t),A.r=sA.r,A.g=sA.g,A.b=sA.b,A}getStyle(A=uA){yA.fromWorkingColorSpace(sA.copy(this),A);const t=sA.r,s=sA.g,i=sA.b;return A!==uA?`color(${A} ${t.toFixed(3)} ${s.toFixed(3)} ${i.toFixed(3)})`:`rgb(${Math.round(t*255)},${Math.round(s*255)},${Math.round(i*255)})`}offsetHSL(A,t,s){return this.getHSL(UA),this.setHSL(UA.h+A,UA.s+t,UA.l+s)}add(A){return this.r+=A.r,this.g+=A.g,this.b+=A.b,this}addColors(A,t){return this.r=A.r+t.r,this.g=A.g+t.g,this.b=A.b+t.b,this}addScalar(A){return this.r+=A,this.g+=A,this.b+=A,this}sub(A){return this.r=Math.max(0,this.r-A.r),this.g=Math.max(0,this.g-A.g),this.b=Math.max(0,this.b-A.b),this}multiply(A){return this.r*=A.r,this.g*=A.g,this.b*=A.b,this}multiplyScalar(A){return this.r*=A,this.g*=A,this.b*=A,this}lerp(A,t){return this.r+=(A.r-this.r)*t,this.g+=(A.g-this.g)*t,this.b+=(A.b-this.b)*t,this}lerpColors(A,t,s){return this.r=A.r+(t.r-A.r)*s,this.g=A.g+(t.g-A.g)*s,this.b=A.b+(t.b-A.b)*s,this}lerpHSL(A,t){this.getHSL(UA),A.getHSL(ht);const s=bt(UA.h,ht.h,t),i=bt(UA.s,ht.s,t),n=bt(UA.l,ht.l,t);return this.setHSL(s,i,n),this}setFromVector3(A){return this.r=A.x,this.g=A.y,this.b=A.z,this}applyMatrix3(A){const t=this.r,s=this.g,i=this.b,n=A.elements;return this.r=n[0]*t+n[3]*s+n[6]*i,this.g=n[1]*t+n[4]*s+n[7]*i,this.b=n[2]*t+n[5]*s+n[8]*i,this}equals(A){return A.r===this.r&&A.g===this.g&&A.b===this.b}fromArray(A,t=0){return this.r=A[t],this.g=A[t+1],this.b=A[t+2],this}toArray(A=[],t=0){return A[t]=this.r,A[t+1]=this.g,A[t+2]=this.b,A}fromBufferAttribute(A,t){return this.r=A.getX(t),this.g=A.getY(t),this.b=A.getZ(t),this}toJSON(){return this.getHex()}*[Symbol.iterator](){yield this.r,yield this.g,yield this.b}}const sA=new Ht;Ht.NAMES=Ss,typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:ws}})),typeof window<"u"&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=ws);const ds=-12,Ns=9,XA=Math.exp(-30),me=11,xe=11,ks=1<<me,Gs=1<<xe,Us=1;function De(e){var n;let A=!1;const t=e.split(`\n`).map(g=>{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<XA?0:Math.min(255,Math.max(1,Math.round((Math.log(n)-w)*z)+1)),N=g<XA?0:Math.min(255,Math.max(1,Math.round((Math.log(g)-w)*z)+1)),q=r<XA?0:Math.min(255,Math.max(1,Math.round((Math.log(r)-w)*z)+1)),T=WA(t),v=WA(s),P=WA(i),Z=A*4;e[Z]=f|D<<8|S<<16|b<<24,e[Z+1]=T|v<<16,e[Z+2]=P|m<<16|G<<24,e[Z+3]=Y|N<<8|q<<16|p<<24}function Rs(e,A,t,s,i){const n=WA(t),g=WA(s),r=WA(i),I=A*4;e[I+1]=n|g<<16,e[I+2]=r|e[I+2]&4294901760}function bs(e,A,t,s,i,n){const g=(n==null?void 0:n.lnScaleMin)??ds,I=254/(((n==null?void 0:n.lnScaleMax)??Ns)-g),o=t<XA?0:Math.min(255,Math.max(1,Math.round((Math.log(t)-g)*I)+1)),a=s<XA?0:Math.min(255,Math.max(1,Math.round((Math.log(s)-g)*I)+1)),C=i<XA?0:Math.min(255,Math.max(1,Math.round((Math.log(i)-g)*I)+1)),Q=A*4;e[Q+3]=o|a<<8|C<<16|e[Q+3]&4278190080}function Js(e,A,t,s,i,n){const g=_s(new NA(t,s,i,n)),r=g&255,I=g>>>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<<l&4294967295;if(e[I+h]|=c,B>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<<l&4294967295;if(e[I+h]|=c,B>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<e.length;){const I=e.slice(r,r+g);n.push(I,!1),r+=g}if(i==null&&(n.push(new Uint8Array,!0),i==null))throw new Error("Failed to decompress partial gzip");return i}class Ge{constructor({fileBytes:A,chunkBytes:t=64*1024}){this.fileBytes=A,this.chunkBytes=t,this.offset=0,this.chunks=[],this.totalBytes=0,this.gunzip=new ls((s,i)=>{this.chunks.push(s),this.totalBytes+=s.length})}read(A){for(;this.totalBytes<A&&this.offset<this.fileBytes.length;){const n=Math.min(this.offset+this.chunkBytes,this.fileBytes.length);this.gunzip.push(this.fileBytes.subarray(this.offset,n),!1),this.offset=n}if(this.totalBytes<A&&this.offset>=this.fileBytes.length&&this.gunzip.push(new Uint8Array(0),!0),this.totalBytes<A)throw new Error(`Unexpected EOF: needed ${A}, got ${this.totalBytes}`);const t=new Uint8Array(this.totalBytes);let s=0;for(const n of this.chunks)t.set(n,s),s+=n.length;const i=t.subarray(0,A);return this.chunks=[t.subarray(A)],this.totalBytes-=A,i}}function zs(e,A,t){const s=Math.floor(e.length/32);if(s*32!==e.length)throw new Error("Invalid .splat file size");A(s);const i=new Float32Array(e.buffer);for(let n=0;n<s;++n){const g=n*32,r=n*8,I=i[r+0],o=i[r+1],a=i[r+2],C=i[r+3],Q=i[r+4],B=i[r+5],h=e[g+24]/255,l=e[g+25]/255,c=e[g+26]/255,E=e[g+27]/255,u=(e[g+28]-128)/128,y=(e[g+29]-128)/128,f=(e[g+30]-128)/128,D=(e[g+31]-128)/128;t(n,I,o,a,C,Q,B,y,f,D,u,E,h,l,c)}}function Ue(e,A){let t=0,s=0,i=new Uint32Array(0);return zs(e,n=>{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<a;++c){let E=function(nA,U){if(C===0)return k.getFloat32(nA+J+U*4,!0);if(C===1)return O(k.getUint16(nA+J+U*2,!0));const cA=k.getUint8(nA+J+U)/255;return Q+cA*(B-Q)};const u=new DataView(e.buffer,g,1024);g+=1024;const y=u.getUint32(0,!0),f=u.getUint32(4,!0),D=u.getUint32(8,!0),S=u.getUint32(12,!0),b=u.getFloat32(16,!0),x=u.getUint16(20,!0),m=(u.getUint32(24,!0)||((l=ft[C])==null?void 0:l.scaleRange))??1,G=u.getUint32(32,!0),p=G*D,w=u.getUint32(36,!0),M=w*4,z=x*S+M,Y=u.getUint16(40,!0),N=Ls[Y],{bytesPerCenter:q,bytesPerScale:T,bytesPerRotation:v,bytesPerColor:P,bytesPerSphericalHarmonicsComponent:Z,scaleOffsetBytes:W,rotationOffsetBytes:L,colorOffsetBytes:K,sphericalHarmonicsOffsetBytes:J}=ft[C],R=q+T+v+P+N*Z,F=R*f,eA=F+z,iA=[0,3,6,1,4,7,2,5,8],IA=[9,14,19,10,15,20,11,16,21,12,17,22,13,18,23],gA=[24,31,38,25,32,39,26,33,40,27,34,41,28,35,42,29,36,43,30,37,44],oA=Y>=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<y;++nA){const U=nA*R;let cA;if(nA<p)cA=Math.floor(nA/D);else{const pA=wA[H-G];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<I;++y){let f=function(AA,_){if(a===0)return H.getFloat32(AA+eA+_*4,!0);if(a===1)return O(H.getUint16(AA+eA+_*2,!0));const mA=H.getUint8(AA+eA+_)/255;return C+mA*(Q-C)};const D=new DataView(e.buffer,i,1024);i+=1024;const S=D.getUint32(0,!0),b=D.getUint32(4,!0),x=D.getUint32(8,!0),m=D.getUint32(12,!0),G=D.getFloat32(16,!0),p=D.getUint16(20,!0),w=(D.getUint32(24,!0)||((u=ft[a])==null?void 0:u.scaleRange))??1,M=D.getUint32(32,!0),z=M*x,Y=D.getUint32(36,!0),N=Y*4,q=p*m+N,T=D.getUint16(40,!0),v=Ls[T],{bytesPerCenter:P,bytesPerScale:Z,bytesPerRotation:W,bytesPerColor:L,bytesPerSphericalHarmonicsComponent:K,scaleOffsetBytes:J,rotationOffsetBytes:R,colorOffsetBytes:F,sphericalHarmonicsOffsetBytes:eA}=ft[a],iA=P+Z+W+L+v*K,IA=iA*b,gA=IA+q,oA=[0,3,6,1,4,7,2,5,8],aA=[9,14,19,10,15,20,11,16,21,12,17,22,13,18,23],FA=[24,31,38,25,32,39,26,33,40,27,34,41,28,35,42,29,36,43,30,37,44],CA=T>=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<S;++AA){const _=AA*iA;let mA;if(AA<z)mA=Math.floor(AA/x);else{const bA=nA[U-M];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<B.length;h++)B[h]=xt[Q.type](s,t,this.littleEndian),t+=PA[Q.type]})):(I[C]=0,o.push(()=>{I[C]=xt[Q.type](s,t,this.littleEndian),t+=PA[Q.type]}));const a=A(n)??(()=>{});for(let C=0;C<g;C++){for(const Q of o)Q();a(C,I)}}}parseSplats(A,t){if(this.elements.vertex==null)throw new Error("No vertex element found");let s=!1;const i=[];let n=0,g=[],r=[],I=[],o,a,C;function Q(){const E=Je[n];g=new Array(3).fill(null).flatMap((u,y)=>[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;C<g;C++){for(const Q of I)Q();a&&(o+=4)}}}};VA.defaultPointScale=.001;let wt=VA;const mt=.28209479177387814,xt={char:(e,A,t)=>e.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<s;++B){const h=B*4,l=(Q[0][h+0]+(Q[1][h+0]<<8))/65535,c=(Q[0][h+1]+(Q[1][h+1]<<8))/65535,E=(Q[0][h+2]+(Q[1][h+2]<<8))/65535;let u=e.means.mins[0]+(e.means.maxs[0]-e.means.mins[0])*l,y=e.means.mins[1]+(e.means.maxs[1]-e.means.mins[1])*c,f=e.means.mins[2]+(e.means.maxs[2]-e.means.mins[2])*E;u=Math.sign(u)*(Math.exp(Math.abs(u))-1),y=Math.sign(y)*(Math.exp(Math.abs(y))-1),f=Math.sign(f)*(Math.exp(Math.abs(f))-1),Rs(n,B,u,y,f)}}),I=st(A[e.scales.files[0]]).then(Q=>{for(let B=0;B<s;++B){const h=B*4,l=Q[h+0]/255,c=Q[h+1]/255,E=Q[h+2]/255,u=e.scales.mins[0]+(e.scales.maxs[0]-e.scales.mins[0])*l,y=e.scales.mins[1]+(e.scales.maxs[1]-e.scales.mins[1])*c,f=e.scales.mins[2]+(e.scales.maxs[2]-e.scales.mins[2])*E;bs(n,B,Math.exp(u),Math.exp(y),Math.exp(f),t)}}),o=st(A[e.quats.files[0]]).then(Q=>{const B=Math.sqrt(2);for(let h=0;h<s;++h){const l=h*4,c=(Q[l+0]/255-.5)*B,E=(Q[l+1]/255-.5)*B,u=(Q[l+2]/255-.5)*B,y=Math.sqrt(Math.max(0,1-c*c-E*E-u*u)),f=Q[l+3]-252,D=f===0?c:f===1?y:E,S=f<=1?E:f===2?y:u,b=f<=2?u:y;Js(n,h,D,S,b,f===0?y:c)}}),a=st(A[e.sh0.files[0]]).then(Q=>{const B=.28209479177387814;for(let h=0;h<s;++h){const l=h*4,c=Q[l+0]/255,E=Q[l+1]/255,u=Q[l+2]/255,y=Q[l+3]/255,f=e.sh0.mins[0]+(e.sh0.maxs[0]-e.sh0.mins[0])*c,D=e.sh0.mins[1]+(e.sh0.maxs[1]-e.sh0.mins[1])*E,S=e.sh0.mins[2]+(e.sh0.maxs[2]-e.sh0.mins[2])*u,b=e.sh0.mins[3]+(e.sh0.maxs[3]-e.sh0.mins[3])*y,x=B*f+.5,m=B*D+.5,G=B*S+.5,p=1/(1+Math.exp(-b));Fe(n,h,x,m,G,p,t)}}),C=[r,I,o,a];if(e.shN){const Q=e.shN.shape[1]>=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<s;++S){const b=S*4,x=D.rgba[b+0]+(D.rgba[b+1]<<8),m=(x&63)*15,p=(x>>>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&&lt(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<this.numSplats;o++){const a=o*3,C=O(I[a]),Q=O(I[a+1]),B=O(I[a+2]);A==null||A(o,C,Q,B)}}else if(this.version===2){const r=1<<this.fractionalBits,I=this.reader.read(this.numSplats*3*3);for(let o=0;o<this.numSplats;o++){const a=o*9,C=((I[a+2]<<24|I[a+1]<<16|I[a]<<8)>>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<this.numSplats;I++)t==null||t(I,r[I]/255)}{const r=this.reader.read(this.numSplats*3),I=Xs/.15;for(let o=0;o<this.numSplats;o++){const a=o*3,C=(r[a]/255-.5)*I+.5,Q=(r[a+1]/255-.5)*I+.5,B=(r[a+2]/255-.5)*I+.5;s==null||s(o,C,Q,B)}}{const r=this.reader.read(this.numSplats*3);for(let I=0;I<this.numSplats;I++){const o=I*3,a=Math.exp(r[o]/16-10),C=Math.exp(r[o+1]/16-10),Q=Math.exp(r[o+2]/16-10);i==null||i(I,a,C,Q)}}{const r=this.reader.read(this.numSplats*3);for(let I=0;I<this.numSplats;I++){const o=I*3,a=r[o]/127.5-1,C=r[o+1]/127.5-1,Q=r[o+2]/127.5-1,B=Math.sqrt(Math.max(0,1-a*a-C*C-Q*Q));n==null||n(I,a,C,Q,B)}}if(g&&this.shDegree>=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<this.numSplats;Q++){for(let B=0;B<9;++B)r[B]=(a[C+B]-128)/128;if(C+=9,I){for(let B=0;B<15;++B)I[B]=(a[C+B]-128)/128;C+=15}if(o){for(let B=0;B<21;++B)o[B]=(a[C+B]-128)/128;C+=21}g==null||g(Q,r,I,o)}}}}const Zs={1:3,2:8,3:15},Xs=.28209479177387814,Ke=1347635022,Te=2,Ze=1;class YA{constructor({numSplats:A,shDegree:t,fractionalBits:s=12,flagAntiAlias:i=!0}){this.clippedCount=0;const n=19+(t>=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<<s,this.flagAntiAlias=i}setCenter(A,t,s,i){const n=Math.round(t*this.fraction),g=Math.max(-8388607,Math.min(8388607,n)),r=Math.round(s*this.fraction),I=Math.max(-8388607,Math.min(8388607,r)),o=Math.round(i*this.fraction),a=Math.max(-8388607,Math.min(8388607,o));(n!==g||r!==I||o!==a)&&(this.clippedCount+=1);const B=16+A*9;this.view.setUint8(B,g&255),this.view.setUint8(B+1,g>>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<A.numSplats;++B){const h=B*3,l=B*4;I.setCenter(B,A.centers[h],A.centers[h+1],A.centers[h+2]),I.setScale(B,A.scales[h],A.scales[h+1],A.scales[h+2]),I.setQuat(B,A.quaternions[l],A.quaternions[l+1],A.quaternions[l+2],A.quaternions[l+3]),I.setAlpha(B,A.opacities[B]),I.setRgb(B,A.colors[h],A.colors[h+1],A.colors[h+2]),A.sh1&&r>=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<n;++I){const o=s[I],a=Math.min(o.length,e-g);for(let C=0;C<a;++C){const Q=o[C]&32767;Q<Tt&&(DA[Q]+=1)}g+=a}let r=0;for(let I=0;I<Mt;++I){const o=r+DA[I];DA[I]=r,r=o}g=0;for(let I=0;I<n;++I){const o=s[I],a=Math.min(o.length,e-g);for(let C=0;C<a;++C){const Q=o[C]&32767;Q<Tt&&(t[DA[Q]]=g+C,DA[Q]+=1)}g+=a}if(DA[Mt-1]!==r)throw new Error(`Expected ${r} active splats but got ${DA[Mt-1]}`);return{activeSplats:r,ordering:t}}const Zt=[];function Ps(e){Zt.push(e)}async function je(){self.addEventListener("message",Ps),await es(),self.removeEventListener("message",Ps),self.addEventListener("message",Ws);for(const e of Zt)Ws(e);Zt.length=0}je().catch(console.error)})();\n//# sourceMappingURL=worker-DXCsnY0K.js.map\n', Qs = typeof self < "u" && self.Blob && new Blob([qa], { type: "text/javascript;charset=utf-8" });
function wu(t) {
let A;
try {
if (A = Qs && (self.URL || self.webkitURL).createObjectURL(Qs), !A) throw "";
const e = new Worker(A, {
name: t == null ? void 0 : t.name
});
return e.addEventListener("error", () => {
(self.URL || self.webkitURL).revokeObjectURL(A);
}), e;
} catch {
return new Worker(
"data:text/javascript;charset=utf-8," + encodeURIComponent(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 <splatDefines>
uniform uint targetLayer;
uniform int targetBase;
uniform int targetCount;
out uvec4 target;
{{ GLOBALS }}
void produceSplat(int index) {
{{ STATEMENTS }}
}
void main() {
int targetIndex = int(targetLayer << SPLAT_TEX_LAYER_BITS) + int(uint(gl_FragCoord.y) << SPLAT_TEX_WIDTH_BITS) + int(gl_FragCoord.x);
int index = targetIndex - targetBase;
if ((index >= 0) && (index < targetCount)) {
produceSplat(index);
} else {
target = uvec4(0u, 0u, 0u, 0u);
}
}`;
const 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 <splatDefines>
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 <splatDefines>
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