mirror of
https://github.com/storytold/spark.git
synced 2026-10-09 00:09:53 +00:00
10723 lines
636 KiB
JavaScript
10723 lines
636 KiB
JavaScript
import * as E from "three";
|
|
import { Mesh as rQ, OrthographicCamera as cQ, BufferGeometry as hQ, Float32BufferAttribute as Cg, Loader as lQ, FileLoader as uQ, Quaternion as ag, Vector3 as vA, Color as Eg, Matrix4 as me } from "three";
|
|
const wQ = new cQ(-1, 1, 1, -1, 0, 1);
|
|
class DQ extends hQ {
|
|
constructor() {
|
|
super(), this.setAttribute("position", new Cg([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3)), this.setAttribute("uv", new Cg([0, 2, 0, 0, 2, 0], 2));
|
|
}
|
|
}
|
|
const yQ = new DQ();
|
|
class pg {
|
|
constructor(A) {
|
|
this._mesh = new rQ(yQ, A);
|
|
}
|
|
dispose() {
|
|
this._mesh.geometry.dispose();
|
|
}
|
|
render(A) {
|
|
A.render(this._mesh, wQ);
|
|
}
|
|
get material() {
|
|
return this._mesh.material;
|
|
}
|
|
set material(A) {
|
|
this._mesh.material = A;
|
|
}
|
|
}
|
|
var EA = Uint8Array, ft = Uint16Array, pQ = Int32Array, dg = new EA([
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
0,
|
|
/* unused */
|
|
0,
|
|
0,
|
|
/* impossible */
|
|
0
|
|
]), fg = new EA([
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
1,
|
|
2,
|
|
2,
|
|
3,
|
|
3,
|
|
4,
|
|
4,
|
|
5,
|
|
5,
|
|
6,
|
|
6,
|
|
7,
|
|
7,
|
|
8,
|
|
8,
|
|
9,
|
|
9,
|
|
10,
|
|
10,
|
|
11,
|
|
11,
|
|
12,
|
|
12,
|
|
13,
|
|
13,
|
|
/* unused */
|
|
0,
|
|
0
|
|
]), dQ = new EA([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]), Mg = function(t, A) {
|
|
for (var e = new ft(31), g = 0; g < 31; ++g)
|
|
e[g] = A += 1 << t[g - 1];
|
|
for (var I = new pQ(e[30]), g = 1; g < 30; ++g)
|
|
for (var s = e[g]; s < e[g + 1]; ++s)
|
|
I[s] = s - e[g] << 5 | g;
|
|
return { b: e, r: I };
|
|
}, mg = Mg(dg, 2), Sg = mg.b, fQ = mg.r;
|
|
Sg[28] = 258, fQ[258] = 28;
|
|
var MQ = Mg(fg, 0), mQ = MQ.b, Ue = new ft(32768);
|
|
for (var gA = 0; gA < 32768; ++gA) {
|
|
var At = (gA & 43690) >> 1 | (gA & 21845) << 1;
|
|
At = (At & 52428) >> 2 | (At & 13107) << 2, At = (At & 61680) >> 4 | (At & 3855) << 4, Ue[gA] = ((At & 65280) >> 8 | (At & 255) << 8) >> 1;
|
|
}
|
|
var Tt = function(t, A, e) {
|
|
for (var g = t.length, I = 0, s = new ft(A); I < g; ++I)
|
|
t[I] && ++s[t[I] - 1];
|
|
var B = new ft(A);
|
|
for (I = 1; I < A; ++I)
|
|
B[I] = B[I - 1] + s[I - 1] << 1;
|
|
var i;
|
|
if (e) {
|
|
i = new ft(1 << A);
|
|
var Q = 15 - A;
|
|
for (I = 0; I < g; ++I)
|
|
if (t[I])
|
|
for (var C = I << 4 | t[I], a = A - t[I], n = B[t[I] - 1]++ << a, o = n | (1 << a) - 1; n <= o; ++n)
|
|
i[Ue[n] >> Q] = C;
|
|
} else
|
|
for (i = new ft(g), I = 0; I < g; ++I)
|
|
t[I] && (i[I] = Ue[B[t[I] - 1]++] >> 15 - t[I]);
|
|
return i;
|
|
}, Vt = new EA(288);
|
|
for (var gA = 0; gA < 144; ++gA)
|
|
Vt[gA] = 8;
|
|
for (var gA = 144; gA < 256; ++gA)
|
|
Vt[gA] = 9;
|
|
for (var gA = 256; gA < 280; ++gA)
|
|
Vt[gA] = 7;
|
|
for (var gA = 280; gA < 288; ++gA)
|
|
Vt[gA] = 8;
|
|
var Ng = new EA(32);
|
|
for (var gA = 0; gA < 32; ++gA)
|
|
Ng[gA] = 5;
|
|
var SQ = /* @__PURE__ */ Tt(Vt, 9, 1), NQ = /* @__PURE__ */ Tt(Ng, 5, 1), Se = function(t) {
|
|
for (var A = t[0], e = 1; e < t.length; ++e)
|
|
t[e] > A && (A = t[e]);
|
|
return A;
|
|
}, bA = function(t, A, e) {
|
|
var g = A / 8 | 0;
|
|
return (t[g] | t[g + 1] << 8) >> (A & 7) & e;
|
|
}, Ne = function(t, A) {
|
|
var e = A / 8 | 0;
|
|
return (t[e] | t[e + 1] << 8 | t[e + 2] << 16) >> (A & 7);
|
|
}, Fg = function(t) {
|
|
return (t + 7) / 8 | 0;
|
|
}, St = function(t, A, e) {
|
|
return (A == null || A < 0) && (A = 0), (e == null || e > t.length) && (e = t.length), new EA(t.subarray(A, e));
|
|
}, FQ = [
|
|
"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
|
|
], pA = function(t, A, e) {
|
|
var g = new Error(A || FQ[t]);
|
|
if (g.code = t, Error.captureStackTrace && Error.captureStackTrace(g, pA), !e)
|
|
throw g;
|
|
return g;
|
|
}, Gg = function(t, A, e, g) {
|
|
var I = t.length, s = g ? g.length : 0;
|
|
if (!I || A.f && !A.l)
|
|
return e || new EA(0);
|
|
var B = !e, i = B || A.i != 2, Q = A.i;
|
|
B && (e = new EA(I * 3));
|
|
var C = function(yA) {
|
|
var MA = e.length;
|
|
if (yA > MA) {
|
|
var rA = new EA(Math.max(MA * 2, yA));
|
|
rA.set(e), e = rA;
|
|
}
|
|
}, a = A.f || 0, n = A.p || 0, o = A.b || 0, r = A.l, h = A.d, c = A.m, l = A.n, u = I * 8;
|
|
do {
|
|
if (!r) {
|
|
a = bA(t, n, 1);
|
|
var w = bA(t, n + 1, 3);
|
|
if (n += 3, w)
|
|
if (w == 1)
|
|
r = SQ, h = NQ, c = 9, l = 5;
|
|
else if (w == 2) {
|
|
var S = bA(t, n, 31) + 257, M = bA(t, n + 10, 15) + 4, p = S + bA(t, n + 5, 31) + 1;
|
|
n += 14;
|
|
for (var f = new EA(p), R = new EA(19), N = 0; N < M; ++N)
|
|
R[dQ[N]] = bA(t, n + N * 3, 7);
|
|
n += M * 3;
|
|
for (var m = Se(R), L = (1 << m) - 1, x = Tt(R, m, 1), N = 0; N < p; ) {
|
|
var G = x[bA(t, n, L)];
|
|
n += G & 15;
|
|
var D = G >> 4;
|
|
if (D < 16)
|
|
f[N++] = D;
|
|
else {
|
|
var U = 0, J = 0;
|
|
for (D == 16 ? (J = 3 + bA(t, n, 3), n += 2, U = f[N - 1]) : D == 17 ? (J = 3 + bA(t, n, 7), n += 3) : D == 18 && (J = 11 + bA(t, n, 127), n += 7); J--; )
|
|
f[N++] = U;
|
|
}
|
|
}
|
|
var P = f.subarray(0, S), T = f.subarray(S);
|
|
c = Se(P), l = Se(T), r = Tt(P, c, 1), h = Tt(T, l, 1);
|
|
} else
|
|
pA(1);
|
|
else {
|
|
var D = Fg(n) + 4, y = t[D - 4] | t[D - 3] << 8, d = D + y;
|
|
if (d > I) {
|
|
Q && pA(0);
|
|
break;
|
|
}
|
|
i && C(o + y), e.set(t.subarray(D, d), o), A.b = o += y, A.p = n = d * 8, A.f = a;
|
|
continue;
|
|
}
|
|
if (n > u) {
|
|
Q && pA(0);
|
|
break;
|
|
}
|
|
}
|
|
i && C(o + 131072);
|
|
for (var eA = (1 << c) - 1, z = (1 << l) - 1, _ = n; ; _ = n) {
|
|
var U = r[Ne(t, n) & eA], H = U >> 4;
|
|
if (n += U & 15, n > u) {
|
|
Q && pA(0);
|
|
break;
|
|
}
|
|
if (U || pA(2), H < 256)
|
|
e[o++] = H;
|
|
else if (H == 256) {
|
|
_ = n, r = null;
|
|
break;
|
|
} else {
|
|
var O = H - 254;
|
|
if (H > 264) {
|
|
var N = H - 257, W = dg[N];
|
|
O = bA(t, n, (1 << W) - 1) + Sg[N], n += W;
|
|
}
|
|
var $ = h[Ne(t, n) & z], Y = $ >> 4;
|
|
$ || pA(3), n += $ & 15;
|
|
var T = mQ[Y];
|
|
if (Y > 3) {
|
|
var W = fg[Y];
|
|
T += Ne(t, n) & (1 << W) - 1, n += W;
|
|
}
|
|
if (n > u) {
|
|
Q && pA(0);
|
|
break;
|
|
}
|
|
i && C(o + 131072);
|
|
var wA = o + O;
|
|
if (o < T) {
|
|
var CA = s - T, DA = Math.min(T, wA);
|
|
for (CA + o < 0 && pA(3); o < DA; ++o)
|
|
e[o] = g[CA + o];
|
|
}
|
|
for (; o < wA; ++o)
|
|
e[o] = e[o - T];
|
|
}
|
|
}
|
|
A.l = r, A.p = _, A.b = o, A.f = a, r && (a = 1, A.m = c, A.d = h, A.n = l);
|
|
} while (!a);
|
|
return o != e.length && B ? St(e, 0, o) : e.subarray(0, o);
|
|
}, GQ = /* @__PURE__ */ new EA(0), KA = function(t, A) {
|
|
return t[A] | t[A + 1] << 8;
|
|
}, TA = function(t, A) {
|
|
return (t[A] | t[A + 1] << 8 | t[A + 2] << 16 | t[A + 3] << 24) >>> 0;
|
|
}, Fe = function(t, A) {
|
|
return TA(t, A) + TA(t, A + 4) * 4294967296;
|
|
}, xQ = function(t) {
|
|
(t[0] != 31 || t[1] != 139 || t[2] != 8) && pA(6, "invalid gzip data");
|
|
var A = t[3], e = 10;
|
|
A & 4 && (e += (t[10] | t[11] << 8) + 2);
|
|
for (var g = (A >> 3 & 1) + (A >> 4 & 1); g > 0; g -= !t[e++])
|
|
;
|
|
return e + (A & 2);
|
|
}, Ge = /* @__PURE__ */ function() {
|
|
function t(A, e) {
|
|
typeof A == "function" && (e = A, A = {}), this.ondata = e;
|
|
var g = A && A.dictionary && A.dictionary.subarray(-32768);
|
|
this.s = { i: 0, b: g ? g.length : 0 }, this.o = new EA(32768), this.p = new EA(0), g && this.o.set(g);
|
|
}
|
|
return t.prototype.e = function(A) {
|
|
if (this.ondata || pA(5), this.d && pA(4), !this.p.length)
|
|
this.p = A;
|
|
else if (A.length) {
|
|
var e = new EA(this.p.length + A.length);
|
|
e.set(this.p), e.set(A, this.p.length), this.p = e;
|
|
}
|
|
}, t.prototype.c = function(A) {
|
|
this.s.i = +(this.d = A || !1);
|
|
var e = this.s.b, g = Gg(this.p, this.s, this.o);
|
|
this.ondata(St(g, e, this.s.b), this.d), this.o = St(g, this.s.b - 32768), this.s.b = this.o.length, this.p = St(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 kQ(t, A) {
|
|
return Gg(t, { i: 2 }, A && A.out, A && A.dictionary);
|
|
}
|
|
var xg = /* @__PURE__ */ function() {
|
|
function t(A, e) {
|
|
this.v = 1, this.r = 0, Ge.call(this, A, e);
|
|
}
|
|
return t.prototype.push = function(A, e) {
|
|
if (Ge.prototype.e.call(this, A), this.r += A.length, this.v) {
|
|
var g = this.p.subarray(this.v - 1), I = g.length > 3 ? xQ(g) : 4;
|
|
if (I > g.length) {
|
|
if (!e)
|
|
return;
|
|
} else this.v > 1 && this.onmember && this.onmember(this.r - g.length);
|
|
this.p = g.subarray(I), this.v = 0;
|
|
}
|
|
Ge.prototype.c.call(this, e), this.s.f && !this.s.l && !e && (this.v = Fg(this.s.p) + 9, this.s = { i: 0 }, this.o = new EA(0), this.push(new EA(0), e));
|
|
}, t;
|
|
}(), Le = typeof TextDecoder < "u" && /* @__PURE__ */ new TextDecoder(), RQ = 0;
|
|
try {
|
|
Le.decode(GQ, { stream: !0 }), RQ = 1;
|
|
} catch {
|
|
}
|
|
var UQ = function(t) {
|
|
for (var A = "", e = 0; ; ) {
|
|
var g = t[e++], I = (g > 127) + (g > 223) + (g > 239);
|
|
if (e + I > t.length)
|
|
return { s: A, r: St(t, e - 1) };
|
|
I ? I == 3 ? (g = ((g & 15) << 18 | (t[e++] & 63) << 12 | (t[e++] & 63) << 6 | t[e++] & 63) - 65536, A += String.fromCharCode(55296 | g >> 10, 56320 | g & 1023)) : I & 1 ? A += String.fromCharCode((g & 31) << 6 | t[e++] & 63) : A += String.fromCharCode((g & 15) << 12 | (t[e++] & 63) << 6 | t[e++] & 63) : A += String.fromCharCode(g);
|
|
}
|
|
};
|
|
function LQ(t, A) {
|
|
if (A) {
|
|
for (var e = "", g = 0; g < t.length; g += 16384)
|
|
e += String.fromCharCode.apply(null, t.subarray(g, g + 16384));
|
|
return e;
|
|
} else {
|
|
if (Le)
|
|
return Le.decode(t);
|
|
var I = UQ(t), s = I.s, e = I.r;
|
|
return e.length && pA(8), s;
|
|
}
|
|
}
|
|
var YQ = function(t, A) {
|
|
return A + 30 + KA(t, A + 26) + KA(t, A + 28);
|
|
}, JQ = function(t, A, e) {
|
|
var g = KA(t, A + 28), I = LQ(t.subarray(A + 46, A + 46 + g), !(KA(t, A + 8) & 2048)), s = A + 46 + g, B = TA(t, A + 20), i = e && B == 4294967295 ? bQ(t, s) : [B, TA(t, A + 24), TA(t, A + 42)], Q = i[0], C = i[1], a = i[2];
|
|
return [KA(t, A + 10), Q, C, I, s + KA(t, A + 30) + KA(t, A + 32), a];
|
|
}, bQ = function(t, A) {
|
|
for (; KA(t, A) != 1; A += 4 + KA(t, A + 2))
|
|
;
|
|
return [Fe(t, A + 12), Fe(t, A + 4), Fe(t, A + 20)];
|
|
};
|
|
function vQ(t, A) {
|
|
for (var e = {}, g = t.length - 22; TA(t, g) != 101010256; --g)
|
|
(!g || t.length - g > 65558) && pA(13);
|
|
var I = KA(t, g + 8);
|
|
if (!I)
|
|
return {};
|
|
var s = TA(t, g + 16), B = s == 4294967295 || I == 65535;
|
|
if (B) {
|
|
var i = TA(t, g - 12);
|
|
B = TA(t, i) == 101075792, B && (I = TA(t, i + 32), s = TA(t, i + 48));
|
|
}
|
|
for (var Q = A && A.filter, C = 0; C < I; ++C) {
|
|
var a = JQ(t, s, B), n = a[0], o = a[1], r = a[2], h = a[3], c = a[4], l = a[5], u = YQ(t, l);
|
|
s = c, (!Q || Q({
|
|
name: h,
|
|
size: o,
|
|
originalSize: r,
|
|
compression: n
|
|
})) && (n ? n == 8 ? e[h] = kQ(t.subarray(u, u + o), { out: new EA(r) }) : pA(14, "unknown compression type " + n) : e[h] = St(t, u, u + o));
|
|
}
|
|
return e;
|
|
}
|
|
let jA;
|
|
const kg = typeof TextDecoder < "u" ? new TextDecoder("utf-8", { ignoreBOM: !0, fatal: !0 }) : { decode: () => {
|
|
throw Error("TextDecoder not available");
|
|
} };
|
|
typeof TextDecoder < "u" && kg.decode();
|
|
let Jt = null;
|
|
function TQ() {
|
|
return (Jt === null || Jt.byteLength === 0) && (Jt = new Uint8Array(jA.memory.buffer)), Jt;
|
|
}
|
|
function HQ(t, A) {
|
|
return t = t >>> 0, kg.decode(TQ().subarray(t, t + A));
|
|
}
|
|
function KQ(t, A, e, g, I, s, B, i, Q, C, a, n, o) {
|
|
return jA.raycast_splats(t, A, e, g, I, s, B, i, Q, C, a, n, o);
|
|
}
|
|
async function qQ(t, A) {
|
|
if (typeof Response == "function" && t instanceof Response) {
|
|
if (typeof WebAssembly.instantiateStreaming == "function")
|
|
try {
|
|
return await WebAssembly.instantiateStreaming(t, A);
|
|
} catch (g) {
|
|
if (t.headers.get("Content-Type") != "application/wasm")
|
|
console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", g);
|
|
else
|
|
throw g;
|
|
}
|
|
const e = await t.arrayBuffer();
|
|
return await WebAssembly.instantiate(e, A);
|
|
} else {
|
|
const e = await WebAssembly.instantiate(t, A);
|
|
return e instanceof WebAssembly.Instance ? { instance: e, module: t } : e;
|
|
}
|
|
}
|
|
function zQ() {
|
|
const t = {};
|
|
return t.wbg = {}, t.wbg.__wbg_buffer_609cc3eee51ed158 = function(A) {
|
|
return A.buffer;
|
|
}, t.wbg.__wbg_length_3b4f022188ae8db6 = function(A) {
|
|
return A.length;
|
|
}, t.wbg.__wbg_length_6ca527665d89694d = function(A) {
|
|
return A.length;
|
|
}, t.wbg.__wbg_length_8cfd2c6409af88ad = function(A) {
|
|
return A.length;
|
|
}, t.wbg.__wbg_new_9fee97a409b32b68 = function(A) {
|
|
return new Uint16Array(A);
|
|
}, t.wbg.__wbg_new_e3b321dcfef89fc7 = function(A) {
|
|
return new Uint32Array(A);
|
|
}, t.wbg.__wbg_newwithbyteoffsetandlength_e6b7e69acd4c7354 = function(A, e, g) {
|
|
return new Float32Array(A, e >>> 0, g >>> 0);
|
|
}, t.wbg.__wbg_newwithbyteoffsetandlength_f1dead44d1fc7212 = function(A, e, g) {
|
|
return new Uint32Array(A, e >>> 0, g >>> 0);
|
|
}, t.wbg.__wbg_newwithlength_5a5efe313cfd59f1 = function(A) {
|
|
return new Float32Array(A >>> 0);
|
|
}, t.wbg.__wbg_set_10bad9bee0e9c58b = function(A, e, g) {
|
|
A.set(e, g >>> 0);
|
|
}, t.wbg.__wbg_set_d23661d19148b229 = function(A, e, g) {
|
|
A.set(e, g >>> 0);
|
|
}, t.wbg.__wbg_set_f4f1f0daa30696fc = function(A, e, g) {
|
|
A.set(e, g >>> 0);
|
|
}, t.wbg.__wbg_subarray_3aaeec89bb2544f0 = function(A, e, g) {
|
|
return A.subarray(e >>> 0, g >>> 0);
|
|
}, t.wbg.__wbg_subarray_769e1e0f81bb259b = function(A, e, g) {
|
|
return A.subarray(e >>> 0, g >>> 0);
|
|
}, t.wbg.__wbindgen_init_externref_table = function() {
|
|
const A = jA.__wbindgen_export_0, e = A.grow(4);
|
|
A.set(0, void 0), A.set(e + 0, void 0), A.set(e + 1, null), A.set(e + 2, !0), A.set(e + 3, !1);
|
|
}, t.wbg.__wbindgen_memory = function() {
|
|
return jA.memory;
|
|
}, t.wbg.__wbindgen_throw = function(A, e) {
|
|
throw new Error(HQ(A, e));
|
|
}, t;
|
|
}
|
|
function ZQ(t, A) {
|
|
return jA = t.exports, Rg.__wbindgen_wasm_module = A, Jt = null, jA.__wbindgen_start(), jA;
|
|
}
|
|
async function Rg(t) {
|
|
if (jA !== void 0) return jA;
|
|
typeof t < "u" && (Object.getPrototypeOf(t) === Object.prototype ? { module_or_path: t } = t : console.warn("using deprecated parameters for the initialization function; pass a single object instead")), typeof t > "u" && (t = new URL("data:application/wasm;base64,AGFzbQEAAAAB9AEjYAJ/fwF/YAN/f38Bf2ACf38AYAN/f38AYAF/AX9gAX8AYAV/f39/fwBgA29/fwFvYAV/f39/fwF/YAR/f39/AGABbwFvYANvb38AYAFvAX9gAAF/YAAAYAd/f39/f39/AX9gAX0BfWAGf39/f39/AGAEf39/fwF/YAN/b28Bf2ABfwFvYAABb2AHf39/f39/fwBgAn9+AX9gA39+fgBgDX19fX19fX19f29/fX0Bb2AGf39/f39/AX9gBX9/fX9/AGAEf31/fwBgBX9/fn9/AGAEf35/fwBgBX9/fH9/AGAEf3x/fwBgA39+fgF/YAJ9fQF9AvIEEQN3YmcdX193YmdfYnVmZmVyXzYwOWNjM2VlZTUxZWQxNTgACgN3YmcaX193YmdfbmV3XzlmZWU5N2E0MDliMzJiNjgACgN3YmcaX193Ymdfc2V0X2Y0ZjFmMGRhYTMwNjk2ZmMACwN3YmcdX193YmdfbGVuZ3RoXzhjZmQyYzY0MDlhZjg4YWQADAN3YmcxX193YmdfbmV3d2l0aGJ5dGVvZmZzZXRhbmRsZW5ndGhfZjFkZWFkNDRkMWZjNzIxMgAHA3diZxpfX3diZ19uZXdfZTNiMzIxZGNmZWY4OWZjNwAKA3diZxpfX3diZ19zZXRfZDIzNjYxZDE5MTQ4YjIyOQALA3diZx1fX3diZ19sZW5ndGhfNmNhNTI3NjY1ZDg5Njk0ZAAMA3diZzFfX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9lNmI3ZTY5YWNkNGM3MzU0AAcDd2JnGl9fd2JnX3NldF8xMGJhZDliZWUwZTljNThiAAsDd2JnHV9fd2JnX2xlbmd0aF8zYjRmMDIyMTg4YWU4ZGI2AAwDd2JnH19fd2JnX3N1YmFycmF5Xzc2OWUxZTBmODFiYjI1OWIABwN3YmcfX193Ymdfc3ViYXJyYXlfM2FhZWVjODliYjI1NDRmMAAHA3diZyRfX3diZ19uZXd3aXRobGVuZ3RoXzVhNWVmZTMxM2NmZDU5ZjEAFAN3YmcQX193YmluZGdlbl90aHJvdwACA3diZxFfX3diaW5kZ2VuX21lbW9yeQAVA3diZx9fX3diaW5kZ2VuX2luaXRfZXh0ZXJucmVmX3RhYmxlAA4DwQG/AQQAAAYABAIEAQAP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QTBqECcNAgsgCSgCAEGcncAAQQEQlwENASACKAIAQQJGDQBBASEBIANBAXFFDQAjAEFAaiIDJAAgAyAENgIMAkAgCS0AEEEBRgRAIAkoAgAhCCADQoCAgICgATcDGCADQZSbwAA2AiggA0KUm8CAwAY3AxBBASEEIANBATYCPCADQfiewAA2AjggA0EBNgIsIANBAjYCNCAIQQRqKAIAIQogAyADQRBqNgIwIAgoAgAgCiADQShqECcNAQsgCSgCACIEKAIAQZafwABBECAEQQRqKAIAKAIMEQEABEBBASEEDAELIAkoAgQgCSgCCCEKIANBNGogAkEIaigCADYCACADIAkoAgAiCzYCKCADIAIpAgA3AixBASEEIAsgA0EsaiAKKAIQEQEADQAgCSgCACECIAMgA0EMaq1CgICAgBCENwMQIANBATYCLCADQaifwAA2AiggA0IBNwI0IAJBBGooAgAhCCADIANBEGoiCjYCMCACKAIAIAggA0EoaiIIECcNACAFQQFxBEAgAyAGNgIkIAkoAgAhAiADIANBJGqtQoCAgIAQhDcDECADQQE2AiwgA0Gon8AANgIoIANCATcCNCACQQRqKAIAIQUgAyAKNgIwIAIoAgAgBSAIECcNAQsgCSgCACICKAIAQZydwABBASACQQRqKAIAKAIMEQEAIQQLIANBQGskACAEDQILIAAgDEEBajYCBEEAIQEMAQtBASEBCyAHQdAAaiQAIAELmwcCDH8BfiMAQTBrIgEkAAJAAkAgACgCAEUEQCAAKAIQIgBFDQFBpazAAEEBIAAQyAEhAwwCCyABQQxqIAAQRwJAAn8gASgCDCICRQRAIAEtABAhAiAAKAIQIgYEQEEBIQNBjKzAAEH8q8AAIAJBAXEiBxtBGUEQIAcbIAYQyAENBQsgACACOgAEQQAMAQsCQCABKAIQIgNBAXENACABQoCAgIAgNwIYIAEgAjYCDCABIAM2AhAgASACIANqIgo2AhQDQAJAIAFBDGoQGEGAgMQAaw4CAgABCwsgACgCECILRQ0DIAtBIhCYAQ0CIAFCgICAgCA3AhggASAKNgIUIAEgAzYCECABIAI2AgwgAUEoaiEMA0ACQAJAAkACQAJ/An8CQAJAAkACQAJAAkACQCABQQxqEBgiAkGBgMQARwRAIAJBgIDEAEYNCiACQSdGDQsg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aiADcgwCC0ECQQJB2InAABBqAAsgASABZ0EQayIBQf//A3FBCGp0Qf///wNxIANBgICA2ANyIAFBF3Rrcgs2AgggACAENgIEIAAgBTYCAAuWBAEEfyMAQYABayIEJAACQAJAAkAgASgCCCICQYCAgBBxRQRAIAJBgICAIHENAUEBIQIgACgCACABEDJFDQIMAwsgACgCACECA0AgAyAEakH/AGogAkEPcSIFQTByIAVB1wBqIAVBCkkbOgAAIANBAWshAyACQRBJIAJBBHYhAkUNAAtBASECIAFBv77AAEECIAMgBGpBgAFqQQAgA2sQIUUNAQwCCyAAKAIAIQIDQCADIARqQf8AaiACQQ9xIgVBMHIgBUE3aiAFQQpJGzoAACADQQFrIQMgAkEPSyACQQR2IQINAAtBASECIAFBv77AAEECIAMgBGpBgAFqQQAgA2sQIQ0BCyABKAIAQau7wABBAiABKAIEKAIMEQEADQACQCABKAIIIgJBgICAEHFFBEAgAkGAgIAgcQ0BIAAoAgQgARAyIQIMAgsgACgCBCECQQAhAwNAIAMgBGpB/wBqIAJBD3EiAEEwciAAQdcAaiAAQQpJGzoAACADQQFrIQMgAkEPSyACQQR2IQINAAsgAUG/vsAAQQIgAyAEakGAAWpBACADaxAhIQIMAQsgACgCBCECQQAhAwNAIAMgBGpB/wBqIAJBD3EiAEEwciAAQTdqIABBCkkbOgAAIANBAWshAyACQQ9LIAJBBHYhAg0ACyABQb++wABBAiADIARqQYABakEAIANrECEhAgsgBEGAAWokACACC7oEAQh/IwBBEGsiAyQAIAMgATYCBCADIAA2AgAgA0KggICADjcCCAJ/AkACQAJAIAIoAhAiCQRAIAIoAhQiAA0BDAILIAIoAgwiAEUNASACKAIIIgEgAEEDdGohBCAAQQFrQf////8BcUEBaiEGIAIoAgAhAANAAkAgAEEEaigCACIFRQ0AIAMoAgAgACgCACAFIAMoAgQoAgwRAQBFDQBBAQwFC0EBIAEoAgAgAyABQQRqKAIAEQAADQQaIABBCGohACAEIAFBCGoiAUcNAAsMAgsgAEEYbCEKIABBAWtB/////wFxQQFqIQYgAigCCCEEIAIoAgAhAANAAkAgAEEEaigCACIBRQ0AIAMoAgAgACgCACABIAMoAgQo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1MAAIAE2AgBB9NTAAEEBNgIAQfzUwAAgACkDCDcCAEGE1cAAIABBEGopAwA3AgALIABBMGokAEH41MAADwsgAEEANgIoIABBATYCHCAAQcyVwAA2AhggAEIENwIgIABBGGpBtJbAABCBAQALIABBKGogAikDADcCACAAIAApAwg3AiAgACABNgIcIABBATYCGAJAIABBGGoiASgCAEUNACABKAIEIgJFDQAgASgCCCACQQJ0QQQQrQELIABBADYCKCAAQQE2AhwgAEHUlsAANgIYIABCBDcCICABQdyWwAAQgQEAC50CAQV/AkACQAJAAkAgAkEDakF8cSIEIAJGDQAgAyAEIAJrIgQgAyAESRsiBUUNAEEAIQQgAUH/AXEhBkEBIQcDQCACIARqLQAAIAZGDQQgBSAEQQFqIgRHDQALIAUgA0EIayIISw0CDAELIANBCGshCEEAIQULIAFB/wFxQYGChAhsIQQDQEGAgoQIIAIgBWoiBygCACAEcyIGayAGckGAgoQIIAdBBGooAgAgBHMiBmsgBnJxQYCBgoR4cUGAgYKEeEcNASAFQQhqIgUgCE0NAAsLIAMgBUcEQCABQf8BcSEEQQEhBwNAIAQgAiAFai0AAEYEQCAFIQQMAwsgAyAFQQFqIgVHDQALC0EAIQcLIAAgBDYCBCAAIAc2AgALhgIBA38jAEGAAWsiBCQAIAAoAgAhAAJ/AkAgASgCCCICQYCAgBBxRQRAIAJBgICAIHENASAAKAIAIAEQMgwCCyAAKAIAIQBBACECA0AgAiAEakH/AGogAEEPcSIDQTByIANB1wBqIANBCkkbOgAAIAJBAWshAiAAQQ9LIABBBHYhAA0ACyABQb++wABBAiACIARqQYABakEAIAJrECEMAQsgACgCACEAQQAhAgNAIAIgBGpB/wBqIABBD3EiA0EwciADQTdqIANBCkkbOgAAIAJBAWshAiAAQQ9LIABBBHYhAA0ACyABQb++wABBAiACIARqQYABakEAIAJrECELIARBgAFqJAAL/AECBH8BfiMAQSBrIgUkAAJAAkAgBEUNACABIAEgAmoiAksNACADIARqQQFrQQAgA2txrSACIAAoAgAiAUEBdCIGIAIgBksbIgJBCEEEQQEgBEGBCEkbIARBAUYbIgYgAiAGSxsiBq1+IglCIIhQRQ0AIAmnIghBgICAgHggA2tLDQBBACECIAUgAQR/IAUgASAEbDYCHCAFIAAoAgQ2AhQgAwUgAgs2AhggBUEIaiADIAggBUEUahBcIAUoAghBAUcNASAFKAIQIQIgBSgCDCEHCyAHIAJB0IDAABCQAQALIAUoAgwhASAAIAY2AgAgACABNgIEIAVBIGokAAvKAQIEfwF+IwBBIGsiAyQAAkACQCABIAEgAmoiAksNAEEIIAIgACgCACIBQQF0IgQgAiAESxsiAiACQQhNGyIErSIHQiCIUEUNACAHpyIFQf////8HSw0AIAMgAQR/IAMgATYCHCADIAAoAgQ2AhRBAQVBAAs2AhggA0EIakEBIAUgA0EUahBcIAMoAghBAUcNASADKAIQIQIgAygCDCEGCyAGIAJB8I/AABCQAQALIAMoAgwhASAAIAQ2AgAgACABNgIEIANBIGokAAuLAgEBfyMAQRBrIgIkACAAKAIAIQACfyABLQALQRhxRQRAIAEoAgAgACABKAIEKAIQEQAADAELIAJBADYCDCABIAJBDGoCfwJAIABBgAFPBEAgAEGAEEkNASAAQYCABE8EQCACIABBP3FBgAFyOgAPIAIgAEESdkHwAXI6AAwgAiAAQQZ2QT9xQYABcjoADiACIABBDHZBP3FBgAFyOgANQQQMAwsgAiAAQT9xQYABcjoADiACIABBDHZB4AFyOgAMIAIgAEEGdkE/cUGAAXI6AA1BAwwCCyACIAA6AAxBAQwBCyACIABBP3FBgAFyOgANIAIgAEEGdkHAAXI6AAxBAgsQJAsgAkEQaiQAC6oCAgN/AX4jAEFAaiICJAAgASgCAEGAgICAeEYEQCABKAIMIQMgAkEkaiIEQQA2AgAgAkKAgICAEDcCHCACQTBqIAMoAgAiA0EIaikCADcDACACQThqIANBEGopAgA3AwAgAiADKQIANwMoIAJBHGpB5JfAACACQShqECcaIAJBGGogBCgCACIDNgIAIAIgAikCHCIFNwMQIAFBCGogAzYCACABIAU3AgALIAEpAgAhBSABQoCAgIAQNwIAIAJBCGoiAyABQQhqIgEoAgA2AgAgAUEANgIAQZLWwAAtAAAaIAIgBTcDAEEMQQQQogEiAUUEQEEEQQwQxgEACyABIAIpAwA3AgAgAUEIaiADKAIANgIAIABBoJ3AADYCBCAAIAE2AgAgAkFAayQAC/kBAQl/IAEoAggiAiABKAIEIgMgAiADSxshCCABKAIAIQVBfyEGIAIhBAJAAkADQCAEIAhGDQEgASAEQQFqIgk2AgggBkEBaiEGIAQgBWotAAAiB0HhAGshCiAJIQQgB0Ewa0H/AXFBCkkgCkH/AXFBBklyDQALIAdB3wBHDQACQCACIARBAWsiAUsNACACBEAgAiADTwRAIAIgA0cNAiABIANNDQQMAgsgAiAFaiwAAEFASCABIANLcg0BDAMLIAEgA00NAgsgBSADIAIgAUGsq8AAEJoBAAsgAEEANgIAIABBADoABA8LIAAgBjYCBCAAIAIgBWo2AgAL1QECBH8BfiMAQSBrIgMkAAJAAkAgASABIAJqIgJLBEBBACEBDAELQQAhAUEIIAIgACgCACIFQQF0IgQgAiAESxsiAiACQQhNGyIErSIHQiCIUEUNACAHpyIGQf////8HSw0AIAMgBQR/IAMgBTYCHCADIAAoAgQ2AhRBAQVBAAs2AhggA0EIakEBIAYgA0EUahBcIAMoAghBAUcNASADKAIQIQIgAygCDCEBCyABIAJB0JfAABCQAQALIAMoAgwhASAAIAQ2AgAgACABNgIEIANBIGokAAuAAgEEfyMAQRBrIgJBCGpBADoAACACQQA7AQYgAiABQRR2QZiiwABqLQAAOgAJIAIgAUEEdkEPcUGYosAAai0AADoADSACIAFBCHZBD3FBmKLAAGotAAA6AAwgAiABQQx2QQ9xQZiiwABqLQAAOgALIAIgAUEQdkEPcUGYosAAai0AADoACiABQQFyZ0ECdiIDIAJBBmoiBWoiBEH7ADoAACAEQQFrQfUAOgAAIAUgA0ECayIDakHcADoAACACQQ5qIgQgAUEPcUGYosAAai0AADoAACAAQQo6AAsgACADOgAKIAAgAikBBjcAACACQf0AOgAPIABBCGogBC8BADsAAAvhAQEBfyMAQRBrIgIkACACQQA2AgwgACACQQxqAn8CQCABQYABTwRAIAFBgBBJDQEgAUGAgARPBEAgAiABQT9xQYABcjoADyACIAFBEnZB8AFyOgAMIAIgAUEGdkE/cUGAAXI6AA4gAiABQQx2QT9xQYABcjoADUEEDAMLIAIgAUE/cUGAAXI6AA4gAiABQQx2QeABcjoADCACIAFBBnZBP3FBgAFyOgANQQMMAgsgAiABOgAMQQEMAQsgAiABQT9xQYABcjoADSACIAFBBnZBwAFyOgAMQQILECkgAkEQaiQAC+EBAQF/IwBBEGsiAiQAIAJBADYCDCAAIAJBDGoCfwJAIAFBgAFPBEAgAUGAEEkNASABQYCABE8EQCACIAFBP3FBgAFyOgAPIAIgAUESdkHwAXI6AAwgAiABQQZ2QT9xQYABcjoADiACIAFBDHZBP3FBgAFyOgANQQQMAwsgAiABQT9xQYABcjoADiACIAFBDHZB4AFyOgAMIAIgAUEGdkE/cUGAAXI6AA1BAwwCCyACIAE6AAxBAQwBCyACIAFBP3FBgAFyOgANIAIgAUEGdkHAAXI6AAxBAgsQdyACQRBqJAAL5wEBB38gACgCCCIFBEAgACgCBCEGA0AgBiACQQxsaiIDKAIIIgQEQCADKAIEQSRqIQADQCAAQQRrKAIAIgFBgICAgHhGIAFFckUEQCAAKAIAIAFBARCtAQsCQCAAQRRrKAIAIgdBAkYNACAAQRBrIQEgB0UEQCABKAIAIgFFDQEgAEEMaygCACABQQEQrQEMAQsgASgCACIBRQ0AIABBDGsoAgAgAUEBdEECEK0BCyAAQSxqIQAgBEEBayIEDQALCyADKAIAIgAEQCADKAIEIABBLGxBBBCtAQsgAkEBaiICIAVHDQALCwvmAQEDfyMAQRBrIgMkACADAn8gAigCAEEBcQRAQbScwAAhBEEJDAELIANBBGogAigCBCACKAIIECJBtJzAACADKAIIIAMoAgQiAhshBEEJIAMoAgwgAhsLNgIIIAMgBDYCBCADQQRqIAEQWwJAIAAoAgAiAUGAgICAeEcEQCABRQ0BIAAoAgQgAUEBEK0BDAELIAAtAARBA0cNACAAKAIIIgAoAgAhASAAQQRqKAIAIgIoAgAiBQRAIAEgBREFAAsgAigCBCIFBEAgASAFIAIoAggQrQELIABBDEEEEK0BCyADQRBqJAAL9AEBA38jAEEgayICJAAgAkEIaiIDIAFBJGooAgA2AgBBktbAAC0AABogAiABKQIcNwMAQQxBBBCiASIEBEAgBCACKQMANwIAIARBCGogAygCADYCAAJAIAEoAgQiA0EDRiADQQJJcg0AAkACQCABLQAYQQFrDgICAAELIAJBATYCBCACQZSIwAA2AgAgAkIANwIMIAIgAkEcajYCCCACQfiIwAAQgQEACyABQQhqEEwgASgCCCIDRQ0AIAEoAgwgA0EMbEEEEK0BCyABQShBBBCtASAAQdSGwAA2AgQgACAENgIAIAJBIGokAA8LQQRBDBDGAQALoAQCBX8BfiMAQRBrIgMkAAJ/IAAoAgBBAkcEQCMAQUBqIgIkAEEBIQQCQAJAAn8CQCAAKAIAQQFGBEAgAiAAQQRqNgIIIAEoAgggAiABNgIUIAJCgICAgIDI0Ac3AgwgAkEIaq1CgICAgMAJhCEHQYCAgARxDQEgAkEBNgIcIAJB/K3AADYCGCACQgE3AiQgAiAHNwMwIAIgAkEwajYCICACQQxqQbijwAAgAkEYahAnDAILIAEgACgCECAAKAIUEJcBDQMMAgsgAkEBNgIsIAJBhK7AADYCKCACQQE2AhwgAkH8rcAANgIYIAJBATYCJCACIAc3AzAgAiACQTBqNgIgIAJBDGpBuKPAACACQRhqECcLIgVBACACKAIMIgYbRQRAIAUNAiAGRQ0BQcCuwABBNyACQT9qQbCuwABB+K7AABBnAAsgAUGcrsAAQRQQlwENAQsgASAAKAIYIAAoAhwQlwEhBAsgAkFAayQAIAQMAQsCQAJAAkAgACgCJCICRQ0AIAAoAiAhAANAIANBBGogACACECICQCADKAIEQQFGBEAgAy0ADSEEIAMtAAwhBSADKAIIIQZBvZzAAEEDIAEQyAFFDQEMBQsgAygCCCADKAIMIAEQyAENBAwCCyAFQQFxRQ0BIAIgBCAGaiIESQ0CIAAgBGohACACIARrIgINAAsLQQAMAgsgBCACQayewAAQrwEAC0EBCyADQRBqJAALlQIBAn8jAEEgayIFJABBsNbAAEGw1sAAKAIAIgZBAWo2AgACf0EAIAZBAEgNABpBAUH82cAALQAADQAaQfzZwABBAToAAEH42cAAQfjZwAAoAgBBAWo2AgBBAgtB/wFxIgZBAkcEQCAGQQFxBEAgBUEIaiAAIAEoAhgRAgALAAsCQEGk1sAAKAIAIgZBAE4EQEGk1sAAIAZBAWo2AgBBqNbAACgCAARAIAUgACABKAIUEQIAIAUgBDoAHSAFIAM6ABwgBSACNgIYIAUgBSkDADcCEEGo1sAAKAIAIAVBEGpBrNbAACgCACgCFBECAAtBpNbAAEGk1sAAKAIAQQFrNgIAQfzZwABBADoAACADRQ0BAAsACwALuwEBAn8jAEEgayIDJAACQAJ/QQAgASABIAJqIgJLDQAaQQBBCCACIAAoAgAiAUEBdCIEIAIgBEsbIgIgAkEITRsiBEEASA0AGkEAIQIgAyABBH8gAyABNgIcIAMgACgCBDYCFEEBBSACCzYCGCADQQhqQQEgBCADQRRqEFwgAygCCEEBRw0BIAMoAhAhACADKAIMCyAAQfCxwAAQkAEACyADKAIMIQEgACAENgIAIAAgATYCBCADQSBqJAAL2QEAIABBIEkEQEEADwsgAEH/AEkEQEEBDwsgAEGAgARPBEAgAEGAgAhPBEAgAEHg//8AcUHgzQpHIABB/v//AHFBnvAKR3EgAEHA7gprQXpJcSAAQbCdC2tBcklxIABB8NcLa0FxSXEgAEGA8AtrQd5sSXEgAEGAgAxrQZ50SXEgAEHQpgxrQXtJcSAAQYCCOGtBsMVUSXEgAEHwgzhJcQ8LIABBiMfAAEEsQeDHwABB0AFBsMnAAEHmAxA5DwsgAEGWzcAAQShB5s3AAEGiAkGI0MAAQakCEDkLuwEBBX8jAEEgayICJAAgACgCACIEQf////8BSwRAQQBBACABEJABAAsCQEEEIARBAXQiBSAFQQRNGyIFQQJ0IgZB/P///wdNBH8gAiAEBH8gAiAEQQJ0NgIcIAIgACgCBDYCFEEEBSADCzYCGCACQQhqQQQgBiACQRRqEFwgAigCCEEBRw0BIAIoAhAhAyACKAIMBSADCyADIAEQkAEACyACKAIMIQEgACAFNgIAIAAgATYCBCACQSBqJAALyAECA38BfiMAQRBrIgQkAAJAIAAoAhAiA0UEQAwBC0EBIQJBpqzAAEEBIAMQyAENACABUARAQaarwABBASADEMgBIQIMAQsCQCABIAA1AhQiBVgEQCAFIAF9IgFCGlQNAUGmq8AAQQEgAxDIAQ0CIAQgATcDCCAEQQhqIAMQtAEhAgwCC0H8q8AAQRAgAxDIAQ0BQQAhAiAAQQA6AAQgAEEANgIADAELIAQgAadB4QBqNgIEIARBBGogAxBFIQILIARBEGokACACC8EBAgN/AX4jAEEwayICJAAgASgCAEGAgICAeEYEQCABKAIMIQMgAkEUaiIEQQA2AgAgAkKAgICAEDcCDCACQSBqIAMoAgAiA0EIaikCADcDACACQShqIANBEGopAgA3AwAgAiADKQIANwMYIAJBDGpB5JfAACACQRhqECcaIAJBCGogBCgCACIDNgIAIAIgAikCDCIFNwMAIAFBCGogAzYCACABIAU3AgALIABBoJ3AADYCBCAAIAE2AgAgAkEwaiQAC7IBAQZ/AkACQCAAQYQBSQ0AIADQbyYBEEAiASgCDCEFIAEoAhAhAiABQgA3AgwgASgCCCEDIAEoAgQhBCABQgQ3AgQgASgCACEGIAFBADYCACAAIAJJDQEgACACayIAIANPDQEgBCAAQQJ0aiAFNgIAIAEgAjYCECABIAA2AgwgASADNgIIIAEoAgQgASAENgIEIAEoAgAhACABIAY2AgAgAEUNACAAQQJ0QQQQrQELDwsAC9EDAgx/AX4jAEEgayIEJAAgBEEYaiIJEEAiBUEQaiIHKAIANgIAIARBEGoiCiAFQQhqIggpAgA3AwAgB0EANgIAIAhCADcCACAFKQIAIQwgBUKAgICAwAA3AgAgBCAMNwMIAn8jAEEgayIDJAACQAJAIARBCGoiACgCDCIBIAAoAggiAkYEQAJAIAAoAgAiAiABRgRA0G9BgAEgASABQYABTRsiBvwPASICQX9GDQQCQCAAKAIQIgtFBEAgACACNgIQDAELIAEgC2ogAkcNBQsgASAGaiICQf////8BSw0EIAMgAQR/IAMgAUECdDYCHCADIAAoAgQ2AhRBBAVBAAs2AhggA0EIakEEIAJBAnQgA0EUahBcIAMoAghBAUYNBCADKAIMIQYgACACNgIAIAAgBjYCBAwBCyABIAJPDQMLIAAgAUEBaiICNgIIIAAoAgQgAUECdGogAjYCAAwBCyABIAJPDQELIAAgACgCBCABQQJ0aigCADYCDCAAKAIQIANBIGokACABagwBCwALIAggCikDADcCACAHIAkoAgA2AgAgBSgCBCEDIAUoAgAhASAFIAQpAwg3AgAgAQRAIAMgAUECdEEEEK0BCyAEQSBqJAALuAEBA38gASgCDCECAkACQAJAAkACQAJAIAEoAgQOAgABAgsgAg0BQQEhA0EAIQFBASECDAMLIAJFDQELIAAgARAwDwsgASgCACICKAIEIgFBAEgNASACKAIAIQMgAUUEQEEBIQJBACEBDAELQZLWwAAtAAAaQQEhBCABQQEQogEiAkUNAQsgAQRA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AgQgJUECdGogDTgCACArICVBAWo2AggLIAogLEECdGohCiAnICxrIicNAAsLICpBEGokACAmKAIUIgpBhAFPBEAgChBWCyApIicgLUkNAAsLQYTWwAAoAgBBAWohJSAmKAIQIScLQYTWwAAgJTYCACAnEA0hCRBXIgggCSYBICYgCDYCJCAmKAIMIScgJigCECElIwBBIGsiKCQAICZBJGooAgAiCiUBEAohKSAoICU2AgQgKCApNgIAAkAgJSApRgRAEJsBIi0QkwEiKSUBICcgJRAIIQkQVyInIAkmASAtQYQBTwRAIC0QVgsgKUGEAU8EQCApEFYLIAolASAnJQFBABAJICdBhAFPBEAgJxBWCyAoQSBqJAAMAQsgKEEANgIIICggKEEEaiAoQQhqEH0ACyAmKAIIIgoEQCAmKAIMIApBAnRBBBCtAQsgJigCBCIKQYQBTwRAIAoQVgsgJkEwaiQAIAgMAgsQbwALICcgLkGMhsAAELABAAsiCCUBIAgQVguxAgEEfyMAQSBrIgQkACAEQQhqIQMjAEEgayICJAACQAJAAkACQAJAAkBBnNbAAC0AAA4CAAECC0Gc1sAAQQE6AAALIANBATYCAAwBC0Gd1sAALQAAIQFBndbAAEEBOgAAIAIgAToAByABQQFGDQEgA0EAOgAUIANBADYCAEGd1sAAQQA6AAALIAJBIGokAAwBCyACQgA3AhQgAkKBgICAwAA3AgwgAkG8m8AANgIIIAJBB2ogAkEIahB7AAtBktbAAC0AABpBKEEEEKIBIgFFBEBBBEEoEMYBAAsgAUG8h8AANgIAIAEgAykCADcCBCABIAApAgA3AhwgAUEMaiADQQhqKQIANwIAIAFBFGogA0EQaikCADcCACABQSRqIABBCGooAgA2AgAgBEEgaiQAIAEL+gECAn8BfiMAQRBrIgIkACACQQE7AQwgAiABNgIIIAIgADYCBCMAQRBrIgEkACACQQRqIgApAgAhBCABIAA2AgwgASAENwIEIwBBEGsiACQAIAFBBGoiASgCACICKAIMIQMCQAJAAkACQCACKAIEDgIAAQILIAMNAUEBIQJBACEDDAILIAMNACACKAIAIgIoAgQhAyACKAIAIQIMAQsgAEGAgICAeDYCACAAIAE2AgwgAEHcncAAIAEoAgQgASgCCCIALQAIIAAtAAkQ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OTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9zdGQvc3JjL3N5cy9zeW5jL29uY2Uvbm9fdGhyZWFkcy5ycwAcBBAAWwAAADUAAAASAAAAc3BhcmstaW50ZXJuYWwtcnMvc3JjL3JheWNhc3QucnOIBBAAIAAAACoAAAAXAAAAiAQQACAAAAB4AAAAFwAAAIgEEAAgAAAAfgAAABwAAACIBBAAIAAAAIAAAAAcAAAAiAQQACAAAACFAAAAIAAAAC9ydXN0Yy82YjAwYmMzODgwMTk4NjAwMTMwZTFjZjYyYjhmOGE5MzQ5NDQ4OGNjL2xpYnJhcnkvYWxsb2Mvc3JjL3ZlYy9tb2QucnP4BBAATAAAAFYKAAAkAAAAAAAAABAAAAAEAAAAGQAAABoAAAAbAAAAICAgIDogAAABAAAAAAAAAHAFEAACAAAAAgBBjovAAAsBBQBBmIvAAAshIAAAqCAgICAgICAAHgAAAAwAAAAEAAAAHwAAACAAAAAhAEHEi8AAC7kOAQAAACIAAABhIERpc3BsYXkgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3IgdW5leHBlY3RlZGx5L3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzAAADBhAASwAAAPAKAAAOAAAARXJyb3Jhc3NlcnRpb24gZmFpbGVkOiBzZWxmLmlzX2NoYXJfYm91bmRhcnkobmV3X2xlbikAAAADBhAASwAAALUFAAANAAAAAAAAABAAAAAEAAAAGQAAABoAAAAbAAAAYmFja3RyYWNlIGNhcHR1cmUgZmFpbGVkL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYW55aG93LTEuMC45OC9zcmMvZXJyb3IucnPYBhAAXAAAAGcEAAAOAAAAAQAAAAAAAAA6IAAATAcQAAIAAAAKCkNhdXNlZCBieToKAAAAZAcQAAEAAAAKCnN0YWNrIGJhY2t0cmFjZTpTdGFjayBiYWNrdHJhY2U6CgCCBxAAEQAAAFMvcnVzdGMvNmIwMGJjMzg4MDE5ODYwMDEzMGUxY2Y2MmI4ZjhhOTM0OTQ0ODhjYy9saWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjL21vZC5ycwAAAJ0HEABQAAAALgIAABEAAAAvcnVzdGMvNmIwMGJjMzg4MDE5ODYwMDEzMGUxY2Y2MmI4ZjhhOTM0OTQ0ODhjYy9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL2luZGV4LnJzAAAIEABPAAAATAMAADQAAAAACBAATwAAAFMDAAAyAAAAYXNzZXJ0aW9uIGZhaWxlZDogc2VsZi5pc19jaGFyX2JvdW5kYXJ5KG4pL3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzAAAAmggQAEsAAAAMCAAAHQAAAJoIEABLAAAAFAgAAB0AAAAjAAAADAAAAAQAAAAkAAAAJQAAACEAAAAvcnVzdGMvNmIwMGJjMzg4MDE5ODYwMDEzMGUxY2Y2MmI4ZjhhOTM0OTQ0ODhjYy9saWJyYXJ5L2NvcmUvc3JjL2l0ZXIvdHJhaXRzL2l0ZXJhdG9yLnJzIAkQAFgAAADRBwAACQAAAC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2pzLXN5cy0wLjMuNzcvc3JjL2xpYi5ycwAAiAkQAFoAAAD7GAAAAQAAAC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi0wLjIuMTAwL3NyYy9jb252ZXJ0L3NsaWNlcy5yc/QJEABsAAAAJAEAAA4AAABjbG9zdXJlIGludm9rZWQgcmVjdXJzaXZlbHkgb3IgYWZ0ZXIgYmVpbmcgZHJvcHBlZExhenkgaW5zdGFuY2UgaGFzIHByZXZpb3VzbHkgYmVlbiBwb2lzb25lZKIKEAAqAAAAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvb25jZV9jZWxsLTEuMjEuMy9zcmMvbGliLnJzAAAA1AoQAF0AAAAIAwAAGQAAAHJlZW50cmFudCBpbml0AABECxAADgAAANQKEABdAAAAegIAAA0AAAA6IAAAAAAAAAQAAAAEAAAANwAAAC9ydXN0Yy82YjAwYmMzODgwMTk4NjAwMTMwZTFjZjYyYjhmOGE5MzQ5NDQ4OGNjL2xpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMvbW9kLnJzgAsQAFAAAAAuAgAAEQAAADoAAAA4AAAADAAAAAQAAAA5AAAAOgAAADsAAAAvcnVzdC9kZXBzL2RsbWFsbG9jLTAuMi44L3NyYy9kbG1hbGxvYy5yc2Fzc2VydGlvbiBmYWlsZWQ6IHBzaXplID49IHNpemUgKyBtaW5fb3ZlcmhlYWQA/AsQACkAAACsBAAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplIDw9IHNpemUgKyBtYXhfb3ZlcmhlYWQAAPwLEAApAAAAsgQAAA0AAABsaWJyYXJ5L3N0ZC9zcmMvc3luYy9sYXp5X2xvY2sucnMAAACkDBAAIQAAANEAAAATAAAAbGlicmFyeS9zdGQvc3JjL2JhY2t0cmFjZS5ycwIAAAAAAAAAAgBBiJrAAAvFBCAAgOBvcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtDA0QACgAAAAkAAAAAgAAADQNEAB1bnN1cHBvcnRlZCBiYWNrdHJhY2VkaXNhYmxlZCBiYWNrdHJhY2UA2AwQABwAAACKAQAAHQAAADwAAAAQAAAABAAAAD0AAAA+AAAAAQAAAAAAAABjYW5ub3QgcmVjdXJzaXZlbHkgYWNxdWlyZSBtdXRleJwNEAAgAAAAbGlicmFyeS9zdGQvc3JjL3N5cy9zeW5jL211dGV4L25vX3RocmVhZHMucnPEDRAALAAAABMAAAAJAAAAbGlicmFyeS9zdGQvc3JjL3N5bmMvcG9pc29uL29uY2UucnMAAA4QACMAAACbAAAAMgAAADx1bmtub3duPu+/vW1lbW9yeSBhbGxvY2F0aW9uIG9mICBieXRlcyBmYWlsZWQAAEAOEAAVAAAAVQ4QAA0AAABsaWJyYXJ5L3N0ZC9zcmMvYWxsb2MucnN0DhAAGAAAAGQBAAAJAAAACgAAADgAAAAMAAAABAAAAD8AAAAAAAAACAAAAAQAAABAAAAAAAAAAAgAAAAEAAAAQQAAAEIAAABDAAAARAAAAEUAAAAQAAAABAAAAEYAAABHAAAASAAAAEkAAABsaWJyYXJ5L3N0ZC9zcmMvLi4vLi4vYmFja3RyYWNlL3NyYy9zeW1ib2xpemUvbW9kLnJz+A4QADQAAABnAQAAMAAAAAEAAAAAAAAAbAsQAAIAAAACAEHWnsAACwEEAEHgnsAAC4UJIAAA6CAtIAABAAAAAAAAAGQPEAADAAAAAgAAAAAAAAABAAAAAQAAAAAAAAAgAADoICAgICAgICAgICAgICAgICAgIGF0IAAA4AsQAAEAAABPbmNlIGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWQAALAPEAAqAAAAb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gbWF5IG5vdCBiZSBwZXJmb3JtZWQgcmVjdXJzaXZlbHnkDxAAOAAAAAAoKQAAAAAABAAAAAQAAABNAAAAL3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9jb3JlL3NyYy9vcHMvZnVuY3Rpb24ucnM4EBAAUAAAAKYAAAAFAAAAL3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9jb3JlL3NyYy9zdHIvcGF0dGVybi5ycwCYEBAATwAAAOIFAAAUAAAAmBAQAE8AAADiBQAAIQAAAJgQEABPAAAA1gUAACEAAAAwMTIzNDU2Nzg5YWJjZGVmAAAAAAAAAAABAAAATgAAAGNhbGxlZCBgUmVzdWx0Ojp1bndyYXAoKWAgb24gYW4gYEVycmAgdmFsdWVFcnJvckVtcHR5SW52YWxpZERpZ2l0UG9zT3ZlcmZsb3dOZWdPdmVyZmxvd1plcm8AAAAAAAQAAAAEAAAATwAAAFBhcnNlSW50RXJyb3JraW5kAAAAAAAAAAwAAAAEAAAAUAAAAFEAAABSAAAAmBAQAE8AAABmBAAAJAAAAJgQEABPAAAAzgEAADcAAABfWk4vcnVzdC9kZXBzL3J1c3RjLWRlbWFuZ2xlLTAuMS4yNC9zcmMvbGVnYWN5LnJzAAAA8xEQAC4AAAA9AAAACwAAAPMREAAuAAAAOgAAAAsAAADzERAALgAAADYAAAALAAAA8xEQAC4AAABmAAAAHAAAAPMREAAuAAAAbwAAACcAAADzERAALgAAAHAAAAAdAAAA8xEQAC4AAAByAAAAIQAAAPMREAAuAAAAcwAAABoAAADzERAALgAAAHQAAAAZAAAAOjoAAPMREAAuAAAAfgAAAB0AAADzERAALgAAALQAAAAmAAAA8xEQAC4AAAC1AAAAIQAAAPMREAAuAAAAigAAAEkAAADzERAALgAAAIsAAAAfAAAA8xEQAC4AAACLAAAALwAAAEMAAADzERAALgAAAJ0AAAA1AAAALCkoPjwmKkDzERAALgAAAIIAAAAsAAAA8xEQAC4AAACEAAAAJQAAAC4AAADzERAALgAAAIcAAAAlAAAAAAAAAAEAAAABAAAAUwAAAPMREAAuAAAAcgAAAEgAAABfX1IvcnVzdC9kZXBzL3J1c3RjLWRlbWFuZ2xlLTAuMS4yNC9zcmMvdjAucnMAAACLExAAKgAAADIAAAATAAAAixMQACoAAAAvAAAAEwAAAIsTEAAqAAAAKwAAABMAQfCnwAALnQYBAAAAVAAAAGBmbXQ6OkVycm9yYHMgc2hvdWxkIGJlIGltcG9zc2libGUgd2l0aG91dCBhIGBmbXQ6OkZvcm1hdHRlcmAAAACLExAAKgAAAEsAAAAOAAAAixMQACoAAABaAAAAKAAAAIsTEAAqAAAAigAAAA0AAABwdW55Y29kZXstfTCLExAAKgAAAB4BAAAxAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZYsTEAAqAAAAMQEAABYAAACLExAAKgAAADQBAABHAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogc3RyOjpmcm9tX3V0ZjgoKSA9ICB3YXMgZXhwZWN0ZWQgdG8gaGF2ZSAxIGNoYXIsIGJ1dCAgY2hhcnMgd2VyZSBmb3VuZMwUEAA5AAAABRUQAAQAAAAJFRAAIgAAACsVEAARAAAAixMQACoAAABcAQAAGgAAAGJvb2xjaGFyc3RyaThpMTZpMzJpNjRpMTI4aXNpemV1OHUxNnUzMnU2NHUxMjh1c2l6ZWYzMmY2NCFfLi4uAACLExAAKgAAAL8BAAAfAAAAixMQACoAAAAeAgAAHgAAAIsTEAAqAAAAIwIAACIAAACLExAAKgAAACQCAAAlAAAAixMQACoAAACHAgAAEQAAAHtpbnZhbGlkIHN5bnRheH17cmVjdXJzaW9uIGxpbWl0IHJlYWNoZWR9Pydmb3I8PiAsIFtdOjp7Y2xvc3VyZXNoaW06IyBhcyAgbXV0IGNvbnN0IDsgZHluICArIHVuc2FmZSBleHRlcm4gIosTEAAqAAAA1AMAAC0AAAAiIGZuKCAtPiAgPSBmYWxzZXRydWV7IHsgIH06IDB4AIsTEAAqAAAAygQAAC0AAAAubGx2bS4vcnVzdC9kZXBzL3J1c3RjLWRlbWFuZ2xlLTAuMS4yNC9zcmMvbGliLnJzAAAArhYQACsAAABiAAAAGwAAAK4WEAArAAAAaQAAABMAAAABAAAAAAAAAAIAAAAAAAAAAgBBmK7AAAvpASAAgOB7c2l6ZSBsaW1pdCByZWFjaGVkfQAAAAAAAAAAAQAAAFUAAABgZm10OjpFcnJvcmAgZnJvbSBgU2l6ZUxpbWl0ZWRGbXRBZGFwdGVyYCB3YXMgZGlzY2FyZGVkAK4WEAArAAAAUwEAAB4AAABTaXplTGltaXRFeGhhdXN0ZWQAAAUAAAAMAAAACwAAAAsAAAAEAAAAaBEQAG0REAB5ERAAhBEQAI8REAACAAAABAAAAAQAAAADAAAAAwAAAAMAAAAAAAAAAgAAAAUAAAAFAAAAAAAAAAMAAAADAAAABAAAAAQAAAABAEGMsMAAC18DAAAAAwAAAAIAAAADAAAAAAAAAAMAAAADAAAAAQAAAHcVEABsFRAAcBUQAKIVEAB0FRAAnxUQAAAAAACLFRAAhhUQAJoVEAAAAAAAfBUQAJAVEACCFRAAlhUQAKYVEABB9LDAAAu1AXkVEACNFRAAJRAQAKcVEAAAAAAAfxUQAJMVEAClFRAARXJyb3IAAABWAAAADAAAAAQAAABXAAAAWAAAAFkAAABjYXBhY2l0eSBvdmVyZmxvdwAAALQYEAARAAAAbGlicmFyeS9hbGxvYy9zcmMvcmF3X3ZlYy9tb2QucnPQGBAAIAAAAC4CAAARAAAAbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzAAAZEAAbAAAA6AEAABcAQbSywAALhQcBAAAAWgAAAGEgZm9ybWF0dGluZyB0cmFpdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB3aGVuIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBkaWQgbm90bGlicmFyeS9hbGxvYy9zcmMvZm10LnJzAACSGRAAGAAAAIoCAAAOAAAAAHAABwAtAQEBAgECAQFICzAVEAFlBwIGAgIBBCMBHhtbCzoJCQEYBAEJAQMBBSsDOwkqGAEgNwEBAQQIBAEDBwoCHQE6AQEBAgQIAQkBCgIaAQICOQEEAgQCAgMDAR4CAwELAjkBBAUBAgQBFAIWBgEBOgEBAgEECAEHAwoCHgE7AQEBDAEJASgBAwE3AQEDBQMBBAcCCwIdAToBAgIBAQMDAQQHAgsCHAI5AgEBAgQIAQkBCgIdAUgBBAECAwEBCAFRAQIHDAhiAQIJCwdJAhsBAQEBATcOAQUBAgULASQJAWYEAQYBAgICGQIEAxAEDQECAgYBDwEAAwAEHAMdAh4CQAIBBwgBAgsJAS0DAQF1AiIBdgMEAgkBBgPbAgIBOgEBBwEBAQECCAYKAgEwHzEEMAoEAyYJDAIgBAIGOAEBAgMBAQU4CAICmAMBDQEHBAEGAQMCxkAAAcMhAAONAWAgAAZpAgAEAQogAlACAAEDAQQBGQIFAZcCGhINASYIGQsBASwDMAECBAICAgEkAUMGAgICAgwBCAEvATMBAQMCAgUCAQEqAggB7gECAQQBAAEAEBAQAAIAAeIBlQUAAwECBQQoAwQBpQIABEEFAAJPBEYLMQR7ATYPKQECAgoDMQQCAgcBPQMkBQEIPgEMAjQJAQEIBAIBXwMCBAYBAgGdAQMIFQI5AgEBAQEMAQkBDgcDBUMBAgYBAQIBAQMEAwEBDgJVCAIDAQEXAVEBAgYBAQIBAQIBAusBAgQGAgECGwJVCAIBAQJqAQEBAghlAQEBAgQBBQAJAQL1AQoEBAGQBAICBAEgCigGAgQIAQkGAgMuDQECAAcBBgEBUhYCBwECAQJ6BgMBAQIBBwEBSAIDAQEBAAILAjQFBQMXAQABBg8ADAMDAAU7BwABPwRRAQsCAAIALgIXAAUDBggIAgceBJQDADcEMggBDgEWBQEPAAcBEQIHAQIBBWQBoAcAAT0EAAT+AgAHbQcAYIDwAAICAgICAgICAgMDAQEBAEHLucAACxABAAAAAAAAAAICAAAAAAACAEGKusAACwECAEGwusAACwEBAEHLusAACwEBAEGru8AAC7AHLi4wMTIzNDU2Nzg5YWJjZGVmAAAAAQAAAAAAAABCb3Jyb3dNdXRFcnJvcmFscmVhZHkgYm9ycm93ZWQ6INYdEAASAAAAW2NhbGxlZCBgT3B0aW9uOjp1bndyYXAoKWAgb24gYSBgTm9uZWAgdmFsdWVpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAAHB4QACAAAAA8HhAAEgAAAAAAAAAEAAAABAAAAGEAAAA9PSE9bWF0Y2hlc2Fzc2VydGlvbiBgbGVmdCAgcmlnaHRgIGZhaWxlZAogIGxlZnQ6IAogcmlnaHQ6IAB7HhAAEAAAAIseEAAXAAAAoh4QAAkAAAAgcmlnaHRgIGZhaWxlZDogCiAgbGVmdDogAAAAex4QABAAAADEHhAAEAAAANQeEAAJAAAAoh4QAAkAAAA6IAAAAQAAAAAAAAAAHxAAAgAAAAAAAAAMAAAABAAAAGIAAABjAAAAZAAAACAgICAgeyAsICB7CiwKfSB9Cl0weDAwMDEwMjAzMDQwNTA2MDcwODA5MTAxMTEyMTMxNDE1MTYxNzE4MTkyMDIxMjIyMzI0MjUyNjI3MjgyOTMwMzEzMjMzMzQzNTM2MzczODM5NDA0MTQyNDM0NDQ1NDY0NzQ4NDk1MDUxNTI1MzU0NTU1NjU3NTg1OTYwNjE2MjYzNjQ2NTY2Njc2ODY5NzA3MTcyNzM3NDc1NzY3Nzc4Nzk4MDgxODI4Mzg0ODU4Njg3ODg4OTkwOTE5MjkzOTQ5NTk2OTc5ODk5bGlicmFyeS9jb3JlL3NyYy9mbXQvbW9kLnJzZmFsc2V0cnVlAAAACSAQABsAAACZCgAAJgAAAAkgEAAbAAAAogoAABoAAABhdHRlbXB0ZWQgdG8gaW5kZXggc2xpY2UgZnJvbSBhZnRlciBtYXhpbXVtIHVzaXplAAAAUCAQADEAAABhdHRlbXB0ZWQgdG8gaW5kZXggc2xpY2UgdXAgdG8gbWF4aW11bSB1c2l6ZYwgEAAsAAAAbGlicmFyeS9jb3JlL3NyYy9zdHIvbW9kLnJzAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQZ3DwAALMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDAwMDAwMDAwMDAwMDAwMEBAQEBABB28PAAAuZEWxpYnJhcnkvY29yZS9zcmMvc3RyL3BhdHRlcm4ucnMAANshEAAfAAAAcQUAABIAAADbIRAAHwAAAHEFAAAoAAAA2yEQAB8AAABkBgAAFQAAANshEAAfAAAAkgYAABUAAADbIRAAHwAAAJMGAAAVAAAAAFsuLi5dYmVnaW4gPD0gZW5kICggPD0gKSB3aGVuIHNsaWNpbmcgYGAAAABSIhAADgAAAGAiEAAEAAAAZCIQABAAAAB0IhAAAQAAAGJ5dGUgaW5kZXggIGlzIG5vdCBhIGNoYXIgYm91bmRhcnk7IGl0IGlzIGluc2lkZSAgKGJ5dGVzICkgb2YgYACYIhAACwAAAKMiEAAmAAAAySIQAAgAAADRIhAABgAAAHQiEAABAAAAIGlzIG91dCBvZiBib3VuZHMgb2YgYAAAmCIQAAsAAAAAIxAAFgAAAHQiEAABAAAAwCAQABsAAACeAQAALAAAAGxpYnJhcnkvY29yZS9zcmMvdW5pY29kZS9wcmludGFibGUucnMAAABAIxAAJQAAABoAAAA2AAAAQCMQACUAAAAKAAAAKwAAAAAGAQEDAQQCBQcHAggICQIKBQsCDgQQARECEgUTHBQBFQIXAhkNHAUdCB8BJAFqBGsCrwOxArwCzwLRAtQM1QnWAtcC2gHgBeEC5wToAu4g8AT4AvoE+wEMJzs+Tk+Pnp6fe4uTlqKyuoaxBgcJNj0+VvPQ0QQUGDY3Vld/qq6vvTXgEoeJjp4EDQ4REikxNDpFRklKTk9kZYqMjY+2wcPExsvWXLa3GxwHCAoLFBc2OTqoqdjZCTeQkagHCjs+ZmmPkhFvX7/u71pi9Pz/U1Samy4vJyhVnaCho6SnqK26vMQGCwwVHTo/RVGmp8zNoAcZGiIlPj/n7O//xcYEICMlJigzODpISkxQU1VWWFpcXmBjZWZrc3h9f4qkqq+wwNCur25v3d6TXiJ7BQMELQNmAwEvLoCCHQMxDxwEJAkeBSsFRAQOKoCqBiQEJAQoCDQLTgM0DIE3CRYKCBg7RTkDYwgJMBYFIQMbBQFAOARLBS8ECgcJB0AgJwQMCTYDOgUaBwQMB1BJNzMNMwcuCAoGJgMdCAKA0FIQAzcsCCoWGiYcFBcJTgQkCUQNGQcKBkgIJwl1C0I+KgY7BQoGUQYBBRADBQtZCAIdYh5ICAqApl4iRQsKBg0TOgYKBhQcLAQXgLk8ZFMMSAkKRkUbSAhTDUkHCoC2Ig4KBkYKHQNHSTcDDggKBjkHCoE2GQc7Ax1VAQ8yDYObZnULgMSKTGMNhDAQFgqPmwWCR5q5OobGgjkHKgRcBiYKRgooBROBsDqAxltlSwQ5BxFABQsCDpf4CITWKQqi54EzDwEdBg4ECIGMiQRrBQ0DCQcQj2CA+gaBtExHCXQ8gPYKcwhwFUZ6FAwUDFcJGYCHgUcDhUIPFYRQHwYGgNUrBT4hAXAtAxoEAoFAHxE6BQGB0CqA1isEAYHggPcpTAQKBAKDEURMPYDCPAYBBFUFGzQCgQ4sBGQMVgqArjgdDSwECQcCDgaAmoPYBBEDDQN3BF8GDAQBDwwEOAgKBigILAQCPoFUDB0DCgU4BxwGCQeA+oQGAAEDBQUGBgIHBggHCREKHAsZDBoNEA4MDwQQAxISEwkWARcEGAEZAxoHGwEcAh8WIAMrAy0LLgEwBDECMgGnBKkCqgSrCPoC+wX9Av4D/wmteHmLjaIwV1iLjJAc3Q4PS0z7/C4vP1xdX+KEjY6RkqmxurvFxsnK3uTl/wAEERIpMTQ3Ojs9SUpdhI6SqbG0urvGys7P5OUABA0OERIpMTQ6O0VGSUpeZGWEkZudyc7PDREpOjtFSVdbXF5fZGWNkam0urvFyd/k5fANEUVJZGWAhLK8vr/V1/Dxg4WLpKa+v8XHz9rbSJi9zcbOz0lOT1dZXl+Jjo+xtre/wcbH1xEWF1tc9vf+/4Btcd7fDh9ubxwdX31+rq9Nu7wWFx4fRkdOT1haXF5+f7XF1NXc8PH1cnOPdHWWJi4vp6+3v8fP19+aAECXmDCPH87P0tTO/05PWlsHCA8QJy/u725vNz0/QkWQkVNndcjJ0NHY2ef+/wAgXyKC3wSCRAgbBAYRgawOgKsFHwiBHAMZCAEELwQ0BAcDAQcGBxEKUA8SB1UHAwQcCgkDCAMHAwIDAwMMBAUDCwYBDhUFTgcbB1cHAgYXDFAEQwMtAwEEEQYPDDoEHSVfIG0EaiWAyAWCsAMaBoL9A1kHFgkYCRQMFAxqBgoGGgZZBysFRgosBAwEAQMxCywEGgYLA4CsBgoGLzGA9Ag8Aw8DPgU4CCsFgv8RGAgvES0DIQ8hD4CMBIKaFgsViJQFLwU7BwIOGAmAviJ0DIDWGoEQBYDhCfKeAzcJgVwUgLgIgN0VOwMKBjgIRggMBnQLHgNaBFkJgIMYHAoWCUwEgIoGq6QMFwQxoQSB2iYHDAUFgKYQgfUHASAqBkwEgI0EgL4DGwMPDXJhbmdlIHN0YXJ0IGluZGV4ICBvdXQgb2YgcmFuZ2UgZm9yIHNsaWNlIG9mIGxlbmd0aCAAAAAxKRAAEgAAAEMpEAAiAAAAcmFuZ2UgZW5kIGluZGV4IHgpEAAQAAAAQykQACIAAABzbGljZSBpbmRleCBzdGFydHMgYXQgIGJ1dCBlbmRzIGF0IACYKRAAFgAAAK4pEAANAAAAAAMAAIMEIACRBWAAXROgABIXIB8MIGAf7ywgKyowoCtvpmAsAqjgLB774C0A/iA2nv9gNv0B4TYBCiE3JA3hN6sOYTkvGOE5MBzhSvMe4U5ANKFSHmHhU/BqYVRPb+FUnbxhVQDPYVZl0aFWANohVwDgoViu4iFa7OThW9DoYVwgAO5c8AF/XXAeEAByHhAAdB4QAAIAAAACAAAABwAAAAAAAD8AAAC/AEGM1cAACwEyAHwJcHJvZHVjZXJzAghsYW5ndWFnZQEEUnVzdAAMcHJvY2Vzc2VkLWJ5AwVydXN0Yx0xLjg4LjAgKDZiMDBiYzM4OCAyMDI1LTA2LTIzKQZ3YWxydXMGMC4yMy4zDHdhc20tYmluZGdlbhMwLjIuMTAwICgyNDA1ZWMyYjQpAGsPdGFyZ2V0X2ZlYXR1cmVzBisPbXV0YWJsZS1nbG9iYWxzKxNub250cmFwcGluZy1mcHRvaW50KwtidWxrLW1lbW9yeSsIc2lnbi1leHQrD3JlZmVyZW5jZS10eXBlcysKbXVsdGl2YWx1ZQ==", import.meta.url));
|
|
const A = zQ();
|
|
(typeof t == "string" || typeof Request == "function" && t instanceof Request || typeof URL == "function" && t instanceof URL) && (t = fetch(t));
|
|
const { instance: e, module: g } = await qQ(await t, A);
|
|
return ZQ(e, g);
|
|
}
|
|
const UA = -12, LA = 9, VQ = Math.exp(UA), XQ = Math.exp(LA), Ug = -30, Et = Math.exp(Ug), je = 11, Pe = 11, Lg = 11, WQ = je + Pe, j = 1 << je, qA = 1 << Pe, Yg = 1 << Lg, _e = 1, jQ = j - 1, PQ = qA - 1, _Q = Yg - 1, OQ = !0, Nr = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
__proto__: null,
|
|
LN_SCALE_MAX: LA,
|
|
LN_SCALE_MIN: UA,
|
|
LN_SCALE_ZERO: Ug,
|
|
SCALE_MAX: XQ,
|
|
SCALE_MIN: VQ,
|
|
SCALE_ZERO: Et,
|
|
SPLAT_TEX_DEPTH: Yg,
|
|
SPLAT_TEX_DEPTH_BITS: Lg,
|
|
SPLAT_TEX_DEPTH_MASK: _Q,
|
|
SPLAT_TEX_HEIGHT: qA,
|
|
SPLAT_TEX_HEIGHT_BITS: Pe,
|
|
SPLAT_TEX_HEIGHT_MASK: PQ,
|
|
SPLAT_TEX_LAYER_BITS: WQ,
|
|
SPLAT_TEX_MIN_HEIGHT: _e,
|
|
SPLAT_TEX_WIDTH: j,
|
|
SPLAT_TEX_WIDTH_BITS: je,
|
|
SPLAT_TEX_WIDTH_MASK: jQ,
|
|
WASM_SPLAT_SORT: OQ
|
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
function wt(t) {
|
|
return t === "bool" || t === "bvec2" || t === "bvec3" || t === "bvec4";
|
|
}
|
|
function Dt(t) {
|
|
return t === "int" || t === "uint" || t === "float";
|
|
}
|
|
function hA(t) {
|
|
return t === "int" || t === "ivec2" || t === "ivec3" || t === "ivec4";
|
|
}
|
|
function lA(t) {
|
|
return t === "uint" || t === "uvec2" || t === "uvec3" || t === "uvec4";
|
|
}
|
|
function Xt(t) {
|
|
return t === "float" || t === "vec2" || t === "vec3" || t === "vec4";
|
|
}
|
|
function Jg(t) {
|
|
return t === "mat2" || t === "mat2x2" || t === "mat2x3" || t === "mat2x4" || t === "mat3" || t === "mat3x2" || t === "mat3x3" || t === "mat3x4" || t === "mat4" || t === "mat4x2" || t === "mat4x3" || t === "mat4x4";
|
|
}
|
|
function it(t) {
|
|
return Xt(t) || Jg(t);
|
|
}
|
|
function xt(t) {
|
|
return t === "vec2" || t === "ivec2" || t === "uvec2";
|
|
}
|
|
function kt(t) {
|
|
return t === "vec3" || t === "ivec3" || t === "uvec3";
|
|
}
|
|
function Wt(t) {
|
|
return t === "vec4" || t === "ivec4" || t === "uvec4";
|
|
}
|
|
function $Q(t) {
|
|
return xt(t) || kt(t) || Wt(t);
|
|
}
|
|
function Qt(t) {
|
|
return t === "mat2" || t === "mat2x2";
|
|
}
|
|
function nt(t) {
|
|
return t === "mat3" || t === "mat3x3";
|
|
}
|
|
function Ct(t) {
|
|
return t === "mat4" || t === "mat4x4";
|
|
}
|
|
function bg(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 vg(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 An(t) {
|
|
if (Dt(t))
|
|
return "float";
|
|
if (xt(t))
|
|
return "vec2";
|
|
if (kt(t))
|
|
return "vec3";
|
|
if (Wt(t))
|
|
return "vec4";
|
|
throw new Error(`Invalid vector type: ${t}`);
|
|
}
|
|
function Tg(t) {
|
|
if (Dt(t))
|
|
return "uint";
|
|
if (xt(t))
|
|
return "uvec2";
|
|
if (kt(t))
|
|
return "uvec3";
|
|
if (Wt(t))
|
|
return "uvec4";
|
|
throw new Error(`Invalid vector type: ${t}`);
|
|
}
|
|
function tn(t) {
|
|
if (Dt(t))
|
|
return "int";
|
|
if (xt(t))
|
|
return "ivec2";
|
|
if (kt(t))
|
|
return "ivec3";
|
|
if (Wt(t))
|
|
return "ivec4";
|
|
throw new Error(`Invalid vector type: ${t}`);
|
|
}
|
|
function Hg(t) {
|
|
if (typeof t == "string")
|
|
return t;
|
|
if (typeof t == "object" && t.type)
|
|
return t.type;
|
|
throw new Error(`Invalid DynoType: ${String(t)}`);
|
|
}
|
|
function BA(t) {
|
|
return Math.trunc(t).toString();
|
|
}
|
|
function iA(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 V(t) {
|
|
return t instanceof st ? t.type : t.dynoOut().type;
|
|
}
|
|
class st {
|
|
constructor(A) {
|
|
this.__isDynoValue = !0, this.type = A;
|
|
}
|
|
}
|
|
class Z extends st {
|
|
constructor(A, e) {
|
|
super(A.outTypes[e]), this.dyno = A, this.key = e;
|
|
}
|
|
}
|
|
class Nt extends st {
|
|
constructor(A, e) {
|
|
super(A), this.literal = e;
|
|
}
|
|
getLiteral() {
|
|
return this.literal;
|
|
}
|
|
}
|
|
function ie(t, A) {
|
|
return new Nt(t, A);
|
|
}
|
|
class Kg extends Nt {
|
|
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 iA(e);
|
|
case "int":
|
|
return BA(e);
|
|
case "float":
|
|
return q(e);
|
|
case "bvec2": {
|
|
const g = e;
|
|
return `bvec2(${g[0]}, ${g[1]})`;
|
|
}
|
|
case "uvec2": {
|
|
if (e instanceof E.Vector2)
|
|
return `uvec2(${iA(e.x)}, ${iA(e.y)})`;
|
|
const g = e;
|
|
return `uvec2(${iA(g[0])}, ${iA(g[1])})`;
|
|
}
|
|
case "ivec2": {
|
|
if (e instanceof E.Vector2)
|
|
return `ivec2(${BA(e.x)}, ${BA(e.y)})`;
|
|
const g = e;
|
|
return `ivec2(${BA(g[0])}, ${BA(g[1])})`;
|
|
}
|
|
case "vec2": {
|
|
if (e instanceof E.Vector2)
|
|
return `vec2(${q(e.x)}, ${q(e.y)})`;
|
|
const g = e;
|
|
return `vec2(${q(g[0])}, ${q(g[1])})`;
|
|
}
|
|
case "bvec3": {
|
|
const g = e;
|
|
return `bvec3(${g[0]}, ${g[1]}, ${g[2]})`;
|
|
}
|
|
case "uvec3": {
|
|
if (e instanceof E.Vector3)
|
|
return `uvec3(${iA(e.x)}, ${iA(e.y)}, ${iA(e.z)})`;
|
|
const g = e;
|
|
return `uvec3(${iA(g[0])}, ${iA(g[1])}, ${iA(g[2])})`;
|
|
}
|
|
case "ivec3": {
|
|
if (e instanceof E.Vector3)
|
|
return `ivec3(${BA(e.x)}, ${BA(e.y)}, ${BA(e.z)})`;
|
|
const g = e;
|
|
return `ivec3(${BA(g[0])}, ${BA(g[1])}, ${BA(g[2])})`;
|
|
}
|
|
case "vec3": {
|
|
if (e instanceof E.Vector3)
|
|
return `vec3(${q(e.x)}, ${q(e.y)}, ${q(e.z)})`;
|
|
const g = e;
|
|
return `vec3(${q(g[0])}, ${q(g[1])}, ${q(g[2])})`;
|
|
}
|
|
case "bvec4": {
|
|
const g = e;
|
|
return `bvec4(${g[0]}, ${g[1]}, ${g[2]}, ${g[3]})`;
|
|
}
|
|
case "uvec4": {
|
|
if (e instanceof E.Vector4)
|
|
return `uvec4(${iA(e.x)}, ${iA(e.y)}, ${iA(e.z)}, ${iA(e.w)})`;
|
|
const g = e;
|
|
return `uvec4(${iA(g[0])}, ${iA(g[1])}, ${iA(g[2])}, ${iA(g[3])})`;
|
|
}
|
|
case "ivec4": {
|
|
if (e instanceof E.Vector4)
|
|
return `ivec4(${BA(e.x)}, ${BA(e.y)}, ${BA(e.z)}, ${BA(e.w)})`;
|
|
const g = e;
|
|
return `ivec4(${BA(g[0])}, ${BA(g[1])}, ${BA(g[2])}, ${BA(g[3])})`;
|
|
}
|
|
case "vec4": {
|
|
if (e instanceof E.Vector4)
|
|
return `vec4(${q(e.x)}, ${q(e.y)}, ${q(e.z)}, ${q(e.w)})`;
|
|
if (e instanceof E.Quaternion)
|
|
return `vec4(${q(e.x)}, ${q(e.y)}, ${q(e.z)}, ${q(e.w)})`;
|
|
const g = e;
|
|
return `vec4(${q(g[0])}, ${q(g[1])}, ${q(g[2])}, ${q(g[3])})`;
|
|
}
|
|
case "mat2":
|
|
case "mat2x2": {
|
|
const g = e, I = g instanceof E.Matrix2 ? g.elements : e, s = new Array(4).fill(0).map((B, i) => q(I[i]));
|
|
return `${A}(${s.join(", ")})`;
|
|
}
|
|
case "mat2x3": {
|
|
const g = e, I = new Array(6).fill(0).map((s, B) => q(g[B]));
|
|
return `${A}(${I.join(", ")})`;
|
|
}
|
|
case "mat2x4": {
|
|
const g = e, I = new Array(8).fill(0).map((s, B) => q(g[B]));
|
|
return `${A}(${I.join(", ")})`;
|
|
}
|
|
case "mat3":
|
|
case "mat3x3": {
|
|
const g = e, I = g instanceof E.Matrix3 ? g.elements : e, s = new Array(9).fill(0).map((B, i) => q(I[i]));
|
|
return `${A}(${s.join(", ")})`;
|
|
}
|
|
case "mat3x2": {
|
|
const g = e, I = new Array(6).fill(0).map((s, B) => q(g[B]));
|
|
return `${A}(${I.join(", ")})`;
|
|
}
|
|
case "mat3x4": {
|
|
const g = e, I = new Array(12).fill(0).map((s, B) => q(g[B]));
|
|
return `${A}(${I.join(", ")})`;
|
|
}
|
|
case "mat4":
|
|
case "mat4x4": {
|
|
const g = e, I = g instanceof E.Matrix4 ? g.elements : e, s = new Array(16).fill(0).map((B, i) => q(I[i]));
|
|
return `${A}(${s.join(", ")})`;
|
|
}
|
|
case "mat4x2": {
|
|
const g = e, I = new Array(8).fill(0).map((s, B) => q(g[B]));
|
|
return `${A}(${I.join(", ")})`;
|
|
}
|
|
case "mat4x3": {
|
|
const g = e, I = new Array(12).fill(0).map((s, B) => q(g[B]));
|
|
return `${A}(${I.join(", ")})`;
|
|
}
|
|
default:
|
|
throw new Error(`Type not implemented: ${String(A)}`);
|
|
}
|
|
}
|
|
}
|
|
function v(t, A) {
|
|
return new Kg(t, A);
|
|
}
|
|
function bt(t) {
|
|
const A = String(t);
|
|
if (wt(t))
|
|
return `${A}(false)`;
|
|
if (it(t))
|
|
return `${A}(0.0)`;
|
|
if (hA(t))
|
|
return `${A}(0)`;
|
|
if (lA(t))
|
|
return `${A}(0u)`;
|
|
throw new Error(`Type not implemented: ${A}`);
|
|
}
|
|
function en(t) {
|
|
const A = String(t);
|
|
if (wt(t))
|
|
return `${A}(true)`;
|
|
if (it(t))
|
|
return `${A}(1.0)`;
|
|
if (hA(t))
|
|
return `${A}(1)`;
|
|
if (lA(t))
|
|
return `${A}(1u)`;
|
|
throw new Error(`Type not implemented: ${A}`);
|
|
}
|
|
function gn(t) {
|
|
const A = String(t);
|
|
if (wt(t))
|
|
return `${A}(true)`;
|
|
if (it(t))
|
|
return `${A}(-1.0)`;
|
|
if (hA(t))
|
|
return `${A}(-1)`;
|
|
if (lA(t))
|
|
return `${A}(0xFFFFFFFFu)`;
|
|
throw new Error(`Type not implemented: ${A}`);
|
|
}
|
|
const og = " ";
|
|
class qg {
|
|
constructor({ indent: A } = {}) {
|
|
this.globals = /* @__PURE__ */ new Set(), this.statements = [], this.uniforms = {}, this.declares = /* @__PURE__ */ new Set(), this.updaters = [], this.sequence = 0, this.indent = og, this.indent = A ?? og;
|
|
}
|
|
nextSequence() {
|
|
return this.sequence++;
|
|
}
|
|
}
|
|
class X {
|
|
constructor({
|
|
inTypes: A,
|
|
outTypes: e,
|
|
inputs: g,
|
|
update: I,
|
|
globals: s,
|
|
statements: B,
|
|
generate: i
|
|
}) {
|
|
this.inTypes = A ?? {}, this.outTypes = e ?? {}, this.inputs = g ?? {}, this.update = I, this.globals = s, this.statements = B, this.generate = i ?? (({ inputs: Q, outputs: C, compile: a }) => {
|
|
var n, o;
|
|
return {
|
|
globals: (n = this.globals) == null ? void 0 : n.call(this, { inputs: Q, outputs: C, compile: a }),
|
|
statements: (o = this.statements) == null ? void 0 : o.call(this, { inputs: Q, outputs: C, compile: a })
|
|
};
|
|
});
|
|
}
|
|
get outputs() {
|
|
const A = {};
|
|
for (const e in this.outTypes)
|
|
A[e] = new Z(this, e);
|
|
return A;
|
|
}
|
|
apply(A) {
|
|
return Object.assign(this.inputs, A), this.outputs;
|
|
}
|
|
compile({
|
|
inputs: A,
|
|
outputs: e,
|
|
compile: g
|
|
}) {
|
|
const I = [
|
|
`// ${this.constructor.name}(${Object.values(A).join(", ")}) => (${Object.values(e).join(", ")})`
|
|
], s = [];
|
|
for (const C in e) {
|
|
const a = e[C];
|
|
a && !g.declares.has(a) && (g.declares.add(a), s.push(C));
|
|
}
|
|
const { globals: B, statements: i, uniforms: Q } = this.generate({
|
|
inputs: A,
|
|
outputs: e,
|
|
compile: g
|
|
});
|
|
for (const C of B ?? [])
|
|
g.globals.add(C);
|
|
for (const C in Q)
|
|
g.uniforms[C] = Q[C];
|
|
this.update && g.updaters.push(this.update);
|
|
for (const C of s) {
|
|
const a = e[C];
|
|
a && (g.uniforms[a] || I.push(`${Oe(a, this.outTypes[C])};`));
|
|
}
|
|
return i != null && i.length && (I.push("{"), I.push(...i.map((C) => g.indent + C)), I.push("}")), I;
|
|
}
|
|
}
|
|
class VA extends X {
|
|
constructor({
|
|
inTypes: A,
|
|
outTypes: e,
|
|
inputs: g,
|
|
update: I,
|
|
globals: s,
|
|
construct: B
|
|
}) {
|
|
super({
|
|
inTypes: A,
|
|
outTypes: e,
|
|
inputs: g,
|
|
update: I,
|
|
globals: s,
|
|
generate: (i) => this.generateBlock(i)
|
|
}), this.construct = B;
|
|
}
|
|
generateBlock({
|
|
inputs: A,
|
|
outputs: e,
|
|
compile: g
|
|
}) {
|
|
var h, c;
|
|
const I = {}, s = {};
|
|
for (const l in A)
|
|
A[l] != null && (I[l] = new Nt(this.inTypes[l], A[l]));
|
|
for (const l in e)
|
|
e[l] != null && (s[l] = new st(this.outTypes[l]));
|
|
const B = { roots: [] }, i = this.construct(I, s, B);
|
|
for (const l of ((h = this.globals) == null ? void 0 : h.call(this, { inputs: A, outputs: e, compile: g })) ?? [])
|
|
g.globals.add(l);
|
|
const Q = [], C = /* @__PURE__ */ new Map();
|
|
function a(l, u, w) {
|
|
let D = C.get(l);
|
|
if (!D) {
|
|
D = {
|
|
sequence: g.nextSequence(),
|
|
outNames: /* @__PURE__ */ new Map(),
|
|
newOuts: /* @__PURE__ */ new Set()
|
|
}, C.set(l, D);
|
|
for (const y in l.inputs) {
|
|
let d = l.inputs[y];
|
|
for (; d; ) {
|
|
if (d instanceof st) {
|
|
d instanceof Z && a(d.dyno, d.key);
|
|
break;
|
|
}
|
|
d = d.dynoOut();
|
|
}
|
|
}
|
|
Q.push(l);
|
|
}
|
|
u && (w || D.newOuts.add(u), D.outNames.set(u, w ?? `${u}_${D.sequence}`));
|
|
}
|
|
for (const l of B.roots)
|
|
a(l);
|
|
for (const l in s) {
|
|
let u = (i == null ? void 0 : i[l]) ?? s[l];
|
|
for (; u; ) {
|
|
if (u instanceof st) {
|
|
u instanceof Z && a(u.dyno, u.key, e[l]);
|
|
break;
|
|
}
|
|
u = u.dynoOut();
|
|
}
|
|
s[l] = u;
|
|
}
|
|
const n = [];
|
|
for (const l of Q) {
|
|
const u = {}, w = {};
|
|
for (const d in l.inputs) {
|
|
let S = l.inputs[d];
|
|
for (; S; ) {
|
|
if (S instanceof st) {
|
|
if (S instanceof Nt)
|
|
u[d] = S.getLiteral();
|
|
else if (S instanceof Z) {
|
|
const M = (c = C.get(S.dyno)) == null ? void 0 : c.outNames.get(S.key);
|
|
if (!M)
|
|
throw new Error(
|
|
`Source not found for ${S.dyno.constructor.name}.${S.key}`
|
|
);
|
|
u[d] = M;
|
|
}
|
|
break;
|
|
}
|
|
S = S.dynoOut();
|
|
}
|
|
}
|
|
const D = C.get(l) ?? { outNames: /* @__PURE__ */ new Map() };
|
|
for (const [d, S] of D.outNames.entries())
|
|
w[d] = S;
|
|
const y = l.compile({ inputs: u, outputs: w, compile: g });
|
|
n.push(y);
|
|
}
|
|
const o = [];
|
|
for (const l in e)
|
|
s[l] instanceof Nt && o.push(
|
|
`${e[l]} = ${s[l].getLiteral()};`
|
|
);
|
|
return o.length > 0 && n.push(o), { statements: n.flatMap((l, u) => u === 0 ? l : ["", ...l]) };
|
|
}
|
|
}
|
|
function NA(t, A, e, { update: g, globals: I } = {}) {
|
|
return new VA({ inTypes: t, outTypes: A, construct: e, update: g, globals: I });
|
|
}
|
|
function jt({
|
|
inTypes: t,
|
|
outTypes: A,
|
|
inputs: e,
|
|
update: g,
|
|
globals: I,
|
|
statements: s,
|
|
generate: B
|
|
}) {
|
|
return new X({
|
|
inTypes: t,
|
|
outTypes: A,
|
|
inputs: e,
|
|
update: g,
|
|
globals: I,
|
|
statements: s,
|
|
generate: B
|
|
});
|
|
}
|
|
function Oe(t, A, e) {
|
|
const g = typeof A == "string" ? A : A.type;
|
|
if (!g)
|
|
throw new Error(`Invalid DynoType: ${String(A)}`);
|
|
return `${g} ${t}${e != null ? `[${e}]` : ""}`;
|
|
}
|
|
function YA(t) {
|
|
var s;
|
|
let A = !1;
|
|
const e = t.split(`
|
|
`).map((B) => {
|
|
const i = B.trimEnd();
|
|
return A ? i : i.length > 0 ? (A = !0, i) : null;
|
|
}).filter((B) => B != null);
|
|
for (; e.length > 0 && e[e.length - 1].length === 0; )
|
|
e.pop();
|
|
if (e.length === 0)
|
|
return [];
|
|
const g = (s = e[0].match(/^\s*/)) == null ? void 0 : s[0];
|
|
if (!g)
|
|
return e;
|
|
const I = new RegExp(`^${g}`);
|
|
return e.map((B) => B.replace(I, ""));
|
|
}
|
|
function oA(t) {
|
|
return YA(t).join(`
|
|
`);
|
|
}
|
|
class F extends X {
|
|
constructor({
|
|
a: A,
|
|
outKey: e,
|
|
outTypeFunc: g
|
|
}) {
|
|
const I = { a: V(A) }, s = g(V(A)), B = { [e]: s };
|
|
super({ inTypes: I, outTypes: B, inputs: { a: A } }), this.outKey = e;
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, this.outKey);
|
|
}
|
|
}
|
|
class tA extends X {
|
|
constructor({
|
|
a: A,
|
|
b: e,
|
|
outKey: g,
|
|
outTypeFunc: I
|
|
}) {
|
|
const s = { a: V(A), b: V(e) }, B = I(V(A), V(e)), i = { [g]: B };
|
|
super({ inTypes: s, outTypes: i, inputs: { a: A, b: e } }), this.outKey = g;
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, this.outKey);
|
|
}
|
|
}
|
|
class yt extends X {
|
|
constructor({
|
|
a: A,
|
|
b: e,
|
|
c: g,
|
|
outKey: I,
|
|
outTypeFunc: s
|
|
}) {
|
|
const B = { a: V(A), b: V(e), c: V(g) }, i = s(V(A), V(e), V(g)), Q = { [I]: i };
|
|
super({ inTypes: B, outTypes: Q, inputs: { a: A, b: e, c: g } }), this.outKey = I;
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, this.outKey);
|
|
}
|
|
}
|
|
const AA = { type: "Gsplat" }, Pt = { type: "PackedSplats" }, In = (t) => new Zg({ packedSplats: t }), Ft = (t, A) => new Xg({ packedSplats: t, index: A }), zg = (t, A, e, g) => new Wg({ packedSplats: t, index: A, base: e, count: g }), ot = (t) => new jg({ gsplat: t }), Bt = ({
|
|
gsplat: t,
|
|
flags: A,
|
|
index: e,
|
|
center: g,
|
|
scales: I,
|
|
quaternion: s,
|
|
rgba: B,
|
|
rgb: i,
|
|
opacity: Q,
|
|
x: C,
|
|
y: a,
|
|
z: n,
|
|
r: o,
|
|
g: r,
|
|
b: h
|
|
}) => new Pg({
|
|
gsplat: t,
|
|
flags: A,
|
|
index: e,
|
|
center: g,
|
|
scales: I,
|
|
quaternion: s,
|
|
rgba: B,
|
|
rgb: i,
|
|
opacity: Q,
|
|
x: C,
|
|
y: a,
|
|
z: n,
|
|
r: o,
|
|
g: r,
|
|
b: h
|
|
}), Ye = (t) => new Og({ gsplat: t }), $e = (t, {
|
|
scale: A,
|
|
rotate: e,
|
|
translate: g,
|
|
recolor: I
|
|
}) => new $g({ gsplat: t, scale: A, rotate: e, translate: g, recolor: I }), FA = oA(`
|
|
struct Gsplat {
|
|
vec3 center;
|
|
uint flags;
|
|
vec3 scales;
|
|
int index;
|
|
vec4 quaternion;
|
|
vec4 rgba;
|
|
};
|
|
const uint GSPLAT_FLAG_ACTIVE = 1u << 0u;
|
|
|
|
bool isGsplatActive(uint flags) {
|
|
return (flags & GSPLAT_FLAG_ACTIVE) != 0u;
|
|
}
|
|
`), le = oA(`
|
|
struct PackedSplats {
|
|
usampler2DArray texture;
|
|
int numSplats;
|
|
vec4 rgbMinMaxLnScaleMinMax;
|
|
};
|
|
`);
|
|
class Zg extends F {
|
|
constructor({
|
|
packedSplats: A
|
|
}) {
|
|
super({ a: A, outKey: "numSplats", outTypeFunc: () => "int" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.numSplats} = ${e.a}.numSplats;`
|
|
];
|
|
}
|
|
}
|
|
const Vg = oA(`
|
|
bool readPackedSplat(usampler2DArray texture, int numSplats, 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 Xg extends X {
|
|
constructor({
|
|
packedSplats: A,
|
|
index: e
|
|
}) {
|
|
super({
|
|
inTypes: { packedSplats: Pt, index: "int" },
|
|
outTypes: { gsplat: AA },
|
|
inputs: { packedSplats: A, index: e },
|
|
globals: () => [FA, le, Vg],
|
|
statements: ({ inputs: g, outputs: I }) => {
|
|
const { gsplat: s } = I;
|
|
if (!s)
|
|
return [];
|
|
const { packedSplats: B, index: i } = g;
|
|
let Q;
|
|
return B && i ? Q = YA(`
|
|
if (readPackedSplat(${B}.texture, ${B}.numSplats, ${B}.rgbMinMaxLnScaleMinMax, ${i}, ${s})) {
|
|
bool zeroSize = all(equal(${s}.scales, vec3(0.0, 0.0, 0.0)));
|
|
${s}.flags = zeroSize ? 0u : GSPLAT_FLAG_ACTIVE;
|
|
} else {
|
|
${s}.flags = 0u;
|
|
}
|
|
`) : Q = [`${s}.flags = 0u;`], Q.push(`${s}.index = ${i ?? "0"};`), Q;
|
|
}
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "gsplat");
|
|
}
|
|
}
|
|
class Wg extends X {
|
|
constructor({
|
|
packedSplats: A,
|
|
index: e,
|
|
base: g,
|
|
count: I
|
|
}) {
|
|
super({
|
|
inTypes: {
|
|
packedSplats: Pt,
|
|
index: "int",
|
|
base: "int",
|
|
count: "int"
|
|
},
|
|
outTypes: { gsplat: AA },
|
|
inputs: { packedSplats: A, index: e, base: g, count: I },
|
|
globals: () => [FA, le, Vg],
|
|
statements: ({ inputs: s, outputs: B }) => {
|
|
const { gsplat: i } = B;
|
|
if (!i)
|
|
return [];
|
|
const { packedSplats: Q, index: C, base: a, count: n } = s;
|
|
let o;
|
|
return Q && C && a && n ? o = YA(`
|
|
${i}.flags = 0u;
|
|
if ((${C} >= ${a}) && (${C} < (${a} + ${n}))) {
|
|
if (readPackedSplat(${Q}.texture, ${Q}.numSplats, ${Q}.rgbMinMaxLnScaleMinMax, ${C}, ${i})) {
|
|
bool zeroSize = all(equal(${i}.scales, vec3(0.0, 0.0, 0.0)));
|
|
${i}.flags = zeroSize ? 0u : GSPLAT_FLAG_ACTIVE;
|
|
}
|
|
}
|
|
`) : o = [`${i}.flags = 0u;`], o.push(`${i}.index = ${C ?? "0"};`), o;
|
|
}
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "gsplat");
|
|
}
|
|
}
|
|
class jg extends X {
|
|
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: () => [FA],
|
|
statements: ({ inputs: e, outputs: g }) => {
|
|
const { gsplat: I } = e, {
|
|
flags: s,
|
|
active: B,
|
|
index: i,
|
|
center: Q,
|
|
scales: C,
|
|
quaternion: a,
|
|
rgba: n,
|
|
rgb: o,
|
|
opacity: r,
|
|
x: h,
|
|
y: c,
|
|
z: l,
|
|
r: u,
|
|
g: w,
|
|
b: D
|
|
} = g;
|
|
return [
|
|
s ? `${s} = ${I ? `${I}.flags` : "0u"};` : null,
|
|
B ? `${B} = isGsplatActive(${I ? `${I}.flags` : "0u"});` : null,
|
|
i ? `${i} = ${I ? `${I}.index` : "0"};` : null,
|
|
Q ? `${Q} = ${I ? `${I}.center` : "vec3(0.0, 0.0, 0.0)"};` : null,
|
|
C ? `${C} = ${I ? `${I}.scales` : "vec3(0.0, 0.0, 0.0)"};` : null,
|
|
a ? `${a} = ${I ? `${I}.quaternion` : "vec4(0.0, 0.0, 0.0, 1.0)"};` : null,
|
|
n ? `${n} = ${I ? `${I}.rgba` : "vec4(0.0, 0.0, 0.0, 0.0)"};` : null,
|
|
o ? `${o} = ${I ? `${I}.rgba.rgb` : "vec3(0.0, 0.0, 0.0)"};` : null,
|
|
r ? `${r} = ${I ? `${I}.rgba.a` : "0.0"};` : null,
|
|
h ? `${h} = ${I ? `${I}.center.x` : "0.0"};` : null,
|
|
c ? `${c} = ${I ? `${I}.center.y` : "0.0"};` : null,
|
|
l ? `${l} = ${I ? `${I}.center.z` : "0.0"};` : null,
|
|
u ? `${u} = ${I ? `${I}.rgba.r` : "0.0"};` : null,
|
|
w ? `${w} = ${I ? `${I}.rgba.g` : "0.0"};` : null,
|
|
D ? `${D} = ${I ? `${I}.rgba.b` : "0.0"};` : null
|
|
].filter(Boolean);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
class Pg extends X {
|
|
constructor({
|
|
gsplat: A,
|
|
flags: e,
|
|
index: g,
|
|
center: I,
|
|
scales: s,
|
|
quaternion: B,
|
|
rgba: i,
|
|
rgb: Q,
|
|
opacity: C,
|
|
x: a,
|
|
y: n,
|
|
z: o,
|
|
r,
|
|
g: h,
|
|
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: g,
|
|
center: I,
|
|
scales: s,
|
|
quaternion: B,
|
|
rgba: i,
|
|
rgb: Q,
|
|
opacity: C,
|
|
x: a,
|
|
y: n,
|
|
z: o,
|
|
r,
|
|
g: h,
|
|
b: c
|
|
},
|
|
globals: () => [FA],
|
|
statements: ({ inputs: l, outputs: u }) => {
|
|
const { gsplat: w } = u;
|
|
if (!w)
|
|
return [];
|
|
const {
|
|
gsplat: D,
|
|
flags: y,
|
|
index: d,
|
|
center: S,
|
|
scales: M,
|
|
quaternion: p,
|
|
rgba: f,
|
|
rgb: R,
|
|
opacity: N,
|
|
x: m,
|
|
y: L,
|
|
z: x,
|
|
r: G,
|
|
g: U,
|
|
b: J
|
|
} = l;
|
|
return [
|
|
`${w}.flags = ${y ?? (D ? `${D}.flags` : "0u")};`,
|
|
`${w}.index = ${d ?? (D ? `${D}.index` : "0")};`,
|
|
`${w}.center = ${S ?? (D ? `${D}.center` : "vec3(0.0, 0.0, 0.0)")};`,
|
|
`${w}.scales = ${M ?? (D ? `${D}.scales` : "vec3(0.0, 0.0, 0.0)")};`,
|
|
`${w}.quaternion = ${p ?? (D ? `${D}.quaternion` : "vec4(0.0, 0.0, 0.0, 1.0)")};`,
|
|
`${w}.rgba = ${f ?? (D ? `${D}.rgba` : "vec4(0.0, 0.0, 0.0, 0.0)")};`,
|
|
R ? `${w}.rgba.rgb = ${R};` : null,
|
|
N ? `${w}.rgba.a = ${N};` : null,
|
|
m ? `${w}.center.x = ${m};` : null,
|
|
L ? `${w}.center.y = ${L};` : null,
|
|
x ? `${w}.center.z = ${x};` : null,
|
|
G ? `${w}.rgba.r = ${G};` : null,
|
|
U ? `${w}.rgba.g = ${U};` : null,
|
|
J ? `${w}.rgba.b = ${J};` : null
|
|
].filter(Boolean);
|
|
}
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "gsplat");
|
|
}
|
|
}
|
|
const _g = oA(`
|
|
vec3 gsplatNormal(vec3 scales, vec4 quaternion) {
|
|
float minScale = min(scales.x, min(scales.y, scales.z));
|
|
vec3 normal;
|
|
if (scales.z == minScale) {
|
|
normal = vec3(0.0, 0.0, 1.0);
|
|
} else if (scales.y == minScale) {
|
|
normal = vec3(0.0, 1.0, 0.0);
|
|
} else {
|
|
normal = vec3(1.0, 0.0, 0.0);
|
|
}
|
|
return quatVec(quaternion, normal);
|
|
}
|
|
`);
|
|
class Og extends F {
|
|
constructor({ gsplat: A }) {
|
|
super({ a: A, outKey: "normal", outTypeFunc: () => "vec3" }), this.globals = () => [FA, _g], this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.normal} = gsplatNormal(${e.a}.scales, ${e.a}.quaternion);`
|
|
];
|
|
}
|
|
}
|
|
class $g extends X {
|
|
constructor({
|
|
gsplat: A,
|
|
scale: e,
|
|
rotate: g,
|
|
translate: I,
|
|
recolor: s
|
|
}) {
|
|
super({
|
|
inTypes: {
|
|
gsplat: AA,
|
|
scale: "float",
|
|
rotate: "vec4",
|
|
translate: "vec3",
|
|
recolor: "vec4"
|
|
},
|
|
outTypes: { gsplat: AA },
|
|
inputs: { gsplat: A, scale: e, rotate: g, translate: I, recolor: s },
|
|
globals: () => [FA],
|
|
statements: ({ inputs: B, outputs: i, compile: Q }) => {
|
|
const { gsplat: C } = i;
|
|
if (!C || !B.gsplat)
|
|
return [];
|
|
const { scale: a, rotate: n, translate: o, recolor: r } = B, h = Q.indent;
|
|
return [
|
|
`${C} = ${B.gsplat};`,
|
|
`if (isGsplatActive(${C}.flags)) {`,
|
|
a ? `${h}${C}.center *= ${a};` : null,
|
|
n ? `${h}${C}.center = quatVec(${n}, ${C}.center);` : null,
|
|
o ? `${h}${C}.center += ${o};` : null,
|
|
a ? `${h}${C}.scales *= ${a};` : null,
|
|
n ? `${h}${C}.quaternion = quatQuat(${n}, ${C}.quaternion);` : null,
|
|
r ? `${h}${C}.rgba *= ${r};` : null,
|
|
"}"
|
|
].filter(Boolean);
|
|
}
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "gsplat");
|
|
}
|
|
}
|
|
const AI = (t, A) => new tI({ gsplat: t, rgbMinMaxLnScaleMinMax: A }), sn = (t) => new Ag({ rgba8: t });
|
|
class tI extends X {
|
|
constructor({
|
|
gsplat: A,
|
|
rgbMinMaxLnScaleMinMax: e
|
|
}) {
|
|
super({
|
|
inTypes: { gsplat: AA, rgbMinMaxLnScaleMinMax: "vec4" },
|
|
inputs: { gsplat: A, rgbMinMaxLnScaleMinMax: e },
|
|
globals: () => [FA],
|
|
statements: ({ inputs: g, outputs: I }) => {
|
|
const { output: s } = I;
|
|
if (!s)
|
|
return [];
|
|
const { gsplat: B, rgbMinMaxLnScaleMinMax: i } = g;
|
|
return B ? YA(`
|
|
if (isGsplatActive(${B}.flags)) {
|
|
${s} = packSplatEncoding(${B}.center, ${B}.scales, ${B}.quaternion, ${B}.rgba, ${i});
|
|
} else {
|
|
${s} = uvec4(0u, 0u, 0u, 0u);
|
|
}
|
|
`) : [`${s} = uvec4(0u, 0u, 0u, 0u);`];
|
|
}
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "output");
|
|
}
|
|
}
|
|
class Ag extends X {
|
|
constructor({ rgba8: A }) {
|
|
super({
|
|
inTypes: { rgba8: "vec4" },
|
|
inputs: { rgba8: A },
|
|
statements: ({ inputs: e, outputs: g }) => [
|
|
`target = ${e.rgba8 ?? "vec4(0.0, 0.0, 0.0, 0.0)"};`
|
|
]
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "rgba8");
|
|
}
|
|
}
|
|
const Bn = (t, A, e) => new k({ key: t, type: A, value: e }), Qn = (t = !1, A) => new Qe({ key: A, value: t }), nn = (t = 0, A) => new eI({ key: A, value: t }), Cn = (t = 0, A) => new zt({ key: A, value: t }), HA = (t = 0, A) => new rt({ key: A, value: t }), an = (t, A) => new gI({ key: A, value: t }), En = (t, A) => new II({ key: A, value: t }), on = (t, A) => new sI({ key: A, value: t }), rn = (t, A) => new Ht({ key: A, value: t }), cn = (t, A) => new BI({ key: A, value: t }), hn = (t, A) => new iI({ key: A, value: t }), ln = (t, A) => new QI({ key: A, value: t }), tt = (t, A) => new Gt({ key: A, value: t }), un = (t, A) => new nI({ key: A, value: t }), wn = (t, A) => new CI({ key: A, value: t }), Dn = (t, A) => new aI({ key: A, value: t }), yn = (t, A) => new Rt({ key: A, value: t }), pn = (t, A) => new EI({ key: A, value: t }), dn = (t, A) => new oI({ key: A, value: t }), fn = (t, A) => new rI({ key: A, value: t }), Mn = (t, A) => new cI({ key: A, value: t }), mn = (t, A) => new hI({ key: A, value: t }), Sn = (t, A) => new lI({ key: A, value: t }), Nn = (t, A) => new uI({ key: A, value: t }), Fn = (t, A) => new wI({ key: A, value: t }), Gn = (t, A) => new DI({ key: A, value: t }), xn = (t, A) => new yI({ key: A, value: t }), kn = (t, A) => new pI({ key: A, value: t }), Rn = (t, A) => new dI({ key: A, value: t }), Un = (t, A) => new fI({ key: A, value: t }), Ln = (t, A) => new MI({ key: A, value: t }), Yn = (t, A) => new mI({ key: A, value: t }), Jn = (t, A) => new Kt({ key: A, value: t }), bn = (t, A) => new SI({ key: t, value: A }), vn = (t, A) => new NI({ key: A, value: t }), Tn = (t, A) => new FI({ key: A, value: t }), Hn = (t, A) => new GI({ key: A, value: t }), Kn = (t, A) => new xI({ key: A, value: t }), qn = (t, A) => new kI({ key: A, value: t }), zn = (t, A) => new RI({ key: A, value: t }), Zn = (t, A) => new UI({ key: A, value: t }), Vn = (t, A) => new LI({ key: A, value: t }), Xn = (t, A) => new YI({ key: A, value: t }), Wn = (t, A) => new JI({ key: A, value: t });
|
|
class k extends X {
|
|
constructor({
|
|
key: A,
|
|
type: e,
|
|
count: g,
|
|
value: I,
|
|
update: s,
|
|
globals: B
|
|
}) {
|
|
A = A ?? "value", super({
|
|
outTypes: { [A]: e },
|
|
update: () => {
|
|
if (s) {
|
|
const i = s(this.value);
|
|
i !== void 0 && (this.value = i);
|
|
}
|
|
this.uniform.value = this.value;
|
|
},
|
|
generate: ({ inputs: i, outputs: Q }) => {
|
|
const C = (B == null ? void 0 : B({ inputs: i, outputs: Q })) ?? [], a = {}, n = Q[A];
|
|
return n && (C.push(`uniform ${Oe(n, e, g)};`), a[n] = this.uniform), { globals: C, uniforms: a };
|
|
}
|
|
}), this.type = e, this.count = g, this.value = I, this.uniform = { value: I }, this.outKey = A;
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, this.outKey);
|
|
}
|
|
}
|
|
class Qe extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "bool", value: e, update: g });
|
|
}
|
|
}
|
|
class eI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "uint", value: e, update: g });
|
|
}
|
|
}
|
|
class zt extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "int", value: e, update: g });
|
|
}
|
|
}
|
|
class rt extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "float", value: e, update: g });
|
|
}
|
|
}
|
|
class gI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "bvec2", value: e, update: g });
|
|
}
|
|
}
|
|
class II extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "uvec2", value: e, update: g });
|
|
}
|
|
}
|
|
class sI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "ivec2", value: e, update: g });
|
|
}
|
|
}
|
|
class Ht extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "vec2", value: e, update: g });
|
|
}
|
|
}
|
|
class BI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "bvec3", value: e, update: g });
|
|
}
|
|
}
|
|
class iI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "uvec3", value: e, update: g });
|
|
}
|
|
}
|
|
class QI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "ivec3", value: e, update: g });
|
|
}
|
|
}
|
|
class Gt extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "vec3", value: e, update: g });
|
|
}
|
|
}
|
|
class nI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "bvec4", value: e, update: g });
|
|
}
|
|
}
|
|
class CI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "uvec4", value: e, update: g });
|
|
}
|
|
}
|
|
class aI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "ivec4", value: e, update: g });
|
|
}
|
|
}
|
|
class Rt extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "vec4", value: e, update: g });
|
|
}
|
|
}
|
|
class EI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "mat2", value: e, update: g });
|
|
}
|
|
}
|
|
class oI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "mat2x2", value: e, update: g });
|
|
}
|
|
}
|
|
class rI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "mat2x3", value: e, update: g });
|
|
}
|
|
}
|
|
class cI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "mat2x4", value: e, update: g });
|
|
}
|
|
}
|
|
class hI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "mat3", value: e, update: g });
|
|
}
|
|
}
|
|
class lI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "mat3x2", value: e, update: g });
|
|
}
|
|
}
|
|
class uI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "mat3x3", value: e, update: g });
|
|
}
|
|
}
|
|
class wI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "mat3x4", value: e, update: g });
|
|
}
|
|
}
|
|
class DI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "mat4", value: e, update: g });
|
|
}
|
|
}
|
|
class yI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "mat4x2", value: e, update: g });
|
|
}
|
|
}
|
|
class pI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "mat4x3", value: e, update: g });
|
|
}
|
|
}
|
|
class dI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "mat4x4", value: e, update: g });
|
|
}
|
|
}
|
|
class fI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "usampler2D", value: e, update: g });
|
|
}
|
|
}
|
|
class MI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "isampler2D", value: e, update: g });
|
|
}
|
|
}
|
|
class mI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "sampler2D", value: e, update: g });
|
|
}
|
|
}
|
|
class Kt extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "usampler2DArray", value: e, update: g });
|
|
}
|
|
}
|
|
class SI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "isampler2DArray", value: e, update: g });
|
|
}
|
|
}
|
|
class NI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "sampler2DArray", value: e, update: g });
|
|
}
|
|
}
|
|
class FI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "usampler3D", value: e, update: g });
|
|
}
|
|
}
|
|
class GI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "isampler3D", value: e, update: g });
|
|
}
|
|
}
|
|
class xI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "sampler3D", value: e, update: g });
|
|
}
|
|
}
|
|
class kI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "usamplerCube", value: e, update: g });
|
|
}
|
|
}
|
|
class RI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "isamplerCube", value: e, update: g });
|
|
}
|
|
}
|
|
class UI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "samplerCube", value: e, update: g });
|
|
}
|
|
}
|
|
class LI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "sampler2DShadow", value: e, update: g });
|
|
}
|
|
}
|
|
class YI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "sampler2DArrayShadow", value: e, update: g });
|
|
}
|
|
}
|
|
class JI extends k {
|
|
constructor({
|
|
key: A,
|
|
value: e,
|
|
update: g
|
|
}) {
|
|
super({ key: A, type: "samplerCubeShadow", value: e, update: g });
|
|
}
|
|
}
|
|
const _t = new Float32Array(1), ue = new Uint32Array(_t.buffer);
|
|
function jn(t) {
|
|
return _t[0] = t, ue[0];
|
|
}
|
|
function Pn(t) {
|
|
return ue[0] = t, _t[0];
|
|
}
|
|
function ct(t) {
|
|
_t[0] = t;
|
|
const A = ue[0], e = A >> 31 & 1, g = A >> 23 & 255, I = A & 8388607, s = e << 15;
|
|
if (g === 255)
|
|
return I !== 0 ? s | 32767 : s | 31744;
|
|
const B = g - 127 + 15;
|
|
if (B >= 31)
|
|
return s | 31744;
|
|
if (B <= 0) {
|
|
if (B < -10)
|
|
return s;
|
|
const Q = (I | 8388608) >> 1 - B + 13;
|
|
return s | Q;
|
|
}
|
|
const i = I >> 13;
|
|
return s | B << 10 | i;
|
|
}
|
|
function dA(t) {
|
|
const A = t >> 15 & 1, e = t >> 10 & 31, g = t & 1023;
|
|
let I;
|
|
if (e === 0)
|
|
if (g === 0)
|
|
I = A << 31;
|
|
else {
|
|
let s = g, B = -14;
|
|
for (; (s & 1024) === 0; )
|
|
s <<= 1, B--;
|
|
s &= 1023;
|
|
const i = B + 127, Q = s << 13;
|
|
I = A << 31 | i << 23 | Q;
|
|
}
|
|
else if (e === 31)
|
|
g === 0 ? I = A << 31 | 2139095040 : I = A << 31 | 2143289344;
|
|
else {
|
|
const s = e - 15 + 127, B = g << 13;
|
|
I = A << 31 | s << 23 | B;
|
|
}
|
|
return ue[0] = I, _t[0];
|
|
}
|
|
function GA(t) {
|
|
return Math.max(0, Math.min(255, Math.round(t * 255)));
|
|
}
|
|
function Ie(t) {
|
|
return Math.max(-127, Math.min(127, Math.round(t * 127)));
|
|
}
|
|
function _n(t) {
|
|
return t / 255;
|
|
}
|
|
function On(t) {
|
|
return t / 127;
|
|
}
|
|
class $n {
|
|
// Create a DataCache with a given function that fetches data not in the cache.
|
|
constructor({
|
|
asyncFetch: A,
|
|
maxItems: e = 5
|
|
}) {
|
|
this.asyncFetch = A, this.maxItems = e, this.items = [];
|
|
}
|
|
// Fetch data for the key, returning cached data if available.
|
|
async getFetch(A) {
|
|
const e = this.items.findIndex((I) => I.key === A);
|
|
if (e >= 0) {
|
|
const I = this.items.splice(e, 1)[0];
|
|
return this.items.push(I), I.data;
|
|
}
|
|
const g = await this.asyncFetch(A);
|
|
for (this.items.push({ key: A, data: g }); this.items.length > this.maxItems; )
|
|
this.items.shift();
|
|
return g;
|
|
}
|
|
}
|
|
function AC(t, A) {
|
|
const e = Object.entries(t).map(([g, I]) => [
|
|
g,
|
|
A(I, g)
|
|
]);
|
|
return Object.fromEntries(e);
|
|
}
|
|
function tC(t, A) {
|
|
const e = Object.entries(t).map(([g, I]) => [g, A(I, g)]).filter(([g, I]) => I !== void 0);
|
|
return Object.fromEntries(e);
|
|
}
|
|
function bI(t) {
|
|
const A = [], e = /* @__PURE__ */ new Set();
|
|
function g(I) {
|
|
I && typeof I == "object" && !e.has(I) && (e.add(I), I instanceof ArrayBuffer ? A.push(I) : ArrayBuffer.isView(I) ? A.push(I.buffer) : Array.isArray(I) ? I.forEach(g) : Object.values(I).forEach(g));
|
|
}
|
|
return g(t), A;
|
|
}
|
|
function eC(t, A) {
|
|
return new Array(t).fill(null).map((e, g) => A(g));
|
|
}
|
|
class vI {
|
|
constructor({
|
|
// Allocate a new item with the given args
|
|
allocate: A,
|
|
// Dispose of an item (optional, if GC is enough)
|
|
dispose: e,
|
|
// Check if an existing item in the list is valid for the given args,
|
|
// allowing you to store heterogeneous items in the list.
|
|
valid: g
|
|
}) {
|
|
this.items = [], this.allocate = A, this.dispose = e, this.valid = g;
|
|
}
|
|
// Allocate a new item from the free list, first checking if a existing item
|
|
// on the freelist is valid for the given args.
|
|
alloc(A) {
|
|
for (; ; ) {
|
|
const e = this.items.pop();
|
|
if (!e)
|
|
break;
|
|
if (this.valid(e, A))
|
|
return e;
|
|
this.dispose && this.dispose(e);
|
|
}
|
|
return this.allocate(A);
|
|
}
|
|
free(A) {
|
|
this.items.push(A);
|
|
}
|
|
disposeAll() {
|
|
let A;
|
|
for (A = this.items.pop(); A; )
|
|
this.dispose && this.dispose(A), A = this.items.pop();
|
|
}
|
|
}
|
|
function Je(t, A, e, g, I, s, B, i, Q, C, a, n, o, r, h, c, l) {
|
|
const u = (l == null ? void 0 : l.rgbMin) ?? 0, D = ((l == null ? void 0 : l.rgbMax) ?? 1) - u, y = GA((r - u) / D), d = GA((h - u) / D), S = GA((c - u) / D), M = GA(o), p = tg(
|
|
new E.Quaternion(Q, C, a, n)
|
|
), f = p & 255, R = p >>> 8 & 255, N = p >>> 16 & 255, m = (l == null ? void 0 : l.lnScaleMin) ?? UA, x = 254 / (((l == null ? void 0 : l.lnScaleMax) ?? LA) - m), G = s < Et ? 0 : Math.min(
|
|
255,
|
|
Math.max(
|
|
1,
|
|
Math.round((Math.log(s) - m) * x) + 1
|
|
)
|
|
), U = B < Et ? 0 : Math.min(
|
|
255,
|
|
Math.max(
|
|
1,
|
|
Math.round((Math.log(B) - m) * x) + 1
|
|
)
|
|
), J = i < Et ? 0 : Math.min(
|
|
255,
|
|
Math.max(
|
|
1,
|
|
Math.round((Math.log(i) - m) * x) + 1
|
|
)
|
|
), P = ct(e), T = ct(g), eA = ct(I), z = A * 4;
|
|
t[z] = y | d << 8 | S << 16 | M << 24, t[z + 1] = P | T << 16, t[z + 2] = eA | f << 16 | R << 24, t[z + 3] = G | U << 8 | J << 16 | N << 24;
|
|
}
|
|
function gC(t, A, e, g, I) {
|
|
const s = ct(e), B = ct(g), i = ct(I), Q = A * 4;
|
|
t[Q + 1] = s | B << 16, t[Q + 2] = i | t[Q + 2] & 4294901760;
|
|
}
|
|
function IC(t, A, e, g, I, s) {
|
|
const B = (s == null ? void 0 : s.lnScaleMin) ?? UA, Q = 254 / (((s == null ? void 0 : s.lnScaleMax) ?? LA) - B), C = e < Et ? 0 : Math.min(
|
|
255,
|
|
Math.max(
|
|
1,
|
|
Math.round((Math.log(e) - B) * Q) + 1
|
|
)
|
|
), a = g < Et ? 0 : Math.min(
|
|
255,
|
|
Math.max(
|
|
1,
|
|
Math.round((Math.log(g) - B) * Q) + 1
|
|
)
|
|
), n = I < Et ? 0 : Math.min(
|
|
255,
|
|
Math.max(
|
|
1,
|
|
Math.round((Math.log(I) - B) * Q) + 1
|
|
)
|
|
), o = A * 4;
|
|
t[o + 3] = C | a << 8 | n << 16 | t[o + 3] & 4278190080;
|
|
}
|
|
function sC(t, A, e, g, I, s) {
|
|
const B = tg(
|
|
new E.Quaternion(e, g, I, s)
|
|
), i = B & 255, Q = B >>> 8 & 255, C = B >>> 16 & 255, a = A * 4;
|
|
t[a + 2] = t[a + 2] & 65535 | i << 16 | Q << 24, t[a + 3] = t[a + 3] & 16777215 | C << 24;
|
|
}
|
|
function BC(t, A, e, g, I, s, B) {
|
|
const i = (B == null ? void 0 : B.rgbMin) ?? 0, C = ((B == null ? void 0 : B.rgbMax) ?? 1) - i, a = GA((e - i) / C), n = GA((g - i) / C), o = GA((I - i) / C), r = GA(s), h = A * 4;
|
|
t[h] = a | n << 8 | o << 16 | r << 24;
|
|
}
|
|
function iC(t, A, e, g, I, s) {
|
|
const B = (s == null ? void 0 : s.rgbMin) ?? 0, Q = ((s == null ? void 0 : s.rgbMax) ?? 1) - B, C = GA((e - B) / Q), a = GA((g - B) / Q), n = GA((I - B) / Q), o = A * 4;
|
|
t[o] = C | a << 8 | n << 16 | t[o] & 4278190080;
|
|
}
|
|
function QC(t, A, e) {
|
|
const g = GA(e), I = A * 4;
|
|
t[I] = t[I] & 16777215 | g << 24;
|
|
}
|
|
const nC = new E.Vector3(), CC = new E.Vector3(), aC = new E.Quaternion(), EC = new E.Color(), oC = {
|
|
center: nC,
|
|
scales: CC,
|
|
quaternion: aC,
|
|
color: EC,
|
|
opacity: 0
|
|
};
|
|
function be(t, A, e) {
|
|
const g = oC, I = A * 4, s = t[I], B = t[I + 1], i = t[I + 2], Q = t[I + 3], C = (e == null ? void 0 : e.rgbMin) ?? 0, n = ((e == null ? void 0 : e.rgbMax) ?? 1) - C;
|
|
g.color.set(
|
|
C + (s & 255) / 255 * n,
|
|
C + (s >>> 8 & 255) / 255 * n,
|
|
C + (s >>> 16 & 255) / 255 * n
|
|
), g.opacity = (s >>> 24 & 255) / 255, g.center.set(
|
|
dA(B & 65535),
|
|
dA(B >>> 16 & 65535),
|
|
dA(i & 65535)
|
|
);
|
|
const o = (e == null ? void 0 : e.lnScaleMin) ?? UA, h = (((e == null ? void 0 : e.lnScaleMax) ?? LA) - o) / 254, c = Q & 255;
|
|
g.scales.x = c === 0 ? 0 : Math.exp(o + (c - 1) * h);
|
|
const l = Q >>> 8 & 255;
|
|
g.scales.y = l === 0 ? 0 : Math.exp(o + (l - 1) * h);
|
|
const u = Q >>> 16 & 255;
|
|
g.scales.z = u === 0 ? 0 : Math.exp(o + (u - 1) * h);
|
|
const w = i >>> 16 & 65535 | Q >>> 8 & 16711680;
|
|
return VI(w, g.quaternion), g;
|
|
}
|
|
function fA(t) {
|
|
const A = j, e = Math.max(
|
|
_e,
|
|
Math.min(qA, Math.ceil(t / A))
|
|
), g = Math.ceil(t / (A * e)), I = A * e * g;
|
|
return { width: A, height: e, depth: g, maxSplats: I };
|
|
}
|
|
function rC(t) {
|
|
const A = j, e = Math.max(
|
|
_e,
|
|
Math.min(qA, Math.ceil(t / A))
|
|
), g = Math.ceil(t / (A * e));
|
|
return A * e * g;
|
|
}
|
|
function cC() {
|
|
return navigator.maxTouchPoints > 0 ? !0 : /Mobi|Android|iPhone|iPad|iPod|Opera Mini|IEMobile/.test(
|
|
navigator.userAgent
|
|
);
|
|
}
|
|
function hC() {
|
|
return /Android/.test(navigator.userAgent);
|
|
}
|
|
function lC() {
|
|
return /Oculus/.test(navigator.userAgent);
|
|
}
|
|
function uC(t, A, e) {
|
|
const g = new Uint8Array(A * 4);
|
|
for (let I = 0; I < e / 2; I++) {
|
|
const s = I * A * 4, B = (e - 1 - I) * A * 4;
|
|
g.set(t.subarray(s, s + A * 4)), t.set(
|
|
t.subarray(B, B + A * 4),
|
|
s
|
|
), t.set(g, B);
|
|
}
|
|
return t;
|
|
}
|
|
function wC(t, A, e) {
|
|
const g = document.createElement("canvas");
|
|
g.width = A, g.height = e;
|
|
const I = g.getContext("2d");
|
|
if (!I)
|
|
throw new Error("Can't get 2d context");
|
|
const s = I.createImageData(A, e);
|
|
return s.data.set(t), I.putImageData(s, 0, 0), g.toDataURL("image/png");
|
|
}
|
|
function TI(t) {
|
|
const A = new E.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 HI = oA(`
|
|
precision highp float;
|
|
|
|
in vec3 position;
|
|
|
|
void main() {
|
|
gl_Position = vec4(position.xy, 0.0, 1.0);
|
|
}
|
|
`);
|
|
function KI(t) {
|
|
const A = new E.Vector3();
|
|
for (const e of t)
|
|
A.add(e);
|
|
return A.divideScalar(t.length);
|
|
}
|
|
function qI(t) {
|
|
if (t.length === 0)
|
|
return new E.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 zI(t, A) {
|
|
const e = new E.Vector3(0, 0, 0).applyMatrix4(t), g = new E.Vector3(0, 0, 0).applyMatrix4(A), I = new E.Vector3(0, 0, -1).applyMatrix4(t).sub(e).normalize(), s = new E.Vector3(0, 0, -1).applyMatrix4(A).sub(g).normalize(), B = e.distanceTo(g), i = I.dot(s);
|
|
return { distance: B, coincidence: i };
|
|
}
|
|
function yC({
|
|
matrix1: t,
|
|
matrix2: A,
|
|
maxDistance: e
|
|
}) {
|
|
const g = new E.Vector3(0, 0, 0).applyMatrix4(t), I = new E.Vector3(0, 0, 0).applyMatrix4(A);
|
|
return g.distanceTo(I) <= e;
|
|
}
|
|
function pC({
|
|
matrix1: t,
|
|
matrix2: A,
|
|
maxDistance: e,
|
|
minCoincidence: g
|
|
}) {
|
|
const { distance: I, coincidence: s } = zI(t, A);
|
|
return I <= e && (g == null || s >= g);
|
|
}
|
|
function ZI(t, A) {
|
|
const [e, g] = [new E.Vector3(), new E.Quaternion()], [I, s] = [new E.Vector3(), new E.Quaternion()];
|
|
t.decompose(e, g, new E.Vector3()), A.decompose(I, s, new E.Vector3());
|
|
const B = e.distanceTo(I), i = Math.abs(g.dot(s));
|
|
return { distance: B, coorient: i };
|
|
}
|
|
function ne({
|
|
matrix1: t,
|
|
matrix2: A,
|
|
maxDistance: e,
|
|
minCoorient: g
|
|
}) {
|
|
const { distance: I, coorient: s } = ZI(t, A);
|
|
return I <= e && (g == null || s >= g);
|
|
}
|
|
function dC(t, A = 1e-3) {
|
|
return Math.abs(t) < A ? 0 : Math.sign(t);
|
|
}
|
|
function fC(t) {
|
|
const A = t.w < 0, e = Ie(A ? -t.x : t.x), g = Ie(A ? -t.y : t.y), I = Ie(A ? -t.z : t.z), s = e & 255, B = g & 255, i = I & 255;
|
|
return s | B << 8 | i << 16;
|
|
}
|
|
function MC(t, A) {
|
|
const e = t << 24 >> 24, g = t << 16 >> 24, I = t << 8 >> 24;
|
|
A.set(e / 127, g / 127, I / 127, 0);
|
|
const s = A.x * A.x + A.y * A.y + A.z * A.z;
|
|
return A.w = Math.sqrt(Math.max(0, 1 - s)), A;
|
|
}
|
|
function tg(t) {
|
|
const A = t.clone().normalize();
|
|
A.w < 0 && A.set(-A.x, -A.y, -A.z, -A.w);
|
|
const e = 2 * Math.acos(A.w), g = Math.sqrt(
|
|
A.x * A.x + A.y * A.y + A.z * A.z
|
|
), I = g < 1e-6 ? new E.Vector3(1, 0, 0) : new E.Vector3(A.x, A.y, A.z).divideScalar(g), s = Math.abs(I.x) + Math.abs(I.y) + Math.abs(I.z);
|
|
let B = I.x / s, i = I.y / s;
|
|
if (I.z < 0) {
|
|
const r = B;
|
|
B = (1 - Math.abs(i)) * (B >= 0 ? 1 : -1), i = (1 - Math.abs(r)) * (i >= 0 ? 1 : -1);
|
|
}
|
|
const Q = B * 0.5 + 0.5, C = i * 0.5 + 0.5, a = Math.round(Q * 255), n = Math.round(C * 255);
|
|
return Math.round(e * (255 / Math.PI)) << 16 | n << 8 | a;
|
|
}
|
|
function VI(t, A) {
|
|
const e = t & 255, g = t >>> 8 & 255, I = t >>> 16 & 255, s = e / 255, B = g / 255;
|
|
let i = (s - 0.5) * 2, Q = (B - 0.5) * 2;
|
|
const C = 1 - (Math.abs(i) + Math.abs(Q)), a = Math.max(-C, 0);
|
|
i += i >= 0 ? -a : a, Q += Q >= 0 ? -a : a;
|
|
const n = new E.Vector3(i, Q, C).normalize(), r = I / 255 * Math.PI * 0.5, h = Math.sin(r), c = Math.cos(r);
|
|
return A.set(n.x * h, n.y * h, n.z * h, c), A;
|
|
}
|
|
function mC(t) {
|
|
const A = t.clone().normalize(), e = 2 * (A.w * A.x + A.y * A.z), g = 1 - 2 * (A.x * A.x + A.y * A.y), I = Math.atan2(e, g), s = 2 * (A.w * A.y - A.z * A.x), B = Math.abs(s) >= 1 ? Math.sign(s) * (Math.PI / 2) : Math.asin(s), i = 2 * (A.w * A.z + A.x * A.y), Q = 1 - 2 * (A.y * A.y + A.z * A.z), C = Math.atan2(i, Q), a = (I + Math.PI) / (2 * Math.PI), n = (B + Math.PI) / (2 * Math.PI), o = (C + Math.PI) / (2 * Math.PI), r = Math.round(a * 255), h = Math.round(n * 255);
|
|
return Math.round(o * 255) << 16 | h << 8 | r;
|
|
}
|
|
function SC(t, A) {
|
|
const e = t & 255, g = t >>> 8 & 255, I = t >>> 16 & 255, s = e / 255, B = g / 255, i = I / 255, Q = s * (2 * Math.PI) - Math.PI, C = B * (2 * Math.PI) - Math.PI, a = i * (2 * Math.PI) - Math.PI, n = Math.cos(Q * 0.5), o = Math.sin(Q * 0.5), r = Math.cos(C * 0.5), h = Math.sin(C * 0.5), c = Math.cos(a * 0.5), l = Math.sin(a * 0.5);
|
|
return A.w = n * r * c + o * h * l, A.x = o * r * c - n * h * l, A.y = n * h * c + o * r * l, A.z = n * r * l - o * h * c, A.normalize(), A;
|
|
}
|
|
function $t(t, A, e, g) {
|
|
const I = Math.max(-127, Math.min(127, t * 127)), s = Math.max(-127, Math.min(127, A * 127)), B = Math.max(-127, Math.min(127, e * 127)), i = Math.max(-127, Math.min(127, g * 127));
|
|
return I & 255 | (s & 255) << 8 | (B & 255) << 16 | (i & 255) << 24;
|
|
}
|
|
function NC(t, A, e, g) {
|
|
const I = (g == null ? void 0 : g.sh1Min) ?? -1, s = (g == null ? void 0 : g.sh1Max) ?? 1, B = 0.5 * (I + s), i = 63 / (s - I), Q = A * 2;
|
|
for (let C = 0; C < 9; ++C) {
|
|
const a = (e[C] - B) * i, n = Math.round(Math.max(-63, Math.min(63, a))) & 127, o = C * 7, r = o + 7, h = Math.floor(o / 32), c = o - h * 32, l = n << c & 4294967295;
|
|
if (t[Q + h] |= l, r > h * 32 + 32) {
|
|
const u = n >>> 32 - c & 4294967295;
|
|
t[Q + h + 1] |= u;
|
|
}
|
|
}
|
|
}
|
|
function FC(t, A, e, g) {
|
|
const I = (g == null ? void 0 : g.sh2Min) ?? -1, s = (g == null ? void 0 : g.sh2Max) ?? 1, B = 0.5 * (I + s), i = 0.5 / (s - I);
|
|
t[A * 4 + 0] = $t(
|
|
(e[0] - B) * i,
|
|
(e[1] - B) * i,
|
|
(e[2] - B) * i,
|
|
(e[3] - B) * i
|
|
), t[A * 4 + 1] = $t(
|
|
(e[4] - B) * i,
|
|
(e[5] - B) * i,
|
|
(e[6] - B) * i,
|
|
(e[7] - B) * i
|
|
), t[A * 4 + 2] = $t(
|
|
(e[8] - B) * i,
|
|
(e[9] - B) * i,
|
|
(e[10] - B) * i,
|
|
(e[11] - B) * i
|
|
), t[A * 4 + 3] = $t(
|
|
(e[12] - B) * i,
|
|
(e[13] - B) * i,
|
|
(e[14] - B) * i,
|
|
0
|
|
);
|
|
}
|
|
function GC(t, A, e, g) {
|
|
const I = (g == null ? void 0 : g.sh3Min) ?? -1, s = (g == null ? void 0 : g.sh3Max) ?? 1, B = 0.5 * (I + s), i = 31 / (s - I), Q = A * 4;
|
|
for (let C = 0; C < 21; ++C) {
|
|
const a = (e[C] - B) * i, n = Math.round(Math.max(-31, Math.min(31, a))) & 63, o = C * 6, r = o + 6, h = Math.floor(o / 32), c = o - h * 32, l = n << c & 4294967295;
|
|
if (t[Q + h] |= l, r > h * 32 + 32) {
|
|
const u = n >>> 32 - c & 4294967295;
|
|
t[Q + h + 1] |= u;
|
|
}
|
|
}
|
|
}
|
|
function XI(t, A) {
|
|
const e = [];
|
|
let g = 0, I = null;
|
|
const s = new xg((Q, C) => {
|
|
if (e.push(Q), g += Q.length, C || g >= A) {
|
|
const a = new Uint8Array(g);
|
|
let n = 0;
|
|
for (const o of e)
|
|
a.set(o, n), n += o.length;
|
|
I = a.slice(0, A);
|
|
}
|
|
}), B = 1024;
|
|
let i = 0;
|
|
for (; I == null && i < t.length; ) {
|
|
const Q = t.slice(i, i + B);
|
|
s.push(Q, !1), i += B;
|
|
}
|
|
if (I == null && (s.push(new Uint8Array(), !0), I == null))
|
|
throw new Error("Failed to decompress partial gzip");
|
|
return I;
|
|
}
|
|
class WI {
|
|
constructor({
|
|
fileBytes: A,
|
|
chunkBytes: e = 64 * 1024
|
|
}) {
|
|
this.fileBytes = A, this.chunkBytes = e, this.offset = 0, this.chunks = [], this.totalBytes = 0, this.gunzip = new xg((g, I) => {
|
|
this.chunks.push(g), this.totalBytes += g.length;
|
|
});
|
|
}
|
|
read(A) {
|
|
for (; this.totalBytes < A && this.offset < this.fileBytes.length; ) {
|
|
const s = Math.min(
|
|
this.offset + this.chunkBytes,
|
|
this.fileBytes.length
|
|
);
|
|
this.gunzip.push(this.fileBytes.subarray(this.offset, s), !1), this.offset = s;
|
|
}
|
|
if (this.totalBytes < A && this.offset >= this.fileBytes.length && this.gunzip.push(new Uint8Array(0), !0), this.totalBytes < A)
|
|
throw new Error(
|
|
`Unexpected EOF: needed ${A}, got ${this.totalBytes}`
|
|
);
|
|
const e = new Uint8Array(this.totalBytes);
|
|
let g = 0;
|
|
for (const s of this.chunks)
|
|
e.set(s, g), g += s.length;
|
|
const I = e.subarray(0, A);
|
|
return this.chunks = [e.subarray(A)], this.totalBytes -= A, I;
|
|
}
|
|
}
|
|
const Fr = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
__proto__: null,
|
|
DataCache: $n,
|
|
FreeList: vI,
|
|
GunzipReader: WI,
|
|
IDENT_VERTEX_SHADER: HI,
|
|
Sint8ToFloat: On,
|
|
Uint8ToFloat: _n,
|
|
averagePositions: KI,
|
|
averageQuaternions: qI,
|
|
cloneClock: TI,
|
|
coinciDist: zI,
|
|
computeMaxSplats: rC,
|
|
coorientDist: ZI,
|
|
decodeQuatEulerXyz888: SC,
|
|
decodeQuatOctXy88R8: VI,
|
|
decodeQuatXyz888: MC,
|
|
decompressPartialGzip: XI,
|
|
encodeQuatEulerXyz888: mC,
|
|
encodeQuatOctXy88R8: tg,
|
|
encodeQuatXyz888: fC,
|
|
encodeSh1Rgb: NC,
|
|
encodeSh2Rgb: FC,
|
|
encodeSh3Rgb: GC,
|
|
epsilonSign: dC,
|
|
flipPixels: uC,
|
|
floatBitsToUint: jn,
|
|
floatToSint8: Ie,
|
|
floatToUint8: GA,
|
|
fromHalf: dA,
|
|
getArrayBuffers: bI,
|
|
getTextureSize: fA,
|
|
isAndroid: hC,
|
|
isMobile: cC,
|
|
isOculus: lC,
|
|
mapFilterObject: tC,
|
|
mapObject: AC,
|
|
newArray: eC,
|
|
omitUndefined: DC,
|
|
pixelsToPngUrl: wC,
|
|
setPackedSplat: Je,
|
|
setPackedSplatCenter: gC,
|
|
setPackedSplatOpacity: QC,
|
|
setPackedSplatQuat: sC,
|
|
setPackedSplatRgb: iC,
|
|
setPackedSplatRgba: BC,
|
|
setPackedSplatScales: IC,
|
|
toHalf: ct,
|
|
uintBitsToFloat: Pn,
|
|
unpackSplat: be,
|
|
withinCoinciDist: pC,
|
|
withinCoorientDist: ne,
|
|
withinDist: yC
|
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
class eg {
|
|
constructor({
|
|
graph: A,
|
|
inputs: e,
|
|
outputs: g,
|
|
template: I
|
|
}) {
|
|
this.graph = A, this.template = I, this.inputs = e ?? {}, this.outputs = g ?? {};
|
|
const s = new qg({ indent: this.template.indent });
|
|
for (const i in this.outputs)
|
|
this.outputs[i] && s.declares.add(this.outputs[i]);
|
|
const B = A.compile({
|
|
inputs: this.inputs,
|
|
outputs: this.outputs,
|
|
compile: s
|
|
});
|
|
this.shader = I.generate({ globals: s.globals, statements: B }), this.uniforms = s.uniforms, this.updaters = s.updaters;
|
|
}
|
|
prepareMaterial() {
|
|
return xC(this);
|
|
}
|
|
update() {
|
|
for (const A of this.updaters)
|
|
A();
|
|
}
|
|
}
|
|
class gg {
|
|
constructor(A) {
|
|
const e = A.match(/^([ \t]*)\{\{\s*GLOBALS\s*\}\}/m), g = A.match(/^([ \t]*)\{\{\s*STATEMENTS\s*\}\}/m);
|
|
if (!e || !g)
|
|
throw new Error(
|
|
"Template must contain {{ GLOBALS }} and {{ STATEMENTS }}"
|
|
);
|
|
this.before = A.substring(0, e.index), this.between = A.substring(
|
|
e.index + e[0].length,
|
|
g.index
|
|
), this.after = A.substring(
|
|
g.index + g[0].length
|
|
), this.indent = g[1];
|
|
}
|
|
generate({
|
|
globals: A,
|
|
statements: e
|
|
}) {
|
|
return this.before + Array.from(A).join(`
|
|
|
|
`) + this.between + e.map((g) => this.indent + g).join(`
|
|
`) + this.after;
|
|
}
|
|
}
|
|
const rg = /* @__PURE__ */ new Map();
|
|
function xC(t) {
|
|
let A = rg.get(t);
|
|
return A || (A = new E.RawShaderMaterial({
|
|
glslVersion: E.GLSL3,
|
|
vertexShader: HI,
|
|
fragmentShader: t.shader,
|
|
uniforms: t.uniforms
|
|
}), rg.set(t, A), A);
|
|
}
|
|
function Ig(t, A, e = "add") {
|
|
const g = () => {
|
|
throw new Error(`Invalid ${e} types: ${t}, ${A}`);
|
|
};
|
|
if (t === A) return t;
|
|
if (t === "int") {
|
|
if (hA(A)) return A;
|
|
g();
|
|
}
|
|
if (A === "int") {
|
|
if (hA(t)) return t;
|
|
g();
|
|
}
|
|
if (t === "uint") {
|
|
if (lA(A)) return A;
|
|
g();
|
|
}
|
|
if (A === "uint") {
|
|
if (lA(t)) return t;
|
|
g();
|
|
}
|
|
if (t === "float") {
|
|
if (it(A)) return A;
|
|
g();
|
|
}
|
|
if (A === "float") {
|
|
if (it(t)) return t;
|
|
g();
|
|
}
|
|
throw new Error(`Invalid ${e} types: ${t}, ${A}`);
|
|
}
|
|
function kC(t, A) {
|
|
return Ig(t, A, "sub");
|
|
}
|
|
function RC(t, A) {
|
|
const e = () => {
|
|
throw new Error(`Invalid mul types: ${t}, ${A}`);
|
|
}, g = (I) => I;
|
|
if (t === "int") {
|
|
if (hA(A)) return g(A);
|
|
e();
|
|
}
|
|
if (A === "int") {
|
|
if (hA(t)) return g(t);
|
|
e();
|
|
}
|
|
if (t === "uint") {
|
|
if (lA(A)) return g(A);
|
|
e();
|
|
}
|
|
if (A === "uint") {
|
|
if (lA(t)) return g(t);
|
|
e();
|
|
}
|
|
if (t === "float") {
|
|
if (it(A)) return g(A);
|
|
e();
|
|
}
|
|
if (A === "float") {
|
|
if (it(t)) return g(t);
|
|
e();
|
|
}
|
|
if (hA(t) || lA(t) || hA(A) || lA(A)) {
|
|
if (t === A) return g(t);
|
|
e();
|
|
}
|
|
if (t === "vec2") {
|
|
if (A === "vec2" || Qt(A)) return g("vec2");
|
|
if (A === "mat3x2") return g("vec3");
|
|
if (A === "mat4x2") return g("vec4");
|
|
e();
|
|
}
|
|
if (t === "vec3") {
|
|
if (A === "mat2x3") return g("vec2");
|
|
if (A === "vec3" || nt(A)) return g("vec3");
|
|
if (A === "mat4x3") return g("vec4");
|
|
e();
|
|
}
|
|
if (t === "vec4") {
|
|
if (A === "mat2x4") return g("vec2");
|
|
if (A === "mat3x4") return g("vec3");
|
|
if (A === "vec4" || Ct(A)) return g("vec4");
|
|
e();
|
|
}
|
|
if (A === "vec2") {
|
|
if (Qt(t)) return g("vec2");
|
|
if (t === "mat2x3") return g("vec3");
|
|
if (t === "mat2x4") return g("vec4");
|
|
e();
|
|
}
|
|
if (A === "vec3") {
|
|
if (t === "mat3x2") return g("vec2");
|
|
if (nt(t)) return g("vec3");
|
|
if (t === "mat3x4") return g("vec4");
|
|
e();
|
|
}
|
|
if (A === "vec4") {
|
|
if (t === "mat4x2") return g("vec2");
|
|
if (t === "mat4x3") return g("vec3");
|
|
if (Ct(t)) return g("vec4");
|
|
e();
|
|
}
|
|
if (Qt(t)) {
|
|
if (Qt(A)) return g("mat2");
|
|
if (A === "mat3x2") return g("mat3x2");
|
|
if (A === "mat4x2") return g("mat4x2");
|
|
e();
|
|
}
|
|
if (t === "mat2x3") {
|
|
if (Qt(A)) return g("mat2x3");
|
|
if (A === "mat3x2") return g("mat3");
|
|
if (A === "mat4x2") return g("mat4x3");
|
|
e();
|
|
}
|
|
if (t === "mat2x4") {
|
|
if (Qt(A)) return g("mat2x4");
|
|
if (A === "mat3x2") return g("mat3x4");
|
|
if (A === "mat4x2") return g("mat4");
|
|
e();
|
|
}
|
|
if (t === "mat3x2") {
|
|
if (A === "mat2x3") return g("mat2");
|
|
if (nt(A)) return g("mat3x2");
|
|
if (A === "mat4x3") return g("mat4x2");
|
|
e();
|
|
}
|
|
if (nt(t)) {
|
|
if (A === "mat2x3") return g("mat2x3");
|
|
if (nt(A)) return g("mat3");
|
|
if (A === "mat4x3") return g("mat4x3");
|
|
e();
|
|
}
|
|
if (t === "mat3x4") {
|
|
if (A === "mat2x3") return g("mat2x4");
|
|
if (nt(A)) return g("mat3x4");
|
|
if (A === "mat4x3") return g("mat4");
|
|
e();
|
|
}
|
|
if (t === "mat4x2") {
|
|
if (A === "mat2x4") return g("mat2");
|
|
if (A === "mat3x4") return g("mat3x2");
|
|
if (Ct(A)) return g("mat4x2");
|
|
e();
|
|
}
|
|
if (t === "mat4x3") {
|
|
if (A === "mat2x4") return g("mat2x3");
|
|
if (A === "mat3x4") return g("mat3");
|
|
if (Ct(A)) return g("mat4x3");
|
|
e();
|
|
}
|
|
if (Ct(t)) {
|
|
if (A === "mat2x4") return g("mat2x4");
|
|
if (A === "mat3x4") return g("mat3x4");
|
|
if (Ct(A)) return g("mat4");
|
|
e();
|
|
}
|
|
throw new Error(`Invalid mul types: ${t}, ${A}`);
|
|
}
|
|
function UC(t, A) {
|
|
return Ig(t, A, "div");
|
|
}
|
|
function LC(t, A) {
|
|
if (t === A) return t;
|
|
if (t === "int") {
|
|
if (hA(A)) return A;
|
|
} else if (A === "int") {
|
|
if (hA(t)) return t;
|
|
} else if (t === "uint") {
|
|
if (lA(A)) return A;
|
|
} else if (A === "uint" && lA(t))
|
|
return t;
|
|
throw new Error(`Invalid imod types: ${t}, ${A}`);
|
|
}
|
|
function YC(t, A) {
|
|
if (t === A || A === "float") return t;
|
|
throw new Error(`Invalid mod types: ${t}, ${A}`);
|
|
}
|
|
function JC(t) {
|
|
return t;
|
|
}
|
|
function bC(t) {
|
|
return t;
|
|
}
|
|
function vC(t) {
|
|
return t;
|
|
}
|
|
function TC(t) {
|
|
return t;
|
|
}
|
|
function HC(t) {
|
|
return t;
|
|
}
|
|
function KC(t) {
|
|
return t;
|
|
}
|
|
function qC(t) {
|
|
return t;
|
|
}
|
|
function zC(t) {
|
|
return t;
|
|
}
|
|
function ZC(t) {
|
|
return t;
|
|
}
|
|
function VC(t) {
|
|
return t;
|
|
}
|
|
function XC(t) {
|
|
return t;
|
|
}
|
|
function WC(t) {
|
|
return t;
|
|
}
|
|
function jC(t) {
|
|
return t;
|
|
}
|
|
function PC(t) {
|
|
return t;
|
|
}
|
|
function _C(t) {
|
|
return t;
|
|
}
|
|
function OC(t) {
|
|
return t;
|
|
}
|
|
function jI(t, A, e = "min") {
|
|
if (t === A) return t;
|
|
if (A === "float") {
|
|
if (Xt(t)) return t;
|
|
} else if (A === "int") {
|
|
if (hA(t)) return t;
|
|
} else if (A === "uint" && lA(t))
|
|
return t;
|
|
throw new Error(`Invalid ${e} types: ${t}, ${A}`);
|
|
}
|
|
function $C(t, A) {
|
|
return jI(t, A, "max");
|
|
}
|
|
function Aa(t, A, e) {
|
|
if (A === "float") {
|
|
if (Xt(t)) return t;
|
|
} else if (A === "int") {
|
|
if (hA(t)) return t;
|
|
} else if (A === "uint" && lA(t))
|
|
return t;
|
|
throw new Error(`Invalid clamp types: ${t}, ${A}`);
|
|
}
|
|
function ta(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 ea(t, A) {
|
|
if (t === A || A === "float") return A;
|
|
throw new Error(`Invalid step types: ${t}, ${A}`);
|
|
}
|
|
function ga(t, A, e) {
|
|
if (t === A && (t === e || t === "float"))
|
|
return e;
|
|
throw new Error(`Invalid smoothstep types: ${t}, ${A}, ${e}`);
|
|
}
|
|
function PI(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 Ia(t) {
|
|
return PI(t, "isInf");
|
|
}
|
|
const cA = (t, A) => new As({ a: t, b: A }), ut = (t, A) => new ts({ a: t, b: A }), sA = (t, A) => new es({ a: t, b: A }), se = (t, A) => new gs({ a: t, b: A }), ve = (t, A) => new Is({ a: t, b: A }), _I = (t, A) => new ss({ a: t, b: A }), sa = (t) => new Bs({ a: t }).outputs, sg = (t) => new is({ a: t }), Ba = (t) => new Qs({ a: t }), ia = (t) => new ns({ a: t }), Qa = (t) => new Cs({ a: t }), na = (t) => new as({ a: t }), Ca = (t) => new Es({ a: t }), aa = (t) => new os({ a: t }), Be = (t) => new rs({ a: t }), Ea = (t, A) => new cs({ a: t, b: A }), oa = (t) => new hs({ a: t }), ra = (t) => new ls({ a: t }), ca = (t) => new us({ a: t }), ha = (t) => new ws({ a: t }), la = (t) => new Ds({ a: t }), ua = (t) => new ys({ a: t }), wa = (t) => new ps({ a: t }), Da = (t, A) => new ds({ a: t, b: A }), OI = (t, A) => new fs({ a: t, b: A }), ya = (t, A, e) => new Ms({ a: t, min: A, max: e }), $I = (t, A, e) => new ms({ a: t, b: A, t: e }), pa = (t, A) => new Ss({ edge: t, x: A }), da = (t, A, e) => new Ns({ edge0: t, edge1: A, x: e }), fa = (t) => new Fs({ a: t }), Ma = (t) => new Gs({ a: t });
|
|
class As extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outKey: "sum", outTypeFunc: Ig }), this.statements = ({ inputs: g, outputs: I }) => [`${I.sum} = ${g.a} + ${g.b};`];
|
|
}
|
|
}
|
|
class ts extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outKey: "difference", outTypeFunc: kC }), this.statements = ({ inputs: g, outputs: I }) => [`${I.difference} = ${g.a} - ${g.b};`];
|
|
}
|
|
}
|
|
class es extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outKey: "product", outTypeFunc: RC }), this.statements = ({ inputs: g, outputs: I }) => [`${I.product} = ${g.a} * ${g.b};`];
|
|
}
|
|
}
|
|
class gs extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outKey: "quotient", outTypeFunc: UC }), this.statements = ({ inputs: g, outputs: I }) => [`${I.quotient} = ${g.a} / ${g.b};`];
|
|
}
|
|
}
|
|
class Is extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outKey: "remainder", outTypeFunc: LC }), this.statements = ({ inputs: g, outputs: I }) => [`${I.remainder} = ${g.a} % ${g.b};`];
|
|
}
|
|
}
|
|
class ss extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outKey: "remainder", outTypeFunc: YC }), this.statements = ({ inputs: g, outputs: I }) => [`${I.remainder} = mod(${g.a}, ${g.b});`];
|
|
}
|
|
}
|
|
class Bs extends X {
|
|
constructor({ a: A }) {
|
|
const e = { a: V(A) }, g = e.a, I = {
|
|
fract: g,
|
|
integer: g
|
|
};
|
|
super({ inTypes: e, outTypes: I, inputs: { a: A } }), this.statements = ({ inputs: s, outputs: B }) => [`${B.fract} = modf(${s.a}, ${B.integer});`];
|
|
}
|
|
}
|
|
class is extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "neg", outTypeFunc: JC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.neg} = -${e.a};`];
|
|
}
|
|
}
|
|
class Qs extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "abs", outTypeFunc: bC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.abs} = abs(${e.a});`];
|
|
}
|
|
}
|
|
class ns extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "sign", outTypeFunc: vC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.sign} = sign(${e.a});`];
|
|
}
|
|
}
|
|
class Cs extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "floor", outTypeFunc: TC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.floor} = floor(${e.a});`];
|
|
}
|
|
}
|
|
class as extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "ceil", outTypeFunc: HC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.ceil} = ceil(${e.a});`];
|
|
}
|
|
}
|
|
class Es extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "trunc", outTypeFunc: KC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.trunc} = trunc(${e.a});`];
|
|
}
|
|
}
|
|
class os extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "round", outTypeFunc: qC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.round} = round(${e.a});`];
|
|
}
|
|
}
|
|
class rs extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "fract", outTypeFunc: zC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.fract} = fract(${e.a});`];
|
|
}
|
|
}
|
|
class cs extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outKey: "power", outTypeFunc: ZC }), this.statements = ({ inputs: g, outputs: I }) => [`${I.power} = pow(${g.a}, ${g.b});`];
|
|
}
|
|
}
|
|
class hs extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "exp", outTypeFunc: VC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.exp} = exp(${e.a});`];
|
|
}
|
|
}
|
|
class ls extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "exp2", outTypeFunc: XC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.exp2} = exp2(${e.a});`];
|
|
}
|
|
}
|
|
class us extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "log", outTypeFunc: WC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.log} = log(${e.a});`];
|
|
}
|
|
}
|
|
class ws extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "log2", outTypeFunc: jC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.log2} = log2(${e.a});`];
|
|
}
|
|
}
|
|
class Ds extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "sqr", outTypeFunc: PC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.sqr} = ${e.a} * ${e.a};`];
|
|
}
|
|
}
|
|
class ys extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "sqrt", outTypeFunc: _C }), this.statements = ({ inputs: e, outputs: g }) => [`${g.sqrt} = sqrt(${e.a});`];
|
|
}
|
|
}
|
|
class ps extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "inversesqrt", outTypeFunc: OC }), this.statements = ({ inputs: e, outputs: g }) => [`${g.inversesqrt} = inversesqrt(${e.a});`];
|
|
}
|
|
}
|
|
class ds extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outKey: "min", outTypeFunc: jI }), this.statements = ({ inputs: g, outputs: I }) => [`${I.min} = min(${g.a}, ${g.b});`];
|
|
}
|
|
}
|
|
class fs extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outKey: "max", outTypeFunc: $C }), this.statements = ({ inputs: g, outputs: I }) => [`${I.max} = max(${g.a}, ${g.b});`];
|
|
}
|
|
}
|
|
class Ms extends yt {
|
|
constructor({
|
|
a: A,
|
|
min: e,
|
|
max: g
|
|
}) {
|
|
super({
|
|
a: A,
|
|
b: e,
|
|
c: g,
|
|
outKey: "clamp",
|
|
outTypeFunc: Aa
|
|
}), this.statements = ({ inputs: I, outputs: s }) => {
|
|
const { a: B, b: i, c: Q } = I;
|
|
return [`${s.clamp} = clamp(${B}, ${i}, ${Q});`];
|
|
};
|
|
}
|
|
}
|
|
class ms extends yt {
|
|
constructor({ a: A, b: e, t: g }) {
|
|
super({ a: A, b: e, c: g, outKey: "mix", outTypeFunc: ta }), this.statements = ({ inputs: I, outputs: s }) => {
|
|
const { a: B, b: i, c: Q } = I;
|
|
return [`${s.mix} = mix(${B}, ${i}, ${Q});`];
|
|
};
|
|
}
|
|
}
|
|
class Ss extends tA {
|
|
constructor({ edge: A, x: e }) {
|
|
super({
|
|
a: A,
|
|
b: e,
|
|
outKey: "step",
|
|
outTypeFunc: ea
|
|
}), this.statements = ({ inputs: g, outputs: I }) => {
|
|
const { a: s, b: B } = g;
|
|
return [`${I.step} = step(${s}, ${B});`];
|
|
};
|
|
}
|
|
}
|
|
class Ns extends yt {
|
|
constructor({
|
|
edge0: A,
|
|
edge1: e,
|
|
x: g
|
|
}) {
|
|
super({
|
|
a: A,
|
|
b: e,
|
|
c: g,
|
|
outKey: "smoothstep",
|
|
outTypeFunc: ga
|
|
}), this.statements = ({ inputs: I, outputs: s }) => {
|
|
const { a: B, b: i, c: Q } = I;
|
|
return [`${s.smoothstep} = smoothstep(${B}, ${i}, ${Q});`];
|
|
};
|
|
}
|
|
}
|
|
class Fs extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "isNan", outTypeFunc: PI }), this.statements = ({ inputs: e, outputs: g }) => [`${g.isNan} = isNan(${e.a});`];
|
|
}
|
|
}
|
|
class Gs extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "isInf", outTypeFunc: Ia }), this.statements = ({ inputs: e, outputs: g }) => [`${g.isInf} = isInf(${e.a});`];
|
|
}
|
|
}
|
|
const ma = (t, A) => new ks({ a: t, b: A }), Sa = (t, A) => new Rs({ a: t, b: A }), Na = (t, A) => new Us({ a: t, b: A }), Fa = (t) => new Ls({ a: t }), Ga = (t, A) => new Ys({ a: t, b: A }), xa = (t, A) => new Js({ a: t, b: A }), ka = (t, A) => new bs({ a: t, b: A }), xs = (t, A) => new vs({ a: t, b: A }), Ra = (t, A) => new Ts({ a: t, b: A }), Ua = (t, A) => new Hs({ a: t, b: A }), La = (t) => new Ks({ a: t }), Ya = (t) => new qs({ a: t }), Bg = (t, A, e) => new zs({ cond: t, t: A, f: e }), Ja = (t) => new Vs({ a: t });
|
|
class ks extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outTypeFunc: (g, I) => g, outKey: "and" }), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.and === "bool" ? [`${I.and} = ${g.a} && ${g.b};`] : [`${I.and} = ${g.a} & ${g.b};`];
|
|
}
|
|
}
|
|
class Rs extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outTypeFunc: (g, I) => g, outKey: "or" }), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.or === "bool" ? [`${I.or} = ${g.a} || ${g.b};`] : [`${I.or} = ${g.a} | ${g.b};`];
|
|
}
|
|
}
|
|
class Us extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outTypeFunc: (g, I) => g, outKey: "xor" }), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.xor === "bool" ? [`${I.xor} = ${g.a} ^^ ${g.b};`] : [`${I.xor} = ${g.a} ^ ${g.b};`];
|
|
}
|
|
}
|
|
class Ls extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outTypeFunc: (e) => e, outKey: "not" }), this.statements = ({ inputs: e, outputs: g }) => this.outTypes.not === "bool" ? [`${g.not} = !${e.a};`] : [`${g.not} = not(${e.a});`];
|
|
}
|
|
}
|
|
class Ys extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({
|
|
a: A,
|
|
b: e,
|
|
outTypeFunc: (g, I) => we(g, "lessThan"),
|
|
outKey: "lessThan"
|
|
}), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.lessThan === "bool" ? [`${I.lessThan} = ${g.a} < ${g.b};`] : [`${I.lessThan} = lessThan(${g.a}, ${g.b});`];
|
|
}
|
|
}
|
|
class Js extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({
|
|
a: A,
|
|
b: e,
|
|
outTypeFunc: (g, I) => we(g, "lessThanEqual"),
|
|
outKey: "lessThanEqual"
|
|
}), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.lessThanEqual === "bool" ? [`${I.lessThanEqual} = ${g.a} <= ${g.b};`] : [
|
|
`${I.lessThanEqual} = lessThanEqual(${g.a}, ${g.b});`
|
|
];
|
|
}
|
|
}
|
|
class bs extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({
|
|
a: A,
|
|
b: e,
|
|
outTypeFunc: (g, I) => we(g, "greaterThan"),
|
|
outKey: "greaterThan"
|
|
}), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.greaterThan === "bool" ? [`${I.greaterThan} = ${g.a} > ${g.b};`] : [
|
|
`${I.greaterThan} = greaterThan(${g.a}, ${g.b});`
|
|
];
|
|
}
|
|
}
|
|
class vs extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({
|
|
a: A,
|
|
b: e,
|
|
outTypeFunc: (g, I) => we(g, "greaterThanEqual"),
|
|
outKey: "greaterThanEqual"
|
|
}), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.greaterThanEqual === "bool" ? [`${I.greaterThanEqual} = ${g.a} >= ${g.b};`] : [
|
|
`${I.greaterThanEqual} = greaterThanEqual(${g.a}, ${g.b});`
|
|
];
|
|
}
|
|
}
|
|
class Ts extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outTypeFunc: Zs, outKey: "equal" }), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.equal === "bool" ? [`${I.equal} = ${g.a} == ${g.b};`] : [`${I.equal} = equal(${g.a}, ${g.b});`];
|
|
}
|
|
}
|
|
class Hs extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outTypeFunc: ba, outKey: "notEqual" }), this.statements = ({ inputs: g, outputs: I }) => this.outTypes.notEqual === "bool" ? [`${I.notEqual} = ${g.a} != ${g.b};`] : [`${I.notEqual} = notEqual(${g.a}, ${g.b});`];
|
|
}
|
|
}
|
|
class Ks extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outTypeFunc: (e) => "bool", outKey: "any" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.any} = any(${e.a});`];
|
|
}
|
|
}
|
|
class qs extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outTypeFunc: (e) => "bool", outKey: "all" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.all} = all(${e.a});`];
|
|
}
|
|
}
|
|
class zs extends yt {
|
|
constructor({
|
|
cond: A,
|
|
t: e,
|
|
f: g
|
|
}) {
|
|
super({
|
|
a: A,
|
|
b: e,
|
|
c: g,
|
|
outKey: "select",
|
|
outTypeFunc: (I, s, B) => s
|
|
}), this.statements = ({ inputs: I, outputs: s }) => {
|
|
const { a: B, b: i, c: Q } = I;
|
|
return [`${s.select} = (${B}) ? (${i}) : (${Q});`];
|
|
};
|
|
}
|
|
}
|
|
function we(t, A) {
|
|
if (Dt(t))
|
|
return "bool";
|
|
if (t === "ivec2" || t === "uvec2" || t === "vec2")
|
|
return "bvec2";
|
|
if (t === "ivec3" || t === "uvec3" || t === "vec3")
|
|
return "bvec3";
|
|
if (t === "ivec4" || t === "uvec4" || t === "vec4")
|
|
return "bvec4";
|
|
throw new Error(`Invalid ${A} type: ${t}`);
|
|
}
|
|
function Zs(t, A = "equal") {
|
|
if (Dt(t))
|
|
return "bool";
|
|
if (wt(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 ba(t) {
|
|
return Zs(t, "notEqual");
|
|
}
|
|
function va(t) {
|
|
if (wt(t))
|
|
return "bool";
|
|
if (hA(t))
|
|
return "int";
|
|
if (lA(t))
|
|
return "uint";
|
|
throw new Error(`Invalid compXor type: ${t}`);
|
|
}
|
|
class Vs extends F {
|
|
constructor({ a: A }) {
|
|
const e = va(V(A));
|
|
super({ a: A, outTypeFunc: (g) => e, outKey: "compXor" }), this.statements = ({ inputs: g, outputs: I }) => {
|
|
if (Dt(this.outTypes.compXor))
|
|
return [`${I.compXor} = ${g.a};`];
|
|
const B = (xt(e) ? ["x", "y"] : kt(e) ? ["x", "y", "z"] : ["x", "y", "z", "w"]).map((Q) => `${g.a}.${Q}`), i = wt(e) ? "^^" : "^";
|
|
return [`${I.compXor} = ${B.join(` ${i} `)};`];
|
|
};
|
|
}
|
|
}
|
|
const Ta = (t) => new $s({ value: t }), Ha = (t) => new AB({ value: t }), Ka = (t) => new tB({ value: t }), Xs = (t) => new eB({ value: t }), qa = (t) => new gB({ value: t }), za = (t) => new IB({ value: t }), Za = (t) => new sB({ value: t }), Va = (t) => new BB({ value: t }), Xa = (t) => new iB({ value: t }), Wa = (t) => new QB({ value: t }), ja = (t) => new nB({ value: t }), Pa = (t) => new CB({ value: t }), _a = (t) => new aB({ value: t }), Ws = (t) => new EB({ value: t }), ht = (t) => new oB({ value: t }), js = (t) => new rB({ value: t }), Oa = (t) => new cB({ value: t }), $a = (t) => new hB({ value: t }), AE = (t) => new lB({ value: t }), Ps = (t) => new uB({ value: t }), _s = (t) => new wB({ value: t }), tE = (t) => new DB({ value: t }), eE = (t) => new yB({ value: t }), gE = (t) => new pB({ value: t }), IE = (t) => new dB({ value: t }), sE = (t) => new fB({ value: t }), BE = (t) => new MB({ value: t }), Os = (t) => new mB({ value: t }), iE = (t) => new SB({ value: t }), Te = (t) => new NB({ value: t });
|
|
class nA extends F {
|
|
constructor({
|
|
value: A,
|
|
outType: e,
|
|
outKey: g
|
|
}) {
|
|
super({ a: A, outTypeFunc: () => e, outKey: g }), this.statements = ({ inputs: I, outputs: s }) => [
|
|
`${s[g]} = ${Hg(e)}(${I.a});`
|
|
];
|
|
}
|
|
}
|
|
class $s extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "bool", outKey: "bool" });
|
|
}
|
|
}
|
|
class AB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "int", outKey: "int" });
|
|
}
|
|
}
|
|
class tB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "uint", outKey: "uint" });
|
|
}
|
|
}
|
|
class eB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "float", outKey: "float" });
|
|
}
|
|
}
|
|
class gB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "bvec2", outKey: "bvec2" });
|
|
}
|
|
}
|
|
class IB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "bvec3", outKey: "bvec3" });
|
|
}
|
|
}
|
|
class sB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "bvec4", outKey: "bvec4" });
|
|
}
|
|
}
|
|
class BB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "ivec2", outKey: "ivec2" });
|
|
}
|
|
}
|
|
class iB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "ivec3", outKey: "ivec3" });
|
|
}
|
|
}
|
|
class QB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "ivec4", outKey: "ivec4" });
|
|
}
|
|
}
|
|
class nB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "uvec2", outKey: "uvec2" });
|
|
}
|
|
}
|
|
class CB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "uvec3", outKey: "uvec3" });
|
|
}
|
|
}
|
|
class aB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "uvec4", outKey: "uvec4" });
|
|
}
|
|
}
|
|
class EB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "vec2", outKey: "vec2" });
|
|
}
|
|
}
|
|
class oB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "vec3", outKey: "vec3" });
|
|
}
|
|
}
|
|
class rB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "vec4", outKey: "vec4" });
|
|
}
|
|
}
|
|
class cB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "mat2", outKey: "mat2" });
|
|
}
|
|
}
|
|
class hB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "mat3", outKey: "mat3" });
|
|
}
|
|
}
|
|
class lB extends nA {
|
|
constructor({
|
|
value: A
|
|
}) {
|
|
super({ value: A, outType: "mat4", outKey: "mat4" });
|
|
}
|
|
}
|
|
class uB extends F {
|
|
constructor({ value: A }) {
|
|
super({ a: A, outKey: "int", outTypeFunc: () => "int" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.int} = floatBitsToInt(${e.a});`];
|
|
}
|
|
}
|
|
class wB extends F {
|
|
constructor({ value: A }) {
|
|
super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.uint} = floatBitsToUint(${e.a});`];
|
|
}
|
|
}
|
|
class DB extends F {
|
|
constructor({ value: A }) {
|
|
super({ a: A, outKey: "float", outTypeFunc: () => "float" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.float} = intBitsToFloat(${e.a});`];
|
|
}
|
|
}
|
|
class yB extends F {
|
|
constructor({ value: A }) {
|
|
super({ a: A, outKey: "float", outTypeFunc: () => "float" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.float} = uintBitsToFloat(${e.a});`];
|
|
}
|
|
}
|
|
class pB extends F {
|
|
constructor({ value: A }) {
|
|
super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.uint} = packSnorm2x16(${e.a});`];
|
|
}
|
|
}
|
|
class dB extends F {
|
|
constructor({ value: A }) {
|
|
super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.vec2} = unpackSnorm2x16(${e.a});`];
|
|
}
|
|
}
|
|
class fB extends F {
|
|
constructor({ value: A }) {
|
|
super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.uint} = packUnorm2x16(${e.a});`];
|
|
}
|
|
}
|
|
class MB extends F {
|
|
constructor({ value: A }) {
|
|
super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.vec2} = unpackUnorm2x16(${e.a});`];
|
|
}
|
|
}
|
|
class mB extends F {
|
|
constructor({ value: A }) {
|
|
super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.uint} = packHalf2x16(${e.a});`];
|
|
}
|
|
}
|
|
class SB extends F {
|
|
constructor({ value: A }) {
|
|
super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: g }) => [`${g.vec2} = unpackHalf2x16(${e.a});`];
|
|
}
|
|
}
|
|
class NB extends F {
|
|
constructor({ value: A }) {
|
|
super({ a: A, outKey: "rgba8", outTypeFunc: () => "vec4" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`uvec4 uRgba = uvec4(${e.a} & 0xffu, (${e.a} >> 8u) & 0xffu, (${e.a} >> 16u) & 0xffu, (${e.a} >> 24u) & 0xffu);`,
|
|
`${g.rgba8} = vec4(uRgba) / 255.0;`
|
|
];
|
|
}
|
|
}
|
|
const QE = (t) => new kB({ a: t }), nE = (t, A) => new RB({ a: t, b: A }), FB = (t, A) => new UB({ a: t, b: A }), CE = (t, A) => new LB({ a: t, b: A }), GB = (t) => new YB({ a: t }), aE = (t, A, e) => new vB({ a: t, b: A, c: e }), EE = (t, A) => new TB({ incident: t, normal: A }), oE = (t, A, e) => new HB({ incident: t, normal: A, eta: e }), lt = (t) => new XB({ vector: t }), zA = ({
|
|
vector: t,
|
|
vectorType: A,
|
|
x: e,
|
|
y: g,
|
|
z: I,
|
|
w: s,
|
|
r: B,
|
|
g: i,
|
|
b: Q,
|
|
a: C
|
|
}) => new WB({ vector: t, vectorType: A, x: e, y: g, z: I, w: s, r: B, g: i, b: Q, a: C }), rE = (t) => new JB({ a: t }), xB = (t, A) => new bB({ a: t, b: A }), cE = (t, A) => new jB({ vector: t, select: A }), hE = (t, A) => new KB({ a: t, b: A }), lE = (t, A) => new qB({ a: t, b: A }), uE = (t) => new zB({ a: t }), wE = (t) => new ZB({ a: t }), DE = (t) => new VB({ a: t });
|
|
class kB extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outTypeFunc: (e) => "float", outKey: "length" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.length} = length(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
class RB extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outKey: "distance", outTypeFunc: (g, I) => "float" }), this.statements = ({ inputs: g, outputs: I }) => [
|
|
`${I.distance} = distance(${g.a}, ${g.b});`
|
|
];
|
|
}
|
|
}
|
|
class UB extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outKey: "dot", outTypeFunc: (g, I) => "float" }), this.statements = ({ inputs: g, outputs: I }) => [
|
|
`${I.dot} = dot(${g.a}, ${g.b});`
|
|
];
|
|
}
|
|
}
|
|
class LB extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outKey: "cross", outTypeFunc: (g, I) => "vec3" }), this.statements = ({ inputs: g, outputs: I }) => [
|
|
`${I.cross} = cross(${g.a}, ${g.b});`
|
|
];
|
|
}
|
|
}
|
|
class YB extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outTypeFunc: (e) => e, outKey: "normalize" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.normalize} = normalize(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
function yE(t) {
|
|
if (t === "vec3")
|
|
return "vec2";
|
|
if (t === "vec4")
|
|
return "vec3";
|
|
throw new Error("Invalid type");
|
|
}
|
|
class JB extends F {
|
|
constructor({ a: A }) {
|
|
super({
|
|
a: A,
|
|
outTypeFunc: (e) => yE(e),
|
|
outKey: "projected"
|
|
}), this.statements = ({ inputs: e, outputs: g }) => {
|
|
if (this.inTypes.a === "vec3")
|
|
return [`${g.projected} = ${e.a}.xy / ${e.a}.z;`];
|
|
if (this.inTypes.a === "vec4")
|
|
return [`${g.projected} = ${e.a}.xyz / ${e.a}.w;`];
|
|
throw new Error("Invalid type");
|
|
};
|
|
}
|
|
}
|
|
function pE(t) {
|
|
if (t === "float") return "vec2";
|
|
if (t === "vec2") return "vec3";
|
|
if (t === "vec3") return "vec4";
|
|
throw new Error("Invalid type");
|
|
}
|
|
class bB extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
const g = V(A), I = pE(g);
|
|
super({ a: A, b: e, outKey: "extend", outTypeFunc: () => I }), this.statements = ({ inputs: s, outputs: B }) => [
|
|
`${B.extend} = ${I}(${s.a}, ${s.b});`
|
|
];
|
|
}
|
|
}
|
|
class vB extends yt {
|
|
constructor({ a: A, b: e, c: g }) {
|
|
super({
|
|
a: A,
|
|
b: e,
|
|
c: g,
|
|
outKey: "forward",
|
|
outTypeFunc: (I, s, B) => I
|
|
}), this.statements = ({ inputs: I, outputs: s }) => [
|
|
`${s.forward} = faceforward(${I.a}, ${I.b}, ${I.c});`
|
|
];
|
|
}
|
|
}
|
|
class TB extends tA {
|
|
constructor({
|
|
incident: A,
|
|
normal: e
|
|
}) {
|
|
super({
|
|
a: A,
|
|
b: e,
|
|
outKey: "reflection",
|
|
outTypeFunc: (g, I) => g
|
|
}), this.statements = ({ inputs: g, outputs: I }) => [
|
|
`${I.reflection} = reflect(${g.a}, ${g.b});`
|
|
];
|
|
}
|
|
}
|
|
class HB extends yt {
|
|
constructor({
|
|
incident: A,
|
|
normal: e,
|
|
eta: g
|
|
}) {
|
|
super({
|
|
a: A,
|
|
b: e,
|
|
c: g,
|
|
outKey: "refraction",
|
|
outTypeFunc: (I, s, B) => I
|
|
}), this.statements = ({ inputs: I, outputs: s }) => [
|
|
`${s.refraction} = refract(${I.a}, ${I.b}, ${I.c});`
|
|
];
|
|
}
|
|
}
|
|
class KB extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outKey: "product", outTypeFunc: (g, I) => g }), this.statements = ({ inputs: g, outputs: I }) => [
|
|
`${I.product} = matrixCompMult(${A}, ${e});`
|
|
];
|
|
}
|
|
}
|
|
function dE(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 qB extends tA {
|
|
constructor({ a: A, b: e }) {
|
|
super({ a: A, b: e, outKey: "outer", outTypeFunc: dE }), this.statements = ({ inputs: g, outputs: I }) => [
|
|
`${I.outer} = outerProduct(${g.a}, ${g.b});`
|
|
];
|
|
}
|
|
}
|
|
function fE(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 zB extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "transpose", outTypeFunc: fE }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.transpose} = transpose(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
class ZB extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "det", outTypeFunc: (e) => "float" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.det} = determinant(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
class VB extends F {
|
|
constructor({ a: A }) {
|
|
super({ a: A, outKey: "inverse", outTypeFunc: (e) => e }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.inverse} = inverse(${A});`
|
|
];
|
|
}
|
|
}
|
|
function ME(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 XB extends X {
|
|
constructor({ vector: A }) {
|
|
const g = { vector: V(A) }, I = ME(g.vector);
|
|
super({ inTypes: g, outTypes: I, inputs: { vector: A } }), this.statements = ({ inputs: s, outputs: B }) => {
|
|
const { x: i, y: Q, z: C, w: a, r: n, g: o, b: r, a: h } = B, { vector: c } = s;
|
|
return [
|
|
i ? `${i} = ${c}.x;` : null,
|
|
Q ? `${Q} = ${c}.y;` : null,
|
|
C ? `${C} = ${c}.z;` : null,
|
|
a ? `${a} = ${c}.w;` : null,
|
|
n ? `${n} = ${c}.r;` : null,
|
|
o ? `${o} = ${c}.g;` : null,
|
|
r ? `${r} = ${c}.b;` : null,
|
|
h ? `${h} = ${c}.a;` : null
|
|
].filter(Boolean);
|
|
};
|
|
}
|
|
}
|
|
class WB extends X {
|
|
constructor({
|
|
vector: A,
|
|
vectorType: e,
|
|
x: g,
|
|
y: I,
|
|
z: s,
|
|
w: B,
|
|
r: i,
|
|
g: Q,
|
|
b: C,
|
|
a
|
|
}) {
|
|
if (!A && !e)
|
|
throw new Error("Either vector or vectorType must be provided");
|
|
const n = e ?? V(A), o = bg(n), r = vg(n), h = {
|
|
vector: n,
|
|
x: o,
|
|
y: o,
|
|
r: o,
|
|
g: o
|
|
}, c = { vector: A, x: g, y: I, r: i, g: Q };
|
|
r >= 3 && (Object.assign(h, { z: o, b: o }), Object.assign(c, { z: s, b: C })), r >= 4 && (Object.assign(h, { w: o, a: o }), Object.assign(c, { w: B, a })), super({ inTypes: h, outTypes: { vector: n }, inputs: c }), this.statements = ({ inputs: l, outputs: u }) => {
|
|
const { vector: w } = u, {
|
|
vector: D,
|
|
x: y,
|
|
y: d,
|
|
z: S,
|
|
w: M,
|
|
r: p,
|
|
g: f,
|
|
b: R,
|
|
a: N
|
|
} = l, m = [
|
|
`${w}.x = ${y ?? p ?? (D ? `${D}.x` : bt(o))};`,
|
|
`${w}.y = ${d ?? f ?? (D ? `${D}.y` : bt(o))};`
|
|
];
|
|
return r >= 3 && m.push(
|
|
`${w}.z = ${S ?? R ?? (D ? `${D}.z` : bt(o))};`
|
|
), r >= 4 && m.push(
|
|
`${w}.w = ${M ?? N ?? (D ? `${D}.w` : bt(o))};`
|
|
), m;
|
|
};
|
|
}
|
|
dynoOut() {
|
|
return new Z(
|
|
this,
|
|
"vector"
|
|
);
|
|
}
|
|
}
|
|
function mE(t, A) {
|
|
let e = null;
|
|
if (Xt(t) ? e = A.length === 1 ? "float" : A.length === 2 ? "vec2" : A.length === 3 ? "vec3" : A.length === 4 ? "vec4" : null : hA(t) ? e = A.length === 1 ? "int" : A.length === 2 ? "ivec2" : A.length === 3 ? "ivec3" : A.length === 4 ? "ivec4" : null : lA(t) && (e = A.length === 1 ? "uint" : A.length === 2 ? "uvec2" : A.length === 3 ? "uvec3" : A.length === 4 ? "uvec4" : null), e == null)
|
|
throw new Error(`Invalid swizzle: ${A}`);
|
|
return e;
|
|
}
|
|
class jB extends F {
|
|
constructor({ vector: A, select: e }) {
|
|
super({
|
|
a: A,
|
|
outKey: "swizzle",
|
|
outTypeFunc: (g) => mE(g, e)
|
|
}), this.statements = ({ inputs: g, outputs: I }) => [
|
|
`${I.swizzle} = ${g.a}.${e};`
|
|
];
|
|
}
|
|
}
|
|
const SE = (t, A, e) => new ei({ index: t, from: A, to: e }), NE = (t) => new Ut({ value: t }), FE = (t) => new kA({ state: t }), GE = (t) => new RA({ state: t }), PB = (t) => new gi({ value: t }), _B = (t) => new Ii({ value: t }), OB = (t) => new si({ value: t }), $B = (t) => new Bi({ value: t }), xE = (t) => new ii({ value: t }), kE = (t) => new Qi({ value: t }), Ai = (t) => new ni({ value: t }), He = (t) => new Ci({ value: t }), ti = (t, A, e) => new ai({ z: t, zNear: A, zFar: e }).outputs.depth;
|
|
class ei extends X {
|
|
constructor({
|
|
from: A,
|
|
to: e,
|
|
index: g
|
|
}) {
|
|
super({
|
|
inTypes: { from: "int", to: "int", index: "int" },
|
|
outTypes: { index: "int" },
|
|
inputs: { from: A, to: e, index: g },
|
|
statements: ({ inputs: I, outputs: s }) => [
|
|
`${s.index} = ${I.index} - ${I.from} + ${I.to};`
|
|
]
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "index");
|
|
}
|
|
}
|
|
class kA extends X {
|
|
constructor({ state: A }) {
|
|
const e = V(A);
|
|
super({
|
|
inTypes: { state: e },
|
|
outTypes: { state: "uint" },
|
|
inputs: { state: A },
|
|
globals: () => [
|
|
oA(`
|
|
uint pcg_next(uint state) {
|
|
return state * 747796405u + 2891336453u;
|
|
}
|
|
`)
|
|
],
|
|
statements: ({ inputs: g, outputs: I }) => {
|
|
const s = e === "uint" ? `${g.state}` : e === "int" ? `uint(${g.state})` : `floatBitsToUint(${g.state})`;
|
|
return [`${I.state} = pcg_next(${s});`];
|
|
}
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "state");
|
|
}
|
|
}
|
|
class RA extends X {
|
|
constructor({ state: A }) {
|
|
super({
|
|
inTypes: { state: "uint" },
|
|
outTypes: { hash: "uint" },
|
|
inputs: { state: A },
|
|
globals: () => [
|
|
oA(`
|
|
uint pcg_hash(uint state) {
|
|
uint hash = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;
|
|
return (hash >> 22u) ^ hash;
|
|
}
|
|
`)
|
|
],
|
|
statements: ({ inputs: e, outputs: g }) => [
|
|
`${g.hash} = pcg_hash(${e.state});`
|
|
]
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "hash");
|
|
}
|
|
}
|
|
class Ut extends X {
|
|
constructor({ value: A }) {
|
|
const e = V(A), g = Tg(e);
|
|
super({
|
|
inTypes: { value: e },
|
|
outTypes: { state: "uint" },
|
|
inputs: { value: A },
|
|
globals: () => [
|
|
oA(`
|
|
uint pcg_mix(uint value) {
|
|
return value;
|
|
}
|
|
uint pcg_mix(uvec2 value) {
|
|
return value.x + 0x9e3779b9u * value.y;
|
|
}
|
|
uint pcg_mix(uvec3 value) {
|
|
return value.x + 0x9e3779b9u * value.y + 0x85ebca6bu * value.z;
|
|
}
|
|
uint pcg_mix(uvec4 value) {
|
|
return value.x + 0x9e3779b9u * value.y + 0x85ebca6bu * value.z + 0xc2b2ae35u * value.w;
|
|
}
|
|
`)
|
|
],
|
|
statements: ({ inputs: I, outputs: s }) => {
|
|
const B = lA(e) ? `${I.value}` : hA(e) ? `${g}(${I.value})` : `floatBitsToUint(${I.value})`;
|
|
return [
|
|
`${g} bits = ${B};`,
|
|
`${s.state} = pcg_mix(bits);`
|
|
];
|
|
}
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "state");
|
|
}
|
|
}
|
|
class gi extends VA {
|
|
constructor({ value: A }) {
|
|
super({
|
|
inTypes: { value: V(A) },
|
|
outTypes: { hash: "uint" },
|
|
inputs: { value: A },
|
|
construct: ({ value: e }) => {
|
|
if (!e)
|
|
throw new Error("value is required");
|
|
let g = new Ut({ value: e }).outputs.state;
|
|
return g = new kA({ state: g }).outputs.state, new RA({ state: g }).outputs;
|
|
}
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "hash");
|
|
}
|
|
}
|
|
class Ii extends VA {
|
|
constructor({ value: A }) {
|
|
super({
|
|
inTypes: { value: V(A) },
|
|
outTypes: { hash: "uvec2" },
|
|
inputs: { value: A },
|
|
construct: ({ value: e }) => {
|
|
if (!e)
|
|
throw new Error("value is required");
|
|
let g = new Ut({ value: e }).outputs.state;
|
|
g = new kA({ state: g }).outputs.state;
|
|
const I = new RA({ state: g }).outputs.hash;
|
|
g = new kA({ state: g }).outputs.state;
|
|
const s = new RA({ state: g }).outputs.hash;
|
|
return { hash: zA({ vectorType: "uvec2", x: I, y: s }) };
|
|
}
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "hash");
|
|
}
|
|
}
|
|
class si extends VA {
|
|
constructor({ value: A }) {
|
|
super({
|
|
inTypes: { value: V(A) },
|
|
outTypes: { hash: "uvec3" },
|
|
inputs: { value: A },
|
|
construct: ({ value: e }) => {
|
|
if (!e)
|
|
throw new Error("value is required");
|
|
let g = new Ut({ value: e }).outputs.state;
|
|
g = new kA({ state: g }).outputs.state;
|
|
const I = new RA({ state: g }).outputs.hash;
|
|
g = new kA({ state: g }).outputs.state;
|
|
const s = new RA({ state: g }).outputs.hash;
|
|
g = new kA({ state: g }).outputs.state;
|
|
const B = new RA({ state: g }).outputs.hash;
|
|
return { hash: zA({ vectorType: "uvec3", x: I, y: s, z: B }) };
|
|
}
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "hash");
|
|
}
|
|
}
|
|
class Bi extends VA {
|
|
constructor({ value: A }) {
|
|
super({
|
|
inTypes: { value: V(A) },
|
|
outTypes: { hash: "uvec4" },
|
|
inputs: { value: A },
|
|
construct: ({ value: e }) => {
|
|
if (!e)
|
|
throw new Error("value is required");
|
|
let g = new Ut({ value: e }).outputs.state;
|
|
g = new kA({ state: g }).outputs.state;
|
|
const I = new RA({ state: g }).outputs.hash;
|
|
g = new kA({ state: g }).outputs.state;
|
|
const s = new RA({ state: g }).outputs.hash;
|
|
g = new kA({ state: g }).outputs.state;
|
|
const B = new RA({ state: g }).outputs.hash;
|
|
g = new kA({ state: g }).outputs.state;
|
|
const i = new RA({ state: g }).outputs.hash;
|
|
return { hash: zA({ vectorType: "uvec4", x: I, y: s, z: B, w: i }) };
|
|
}
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "hash");
|
|
}
|
|
}
|
|
class ii extends VA {
|
|
constructor({ value: A }) {
|
|
super({
|
|
inTypes: { value: V(A) },
|
|
outTypes: { hash: "float" },
|
|
inputs: { value: A },
|
|
construct: ({ value: e }) => {
|
|
if (!e)
|
|
throw new Error("value is required");
|
|
const g = PB(e);
|
|
return { hash: sA(Xs(g), v("float", 1 / 2 ** 32)) };
|
|
}
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "hash");
|
|
}
|
|
}
|
|
class Qi extends VA {
|
|
constructor({ value: A }) {
|
|
super({
|
|
inTypes: { value: V(A) },
|
|
outTypes: { hash: "vec2" },
|
|
inputs: { value: A },
|
|
construct: ({ value: e }) => {
|
|
if (!e)
|
|
throw new Error("value is required");
|
|
const g = _B(e);
|
|
return { hash: sA(Ws(g), v("float", 1 / 2 ** 32)) };
|
|
}
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "hash");
|
|
}
|
|
}
|
|
class ni extends VA {
|
|
constructor({ value: A }) {
|
|
super({
|
|
inTypes: { value: V(A) },
|
|
outTypes: { hash: "vec3" },
|
|
inputs: { value: A },
|
|
construct: ({ value: e }) => {
|
|
if (!e)
|
|
throw new Error("value is required");
|
|
const g = OB(e);
|
|
return { hash: sA(ht(g), v("float", 1 / 2 ** 32)) };
|
|
}
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "hash");
|
|
}
|
|
}
|
|
class Ci extends VA {
|
|
constructor({ value: A }) {
|
|
super({
|
|
inTypes: { value: V(A) },
|
|
outTypes: { hash: "vec4" },
|
|
inputs: { value: A },
|
|
construct: ({ value: e }) => {
|
|
if (!e)
|
|
throw new Error("value is required");
|
|
const g = $B(e);
|
|
return { hash: sA(js(g), v("float", 1 / 2 ** 32)) };
|
|
}
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "hash");
|
|
}
|
|
}
|
|
class ai extends X {
|
|
constructor({
|
|
z: A,
|
|
zNear: e,
|
|
zFar: g
|
|
}) {
|
|
super({
|
|
inTypes: { z: "float", zNear: "float", zFar: "float" },
|
|
outTypes: { depth: "float" },
|
|
inputs: { z: A, zNear: e, zFar: g },
|
|
statements: ({ inputs: I, outputs: s }) => [
|
|
`float clamped = clamp(${I.z}, ${I.zNear}, ${I.zFar});`,
|
|
`${s.depth} = (log2(clamped + 1.0) - log2(${I.zNear} + 1.0)) / (log2(${I.zFar} + 1.0) - log2(${I.zNear} + 1.0));`
|
|
]
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "depth");
|
|
}
|
|
}
|
|
const Ei = (t, {
|
|
scale: A,
|
|
scales: e,
|
|
rotate: g,
|
|
translate: I
|
|
}) => new ri({ position: t, scale: A, scales: e, rotate: g, translate: I }).outputs.position, oi = (t, {
|
|
scale: A,
|
|
scales: e,
|
|
rotate: g
|
|
}) => new ci({ dir: t, scale: A, scales: e, rotate: g }).outputs.dir, RE = (t, { rotate: A }) => new hi({ quaternion: t, rotate: A }).outputs.quaternion;
|
|
class ri extends X {
|
|
constructor({
|
|
position: A,
|
|
scale: e,
|
|
scales: g,
|
|
rotate: I,
|
|
translate: s
|
|
}) {
|
|
super({
|
|
inTypes: {
|
|
position: "vec3",
|
|
scale: "float",
|
|
scales: "vec3",
|
|
rotate: "vec4",
|
|
translate: "vec3"
|
|
},
|
|
outTypes: { position: "vec3" },
|
|
inputs: { position: A, scale: e, scales: g, rotate: I, translate: s },
|
|
statements: ({ inputs: B, outputs: i }) => {
|
|
const { position: Q } = i;
|
|
if (!Q)
|
|
return [];
|
|
const { scale: C, scales: a, rotate: n, translate: o } = B;
|
|
return [
|
|
`${Q} = ${B.position ?? "vec3(0.0, 0.0, 0.0)"};`,
|
|
C ? `${Q} *= ${C};` : null,
|
|
a ? `${Q} *= ${a};` : null,
|
|
n ? `${Q} = quatVec(${n}, ${Q});` : null,
|
|
o ? `${Q} += ${o};` : null
|
|
].filter(Boolean);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
class ci extends X {
|
|
constructor({
|
|
dir: A,
|
|
scale: e,
|
|
scales: g,
|
|
rotate: I
|
|
}) {
|
|
super({
|
|
inTypes: { dir: "vec3", scale: "float", scales: "vec3", rotate: "vec4" },
|
|
outTypes: { dir: "vec3" },
|
|
inputs: { dir: A, scale: e, scales: g, rotate: I },
|
|
statements: ({ inputs: s, outputs: B }) => {
|
|
const { dir: i } = B;
|
|
if (!i)
|
|
return [];
|
|
const { scale: Q, scales: C, rotate: a } = s;
|
|
return [
|
|
`${i} = ${s.dir ?? "vec3(0.0, 0.0, 0.0)"};`,
|
|
Q ? `${i} *= ${Q};` : null,
|
|
C ? `${i} *= ${C};` : null,
|
|
a ? `${i} = quatVec(${a}, ${i});` : null
|
|
].filter(Boolean);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
class hi extends X {
|
|
constructor({
|
|
quaternion: A,
|
|
rotate: e
|
|
}) {
|
|
super({
|
|
inTypes: { quaternion: "vec4", rotate: "vec4" },
|
|
outTypes: { quaternion: "vec4" },
|
|
inputs: { quaternion: A, rotate: e },
|
|
statements: ({ inputs: g, outputs: I }) => {
|
|
const { quaternion: s } = I;
|
|
return s ? [
|
|
`${s} = ${g.quaternion ?? "vec4(0.0, 0.0, 0.0, 1.0)"};`,
|
|
e ? `${s} = quatQuat(${g.rotate}, ${s});` : null
|
|
].filter(Boolean) : [];
|
|
}
|
|
});
|
|
}
|
|
}
|
|
const UE = () => {
|
|
throw new Error("Not implemented");
|
|
}, LE = () => {
|
|
throw new Error("Not implemented");
|
|
}, YE = () => {
|
|
throw new Error("Not implemented");
|
|
}, JE = () => {
|
|
throw new Error("Not implemented");
|
|
}, bE = () => {
|
|
throw new Error("Not implemented");
|
|
}, vE = () => {
|
|
throw new Error("Not implemented");
|
|
}, TE = (t, A) => new li({ texture: t, lod: A }), HE = (t, A, e) => new ui({ texture: t, coord: A, bias: e }), KE = (t, A, e) => new wi({ texture: t, coord: A, lod: e });
|
|
class li extends X {
|
|
constructor({ texture: A, lod: e }) {
|
|
const g = V(A);
|
|
super({
|
|
inTypes: { texture: g, lod: "int" },
|
|
outTypes: { size: Di(g) },
|
|
inputs: { texture: A, lod: e },
|
|
statements: ({ inputs: I, outputs: s }) => [
|
|
`${s.size} = textureSize(${I.texture}, ${I.lod ?? "0"});`
|
|
]
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "size");
|
|
}
|
|
}
|
|
class ui extends X {
|
|
constructor({
|
|
texture: A,
|
|
coord: e,
|
|
bias: g
|
|
}) {
|
|
const I = V(A);
|
|
super({
|
|
inTypes: {
|
|
texture: I,
|
|
coord: qE(I),
|
|
bias: "float"
|
|
},
|
|
outTypes: { sample: yi(I) },
|
|
inputs: { texture: A, coord: e, bias: g },
|
|
statements: ({ inputs: s, outputs: B }) => [
|
|
`${B.sample} = texture(${s.texture}, ${s.coord}${s.bias ? `, ${s.bias}` : ""});`
|
|
]
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "sample");
|
|
}
|
|
}
|
|
class wi extends X {
|
|
constructor({
|
|
texture: A,
|
|
coord: e,
|
|
lod: g
|
|
}) {
|
|
const I = V(A);
|
|
super({
|
|
inTypes: {
|
|
texture: I,
|
|
coord: Di(I),
|
|
lod: "int"
|
|
},
|
|
outTypes: { texel: yi(I) },
|
|
inputs: { texture: A, coord: e, lod: g },
|
|
statements: ({ inputs: s, outputs: B }) => [
|
|
`${B.texel} = texelFetch(${s.texture}, ${s.coord}, ${s.lod ?? "0"});`
|
|
]
|
|
});
|
|
}
|
|
dynoOut() {
|
|
return new Z(this, "texel");
|
|
}
|
|
}
|
|
function Di(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 qE(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 yi(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 zE = (t) => new pi({ degrees: t }), ZE = (t) => new di({ radians: t }), Ke = (t) => new fi({ radians: t }), VE = (t) => new Mi({ radians: t }), XE = (t) => new mi({ radians: t }), WE = (t) => new Si({ sin: t }), jE = (t) => new Ni({ cos: t }), PE = (t) => new Fi({ tan: t }), _E = (t, A) => new Gi({ y: t, x: A }), OE = (t) => new xi({ x: t }), $E = (t) => new ki({ x: t }), Ao = (t) => new Ri({ x: t }), to = (t) => new Ui({ x: t }), eo = (t) => new Li({ x: t }), go = (t) => new Yi({ x: t });
|
|
class pi extends F {
|
|
constructor({ degrees: A }) {
|
|
super({ a: A, outTypeFunc: (e) => e, outKey: "radians" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.radians} = radians(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
class di extends F {
|
|
constructor({ radians: A }) {
|
|
super({ a: A, outTypeFunc: (e) => e, outKey: "degrees" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.degrees} = degrees(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
class fi extends F {
|
|
constructor({ radians: A }) {
|
|
super({ a: A, outTypeFunc: (e) => e, outKey: "sin" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.sin} = sin(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
class Mi extends F {
|
|
constructor({ radians: A }) {
|
|
super({ a: A, outTypeFunc: (e) => e, outKey: "cos" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.cos} = cos(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
class mi extends F {
|
|
constructor({ radians: A }) {
|
|
super({ a: A, outTypeFunc: (e) => e, outKey: "tan" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.tan} = tan(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
class Si extends F {
|
|
constructor({ sin: A }) {
|
|
super({ a: A, outTypeFunc: (e) => e, outKey: "asin" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.asin} = asin(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
class Ni extends F {
|
|
constructor({ cos: A }) {
|
|
super({ a: A, outTypeFunc: (e) => e, outKey: "acos" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.acos} = acos(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
class Fi extends F {
|
|
constructor({ tan: A }) {
|
|
super({ a: A, outTypeFunc: (e) => e, outKey: "atan" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.atan} = atan(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
class Gi extends tA {
|
|
constructor({ y: A, x: e }) {
|
|
super({
|
|
a: A,
|
|
b: e,
|
|
outTypeFunc: (g, I) => g,
|
|
outKey: "atan2"
|
|
}), this.statements = ({ inputs: g, outputs: I }) => [
|
|
`${I.atan2} = atan2(${g.a}, ${g.b});`
|
|
];
|
|
}
|
|
}
|
|
class xi extends F {
|
|
constructor({ x: A }) {
|
|
super({ a: A, outTypeFunc: (e) => e, outKey: "sinh" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.sinh} = sinh(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
class ki extends F {
|
|
constructor({ x: A }) {
|
|
super({ a: A, outTypeFunc: (e) => e, outKey: "cosh" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.cosh} = cosh(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
class Ri extends F {
|
|
constructor({ x: A }) {
|
|
super({ a: A, outTypeFunc: (e) => e, outKey: "tanh" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.tanh} = tanh(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
class Ui extends F {
|
|
constructor({ x: A }) {
|
|
super({ a: A, outTypeFunc: (e) => e, outKey: "asinh" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.asinh} = asinh(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
class Li extends F {
|
|
constructor({ x: A }) {
|
|
super({ a: A, outTypeFunc: (e) => e, outKey: "acosh" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.acosh} = acosh(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
class Yi extends F {
|
|
constructor({ x: A }) {
|
|
super({ a: A, outTypeFunc: (e) => e, outKey: "atanh" }), this.statements = ({ inputs: e, outputs: g }) => [
|
|
`${g.atanh} = atanh(${e.a});`
|
|
];
|
|
}
|
|
}
|
|
const Gr = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
__proto__: null,
|
|
Abs: Qs,
|
|
Acos: Ni,
|
|
Acosh: Li,
|
|
Add: As,
|
|
All: qs,
|
|
And: ks,
|
|
Any: Ks,
|
|
Asin: Si,
|
|
Asinh: Ui,
|
|
Atan: Fi,
|
|
Atan2: Gi,
|
|
Atanh: Yi,
|
|
BVec2: gB,
|
|
BVec3: IB,
|
|
BVec4: sB,
|
|
BinaryOp: tA,
|
|
Bool: $s,
|
|
Ceil: as,
|
|
Clamp: Ms,
|
|
Combine: WB,
|
|
CombineGsplat: Pg,
|
|
CompMult: KB,
|
|
CompXor: Vs,
|
|
Compilation: qg,
|
|
Cos: Mi,
|
|
Cosh: ki,
|
|
Cross: LB,
|
|
Degrees: di,
|
|
Determinant: ZB,
|
|
Distance: RB,
|
|
Div: gs,
|
|
Dot: UB,
|
|
Dyno: X,
|
|
DynoBlock: VA,
|
|
DynoBool: Qe,
|
|
DynoBvec2: gI,
|
|
DynoBvec3: BI,
|
|
DynoBvec4: nI,
|
|
DynoConst: Kg,
|
|
DynoFloat: rt,
|
|
DynoInt: zt,
|
|
DynoIsampler2D: MI,
|
|
DynoIsampler2DArray: SI,
|
|
DynoIsampler3D: GI,
|
|
DynoIsamplerCube: RI,
|
|
DynoIvec2: sI,
|
|
DynoIvec3: QI,
|
|
DynoIvec4: aI,
|
|
DynoLiteral: Nt,
|
|
DynoMat2: EI,
|
|
DynoMat2x2: oI,
|
|
DynoMat2x3: rI,
|
|
DynoMat2x4: cI,
|
|
DynoMat3: hI,
|
|
DynoMat3x2: lI,
|
|
DynoMat3x3: uI,
|
|
DynoMat3x4: wI,
|
|
DynoMat4: DI,
|
|
DynoMat4x2: yI,
|
|
DynoMat4x3: pI,
|
|
DynoMat4x4: dI,
|
|
DynoOutput: Z,
|
|
DynoProgram: eg,
|
|
DynoProgramTemplate: gg,
|
|
DynoRemapIndex: ei,
|
|
DynoSampler2D: mI,
|
|
DynoSampler2DArray: NI,
|
|
DynoSampler2DArrayShadow: YI,
|
|
DynoSampler2DShadow: LI,
|
|
DynoSampler3D: xI,
|
|
DynoSamplerCube: UI,
|
|
DynoSamplerCubeShadow: JI,
|
|
DynoUint: eI,
|
|
DynoUniform: k,
|
|
DynoUsampler2D: fI,
|
|
DynoUsampler2DArray: Kt,
|
|
DynoUsampler3D: FI,
|
|
DynoUsamplerCube: kI,
|
|
DynoUvec2: II,
|
|
DynoUvec3: iI,
|
|
DynoUvec4: CI,
|
|
DynoValue: st,
|
|
DynoVec2: Ht,
|
|
DynoVec3: Gt,
|
|
DynoVec4: Rt,
|
|
Equal: Ts,
|
|
Exp: hs,
|
|
Exp2: ls,
|
|
ExtendVec: bB,
|
|
FaceForward: vB,
|
|
Float: eB,
|
|
FloatBitsToInt: uB,
|
|
FloatBitsToUint: wB,
|
|
Floor: Cs,
|
|
Fract: rs,
|
|
GreaterThan: bs,
|
|
GreaterThanEqual: vs,
|
|
Gsplat: AA,
|
|
GsplatNormal: Og,
|
|
Hash: gi,
|
|
Hash2: Ii,
|
|
Hash3: si,
|
|
Hash4: Bi,
|
|
HashFloat: ii,
|
|
HashVec2: Qi,
|
|
HashVec3: ni,
|
|
HashVec4: Ci,
|
|
IMod: Is,
|
|
IVec2: BB,
|
|
IVec3: iB,
|
|
IVec4: QB,
|
|
Int: AB,
|
|
IntBitsToFloat: DB,
|
|
Inverse: VB,
|
|
InverseSqrt: ps,
|
|
IsInf: Gs,
|
|
IsNan: Fs,
|
|
Length: kB,
|
|
LessThan: Ys,
|
|
LessThanEqual: Js,
|
|
Log: us,
|
|
Log2: ws,
|
|
Mat2: cB,
|
|
Mat3: hB,
|
|
Mat4: lB,
|
|
Max: fs,
|
|
Min: ds,
|
|
Mix: ms,
|
|
Mod: ss,
|
|
Modf: Bs,
|
|
Mul: es,
|
|
Neg: is,
|
|
Normalize: YB,
|
|
NormalizedDepth: ai,
|
|
Not: Ls,
|
|
NotEqual: Hs,
|
|
NumPackedSplats: Zg,
|
|
Or: Rs,
|
|
Outer: qB,
|
|
OutputPackedSplat: tI,
|
|
OutputRgba8: Ag,
|
|
PackHalf2x16: mB,
|
|
PackSnorm2x16: pB,
|
|
PackUnorm2x16: fB,
|
|
PcgHash: RA,
|
|
PcgMix: Ut,
|
|
PcgNext: kA,
|
|
Pow: cs,
|
|
ProjectH: JB,
|
|
Radians: pi,
|
|
ReadPackedSplat: Xg,
|
|
ReadPackedSplatRange: Wg,
|
|
ReflectVec: TB,
|
|
RefractVec: HB,
|
|
Round: os,
|
|
Select: zs,
|
|
Sign: ns,
|
|
SimpleCast: nA,
|
|
Sin: fi,
|
|
Sinh: xi,
|
|
Smoothstep: Ns,
|
|
Split: XB,
|
|
SplitGsplat: jg,
|
|
Sqr: Ds,
|
|
Sqrt: ys,
|
|
Step: Ss,
|
|
Sub: ts,
|
|
Swizzle: jB,
|
|
TPackedSplats: Pt,
|
|
Tan: mi,
|
|
Tanh: Ri,
|
|
TexelFetch: wi,
|
|
Texture: ui,
|
|
TextureSize: li,
|
|
TransformDir: ci,
|
|
TransformGsplat: $g,
|
|
TransformPosition: ri,
|
|
TransformQuaternion: hi,
|
|
Transpose: zB,
|
|
TrinaryOp: yt,
|
|
Trunc: Es,
|
|
UVec2: nB,
|
|
UVec3: CB,
|
|
UVec4: aB,
|
|
Uint: tB,
|
|
UintBitsToFloat: yB,
|
|
UintToRgba8: NB,
|
|
UnaryOp: F,
|
|
UnpackHalf2x16: SB,
|
|
UnpackSnorm2x16: dB,
|
|
UnpackUnorm2x16: MB,
|
|
Vec2: EB,
|
|
Vec3: oB,
|
|
Vec4: rB,
|
|
Xor: Us,
|
|
abs: Ba,
|
|
acos: jE,
|
|
acosh: eo,
|
|
add: cA,
|
|
all: Ya,
|
|
and: ma,
|
|
any: La,
|
|
arrayIndex: bE,
|
|
arrayLength: vE,
|
|
asin: WE,
|
|
asinh: to,
|
|
atan: PE,
|
|
atan2: _E,
|
|
atanh: go,
|
|
bool: Ta,
|
|
bvec2: qa,
|
|
bvec3: za,
|
|
bvec4: Za,
|
|
ceil: na,
|
|
clamp: ya,
|
|
combine: zA,
|
|
combineGsplat: Bt,
|
|
comment: JE,
|
|
compMult: hE,
|
|
compXor: Ja,
|
|
cos: VE,
|
|
cosh: $E,
|
|
cross: CE,
|
|
defineGsplat: FA,
|
|
defineGsplatNormal: _g,
|
|
definePackedSplats: le,
|
|
degrees: ZE,
|
|
determinant: wE,
|
|
distance: nE,
|
|
div: se,
|
|
dot: FB,
|
|
dyno: jt,
|
|
dynoBlock: NA,
|
|
dynoBool: Qn,
|
|
dynoBvec2: an,
|
|
dynoBvec3: cn,
|
|
dynoBvec4: un,
|
|
dynoConst: v,
|
|
dynoDeclare: Oe,
|
|
dynoFloat: HA,
|
|
dynoFor: YE,
|
|
dynoIf: UE,
|
|
dynoInt: Cn,
|
|
dynoIsampler2D: Ln,
|
|
dynoIsampler2DArray: bn,
|
|
dynoIsampler3D: Hn,
|
|
dynoIsamplerCube: zn,
|
|
dynoIvec2: on,
|
|
dynoIvec3: ln,
|
|
dynoIvec4: Dn,
|
|
dynoLiteral: ie,
|
|
dynoMat2: pn,
|
|
dynoMat2x2: dn,
|
|
dynoMat2x3: fn,
|
|
dynoMat2x4: Mn,
|
|
dynoMat3: mn,
|
|
dynoMat3x2: Sn,
|
|
dynoMat3x3: Nn,
|
|
dynoMat3x4: Fn,
|
|
dynoMat4: Gn,
|
|
dynoMat4x2: xn,
|
|
dynoMat4x3: kn,
|
|
dynoMat4x4: Rn,
|
|
dynoSampler2D: Yn,
|
|
dynoSampler2DArray: vn,
|
|
dynoSampler2DArrayShadow: Xn,
|
|
dynoSampler2DShadow: Vn,
|
|
dynoSampler3D: Kn,
|
|
dynoSamplerCube: Zn,
|
|
dynoSamplerCubeShadow: Wn,
|
|
dynoSwitch: LE,
|
|
dynoUint: nn,
|
|
dynoUsampler2D: Un,
|
|
dynoUsampler2DArray: Jn,
|
|
dynoUsampler3D: Tn,
|
|
dynoUsamplerCube: qn,
|
|
dynoUvec2: En,
|
|
dynoUvec3: hn,
|
|
dynoUvec4: wn,
|
|
dynoVec2: rn,
|
|
dynoVec3: tt,
|
|
dynoVec4: yn,
|
|
equal: Ra,
|
|
exp: oa,
|
|
exp2: ra,
|
|
extendVec: xB,
|
|
faceforward: aE,
|
|
float: Xs,
|
|
floatBitsToInt: Ps,
|
|
floatBitsToUint: _s,
|
|
floor: Qa,
|
|
fract: Be,
|
|
greaterThan: ka,
|
|
greaterThanEqual: xs,
|
|
gsplatNormal: Ye,
|
|
hash: PB,
|
|
hash2: _B,
|
|
hash3: OB,
|
|
hash4: $B,
|
|
hashFloat: xE,
|
|
hashVec2: kE,
|
|
hashVec3: Ai,
|
|
hashVec4: He,
|
|
imod: ve,
|
|
int: Ha,
|
|
intBitsToFloat: tE,
|
|
inverse: DE,
|
|
inversesqrt: wa,
|
|
isAllFloatType: it,
|
|
isBoolType: wt,
|
|
isFloatType: Xt,
|
|
isInf: Ma,
|
|
isIntType: hA,
|
|
isMat2: Qt,
|
|
isMat3: nt,
|
|
isMat4: Ct,
|
|
isMatFloatType: Jg,
|
|
isNan: fa,
|
|
isScalarType: Dt,
|
|
isUintType: lA,
|
|
isVector2Type: xt,
|
|
isVector3Type: kt,
|
|
isVector4Type: Wt,
|
|
isVectorType: $Q,
|
|
ivec2: Va,
|
|
ivec3: Xa,
|
|
ivec4: Wa,
|
|
length: QE,
|
|
lessThan: Ga,
|
|
lessThanEqual: xa,
|
|
literalNegOne: gn,
|
|
literalOne: en,
|
|
literalZero: bt,
|
|
log: ca,
|
|
log2: ha,
|
|
mat2: Oa,
|
|
mat3: $a,
|
|
mat4: AE,
|
|
max: OI,
|
|
min: Da,
|
|
mix: $I,
|
|
mod: _I,
|
|
modf: sa,
|
|
mul: sA,
|
|
neg: sg,
|
|
normalize: GB,
|
|
normalizedDepth: ti,
|
|
not: Fa,
|
|
notEqual: Ua,
|
|
numPackedSplats: In,
|
|
numberAsFloat: q,
|
|
numberAsInt: BA,
|
|
numberAsUint: iA,
|
|
or: Sa,
|
|
outer: lE,
|
|
outputPackedSplat: AI,
|
|
outputRgba8: sn,
|
|
packHalf2x16: Os,
|
|
packSnorm2x16: gE,
|
|
packUnorm2x16: sE,
|
|
pcgHash: GE,
|
|
pcgMix: NE,
|
|
pcgNext: FE,
|
|
pow: Ea,
|
|
projectH: rE,
|
|
radians: zE,
|
|
readPackedSplat: Ft,
|
|
readPackedSplatRange: zg,
|
|
reflectVec: EE,
|
|
refractVec: oE,
|
|
remapIndex: SE,
|
|
round: aa,
|
|
sameSizeIvec: tn,
|
|
sameSizeUvec: Tg,
|
|
sameSizeVec: An,
|
|
select: Bg,
|
|
sign: ia,
|
|
sin: Ke,
|
|
sinh: OE,
|
|
smoothstep: da,
|
|
split: lt,
|
|
splitGsplat: ot,
|
|
sqr: la,
|
|
sqrt: ua,
|
|
step: pa,
|
|
sub: ut,
|
|
swizzle: cE,
|
|
tan: XE,
|
|
tanh: Ao,
|
|
texelFetch: KE,
|
|
texture: HE,
|
|
textureSize: TE,
|
|
transformDir: oi,
|
|
transformGsplat: $e,
|
|
transformPos: Ei,
|
|
transformQuat: RE,
|
|
transpose: uE,
|
|
trunc: Ca,
|
|
typeLiteral: Hg,
|
|
uint: Ka,
|
|
uintBitsToFloat: eE,
|
|
uintToRgba8: Te,
|
|
uniform: Bn,
|
|
unindent: oA,
|
|
unindentLines: YA,
|
|
unpackHalf2x16: iE,
|
|
unpackSnorm2x16: IE,
|
|
unpackUnorm2x16: BE,
|
|
uvec2: ja,
|
|
uvec3: Pa,
|
|
uvec4: _a,
|
|
valType: V,
|
|
vec2: Ws,
|
|
vec3: ht,
|
|
vec4: js,
|
|
vectorDim: vg,
|
|
vectorElementType: bg,
|
|
xor: Na
|
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
var Io = `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 xA = class xA {
|
|
constructor({ renderer: A } = {}) {
|
|
this.renderer = A, this.capacity = 0, this.count = 0;
|
|
}
|
|
dispose() {
|
|
this.target && (this.target.dispose(), this.target = void 0);
|
|
}
|
|
// Ensure we have a buffer large enough for the readback of count indices.
|
|
// Pass in previous bufer of the desired type.
|
|
ensureBuffer(A, e) {
|
|
const I = Math.ceil(Math.max(1, A) / j) * j * 4;
|
|
if (e.byteLength >= I)
|
|
return e;
|
|
const s = new ArrayBuffer(I);
|
|
if (e instanceof ArrayBuffer)
|
|
return s;
|
|
const B = e.constructor;
|
|
return new B(s);
|
|
}
|
|
// Ensure our render target is large enough for the readback of capacity indices.
|
|
ensureCapacity(A) {
|
|
const { width: e, height: g, depth: I, maxSplats: s } = fA(A);
|
|
(!this.target || s > this.capacity) && (this.dispose(), this.capacity = s, this.target = new E.WebGLArrayRenderTarget(e, g, I, {
|
|
depthBuffer: !1,
|
|
stencilBuffer: !1,
|
|
generateMipmaps: !1,
|
|
magFilter: E.NearestFilter,
|
|
minFilter: E.NearestFilter
|
|
}), this.target.texture.format = E.RGBAFormat, this.target.texture.type = E.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 = xA.readbackProgram.get(A);
|
|
if (!e) {
|
|
const I = NA(
|
|
{ index: "int" },
|
|
{ rgba8: "vec4" },
|
|
({ index: s }) => (A.inputs.index = s, { rgba8: new Ag({ rgba8: A.outputs.rgba8 }) })
|
|
);
|
|
xA.programTemplate || (xA.programTemplate = new gg(Io)), e = new eg({
|
|
graph: I,
|
|
inputs: { index: "index" },
|
|
outputs: { rgba8: "target" },
|
|
template: xA.programTemplate
|
|
}), Object.assign(e.uniforms, {
|
|
targetLayer: { value: 0 },
|
|
targetBase: { value: 0 },
|
|
targetCount: { value: 0 }
|
|
}), xA.readbackProgram.set(A, e);
|
|
}
|
|
const g = e.prepareMaterial();
|
|
return xA.fullScreenQuad.material = g, { program: e, material: g };
|
|
}
|
|
saveRenderState(A) {
|
|
return {
|
|
xrEnabled: A.xr.enabled,
|
|
autoClear: A.autoClear
|
|
};
|
|
}
|
|
resetRenderState(A, e) {
|
|
A.setRenderTarget(null), A.xr.enabled = e.xrEnabled, A.autoClear = e.autoClear;
|
|
}
|
|
process({
|
|
count: A,
|
|
material: e
|
|
}) {
|
|
const g = this.renderer;
|
|
if (!g)
|
|
throw new Error("No renderer");
|
|
if (!this.target)
|
|
throw new Error("No target");
|
|
const I = j * qA;
|
|
e.uniforms.targetBase.value = 0, e.uniforms.targetCount.value = A;
|
|
let s = 0;
|
|
for (; s < A; ) {
|
|
const B = Math.floor(s / I), i = B * I, Q = Math.min(
|
|
qA,
|
|
Math.ceil((A - i) / j)
|
|
);
|
|
e.uniforms.targetLayer.value = B, this.target.scissor.set(0, 0, j, Q), g.setRenderTarget(this.target, B), g.xr.enabled = !1, g.autoClear = !1, xA.fullScreenQuad.render(g), s += j * Q;
|
|
}
|
|
this.count = A;
|
|
}
|
|
async read({
|
|
readback: A
|
|
}) {
|
|
const e = this.renderer;
|
|
if (!e)
|
|
throw new Error("No renderer");
|
|
if (!this.target)
|
|
throw new Error("No target");
|
|
const g = Math.ceil(this.count / j) * j;
|
|
if (A.byteLength < g * 4)
|
|
throw new Error(
|
|
`Readback buffer too small: ${A.byteLength} < ${g * 4}`
|
|
);
|
|
const I = new Uint8Array(
|
|
A instanceof ArrayBuffer ? A : A.buffer
|
|
), s = j * qA;
|
|
let B = 0;
|
|
const i = [];
|
|
for (; B < this.count; ) {
|
|
const Q = Math.floor(B / s), C = Q * s, a = Math.min(
|
|
qA,
|
|
Math.ceil((this.count - C) / j)
|
|
);
|
|
e.setRenderTarget(this.target, Q);
|
|
const n = j * a * 4, o = I.subarray(
|
|
C * 4,
|
|
C * 4 + n
|
|
), r = e == null ? void 0 : e.readRenderTargetPixelsAsync(
|
|
this.target,
|
|
0,
|
|
0,
|
|
j,
|
|
a,
|
|
o
|
|
);
|
|
i.push(r), B += j * a;
|
|
}
|
|
return Promise.all(i).then(() => A);
|
|
}
|
|
// Perform render operation to run the Rgba8Readback program
|
|
// but don't perform the readback yet.
|
|
render({
|
|
reader: A,
|
|
count: e,
|
|
renderer: g
|
|
}) {
|
|
if (this.renderer = g || this.renderer, !this.renderer)
|
|
throw new Error("No renderer");
|
|
this.ensureCapacity(e);
|
|
const { program: I, material: s } = this.prepareProgramMaterial(A);
|
|
I.update();
|
|
const B = this.saveRenderState(this.renderer);
|
|
this.process({ count: e, material: s }), this.resetRenderState(this.renderer, B);
|
|
}
|
|
// Perform a readback of the render target, returning a buffer of the
|
|
// given type.
|
|
async readback({
|
|
readback: A
|
|
}) {
|
|
if (!this.renderer)
|
|
throw new Error("No renderer");
|
|
const e = this.saveRenderState(this.renderer), g = this.read({ readback: A });
|
|
return this.resetRenderState(this.renderer, e), g;
|
|
}
|
|
// Perform a render and readback operation for the given Rgba8Readback,
|
|
// and readback buffer (call ensureBuffer first).
|
|
async renderReadback({
|
|
reader: A,
|
|
count: e,
|
|
renderer: g,
|
|
readback: I
|
|
}) {
|
|
if (this.renderer = g || this.renderer, !this.renderer)
|
|
throw new Error("No renderer");
|
|
this.ensureCapacity(e);
|
|
const { program: s, material: B } = this.prepareProgramMaterial(A);
|
|
s.update();
|
|
const i = this.saveRenderState(this.renderer);
|
|
this.process({ count: e, material: B });
|
|
const Q = this.read({ readback: I });
|
|
return this.resetRenderState(this.renderer, i), Q;
|
|
}
|
|
getTexture() {
|
|
var A;
|
|
return (A = this.target) == null ? void 0 : A.texture;
|
|
}
|
|
};
|
|
xA.programTemplate = null, xA.readbackProgram = /* @__PURE__ */ new Map(), xA.fullScreenQuad = new pg(
|
|
new E.RawShaderMaterial({ visible: !1 })
|
|
);
|
|
let Ce = xA;
|
|
const aA = class aA {
|
|
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: Ji,
|
|
globals: () => [bi],
|
|
value: {
|
|
texture: aA.getEmpty(),
|
|
count: 0
|
|
},
|
|
update: (e) => {
|
|
var g;
|
|
return e.texture = ((g = this.readback) == null ? void 0 : g.getTexture()) ?? this.source ?? aA.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 / j) * j, 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 = fA(A).maxSplats;
|
|
const g = new Uint8Array(this.capacity * 4);
|
|
this.array && g.set(this.array), this.array = g;
|
|
}
|
|
return this.array;
|
|
}
|
|
// Get the THREE.DataArrayTexture from either the readback or the source.
|
|
getTexture() {
|
|
var e;
|
|
let A = (e = this.readback) == null ? void 0 : e.getTexture();
|
|
return (this.source || this.array) && (A = this.maybeUpdateSource()), A ?? aA.getEmpty();
|
|
}
|
|
// Create or get a THREE.DataArrayTexture from the data array.
|
|
maybeUpdateSource() {
|
|
if (!this.array)
|
|
throw new Error("No array");
|
|
if (this.needsUpdate || !this.source) {
|
|
if (this.needsUpdate = !1, this.source) {
|
|
const { width: A, height: e, depth: g } = this.source.image;
|
|
this.capacity !== A * e * g && (this.source.dispose(), this.source = null);
|
|
}
|
|
if (this.source)
|
|
this.array.buffer !== this.source.image.data.buffer && (this.source.image.data = new Uint8Array(this.array.buffer));
|
|
else {
|
|
const { width: A, height: e, depth: g } = fA(this.capacity);
|
|
this.source = new E.DataArrayTexture(
|
|
this.array,
|
|
A,
|
|
e,
|
|
g
|
|
), this.source.format = E.RGBAFormat, this.source.type = E.UnsignedByteType, this.source.internalFormat = "RGBA8", this.source.needsUpdate = !0;
|
|
}
|
|
this.source.needsUpdate = !0;
|
|
}
|
|
return this.source;
|
|
}
|
|
// Generate the RGBA8 values from a Rgba8Readback dyno program.
|
|
render({
|
|
reader: A,
|
|
count: e,
|
|
renderer: g
|
|
}) {
|
|
this.readback || (this.readback = new Ce({ renderer: g })), this.readback.render({ reader: A, count: e, renderer: g }), this.capacity = this.readback.capacity, this.count = this.readback.count;
|
|
}
|
|
// Extract the RGBA8 values from a PackedSplats collection.
|
|
fromPackedSplats({
|
|
packedSplats: A,
|
|
base: e,
|
|
count: g,
|
|
renderer: I
|
|
}) {
|
|
const { dynoSplats: s, dynoBase: B, dynoCount: i, reader: Q } = aA.makeDynos();
|
|
return s.packedSplats = A, B.value = e, i.value = g, this.render({ reader: Q, count: g, renderer: I }), this;
|
|
}
|
|
// Read back the RGBA8 values from the readback buffer.
|
|
async read() {
|
|
if (!this.readback)
|
|
throw new Error("No readback");
|
|
return (!this.array || this.array.length < this.count * 4) && (this.array = new Uint8Array(this.capacity * 4)), (await this.readback.readback({ readback: this.array })).subarray(0, this.count * 4);
|
|
}
|
|
// Can be used where you need an uninitialized THREE.DataArrayTexture like
|
|
// a uniform you will update with the result of this.getTexture() later.
|
|
static getEmpty() {
|
|
if (!aA.emptySource) {
|
|
const A = new Uint8Array(4);
|
|
aA.emptySource = new E.DataArrayTexture(A, 1, 1, 1), aA.emptySource.format = E.RGBAFormat, aA.emptySource.type = E.UnsignedByteType, aA.emptySource.internalFormat = "RGBA8", aA.emptySource.needsUpdate = !0;
|
|
}
|
|
return aA.emptySource;
|
|
}
|
|
// Create a dyno program that can extract RGBA8 values from a PackedSplats
|
|
static makeDynos() {
|
|
if (!aA.dynos) {
|
|
const A = new Qg(), e = new zt({ value: 0 }), g = new zt({ value: 0 }), I = NA(
|
|
{ index: "int" },
|
|
{ rgba8: "vec4" },
|
|
({ index: s }) => {
|
|
if (!s)
|
|
throw new Error("index is undefined");
|
|
s = cA(s, e);
|
|
const B = zg(
|
|
A,
|
|
s,
|
|
e,
|
|
g
|
|
);
|
|
return { rgba8: ot(B).outputs.rgba };
|
|
}
|
|
);
|
|
aA.dynos = { dynoSplats: A, dynoBase: e, dynoCount: g, reader: I };
|
|
}
|
|
return aA.dynos;
|
|
}
|
|
};
|
|
aA.emptySource = null, aA.dynos = null;
|
|
let qe = aA;
|
|
const Ji = { type: "RgbaArray" }, bi = oA(`
|
|
struct RgbaArray {
|
|
sampler2DArray texture;
|
|
int count;
|
|
};
|
|
`);
|
|
function so(t, A) {
|
|
return new X({
|
|
inTypes: { rgba: Ji, index: "int" },
|
|
outTypes: { rgba: "vec4" },
|
|
inputs: { rgba: t, index: A },
|
|
globals: () => [bi],
|
|
statements: ({ inputs: g, outputs: I }) => YA(`
|
|
if ((index >= 0) && (index < ${g.rgba}.count)) {
|
|
${I.rgba} = texelFetch(${g.rgba}.texture, splatTexCoord(index), 0);
|
|
} else {
|
|
${I.rgba} = vec4(0.0, 0.0, 0.0, 0.0);
|
|
}
|
|
`)
|
|
}).outputs.rgba;
|
|
}
|
|
var Bo = /* @__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))(Bo || {});
|
|
function io(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 Qo = /* @__PURE__ */ ((t) => (t.MULTIPLY = "multiply", t.SET_RGB = "set_rgb", t.ADD_RGBA = "add_rgba", t))(Qo || {});
|
|
function no(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 Co extends E.Object3D {
|
|
constructor(A = {}) {
|
|
super();
|
|
const { type: e, invert: g, opacity: I, color: s, displace: B, radius: i } = A;
|
|
this.type = e ?? "sphere", this.invert = g ?? !1, this.opacity = I ?? 1, this.color = s ?? new E.Color(1, 1, 1), this.displace = B ?? new E.Vector3(0, 0, 0), this.radius = i ?? 0;
|
|
}
|
|
}
|
|
const he = class he extends E.Object3D {
|
|
constructor(A = {}) {
|
|
const {
|
|
name: e,
|
|
rgbaBlendMode: g = "multiply",
|
|
sdfSmooth: I = 0,
|
|
softEdge: s = 0,
|
|
invert: B = !1,
|
|
sdfs: i = null
|
|
} = A;
|
|
super(), this.rgbaBlendMode = g, this.sdfSmooth = I, this.softEdge = s, this.invert = B, this.sdfs = i, this.ordering = he.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));
|
|
}
|
|
};
|
|
he.nextOrdering = 1;
|
|
let ae = he;
|
|
class ao {
|
|
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: vi,
|
|
globals: () => [Ti],
|
|
value: {
|
|
numSdfs: 0,
|
|
sdfTexture: this.sdfTexture
|
|
},
|
|
update: (g) => (g.numSdfs = this.numSdfs, g.sdfTexture = this.sdfTexture, g)
|
|
}), this.maxEdits = Math.max(16, e ?? 0), this.numEdits = 0, this.editData = new Uint32Array(this.maxEdits * 4), this.editFloatData = new Float32Array(this.editData.buffer), this.dynoNumEdits = new zt({ value: 0 }), this.dynoEdits = this.newEdits(this.editData, this.maxEdits);
|
|
}
|
|
newSdfTexture(A, e) {
|
|
const g = new E.DataTexture(
|
|
A,
|
|
8,
|
|
e,
|
|
E.RGBAIntegerFormat,
|
|
E.UnsignedIntType
|
|
);
|
|
return g.internalFormat = "RGBA32UI", g.needsUpdate = !0, g;
|
|
}
|
|
newEdits(A, e) {
|
|
return new k({
|
|
key: "edits",
|
|
type: "uvec4",
|
|
count: e,
|
|
globals: () => [Hi],
|
|
value: A
|
|
});
|
|
}
|
|
// Ensure our SDF texture and edits uniform array have enough capacity.
|
|
// Reallocate if not.
|
|
ensureCapacity({
|
|
maxSdfs: A,
|
|
maxEdits: e
|
|
}) {
|
|
let g = !1;
|
|
return A > this.sdfTexture.image.height && (this.sdfTexture.dispose(), this.maxSdfs = Math.max(this.maxSdfs * 2, A), this.sdfData = new Uint32Array(this.maxSdfs * 8 * 4), this.sdfFloatData = new Float32Array(this.sdfData.buffer), this.sdfTexture = this.newSdfTexture(this.sdfData, this.maxSdfs)), e > (this.dynoEdits.count ?? 0) && (this.maxEdits = Math.max(this.maxEdits * 2, e), this.editData = new Uint32Array(this.maxEdits * 4), this.editFloatData = new Float32Array(this.editData.buffer), this.dynoEdits = this.newEdits(this.editData, this.maxEdits), g = !0), g;
|
|
}
|
|
updateEditData(A, e) {
|
|
const g = this.editData[A] !== e;
|
|
return this.editData[A] = e, g;
|
|
}
|
|
updateEditFloatData(A, e) {
|
|
pt[0] = e;
|
|
const g = this.editFloatData[A] !== pt[0];
|
|
return g && (this.editFloatData[A] = pt[0]), g;
|
|
}
|
|
encodeEdit(A, {
|
|
sdfFirst: e,
|
|
sdfCount: g,
|
|
invert: I,
|
|
rgbaBlendMode: s,
|
|
softEdge: B,
|
|
sdfSmooth: i
|
|
}) {
|
|
const Q = A * 4;
|
|
let C = !1;
|
|
return C = this.updateEditData(Q + 0, s | (I ? 256 : 0)) || C, C = this.updateEditData(Q + 1, e | g << 16) || C, C = this.updateEditFloatData(Q + 2, B) || C, C = this.updateEditFloatData(Q + 3, i) || C, C;
|
|
}
|
|
updateSdfData(A, e) {
|
|
const g = this.sdfData[A] !== e;
|
|
return this.sdfData[A] = e, g;
|
|
}
|
|
updateSdfFloatData(A, e) {
|
|
pt[0] = e;
|
|
const g = this.sdfFloatData[A] !== pt[0];
|
|
return g && (this.sdfFloatData[A] = pt[0]), g;
|
|
}
|
|
encodeSdf(A, {
|
|
sdfType: e,
|
|
invert: g,
|
|
center: I,
|
|
quaternion: s,
|
|
scale: B,
|
|
sizes: i
|
|
}, Q) {
|
|
const C = A * 32, a = e | (g ? 256 : 0);
|
|
let n = !1;
|
|
n = this.updateSdfFloatData(C + 0, (I == null ? void 0 : I.x) ?? 0) || n, n = this.updateSdfFloatData(C + 1, (I == null ? void 0 : I.y) ?? 0) || n, n = this.updateSdfFloatData(C + 2, (I == null ? void 0 : I.z) ?? 0) || n, n = this.updateSdfData(C + 3, a) || n, n = this.updateSdfFloatData(C + 4, (s == null ? void 0 : s.x) ?? 0) || n, n = this.updateSdfFloatData(C + 5, (s == null ? void 0 : s.y) ?? 0) || n, n = this.updateSdfFloatData(C + 6, (s == null ? void 0 : s.z) ?? 0) || n, n = this.updateSdfFloatData(C + 7, (s == null ? void 0 : s.w) ?? 0) || n, n = this.updateSdfFloatData(C + 8, (B == null ? void 0 : B.x) ?? 0) || n, n = this.updateSdfFloatData(C + 9, (B == null ? void 0 : B.y) ?? 0) || n, n = this.updateSdfFloatData(C + 10, (B == null ? void 0 : B.z) ?? 0) || n, n = this.updateSdfData(C + 11, 0) || n, n = this.updateSdfFloatData(C + 12, (i == null ? void 0 : i.x) ?? 0) || n, n = this.updateSdfFloatData(C + 13, (i == null ? void 0 : i.y) ?? 0) || n, n = this.updateSdfFloatData(C + 14, (i == null ? void 0 : i.z) ?? 0) || n, n = this.updateSdfFloatData(C + 15, (i == null ? void 0 : i.w) ?? 0) || n;
|
|
const o = Math.min(4, Q.length);
|
|
for (let r = 0; r < o; ++r) {
|
|
const h = C + 16 + r * 4;
|
|
n = this.updateSdfFloatData(h + 0, Q[r].x) || n, n = this.updateSdfFloatData(h + 1, Q[r].y) || n, n = this.updateSdfFloatData(h + 2, Q[r].z) || n, n = this.updateSdfFloatData(h + 3, Q[r].w) || n;
|
|
}
|
|
return n;
|
|
}
|
|
// Update the SDFs and edits from an array of SplatEdits and their
|
|
// associated SplatEditSdfs, updating it for the dyno shader program.
|
|
update(A) {
|
|
const e = A.reduce((n, { sdfs: o }) => n + o.length, 0), g = this.ensureCapacity({
|
|
maxEdits: A.length,
|
|
maxSdfs: e
|
|
}), I = [new E.Vector4(), new E.Vector4()], s = new E.Vector3(), B = new E.Quaternion(), i = new E.Vector3(), Q = new E.Vector4();
|
|
let C = 0, a = g;
|
|
A.length !== this.dynoNumEdits.value && (this.dynoNumEdits.value = A.length, this.numEdits = A.length, a = !0);
|
|
for (const [n, { edit: o, sdfs: r }] of A.entries()) {
|
|
a = this.encodeEdit(n, {
|
|
sdfFirst: C,
|
|
sdfCount: r.length,
|
|
invert: o.invert,
|
|
rgbaBlendMode: no(o.rgbaBlendMode),
|
|
softEdge: o.softEdge,
|
|
sdfSmooth: o.sdfSmooth
|
|
}) || a;
|
|
let h = !1;
|
|
for (const c of r)
|
|
Q.set(c.scale.x, c.scale.y, c.scale.z, c.radius), c.scale.setScalar(1), c.updateMatrixWorld(), c.matrixWorld.clone().invert().decompose(s, B, i), c.scale.set(Q.x, Q.y, Q.z), c.updateMatrixWorld(), I[0].set(c.color.r, c.color.g, c.color.b, c.opacity), I[1].set(c.displace.x, c.displace.y, c.displace.z, 1), h = this.encodeSdf(
|
|
C,
|
|
{
|
|
sdfType: io(c.type),
|
|
invert: c.invert,
|
|
center: s,
|
|
quaternion: B,
|
|
scale: i,
|
|
sizes: Q
|
|
},
|
|
I
|
|
) || h, C += 1;
|
|
this.numSdfs = C, h && (this.sdfTexture.needsUpdate = !0), a || (a = h);
|
|
}
|
|
return { updated: a, dynoUpdated: g };
|
|
}
|
|
// Modify a Gsplat in a dyno shader program using the current edits and SDFs.
|
|
modify(A) {
|
|
return Eo(
|
|
A,
|
|
this.dynoSdfArray,
|
|
this.dynoNumEdits,
|
|
this.dynoEdits
|
|
);
|
|
}
|
|
}
|
|
const vi = { type: "SdfArray" }, Ti = oA(`
|
|
struct SdfArray {
|
|
int numSdfs;
|
|
usampler2D sdfTexture;
|
|
};
|
|
|
|
void unpackSdfArray(
|
|
usampler2D sdfTexture, int sdfIndex, out uint flags,
|
|
out vec3 center, out vec4 quaternion, out vec3 scale, out vec4 sizes,
|
|
int numValues, out vec4 values[4]
|
|
) {
|
|
uvec4 temp = texelFetch(sdfTexture, ivec2(0, sdfIndex), 0);
|
|
flags = temp.w;
|
|
center = vec3(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z));
|
|
|
|
temp = texelFetch(sdfTexture, ivec2(1, sdfIndex), 0);
|
|
quaternion = vec4(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z), uintBitsToFloat(temp.w));
|
|
|
|
temp = texelFetch(sdfTexture, ivec2(2, sdfIndex), 0);
|
|
scale = vec3(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z));
|
|
|
|
temp = texelFetch(sdfTexture, ivec2(3, sdfIndex), 0);
|
|
sizes = vec4(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z), uintBitsToFloat(temp.w));
|
|
|
|
for (int i = 0; i < numValues; ++i) {
|
|
temp = texelFetch(sdfTexture, ivec2(4 + i, sdfIndex), 0);
|
|
values[i] = vec4(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z), uintBitsToFloat(temp.w));
|
|
}
|
|
}
|
|
|
|
const uint SDF_FLAG_TYPE = 0xFFu;
|
|
const uint SDF_FLAG_INVERT = 1u << 8u;
|
|
|
|
const uint SDF_TYPE_ALL = 0u;
|
|
const uint SDF_TYPE_PLANE = 1u;
|
|
const uint SDF_TYPE_SPHERE = 2u;
|
|
const uint SDF_TYPE_BOX = 3u;
|
|
const uint SDF_TYPE_ELLIPSOID = 4u;
|
|
const uint SDF_TYPE_CYLINDER = 5u;
|
|
const uint SDF_TYPE_CAPSULE = 6u;
|
|
const uint SDF_TYPE_INFINITE_CONE = 7u;
|
|
|
|
float evaluateSdfArray(
|
|
usampler2D sdfTexture, int numSdfs, int sdfFirst, int sdfCount, vec3 pos,
|
|
float smoothK, int numValues, out vec4 outValues[4]
|
|
) {
|
|
float distanceAccum = (smoothK == 0.0) ? 1.0 / 0.0 : 0.0;
|
|
float maxExp = -1.0 / 0.0;
|
|
for (int i = 0; i < numValues; ++i) {
|
|
outValues[i] = vec4(0.0);
|
|
}
|
|
|
|
uint flags;
|
|
vec3 center, scale;
|
|
vec4 quaternion, sizes;
|
|
vec4 values[4];
|
|
|
|
int sdfLast = min(sdfFirst + sdfCount, numSdfs);
|
|
for (int index = sdfFirst; index < sdfLast; ++index) {
|
|
unpackSdfArray(sdfTexture, index, flags, center, quaternion, scale, sizes, numValues, values);
|
|
uint sdfType = flags & SDF_FLAG_TYPE;
|
|
vec3 sdfPos = quatVec(quaternion, pos * scale) + center;
|
|
|
|
float distance;
|
|
switch (sdfType) {
|
|
case SDF_TYPE_ALL:
|
|
distance = -1.0 / 0.0;
|
|
break;
|
|
case SDF_TYPE_PLANE: {
|
|
distance = sdfPos.z;
|
|
break;
|
|
}
|
|
case SDF_TYPE_SPHERE: {
|
|
distance = length(sdfPos) - sizes.w;
|
|
break;
|
|
}
|
|
case SDF_TYPE_BOX: {
|
|
vec3 q = abs(sdfPos) - sizes.xyz + sizes.w;
|
|
distance = length(max(q, 0.0)) + min(max(q.x, max(q.y, q.z)), 0.0) - sizes.w;
|
|
break;
|
|
}
|
|
case SDF_TYPE_ELLIPSOID: {
|
|
vec3 sizes = sizes.xyz;
|
|
float k0 = length(sdfPos / sizes);
|
|
float k1 = length(sdfPos / dot(sizes, sizes));
|
|
distance = k0 * (k0 - 1.0) / k1;
|
|
break;
|
|
}
|
|
case SDF_TYPE_CYLINDER: {
|
|
vec2 d = abs(vec2(length(sdfPos.xz), sdfPos.y)) - sizes.wy;
|
|
distance = min(max(d.x, d.y), 0.0) + length(max(d, 0.0));
|
|
break;
|
|
}
|
|
case SDF_TYPE_CAPSULE: {
|
|
sdfPos.y -= clamp(sdfPos.y, -0.5 * sizes.y, 0.5 * sizes.y);
|
|
distance = length(sdfPos) - sizes.w;
|
|
break;
|
|
}
|
|
case SDF_TYPE_INFINITE_CONE: {
|
|
float angle = 0.25 * PI * sizes.w;
|
|
vec2 c = vec2(sin(angle), cos(angle));
|
|
vec2 q = vec2(length(sdfPos.xy), -sdfPos.z);
|
|
float d = length(q - c * max(dot(q, c), 0.0));
|
|
distance = d * (((q.x * c.y - q.y * c.x) < 0.0) ? -1.0 : 1.0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ((flags & SDF_FLAG_INVERT) != 0u) {
|
|
distance = -distance;
|
|
}
|
|
|
|
if (smoothK == 0.0) {
|
|
if (distance < distanceAccum) {
|
|
distanceAccum = distance;
|
|
for (int i = 0; i < numValues; ++i) {
|
|
outValues[i] = values[i];
|
|
}
|
|
}
|
|
} else {
|
|
float scaledDistance = -distance / smoothK;
|
|
if (scaledDistance > maxExp) {
|
|
float scale = exp(maxExp - scaledDistance);
|
|
distanceAccum *= scale;
|
|
for (int i = 0; i < numValues; ++i) {
|
|
outValues[i] *= scale;
|
|
}
|
|
maxExp = scaledDistance;
|
|
}
|
|
|
|
float weight = exp(scaledDistance - maxExp);
|
|
distanceAccum += weight;
|
|
for (int i = 0; i < numValues; ++i) {
|
|
outValues[i] += weight * values[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
if (smoothK == 0.0) {
|
|
return distanceAccum;
|
|
} else {
|
|
// Very distant SDFs may result in 0 accumulation
|
|
if (distanceAccum == 0.0) {
|
|
return 1.0 / 0.0;
|
|
}
|
|
for (int i = 0; i < numValues; ++i) {
|
|
outValues[i] /= distanceAccum;
|
|
}
|
|
return (-log(distanceAccum) - maxExp) * smoothK;
|
|
}
|
|
}
|
|
|
|
float modulateSdfArray(
|
|
usampler2D sdfTexture, int numSdfs, int sdfFirst, int sdfCount, vec3 pos,
|
|
float smoothK, int numValues, out vec4 values[4],
|
|
float softEdge, bool invert
|
|
) {
|
|
float distance = evaluateSdfArray(sdfTexture, numSdfs, sdfFirst, sdfCount, pos, smoothK, numValues, values);
|
|
if (invert) {
|
|
distance = -distance;
|
|
}
|
|
|
|
return (softEdge == 0.0) ? ((distance < 0.0) ? 1.0 : 0.0)
|
|
: clamp(-distance / softEdge + 0.5, 0.0, 1.0);
|
|
}
|
|
`), Hi = oA(`
|
|
const uint EDIT_FLAG_BLEND = 0xFFu;
|
|
const uint EDIT_BLEND_MULTIPLY = 0u;
|
|
const uint EDIT_BLEND_SET_RGB = 1u;
|
|
const uint EDIT_BLEND_ADD_RGBA = 2u;
|
|
const uint EDIT_FLAG_INVERT = 0x100u;
|
|
|
|
void decodeEdit(
|
|
uvec4 packedEdit, out int sdfFirst, out int sdfCount,
|
|
out bool invert, out uint rgbaBlendMode, out float softEdge, out float sdfSmooth
|
|
) {
|
|
rgbaBlendMode = packedEdit.x & EDIT_FLAG_BLEND;
|
|
invert = (packedEdit.x & EDIT_FLAG_INVERT) != 0u;
|
|
|
|
sdfFirst = int(packedEdit.y & 0xFFFFu);
|
|
sdfCount = int(packedEdit.y >> 16u);
|
|
|
|
softEdge = uintBitsToFloat(packedEdit.z);
|
|
sdfSmooth = uintBitsToFloat(packedEdit.w);
|
|
}
|
|
|
|
void applyRgbaDisplaceEdit(
|
|
usampler2D sdfTexture, int numSdfs, int sdfFirst, int sdfCount, inout vec3 pos,
|
|
float smoothK, float softEdge, bool invert, uint rgbaBlendMode, inout vec4 rgba
|
|
) {
|
|
vec4 values[4];
|
|
float modulate = modulateSdfArray(sdfTexture, numSdfs, sdfFirst, sdfCount, pos, smoothK, 2, values, softEdge, invert);
|
|
// On Android, moving values[0] is necessary to work around a compiler bug.
|
|
vec4 sdfRgba = values[0];
|
|
vec4 sdfDisplaceScale = values[1];
|
|
|
|
vec4 target;
|
|
switch (rgbaBlendMode) {
|
|
case EDIT_BLEND_MULTIPLY:
|
|
target = rgba * sdfRgba;
|
|
break;
|
|
case EDIT_BLEND_SET_RGB:
|
|
target = vec4(sdfRgba.rgb, rgba.a * sdfRgba.a);
|
|
break;
|
|
case EDIT_BLEND_ADD_RGBA:
|
|
target = rgba + sdfRgba;
|
|
break;
|
|
default:
|
|
// Debug output if blend mode not set
|
|
target = vec4(fract(pos), 1.0);
|
|
}
|
|
rgba = mix(rgba, target, modulate);
|
|
pos += sdfDisplaceScale.xyz * modulate;
|
|
}
|
|
|
|
void applyPackedRgbaDisplaceEdit(uvec4 packedEdit, usampler2D sdfTexture, int numSdfs, inout vec3 pos, inout vec4 rgba) {
|
|
int sdfFirst, sdfCount;
|
|
bool invert;
|
|
uint rgbaBlendMode;
|
|
float softEdge, sdfSmooth;
|
|
decodeEdit(packedEdit, sdfFirst, sdfCount, invert, rgbaBlendMode, softEdge, sdfSmooth);
|
|
applyRgbaDisplaceEdit(sdfTexture, numSdfs, sdfFirst, sdfCount, pos, sdfSmooth, softEdge, invert, rgbaBlendMode, rgba);
|
|
}
|
|
`);
|
|
function Eo(t, A, e, g) {
|
|
return new X({
|
|
inTypes: {
|
|
gsplat: AA,
|
|
sdfArray: vi,
|
|
numEdits: "int",
|
|
rgbaDisplaceEdits: "uvec4"
|
|
},
|
|
outTypes: { gsplat: AA },
|
|
globals: () => [Ti, Hi],
|
|
inputs: { gsplat: t, sdfArray: A, numEdits: e, rgbaDisplaceEdits: g },
|
|
statements: ({ inputs: s, outputs: B }) => {
|
|
const { sdfArray: i, numEdits: Q, rgbaDisplaceEdits: C } = s, { gsplat: a } = B;
|
|
return YA(`
|
|
${a} = ${s.gsplat};
|
|
if (isGsplatActive(${a}.flags)) {
|
|
for (int editIndex = 0; editIndex < ${Q}; ++editIndex) {
|
|
applyPackedRgbaDisplaceEdit(
|
|
${C}[editIndex], ${i}.sdfTexture, ${i}.numSdfs,
|
|
${a}.center, ${a}.rgba
|
|
);
|
|
}
|
|
}
|
|
`);
|
|
}
|
|
}).outputs.gsplat;
|
|
}
|
|
const pt = new Float32Array(1);
|
|
class oo {
|
|
constructor(A) {
|
|
this.modifier = A, this.cache = /* @__PURE__ */ new Map();
|
|
}
|
|
apply(A) {
|
|
let e = this.cache.get(A);
|
|
return e || (e = NA(
|
|
{ index: "int" },
|
|
{ gsplat: AA },
|
|
({ index: g }) => {
|
|
const { gsplat: I } = A.apply({ index: g });
|
|
return this.modifier.apply({ gsplat: I });
|
|
}
|
|
), this.cache.set(A, e)), e;
|
|
}
|
|
}
|
|
class Mt {
|
|
// Create the dyno uniforms that parameterize the transform, setting them
|
|
// to initial values that are different from any valid transform.
|
|
constructor() {
|
|
this.scale = new rt({ value: Number.NEGATIVE_INFINITY }), this.rotate = new Rt({
|
|
value: new E.Quaternion(
|
|
Number.POSITIVE_INFINITY,
|
|
Number.POSITIVE_INFINITY,
|
|
Number.POSITIVE_INFINITY,
|
|
Number.POSITIVE_INFINITY
|
|
)
|
|
}), this.translate = new Gt({
|
|
value: new E.Vector3(
|
|
Number.POSITIVE_INFINITY,
|
|
Number.POSITIVE_INFINITY,
|
|
Number.POSITIVE_INFINITY
|
|
)
|
|
});
|
|
}
|
|
// Apply the transform to a Vec3 position in a dyno program.
|
|
apply(A) {
|
|
return Ei(A, {
|
|
scale: this.scale,
|
|
rotate: this.rotate,
|
|
translate: this.translate
|
|
});
|
|
}
|
|
applyDir(A) {
|
|
return oi(A, {
|
|
rotate: this.rotate
|
|
});
|
|
}
|
|
// Apply the transform to a Gsplat in a dyno program.
|
|
applyGsplat(A) {
|
|
return $e(A, {
|
|
scale: this.scale,
|
|
rotate: this.rotate,
|
|
translate: this.translate
|
|
});
|
|
}
|
|
// Update the uniforms to match the given transform matrix.
|
|
updateFromMatrix(A) {
|
|
const e = new E.Vector3(), g = new E.Quaternion(), I = new E.Vector3();
|
|
A.decompose(I, g, e);
|
|
const s = (e.x + e.y + e.z) / 3;
|
|
let B = !1;
|
|
return s !== this.scale.value && (this.scale.value = s, B = !0), I.equals(this.translate.value) || (this.translate.value.copy(I), B = !0), g.equals(this.rotate.value) || (this.rotate.value.copy(g), B = !0), B;
|
|
}
|
|
// Update this transform to match the object's to-world transform.
|
|
update(A) {
|
|
return A.updateMatrixWorld(), this.updateFromMatrix(A.matrixWorld);
|
|
}
|
|
}
|
|
class Zt extends E.Object3D {
|
|
constructor({
|
|
numSplats: A,
|
|
generator: e,
|
|
construct: g,
|
|
update: I
|
|
}) {
|
|
if (super(), this.numSplats = A ?? 0, this.generator = e, this.frameUpdate = I, this.version = 0, g) {
|
|
const s = g(this);
|
|
Object.assign(this, s);
|
|
}
|
|
}
|
|
updateVersion() {
|
|
this.version += 1;
|
|
}
|
|
set needsUpdate(A) {
|
|
A && this.updateVersion();
|
|
}
|
|
}
|
|
const gt = class gt extends Zt {
|
|
constructor(A = {}) {
|
|
const e = new Mt(), g = new Mt(), I = new Mt(), s = new Mt(), B = new Rt({
|
|
value: new E.Vector4(
|
|
Number.NEGATIVE_INFINITY,
|
|
Number.NEGATIVE_INFINITY,
|
|
Number.NEGATIVE_INFINITY,
|
|
Number.NEGATIVE_INFINITY
|
|
)
|
|
}), i = new rt({ value: 0 }), Q = new rt({ value: 0 }), C = {
|
|
transform: e,
|
|
viewToWorld: g,
|
|
worldToView: I,
|
|
viewToObject: s,
|
|
recolor: B,
|
|
time: i,
|
|
deltaTime: Q
|
|
};
|
|
if (super({
|
|
update: ({ time: a, deltaTime: n, viewToWorld: o, globalEdits: r }) => this.update({ time: a, deltaTime: n, viewToWorld: o, globalEdits: r })
|
|
}), this.isInitialized = !1, this.recolor = new E.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 ZA(), this.packedSplats.splatEncoding = A.splatEncoding ?? {
|
|
...De
|
|
}, 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 a = A.onLoad(this);
|
|
a instanceof Promise && await a;
|
|
}
|
|
return this;
|
|
});
|
|
else if (this.isInitialized = !0, this.initialized = Promise.resolve(this), A.onLoad) {
|
|
const a = A.onLoad(this);
|
|
a instanceof Promise && (this.initialized = a.then(() => this));
|
|
}
|
|
}
|
|
async asyncInitialize(A) {
|
|
const {
|
|
url: e,
|
|
fileBytes: g,
|
|
fileType: I,
|
|
fileName: s,
|
|
maxSplats: B,
|
|
constructSplats: i,
|
|
splatEncoding: Q
|
|
} = A;
|
|
if (e || g || i) {
|
|
const C = {
|
|
url: e,
|
|
fileBytes: g,
|
|
fileType: I,
|
|
fileName: s,
|
|
maxSplats: B,
|
|
construct: i,
|
|
splatEncoding: Q
|
|
};
|
|
this.packedSplats.reinitialize(C);
|
|
}
|
|
this.packedSplats && (await this.packedSplats.initialized, this.numSplats = this.packedSplats.numSplats, this.updateGenerator());
|
|
}
|
|
static async staticInitialize() {
|
|
await Rg(), gt.isStaticInitialized = !0;
|
|
}
|
|
// Creates a new Gsplat with the provided parameters (all values in "float" space,
|
|
// i.e. 0-1 for opacity and color) and adds it to the end of the packedSplats,
|
|
// increasing numSplats by 1. If necessary, reallocates the buffer with an exponential
|
|
// doubling strategy to fit the new data, so it's fairly efficient to just
|
|
// pushSplat(...) each Gsplat you want to create in a loop.
|
|
pushSplat(A, e, g, I, s) {
|
|
this.packedSplats.pushSplat(A, e, g, I, s);
|
|
}
|
|
// This method iterates over all Gsplats in this instance's packedSplats,
|
|
// invoking the provided callback with index: number in 0..=(this.numSplats-1) and
|
|
// center: THREE.Vector3, scales: THREE.Vector3, quaternion: THREE.Quaternion,
|
|
// opacity: number (0..1), and color: THREE.Color (rgb values in 0..1).
|
|
// Note that the objects passed in as center etc. are the same for every callback
|
|
// invocation: these objects are reused for efficiency. Changing these values has
|
|
// no effect as they are decoded/unpacked copies of the underlying data. To update
|
|
// the packedSplats, call .packedSplats.setSplat(index, center, scales,
|
|
// quaternion, opacity, color).
|
|
forEachSplat(A) {
|
|
this.packedSplats.forEachSplat(A);
|
|
}
|
|
// Call this when you are finished with the SplatMesh and want to free
|
|
// any buffers it holds (via packedSplats).
|
|
dispose() {
|
|
this.packedSplats.dispose();
|
|
}
|
|
constructGenerator(A) {
|
|
const { transform: e, viewToObject: g, recolor: I } = A, s = NA(
|
|
{ index: "int" },
|
|
{ gsplat: AA },
|
|
({ index: B }) => {
|
|
if (!B)
|
|
throw new Error("index is undefined");
|
|
let i = Ft(this.packedSplats.dyno, B);
|
|
if (this.maxSh >= 1) {
|
|
const { sh1Texture: C, sh2Texture: a, sh3Texture: n } = this.ensureShTextures();
|
|
if (C) {
|
|
let o = function(D, y) {
|
|
const { x: d, y: S } = lt(y).outputs, M = sA(cA(d, S), v("float", 0.5)), p = sA(ut(S, d), v("float", 0.5));
|
|
return cA(M, sA(D, p));
|
|
};
|
|
const r = g.translate, { center: h } = ot(i).outputs, c = GB(ut(h, r)), l = lo(i, C, c);
|
|
let u = o(l, this.packedSplats.dynoSh1MinMax);
|
|
if (this.maxSh >= 2 && a) {
|
|
const D = uo(i, a, c);
|
|
u = cA(
|
|
u,
|
|
o(D, this.packedSplats.dynoSh2MinMax)
|
|
);
|
|
}
|
|
if (this.maxSh >= 3 && n) {
|
|
const D = wo(i, n, c);
|
|
u = cA(
|
|
u,
|
|
o(D, this.packedSplats.dynoSh3MinMax)
|
|
);
|
|
}
|
|
let { rgba: w } = ot(i).outputs;
|
|
w = cA(w, xB(u, v("float", 0))), i = Bt({ gsplat: i, rgba: w });
|
|
}
|
|
}
|
|
if (this.splatRgba) {
|
|
const C = so(this.splatRgba.dyno, B);
|
|
i = Bt({ gsplat: i, rgba: C });
|
|
}
|
|
this.skinning && (i = this.skinning.modify(i)), this.objectModifier && (i = this.objectModifier.apply({ gsplat: i }).gsplat), i = e.applyGsplat(i);
|
|
const Q = sA(I, ot(i).outputs.rgba);
|
|
return i = Bt({ gsplat: i, rgba: Q }), this.rgbaDisplaceEdits && (i = this.rgbaDisplaceEdits.modify(i)), this.worldModifier && (i = this.worldModifier.apply({ gsplat: i }).gsplat), { gsplat: i };
|
|
}
|
|
);
|
|
this.generator = s;
|
|
}
|
|
// Call this whenever something changes in the Gsplat processing pipeline,
|
|
// for example changing maxSh or updating objectModifier or worldModifier.
|
|
// Compiled generators are cached for efficiency and re-use when the same
|
|
// pipeline structure emerges after successive changes.
|
|
updateGenerator() {
|
|
this.constructGenerator(this.context);
|
|
}
|
|
// This is called automatically by SparkRenderer and you should not have to
|
|
// call it. It updates parameters for the generated pipeline and calls
|
|
// updateGenerator() if the pipeline needs to change.
|
|
update({
|
|
time: A,
|
|
viewToWorld: e,
|
|
deltaTime: g,
|
|
globalEdits: I
|
|
}) {
|
|
var l;
|
|
this.numSplats = this.packedSplats.numSplats, this.context.time.value = A, this.context.deltaTime.value = g, gt.dynoTime.value = A;
|
|
const { transform: s, viewToObject: B, recolor: i } = this.context;
|
|
let Q = s.update(this);
|
|
this.context.viewToWorld.updateFromMatrix(e) && this.enableViewToWorld && (Q = !0);
|
|
const C = e.clone().invert();
|
|
this.context.worldToView.updateFromMatrix(C) && this.enableWorldToView && (Q = !0);
|
|
const o = new E.Matrix4().compose(
|
|
s.translate.value,
|
|
s.rotate.value,
|
|
new E.Vector3().setScalar(s.scale.value)
|
|
).invert().multiply(e);
|
|
B.updateFromMatrix(o) && (this.enableViewToObject || this.packedSplats.extra.sh1) && (Q = !0);
|
|
const r = new E.Vector4(
|
|
this.recolor.r,
|
|
this.recolor.g,
|
|
this.recolor.b,
|
|
this.opacity
|
|
);
|
|
r.equals(i.value) || (i.value.copy(r), Q = !0);
|
|
const h = this.editable ? (this.edits ?? []).concat(I) : [];
|
|
this.editable && !this.edits && this.traverseVisible((u) => {
|
|
u instanceof ae && h.push(u);
|
|
}), h.sort((u, w) => u.ordering - w.ordering);
|
|
const c = h.map((u) => {
|
|
if (u.sdfs != null)
|
|
return { edit: u, sdfs: u.sdfs };
|
|
const w = [];
|
|
return u.traverseVisible((D) => {
|
|
D instanceof Co && w.push(D);
|
|
}), { edit: u, sdfs: w };
|
|
});
|
|
if (c.length > 0 && !this.rgbaDisplaceEdits) {
|
|
const u = c.length, w = c.reduce(
|
|
(D, y) => D + y.sdfs.length,
|
|
0
|
|
);
|
|
this.rgbaDisplaceEdits = new ao({
|
|
maxEdits: u,
|
|
maxSdfs: w
|
|
}), this.updateGenerator();
|
|
}
|
|
if (this.rgbaDisplaceEdits) {
|
|
const u = this.rgbaDisplaceEdits.update(c);
|
|
Q || (Q = u.updated), u.dynoUpdated && this.updateGenerator();
|
|
}
|
|
Q && this.updateVersion(), (l = this.onFrame) == null || l.call(this, { mesh: this, time: A, deltaTime: g });
|
|
}
|
|
// This method conforms to the standard THREE.Raycaster API, performing object-ray
|
|
// intersections using this method to populate the provided intersects[] array
|
|
// with each intersection point.
|
|
raycast(A, e) {
|
|
var r, h;
|
|
if (!this.packedSplats.packedArray || !this.packedSplats.numSplats)
|
|
return;
|
|
const { near: g, far: I, ray: s } = A, B = this.matrixWorld.clone().invert(), i = new E.Matrix3().setFromMatrix4(B), Q = s.origin.clone().applyMatrix4(B), C = s.direction.clone().applyMatrix3(i), a = new E.Vector3();
|
|
B.decompose(new E.Vector3(), new E.Quaternion(), a), (a.x * a.y * a.z) ** (1 / 3);
|
|
const o = KQ(
|
|
Q.x,
|
|
Q.y,
|
|
Q.z,
|
|
C.x,
|
|
C.y,
|
|
C.z,
|
|
g,
|
|
I,
|
|
this.packedSplats.numSplats,
|
|
this.packedSplats.packedArray,
|
|
!0,
|
|
((r = this.packedSplats.splatEncoding) == null ? void 0 : r.lnScaleMin) ?? UA,
|
|
((h = this.packedSplats.splatEncoding) == null ? void 0 : h.lnScaleMax) ?? LA
|
|
);
|
|
for (const c of o) {
|
|
const l = s.direction.clone().multiplyScalar(c).add(s.origin);
|
|
e.push({
|
|
distance: c,
|
|
point: l,
|
|
object: this
|
|
});
|
|
}
|
|
}
|
|
ensureShTextures() {
|
|
if (!this.packedSplats.extra.sh1)
|
|
return {};
|
|
let A = this.packedSplats.extra.sh1Texture;
|
|
if (!A) {
|
|
let I = this.packedSplats.extra.sh1;
|
|
const { width: s, height: B, depth: i, maxSplats: Q } = fA(
|
|
I.length / 2
|
|
);
|
|
if (I.length < Q * 2) {
|
|
const a = new Uint32Array(Q * 2);
|
|
a.set(I), this.packedSplats.extra.sh1 = a, I = a;
|
|
}
|
|
const C = new E.DataArrayTexture(I, s, B, i);
|
|
C.format = E.RGIntegerFormat, C.type = E.UnsignedIntType, C.internalFormat = "RG32UI", C.needsUpdate = !0, A = new Kt({
|
|
value: C,
|
|
key: "sh1"
|
|
}), this.packedSplats.extra.sh1Texture = A;
|
|
}
|
|
if (!this.packedSplats.extra.sh2)
|
|
return { sh1Texture: A };
|
|
let e = this.packedSplats.extra.sh2Texture;
|
|
if (!e) {
|
|
let I = this.packedSplats.extra.sh2;
|
|
const { width: s, height: B, depth: i, maxSplats: Q } = fA(
|
|
I.length / 4
|
|
);
|
|
if (I.length < Q * 4) {
|
|
const a = new Uint32Array(Q * 4);
|
|
a.set(I), this.packedSplats.extra.sh2 = a, I = a;
|
|
}
|
|
const C = new E.DataArrayTexture(I, s, B, i);
|
|
C.format = E.RGBAIntegerFormat, C.type = E.UnsignedIntType, C.internalFormat = "RGBA32UI", C.needsUpdate = !0, e = new Kt({
|
|
value: C,
|
|
key: "sh2"
|
|
}), this.packedSplats.extra.sh2Texture = e;
|
|
}
|
|
if (!this.packedSplats.extra.sh3)
|
|
return { sh1Texture: A, sh2Texture: e };
|
|
let g = this.packedSplats.extra.sh3Texture;
|
|
if (!g) {
|
|
let I = this.packedSplats.extra.sh3;
|
|
const { width: s, height: B, depth: i, maxSplats: Q } = fA(
|
|
I.length / 4
|
|
);
|
|
if (I.length < Q * 4) {
|
|
const a = new Uint32Array(Q * 4);
|
|
a.set(I), this.packedSplats.extra.sh3 = a, I = a;
|
|
}
|
|
const C = new E.DataArrayTexture(I, s, B, i);
|
|
C.format = E.RGBAIntegerFormat, C.type = E.UnsignedIntType, C.internalFormat = "RGBA32UI", C.needsUpdate = !0, g = new Kt({
|
|
value: C,
|
|
key: "sh3"
|
|
}), this.packedSplats.extra.sh3Texture = g;
|
|
}
|
|
return { sh1Texture: A, sh2Texture: e, sh3Texture: g };
|
|
}
|
|
};
|
|
gt.staticInitialized = gt.staticInitialize(), gt.isStaticInitialized = !1, gt.dynoTime = new rt({ value: 0 });
|
|
let PA = gt;
|
|
const ro = oA(`
|
|
vec3 evaluateSH1(Gsplat gsplat, usampler2DArray sh1, vec3 viewDir) {
|
|
// Extract sint7 values packed into 2 x uint32
|
|
uvec2 packed = texelFetch(sh1, splatTexCoord(gsplat.index), 0).rg;
|
|
vec3 sh1_0 = vec3(ivec3(
|
|
int(packed.x << 25u) >> 25,
|
|
int(packed.x << 18u) >> 25,
|
|
int(packed.x << 11u) >> 25
|
|
)) / 63.0;
|
|
vec3 sh1_1 = vec3(ivec3(
|
|
int(packed.x << 4u) >> 25,
|
|
int((packed.x >> 3u) | (packed.y << 29u)) >> 25,
|
|
int(packed.y << 22u) >> 25
|
|
)) / 63.0;
|
|
vec3 sh1_2 = vec3(ivec3(
|
|
int(packed.y << 15u) >> 25,
|
|
int(packed.y << 8u) >> 25,
|
|
int(packed.y << 1u) >> 25
|
|
)) / 63.0;
|
|
|
|
return sh1_0 * (-0.4886025 * viewDir.y)
|
|
+ sh1_1 * (0.4886025 * viewDir.z)
|
|
+ sh1_2 * (-0.4886025 * viewDir.x);
|
|
}
|
|
`), co = oA(`
|
|
vec3 evaluateSH2(Gsplat gsplat, usampler2DArray sh2, vec3 viewDir) {
|
|
// Extract sint8 values packed into 4 x uint32
|
|
uvec4 packed = texelFetch(sh2, splatTexCoord(gsplat.index), 0);
|
|
vec3 sh2_0 = vec3(ivec3(
|
|
int(packed.x << 24u) >> 24,
|
|
int(packed.x << 16u) >> 24,
|
|
int(packed.x << 8u) >> 24
|
|
)) / 127.0;
|
|
vec3 sh2_1 = vec3(ivec3(
|
|
int(packed.x) >> 24,
|
|
int(packed.y << 24u) >> 24,
|
|
int(packed.y << 16u) >> 24
|
|
)) / 127.0;
|
|
vec3 sh2_2 = vec3(ivec3(
|
|
int(packed.y << 8u) >> 24,
|
|
int(packed.y) >> 24,
|
|
int(packed.z << 24u) >> 24
|
|
)) / 127.0;
|
|
vec3 sh2_3 = vec3(ivec3(
|
|
int(packed.z << 16u) >> 24,
|
|
int(packed.z << 8u) >> 24,
|
|
int(packed.z) >> 24
|
|
)) / 127.0;
|
|
vec3 sh2_4 = vec3(ivec3(
|
|
int(packed.w << 24u) >> 24,
|
|
int(packed.w << 16u) >> 24,
|
|
int(packed.w << 8u) >> 24
|
|
)) / 127.0;
|
|
|
|
return sh2_0 * (1.0925484 * viewDir.x * viewDir.y)
|
|
+ sh2_1 * (-1.0925484 * viewDir.y * viewDir.z)
|
|
+ sh2_2 * (0.3153915 * (2.0 * viewDir.z * viewDir.z - viewDir.x * viewDir.x - viewDir.y * viewDir.y))
|
|
+ sh2_3 * (-1.0925484 * viewDir.x * viewDir.z)
|
|
+ sh2_4 * (0.5462742 * (viewDir.x * viewDir.x - viewDir.y * viewDir.y));
|
|
}
|
|
`), ho = oA(`
|
|
vec3 evaluateSH3(Gsplat gsplat, usampler2DArray sh3, vec3 viewDir) {
|
|
// Extract sint6 values packed into 4 x uint32
|
|
uvec4 packed = texelFetch(sh3, splatTexCoord(gsplat.index), 0);
|
|
vec3 sh3_0 = vec3(ivec3(
|
|
int(packed.x << 26u) >> 26,
|
|
int(packed.x << 20u) >> 26,
|
|
int(packed.x << 14u) >> 26
|
|
)) / 31.0;
|
|
vec3 sh3_1 = vec3(ivec3(
|
|
int(packed.x << 8u) >> 26,
|
|
int(packed.x << 2u) >> 26,
|
|
int((packed.x >> 4u) | (packed.y << 28u)) >> 26
|
|
)) / 31.0;
|
|
vec3 sh3_2 = vec3(ivec3(
|
|
int(packed.y << 22u) >> 26,
|
|
int(packed.y << 16u) >> 26,
|
|
int(packed.y << 10u) >> 26
|
|
)) / 31.0;
|
|
vec3 sh3_3 = vec3(ivec3(
|
|
int(packed.y << 4u) >> 26,
|
|
int((packed.y >> 2u) | (packed.z << 30u)) >> 26,
|
|
int(packed.z << 24u) >> 26
|
|
)) / 31.0;
|
|
vec3 sh3_4 = vec3(ivec3(
|
|
int(packed.z << 18u) >> 26,
|
|
int(packed.z << 12u) >> 26,
|
|
int(packed.z << 6u) >> 26
|
|
)) / 31.0;
|
|
vec3 sh3_5 = vec3(ivec3(
|
|
int(packed.z) >> 26,
|
|
int(packed.w << 26u) >> 26,
|
|
int(packed.w << 20u) >> 26
|
|
)) / 31.0;
|
|
vec3 sh3_6 = vec3(ivec3(
|
|
int(packed.w << 14u) >> 26,
|
|
int(packed.w << 8u) >> 26,
|
|
int(packed.w << 2u) >> 26
|
|
)) / 31.0;
|
|
|
|
float xx = viewDir.x * viewDir.x;
|
|
float yy = viewDir.y * viewDir.y;
|
|
float zz = viewDir.z * viewDir.z;
|
|
float xy = viewDir.x * viewDir.y;
|
|
float yz = viewDir.y * viewDir.z;
|
|
float zx = viewDir.z * viewDir.x;
|
|
|
|
return sh3_0 * (-0.5900436 * viewDir.y * (3.0 * xx - yy))
|
|
+ sh3_1 * (2.8906114 * xy * viewDir.z) +
|
|
+ sh3_2 * (-0.4570458 * viewDir.y * (4.0 * zz - xx - yy))
|
|
+ sh3_3 * (0.3731763 * viewDir.z * (2.0 * zz - 3.0 * xx - 3.0 * yy))
|
|
+ sh3_4 * (-0.4570458 * viewDir.x * (4.0 * zz - xx - yy))
|
|
+ sh3_5 * (1.4453057 * viewDir.z * (xx - yy))
|
|
+ sh3_6 * (-0.5900436 * viewDir.x * (xx - 3.0 * yy));
|
|
}
|
|
`);
|
|
function lo(t, A, e) {
|
|
return jt({
|
|
inTypes: { gsplat: AA, sh1: "usampler2DArray", viewDir: "vec3" },
|
|
outTypes: { rgb: "vec3" },
|
|
inputs: { gsplat: t, sh1: A, viewDir: e },
|
|
globals: () => [FA, ro],
|
|
statements: ({ inputs: g, outputs: I }) => YA(`
|
|
if (isGsplatActive(${g.gsplat}.flags)) {
|
|
${I.rgb} = evaluateSH1(${g.gsplat}, ${g.sh1}, ${g.viewDir});
|
|
} else {
|
|
${I.rgb} = vec3(0.0);
|
|
}
|
|
`)
|
|
}).outputs.rgb;
|
|
}
|
|
function uo(t, A, e) {
|
|
return jt({
|
|
inTypes: { gsplat: AA, sh2: "usampler2DArray", viewDir: "vec3" },
|
|
outTypes: { rgb: "vec3" },
|
|
inputs: { gsplat: t, sh2: A, viewDir: e },
|
|
globals: () => [FA, co],
|
|
statements: ({ inputs: g, outputs: I }) => YA(`
|
|
if (isGsplatActive(${g.gsplat}.flags)) {
|
|
${I.rgb} = evaluateSH2(${g.gsplat}, ${g.sh2}, ${g.viewDir});
|
|
} else {
|
|
${I.rgb} = vec3(0.0);
|
|
}
|
|
`)
|
|
}).outputs.rgb;
|
|
}
|
|
function wo(t, A, e) {
|
|
return jt({
|
|
inTypes: { gsplat: AA, sh3: "usampler2DArray", viewDir: "vec3" },
|
|
outTypes: { rgb: "vec3" },
|
|
inputs: { gsplat: t, sh3: A, viewDir: e },
|
|
globals: () => [FA, ho],
|
|
statements: ({ inputs: g, outputs: I }) => YA(`
|
|
if (isGsplatActive(${g.gsplat}.flags)) {
|
|
${I.rgb} = evaluateSH3(${g.gsplat}, ${g.sh3}, ${g.viewDir});
|
|
} else {
|
|
${I.rgb} = vec3(0.0);
|
|
}
|
|
`)
|
|
}).outputs.rgb;
|
|
}
|
|
const mt = class mt {
|
|
// Create a PlyReader from a Uint8Array/ArrayBuffer, no parsing done yet
|
|
constructor({ fileBytes: A }) {
|
|
this.header = "", this.littleEndian = !0, this.elements = {}, this.comments = [], this.data = null, this.numSplats = 0, this.fileBytes = A instanceof ArrayBuffer ? new Uint8Array(A) : A;
|
|
}
|
|
// Identify and parse the PLY text header (assumed to be <64KB in size).
|
|
// this.elements will contain all the elements in the file, typically
|
|
// "vertex" contains the Gsplat data.
|
|
async parseHeader() {
|
|
const e = new ReadableStream({
|
|
start: (B) => {
|
|
B.enqueue(this.fileBytes.slice(0, 65536)), B.close();
|
|
}
|
|
}).pipeThrough(new TextDecoderStream()).getReader();
|
|
this.header = "";
|
|
const g = `end_header
|
|
`;
|
|
for (; ; ) {
|
|
const { value: B, done: i } = await e.read();
|
|
if (i)
|
|
throw new Error("Failed to read header");
|
|
this.header += B;
|
|
const Q = this.header.indexOf(g);
|
|
if (Q >= 0) {
|
|
this.header = this.header.slice(0, Q + g.length);
|
|
break;
|
|
}
|
|
}
|
|
const I = new TextEncoder().encode(this.header).length;
|
|
this.data = new DataView(this.fileBytes.buffer, I), this.elements = {};
|
|
let s = null;
|
|
this.comments = [], this.header.trim().split(`
|
|
`).forEach((B, i) => {
|
|
const Q = B.trim();
|
|
if (i === 0) {
|
|
if (Q !== "ply")
|
|
throw new Error("Invalid PLY header");
|
|
return;
|
|
}
|
|
if (Q.length === 0)
|
|
return;
|
|
const C = Q.split(" ");
|
|
switch (C[0]) {
|
|
case "format":
|
|
if (C[1] === "binary_little_endian")
|
|
this.littleEndian = !0;
|
|
else if (C[1] === "binary_big_endian")
|
|
this.littleEndian = !1;
|
|
else
|
|
throw new Error(`Unsupported PLY format: ${C[1]}`);
|
|
if (C[2] !== "1.0")
|
|
throw new Error(`Unsupported PLY version: ${C[2]}`);
|
|
break;
|
|
case "end_header":
|
|
break;
|
|
case "comment":
|
|
this.comments.push(Q.slice(8));
|
|
break;
|
|
case "element": {
|
|
const a = C[1];
|
|
s = {
|
|
name: a,
|
|
count: Number.parseInt(C[2]),
|
|
properties: {}
|
|
}, this.elements[a] = s;
|
|
break;
|
|
}
|
|
case "property":
|
|
if (s == null)
|
|
throw new Error("Property must be inside an element");
|
|
C[1] === "list" ? s.properties[C[4]] = {
|
|
isList: !0,
|
|
type: C[3],
|
|
countType: C[2]
|
|
} : s.properties[C[2]] = {
|
|
isList: !1,
|
|
type: C[1]
|
|
};
|
|
break;
|
|
}
|
|
}), this.elements.vertex && (this.numSplats = this.elements.vertex.count);
|
|
}
|
|
parseData(A) {
|
|
let e = 0;
|
|
const g = this.data;
|
|
if (g == null)
|
|
throw new Error("No data to parse");
|
|
for (const I in this.elements) {
|
|
const s = this.elements[I], { count: B, properties: i } = s, Q = {}, C = [];
|
|
for (const [n, o] of Object.entries(i))
|
|
o.isList ? (Q[n] = [], C.push(() => {
|
|
const r = Q[n];
|
|
r.length = te[o.countType](
|
|
g,
|
|
e,
|
|
this.littleEndian
|
|
), e += dt[o.countType];
|
|
for (let h = 0; h < r.length; h++)
|
|
r[h] = te[o.type](
|
|
g,
|
|
e,
|
|
this.littleEndian
|
|
), e += dt[o.type];
|
|
})) : (Q[n] = 0, C.push(() => {
|
|
Q[n] = te[o.type](
|
|
g,
|
|
e,
|
|
this.littleEndian
|
|
), e += dt[o.type];
|
|
}));
|
|
const a = A(s) ?? (() => {
|
|
});
|
|
for (let n = 0; n < B; n++) {
|
|
for (const o of C)
|
|
o();
|
|
a(n, Q);
|
|
}
|
|
}
|
|
}
|
|
// Parse all the Gsplat data in the PLY file in go, invoking the given
|
|
// callbacks for each Gsplat.
|
|
parseSplats(A, e) {
|
|
if (this.elements.vertex == null)
|
|
throw new Error("No vertex element found");
|
|
let g = !1;
|
|
const I = [];
|
|
let s = 0, B = [], i = [], Q = [], C, a, n;
|
|
function o() {
|
|
const u = yo[s];
|
|
B = new Array(3).fill(null).flatMap(
|
|
(w, D) => [0, 1, 2].map((y, d) => `f_rest_${D + d * u / 3}`)
|
|
), i = new Array(5).fill(null).flatMap(
|
|
(w, D) => [0, 1, 2].map((y, d) => `f_rest_${3 + D + d * u / 3}`)
|
|
), Q = new Array(7).fill(null).flatMap(
|
|
(w, D) => [0, 1, 2].map((y, d) => `f_rest_${8 + D + d * u / 3}`)
|
|
), C = s >= 1 ? new Float32Array(3 * 3) : void 0, a = s >= 2 ? new Float32Array(5 * 3) : void 0, n = s >= 3 ? new Float32Array(7 * 3) : void 0;
|
|
}
|
|
function r(u, w) {
|
|
if (!C)
|
|
throw new Error("Missing sh1");
|
|
for (const [D, y] of B.entries())
|
|
C[D] = w[y] * 8 / 255 - 4;
|
|
if (a)
|
|
for (const [D, y] of i.entries())
|
|
a[D] = w[y] * 8 / 255 - 4;
|
|
if (n)
|
|
for (const [D, y] of Q.entries())
|
|
n[D] = w[y] * 8 / 255 - 4;
|
|
e == null || e(u, C, a, n);
|
|
}
|
|
function h(u) {
|
|
const {
|
|
min_x: w,
|
|
min_y: D,
|
|
min_z: y,
|
|
max_x: d,
|
|
max_y: S,
|
|
max_z: M,
|
|
min_scale_x: p,
|
|
min_scale_y: f,
|
|
min_scale_z: R,
|
|
max_scale_x: N,
|
|
max_scale_y: m,
|
|
max_scale_z: L
|
|
} = u.properties;
|
|
if (!w || !D || !y || !d || !S || !M || !p || !f || !R || !N || !m || !L)
|
|
throw new Error("Missing PLY chunk properties");
|
|
return g = !0, (x, G) => {
|
|
const {
|
|
min_x: U,
|
|
min_y: J,
|
|
min_z: P,
|
|
max_x: T,
|
|
max_y: eA,
|
|
max_z: z,
|
|
min_scale_x: _,
|
|
min_scale_y: H,
|
|
min_scale_z: O,
|
|
max_scale_x: W,
|
|
max_scale_y: $,
|
|
max_scale_z: Y,
|
|
min_r: wA,
|
|
min_g: CA,
|
|
min_b: DA,
|
|
max_r: yA,
|
|
max_g: MA,
|
|
max_b: rA
|
|
} = G;
|
|
I.push({
|
|
min_x: U,
|
|
min_y: J,
|
|
min_z: P,
|
|
max_x: T,
|
|
max_y: eA,
|
|
max_z: z,
|
|
min_scale_x: _,
|
|
min_scale_y: H,
|
|
min_scale_z: O,
|
|
max_scale_x: W,
|
|
max_scale_y: $,
|
|
max_scale_z: Y,
|
|
min_r: wA,
|
|
min_g: CA,
|
|
min_b: DA,
|
|
max_r: yA,
|
|
max_g: MA,
|
|
max_b: rA
|
|
});
|
|
};
|
|
}
|
|
function c(u) {
|
|
if (e && u.name === "sh")
|
|
return s = hg(u.properties), o(), r;
|
|
if (u.name !== "vertex")
|
|
return null;
|
|
const { packed_position: w, packed_rotation: D, packed_scale: y, packed_color: d } = u.properties;
|
|
if (!w || !D || !y || !d)
|
|
throw new Error(
|
|
"Missing PLY properties: packed_position, packed_rotation, packed_scale, packed_color"
|
|
);
|
|
const S = Math.sqrt(2);
|
|
return (M, p) => {
|
|
const f = I[M >>> 8];
|
|
if (f == null)
|
|
throw new Error("Missing PLY chunk");
|
|
const {
|
|
min_x: R,
|
|
min_y: N,
|
|
min_z: m,
|
|
max_x: L,
|
|
max_y: x,
|
|
max_z: G,
|
|
min_scale_x: U,
|
|
min_scale_y: J,
|
|
min_scale_z: P,
|
|
max_scale_x: T,
|
|
max_scale_y: eA,
|
|
max_scale_z: z,
|
|
min_r: _,
|
|
min_g: H,
|
|
min_b: O,
|
|
max_r: W,
|
|
max_g: $,
|
|
max_b: Y
|
|
} = f, { packed_position: wA, packed_rotation: CA, packed_scale: DA, packed_color: yA } = p, MA = (wA >>> 21 & 2047) / 2047 * (L - R) + R, rA = (wA >>> 11 & 1023) / 1023 * (x - N) + N, JA = (wA & 2047) / 2047 * (G - m) + m, mA = ((CA >>> 20 & 1023) / 1023 - 0.5) * S, _A = ((CA >>> 10 & 1023) / 1023 - 0.5) * S, OA = ((CA & 1023) / 1023 - 0.5) * S, b = Math.sqrt(Math.max(0, 1 - mA * mA - _A * _A - OA * OA)), uA = CA >>> 30, XA = uA === 0 ? mA : uA === 1 ? b : _A, Lt = uA <= 1 ? _A : uA === 2 ? b : OA, Ot = uA <= 2 ? OA : b, SA = uA === 0 ? b : mA, K = Math.exp(
|
|
(DA >>> 21 & 2047) / 2047 * (T - U) + U
|
|
), WA = Math.exp(
|
|
(DA >>> 11 & 1023) / 1023 * (eA - J) + J
|
|
), ye = Math.exp(
|
|
(DA & 2047) / 2047 * (z - P) + P
|
|
), pe = (yA >>> 24 & 255) / 255 * ((W ?? 1) - (_ ?? 0)) + (_ ?? 0), de = (yA >>> 16 & 255) / 255 * (($ ?? 1) - (H ?? 0)) + (H ?? 0), fe = (yA >>> 8 & 255) / 255 * ((Y ?? 1) - (O ?? 0)) + (O ?? 0), Me = (yA & 255) / 255;
|
|
A(
|
|
M,
|
|
MA,
|
|
rA,
|
|
JA,
|
|
K,
|
|
WA,
|
|
ye,
|
|
XA,
|
|
Lt,
|
|
Ot,
|
|
SA,
|
|
Me,
|
|
pe,
|
|
de,
|
|
fe
|
|
);
|
|
};
|
|
}
|
|
const l = (u) => {
|
|
if (u.name === "chunk")
|
|
return h(u);
|
|
if (g)
|
|
return c(u);
|
|
if (u.name !== "vertex")
|
|
return null;
|
|
const {
|
|
x: w,
|
|
y: D,
|
|
z: y,
|
|
scale_0: d,
|
|
scale_1: S,
|
|
scale_2: M,
|
|
rot_0: p,
|
|
rot_1: f,
|
|
rot_2: R,
|
|
rot_3: N,
|
|
opacity: m,
|
|
f_dc_0: L,
|
|
f_dc_1: x,
|
|
f_dc_2: G,
|
|
red: U,
|
|
green: J,
|
|
blue: P,
|
|
alpha: T
|
|
} = u.properties;
|
|
if (!w || !D || !y)
|
|
throw new Error("Missing PLY properties: x, y, z");
|
|
const eA = d && S && M, z = p && f && R && N, _ = T != null ? ee[T.type] : 1, H = U != null ? ee[U.type] : 1, O = J != null ? ee[J.type] : 1, W = P != null ? ee[P.type] : 1;
|
|
return s = hg(u.properties), o(), ($, Y) => {
|
|
const wA = eA ? Math.exp(Y.scale_0) : mt.defaultPointScale, CA = eA ? Math.exp(Y.scale_1) : mt.defaultPointScale, DA = eA ? Math.exp(Y.scale_2) : mt.defaultPointScale, yA = z ? Y.rot_1 : 0, MA = z ? Y.rot_2 : 0, rA = z ? Y.rot_3 : 0, JA = z ? Y.rot_0 : 1, mA = m != null ? 1 / (1 + Math.exp(-Y.opacity)) : T != null ? Y.alpha / _ : 1, _A = L != null ? Y.f_dc_0 * Ae + 0.5 : U != null ? Y.red / H : 1, OA = x != null ? Y.f_dc_1 * Ae + 0.5 : J != null ? Y.green / O : 1, b = G != null ? Y.f_dc_2 * Ae + 0.5 : P != null ? Y.blue / W : 1;
|
|
if (A(
|
|
$,
|
|
Y.x,
|
|
Y.y,
|
|
Y.z,
|
|
wA,
|
|
CA,
|
|
DA,
|
|
yA,
|
|
MA,
|
|
rA,
|
|
JA,
|
|
mA,
|
|
_A,
|
|
OA,
|
|
b
|
|
), e && C) {
|
|
if (C)
|
|
for (const [uA, XA] of B.entries())
|
|
C[uA] = Y[XA];
|
|
if (a)
|
|
for (const [uA, XA] of i.entries())
|
|
a[uA] = Y[XA];
|
|
if (n)
|
|
for (const [uA, XA] of Q.entries())
|
|
n[uA] = Y[XA];
|
|
e($, C, a, n);
|
|
}
|
|
};
|
|
};
|
|
this.parseData(l);
|
|
}
|
|
// Inject RGBA values into original PLY file, which can be used to modify
|
|
// the color/opacity of the Gsplats and write out the modified PLY file.
|
|
injectRgba(A) {
|
|
let e = 0;
|
|
const g = this.data;
|
|
if (g == null)
|
|
throw new Error("No parsed data");
|
|
if (A.length !== this.numSplats * 4)
|
|
throw new Error("Invalid RGBA array length");
|
|
for (const I in this.elements) {
|
|
const s = this.elements[I], { count: B, properties: i } = s, Q = [];
|
|
let C = 0;
|
|
const a = I === "vertex";
|
|
if (a) {
|
|
for (const n of ["opacity", "f_dc_0", "f_dc_1", "f_dc_2"])
|
|
if (!i[n] || i[n].type !== "float")
|
|
throw new Error(`Can't injectRgba due to property: ${n}`);
|
|
}
|
|
for (const [n, o] of Object.entries(i))
|
|
if (o.isList)
|
|
Q.push(() => {
|
|
const r = te[o.countType](
|
|
g,
|
|
e,
|
|
this.littleEndian
|
|
);
|
|
e += dt[o.countType], e += r * dt[o.type];
|
|
});
|
|
else {
|
|
if (a)
|
|
if (n === "f_dc_0" || n === "f_dc_1" || n === "f_dc_2") {
|
|
const r = Number.parseInt(
|
|
n.slice(5)
|
|
);
|
|
Q.push(() => {
|
|
const h = (A[C + r] / 255 - 0.5) / Ae;
|
|
cg[o.type](
|
|
g,
|
|
e,
|
|
this.littleEndian,
|
|
h
|
|
);
|
|
});
|
|
} else n === "opacity" && Q.push(() => {
|
|
const r = Math.max(
|
|
-100,
|
|
Math.min(
|
|
100,
|
|
-Math.log(1 / (A[C + 3] / 255) - 1)
|
|
)
|
|
);
|
|
cg[o.type](
|
|
g,
|
|
e,
|
|
this.littleEndian,
|
|
r
|
|
);
|
|
});
|
|
Q.push(() => {
|
|
e += dt[o.type];
|
|
});
|
|
}
|
|
for (let n = 0; n < B; n++) {
|
|
for (const o of Q)
|
|
o();
|
|
a && (C += 4);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
mt.defaultPointScale = 1e-3;
|
|
let Ee = mt;
|
|
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)
|
|
}, cg = {
|
|
char: (t, A, e, g) => {
|
|
t.setInt8(A, g);
|
|
},
|
|
uchar: (t, A, e, g) => {
|
|
t.setUint8(A, g);
|
|
},
|
|
short: (t, A, e, g) => {
|
|
t.setInt16(A, g, e);
|
|
},
|
|
ushort: (t, A, e, g) => {
|
|
t.setUint16(A, g, e);
|
|
},
|
|
int: (t, A, e, g) => {
|
|
t.setInt32(A, g, e);
|
|
},
|
|
uint: (t, A, e, g) => {
|
|
t.setUint32(A, g, e);
|
|
},
|
|
float: (t, A, e, g) => {
|
|
t.setFloat32(A, g, e);
|
|
},
|
|
double: (t, A, e, g) => {
|
|
t.setFloat64(A, g, e);
|
|
}
|
|
}, dt = {
|
|
char: 1,
|
|
uchar: 1,
|
|
short: 2,
|
|
ushort: 2,
|
|
int: 4,
|
|
uint: 4,
|
|
float: 4,
|
|
double: 8
|
|
}, ee = {
|
|
char: 127,
|
|
uchar: 255,
|
|
short: 32767,
|
|
ushort: 65535,
|
|
int: 2147483647,
|
|
uint: 4294967295,
|
|
float: 1,
|
|
double: 1
|
|
}, Do = {
|
|
0: 0,
|
|
9: 1,
|
|
24: 2,
|
|
45: 3
|
|
}, yo = {
|
|
0: 0,
|
|
1: 9,
|
|
2: 24,
|
|
3: 45
|
|
};
|
|
function hg(t) {
|
|
let A = 0;
|
|
for (; t[`f_rest_${A}`]; )
|
|
A += 1;
|
|
const e = Do[A];
|
|
if (e == null)
|
|
throw new Error(`Unsupported number of SH coefficients: ${A}`);
|
|
return e;
|
|
}
|
|
const Ki = '(function(){"use strict";let FA;const gg=typeof TextDecoder<"u"?new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}):{decode:()=>{throw Error("TextDecoder not available")}};typeof TextDecoder<"u"&&gg.decode();let PA=null;function Vg(){return(PA===null||PA.byteLength===0)&&(PA=new Uint8Array(FA.memory.buffer)),PA}function Pg(B,A){return B=B>>>0,gg.decode(Vg().subarray(B,B+A))}function Og(B,A,I){return FA.sort_splats(B,A,I)>>>0}function $g(B,A,I){return FA.sort32_splats(B,A,I)>>>0}async function AB(B,A){if(typeof Response=="function"&&B instanceof Response){if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(B,A)}catch(g){if(B.headers.get("Content-Type")!="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n",g);else throw g}const I=await B.arrayBuffer();return await WebAssembly.instantiate(I,A)}else{const I=await WebAssembly.instantiate(B,A);return I instanceof WebAssembly.Instance?{instance:I,module:B}:I}}function IB(){const B={};return B.wbg={},B.wbg.__wbg_buffer_609cc3eee51ed158=function(A){return A.buffer},B.wbg.__wbg_length_3b4f022188ae8db6=function(A){return A.length},B.wbg.__wbg_length_6ca527665d89694d=function(A){return A.length},B.wbg.__wbg_length_8cfd2c6409af88ad=function(A){return A.length},B.wbg.__wbg_new_9fee97a409b32b68=function(A){return new Uint16Array(A)},B.wbg.__wbg_new_e3b321dcfef89fc7=function(A){return new Uint32Array(A)},B.wbg.__wbg_newwithbyteoffsetandlength_e6b7e69acd4c7354=function(A,I,g){return new Float32Array(A,I>>>0,g>>>0)},B.wbg.__wbg_newwithbyteoffsetandlength_f1dead44d1fc7212=function(A,I,g){return new Uint32Array(A,I>>>0,g>>>0)},B.wbg.__wbg_newwithlength_5a5efe313cfd59f1=function(A){return new Float32Array(A>>>0)},B.wbg.__wbg_set_10bad9bee0e9c58b=function(A,I,g){A.set(I,g>>>0)},B.wbg.__wbg_set_d23661d19148b229=function(A,I,g){A.set(I,g>>>0)},B.wbg.__wbg_set_f4f1f0daa30696fc=function(A,I,g){A.set(I,g>>>0)},B.wbg.__wbg_subarray_3aaeec89bb2544f0=function(A,I,g){return A.subarray(I>>>0,g>>>0)},B.wbg.__wbg_subarray_769e1e0f81bb259b=function(A,I,g){return A.subarray(I>>>0,g>>>0)},B.wbg.__wbindgen_init_externref_table=function(){const A=FA.__wbindgen_export_0,I=A.grow(4);A.set(0,void 0),A.set(I+0,void 0),A.set(I+1,null),A.set(I+2,!0),A.set(I+3,!1)},B.wbg.__wbindgen_memory=function(){return FA.memory},B.wbg.__wbindgen_throw=function(A,I){throw new Error(Pg(A,I))},B}function gB(B,A){return FA=B.exports,Bg.__wbindgen_wasm_module=A,PA=null,FA.__wbindgen_start(),FA}async function Bg(B){if(FA!==void 0)return FA;typeof B<"u"&&(Object.getPrototypeOf(B)===Object.prototype?{module_or_path:B}=B:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),typeof B>"u"&&(B=new URL("data:application/wasm;base64,AGFzbQEAAAAB9AEjYAJ/fwF/YAN/f38Bf2ACf38AYAN/f38AYAF/AX9gAX8AYAV/f39/fwBgA29/fwFvYAV/f39/fwF/YAR/f39/AGABbwFvYANvb38AYAFvAX9gAAF/YAAAYAd/f39/f39/AX9gAX0BfWAGf39/f39/AGAEf39/fwF/YAN/b28Bf2ABfwFvYAABb2AHf39/f39/fwBgAn9+AX9gA39+fgBgDX19fX19fX19f29/fX0Bb2AGf39/f39/AX9gBX9/fX9/AGAEf31/fwBgBX9/fn9/AGAEf35/fwBgBX9/fH9/AGAEf3x/fwBgA39+fgF/YAJ9fQF9AvIEEQN3YmcdX193YmdfYnVmZmVyXzYwOWNjM2VlZTUxZWQxNTgACgN3YmcaX193YmdfbmV3XzlmZWU5N2E0MDliMzJiNjgACgN3YmcaX193Ymdfc2V0X2Y0ZjFmMGRhYTMwNjk2ZmMACwN3YmcdX193YmdfbGVuZ3RoXzhjZmQyYzY0MDlhZjg4YWQADAN3YmcxX193YmdfbmV3d2l0aGJ5dGVvZmZzZXRhbmRsZW5ndGhfZjFkZWFkNDRkMWZjNzIxMgAHA3diZxpfX3diZ19uZXdfZTNiMzIxZGNmZWY4OWZjNwAKA3diZxpfX3diZ19zZXRfZDIzNjYxZDE5MTQ4YjIyOQALA3diZx1fX3diZ19sZW5ndGhfNmNhNTI3NjY1ZDg5Njk0ZAAMA3diZzFfX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9lNmI3ZTY5YWNkNGM3MzU0AAcDd2JnGl9fd2JnX3NldF8xMGJhZDliZWUwZTljNThiAAsDd2JnHV9fd2JnX2xlbmd0aF8zYjRmMDIyMTg4YWU4ZGI2AAwDd2JnH19fd2JnX3N1YmFycmF5Xzc2OWUxZTBmODFiYjI1OWIABwN3YmcfX193Ymdfc3ViYXJyYXlfM2FhZWVjODliYjI1NDRmMAAHA3diZyRfX3diZ19uZXd3aXRobGVuZ3RoXzVhNWVmZTMxM2NmZDU5ZjEAFAN3YmcQX193YmluZGdlbl90aHJvdwACA3diZxFfX3diaW5kZ2VuX21lbW9yeQAVA3diZx9fX3diaW5kZ2VuX2luaXRfZXh0ZXJucmVmX3RhYmxlAA4DwQG/AQQAAAYABAIEAQAP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QTBqECcNAgsgCSgCAEGcncAAQQEQlwENASACKAIAQQJGDQBBASEBIANBAXFFDQAjAEFAaiIDJAAgAyAENgIMAkAgCS0AEEEBRgRAIAkoAgAhCCADQoCAgICgATcDGCADQZSbwAA2AiggA0KUm8CAwAY3AxBBASEEIANBATYCPCADQfiewAA2AjggA0EBNgIsIANBAjYCNCAIQQRqKAIAIQogAyADQRBqNgIwIAgoAgAgCiADQShqECcNAQsgCSgCACIEKAIAQZafwABBECAEQQRqKAIAKAIMEQEABEBBASEEDAELIAkoAgQgCSgCCCEKIANBNGogAkEIaigCADYCACADIAkoAgAiCzYCKCADIAIpAgA3AixBASEEIAsgA0EsaiAKKAIQEQEADQAgCSgCACECIAMgA0EMaq1CgICAgBCENwMQIANBATYCLCADQaifwAA2AiggA0IBNwI0IAJBBGooAgAhCCADIANBEGoiCjYCMCACKAIAIAggA0EoaiIIECcNACAFQQFxBEAgAyAGNgIkIAkoAgAhAiADIANBJGqtQoCAgIAQhDcDECADQQE2AiwgA0Gon8AANgIoIANCATcCNCACQQRqKAIAIQUgAyAKNgIwIAIoAgAgBSAIECcNAQsgCSgCACICKAIAQZydwABBASACQQRqKAIAKAIMEQEAIQQLIANBQGskACAEDQILIAAgDEEBajYCBEEAIQEMAQtBASEBCyAHQdAAaiQAIAELmwcCDH8BfiMAQTBrIgEkAAJAAkAgACgCAEUEQCAAKAIQIgBFDQFBpazAAEEBIAAQyAEhAwwCCyABQQxqIAAQRwJAAn8gASgCDCICRQRAIAEtABAhAiAAKAIQIgYEQEEBIQNBjKzAAEH8q8AAIAJBAXEiBxtBGUEQIAcbIAYQyAENBQsgACACOgAEQQAMAQsCQCABKAIQIgNBAXENACABQoCAgIAgNwIYIAEgAjYCDCABIAM2AhAgASACIANqIgo2AhQDQAJAIAFBDGoQGEGAgMQAaw4CAgABCwsgACgCECILRQ0DIAtBIhCYAQ0CIAFCgICAgCA3AhggASAKNgIUIAEgAzYCECABIAI2AgwgAUEoaiEMA0ACQAJAAkACQAJ/An8CQAJAAkACQAJAAkACQCABQQxqEBgiAkGBgMQARwRAIAJBgIDEAEYNCiACQSdGDQsg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aiADcgwCC0ECQQJB2InAABBqAAsgASABZ0EQayIBQf//A3FBCGp0Qf///wNxIANBgICA2ANyIAFBF3Rrcgs2AgggACAENgIEIAAgBTYCAAuWBAEEfyMAQYABayIEJAACQAJAAkAgASgCCCICQYCAgBBxRQRAIAJBgICAIHENAUEBIQIgACgCACABEDJFDQIMAwsgACgCACECA0AgAyAEakH/AGogAkEPcSIFQTByIAVB1wBqIAVBCkkbOgAAIANBAWshAyACQRBJIAJBBHYhAkUNAAtBASECIAFBv77AAEECIAMgBGpBgAFqQQAgA2sQIUUNAQwCCyAAKAIAIQIDQCADIARqQf8AaiACQQ9xIgVBMHIgBUE3aiAFQQpJGzoAACADQQFrIQMgAkEPSyACQQR2IQINAAtBASECIAFBv77AAEECIAMgBGpBgAFqQQAgA2sQIQ0BCyABKAIAQau7wABBAiABKAIEKAIMEQEADQACQCABKAIIIgJBgICAEHFFBEAgAkGAgIAgcQ0BIAAoAgQgARAyIQIMAgsgACgCBCECQQAhAwNAIAMgBGpB/wBqIAJBD3EiAEEwciAAQdcAaiAAQQpJGzoAACADQQFrIQMgAkEPSyACQQR2IQINAAsgAUG/vsAAQQIgAyAEakGAAWpBACADaxAhIQIMAQsgACgCBCECQQAhAwNAIAMgBGpB/wBqIAJBD3EiAEEwciAAQTdqIABBCkkbOgAAIANBAWshAyACQQ9LIAJBBHYhAg0ACyABQb++wABBAiADIARqQYABakEAIANrECEhAgsgBEGAAWokACACC7oEAQh/IwBBEGsiAyQAIAMgATYCBCADIAA2AgAgA0KggICADjcCCAJ/AkACQAJAIAIoAhAiCQRAIAIoAhQiAA0BDAILIAIoAgwiAEUNASACKAIIIgEgAEEDdGohBCAAQQFrQf////8BcUEBaiEGIAIoAgAhAANAAkAgAEEEaigCACIFRQ0AIAMoAgAgACgCACAFIAMoAgQoAgwRAQBFDQBBAQwFC0EBIAEoAgAgAyABQQRqKAIAEQAADQQaIABBCGohACAEIAFBCGoiAUcNAAsMAgsgAEEYbCEKIABBAWtB/////wFxQQFqIQYgAigCCCEEIAIoAgAhAANAAkAgAEEEaigCACIBRQ0AIAMoAgAgACgCACABIAMoAgQoAgwRAQBFDQBBAQwEC0EAIQdBACEIAkACQAJAIAUgCWoiAUEIai8BAEEBaw4CAQIACyABQQpqLwEAIQgMAQsgBCABQQxqKAIAQQN0ai8BBCEICwJAAkACQCABLwEAQQFrDgIBAgALIAFBAmovAQAhBwwBCyAEIAFBBGooAgBBA3RqLwEEIQcLIAMgBzsBDiADIAg7AQwgAyABQRRqKAIANgIIQQEgBCABQRBqKAIAQQN0aiIBKAIAIAMgASgCBBEAAA0DGiAAQQhqIQAgBUEYaiIFIApHDQALDAELCwJAIAYgAigCBE8NACADKAIAIAIoAgAgBkEDdGoiACgCACAAKAIEIAMoAgQoAgwRAQBFDQBBAQwBC0EACyADQRBqJAALlQQBDH8gAUEBayEOIAAoAgQhCiAAKAIAIQsgACgCCCEMAkADQCAFDQECfwJAIAIgA0kNAANAIAEgA2ohBQJAAkACQCACIANrIgdBB00EQCACIANHDQEgAiEDDAULAkAgBUEDakF8cSIGIAVrIgQEQEEAIQADQCAAIAVqLQAAQQpGDQUgBCAAQQFqIgBHDQALIAQgB0EIayIATQ0BDAMLIAdBCGshAAsDQEGAgoQIIAYoAgAiCUGKlKjQAHNrIAlyQYCChAggBkEEaigCACIJQYqUqNAAc2sgCXJxQYCBgoR4cUGAgYKEeEcNAiAGQQhqIQYgBEEIaiIEIABNDQALDAELQQAhAANAIAAgBWotAABBCkYNAiAHIABBAWoiAEcNAAsgAiEDDAMLIAQgB0YEQCACIQMMAwsDQCAEIAVqLQAAQQpGBEAgBCEADAILIAcgBEEBaiIERw0ACyACIQMMAgsgACADaiIGQQFqIQMCQCACIAZNDQAgACAFai0AAEEKRw0AQQAhBSADIQYgAwwDCyACIANPDQALCyACIAhGDQJBASEFIAghBiACCyEAAkAgDC0AAARAIAtBrL7AAEEEIAooAgwRAQANAQtBACEEIAAgCEcEQCAAIA5qLQAAQQpGIQQLIAAgCGshACABIAhqIQcgDCAEOgAAIAYhCCALIAcgACAKKAIMEQEARQ0BCwtBASENCyANC4QEAg1/AX4jAEEwayIDJAAgA0EMaq1CgICAgBCEIRAgAC0ADCEKIAAoAgQhDiAAKAIIIQYgACgCACENAn8DQAJAIAgiDw0AIAchCUEBIQgCQCACIAVJBEAgAiEEDAELAn8DQCABIAVqIQcCQAJAAkAgAiAFayILQQdNBEAgAiAFRgRAIAIhBSAJDAYLQQAhBANAIAQgB2otAABBCkYNBCALIARBAWoiBEcNAAsMAQsgA0EKIAcgCxBBIAMoAgBBAXENAQsgCSEHIAIhBSACIQQMBAsgAygCBCEECyAEIAVqIgRBAWohBQJAIAIgBE0NACABIARqLQAAQQpHDQBBACEIIAUhBwwDCyACIAVPDQALIAkLIQcgAiEECwJAIApBAXFFBEAgAEEBOgAMIA1BAXEEQCADIA42AgwgAyAQNwMoIANBATYCJCADQYSLwAA2AiAgA0ECNgIUIANB9IrAADYCECADQQE2AhwgBkEEaigCACELIAMgA0EoajYCGEEBIAYoAgAgCyADQRBqECcNBRoMAgsgBkHsisAAQQQQlwENAgwBCyAMRQ0AIAZBChCYAQ0BIA0EQCAGQZyLwABBBxCXAQ0CDAELIAZB7IrAAEEEEJcBDQELIAxBAWohDEEBIQogBiABIAlqIAQgCWsQlwFFDQELCyAPQQFzCyADQTBqJABBAXEL9gMBCH8gASgCBCIFBEAgASgCACEEA0ACQCADQQFqIQICfyACIAMgBGotAAAiCMAiCUEATg0AGgJAAkACQAJAAkACQAJAAkACQAJAAkAgCEHbwcAAai0AAEECaw4DAAECDAtBzMTAACACIARqIAIgBU8bLAAAQUBODQsgA0ECagwKC0HMxMAAIAIgBGogAiAFTxssAAAhByAIQeABayIGRQ0BIAZBDUYNAgwDC0HMxMAAIAIgBGogAiAFTxssAAAhBiAIQfABaw4FBAMDAwUDCyAHQWBxQaB/Rw0IDAYLIAdBn39KDQcMBQsgCUEfakH/AXFBDE8EQCAJQX5xQW5HIAdBQE5yDQcMBQsgB0FATg0GDAQLIAlBD2pB/wFxQQJLIAZBQE5yDQUMAgsgBkHwAGpB/wFxQTBPDQQMAQsgBkGPf0oNAwtBzMTAACAEIANBAmoiAmogAiAFTxssAABBv39KDQJBzMTAACAEIANBA2oiAmogAiAFTxssAABBv39KDQIgA0EEagwBC0HMxMAAIAQgA0ECaiICaiACIAVPGywAAEFATg0BIANBA2oLIgMiAiAFSQ0BCwsgACADNgIEIAAgBDYCACABIAUgAms2AgQgASACIARqNgIAIAAgAiADazYCDCAAIAMgBGo2AggPCyAAQQA2AgALjwQBBX8jAEEgayIDJAACQAJAAkAgACgCACIBRQ0AA0ACQCAAKAIIIgIgACgCBE8NACABIAJqLQAAQcUARw0AIAAgAkEBajYCCAwCCwJAIARFDQAgACgCECIBRQ0AQdaswABBAyABEMgBDQMLIAAQNEH/AXEiAUECRg0CA0ACQAJAAkACQCAAKAIAIgVFDQAgACgCCCICIAAoAgRPDQAgAiAFai0AAEHwAEcNACAAIAJBAWo2AgggAUEBcQ0BIAAoAhAiAUUNAkGwpsAAQQEgARDIAQ0HDAILIAFBAXFFDQIgACgCECICRQ0CQQEhAUGvpsAAQQEgAhDIAUUNAgwHCyAAKAIQIgFFDQBBrazAAEECIAEQyAENBQsgACgCAEUEQCAAKAIQIgJFDQFBASEBQaWswABBASACEMgBDQYMAQsgAyAAEB8gAygCAEUEQCADLQAEIQEgACgCECICBEBBjKzAAEH8q8AAIAFBAXEiBRtBGUEQIAUbIAIQyAENBgsgACABOgAEIABBADYCAAwBCyADQRhqIANBCGopAgA3AwAgAyADKQIANwMQAkAgACgCECIBRQ0AIANBEGogARAVDQUgACgCECIBRQ0AQYGtwABBAyABEMgBDQULQQEhASAAEBZFDQEMBAsLIARBAWohBCAAKAIAIgENAAsLQQAhAQwBC0EBIQELIANBIGokACABC8kDAg1/AX4CfyADIAVBAWsiDSABKAIUIghqIgdLBEBBACABKAIIIgprIQ4gBSABKAIQIg9rIRAgASgCHCELIAEpAwAhFANAAkAgAQJ/AkAgFCACIAdqMQAAiEIBg1AEQCABIAUgCGoiCDYCFCAGDQMMAQsgCiALIAogCiALSRsgBhsiCSAFIAUgCUkbIQwgAiAIaiERIAkhBwJAAkACQANAIAcgDEYEQEEAIAsgBhshDCAKIQcDQCAHIAxNBEAgASAFIAhqIgI2AhQgBkUEQCABQQA2AhwLIAAgAjYCCCAAIAg2AgRBAQwMCyAHQQFrIgcgBU8NBSAHIAhqIgkgA08NAyAEIAdqLQAAIAIgCWotAABGDQALIAEgCCAPaiIINgIUIBAgBkUNBhoMBwsgByAIaiADTw0CIAcgEWohEiAEIAdqIAdBAWohBy0AACASLQAARg0ACyAIIA5qIAdqIQggBkUNAwwFCyAJIANB+KHAABBqAAsgAyAIIAlqIgAgACADSRsgA0GIosAAEGoACyAHIAVB6KHAABBqAAtBAAsiBzYCHCAHIQsLIAggDWoiByADSQ0ACwsgASADNgIUQQALIQcgACAHNgIAC/cDAgR/An0jAEEQayECIAC8IgNBH3YhBAJAAn0gAAJ/AkACQAJAAkAgA0H/////B3EiAUHQ2LqVBE8EQCABQYCAgPwHSwRAIAAPCyADQQBIIgNFIAFBl+TFlQRLcQ0CIANFDQEgAkMAAICAIACVOAIIIAIqAggaIAFBtOO/lgRNDQEMBwsgAUGY5MX1A00EQCABQYCAgMgDTQ0DQQAhASAADAYLIAFBkquU/ANNDQMLIABDO6q4P5QgBEECdEHs1MAAaioCAJL8AAwDCyAAQwAAAH+UDwsgAiAAQwAAAH+SOAIMIAIqAgwaIABDAACAP5IPCyAERSAEawsiAbIiBUMAcjG/lJIiACAFQ46+vzWUIgaTCyEFIAAgBSAFIAUgBZQiACAAQxVSNbuUQ4+qKj6SlJMiAJRDAAAAQCAAk5UgBpOSQwAAgD+SIQUgAUUNAAJAAkACQCABQf8ATARAIAFBgn9ODQMgBUMAAIAMlCEFIAFBm35NDQEgAUHmAGohAQwDCyAFQwAAAH+UIQUgAUH+AUsNASABQf8AayEBDAILIAVDAACADJQhBUG2fSABIAFBtn1NG0HMAWohAQwBCyAFQwAAAH+UIQVB/QIgASABQf0CTxtB/gFrIQELIAUgAUEXdEGAgID8A2pBgICA/AdxvpQhBQsgBQv5AwECfyAAIAFqIQICQAJAIAAoAgQiA0EBcQ0AIANBAnFFDQEgACgCACIDIAFqIQEgACADayIAQdzZwAAoAgBGBEAgAigCBEEDcUEDRw0BQdTZwAAgATYCACACIAIoAgRBfnE2AgQgACABQQFyNgIEIAIgATYCAAwCCyAAIAMQMwsCQAJAAkAgAigCBCIDQQJxRQRAIAJB4NnAACgCAEYNAiACQdzZwAAoAgBGDQMgAiADQXhxIgIQMyAAIAEgAmoiAUEBcjYCBCAAIAFqIAE2AgAgAEHc2cAAKAIARw0BQdTZwAAgATYCAA8LIAIgA0F+cTYCBCAAIAFBAXI2AgQgACABaiABNgIACyABQYACTwRAIAAgARA8DwsgAUH4AXFBxNfAAGohAgJ/QczZwAAoAgAiA0EBIAFBA3Z0IgFxRQRAQczZwAAgASADcjYCACACDAELIAIoAggLIQEgAiAANgIIIAEgADYCDCAAIAI2AgwgACABNgIIDwtB4NnAACAANgIAQdjZwABB2NnAACgCACABaiIBNgIAIAAgAUEBcjYCBCAAQdzZwAAoAgBHDQFB1NnAAEEANgIAQdzZwABBADYCAA8LQdzZwAAgADYCAEHU2cAAQdTZwAAoAgAgAWoiATYCACAAIAFBAXI2AgQgACABaiABNgIACwuLAwENfyMAQRBrIgYkAAJAIAEtACUNACABKAIEIQcCQCABKAIQIgQgASgCCCIMSw0AIAQgASgCDCICSQ0AIAFBFGoiDSABLQAYIgVqQQFrLQAAIQkgBUEFSSEOA0ACQCACIAdqIQoCQCAEIAJrIgtBB00EQCACIARGDQJBACEDA0AgAyAKai0AACAJRg0CIAsgA0EBaiIDRw0ACwwCCyAGQQhqIAkgCiALEEEgBigCCEEBcUUNASAGKAIMIQMLIAEgAiADakEBaiICNgIMAkAgAiAFSSACIAxLcg0AIA4EQCAHIAIgBWsiA2ogDSAFEHANASABKAIcIQQgASACNgIcIAQgB2ohCCADIARrIQMMBQsgBUEEQeCjwAAQsAEACyACIARNDQEMAgsLIAEgBDYCDAsgAUEBOgAlAkAgAS0AJEEBRgRAIAEoAiAhAiABKAIcIQEMAQsgASgCICICIAEoAhwiAUYNAQsgASAHaiEIIAIgAWshAwsgACADNgIEIAAgCDYCACAGQRBqJAALjwMBB38jAEEQayIEJAACQAJAAkACQCABKAIEIgIEQCABKAIAIQcgAkEDcSEFAkAgAkEESQRAQQAhAgwBCyAHQRxqIQMgAkF8cSEIQQAhAgNAIAMoAgAgA0EIaygCACADQRBrKAIAIANBGGsoAgAgAmpqamohAiADQSBqIQMgCCAGQQRqIgZHDQALCyAFBEAgBkEDdCAHakEEaiEDA0AgAygCACACaiECIANBCGohAyAFQQFrIgUNAAsLIAEoAgxFDQIgAkEPSw0BIAcoAgQNAQwDC0EAIQIgASgCDEUNAgsgAkEAIAJBAEobQQF0IQILQQAhBSACQQBOBEAgAkUNAUGS1sAALQAAGkEBIQUgAkEBEKIBIgMNAgsgBSACQZyywAAQkAEAC0EBIQNBACECCyAEQQA2AgggBCADNgIEIAQgAjYCACAEQZyxwAAgARAnRQRAIAAgBCkCADcCACAAQQhqIARBCGooAgA2AgAgBEEQaiQADwtBvLLAAEHWACAEQQ9qQayywABBrLPAABBnAAvnAgEFfwJAIAFBzf97QRAgACAAQRBNGyIAa08NACAAQRAgAUELakF4cSABQQtJGyIEakEMahARIgJFDQAgAkEIayEBAkAgAEEBayIDIAJxRQRAIAEhAAwBCyACQQRrIgUoAgAiBkF4cSACIANqQQAgAGtxQQhrIgIgAEEAIAIgAWtBEE0baiIAIAFrIgJrIQMgBkEDcQRAIAAgAyAAKAIEQQFxckECcjYCBCAAIANqIgMgAygCBEEBcjYCBCAFIAIgBSgCAEEBcXJBAnI2AgAgASACaiIDIAMoAgRBAXI2AgQgASACEC4MAQsgASgCACEBIAAgAzYCBCAAIAEgAmo2AgALAkAgACgCBCIBQQNxRQ0AIAFBeHEiAiAEQRBqTQ0AIAAgBCABQQFxckECcjYCBCAAIARqIgEgAiAEayIEQQNyNgIEIAAgAmoiAiACKAIEQQFyNgIEIAEgBBAuCyAAQQhqIQMLIAML5AIBCH8jAEEQayIFJABBCiECIAAiA0HoB08EQCADIQQDQCAFQQZqIAJqIgZBA2sgBCAEQZDOAG4iA0GQzgBsayIHQf//A3FB5ABuIghBAXQiCUHCvsAAai0AADoAACAGQQRrIAlBwb7AAGotAAA6AAAgBkEBayAHIAhB5ABsa0H//wNxQQF0IgdBwr7AAGotAAA6AAAgBkECayAHQcG+wABqLQAAOgAAIAJBBGshAiAEQf+s4gRLIAMhBA0ACwsCQCADQQlNBEAgAyEEDAELIAIgBWpBBWogAyADQf//A3FB5ABuIgRB5ABsa0H//wNxQQF0IgNBwr7AAGotAAA6AAAgAkECayICIAVBBmpqIANBwb7AAGotAAA6AAALQQAgACAEG0UEQCACQQFrIgIgBUEGamogBEEBdEEecUHCvsAAai0AADoAAAsgAUEBQQAgBUEGaiACakEKIAJrECEgBUEQaiQAC4IDAQR/IAAoAgwhAgJAAkACQCABQYACTwRAIAAoAhghAwJAAkAgACACRgRAIABBFEEQIAAoAhQiAhtqKAIAIgENAUEAIQIMAgsgACgCCCIBIAI2AgwgAiABNgIIDAELIABBFGogAEEQaiACGyEEA0AgBCEFIAEiAkEUaiACQRBqIAIoAhQiARshBCACQRRBECABG2ooAgAiAQ0ACyAFQQA2AgALIANFDQICQCAAKAIcQQJ0QbTWwABqIgEoAgAgAEcEQCADKAIQIABGDQEgAyACNgIUIAINAwwECyABIAI2AgAgAkUNBAwCCyADIAI2AhAgAg0BDAILIAAoAggiACACRwRAIAAgAjYCDCACIAA2AggPC0HM2cAAQczZwAAoAgBBfiABQQN2d3E2AgAPCyACIAM2AhggACgCECIBBEAgAiABNgIQIAEgAjYCGAsgACgCFCIARQ0AIAIgADYCFCAAIAI2AhgPCw8LQdDZwABB0NnAACgCAEF+IAAoAhx3cTYCAAv5AgIEfwF+IwBBIGsiAiQAAkACQAJAIAAoAgAiA0UNACAAKAIIIgEgACgCBE8NAAJAAkACQCABIANqIgMtAABBwgBGBEAgACABQQFqNgIIIAIgABBfIAIoAgANASAAKAIQIgFFDQJBjKzAAEH8q8AAIAItAARBAXEiAxtBGUEQIAMbIAEQyAFFDQJBAiEBDAYLIAMtAABByQBHDQMgACABQQFqNgIIQQIhASAAQQAQEkUNBAwFCyAAKAIQRQ0BIAApAgAhBSAAIAIpAgA3AgAgAkEYaiIDIABBCGoiASkCADcDACABIAJBCGopAgA3AgAgAiAFNwMQIAAQNCABIAMpAwA3AgAgACACKQMQNwIAQf8BcSEBDAQLIAAgAikCADcCACAAQQhqIAJBCGopAgA3AgALQQAhAQwCC0ECQQAgAEEAEBIbIQEMAQsgACgCECIDBEBBsKbAAEEBIAMQyAENAQtBAkEBIAAQOkEBcRshAQsgAkEgaiQAIAEL8wICB38DfiMAQRBrIgQkACABKAIAIQYCQAJAIAEoAggiAiABKAIEIgdJBEAgAiAGai0AAEHfAEYNAQsgAiAHIAIgB0sbIQgCQANAAkAgAiAHSQRAIAIgBmotAABB3wBGDQMLIAIgCEYNAAJAIAIgBmotAAAiBUEwayIDQf8BcUEKSQ0AIAVB4QBrQf8BcUEaTwRAIAVBwQBrQf8BcUEaTw0CIAVBHWshAwwBCyAFQdcAayEDCyABIAJBAWoiAjYCCCAEIAlC/////w+DQj5+IgogCUIgiEI+fiIJQiCGfCILNwMAIAQgCiALVq0gCUIgiHw3AwggBCkDCFBFDQAgBCkDACIKIAOtQv8Bg3wiCSAKWg0BCwsgAEEAOgABQQEhAwwCC0EBIQMgASACQQFqNgIIIAlCf1IEQCAAIAlCAXw3AwhBACEDDAILIABBADoAAQwBCyAAQgA3AwggASACQQFqNgIICyAAIAM6AAAgBEEQaiQAC9YCAQV/QRFBACAAQa+wBE8bIgIgAkEIciIBIABBC3QiAiABQQJ0QczTwABqKAIAQQt0SRsiASABQQRyIgEgAUECdEHM08AAaigCAEELdCACSxsiASABQQJyIgEgAUECdEHM08AAaigCAEELdCACSxsiASABQQFqIgEgAUECdEHM08AAaigCAEELdCACSxsiASABQQFqIgEgAUECdEHM08AAaigCAEELdCACSxsiAUECdEHM08AAaigCAEELdCIEIAJGIAIgBEtqIAFqIgRBAnRBzNPAAGoiBSgCAEEVdiECQe8FIQECQCAEQSBNBEAgBSgCBEEVdiEBIARFDQELIAVBBGsoAgBB////AHEhAwsCQCABIAJBAWpGDQAgACADayEDIAFBAWshAUEAIQADQCAAIAJBvLPAAGotAABqIgAgA0sNASABIAJBAWoiAkcNAAsLIAJBAXELswIBAX8jAEHwAGsiBiQAIAYgATYCDCAGIAA2AgggBiADNgIUIAYgAjYCECAGQeDUwAAoAgA2AhwgBkHU1MAAKAIANgIYAkAgBCgCAARAIAZBMGogBEEQaikCADcDACAGQShqIARBCGopAgA3AwAgBiAEKQIANwMgIAZBBDYCXCAGQeC9wAA2AlggBkIENwJkIAYgBkEQaq1CgICAgMALhDcDUCAGIAZBCGqtQoCAgIDAC4Q3A0ggBiAGQSBqrUKAgICA4AuENwNADAELIAZBAzYCXCAGQay9wAA2AlggBkIDNwJkIAYgBkEQaq1CgICAgMALhDcDSCAGIAZBCGqtQoCAgIDAC4Q3A0ALIAYgBkEYaq1CgICAgNALhDcDOCAGIAZBOGo2AmAgBkHYAGogBRCBAQALkQMCBX8BfiMAQRBrIgUkACAFQQhqIQQgASgCACEDIAEoAgQhAiMAQdAAayIBJAAgASADIAJB86jAAEEBEBQDQCABQcQAaiABEBcgASgCRCIGRQ0ACyAEIAICfyAGQQJHBEAgASgCSAwBCyACCyICazYCBCAEIAIgA2o2AgAgAUHQAGokACAAIAUoAgwiAkEQTQR+AkAgAkUNACACIAUoAggiAWohBgNAAn8gASwAACICQQBOBEAgAkH/AXEhAiABQQFqDAELIAEtAAFBP3EhAyACQR9xIQQgAkFfTQRAIARBBnQgA3IhAiABQQJqDAELIAEtAAJBP3EgA0EGdHIhAyACQXBJBEAgAyAEQQx0ciECIAFBA2oMAQsgBEESdEGAgPAAcSABLQADQT9xIANBBnRyciECIAFBBGoLIQEgAkHBAGtBX3FBCmogAkEwayACQTlLGyICQRBJBEAgAq0gB0IEhoQhByABIAZGDQIMAQsLQfSowAAQswEACyAAIAc3AwhCAQVCAAs3AwAgBUEQaiQAC8oCAQZ/IAEgAkEBdGohCSAAQYD+A3FBCHYhCiAAQf8BcSEMAkACQAJAAkADQCABQQJqIQsgByABLQABIgJqIQggCiABLQAAIgFHBEAgASAKSw0EIAghByALIgEgCUcNAQwECyAHIAhLDQEgBCAISQ0CIAMgB2ohAQNAIAJFBEAgCCEHIAsiASAJRw0CDAULIAJBAWshAiABLQAAIAFBAWohASAMRw0ACwtBACECDAMLIAcgCEH4xsAAELEBAAsgCCAEQfjGwAAQsAEACyAAQf//A3EhByAFIAZqIQNBASECA0AgBUEBaiEAAkAgBSwAACIBQQBOBEAgACEFDAELIAAgA0cEQCAFLQABIAFB/wBxQQh0ciEBIAVBAmohBQwBC0HoxsAAELMBAAsgByABayIHQQBIDQEgAkEBcyECIAMgBUcNAAsLIAJBAXEL3QIBBX8jAEEQayIEJAACQAJAAkAgACgCACIBRQ0AA0ACQCAAKAIIIgIgACgCBE8NACABIAJqLQAAQcUARw0AIAAgAkEBajYCCAwCCwJAAkACQCADRQ0AIAAoAhAiAkUNAEGtrMAAQQIgAhDIAQ0FIAAoAgAiAUUNAQsgACgCCCICIAAoAgRPDQACQCABIAJqIgEtAABBzABGBEAgACACQQFqNgIIIAQgABA1IAQtAABFDQEgBC0AASEDIAAoAhAiAgRAQQEhAUGMrMAAQfyrwAAgA0EBcSIFG0EZQRAgBRsgAhDIAQ0ICyAAIAM6AARBACEBIABBADYCAAwHCyABLQAAQcsARw0BQQEhASAAIAJBAWo2AgggAEEAEBNFDQIMBgsgACAEKQMIEFQNBAwBCyAAEBYNAwsgA0EBayEDIAAoAgAiAQ0ACwtBACEBDAELQQEhAQsgBEEQaiQAIAELygIBA38jAEEwayICJAACfwJAAkACQCAAKAIARQRAIAAoAhAiAA0BDAMLIAJBGGogABBHIAIoAhgiA0UEQCACLQAcIQMgACgCECIEBEBBAUGMrMAAQfyrwAAgA0EBcSIBG0EZQRAgARsgBBDIAQ0FGgsgACADOgAEIABBADYCAEEADAQLIAIgAigCHCIENgIUIAIgAzYCECACQRhqIAJBEGoQOAJAIAIoAhhBAUYEQCACIAIpAyA3AyggACgCECIARQ0EIAJBKGogABC0AQ0BDAMLIAAoAhAiAEUNA0GVrcAAQQIgABDIAQ0AIAMgBCAAEMgBRQ0CC0EBDAMLQaWswABBASAAEMgBDAILIAAtAApBgAFxDQAgAkEIaiABEHEgAigCCCIBBEAgASACKAIMIAAQyAEMAgtBmK3AABCzAQALQQALIAJBMGokAAvEAgEEfyAAQgA3AhAgAAJ/QQAgAUGAAkkNABpBHyABQf///wdLDQAaIAFBBiABQQh2ZyIDa3ZBAXEgA0EBdGtBPmoLIgI2AhwgAkECdEG01sAAaiEEQQEgAnQiA0HQ2cAAKAIAcUUEQCAEIAA2AgAgACAENgIYIAAgADYCDCAAIAA2AghB0NnAAEHQ2cAAKAIAIANyNgIADwsCQAJAIAEgBCgCACIDKAIEQXhxRgRAIAMhAgwBCyABQRkgAkEBdmtBACACQR9HG3QhBQNAIAMgBUEddkEEcWoiBCgCECICRQ0CIAVBAXQhBSACIQMgAigCBEF4cSABRw0ACwsgAigCCCIBIAA2AgwgAiAANgIIIABBADYCGCAAIAI2AgwgACABNgIIDwsgBEEQaiAANgIAIAAgAzYCGCAAIAA2AgwgACAANgIIC5kCAQN/IAAoAggiAyECAn9BASABQYABSQ0AGkECIAFBgBBJDQAaQQNBBCABQYCABEkbCyIEIAAoAgAgA2tLBH8gACADIAQQRCAAKAIIBSACCyAAKAIEaiECAkACQCABQYABTwRAIAFBgBBJDQEgAUGAgARPBEAgAiABQT9xQYABcjoAAyACIAFBEnZB8AFyOgAAIAIgAUEGdkE/cUGAAXI6AAIgAiABQQx2QT9xQYABcjoAAQwDCyACIAFBP3FBgAFyOgACIAIgAUEMdkHgAXI6AAAgAiABQQZ2QT9xQYABcjoAAQwCCyACIAE6AAAMAQsgAiABQT9xQYABcjoAASACIAFBBnZBwAFyOgAACyAAIAMgBGo2AghBAAuZAgEDfyAAKAIIIgMhAgJ/QQEgAUGAAUkNABpBAiABQYAQSQ0AGkEDQQQgAUGAgARJGwsiBCAAKAIAIANrSwR/IAAgAyAEEEggACgCCAUgAgsgACgCBGohAgJAAkAgAUGAAU8EQCABQYAQSQ0BIAFBgIAETwRAIAIgAUE/cUGAAXI6AAMgAiABQRJ2QfABcjoAACACIAFBBnZBP3FBgAFyOgACIAIgAUEMdkE/cUGAAXI6AAEMAwsgAiABQT9xQYABcjoAAiACIAFBDHZB4AFyOgAAIAIgAUEGdkE/cUGAAXI6AAEMAgsgAiABOgAADAELIAIgAUE/cUGAAXI6AAEgAiABQQZ2QcABcjoAAAsgACADIARqNgIIQQALmQIBA38gACgCCCIDIQICf0EBIAFBgAFJDQAaQQIgAUGAEEkNABpBA0EEIAFBgIAESRsLIgQgACgCACADa0sEfyAAIAMgBBBRIAAoAggFIAILIAAoAgRqIQICQAJAIAFBgAFPBEAgAUGAEEkNASABQYCABE8EQCACIAFBP3FBgAFyOgADIAIgAUESdkHwAXI6AAAgAiABQQZ2QT9xQYABcjoAAiACIAFBDHZBP3FBgAFyOgABDAMLIAIgAUE/cUGAAXI6AAIgAiABQQx2QeABcjoAACACIAFBBnZBP3FBgAFyOgABDAILIAIgAToAAAwBCyACIAFBP3FBgAFyOgABIAIgAUEGdkHAAXI6AAALIAAgAyAEajYCCEEAC/sCAQR/IwBBMGsiACQAAkACQEH01MAAKAIARQRAQYzVwAAoAgAhAUGM1cAAQQA2AgAgAUUNASAAQRhqIAERBQAgAEEQaiICIABBJGopAgA3AwAgACAAKQIcNwMIIAAoAhghAUH01MAAKAIAIgMNAgJAIANFDQBB+NTAACgCACICRQ0AQfzUwAAoAgAgAkECdEEEEK0BC0H41MAAIAE2AgBB9NTAAEEBNgIAQfzUwAAgACkDCDcCAEGE1cAAIABBEGopAwA3AgALIABBMGokAEH41MAADwsgAEEANgIoIABBATYCHCAAQcyVwAA2AhggAEIENwIgIABBGGpBtJbAABCBAQALIABBKGogAikDADcCACAAIAApAwg3AiAgACABNgIcIABBATYCGAJAIABBGGoiASgCAEUNACABKAIEIgJFDQAgASgCCCACQQJ0QQQQrQELIABBADYCKCAAQQE2AhwgAEHUlsAANgIYIABCBDcCICABQdyWwAAQgQEAC50CAQV/AkACQAJAAkAgAkEDakF8cSIEIAJGDQAgAyAEIAJrIgQgAyAESRsiBUUNAEEAIQQgAUH/AXEhBkEBIQcDQCACIARqLQAAIAZGDQQgBSAEQQFqIgRHDQALIAUgA0EIayIISw0CDAELIANBCGshCEEAIQULIAFB/wFxQYGChAhsIQQDQEGAgoQIIAIgBWoiBygCACAEcyIGayAGckGAgoQIIAdBBGooAgAgBHMiBmsgBnJxQYCBgoR4cUGAgYKEeEcNASAFQQhqIgUgCE0NAAsLIAMgBUcEQCABQf8BcSEEQQEhBwNAIAQgAiAFai0AAEYEQCAFIQQMAwsgAyAFQQFqIgVHDQALC0EAIQcLIAAgBDYCBCAAIAc2AgALhgIBA38jAEGAAWsiBCQAIAAoAgAhAAJ/AkAgASgCCCICQYCAgBBxRQRAIAJBgICAIHENASAAKAIAIAEQMgwCCyAAKAIAIQBBACECA0AgAiAEakH/AGogAEEPcSIDQTByIANB1wBqIANBCkkbOgAAIAJBAWshAiAAQQ9LIABBBHYhAA0ACyABQb++wABBAiACIARqQYABakEAIAJrECEMAQsgACgCACEAQQAhAgNAIAIgBGpB/wBqIABBD3EiA0EwciADQTdqIANBCkkbOgAAIAJBAWshAiAAQQ9LIABBBHYhAA0ACyABQb++wABBAiACIARqQYABakEAIAJrECELIARBgAFqJAAL/AECBH8BfiMAQSBrIgUkAAJAAkAgBEUNACABIAEgAmoiAksNACADIARqQQFrQQAgA2txrSACIAAoAgAiAUEBdCIGIAIgBksbIgJBCEEEQQEgBEGBCEkbIARBAUYbIgYgAiAGSxsiBq1+IglCIIhQRQ0AIAmnIghB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ACACQShqIANBEGopAgA3AwAgAiADKQIANwMYIAJBDGpB5JfAACACQRhqECcaIAJBCGogBCgCACIDNgIAIAIgAikCDCIFNwMAIAFBCGogAzYCACABIAU3AgALIABBoJ3AADYCBCAAIAE2AgAgAkEwaiQAC7IBAQZ/AkACQCAAQYQBSQ0AIADQbyYBEEAiASgCDCEFIAEoAhAhAiABQgA3AgwgASgCCCEDIAEoAgQhBCABQgQ3AgQgASgCACEGIAFBADYCACAAIAJJDQEgACACayIAIANPDQEgBCAAQQJ0aiAFNgIAIAEgAjYCECABIAA2AgwgASADNgIIIAEoAgQgASAENgIEIAEoAgAhACABIAY2AgAgAEUNACAAQQJ0QQQQrQELDwsAC9EDAgx/AX4jAEEgayIEJAAgBEEYaiIJEEAiBUEQaiIHKAIANgIAIARBEGoiCiAFQQhqIggpAgA3AwAgB0EANgIAIAhCADcCACAFKQIAIQwgBUKAgICAwAA3AgAgBCAMNwMIAn8jAEEgayIDJAACQAJAIARBCGoiACgCDCIBIAAoAggiAkYEQAJAIAAoAgAiAiABRgRA0G9BgAEgASABQYABTRsiBvwPASICQX9GDQQCQCAAKAIQIgtFBEAgACACNgIQDAELIAEgC2ogAkcNBQsgASAGaiICQf////8BSw0EIAMgAQR/IAMgAUECdDYCHCADIAAoAgQ2AhRBBAVBAAs2AhggA0EIakEEIAJBAnQgA0EUahBcIAMoAghBAUYNBCADKAIMIQYgACACNgIAIAAgBjYCBAwBCyABIAJPDQMLIAAgAUEBaiICNgIIIAAoAgQgAUECdGogAjYCAAwBCyABIAJPDQELIAAgACgCBCABQQJ0aigCADYCDCAAKAIQIANBIGokACABagwBCwALIAggCikDADcCACAHIAkoAgA2AgAgBSgCBCEDIAUoAgAhASAFIAQpAwg3AgAgAQRAIAMgAUECdEEEEK0BCyAEQSBqJAALuAEBA38gASgCDCECAkACQAJAAkACQAJAIAEoAgQOAgABAgsgAg0BQQEhA0EAIQFBASECDAMLIAJFDQELIAAgARAwDwsgASgCACICKAIEIgFBAEgNASACKAIAIQMgAUUEQEEBIQJBACEBDAELQZLWwAAtAAAaQQEhBCABQQEQogEiAkUNAQsgAQRA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AgQgJUECdGogDTgCACArICVBAWo2AggLIAogLEECdGohCiAnICxrIicNAAsLICpBEGokACAmKAIUIgpBhAFPBEAgChBWCyApIicgLUkNAAsLQYTWwAAoAgBBAWohJSAmKAIQIScLQYTWwAAgJTYCACAnEA0hCRBXIgggCSYBICYgCDYCJCAmKAIMIScgJigCECElIwBBIGsiKCQAICZBJGooAgAiCiUBEAohKSAoICU2AgQgKCApNgIAAkAgJSApRgRAEJsBIi0QkwEiKSUBICcgJRAIIQkQVyInIAkmASAtQYQBTwRAIC0QVgsgKUGEAU8EQCApEFYLIAolASAnJQFBABAJICdBhAFPBEAgJxBWCyAoQSBqJAAMAQsgKEEANgIIICggKEEEaiAoQQhqEH0ACyAmKAIIIgoEQCAmKAIMIApBAnRBBBCtAQsgJigCBCIKQYQBTwRAIAoQVgsgJkEwaiQAIAgMAgsQbwALICcgLkGMhsAAELABAAsiCCUBIAgQVguxAgEEfyMAQSBrIgQkACAEQQhqIQMjAEEgayICJAACQAJAAkACQAJAAkBBnNbAAC0AAA4CAAECC0Gc1sAAQQE6AAALIANBATYCAAwBC0Gd1sAALQAAIQFBndbAAEEBOgAAIAIgAToAByABQQFGDQEgA0EAOgAUIANBADYCAEGd1sAAQQA6AAALIAJBIGokAAwBCyACQgA3AhQgAkKBgICAwAA3AgwgAkG8m8AANgIIIAJBB2ogAkEIahB7AAtBktbAAC0AABpBKEEEEKIBIgFFBEBBBEEoEMYBAAsgAUG8h8AANgIAIAEgAykCADcCBCABIAApAgA3AhwgAUEMaiADQQhqKQIANwIAIAFBFGogA0EQaikCADcCACABQSRqIABBCGooAgA2AgAgBEEgaiQAIAEL+gECAn8BfiMAQRBrIgIkACACQQE7AQwgAiABNgIIIAIgADYCBCMAQRBrIgEkACACQQRqIgApAgAhBCABIAA2AgwgASAENwIEIwBBEGsiACQAIAFBBGoiASgCACICKAIMIQMCQAJAAkACQCACKAIEDgIAAQILIAMNAUEBIQJBACEDDAILIAMNACACKAIAIgIoAgQhAyACKAIAIQIMAQsgAEGAgICAeDYCACAAIAE2AgwgAEHcncAAIAEoAgQgASgCCCIALQAIIAAtAAkQ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OTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9zdGQvc3JjL3N5cy9zeW5jL29uY2Uvbm9fdGhyZWFkcy5ycwAcBBAAWwAAADUAAAASAAAAc3BhcmstaW50ZXJuYWwtcnMvc3JjL3JheWNhc3QucnOIBBAAIAAAACoAAAAXAAAAiAQQACAAAAB4AAAAFwAAAIgEEAAgAAAAfgAAABwAAACIBBAAIAAAAIAAAAAcAAAAiAQQACAAAACFAAAAIAAAAC9ydXN0Yy82YjAwYmMzODgwMTk4NjAwMTMwZTFjZjYyYjhmOGE5MzQ5NDQ4OGNjL2xpYnJhcnkvYWxsb2Mvc3JjL3ZlYy9tb2QucnP4BBAATAAAAFYKAAAkAAAAAAAAABAAAAAEAAAAGQAAABoAAAAbAAAAICAgIDogAAABAAAAAAAAAHAFEAACAAAAAgBBjovAAAsBBQBBmIvAAAshIAAAqCAgICAgICAAHgAAAAwAAAAEAAAAHwAAACAAAAAhAEHEi8AAC7kOAQAAACIAAABhIERpc3BsYXkgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3IgdW5leHBlY3RlZGx5L3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzAAADBhAASwAAAPAKAAAOAAAARXJyb3Jhc3NlcnRpb24gZmFpbGVkOiBzZWxmLmlzX2NoYXJfYm91bmRhcnkobmV3X2xlbikAAAADBhAASwAAALUFAAANAAAAAAAAABAAAAAEAAAAGQAAABoAAAAbAAAAYmFja3RyYWNlIGNhcHR1cmUgZmFpbGVkL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYW55aG93LTEuMC45OC9zcmMvZXJyb3IucnPYBhAAXAAAAGcEAAAOAAAAAQAAAAAAAAA6IAAATAcQAAIAAAAKCkNhdXNlZCBieToKAAAAZAcQAAEAAAAKCnN0YWNrIGJhY2t0cmFjZTpTdGFjayBiYWNrdHJhY2U6CgCCBxAAEQAAAFMvcnVzdGMvNmIwMGJjMzg4MDE5ODYwMDEzMGUxY2Y2MmI4ZjhhOTM0OTQ0ODhjYy9saWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjL21vZC5ycwAAAJ0HEABQAAAALgIAABEAAAAvcnVzdGMvNmIwMGJjMzg4MDE5ODYwMDEzMGUxY2Y2MmI4ZjhhOTM0OTQ0ODhjYy9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL2luZGV4LnJzAAAIEABPAAAATAMAADQAAAAACBAATwAAAFMDAAAyAAAAYXNzZXJ0aW9uIGZhaWxlZDogc2VsZi5pc19jaGFyX2JvdW5kYXJ5KG4pL3J1c3RjLzZiMDBiYzM4ODAxOTg2MDAxMzBlMWNmNjJiOGY4YTkzNDk0NDg4Y2MvbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzAAAAmggQAEsAAAAMCAAAHQAAAJoIEABLAAAAFAgAAB0AAAAjAAAADAAAAAQAAAAkAAAAJQAAACEAAAAvcnVzdGMvNmIwMGJjMzg4MDE5ODYwMDEzMGUxY2Y2MmI4ZjhhOTM0OTQ0ODhjYy9saWJyYXJ5L2NvcmUvc3JjL2l0ZXIvdHJhaXRzL2l0ZXJhdG9yLnJzIAkQAFgAAADRBwAACQAAAC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2pzLXN5cy0wLjMuNzcvc3JjL2xpYi5ycwAAiAkQAFoAAAD7GAAAAQAAAC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi0wLjIuMTAwL3NyYy9jb252ZXJ0L3NsaWNlcy5yc/QJEABsAAAAJAEAAA4AAABjbG9zdXJlIGludm9rZWQgcmVjdXJzaXZlbHkgb3IgYWZ0ZXIgYmVpbmcgZHJvcHBlZExhenkgaW5zdGFuY2UgaGFzIHByZXZpb3VzbHkgYmVlbiBwb2lzb25lZKIKEAAqAAAAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvb25jZV9jZWxsLTEuMjEuMy9zcmMvbGliLnJzAAAA1AoQAF0AAAAIAwAAGQAAAHJlZW50cmFudCBpbml0AABECxAADgAAANQKEABdAAAAegIAAA0AAAA6IAAAAAAAAAQAAAAEAAAANwAAAC9ydXN0Yy82YjAwYmMzODgwMTk4NjAwMTMwZTFjZjYyYjhmOGE5MzQ5NDQ4OGNjL2xpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMvbW9kLnJzgAsQAFAAAAAuAgAAEQAAADoAAAA4AAAADAAAAAQAAAA5AAAAOgAAADsAAAAvcnVzdC9kZXBzL2RsbWFsbG9jLTAuMi44L3NyYy9kbG1hbGxvYy5yc2Fzc2VydGlvbiBmYWlsZWQ6IHBzaXplID49IHNpemUgKyBtaW5fb3ZlcmhlYWQA/AsQACkAAACsBAAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplIDw9IHNpemUgKyBtYXhfb3ZlcmhlYWQAAPwLEAApAAAAsgQAAA0AAABsaWJyYXJ5L3N0ZC9zcmMvc3luYy9sYXp5X2xvY2sucnMAAACkDBAAIQAAANEAAAATAAAAbGlicmFyeS9zdGQvc3JjL2JhY2t0cmFjZS5ycwIAAAAAAAAAAgBBiJrAAAvFBCAAgOBvcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtDA0QACgAAAAkAAAAAgAAADQNEAB1bnN1cHBvcnRlZCBiYWNrdHJhY2VkaXNhYmxlZCBiYWNrdHJhY2UA2AwQABwAAACKAQAAHQAAADwAAAAQAAAABAAAAD0AAAA+AAAAAQAAAAAAAABjYW5ub3QgcmVjdXJzaXZlbHkgYWNxdWlyZSBtdXRleJwNEAAgAAAAbGlicmFyeS9zdGQvc3JjL3N5cy9zeW5jL211dGV4L25vX3RocmVhZHMucnPEDRAALAAAABMAAAAJAAAAbGlicmFyeS9zdGQvc3JjL3N5bmMvcG9pc29uL29uY2UucnMAAA4QACMAAACbAAAAMgAAADx1bmtub3duPu+/vW1lbW9yeSBhbGxvY2F0aW9uIG9mICBieXRlcyBmYWlsZWQAAEAOEAAVAAAAVQ4QAA0AAABsaWJyYXJ5L3N0ZC9zcmMvYWxsb2MucnN0DhAAGAAAAGQBAAAJAAAACgAAADgAAAAMAAAABAAAAD8AAAAAAAAACAAAAAQAAABAAAAA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bnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB3aGVuIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBkaWQgbm90bGlicmFyeS9hbGxvYy9zcmMvZm10LnJzAACSGRAAGAAAAIoCAAAOAAAAAHAABwAtAQEBAgECAQFICzAVEAFlBwIGAgIBBCMBHhtbCzoJCQEYBAEJAQMBBSsDOwkqGAEgNwEBAQQIBAEDBwoCHQE6AQEBAgQIAQkBCgIaAQICOQEEAgQCAgMDAR4CAwELAjkBBAUBAgQBFAIWBgEBOgEBAgEECAEHAwoCHgE7AQEBDAEJASgBAwE3AQEDBQMBBAcCCwIdAToBAgIBAQMDAQQHAgsCHAI5AgEBAgQIAQkBCgIdAUgBBAECAwEBCAFRAQIHDAhiAQIJCwdJAhsBAQEBATcOAQUBAgULASQJAWYEAQYBAgICGQIEAxAEDQECAgYBDwEAAwAEHAMdAh4CQAIBBwgBAgsJAS0DAQF1AiIBdgMEAgkBBgPbAgIBOgEBBwEBAQECCAYKAgEwHzEEMAoEAyYJDAIgBAIGOAEBAgMBAQU4CAICmAMBDQEHBAEGAQMCxkAAAcMhAAONAWAgAAZpAgAEAQogAlACAAEDAQQBGQIFAZcCGhINASYIGQsBASwDMAECBAICAgEkAUMGAgICAgwBCAEvATMBAQMCAgUCAQEqAggB7gECAQQBAAEAEBAQAAIAAeIBlQUAAwECBQQoAwQBpQIABEEFAAJPBEYLMQR7ATYPKQECAgoDMQQCAgcBPQMkBQEIPgEMAjQJAQEIBAIBXwMCBAYBAgGdAQMIFQI5AgEBAQEMAQkBDgcDBUMBAgYBAQIBAQMEAwEBDgJVCAIDAQEXAVEBAgYBAQIBAQIBAusBAgQGAgECGwJVCAIBAQJqAQEBAghlAQEBAgQBBQAJAQL1AQoEBAGQBAICBAEgCigGAgQIAQkGAgMuDQECAAcBBgEBUhYCBwECAQJ6BgMBAQIBBwEBSAIDAQEBAAILAjQFBQMXAQABBg8ADAMDAAU7BwABPwRRAQsCAAIALgIXAAUDBggIAgceBJQDADcEMggBDgEWBQEPAAcBEQIHAQIBBWQBoAcAAT0EAAT+AgAHbQcAYIDwAAICAgICAgICAgMDAQEBAEHLucAACxABAAAAAAAAAAICAAAAAAACAEGKusAACwECAEGwusAACwEBAEHLusAACwEBAEGru8AAC7AHLi4wMTIzNDU2Nzg5YWJjZGVmAAAAAQAAAAAAAABCb3Jyb3dNdXRFcnJvcmFscmVhZHkgYm9ycm93ZWQ6INYdEAASAAAAW2NhbGxlZCBgT3B0aW9uOjp1bndyYXAoKWAgb24gYSBgTm9uZWAgdmFsdWVpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhlIGluZGV4IGlzIAAAHB4QACAAAAA8HhAAEgAAAAAAAAAEAAAABAAAAGEAAAA9PSE9bWF0Y2hlc2Fzc2VydGlvbiBgbGVmdCAgcmlnaHRgIGZhaWxlZAogIGxlZnQ6IAogcmlnaHQ6IAB7HhAAEAAAAIseEAAXAAAAoh4QAAkAAAAgcmlnaHRgIGZhaWxlZDogCiAgbGVmdDogAAAAex4QABAAAADEHhAAEAAAANQeEAAJAAAAoh4QAAkAAAA6IAAAAQAAAAAAAAAAHxAAAgAAAAAAAAAMAAAABAAAAGIAAABjAAAAZAAAACAgICAgeyAsICB7CiwKfSB9Cl0weDAwMDEwMjAzMDQwNTA2MDcwODA5MTAxMTEyMTMxNDE1MTYxNzE4MTkyMDIxMjIyMzI0MjUyNjI3MjgyOTMwMzEzMjMzMzQzNTM2MzczODM5NDA0MTQyNDM0NDQ1NDY0NzQ4NDk1MDUxNTI1MzU0NTU1NjU3NTg1OTYwNjE2MjYzNjQ2NTY2Njc2ODY5NzA3MTcyNzM3NDc1NzY3Nzc4Nzk4MDgxODI4Mzg0ODU4Njg3ODg4OTkwOTE5MjkzOTQ5NTk2OTc5ODk5bGlicmFyeS9jb3JlL3NyYy9mbXQvbW9kLnJzZmFsc2V0cnVlAAAACSAQABsAAACZCgAAJgAAAAkgEAAbAAAAogoAABoAAABhdHRlbXB0ZWQgdG8gaW5kZXggc2xpY2UgZnJvbSBhZnRlciBtYXhpbXVtIHVzaXplAAAAUCAQADEAAABhdHRlbXB0ZWQgdG8gaW5kZXggc2xpY2UgdXAgdG8gbWF4aW11bSB1c2l6ZYwgEAAsAAAAbGlicmFyeS9jb3JlL3NyYy9zdHIvbW9kLnJzAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB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",self.location.href));const A=IB();(typeof B=="string"||typeof Request=="function"&&B instanceof Request||typeof URL=="function"&&B instanceof URL)&&(B=fetch(B));const{instance:I,module:g}=await AB(await B,A);return gB(I,g)}var Qg={},BB=function(B,A,I,g,Q){var C=new Worker(Qg[A]||(Qg[A]=URL.createObjectURL(new Blob([B+\';addEventListener("error",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})\'],{type:"text/javascript"}))));return C.onmessage=function(E){var t=E.data,i=t.$e$;if(i){var s=new Error(i[0]);s.code=i[1],s.stack=i[2],Q(s,null)}else Q(null,t)},C.postMessage(I,g),C},V=Uint8Array,dA=Uint16Array,Cg=Int32Array,fI=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]),kI=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]),Eg=new V([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),tg=function(B,A){for(var I=new dA(31),g=0;g<31;++g)I[g]=A+=1<<B[g-1];for(var Q=new Cg(I[30]),g=1;g<30;++g)for(var C=I[g];C<I[g+1];++C)Q[C]=C-I[g]<<5|g;return{b:I,r:Q}},ig=tg(fI,2),RI=ig.b,QB=ig.r;RI[28]=258,QB[258]=28;for(var CB=tg(kI,0),sg=CB.b,EI=new dA(32768),_=0;_<32768;++_){var kA=(_&43690)>>1|(_&21845)<<1;kA=(kA&52428)>>2|(kA&13107)<<2,kA=(kA&61680)>>4|(kA&3855)<<4,EI[_]=((kA&65280)>>8|(kA&255)<<8)>>1}for(var qA=function(B,A,I){for(var g=B.length,Q=0,C=new dA(A);Q<g;++Q)B[Q]&&++C[B[Q]-1];var E=new dA(A);for(Q=1;Q<A;++Q)E[Q]=E[Q-1]+C[Q-1]<<1;var t;if(I){t=new dA(1<<A);var i=15-A;for(Q=0;Q<g;++Q)if(B[Q])for(var s=Q<<4|B[Q],e=A-B[Q],n=E[B[Q]-1]++<<e,a=n|(1<<e)-1;n<=a;++n)t[EI[n]>>i]=s}else for(t=new dA(g),Q=0;Q<g;++Q)B[Q]&&(t[Q]=EI[E[B[Q]-1]++]>>15-B[Q]);return t},OA=new V(288),_=0;_<144;++_)OA[_]=8;for(var _=144;_<256;++_)OA[_]=9;for(var _=256;_<280;++_)OA[_]=7;for(var _=280;_<288;++_)OA[_]=8;for(var eg=new V(32),_=0;_<32;++_)eg[_]=5;var ng=qA(OA,9,1),og=qA(eg,5,1),tI=function(B){for(var A=B[0],I=1;I<B.length;++I)B[I]>A&&(A=B[I]);return A},oA=function(B,A,I){var g=A/8|0;return(B[g]|B[g+1]<<8)>>(A&7)&I},iI=function(B,A){var I=A/8|0;return(B[I]|B[I+1]<<8|B[I+2]<<16)>>(A&7)},UI=function(B){return(B+7)/8|0},RA=function(B,A,I){return(A==null||A<0)&&(A=0),(I==null||I>B.length)&&(I=B.length),new V(B.subarray(A,I))},ag=["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"],P=function(B,A,I){var g=new Error(A||ag[B]);if(g.code=B,Error.captureStackTrace&&Error.captureStackTrace(g,P),!I)throw g;return g},mI=function(B,A,I,g){var Q=B.length,C=g?g.length:0;if(!Q||A.f&&!A.l)return I||new V(0);var E=!I,t=E||A.i!=2,i=A.i;E&&(I=new V(Q*3));var s=function(EA){var sA=I.length;if(EA>sA){var eA=new V(Math.max(sA*2,EA));eA.set(I),I=eA}},e=A.f||0,n=A.p||0,a=A.b||0,o=A.l,r=A.d,D=A.m,c=A.n,h=Q*8;do{if(!o){e=oA(B,n,1);var w=oA(B,n+1,3);if(n+=3,w)if(w==1)o=ng,r=og,D=9,c=5;else if(w==2){var k=oA(B,n,31)+257,p=oA(B,n+10,15)+4,F=k+oA(B,n+5,31)+1;n+=14;for(var N=new V(F),x=new V(19),S=0;S<p;++S)x[Eg[S]]=oA(B,n+S*3,7);n+=p*3;for(var M=tI(x),u=(1<<M)-1,K=qA(x,M,1),S=0;S<F;){var J=K[oA(B,n,u)];n+=J&15;var y=J>>4;if(y<16)N[S++]=y;else{var U=0,z=0;for(y==16?(z=3+oA(B,n,3),n+=2,U=N[S-1]):y==17?(z=3+oA(B,n,7),n+=3):y==18&&(z=11+oA(B,n,127),n+=7);z--;)N[S++]=U}}var v=N.subarray(0,k),T=N.subarray(k);D=tI(v),c=tI(T),o=qA(v,D,1),r=qA(T,c,1)}else P(1);else{var y=UI(n)+4,l=B[y-4]|B[y-3]<<8,G=y+l;if(G>Q){i&&P(0);break}t&&s(a+l),I.set(B.subarray(y,G),a),A.b=a+=l,A.p=n=G*8,A.f=e;continue}if(n>h){i&&P(0);break}}t&&s(a+131072);for(var j=(1<<D)-1,X=(1<<c)-1,W=n;;W=n){var U=o[iI(B,n)&j],b=U>>4;if(n+=U&15,n>h){i&&P(0);break}if(U||P(2),b<256)I[a++]=b;else if(b==256){W=n,o=null;break}else{var Z=b-254;if(b>264){var S=b-257,d=fI[S];Z=oA(B,n,(1<<d)-1)+RI[S],n+=d}var L=r[iI(B,n)&X],f=L>>4;L||P(3),n+=L&15;var T=sg[f];if(f>3){var d=kI[f];T+=iI(B,n)&(1<<d)-1,n+=d}if(n>h){i&&P(0);break}t&&s(a+131072);var BA=a+Z;if(a<T){var QA=C-T,iA=Math.min(T,BA);for(QA+a<0&&P(3);a<iA;++a)I[a]=g[QA+a]}for(;a<BA;++a)I[a]=I[a-T]}}A.l=o,A.p=W,A.b=a,A.f=e,o&&(e=1,A.m=D,A.d=r,A.n=c)}while(!e);return a!=I.length&&E?RA(I,0,a):I.subarray(0,a)},EB=new V(0),tB=function(B,A){var I={};for(var g in B)I[g]=B[g];for(var g in A)I[g]=A[g];return I},rg=function(B,A,I){for(var g=B(),Q=B.toString(),C=Q.slice(Q.indexOf("[")+1,Q.lastIndexOf("]")).replace(/\\s+/g,"").split(","),E=0;E<g.length;++E){var t=g[E],i=C[E];if(typeof t=="function"){A+=";"+i+"=";var s=t.toString();if(t.prototype)if(s.indexOf("[native code]")!=-1){var e=s.indexOf(" ",8)+1;A+=s.slice(e,s.indexOf("(",e))}else{A+=s;for(var n in t.prototype)A+=";"+i+".prototype."+n+"="+t.prototype[n].toString()}else A+=s}else I[i]=t}return A},sI=[],iB=function(B){var A=[];for(var I in B)B[I].buffer&&A.push((B[I]=new B[I].constructor(B[I])).buffer);return A},sB=function(B,A,I,g){if(!sI[I]){for(var Q="",C={},E=B.length-1,t=0;t<E;++t)Q=rg(B[t],Q,C);sI[I]={c:rg(B[E],Q,C),e:C}}var i=tB({},sI[I].e);return BB(sI[I].c+";onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage="+A.toString()+"}",I,i,iB(i),g)},eB=function(){return[V,dA,Cg,fI,kI,Eg,RI,sg,ng,og,EI,ag,qA,tI,oA,iI,UI,RA,P,mI,eI,hg,cg]},hg=function(B){return postMessage(B,[B.buffer])},cg=function(B){return B&&{out:B.size&&new V(B.size),dictionary:B.dictionary}},nB=function(B,A,I,g,Q,C){var E=sB(I,g,Q,function(t,i){E.terminate(),C(t,i)});return E.postMessage([B,A],A.consume?[B.buffer]:[]),function(){E.terminate()}},DA=function(B,A){return B[A]|B[A+1]<<8},IA=function(B,A){return(B[A]|B[A+1]<<8|B[A+2]<<16|B[A+3]<<24)>>>0},xI=function(B,A){return IA(B,A)+IA(B,A+4)*4294967296},oB=function(B){(B[0]!=31||B[1]!=139||B[2]!=8)&&P(6,"invalid gzip data");var A=B[3],I=10;A&4&&(I+=(B[10]|B[11]<<8)+2);for(var g=(A>>3&1)+(A>>4&1);g>0;g-=!B[I++]);return I+(A&2)},YI=function(){function B(A,I){typeof A=="function"&&(I=A,A={}),this.ondata=I;var g=A&&A.dictionary&&A.dictionary.subarray(-32768);this.s={i:0,b:g?g.length:0},this.o=new V(32768),this.p=new V(0),g&&this.o.set(g)}return B.prototype.e=function(A){if(this.ondata||P(5),this.d&&P(4),!this.p.length)this.p=A;else if(A.length){var I=new V(this.p.length+A.length);I.set(this.p),I.set(A,this.p.length),this.p=I}},B.prototype.c=function(A){this.s.i=+(this.d=A||!1);var I=this.s.b,g=mI(this.p,this.s,this.o);this.ondata(RA(g,I,this.s.b),this.d),this.o=RA(g,this.s.b-32768),this.s.b=this.o.length,this.p=RA(this.p,this.s.p/8|0),this.s.p&=7},B.prototype.push=function(A,I){this.e(A),this.c(I)},B}();function aB(B,A,I){return I||(I=A,A={}),typeof I!="function"&&P(7),nB(B,A,[eB],function(g){return hg(eI(g.data[0],cg(g.data[1])))},1,I)}function eI(B,A){return mI(B,{i:2},A&&A.out,A&&A.dictionary)}var Dg=function(){function B(A,I){this.v=1,this.r=0,YI.call(this,A,I)}return B.prototype.push=function(A,I){if(YI.prototype.e.call(this,A),this.r+=A.length,this.v){var g=this.p.subarray(this.v-1),Q=g.length>3?oB(g):4;if(Q>g.length){if(!I)return}else this.v>1&&this.onmember&&this.onmember(this.r-g.length);this.p=g.subarray(Q),this.v=0}YI.prototype.c.call(this,I),this.s.f&&!this.s.l&&!I&&(this.v=UI(this.s.p)+9,this.s={i:0},this.o=new V(0),this.push(new V(0),I))},B}(),JI=typeof TextDecoder<"u"&&new TextDecoder;try{JI.decode(EB,{stream:!0})}catch{}var rB=function(B){for(var A="",I=0;;){var g=B[I++],Q=(g>127)+(g>223)+(g>239);if(I+Q>B.length)return{s:A,r:RA(B,I-1)};Q?Q==3?(g=((g&15)<<18|(B[I++]&63)<<12|(B[I++]&63)<<6|B[I++]&63)-65536,A+=String.fromCharCode(55296|g>>10,56320|g&1023)):Q&1?A+=String.fromCharCode((g&31)<<6|B[I++]&63):A+=String.fromCharCode((g&15)<<12|(B[I++]&63)<<6|B[I++]&63):A+=String.fromCharCode(g)}};function hB(B,A){if(A){for(var I="",g=0;g<B.length;g+=16384)I+=String.fromCharCode.apply(null,B.subarray(g,g+16384));return I}else{if(JI)return JI.decode(B);var Q=rB(B),C=Q.s,I=Q.r;return I.length&&P(8),C}}var wg=function(B,A){return A+30+DA(B,A+26)+DA(B,A+28)},yg=function(B,A,I){var g=DA(B,A+28),Q=hB(B.subarray(A+46,A+46+g),!(DA(B,A+8)&2048)),C=A+46+g,E=IA(B,A+20),t=I&&E==4294967295?cB(B,C):[E,IA(B,A+24),IA(B,A+42)],i=t[0],s=t[1],e=t[2];return[DA(B,A+10),i,s,Q,C+DA(B,A+30)+DA(B,A+32),e]},cB=function(B,A){for(;DA(B,A)!=1;A+=4+DA(B,A+2));return[xI(B,A+12),xI(B,A+4),xI(B,A+20)]},lg=typeof queueMicrotask=="function"?queueMicrotask:typeof setTimeout=="function"?setTimeout:function(B){B()};function DB(B,A,I){I||(I=A,A={}),typeof I!="function"&&P(7);var g=[],Q=function(){for(var c=0;c<g.length;++c)g[c]()},C={},E=function(c,h){lg(function(){I(c,h)})};lg(function(){E=I});for(var t=B.length-22;IA(B,t)!=101010256;--t)if(!t||B.length-t>65558)return E(P(13,0,1),null),Q;var i=DA(B,t+8);if(i){var s=i,e=IA(B,t+16),n=e==4294967295||s==65535;if(n){var a=IA(B,t-12);n=IA(B,a)==101075792,n&&(s=i=IA(B,a+32),e=IA(B,a+48))}for(var o=A&&A.filter,r=function(c){var h=yg(B,e,n),w=h[0],y=h[1],l=h[2],G=h[3],k=h[4],p=h[5],F=wg(B,p);e=k;var N=function(S,M){S?(Q(),E(S,null)):(M&&(C[G]=M),--i||E(null,C))};if(!o||o({name:G,size:y,originalSize:l,compression:w}))if(!w)N(null,RA(B,F,F+y));else if(w==8){var x=B.subarray(F,F+y);if(l<524288||y>.8*l)try{N(null,eI(x,{out:new V(l)}))}catch(S){N(S,null)}else g.push(aB(x,{size:l},N))}else N(P(14,"unknown compression type "+w,1),null);else N(null,null)},D=0;D<s;++D)r(D)}else E(null,{});return Q}function wB(B,A){for(var I={},g=B.length-22;IA(B,g)!=101010256;--g)(!g||B.length-g>65558)&&P(13);var Q=DA(B,g+8);if(!Q)return{};var C=IA(B,g+16),E=C==4294967295||Q==65535;if(E){var t=IA(B,g-12);E=IA(B,t)==101075792,E&&(Q=IA(B,t+32),C=IA(B,t+48))}for(var i=A&&A.filter,s=0;s<Q;++s){var e=yg(B,C,E),n=e[0],a=e[1],o=e[2],r=e[3],D=e[4],c=e[5],h=wg(B,c);C=D,(!i||i({name:r,size:a,originalSize:o,compression:n}))&&(n?n==8?I[r]=eI(B.subarray(h,h+a),{out:new V(o)}):P(14,"unknown compression type "+n):I[r]=RA(B,h,h+a))}return I}/**\n * @license\n * Copyright 2010-2024 Three.js Authors\n * SPDX-License-Identifier: MIT\n */const Mg="172",yB="",wA="srgb",Ng="srgb-linear",Fg="linear",LI="srgb";function tA(B,A,I){return Math.max(A,Math.min(I,B))}function lB(B,A){return(B%A+A)%A}function pI(B,A,I){return(1-I)*B+I*A}class $A{constructor(A,I,g,Q,C,E,t,i,s){$A.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],A!==void 0&&this.set(A,I,g,Q,C,E,t,i,s)}set(A,I,g,Q,C,E,t,i,s){const e=this.elements;return e[0]=A,e[1]=Q,e[2]=t,e[3]=I,e[4]=C,e[5]=i,e[6]=g,e[7]=E,e[8]=s,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(A){const I=this.elements,g=A.elements;return I[0]=g[0],I[1]=g[1],I[2]=g[2],I[3]=g[3],I[4]=g[4],I[5]=g[5],I[6]=g[6],I[7]=g[7],I[8]=g[8],this}extractBasis(A,I,g){return A.setFromMatrix3Column(this,0),I.setFromMatrix3Column(this,1),g.setFromMatrix3Column(this,2),this}setFromMatrix4(A){const I=A.elements;return this.set(I[0],I[4],I[8],I[1],I[5],I[9],I[2],I[6],I[10]),this}multiply(A){return this.multiplyMatrices(this,A)}premultiply(A){return this.multiplyMatrices(A,this)}multiplyMatrices(A,I){const g=A.elements,Q=I.elements,C=this.elements,E=g[0],t=g[3],i=g[6],s=g[1],e=g[4],n=g[7],a=g[2],o=g[5],r=g[8],D=Q[0],c=Q[3],h=Q[6],w=Q[1],y=Q[4],l=Q[7],G=Q[2],k=Q[5],p=Q[8];return C[0]=E*D+t*w+i*G,C[3]=E*c+t*y+i*k,C[6]=E*h+t*l+i*p,C[1]=s*D+e*w+n*G,C[4]=s*c+e*y+n*k,C[7]=s*h+e*l+n*p,C[2]=a*D+o*w+r*G,C[5]=a*c+o*y+r*k,C[8]=a*h+o*l+r*p,this}multiplyScalar(A){const I=this.elements;return I[0]*=A,I[3]*=A,I[6]*=A,I[1]*=A,I[4]*=A,I[7]*=A,I[2]*=A,I[5]*=A,I[8]*=A,this}determinant(){const A=this.elements,I=A[0],g=A[1],Q=A[2],C=A[3],E=A[4],t=A[5],i=A[6],s=A[7],e=A[8];return I*E*e-I*t*s-g*C*e+g*t*i+Q*C*s-Q*E*i}invert(){const A=this.elements,I=A[0],g=A[1],Q=A[2],C=A[3],E=A[4],t=A[5],i=A[6],s=A[7],e=A[8],n=e*E-t*s,a=t*i-e*C,o=s*C-E*i,r=I*n+g*a+Q*o;if(r===0)return this.set(0,0,0,0,0,0,0,0,0);const D=1/r;return A[0]=n*D,A[1]=(Q*s-e*g)*D,A[2]=(t*g-Q*E)*D,A[3]=a*D,A[4]=(e*I-Q*i)*D,A[5]=(Q*C-t*I)*D,A[6]=o*D,A[7]=(g*i-s*I)*D,A[8]=(E*I-g*C)*D,this}transpose(){let A;const I=this.elements;return A=I[1],I[1]=I[3],I[3]=A,A=I[2],I[2]=I[6],I[6]=A,A=I[5],I[5]=I[7],I[7]=A,this}getNormalMatrix(A){return this.setFromMatrix4(A).invert().transpose()}transposeIntoArray(A){const I=this.elements;return A[0]=I[0],A[1]=I[3],A[2]=I[6],A[3]=I[1],A[4]=I[4],A[5]=I[7],A[6]=I[2],A[7]=I[5],A[8]=I[8],this}setUvTransform(A,I,g,Q,C,E,t){const i=Math.cos(C),s=Math.sin(C);return this.set(g*i,g*s,-g*(i*E+s*t)+E+A,-Q*s,Q*i,-Q*(-s*E+i*t)+t+I,0,0,1),this}scale(A,I){return this.premultiply(dI.makeScale(A,I)),this}rotate(A){return this.premultiply(dI.makeRotation(-A)),this}translate(A,I){return this.premultiply(dI.makeTranslation(A,I)),this}makeTranslation(A,I){return A.isVector2?this.set(1,0,A.x,0,1,A.y,0,0,1):this.set(1,0,A,0,1,I,0,0,1),this}makeRotation(A){const I=Math.cos(A),g=Math.sin(A);return this.set(I,-g,0,g,I,0,0,0,1),this}makeScale(A,I){return this.set(A,0,0,0,I,0,0,0,1),this}equals(A){const I=this.elements,g=A.elements;for(let Q=0;Q<9;Q++)if(I[Q]!==g[Q])return!1;return!0}fromArray(A,I=0){for(let g=0;g<9;g++)this.elements[g]=A[g+I];return this}toArray(A=[],I=0){const g=this.elements;return A[I]=g[0],A[I+1]=g[1],A[I+2]=g[2],A[I+3]=g[3],A[I+4]=g[4],A[I+5]=g[5],A[I+6]=g[6],A[I+7]=g[7],A[I+8]=g[8],A}clone(){return new this.constructor().fromArray(this.elements)}}const dI=new $A,Gg=new $A().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),Sg=new $A().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function MB(){const B={enabled:!0,workingColorSpace:Ng,spaces:{},convert:function(Q,C,E){return this.enabled===!1||C===E||!C||!E||(this.spaces[C].transfer===LI&&(Q.r=zA(Q.r),Q.g=zA(Q.g),Q.b=zA(Q.b)),this.spaces[C].primaries!==this.spaces[E].primaries&&(Q.applyMatrix3(this.spaces[C].toXYZ),Q.applyMatrix3(this.spaces[E].fromXYZ)),this.spaces[E].transfer===LI&&(Q.r=TA(Q.r),Q.g=TA(Q.g),Q.b=TA(Q.b))),Q},fromWorkingColorSpace:function(Q,C){return this.convert(Q,this.workingColorSpace,C)},toWorkingColorSpace:function(Q,C){return this.convert(Q,C,this.workingColorSpace)},getPrimaries:function(Q){return this.spaces[Q].primaries},getTransfer:function(Q){return Q===yB?Fg:this.spaces[Q].transfer},getLuminanceCoefficients:function(Q,C=this.workingColorSpace){return Q.fromArray(this.spaces[C].luminanceCoefficients)},define:function(Q){Object.assign(this.spaces,Q)},_getMatrix:function(Q,C,E){return Q.copy(this.spaces[C].toXYZ).multiply(this.spaces[E].fromXYZ)},_getDrawingBufferColorSpace:function(Q){return this.spaces[Q].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(Q=this.workingColorSpace){return this.spaces[Q].workingColorSpaceConfig.unpackColorSpace}},A=[.64,.33,.3,.6,.15,.06],I=[.2126,.7152,.0722],g=[.3127,.329];return B.define({[Ng]:{primaries:A,whitePoint:g,transfer:Fg,toXYZ:Gg,fromXYZ:Sg,luminanceCoefficients:I,workingColorSpaceConfig:{unpackColorSpace:wA},outputColorSpaceConfig:{drawingBufferColorSpace:wA}},[wA]:{primaries:A,whitePoint:g,transfer:LI,toXYZ:Gg,fromXYZ:Sg,luminanceCoefficients:I,outputColorSpaceConfig:{drawingBufferColorSpace:wA}}}),B}const yA=MB();function zA(B){return B<.04045?B*.0773993808:Math.pow(B*.9478672986+.0521327014,2.4)}function TA(B){return B<.0031308?B*12.92:1.055*Math.pow(B,.41666)-.055}class UA{constructor(A=0,I=0,g=0,Q=1){this.isQuaternion=!0,this._x=A,this._y=I,this._z=g,this._w=Q}static slerpFlat(A,I,g,Q,C,E,t){let i=g[Q+0],s=g[Q+1],e=g[Q+2],n=g[Q+3];const a=C[E+0],o=C[E+1],r=C[E+2],D=C[E+3];if(t===0){A[I+0]=i,A[I+1]=s,A[I+2]=e,A[I+3]=n;return}if(t===1){A[I+0]=a,A[I+1]=o,A[I+2]=r,A[I+3]=D;return}if(n!==D||i!==a||s!==o||e!==r){let c=1-t;const h=i*a+s*o+e*r+n*D,w=h>=0?1:-1,y=1-h*h;if(y>Number.EPSILON){const G=Math.sqrt(y),k=Math.atan2(G,h*w);c=Math.sin(c*k)/G,t=Math.sin(t*k)/G}const l=t*w;if(i=i*c+a*l,s=s*c+o*l,e=e*c+r*l,n=n*c+D*l,c===1-t){const G=1/Math.sqrt(i*i+s*s+e*e+n*n);i*=G,s*=G,e*=G,n*=G}}A[I]=i,A[I+1]=s,A[I+2]=e,A[I+3]=n}static multiplyQuaternionsFlat(A,I,g,Q,C,E){const t=g[Q],i=g[Q+1],s=g[Q+2],e=g[Q+3],n=C[E],a=C[E+1],o=C[E+2],r=C[E+3];return A[I]=t*r+e*n+i*o-s*a,A[I+1]=i*r+e*a+s*n-t*o,A[I+2]=s*r+e*o+t*a-i*n,A[I+3]=e*r-t*n-i*a-s*o,A}get x(){return this._x}set x(A){this._x=A,this._onChangeCallback()}get y(){return this._y}set y(A){this._y=A,this._onChangeCallback()}get z(){return this._z}set z(A){this._z=A,this._onChangeCallback()}get w(){return this._w}set w(A){this._w=A,this._onChangeCallback()}set(A,I,g,Q){return this._x=A,this._y=I,this._z=g,this._w=Q,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(A){return this._x=A.x,this._y=A.y,this._z=A.z,this._w=A.w,this._onChangeCallback(),this}setFromEuler(A,I=!0){const g=A._x,Q=A._y,C=A._z,E=A._order,t=Math.cos,i=Math.sin,s=t(g/2),e=t(Q/2),n=t(C/2),a=i(g/2),o=i(Q/2),r=i(C/2);switch(E){case"XYZ":this._x=a*e*n+s*o*r,this._y=s*o*n-a*e*r,this._z=s*e*r+a*o*n,this._w=s*e*n-a*o*r;break;case"YXZ":this._x=a*e*n+s*o*r,this._y=s*o*n-a*e*r,this._z=s*e*r-a*o*n,this._w=s*e*n+a*o*r;break;case"ZXY":this._x=a*e*n-s*o*r,this._y=s*o*n+a*e*r,this._z=s*e*r+a*o*n,this._w=s*e*n-a*o*r;break;case"ZYX":this._x=a*e*n-s*o*r,this._y=s*o*n+a*e*r,this._z=s*e*r-a*o*n,this._w=s*e*n+a*o*r;break;case"YZX":this._x=a*e*n+s*o*r,this._y=s*o*n+a*e*r,this._z=s*e*r-a*o*n,this._w=s*e*n-a*o*r;break;case"XZY":this._x=a*e*n-s*o*r,this._y=s*o*n-a*e*r,this._z=s*e*r+a*o*n,this._w=s*e*n+a*o*r;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+E)}return I===!0&&this._onChangeCallback(),this}setFromAxisAngle(A,I){const g=I/2,Q=Math.sin(g);return this._x=A.x*Q,this._y=A.y*Q,this._z=A.z*Q,this._w=Math.cos(g),this._onChangeCallback(),this}setFromRotationMatrix(A){const I=A.elements,g=I[0],Q=I[4],C=I[8],E=I[1],t=I[5],i=I[9],s=I[2],e=I[6],n=I[10],a=g+t+n;if(a>0){const o=.5/Math.sqrt(a+1);this._w=.25/o,this._x=(e-i)*o,this._y=(C-s)*o,this._z=(E-Q)*o}else if(g>t&&g>n){const o=2*Math.sqrt(1+g-t-n);this._w=(e-i)/o,this._x=.25*o,this._y=(Q+E)/o,this._z=(C+s)/o}else if(t>n){const o=2*Math.sqrt(1+t-g-n);this._w=(C-s)/o,this._x=(Q+E)/o,this._y=.25*o,this._z=(i+e)/o}else{const o=2*Math.sqrt(1+n-g-t);this._w=(E-Q)/o,this._x=(C+s)/o,this._y=(i+e)/o,this._z=.25*o}return this._onChangeCallback(),this}setFromUnitVectors(A,I){let g=A.dot(I)+1;return g<Number.EPSILON?(g=0,Math.abs(A.x)>Math.abs(A.z)?(this._x=-A.y,this._y=A.x,this._z=0,this._w=g):(this._x=0,this._y=-A.z,this._z=A.y,this._w=g)):(this._x=A.y*I.z-A.z*I.y,this._y=A.z*I.x-A.x*I.z,this._z=A.x*I.y-A.y*I.x,this._w=g),this.normalize()}angleTo(A){return 2*Math.acos(Math.abs(tA(this.dot(A),-1,1)))}rotateTowards(A,I){const g=this.angleTo(A);if(g===0)return this;const Q=Math.min(1,I/g);return this.slerp(A,Q),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(A){return this._x*A._x+this._y*A._y+this._z*A._z+this._w*A._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let A=this.length();return A===0?(this._x=0,this._y=0,this._z=0,this._w=1):(A=1/A,this._x=this._x*A,this._y=this._y*A,this._z=this._z*A,this._w=this._w*A),this._onChangeCallback(),this}multiply(A){return this.multiplyQuaternions(this,A)}premultiply(A){return this.multiplyQuaternions(A,this)}multiplyQuaternions(A,I){const g=A._x,Q=A._y,C=A._z,E=A._w,t=I._x,i=I._y,s=I._z,e=I._w;return this._x=g*e+E*t+Q*s-C*i,this._y=Q*e+E*i+C*t-g*s,this._z=C*e+E*s+g*i-Q*t,this._w=E*e-g*t-Q*i-C*s,this._onChangeCallback(),this}slerp(A,I){if(I===0)return this;if(I===1)return this.copy(A);const g=this._x,Q=this._y,C=this._z,E=this._w;let t=E*A._w+g*A._x+Q*A._y+C*A._z;if(t<0?(this._w=-A._w,this._x=-A._x,this._y=-A._y,this._z=-A._z,t=-t):this.copy(A),t>=1)return this._w=E,this._x=g,this._y=Q,this._z=C,this;const i=1-t*t;if(i<=Number.EPSILON){const o=1-I;return this._w=o*E+I*this._w,this._x=o*g+I*this._x,this._y=o*Q+I*this._y,this._z=o*C+I*this._z,this.normalize(),this}const s=Math.sqrt(i),e=Math.atan2(s,t),n=Math.sin((1-I)*e)/s,a=Math.sin(I*e)/s;return this._w=E*n+this._w*a,this._x=g*n+this._x*a,this._y=Q*n+this._y*a,this._z=C*n+this._z*a,this._onChangeCallback(),this}slerpQuaternions(A,I,g){return this.copy(A).slerp(I,g)}random(){const A=2*Math.PI*Math.random(),I=2*Math.PI*Math.random(),g=Math.random(),Q=Math.sqrt(1-g),C=Math.sqrt(g);return this.set(Q*Math.sin(A),Q*Math.cos(A),C*Math.sin(I),C*Math.cos(I))}equals(A){return A._x===this._x&&A._y===this._y&&A._z===this._z&&A._w===this._w}fromArray(A,I=0){return this._x=A[I],this._y=A[I+1],this._z=A[I+2],this._w=A[I+3],this._onChangeCallback(),this}toArray(A=[],I=0){return A[I]=this._x,A[I+1]=this._y,A[I+2]=this._z,A[I+3]=this._w,A}fromBufferAttribute(A,I){return this._x=A.getX(I),this._y=A.getY(I),this._z=A.getZ(I),this._w=A.getW(I),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(A){return this._onChangeCallback=A,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class R{constructor(A=0,I=0,g=0){R.prototype.isVector3=!0,this.x=A,this.y=I,this.z=g}set(A,I,g){return g===void 0&&(g=this.z),this.x=A,this.y=I,this.z=g,this}setScalar(A){return this.x=A,this.y=A,this.z=A,this}setX(A){return this.x=A,this}setY(A){return this.y=A,this}setZ(A){return this.z=A,this}setComponent(A,I){switch(A){case 0:this.x=I;break;case 1:this.y=I;break;case 2:this.z=I;break;default:throw new Error("index is out of range: "+A)}return this}getComponent(A){switch(A){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+A)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(A){return this.x=A.x,this.y=A.y,this.z=A.z,this}add(A){return this.x+=A.x,this.y+=A.y,this.z+=A.z,this}addScalar(A){return this.x+=A,this.y+=A,this.z+=A,this}addVectors(A,I){return this.x=A.x+I.x,this.y=A.y+I.y,this.z=A.z+I.z,this}addScaledVector(A,I){return this.x+=A.x*I,this.y+=A.y*I,this.z+=A.z*I,this}sub(A){return this.x-=A.x,this.y-=A.y,this.z-=A.z,this}subScalar(A){return this.x-=A,this.y-=A,this.z-=A,this}subVectors(A,I){return this.x=A.x-I.x,this.y=A.y-I.y,this.z=A.z-I.z,this}multiply(A){return this.x*=A.x,this.y*=A.y,this.z*=A.z,this}multiplyScalar(A){return this.x*=A,this.y*=A,this.z*=A,this}multiplyVectors(A,I){return this.x=A.x*I.x,this.y=A.y*I.y,this.z=A.z*I.z,this}applyEuler(A){return this.applyQuaternion(ug.setFromEuler(A))}applyAxisAngle(A,I){return this.applyQuaternion(ug.setFromAxisAngle(A,I))}applyMatrix3(A){const I=this.x,g=this.y,Q=this.z,C=A.elements;return this.x=C[0]*I+C[3]*g+C[6]*Q,this.y=C[1]*I+C[4]*g+C[7]*Q,this.z=C[2]*I+C[5]*g+C[8]*Q,this}applyNormalMatrix(A){return this.applyMatrix3(A).normalize()}applyMatrix4(A){const I=this.x,g=this.y,Q=this.z,C=A.elements,E=1/(C[3]*I+C[7]*g+C[11]*Q+C[15]);return this.x=(C[0]*I+C[4]*g+C[8]*Q+C[12])*E,this.y=(C[1]*I+C[5]*g+C[9]*Q+C[13])*E,this.z=(C[2]*I+C[6]*g+C[10]*Q+C[14])*E,this}applyQuaternion(A){const I=this.x,g=this.y,Q=this.z,C=A.x,E=A.y,t=A.z,i=A.w,s=2*(E*Q-t*g),e=2*(t*I-C*Q),n=2*(C*g-E*I);return this.x=I+i*s+E*n-t*e,this.y=g+i*e+t*s-C*n,this.z=Q+i*n+C*e-E*s,this}project(A){return this.applyMatrix4(A.matrixWorldInverse).applyMatrix4(A.projectionMatrix)}unproject(A){return this.applyMatrix4(A.projectionMatrixInverse).applyMatrix4(A.matrixWorld)}transformDirection(A){const I=this.x,g=this.y,Q=this.z,C=A.elements;return this.x=C[0]*I+C[4]*g+C[8]*Q,this.y=C[1]*I+C[5]*g+C[9]*Q,this.z=C[2]*I+C[6]*g+C[10]*Q,this.normalize()}divide(A){return this.x/=A.x,this.y/=A.y,this.z/=A.z,this}divideScalar(A){return this.multiplyScalar(1/A)}min(A){return this.x=Math.min(this.x,A.x),this.y=Math.min(this.y,A.y),this.z=Math.min(this.z,A.z),this}max(A){return this.x=Math.max(this.x,A.x),this.y=Math.max(this.y,A.y),this.z=Math.max(this.z,A.z),this}clamp(A,I){return this.x=tA(this.x,A.x,I.x),this.y=tA(this.y,A.y,I.y),this.z=tA(this.z,A.z,I.z),this}clampScalar(A,I){return this.x=tA(this.x,A,I),this.y=tA(this.y,A,I),this.z=tA(this.z,A,I),this}clampLength(A,I){const g=this.length();return this.divideScalar(g||1).multiplyScalar(tA(g,A,I))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(A){return this.x*A.x+this.y*A.y+this.z*A.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(A){return this.normalize().multiplyScalar(A)}lerp(A,I){return this.x+=(A.x-this.x)*I,this.y+=(A.y-this.y)*I,this.z+=(A.z-this.z)*I,this}lerpVectors(A,I,g){return this.x=A.x+(I.x-A.x)*g,this.y=A.y+(I.y-A.y)*g,this.z=A.z+(I.z-A.z)*g,this}cross(A){return this.crossVectors(this,A)}crossVectors(A,I){const g=A.x,Q=A.y,C=A.z,E=I.x,t=I.y,i=I.z;return this.x=Q*i-C*t,this.y=C*E-g*i,this.z=g*t-Q*E,this}projectOnVector(A){const I=A.lengthSq();if(I===0)return this.set(0,0,0);const g=A.dot(this)/I;return this.copy(A).multiplyScalar(g)}projectOnPlane(A){return HI.copy(this).projectOnVector(A),this.sub(HI)}reflect(A){return this.sub(HI.copy(A).multiplyScalar(2*this.dot(A)))}angleTo(A){const I=Math.sqrt(this.lengthSq()*A.lengthSq());if(I===0)return Math.PI/2;const g=this.dot(A)/I;return Math.acos(tA(g,-1,1))}distanceTo(A){return Math.sqrt(this.distanceToSquared(A))}distanceToSquared(A){const I=this.x-A.x,g=this.y-A.y,Q=this.z-A.z;return I*I+g*g+Q*Q}manhattanDistanceTo(A){return Math.abs(this.x-A.x)+Math.abs(this.y-A.y)+Math.abs(this.z-A.z)}setFromSpherical(A){return this.setFromSphericalCoords(A.radius,A.phi,A.theta)}setFromSphericalCoords(A,I,g){const Q=Math.sin(I)*A;return this.x=Q*Math.sin(g),this.y=Math.cos(I)*A,this.z=Q*Math.cos(g),this}setFromCylindrical(A){return this.setFromCylindricalCoords(A.radius,A.theta,A.y)}setFromCylindricalCoords(A,I,g){return this.x=A*Math.sin(I),this.y=g,this.z=A*Math.cos(I),this}setFromMatrixPosition(A){const I=A.elements;return this.x=I[12],this.y=I[13],this.z=I[14],this}setFromMatrixScale(A){const I=this.setFromMatrixColumn(A,0).length(),g=this.setFromMatrixColumn(A,1).length(),Q=this.setFromMatrixColumn(A,2).length();return this.x=I,this.y=g,this.z=Q,this}setFromMatrixColumn(A,I){return this.fromArray(A.elements,I*4)}setFromMatrix3Column(A,I){return this.fromArray(A.elements,I*3)}setFromEuler(A){return this.x=A._x,this.y=A._y,this.z=A._z,this}setFromColor(A){return this.x=A.r,this.y=A.g,this.z=A.b,this}equals(A){return A.x===this.x&&A.y===this.y&&A.z===this.z}fromArray(A,I=0){return this.x=A[I],this.y=A[I+1],this.z=A[I+2],this}toArray(A=[],I=0){return A[I]=this.x,A[I+1]=this.y,A[I+2]=this.z,A}fromBufferAttribute(A,I){return this.x=A.getX(I),this.y=A.getY(I),this.z=A.getZ(I),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const A=Math.random()*Math.PI*2,I=Math.random()*2-1,g=Math.sqrt(1-I*I);return this.x=g*Math.cos(A),this.y=I,this.z=g*Math.sin(A),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const HI=new R,ug=new UA;class fg{constructor(A=new R(1/0,1/0,1/0),I=new R(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=A,this.max=I}set(A,I){return this.min.copy(A),this.max.copy(I),this}setFromArray(A){this.makeEmpty();for(let I=0,g=A.length;I<g;I+=3)this.expandByPoint(lA.fromArray(A,I));return this}setFromBufferAttribute(A){this.makeEmpty();for(let I=0,g=A.count;I<g;I++)this.expandByPoint(lA.fromBufferAttribute(A,I));return this}setFromPoints(A){this.makeEmpty();for(let I=0,g=A.length;I<g;I++)this.expandByPoint(A[I]);return this}setFromCenterAndSize(A,I){const g=lA.copy(I).multiplyScalar(.5);return this.min.copy(A).sub(g),this.max.copy(A).add(g),this}setFromObject(A,I=!1){return this.makeEmpty(),this.expandByObject(A,I)}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,I=!1){A.updateWorldMatrix(!1,!1);const g=A.geometry;if(g!==void 0){const C=g.getAttribute("position");if(I===!0&&C!==void 0&&A.isInstancedMesh!==!0)for(let E=0,t=C.count;E<t;E++)A.isMesh===!0?A.getVertexPosition(E,lA):lA.fromBufferAttribute(C,E),lA.applyMatrix4(A.matrixWorld),this.expandByPoint(lA);else A.boundingBox!==void 0?(A.boundingBox===null&&A.computeBoundingBox(),nI.copy(A.boundingBox)):(g.boundingBox===null&&g.computeBoundingBox(),nI.copy(g.boundingBox)),nI.applyMatrix4(A.matrixWorld),this.union(nI)}const Q=A.children;for(let C=0,E=Q.length;C<E;C++)this.expandByObject(Q[C],I);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,I){return I.set((A.x-this.min.x)/(this.max.x-this.min.x),(A.y-this.min.y)/(this.max.y-this.min.y),(A.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(A){return A.max.x>=this.min.x&&A.min.x<=this.max.x&&A.max.y>=this.min.y&&A.min.y<=this.max.y&&A.max.z>=this.min.z&&A.min.z<=this.max.z}intersectsSphere(A){return this.clampPoint(A.center,lA),lA.distanceToSquared(A.center)<=A.radius*A.radius}intersectsPlane(A){let I,g;return A.normal.x>0?(I=A.normal.x*this.min.x,g=A.normal.x*this.max.x):(I=A.normal.x*this.max.x,g=A.normal.x*this.min.x),A.normal.y>0?(I+=A.normal.y*this.min.y,g+=A.normal.y*this.max.y):(I+=A.normal.y*this.max.y,g+=A.normal.y*this.min.y),A.normal.z>0?(I+=A.normal.z*this.min.z,g+=A.normal.z*this.max.z):(I+=A.normal.z*this.max.z,g+=A.normal.z*this.min.z),I<=-A.constant&&g>=-A.constant}intersectsTriangle(A){if(this.isEmpty())return!1;this.getCenter(AI),oI.subVectors(this.max,AI),ZA.subVectors(A.a,AI),vA.subVectors(A.b,AI),XA.subVectors(A.c,AI),mA.subVectors(vA,ZA),xA.subVectors(XA,vA),HA.subVectors(ZA,XA);let I=[0,-mA.z,mA.y,0,-xA.z,xA.y,0,-HA.z,HA.y,mA.z,0,-mA.x,xA.z,0,-xA.x,HA.z,0,-HA.x,-mA.y,mA.x,0,-xA.y,xA.x,0,-HA.y,HA.x,0];return!KI(I,ZA,vA,XA,oI)||(I=[1,0,0,0,1,0,0,0,1],!KI(I,ZA,vA,XA,oI))?!1:(aI.crossVectors(mA,xA),I=[aI.x,aI.y,aI.z],KI(I,ZA,vA,XA,oI))}clampPoint(A,I){return I.copy(A).clamp(this.min,this.max)}distanceToPoint(A){return this.clampPoint(A,lA).distanceTo(A)}getBoundingSphere(A){return this.isEmpty()?A.makeEmpty():(this.getCenter(A.center),A.radius=this.getSize(lA).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:(uA[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(A),uA[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(A),uA[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(A),uA[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(A),uA[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(A),uA[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(A),uA[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(A),uA[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(A),this.setFromPoints(uA),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 uA=[new R,new R,new R,new R,new R,new R,new R,new R],lA=new R,nI=new fg,ZA=new R,vA=new R,XA=new R,mA=new R,xA=new R,HA=new R,AI=new R,oI=new R,aI=new R,KA=new R;function KI(B,A,I,g,Q){for(let C=0,E=B.length-3;C<=E;C+=3){KA.fromArray(B,C);const t=Q.x*Math.abs(KA.x)+Q.y*Math.abs(KA.y)+Q.z*Math.abs(KA.z),i=A.dot(KA),s=I.dot(KA),e=g.dot(KA);if(Math.max(-Math.max(i,s,e),Math.min(i,s,e))>t)return!1}return!0}const kg={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},YA={h:0,s:0,l:0},rI={h:0,s:0,l:0};function bI(B,A,I){return I<0&&(I+=1),I>1&&(I-=1),I<1/6?B+(A-B)*6*I:I<1/2?A:I<2/3?B+(A-B)*6*(2/3-I):B}class qI{constructor(A,I,g){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(A,I,g)}set(A,I,g){if(I===void 0&&g===void 0){const Q=A;Q&&Q.isColor?this.copy(Q):typeof Q=="number"?this.setHex(Q):typeof Q=="string"&&this.setStyle(Q)}else this.setRGB(A,I,g);return this}setScalar(A){return this.r=A,this.g=A,this.b=A,this}setHex(A,I=wA){return A=Math.floor(A),this.r=(A>>16&255)/255,this.g=(A>>8&255)/255,this.b=(A&255)/255,yA.toWorkingColorSpace(this,I),this}setRGB(A,I,g,Q=yA.workingColorSpace){return this.r=A,this.g=I,this.b=g,yA.toWorkingColorSpace(this,Q),this}setHSL(A,I,g,Q=yA.workingColorSpace){if(A=lB(A,1),I=tA(I,0,1),g=tA(g,0,1),I===0)this.r=this.g=this.b=g;else{const C=g<=.5?g*(1+I):g+I-g*I,E=2*g-C;this.r=bI(E,C,A+1/3),this.g=bI(E,C,A),this.b=bI(E,C,A-1/3)}return yA.toWorkingColorSpace(this,Q),this}setStyle(A,I=wA){function g(C){C!==void 0&&parseFloat(C)<1&&console.warn("THREE.Color: Alpha component of "+A+" will be ignored.")}let Q;if(Q=/^(\\w+)\\(([^\\)]*)\\)/.exec(A)){let C;const E=Q[1],t=Q[2];switch(E){case"rgb":case"rgba":if(C=/^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(t))return g(C[4]),this.setRGB(Math.min(255,parseInt(C[1],10))/255,Math.min(255,parseInt(C[2],10))/255,Math.min(255,parseInt(C[3],10))/255,I);if(C=/^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(t))return g(C[4]),this.setRGB(Math.min(100,parseInt(C[1],10))/100,Math.min(100,parseInt(C[2],10))/100,Math.min(100,parseInt(C[3],10))/100,I);break;case"hsl":case"hsla":if(C=/^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(t))return g(C[4]),this.setHSL(parseFloat(C[1])/360,parseFloat(C[2])/100,parseFloat(C[3])/100,I);break;default:console.warn("THREE.Color: Unknown color model "+A)}}else if(Q=/^\\#([A-Fa-f\\d]+)$/.exec(A)){const C=Q[1],E=C.length;if(E===3)return this.setRGB(parseInt(C.charAt(0),16)/15,parseInt(C.charAt(1),16)/15,parseInt(C.charAt(2),16)/15,I);if(E===6)return this.setHex(parseInt(C,16),I);console.warn("THREE.Color: Invalid hex color "+A)}else if(A&&A.length>0)return this.setColorName(A,I);return this}setColorName(A,I=wA){const g=kg[A.toLowerCase()];return g!==void 0?this.setHex(g,I):console.warn("THREE.Color: Unknown color "+A),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(A){return this.r=A.r,this.g=A.g,this.b=A.b,this}copySRGBToLinear(A){return this.r=zA(A.r),this.g=zA(A.g),this.b=zA(A.b),this}copyLinearToSRGB(A){return this.r=TA(A.r),this.g=TA(A.g),this.b=TA(A.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(A=wA){return yA.fromWorkingColorSpace(gA.copy(this),A),Math.round(tA(gA.r*255,0,255))*65536+Math.round(tA(gA.g*255,0,255))*256+Math.round(tA(gA.b*255,0,255))}getHexString(A=wA){return("000000"+this.getHex(A).toString(16)).slice(-6)}getHSL(A,I=yA.workingColorSpace){yA.fromWorkingColorSpace(gA.copy(this),I);const g=gA.r,Q=gA.g,C=gA.b,E=Math.max(g,Q,C),t=Math.min(g,Q,C);let i,s;const e=(t+E)/2;if(t===E)i=0,s=0;else{const n=E-t;switch(s=e<=.5?n/(E+t):n/(2-E-t),E){case g:i=(Q-C)/n+(Q<C?6:0);break;case Q:i=(C-g)/n+2;break;case C:i=(g-Q)/n+4;break}i/=6}return A.h=i,A.s=s,A.l=e,A}getRGB(A,I=yA.workingColorSpace){return yA.fromWorkingColorSpace(gA.copy(this),I),A.r=gA.r,A.g=gA.g,A.b=gA.b,A}getStyle(A=wA){yA.fromWorkingColorSpace(gA.copy(this),A);const I=gA.r,g=gA.g,Q=gA.b;return A!==wA?`color(${A} ${I.toFixed(3)} ${g.toFixed(3)} ${Q.toFixed(3)})`:`rgb(${Math.round(I*255)},${Math.round(g*255)},${Math.round(Q*255)})`}offsetHSL(A,I,g){return this.getHSL(YA),this.setHSL(YA.h+A,YA.s+I,YA.l+g)}add(A){return this.r+=A.r,this.g+=A.g,this.b+=A.b,this}addColors(A,I){return this.r=A.r+I.r,this.g=A.g+I.g,this.b=A.b+I.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,I){return this.r+=(A.r-this.r)*I,this.g+=(A.g-this.g)*I,this.b+=(A.b-this.b)*I,this}lerpColors(A,I,g){return this.r=A.r+(I.r-A.r)*g,this.g=A.g+(I.g-A.g)*g,this.b=A.b+(I.b-A.b)*g,this}lerpHSL(A,I){this.getHSL(YA),A.getHSL(rI);const g=pI(YA.h,rI.h,I),Q=pI(YA.s,rI.s,I),C=pI(YA.l,rI.l,I);return this.setHSL(g,Q,C),this}setFromVector3(A){return this.r=A.x,this.g=A.y,this.b=A.z,this}applyMatrix3(A){const I=this.r,g=this.g,Q=this.b,C=A.elements;return this.r=C[0]*I+C[3]*g+C[6]*Q,this.g=C[1]*I+C[4]*g+C[7]*Q,this.b=C[2]*I+C[5]*g+C[8]*Q,this}equals(A){return A.r===this.r&&A.g===this.g&&A.b===this.b}fromArray(A,I=0){return this.r=A[I],this.g=A[I+1],this.b=A[I+2],this}toArray(A=[],I=0){return A[I]=this.r,A[I+1]=this.g,A[I+2]=this.b,A}fromBufferAttribute(A,I){return this.r=A.getX(I),this.g=A.getY(I),this.b=A.getZ(I),this}toJSON(){return this.getHex()}*[Symbol.iterator](){yield this.r,yield this.g,yield this.b}}const gA=new qI;qI.NAMES=kg,typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:Mg}})),typeof window<"u"&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=Mg);const Rg=-12,Ug=9,_A=Math.exp(-30),NB=11,FB=11,mg=1<<NB,xg=1<<FB,Yg=1;function GB(B){var C;let A=!1;const I=B.split(`\n`).map(E=>{const t=E.trimEnd();return A?t:t.length>0?(A=!0,t):null}).filter(E=>E!=null);for(;I.length>0&&I[I.length-1].length===0;)I.pop();if(I.length===0)return[];const g=(C=I[0].match(/^\\s*/))==null?void 0:C[0];if(!g)return I;const Q=new RegExp(`^${g}`);return I.map(E=>E.replace(Q,""))}function SB(B){return GB(B).join(`\n`)}const zI=new Float32Array(1),Jg=new Uint32Array(zI.buffer);function WA(B){zI[0]=B;const A=Jg[0],I=A>>31&1,g=A>>23&255,Q=A&8388607,C=I<<15;if(g===255)return Q!==0?C|32767:C|31744;const E=g-127+15;if(E>=31)return C|31744;if(E<=0){if(E<-10)return C;const i=(Q|8388608)>>1-E+13;return C|i}const t=Q>>13;return C|E<<10|t}function O(B){const A=B>>15&1,I=B>>10&31,g=B&1023;let Q;if(I===0)if(g===0)Q=A<<31;else{let C=g,E=-14;for(;(C&1024)===0;)C<<=1,E--;C&=1023;const t=E+127,i=C<<13;Q=A<<31|t<<23|i}else if(I===31)g===0?Q=A<<31|2139095040:Q=A<<31|2143289344;else{const C=I-15+127,E=g<<13;Q=A<<31|C<<23|E}return Jg[0]=Q,zI[0]}function aA(B){return Math.max(0,Math.min(255,Math.round(B*255)))}function uB(B){const A=[],I=new Set;function g(Q){Q&&typeof Q=="object"&&!I.has(Q)&&(I.add(Q),Q instanceof ArrayBuffer?A.push(Q):ArrayBuffer.isView(Q)?A.push(Q.buffer):Array.isArray(Q)?Q.forEach(g):Object.values(Q).forEach(g))}return g(B),A}function TI(B,A,I,g,Q,C,E,t,i,s,e,n,a,o,r,D,c){const h=(c==null?void 0:c.rgbMin)??0,y=((c==null?void 0:c.rgbMax)??1)-h,l=aA((o-h)/y),G=aA((r-h)/y),k=aA((D-h)/y),p=aA(a),F=Hg(new UA(i,s,e,n)),N=F&255,x=F>>>8&255,S=F>>>16&255,M=(c==null?void 0:c.lnScaleMin)??Rg,K=254/(((c==null?void 0:c.lnScaleMax)??Ug)-M),J=C<_A?0:Math.min(255,Math.max(1,Math.round((Math.log(C)-M)*K)+1)),U=E<_A?0:Math.min(255,Math.max(1,Math.round((Math.log(E)-M)*K)+1)),z=t<_A?0:Math.min(255,Math.max(1,Math.round((Math.log(t)-M)*K)+1)),v=WA(I),T=WA(g),j=WA(Q),X=A*4;B[X]=l|G<<8|k<<16|p<<24,B[X+1]=v|T<<16,B[X+2]=j|N<<16|x<<24,B[X+3]=J|U<<8|z<<16|S<<24}function Lg(B,A,I,g,Q){const C=WA(I),E=WA(g),t=WA(Q),i=A*4;B[i+1]=C|E<<16,B[i+2]=t|B[i+2]&4294901760}function pg(B,A,I,g,Q,C){const E=(C==null?void 0:C.lnScaleMin)??Rg,i=254/(((C==null?void 0:C.lnScaleMax)??Ug)-E),s=I<_A?0:Math.min(255,Math.max(1,Math.round((Math.log(I)-E)*i)+1)),e=g<_A?0:Math.min(255,Math.max(1,Math.round((Math.log(g)-E)*i)+1)),n=Q<_A?0:Math.min(255,Math.max(1,Math.round((Math.log(Q)-E)*i)+1)),a=A*4;B[a+3]=s|e<<8|n<<16|B[a+3]&4278190080}function dg(B,A,I,g,Q,C){const E=Hg(new UA(I,g,Q,C)),t=E&255,i=E>>>8&255,s=E>>>16&255,e=A*4;B[e+2]=B[e+2]&65535|t<<16|i<<24,B[e+3]=B[e+3]&16777215|s<<24}function fB(B,A,I,g,Q,C,E){const t=(E==null?void 0:E.rgbMin)??0,s=((E==null?void 0:E.rgbMax)??1)-t,e=aA((I-t)/s),n=aA((g-t)/s),a=aA((Q-t)/s),o=aA(C),r=A*4;B[r]=e|n<<8|a<<16|o<<24}function kB(B,A,I,g,Q,C){const E=(C==null?void 0:C.rgbMin)??0,i=((C==null?void 0:C.rgbMax)??1)-E,s=aA((I-E)/i),e=aA((g-E)/i),n=aA((Q-E)/i),a=A*4;B[a]=s|e<<8|n<<16|B[a]&4278190080}function RB(B,A,I){const g=aA(I),Q=A*4;B[Q]=B[Q]&16777215|g<<24}new R,new R,new qI;function UB(B){const A=mg,I=Math.max(Yg,Math.min(xg,Math.ceil(B/A))),g=Math.ceil(B/(A*I)),Q=A*I*g;return{width:A,height:I,depth:g,maxSplats:Q}}function hI(B){const A=mg,I=Math.max(Yg,Math.min(xg,Math.ceil(B/A))),g=Math.ceil(B/(A*I));return A*I*g}SB(`\n precision highp float;\n\n in vec3 position;\n\n void main() {\n gl_Position = vec4(position.xy, 0.0, 1.0);\n }\n`);function Hg(B){const A=B.clone().normalize();A.w<0&&A.set(-A.x,-A.y,-A.z,-A.w);const I=2*Math.acos(A.w),g=Math.sqrt(A.x*A.x+A.y*A.y+A.z*A.z),Q=g<1e-6?new R(1,0,0):new R(A.x,A.y,A.z).divideScalar(g),C=Math.abs(Q.x)+Math.abs(Q.y)+Math.abs(Q.z);let E=Q.x/C,t=Q.y/C;if(Q.z<0){const o=E;E=(1-Math.abs(t))*(E>=0?1:-1),t=(1-Math.abs(o))*(t>=0?1:-1)}const i=E*.5+.5,s=t*.5+.5,e=Math.round(i*255),n=Math.round(s*255);return Math.round(I*(255/Math.PI))<<16|n<<8|e}function cI(B,A,I,g){const Q=Math.max(-127,Math.min(127,B*127)),C=Math.max(-127,Math.min(127,A*127)),E=Math.max(-127,Math.min(127,I*127)),t=Math.max(-127,Math.min(127,g*127));return Q&255|(C&255)<<8|(E&255)<<16|(t&255)<<24}function DI(B,A,I,g){const Q=(g==null?void 0:g.sh1Min)??-1,C=(g==null?void 0:g.sh1Max)??1,E=.5*(Q+C),t=63/(C-Q),i=A*2;for(let s=0;s<9;++s){const e=(I[s]-E)*t,n=Math.round(Math.max(-63,Math.min(63,e)))&127,a=s*7,o=a+7,r=Math.floor(a/32),D=a-r*32,c=n<<D&4294967295;if(B[i+r]|=c,o>r*32+32){const h=n>>>32-D&4294967295;B[i+r+1]|=h}}}function wI(B,A,I,g){const Q=(g==null?void 0:g.sh2Min)??-1,C=(g==null?void 0:g.sh2Max)??1,E=.5*(Q+C),t=.5/(C-Q);B[A*4+0]=cI((I[0]-E)*t,(I[1]-E)*t,(I[2]-E)*t,(I[3]-E)*t),B[A*4+1]=cI((I[4]-E)*t,(I[5]-E)*t,(I[6]-E)*t,(I[7]-E)*t),B[A*4+2]=cI((I[8]-E)*t,(I[9]-E)*t,(I[10]-E)*t,(I[11]-E)*t),B[A*4+3]=cI((I[12]-E)*t,(I[13]-E)*t,(I[14]-E)*t,0)}function yI(B,A,I,g){const Q=(g==null?void 0:g.sh3Min)??-1,C=(g==null?void 0:g.sh3Max)??1,E=.5*(Q+C),t=31/(C-Q),i=A*4;for(let s=0;s<21;++s){const e=(I[s]-E)*t,n=Math.round(Math.max(-31,Math.min(31,e)))&63,a=s*6,o=a+6,r=Math.floor(a/32),D=a-r*32,c=n<<D&4294967295;if(B[i+r]|=c,o>r*32+32){const h=n>>>32-D&4294967295;B[i+r+1]|=h}}}function mB(B,A){const I=[];let g=0,Q=null;const C=new Dg((i,s)=>{if(I.push(i),g+=i.length,s||g>=A){const e=new Uint8Array(g);let n=0;for(const a of I)e.set(a,n),n+=a.length;Q=e.slice(0,A)}}),E=1024;let t=0;for(;Q==null&&t<B.length;){const i=B.slice(t,t+E);C.push(i,!1),t+=E}if(Q==null&&(C.push(new Uint8Array,!0),Q==null))throw new Error("Failed to decompress partial gzip");return Q}class xB{constructor({fileBytes:A,chunkBytes:I=64*1024}){this.fileBytes=A,this.chunkBytes=I,this.offset=0,this.chunks=[],this.totalBytes=0,this.gunzip=new Dg((g,Q)=>{this.chunks.push(g),this.totalBytes+=g.length})}read(A){for(;this.totalBytes<A&&this.offset<this.fileBytes.length;){const C=Math.min(this.offset+this.chunkBytes,this.fileBytes.length);this.gunzip.push(this.fileBytes.subarray(this.offset,C),!1),this.offset=C}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 I=new Uint8Array(this.totalBytes);let g=0;for(const C of this.chunks)I.set(C,g),g+=C.length;const Q=I.subarray(0,A);return this.chunks=[I.subarray(A)],this.totalBytes-=A,Q}}function Kg(B,A,I){const g=Math.floor(B.length/32);if(g*32!==B.length)throw new Error("Invalid .splat file size");A(g);const Q=new Float32Array(B.buffer);for(let C=0;C<g;++C){const E=C*32,t=C*8,i=Q[t+0],s=Q[t+1],e=Q[t+2],n=Q[t+3],a=Q[t+4],o=Q[t+5],r=B[E+24]/255,D=B[E+25]/255,c=B[E+26]/255,h=B[E+27]/255,w=(B[E+28]-128)/128,y=(B[E+29]-128)/128,l=(B[E+30]-128)/128,G=(B[E+31]-128)/128;I(C,i,s,e,n,a,o,y,l,G,w,h,r,D,c)}}function YB(B,A){let I=0,g=0,Q=new Uint32Array(0);return Kg(B,C=>{I=C,g=hI(I),Q=new Uint32Array(g*4)},(C,E,t,i,s,e,n,a,o,r,D,c,h,w,y)=>{TI(Q,C,E,t,i,s,e,n,a,o,r,D,c,h,w,y,A)}),{packedArray:Q,numSplats:I}}const lI={0:{bytesPerCenter:12,bytesPerScale:12,bytesPerRotation:16,bytesPerColor:4,bytesPerSphericalHarmonicsComponent:4,scaleOffsetBytes:12,rotationOffsetBytes:24,colorOffsetBytes:40,sphericalHarmonicsOffsetBytes:44,scaleRange:1},1:{bytesPerCenter:6,bytesPerScale:6,bytesPerRotation:8,bytesPerColor:4,bytesPerSphericalHarmonicsComponent:2,scaleOffsetBytes:6,rotationOffsetBytes:12,colorOffsetBytes:20,sphericalHarmonicsOffsetBytes:24,scaleRange:32767},2:{bytesPerCenter:6,bytesPerScale:6,bytesPerRotation:8,bytesPerColor:4,bytesPerSphericalHarmonicsComponent:1,scaleOffsetBytes:6,rotationOffsetBytes:12,colorOffsetBytes:20,sphericalHarmonicsOffsetBytes:24,scaleRange:32767}},bg={0:0,1:9,2:24,3:45};function JB(B,A,I,g){var D;let E=0;const t=new DataView(B.buffer,E,4096);E+=4096;const i=t.getUint8(0),s=t.getUint8(1);if(i!==0||s<1)throw new Error(`Unsupported .ksplat version: ${i}.${s}`);const e=t.getUint32(4,!0);t.getUint32(16,!0);const n=t.getUint16(20,!0);if(n<0||n>2)throw new Error(`Invalid .ksplat compression level: ${n}`);const a=t.getFloat32(36,!0)||-1.5,o=t.getFloat32(40,!0)||1.5;let r=4096+e*1024;for(let c=0;c<e;++c){let h=function(CA,Y){if(n===0)return m.getFloat32(CA+d+Y*4,!0);if(n===1)return O(m.getUint16(CA+d+Y*2,!0));const cA=m.getUint8(CA+d+Y)/255;return a+cA*(o-a)};const w=new DataView(B.buffer,E,1024);E+=1024;const y=w.getUint32(0,!0),l=w.getUint32(4,!0),G=w.getUint32(8,!0),k=w.getUint32(12,!0),p=w.getFloat32(16,!0),F=w.getUint16(20,!0),N=(w.getUint32(24,!0)||((D=lI[n])==null?void 0:D.scaleRange))??1,x=w.getUint32(32,!0),S=x*G,M=w.getUint32(36,!0),u=M*4,K=F*k+u,J=w.getUint16(40,!0),U=bg[J],{bytesPerCenter:z,bytesPerScale:v,bytesPerRotation:T,bytesPerColor:j,bytesPerSphericalHarmonicsComponent:X,scaleOffsetBytes:W,rotationOffsetBytes:b,colorOffsetBytes:Z,sphericalHarmonicsOffsetBytes:d}=lI[n],L=z+v+T+j+U*X,f=L*l,BA=f+K,QA=[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],EA=[24,31,38,25,32,39,26,33,40,27,34,41,28,35,42,29,36,43,30,37,44],sA=J>=1?new Float32Array(3*3):void 0,eA=J>=2?new Float32Array(5*3):void 0,fA=J>=3?new Float32Array(7*3):void 0,nA=p/2/N,rA=r+u,hA=r+K,m=new DataView(B.buffer,hA,f),$=new Float32Array(B.buffer,rA,k*3),MA=new Uint32Array(B.buffer,r,M);let q=x,LA=S;for(let CA=0;CA<y;++CA){const Y=CA*L;let cA;if(CA<S)cA=Math.floor(CA/G);else{const SA=MA[q-x];CA>=LA+SA&&(q+=1,LA+=SA),cA=q}const AA=n===0?m.getFloat32(Y+0,!0):(m.getUint16(Y+0,!0)-N)*nA+$[3*cA+0],H=n===0?m.getFloat32(Y+4,!0):(m.getUint16(Y+2,!0)-N)*nA+$[3*cA+1],NA=n===0?m.getFloat32(Y+8,!0):(m.getUint16(Y+4,!0)-N)*nA+$[3*cA+2],BI=n===0?m.getFloat32(Y+W+0,!0):O(m.getUint16(Y+W+0,!0)),QI=n===0?m.getFloat32(Y+W+4,!0):O(m.getUint16(Y+W+2,!0)),_I=n===0?m.getFloat32(Y+W+8,!0):O(m.getUint16(Y+W+4,!0)),WI=n===0?m.getFloat32(Y+b+0,!0):O(m.getUint16(Y+b+0,!0)),jI=n===0?m.getFloat32(Y+b+4,!0):O(m.getUint16(Y+b+2,!0)),VI=n===0?m.getFloat32(Y+b+8,!0):O(m.getUint16(Y+b+4,!0)),PI=n===0?m.getFloat32(Y+b+12,!0):O(m.getUint16(Y+b+6,!0)),OI=m.getUint8(Y+Z+0)/255,$I=m.getUint8(Y+Z+1)/255,Ag=m.getUint8(Y+Z+2)/255,Ig=m.getUint8(Y+Z+3)/255;if(I(CA,AA,H,NA,BI,QI,_I,jI,VI,PI,WI,Ig,OI,$I,Ag),J>=1&&sA){for(const[SA,bA]of QA.entries())sA[SA]=h(Y,bA);if(eA)for(const[SA,bA]of iA.entries())eA[SA]=h(Y,bA);if(fA)for(const[SA,bA]of EA.entries())fA[SA]=h(Y,bA);g==null||g(CA,sA,eA,fA)}}r+=BA}}function LB(B,A){var w;let Q=0;const C=new DataView(B.buffer,Q,4096);Q+=4096;const E=C.getUint8(0),t=C.getUint8(1);if(E!==0||t<1)throw new Error(`Unsupported .ksplat version: ${E}.${t}`);const i=C.getUint32(4,!0),s=C.getUint32(16,!0),e=C.getUint16(20,!0);if(e<0||e>2)throw new Error(`Invalid .ksplat compression level: ${e}`);const n=C.getFloat32(36,!0)||-1.5,a=C.getFloat32(40,!0)||1.5,o=s,r=hI(o),D=new Uint32Array(r*4),c={};let h=4096+i*1024;for(let y=0;y<i;++y){let l=function(AA,H){if(e===0)return q.getFloat32(AA+BA+H*4,!0);if(e===1)return O(q.getUint16(AA+BA+H*2,!0));const NA=q.getUint8(AA+BA+H)/255;return n+NA*(a-n)};const G=new DataView(B.buffer,Q,1024);Q+=1024;const k=G.getUint32(0,!0),p=G.getUint32(4,!0),F=G.getUint32(8,!0),N=G.getUint32(12,!0),x=G.getFloat32(16,!0),S=G.getUint16(20,!0),M=(G.getUint32(24,!0)||((w=lI[e])==null?void 0:w.scaleRange))??1,u=G.getUint32(32,!0),K=u*F,J=G.getUint32(36,!0),U=J*4,z=S*N+U,v=G.getUint16(40,!0),T=bg[v],{bytesPerCenter:j,bytesPerScale:X,bytesPerRotation:W,bytesPerColor:b,bytesPerSphericalHarmonicsComponent:Z,scaleOffsetBytes:d,rotationOffsetBytes:L,colorOffsetBytes:f,sphericalHarmonicsOffsetBytes:BA}=lI[e],QA=j+X+W+b+T*Z,iA=QA*p,EA=iA+z,sA=[0,3,6,1,4,7,2,5,8],eA=[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],nA=v>=1?new Float32Array(3*3):void 0,rA=v>=2?new Float32Array(5*3):void 0,hA=v>=3?new Float32Array(7*3):void 0,m=x/2/M,$=h+U,MA=h+z,q=new DataView(B.buffer,MA,iA),LA=new Float32Array(B.buffer,$,N*3),CA=new Uint32Array(B.buffer,h,J);let Y=u,cA=K;for(let AA=0;AA<k;++AA){const H=AA*QA;let NA;if(AA<K)NA=Math.floor(AA/F);else{const pA=CA[Y-u];AA>=cA+pA&&(Y+=1,cA+=pA),NA=Y}const BI=e===0?q.getFloat32(H+0,!0):(q.getUint16(H+0,!0)-M)*m+LA[3*NA+0],QI=e===0?q.getFloat32(H+4,!0):(q.getUint16(H+2,!0)-M)*m+LA[3*NA+1],_I=e===0?q.getFloat32(H+8,!0):(q.getUint16(H+4,!0)-M)*m+LA[3*NA+2],WI=e===0?q.getFloat32(H+d+0,!0):O(q.getUint16(H+d+0,!0)),jI=e===0?q.getFloat32(H+d+4,!0):O(q.getUint16(H+d+2,!0)),VI=e===0?q.getFloat32(H+d+8,!0):O(q.getUint16(H+d+4,!0)),PI=e===0?q.getFloat32(H+L+0,!0):O(q.getUint16(H+L+0,!0)),OI=e===0?q.getFloat32(H+L+4,!0):O(q.getUint16(H+L+2,!0)),$I=e===0?q.getFloat32(H+L+8,!0):O(q.getUint16(H+L+4,!0)),Ag=e===0?q.getFloat32(H+L+12,!0):O(q.getUint16(H+L+6,!0)),Ig=q.getUint8(H+f+0)/255,SA=q.getUint8(H+f+1)/255,bA=q.getUint8(H+f+2)/255,OB=q.getUint8(H+f+3)/255;if(TI(D,AA,BI,QI,_I,WI,jI,VI,OI,$I,Ag,PI,OB,Ig,SA,bA,A),v>=1){if(nA){c.sh1||(c.sh1=new Uint32Array(o*2));for(const[pA,CI]of sA.entries())nA[pA]=l(H,CI);DI(c.sh1,AA,nA,A)}if(rA){c.sh2||(c.sh2=new Uint32Array(o*4));for(const[pA,CI]of eA.entries())rA[pA]=l(H,CI);wI(c.sh2,AA,rA,A)}if(hA){c.sh3||(c.sh3=new Uint32Array(o*4));for(const[pA,CI]of fA.entries())hA[pA]=l(H,CI);yI(c.sh3,AA,hA,A)}}}h+=EA}return{packedArray:D,numSplats:o,extra:c}}const VA=class VA{constructor({fileBytes:A}){this.header="",this.littleEndian=!0,this.elements={},this.comments=[],this.data=null,this.numSplats=0,this.fileBytes=A instanceof ArrayBuffer?new Uint8Array(A):A}async parseHeader(){const I=new ReadableStream({start:E=>{E.enqueue(this.fileBytes.slice(0,65536)),E.close()}}).pipeThrough(new TextDecoderStream).getReader();this.header="";const g=`end_header\n`;for(;;){const{value:E,done:t}=await I.read();if(t)throw new Error("Failed to read header");this.header+=E;const i=this.header.indexOf(g);if(i>=0){this.header=this.header.slice(0,i+g.length);break}}const Q=new TextEncoder().encode(this.header).length;this.data=new DataView(this.fileBytes.buffer,Q),this.elements={};let C=null;this.comments=[],this.header.trim().split(`\n`).forEach((E,t)=>{const i=E.trim();if(t===0){if(i!=="ply")throw new Error("Invalid PLY header");return}if(i.length===0)return;const s=i.split(" ");switch(s[0]){case"format":if(s[1]==="binary_little_endian")this.littleEndian=!0;else if(s[1]==="binary_big_endian")this.littleEndian=!1;else throw new Error(`Unsupported PLY format: ${s[1]}`);if(s[2]!=="1.0")throw new Error(`Unsupported PLY version: ${s[2]}`);break;case"end_header":break;case"comment":this.comments.push(i.slice(8));break;case"element":{const e=s[1];C={name:e,count:Number.parseInt(s[2]),properties:{}},this.elements[e]=C;break}case"property":if(C==null)throw new Error("Property must be inside an element");s[1]==="list"?C.properties[s[4]]={isList:!0,type:s[3],countType:s[2]}:C.properties[s[2]]={isList:!1,type:s[1]};break}}),this.elements.vertex&&(this.numSplats=this.elements.vertex.count)}parseData(A){let I=0;const g=this.data;if(g==null)throw new Error("No data to parse");for(const Q in this.elements){const C=this.elements[Q],{count:E,properties:t}=C,i={},s=[];for(const[n,a]of Object.entries(t))a.isList?(i[n]=[],s.push(()=>{const o=i[n];o.length=FI[a.countType](g,I,this.littleEndian),I+=jA[a.countType];for(let r=0;r<o.length;r++)o[r]=FI[a.type](g,I,this.littleEndian),I+=jA[a.type]})):(i[n]=0,s.push(()=>{i[n]=FI[a.type](g,I,this.littleEndian),I+=jA[a.type]}));const e=A(C)??(()=>{});for(let n=0;n<E;n++){for(const a of s)a();e(n,i)}}}parseSplats(A,I){if(this.elements.vertex==null)throw new Error("No vertex element found");let g=!1;const Q=[];let C=0,E=[],t=[],i=[],s,e,n;function a(){const h=dB[C];E=new Array(3).fill(null).flatMap((w,y)=>[0,1,2].map((l,G)=>`f_rest_${y+G*h/3}`)),t=new Array(5).fill(null).flatMap((w,y)=>[0,1,2].map((l,G)=>`f_rest_${3+y+G*h/3}`)),i=new Array(7).fill(null).flatMap((w,y)=>[0,1,2].map((l,G)=>`f_rest_${8+y+G*h/3}`)),s=C>=1?new Float32Array(3*3):void 0,e=C>=2?new Float32Array(5*3):void 0,n=C>=3?new Float32Array(7*3):void 0}function o(h,w){if(!s)throw new Error("Missing sh1");for(const[y,l]of E.entries())s[y]=w[l]*8/255-4;if(e)for(const[y,l]of t.entries())e[y]=w[l]*8/255-4;if(n)for(const[y,l]of i.entries())n[y]=w[l]*8/255-4;I==null||I(h,s,e,n)}function r(h){const{min_x:w,min_y:y,min_z:l,max_x:G,max_y:k,max_z:p,min_scale_x:F,min_scale_y:N,min_scale_z:x,max_scale_x:S,max_scale_y:M,max_scale_z:u}=h.properties;if(!w||!y||!l||!G||!k||!p||!F||!N||!x||!S||!M||!u)throw new Error("Missing PLY chunk properties");return g=!0,(K,J)=>{const{min_x:U,min_y:z,min_z:v,max_x:T,max_y:j,max_z:X,min_scale_x:W,min_scale_y:b,min_scale_z:Z,max_scale_x:d,max_scale_y:L,max_scale_z:f,min_r:BA,min_g:QA,min_b:iA,max_r:EA,max_g:sA,max_b:eA}=J;Q.push({min_x:U,min_y:z,min_z:v,max_x:T,max_y:j,max_z:X,min_scale_x:W,min_scale_y:b,min_scale_z:Z,max_scale_x:d,max_scale_y:L,max_scale_z:f,min_r:BA,min_g:QA,min_b:iA,max_r:EA,max_g:sA,max_b:eA})}}function D(h){if(I&&h.name==="sh")return C=zg(h.properties),a(),o;if(h.name!=="vertex")return null;const{packed_position:w,packed_rotation:y,packed_scale:l,packed_color:G}=h.properties;if(!w||!y||!l||!G)throw new Error("Missing PLY properties: packed_position, packed_rotation, packed_scale, packed_color");const k=Math.sqrt(2);return(p,F)=>{const N=Q[p>>>8];if(N==null)throw new Error("Missing PLY chunk");const{min_x:x,min_y:S,min_z:M,max_x:u,max_y:K,max_z:J,min_scale_x:U,min_scale_y:z,min_scale_z:v,max_scale_x:T,max_scale_y:j,max_scale_z:X,min_r:W,min_g:b,min_b:Z,max_r:d,max_g:L,max_b:f}=N,{packed_position:BA,packed_rotation:QA,packed_scale:iA,packed_color:EA}=F,sA=(BA>>>21&2047)/2047*(u-x)+x,eA=(BA>>>11&1023)/1023*(K-S)+S,fA=(BA&2047)/2047*(J-M)+M,nA=((QA>>>20&1023)/1023-.5)*k,rA=((QA>>>10&1023)/1023-.5)*k,hA=((QA&1023)/1023-.5)*k,m=Math.sqrt(Math.max(0,1-nA*nA-rA*rA-hA*hA)),$=QA>>>30,MA=$===0?nA:$===1?m:rA,q=$<=1?rA:$===2?m:hA,LA=$<=2?hA:m,CA=$===0?m:nA,Y=Math.exp((iA>>>21&2047)/2047*(T-U)+U),cA=Math.exp((iA>>>11&1023)/1023*(j-z)+z),AA=Math.exp((iA&2047)/2047*(X-v)+v),H=(EA>>>24&255)/255*((d??1)-(W??0))+(W??0),NA=(EA>>>16&255)/255*((L??1)-(b??0))+(b??0),BI=(EA>>>8&255)/255*((f??1)-(Z??0))+(Z??0),QI=(EA&255)/255;A(p,sA,eA,fA,Y,cA,AA,MA,q,LA,CA,QI,H,NA,BI)}}const c=h=>{if(h.name==="chunk")return r(h);if(g)return D(h);if(h.name!=="vertex")return null;const{x:w,y,z:l,scale_0:G,scale_1:k,scale_2:p,rot_0:F,rot_1:N,rot_2:x,rot_3:S,opacity:M,f_dc_0:u,f_dc_1:K,f_dc_2:J,red:U,green:z,blue:v,alpha:T}=h.properties;if(!w||!y||!l)throw new Error("Missing PLY properties: x, y, z");const j=G&&k&&p,X=F&&N&&x&&S,W=T!=null?GI[T.type]:1,b=U!=null?GI[U.type]:1,Z=z!=null?GI[z.type]:1,d=v!=null?GI[v.type]:1;return C=zg(h.properties),a(),(L,f)=>{const BA=j?Math.exp(f.scale_0):VA.defaultPointScale,QA=j?Math.exp(f.scale_1):VA.defaultPointScale,iA=j?Math.exp(f.scale_2):VA.defaultPointScale,EA=X?f.rot_1:0,sA=X?f.rot_2:0,eA=X?f.rot_3:0,fA=X?f.rot_0:1,nA=M!=null?1/(1+Math.exp(-f.opacity)):T!=null?f.alpha/W:1,rA=u!=null?f.f_dc_0*NI+.5:U!=null?f.red/b:1,hA=K!=null?f.f_dc_1*NI+.5:z!=null?f.green/Z:1,m=J!=null?f.f_dc_2*NI+.5:v!=null?f.blue/d:1;if(A(L,f.x,f.y,f.z,BA,QA,iA,EA,sA,eA,fA,nA,rA,hA,m),I&&s){if(s)for(const[$,MA]of E.entries())s[$]=f[MA];if(e)for(const[$,MA]of t.entries())e[$]=f[MA];if(n)for(const[$,MA]of i.entries())n[$]=f[MA];I(L,s,e,n)}}};this.parseData(c)}injectRgba(A){let I=0;const g=this.data;if(g==null)throw new Error("No parsed data");if(A.length!==this.numSplats*4)throw new Error("Invalid RGBA array length");for(const Q in this.elements){const C=this.elements[Q],{count:E,properties:t}=C,i=[];let s=0;const e=Q==="vertex";if(e){for(const n of["opacity","f_dc_0","f_dc_1","f_dc_2"])if(!t[n]||t[n].type!=="float")throw new Error(`Can\'t injectRgba due to property: ${n}`)}for(const[n,a]of Object.entries(t))if(a.isList)i.push(()=>{const o=FI[a.countType](g,I,this.littleEndian);I+=jA[a.countType],I+=o*jA[a.type]});else{if(e)if(n==="f_dc_0"||n==="f_dc_1"||n==="f_dc_2"){const o=Number.parseInt(n.slice(5));i.push(()=>{const r=(A[s+o]/255-.5)/NI;qg[a.type](g,I,this.littleEndian,r)})}else n==="opacity"&&i.push(()=>{const o=Math.max(-100,Math.min(100,-Math.log(1/(A[s+3]/255)-1)));qg[a.type](g,I,this.littleEndian,o)});i.push(()=>{I+=jA[a.type]})}for(let n=0;n<E;n++){for(const a of i)a();e&&(s+=4)}}}};VA.defaultPointScale=.001;let MI=VA;const NI=.28209479177387814,FI={char:(B,A,I)=>B.getInt8(A),uchar:(B,A,I)=>B.getUint8(A),short:(B,A,I)=>B.getInt16(A,I),ushort:(B,A,I)=>B.getUint16(A,I),int:(B,A,I)=>B.getInt32(A,I),uint:(B,A,I)=>B.getUint32(A,I),float:(B,A,I)=>B.getFloat32(A,I),double:(B,A,I)=>B.getFloat64(A,I)},qg={char:(B,A,I,g)=>{B.setInt8(A,g)},uchar:(B,A,I,g)=>{B.setUint8(A,g)},short:(B,A,I,g)=>{B.setInt16(A,g,I)},ushort:(B,A,I,g)=>{B.setUint16(A,g,I)},int:(B,A,I,g)=>{B.setInt32(A,g,I)},uint:(B,A,I,g)=>{B.setUint32(A,g,I)},float:(B,A,I,g)=>{B.setFloat32(A,g,I)},double:(B,A,I,g)=>{B.setFloat64(A,g,I)}},jA={char:1,uchar:1,short:2,ushort:2,int:4,uint:4,float:4,double:8},GI={char:127,uchar:255,short:32767,ushort:65535,int:2147483647,uint:4294967295,float:1,double:1},pB={0:0,9:1,24:2,45:3},dB={0:0,1:9,2:24,3:45};function zg(B){let A=0;for(;B[`f_rest_${A}`];)A+=1;const I=pB[A];if(I==null)throw new Error(`Unsupported number of SH coefficients: ${A}`);return I}var II=(B=>(B.PLY="ply",B.SPZ="spz",B.SPLAT="splat",B.KSPLAT="ksplat",B.PCSOGS="pcsogs",B.PCSOGSZIP="pcsogszip",B))(II||{});function HB(B){const A=new DataView(B.buffer);if((A.getUint32(0,!0)&16777215)===7957616)return"ply";if((A.getUint32(0,!0)&16777215)===559903){const I=mB(B,4);return new DataView(I.buffer).getUint32(0,!0)===1347635022?"spz":void 0}if(A.getUint32(0,!0)===67324752)return Tg(B)?"pcsogszip":void 0}function KB(B){const A=B.split(/[?#]/,1)[0],I=Math.max(A.lastIndexOf("/"),A.lastIndexOf("\\\\")),g=A.slice(I+1),Q=g.lastIndexOf(".");return Q<=0||Q===g.length-1?"":g.slice(Q+1).toLowerCase()}function bB(B){const A=KB(B);if(A==="ply")return"ply";if(A==="spz")return"spz";if(A==="splat")return"splat";if(A==="ksplat")return"ksplat"}function qB(B){try{let A;if(typeof B=="string")A=B;else{const g=B instanceof ArrayBuffer?new Uint8Array(B):B;if(g.length>65536)return;A=new TextDecoder().decode(g)}const I=JSON.parse(A);if(!I||typeof I!="object"||Array.isArray(I))return;for(const g of["means","scales","quats","sh0"])if(!I[g]||typeof I[g]!="object"||Array.isArray(I[g])||!I[g].shape||!I[g].files||g!=="quats"&&(!I[g].mins||!I[g].maxs))return;return I}catch{return}}function Tg(B){try{const A=B instanceof ArrayBuffer?new Uint8Array(B):B;let I=null;const g=wB(A,{filter:({name:C})=>C.split(/[\\\\/]/).pop()==="meta.json"?(I=C,!0):!1});if(!I)return;const Q=qB(g[I]);return Q?{name:I,json:Q}:void 0}catch{return}}class zB{constructor({maxSplats:A=1}={}){this.numSplats=0,this.maxSplats=UB(A).maxSplats,this.centers=new Float32Array(this.maxSplats*3),this.scales=new Float32Array(this.maxSplats*3),this.quaternions=new Float32Array(this.maxSplats*4),this.opacities=new Float32Array(this.maxSplats),this.colors=new Float32Array(this.maxSplats*3)}pushSplat(){const A=this.numSplats;return this.ensureIndex(A),this.numSplats+=1,A}unpushSplat(A){if(A===this.numSplats-1)this.numSplats-=1;else throw new Error("Cannot unpush splat from non-last position")}ensureCapacity(A){if(A>this.maxSplats){const I=Math.max(A,this.maxSplats*2),g=new Float32Array(I*3),Q=new Float32Array(I*3),C=new Float32Array(I*4),E=new Float32Array(I),t=new Float32Array(I*3);if(g.set(this.centers),Q.set(this.scales),C.set(this.quaternions),E.set(this.opacities),t.set(this.colors),this.centers=g,this.scales=Q,this.quaternions=C,this.opacities=E,this.colors=t,this.sh1){const i=new Float32Array(I*9);i.set(this.sh1),this.sh1=i}if(this.sh2){const i=new Float32Array(I*15);i.set(this.sh2),this.sh2=i}if(this.sh3){const i=new Float32Array(I*21);i.set(this.sh3),this.sh3=i}this.maxSplats=I}}ensureIndex(A){this.ensureCapacity(A+1)}setCenter(A,I,g,Q){this.centers[A*3]=I,this.centers[A*3+1]=g,this.centers[A*3+2]=Q}setScale(A,I,g,Q){this.scales[A*3]=I,this.scales[A*3+1]=g,this.scales[A*3+2]=Q}setQuaternion(A,I,g,Q,C){this.quaternions[A*4]=I,this.quaternions[A*4+1]=g,this.quaternions[A*4+2]=Q,this.quaternions[A*4+3]=C}setOpacity(A,I){this.opacities[A]=I}setColor(A,I,g,Q){this.colors[A*3]=I,this.colors[A*3+1]=g,this.colors[A*3+2]=Q}setSh1(A,I){this.sh1||(this.sh1=new Float32Array(this.maxSplats*9));for(let g=0;g<9;++g)this.sh1[A*9+g]=I[g]}setSh2(A,I){this.sh2||(this.sh2=new Float32Array(this.maxSplats*15));for(let g=0;g<15;++g)this.sh2[A*15+g]=I[g]}setSh3(A,I){this.sh3||(this.sh3=new Float32Array(this.maxSplats*21));for(let g=0;g<21;++g)this.sh3[A*21+g]=I[g]}}async function Zg(B,A,I){if(B.quats.encoding!=="quaternion_packed")throw new Error("Unsupported quaternion encoding");const g=B.means.shape[0],Q=hI(g),C=new Uint32Array(Q*4),E={},t=Promise.all([gI(A[B.means.files[0]]),gI(A[B.means.files[1]])]).then(a=>{for(let o=0;o<g;++o){const r=o*4,D=(a[0][r+0]+(a[1][r+0]<<8))/65535,c=(a[0][r+1]+(a[1][r+1]<<8))/65535,h=(a[0][r+2]+(a[1][r+2]<<8))/65535;let w=B.means.mins[0]+(B.means.maxs[0]-B.means.mins[0])*D,y=B.means.mins[1]+(B.means.maxs[1]-B.means.mins[1])*c,l=B.means.mins[2]+(B.means.maxs[2]-B.means.mins[2])*h;w=Math.sign(w)*(Math.exp(Math.abs(w))-1),y=Math.sign(y)*(Math.exp(Math.abs(y))-1),l=Math.sign(l)*(Math.exp(Math.abs(l))-1),Lg(C,o,w,y,l)}}),i=gI(A[B.scales.files[0]]).then(a=>{for(let o=0;o<g;++o){const r=o*4,D=a[r+0]/255,c=a[r+1]/255,h=a[r+2]/255,w=B.scales.mins[0]+(B.scales.maxs[0]-B.scales.mins[0])*D,y=B.scales.mins[1]+(B.scales.maxs[1]-B.scales.mins[1])*c,l=B.scales.mins[2]+(B.scales.maxs[2]-B.scales.mins[2])*h;pg(C,o,Math.exp(w),Math.exp(y),Math.exp(l),I)}}),s=gI(A[B.quats.files[0]]).then(a=>{const o=Math.sqrt(2);for(let r=0;r<g;++r){const D=r*4,c=(a[D+0]/255-.5)*o,h=(a[D+1]/255-.5)*o,w=(a[D+2]/255-.5)*o,y=Math.sqrt(Math.max(0,1-c*c-h*h-w*w)),l=a[D+3]-252,G=l===0?c:l===1?y:h,k=l<=1?h:l===2?y:w,p=l<=2?w:y;dg(C,r,G,k,p,l===0?y:c)}}),e=gI(A[B.sh0.files[0]]).then(a=>{const o=.28209479177387814;for(let r=0;r<g;++r){const D=r*4,c=a[D+0]/255,h=a[D+1]/255,w=a[D+2]/255,y=a[D+3]/255,l=B.sh0.mins[0]+(B.sh0.maxs[0]-B.sh0.mins[0])*c,G=B.sh0.mins[1]+(B.sh0.maxs[1]-B.sh0.mins[1])*h,k=B.sh0.mins[2]+(B.sh0.maxs[2]-B.sh0.mins[2])*w,p=B.sh0.mins[3]+(B.sh0.maxs[3]-B.sh0.mins[3])*y,F=o*l+.5,N=o*G+.5,x=o*k+.5,S=1/(1+Math.exp(-p));fB(C,r,F,N,x,S,I)}}),n=[t,i,s,e];if(B.shN){const a=B.shN.shape[1]>=45,o=B.shN.shape[1]>=24,r=B.shN.shape[1]>=9;r&&(E.sh1=new Uint32Array(g*2)),o&&(E.sh2=new Uint32Array(g*4)),a&&(E.sh3=new Uint32Array(g*4));const D=new Float32Array(9),c=new Float32Array(15),h=new Float32Array(21),w=B.shN,y=Promise.all([ZI(A[B.shN.files[0]]),ZI(A[B.shN.files[1]])]).then(([l,G])=>{for(let k=0;k<g;++k){const p=k*4,F=G.rgba[p+0]+(G.rgba[p+1]<<8),N=(F&63)*15,S=(F>>>6)*l.width+N;for(let M=0;M<3;++M){if(r)for(let u=0;u<3;++u)D[u*3+M]=w.mins+(w.maxs-w.mins)*l.rgba[(S+u)*4+M]/255;if(o)for(let u=0;u<5;++u)c[u*3+M]=w.mins+(w.maxs-w.mins)*l.rgba[(S+3+u)*4+M]/255;if(a)for(let u=0;u<7;++u)h[u*3+M]=w.mins+(w.maxs-w.mins)*l.rgba[(S+8+u)*4+M]/255}r&&DI(E.sh1,k,D,I),o&&wI(E.sh2,k,c,I),a&&yI(E.sh3,k,h,I)}});n.push(y)}return await Promise.all(n),{packedArray:C,numSplats:g,extra:E}}let SI=null;async function ZI(B){if(!SI&&(SI=new OffscreenCanvas(1,1).getContext("webgl2"),!SI))throw new Error("Failed to create WebGL2 context");const A=new Blob([B]),I=await createImageBitmap(A,{premultiplyAlpha:"none"}),g=SI,Q=g.createTexture();g.bindTexture(g.TEXTURE_2D,Q),g.pixelStorei(g.UNPACK_FLIP_Y_WEBGL,!0),g.texImage2D(g.TEXTURE_2D,0,g.RGBA,g.RGBA,g.UNSIGNED_BYTE,I),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MAG_FILTER,g.NEAREST),g.texParameteri(g.TEXTURE_2D,g.TEXTURE_MIN_FILTER,g.NEAREST);const C=g.createFramebuffer();g.bindFramebuffer(g.FRAMEBUFFER,C),g.framebufferTexture2D(g.FRAMEBUFFER,g.COLOR_ATTACHMENT0,g.TEXTURE_2D,Q,0);const E=new Uint8Array(I.width*I.height*4);return g.readPixels(0,0,I.width,I.height,g.RGBA,g.UNSIGNED_BYTE,E),g.deleteTexture(Q),g.deleteFramebuffer(C),{rgba:E,width:I.width,height:I.height}}async function gI(B){const{rgba:A}=await ZI(B);return A}async function TB(B,A){var a;const I=Tg(B);if(!I)throw new Error("Invalid PC SOGS zip file");const{name:g,json:Q}=I,C=g.lastIndexOf("/"),E=g.lastIndexOf("\\\\"),t=g.slice(0,Math.max(C,E)+1),i=new Map,s=[...Q.means.files,...Q.scales.files,...Q.quats.files,...Q.sh0.files,...((a=Q.shN)==null?void 0:a.files)??[]];for(const o of s)i.set(t+o,o);const e=await new Promise((o,r)=>{DB(B,{filter:({name:D})=>i.has(D)},(D,c)=>{D?r(D):o(c)})}),n={};for(const[o,r]of i.entries())n[r]=e[o];return await Zg(Q,n,A)}class vg{constructor({fileBytes:A}){this.fileBytes=A instanceof ArrayBuffer?new Uint8Array(A):A,this.reader=new xB({fileBytes:this.fileBytes});const I=new DataView(this.reader.read(16).buffer);if(I.getUint32(0,!0)!==1347635022)throw new Error("Invalid SPZ file");if(this.version=I.getUint32(4,!0),this.version<1||this.version>2)throw new Error(`Unsupported SPZ version: ${this.version}`);this.numSplats=I.getUint32(8,!0),this.shDegree=I.getUint8(12),this.fractionalBits=I.getUint8(13),this.flags=I.getUint8(14),this.flagAntiAlias=(this.flags&1)!==0,this.reserved=I.getUint8(15),this.parsed=!1}parseSplats(A,I,g,Q,C,E){if(this.parsed)throw new Error("SPZ file already parsed");if(this.parsed=!0,this.version===1){const t=this.reader.read(this.numSplats*3*2),i=new Uint16Array(t.buffer);for(let s=0;s<this.numSplats;s++){const e=s*3,n=O(i[e]),a=O(i[e+1]),o=O(i[e+2]);A==null||A(s,n,a,o)}}else if(this.version===2){const t=1<<this.fractionalBits,i=this.reader.read(this.numSplats*3*3);for(let s=0;s<this.numSplats;s++){const e=s*9,n=((i[e+2]<<24|i[e+1]<<16|i[e]<<8)>>8)/t,a=((i[e+5]<<24|i[e+4]<<16|i[e+3]<<8)>>8)/t,o=((i[e+8]<<24|i[e+7]<<16|i[e+6]<<8)>>8)/t;A==null||A(s,n,a,o)}}else throw new Error("Unreachable");{const t=this.reader.read(this.numSplats);for(let i=0;i<this.numSplats;i++)I==null||I(i,t[i]/255)}{const t=this.reader.read(this.numSplats*3),i=_g/.15;for(let s=0;s<this.numSplats;s++){const e=s*3,n=(t[e]/255-.5)*i+.5,a=(t[e+1]/255-.5)*i+.5,o=(t[e+2]/255-.5)*i+.5;g==null||g(s,n,a,o)}}{const t=this.reader.read(this.numSplats*3);for(let i=0;i<this.numSplats;i++){const s=i*3,e=Math.exp(t[s]/16-10),n=Math.exp(t[s+1]/16-10),a=Math.exp(t[s+2]/16-10);Q==null||Q(i,e,n,a)}}{const t=this.reader.read(this.numSplats*3);for(let i=0;i<this.numSplats;i++){const s=i*3,e=t[s]/127.5-1,n=t[s+1]/127.5-1,a=t[s+2]/127.5-1,o=Math.sqrt(Math.max(0,1-e*e-n*n-a*a));C==null||C(i,e,n,a,o)}}if(E&&this.shDegree>=1){const t=new Float32Array(9),i=this.shDegree>=2?new Float32Array(5*3):void 0,s=this.shDegree>=3?new Float32Array(7*3):void 0,e=this.reader.read(this.numSplats*Xg[this.shDegree]*3);let n=0;for(let a=0;a<this.numSplats;a++){for(let o=0;o<9;++o)t[o]=(e[n+o]-128)/128;if(n+=9,i){for(let o=0;o<15;++o)i[o]=(e[n+o]-128)/128;n+=15}if(s){for(let o=0;o<21;++o)s[o]=(e[n+o]-128)/128;n+=21}E==null||E(a,t,i,s)}}}}const Xg={1:3,2:8,3:15},_g=.28209479177387814,ZB=1347635022,vB=2,XB=1;class JA{constructor({numSplats:A,shDegree:I,fractionalBits:g=12,flagAntiAlias:Q=!0}){this.clippedCount=0;const C=19+(I>=1?9:0)+(I>=2?15:0)+(I>=3?21:0),E=16+A*C;this.buffer=new ArrayBuffer(E),this.view=new DataView(this.buffer),this.view.setUint32(0,ZB,!0),this.view.setUint32(4,vB,!0),this.view.setUint32(8,A,!0),this.view.setUint8(12,I),this.view.setUint8(13,g),this.view.setUint8(14,Q?XB:0),this.view.setUint8(15,0),this.numSplats=A,this.shDegree=I,this.fractionalBits=g,this.fraction=1<<g,this.flagAntiAlias=Q}setCenter(A,I,g,Q){const C=Math.round(I*this.fraction),E=Math.max(-8388607,Math.min(8388607,C)),t=Math.round(g*this.fraction),i=Math.max(-8388607,Math.min(8388607,t)),s=Math.round(Q*this.fraction),e=Math.max(-8388607,Math.min(8388607,s));(C!==E||t!==i||s!==e)&&(this.clippedCount+=1);const o=16+A*9;this.view.setUint8(o,E&255),this.view.setUint8(o+1,E>>8&255),this.view.setUint8(o+2,E>>16&255),this.view.setUint8(o+3,i&255),this.view.setUint8(o+4,i>>8&255),this.view.setUint8(o+5,i>>16&255),this.view.setUint8(o+6,e&255),this.view.setUint8(o+7,e>>8&255),this.view.setUint8(o+8,e>>16&255)}setAlpha(A,I){const g=16+this.numSplats*9+A;this.view.setUint8(g,Math.max(0,Math.min(255,Math.round(I*255))))}static scaleRgb(A){const I=((A-.5)/(_g/.15)+.5)*255;return Math.max(0,Math.min(255,Math.round(I)))}setRgb(A,I,g,Q){const C=16+this.numSplats*10+A*3;this.view.setUint8(C,JA.scaleRgb(I)),this.view.setUint8(C+1,JA.scaleRgb(g)),this.view.setUint8(C+2,JA.scaleRgb(Q))}setScale(A,I,g,Q){const C=16+this.numSplats*13+A*3;this.view.setUint8(C,Math.max(0,Math.min(255,Math.round((Math.log(I)+10)*16)))),this.view.setUint8(C+1,Math.max(0,Math.min(255,Math.round((Math.log(g)+10)*16)))),this.view.setUint8(C+2,Math.max(0,Math.min(255,Math.round((Math.log(Q)+10)*16))))}setQuat(A,I,g,Q,C){const E=16+this.numSplats*16+A*3,t=C<0;this.view.setUint8(E,Math.max(0,Math.min(255,Math.round(((t?-I:I)+1)*127.5)))),this.view.setUint8(E+1,Math.max(0,Math.min(255,Math.round(((t?-g:g)+1)*127.5)))),this.view.setUint8(E+2,Math.max(0,Math.min(255,Math.round(((t?-Q:Q)+1)*127.5))))}static quantizeSh(A,I){const g=Math.round(A*128)+128,Q=1<<8-I,C=Math.floor((g+Q/2)/Q)*Q;return Math.max(0,Math.min(255,C))}setSh(A,I,g,Q){const C=Xg[this.shDegree]||0,E=16+this.numSplats*19+A*C*3;for(let t=0;t<9;++t)this.view.setUint8(E+t,JA.quantizeSh(I[t],5));if(g){const t=E+9;for(let i=0;i<15;++i)this.view.setUint8(t+i,JA.quantizeSh(g[i],4));if(Q){const i=t+15;for(let s=0;s<21;++s)this.view.setUint8(i+s,JA.quantizeSh(Q[s],4))}}}async finalize(){const A=new Uint8Array(this.buffer),g=new ReadableStream({async start(E){E.enqueue(A),E.close()}}).pipeThrough(new CompressionStream("gzip")),C=await new Response(g).arrayBuffer();return console.log("Compressed",A.length,"bytes to",C.byteLength,"bytes"),new Uint8Array(C)}}async function _B(B){var e,n,a;const A=new zB,{inputs:I,clipXyz:g,maxSh:Q,fractionalBits:C=12,opacityThreshold:E}=B;for(const o of I){let r=function(F){return F.multiplyScalar(y),F.applyQuaternion(l),F.add(G),F},D=function(F){return F.multiplyScalar(y),F},c=function(F){return F.premultiply(l),F},h=function(F){return!k||k.containsPoint(F)},w=function(F){return E!==void 0?F>=E:!0};const y=((e=o.transform)==null?void 0:e.scale)??1,l=new UA().fromArray(((n=o.transform)==null?void 0:n.quaternion)??[0,0,0,1]),G=new R().fromArray(((a=o.transform)==null?void 0:a.translate)??[0,0,0]),k=g?new fg(new R().fromArray(g.min),new R().fromArray(g.max)):void 0;let p=o.fileType;switch(p||(p=HB(o.fileBytes),!p&&o.pathOrUrl&&(p=bB(o.pathOrUrl))),p){case II.PLY:{const F=new MI({fileBytes:o.fileBytes});await F.parseHeader();let N=null;F.parseSplats((x,S,M,u,K,J,U,z,v,T,j,X,W,b,Z)=>{const d=r(new R(S,M,u));if(h(d)&&w(X)){N=A.pushSplat(),A.setCenter(N,d.x,d.y,d.z);const L=D(new R(K,J,U));A.setScale(N,L.x,L.y,L.z);const f=c(new UA(z,v,T,j));A.setQuaternion(N,f.x,f.y,f.z,f.w),A.setOpacity(N,X),A.setColor(N,W,b,Z)}else N=null},(x,S,M,u)=>{S&&N!==null&&A.setSh1(N,S),M&&N!==null&&A.setSh2(N,M),u&&N!==null&&A.setSh3(N,u)});break}case II.SPZ:{const F=new vg({fileBytes:o.fileBytes}),N=new Int32Array(F.numSplats);N.fill(-1);const x=new Float32Array(F.numSplats*3),S=new R;F.parseSplats((M,u,K,J)=>{const U=r(new R(u,K,J));x[M*3]=U.x,x[M*3+1]=U.y,x[M*3+2]=U.z},(M,u)=>{S.fromArray(x,M*3),h(S)&&w(u)&&(N[M]=A.pushSplat(),A.setCenter(N[M],S.x,S.y,S.z),A.setOpacity(N[M],u))},(M,u,K,J)=>{N[M]>=0&&A.setColor(N[M],u,K,J)},(M,u,K,J)=>{if(N[M]>=0){const U=D(new R(u,K,J));A.setScale(N[M],U.x,U.y,U.z)}},(M,u,K,J,U)=>{if(N[M]>=0){const z=c(new UA(u,K,J,U));A.setQuaternion(N[M],z.x,z.y,z.z,z.w)}},(M,u,K,J)=>{N[M]>=0&&(A.setSh1(N[M],u),K&&A.setSh2(N[M],K),J&&A.setSh3(N[M],J))});break}case II.SPLAT:Kg(o.fileBytes,F=>{},(F,N,x,S,M,u,K,J,U,z,v,T,j,X,W)=>{const b=r(new R(N,x,S));if(h(b)&&w(T)){const Z=A.pushSplat();A.setCenter(Z,b.x,b.y,b.z);const d=D(new R(M,u,K));A.setScale(Z,d.x,d.y,d.z);const L=c(new UA(J,U,z,v));A.setQuaternion(Z,L.x,L.y,L.z,L.w),A.setOpacity(Z,T),A.setColor(Z,j,X,W)}});break;case II.KSPLAT:{let F=null;JB(o.fileBytes,N=>{},(N,x,S,M,u,K,J,U,z,v,T,j,X,W,b)=>{const Z=r(new R(x,S,M));if(h(Z)&&w(j)){F=A.pushSplat(),A.setCenter(F,Z.x,Z.y,Z.z);const d=D(new R(u,K,J));A.setScale(F,d.x,d.y,d.z);const L=c(new UA(U,z,v,T));A.setQuaternion(F,L.x,L.y,L.z,L.w),A.setOpacity(F,j),A.setColor(F,X,W,b)}else F=null},(N,x,S,M)=>{F!==null&&(A.setSh1(F,x),S&&A.setSh2(F,S),M&&A.setSh3(F,M))});break}default:throw new Error(`transcodeSpz not implemented for ${p}`)}}const t=Math.min(Q??3,A.sh3?3:A.sh2?2:A.sh1?1:0),i=new JA({numSplats:A.numSplats,shDegree:t,fractionalBits:C,flagAntiAlias:!0});for(let o=0;o<A.numSplats;++o){const r=o*3,D=o*4;i.setCenter(o,A.centers[r],A.centers[r+1],A.centers[r+2]),i.setScale(o,A.scales[r],A.scales[r+1],A.scales[r+2]),i.setQuat(o,A.quaternions[D],A.quaternions[D+1],A.quaternions[D+2],A.quaternions[D+3]),i.setAlpha(o,A.opacities[o]),i.setRgb(o,A.colors[r],A.colors[r+1],A.colors[r+2]),A.sh1&&t>=1&&i.setSh(o,A.sh1.slice(o*9,(o+1)*9),t>=2&&A.sh2?A.sh2.slice(o*15,(o+1)*15):void 0,t>=3&&A.sh3?A.sh3.slice(o*21,(o+1)*21):void 0)}return{fileBytes:await i.finalize(),clippedCount:i.clippedCount}}async function Wg(B){const{name:A,args:I,id:g}=B.data;let Q,C;try{switch(A){case"unpackPly":{const{packedArray:E,fileBytes:t,splatEncoding:i}=I,s=await WB({packedArray:E,fileBytes:t,splatEncoding:i});Q={id:g,numSplats:s.numSplats,packedArray:s.packedArray,extra:s.extra};break}case"decodeSpz":{const{fileBytes:E,splatEncoding:t}=I,i=jB(E,t);Q={id:g,numSplats:i.numSplats,packedArray:i.packedArray,extra:i.extra};break}case"decodeAntiSplat":{const{fileBytes:E,splatEncoding:t}=I,i=YB(E,t);Q={id:g,numSplats:i.numSplats,packedArray:i.packedArray};break}case"decodeKsplat":{const{fileBytes:E,splatEncoding:t}=I,i=LB(E,t);Q={id:g,numSplats:i.numSplats,packedArray:i.packedArray,extra:i.extra};break}case"decodePcSogs":{const{fileBytes:E,extraFiles:t,splatEncoding:i}=I,s=JSON.parse(new TextDecoder().decode(E)),e=await Zg(s,t,i);Q={id:g,numSplats:e.numSplats,packedArray:e.packedArray,extra:e.extra};break}case"decodePcSogsZip":{const{fileBytes:E,splatEncoding:t}=I,i=await TB(E,t);Q={id:g,numSplats:i.numSplats,packedArray:i.packedArray,extra:i.extra};break}case"sortSplats":{const{totalSplats:E,readback:t,ordering:i}=I;Q={id:g,readback:t,...VB({totalSplats:E,readback:t,ordering:i})};break}case"sortDoubleSplats":{const{numSplats:E,readback:t,ordering:i}=I;Q={id:g,readback:t,ordering:i,activeSplats:Og(E,t,i)};break}case"sort32Splats":{const{numSplats:E,readback:t,ordering:i}=I;Q={id:g,readback:t,ordering:i,activeSplats:$g(E,t,i)};break}case"transcodeSpz":{const E=I,t=await _B(E);Q={id:g,fileBytes:t,input:E};break}default:throw new Error(`Unknown name: ${A}`)}}catch(E){C=E,console.error(C)}self.postMessage({id:g,result:Q,error:C},{transfer:uB(Q)})}async function WB({packedArray:B,fileBytes:A,splatEncoding:I}){const g=new MI({fileBytes:A});await g.parseHeader();const Q=g.numSplats,C={};return g.parseSplats((E,t,i,s,e,n,a,o,r,D,c,h,w,y,l)=>{TI(B,E,t,i,s,e,n,a,o,r,D,c,h,w,y,l,I)},(E,t,i,s)=>{t&&(C.sh1||(C.sh1=new Uint32Array(Q*2)),DI(C.sh1,E,t,I)),i&&(C.sh2||(C.sh2=new Uint32Array(Q*4)),wI(C.sh2,E,i,I)),s&&(C.sh3||(C.sh3=new Uint32Array(Q*4)),yI(C.sh3,E,s,I))}),{packedArray:B,numSplats:Q,extra:C}}function jB(B,A){const I=new vg({fileBytes:B}),g=I.numSplats,Q=hI(g),C=new Uint32Array(Q*4),E={};return I.parseSplats((t,i,s,e)=>{Lg(C,t,i,s,e)},(t,i)=>{RB(C,t,i)},(t,i,s,e)=>{kB(C,t,i,s,e,A)},(t,i,s,e)=>{pg(C,t,i,s,e,A)},(t,i,s,e,n)=>{dg(C,t,i,s,e,n)},(t,i,s,e)=>{i&&(E.sh1||(E.sh1=new Uint32Array(g*2)),DI(E.sh1,t,i,A)),s&&(E.sh2||(E.sh2=new Uint32Array(g*4)),wI(E.sh2,t,s,A)),e&&(E.sh3||(E.sh3=new Uint32Array(g*4)),yI(E.sh3,t,e,A))}),{packedArray:C,numSplats:g,extra:E}}const vI=31744,uI=vI+1;let GA=null;function VB({totalSplats:B,readback:A,ordering:I}){GA||(GA=new Uint32Array(uI)),GA.fill(0);const g=A.map(i=>new Uint32Array(i.buffer)),Q=g[0].length,C=Math.ceil(B/Q);let E=0;for(let i=0;i<C;++i){const s=g[i],e=Math.min(s.length,B-E);for(let n=0;n<e;++n){const a=s[n]&32767;a<vI&&(GA[a]+=1)}E+=e}let t=0;for(let i=0;i<uI;++i){const s=t+GA[i];GA[i]=t,t=s}E=0;for(let i=0;i<C;++i){const s=g[i],e=Math.min(s.length,B-E);for(let n=0;n<e;++n){const a=s[n]&32767;a<vI&&(I[GA[a]]=E+n,GA[a]+=1)}E+=e}if(GA[uI-1]!==t)throw new Error(`Expected ${t} active splats but got ${GA[uI-1]}`);return{activeSplats:t,ordering:I}}const XI=[];function jg(B){XI.push(B)}async function PB(){self.addEventListener("message",jg),await Bg(),self.removeEventListener("message",jg),self.addEventListener("message",Wg);for(const B of XI)Wg(B);XI.length=0}PB().catch(console.error)})();\n//# sourceMappingURL=worker-BAWC1SCO.js.map\n', lg = typeof self < "u" && self.Blob && new Blob([Ki], { type: "text/javascript;charset=utf-8" });
|
|
function po(t) {
|
|
let A;
|
|
try {
|
|
if (A = lg && (self.URL || self.webkitURL).createObjectURL(lg), !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(Ki),
|
|
{
|
|
name: t == null ? void 0 : t.name
|
|
}
|
|
);
|
|
} finally {
|
|
A && (self.URL || self.webkitURL).revokeObjectURL(A);
|
|
}
|
|
}
|
|
class fo {
|
|
constructor() {
|
|
this.messages = {}, this.messageIdNext = 0, this.worker = new po(), this.worker.onmessage = (A) => this.onMessage(A);
|
|
}
|
|
makeMessageId() {
|
|
return ++this.messageIdNext;
|
|
}
|
|
makeMessagePromiseId() {
|
|
const A = this.makeMessageId(), e = new Promise((g, I) => {
|
|
this.messages[A] = { resolve: g, reject: I };
|
|
});
|
|
return { id: A, promise: e };
|
|
}
|
|
onMessage(A) {
|
|
const { id: e, result: g, error: I } = A.data, s = this.messages[e];
|
|
s && (delete this.messages[e], I ? s.reject(I) : s.resolve(g));
|
|
}
|
|
// Invoke an RPC on the worker with the given name and arguments.
|
|
// The normal usage of a worker is to run one activity at a time,
|
|
// but this function allows for concurrent calls, tagging each request
|
|
// with a unique message Id and awaiting a response to that same Id.
|
|
// The method will automatically transfer any ArrayBuffers in the
|
|
// arguments to the worker. If you'd like to transfer a copy of a
|
|
// buffer then you must clone it before passing to this function.
|
|
async call(A, e) {
|
|
const { id: g, promise: I } = this.makeMessagePromiseId();
|
|
return this.worker.postMessage(
|
|
{ name: A, args: e, id: g },
|
|
{ transfer: bI(e) }
|
|
), I;
|
|
}
|
|
}
|
|
let qi = 4, oe = 0;
|
|
const zi = [], Zi = [];
|
|
async function Mo() {
|
|
const t = zi.shift();
|
|
if (t)
|
|
return t;
|
|
if (oe < qi) {
|
|
const A = new fo();
|
|
return oe += 1, A;
|
|
}
|
|
return new Promise((A) => {
|
|
Zi.push(A);
|
|
});
|
|
}
|
|
function mo(t) {
|
|
if (oe > qi) {
|
|
oe -= 1;
|
|
return;
|
|
}
|
|
const A = Zi.shift();
|
|
if (A) {
|
|
A(t);
|
|
return;
|
|
}
|
|
zi.push(t);
|
|
}
|
|
async function at(t) {
|
|
const A = await Mo();
|
|
try {
|
|
return await t(A);
|
|
} finally {
|
|
mo(A);
|
|
}
|
|
}
|
|
class So extends lQ {
|
|
constructor(A) {
|
|
super(A), this.fileLoader = new uQ(A);
|
|
}
|
|
load(A, e, g, I) {
|
|
const s = this.manager.resolveURL(
|
|
(this.path ?? "") + (A ?? "")
|
|
), B = new Headers(this.requestHeader), i = this.withCredentials ? "include" : "same-origin", Q = new Request(s, { headers: B, credentials: i });
|
|
let C = this.fileType;
|
|
this.manager.itemStart(s), ug(Q, g).then(async (a) => {
|
|
var l;
|
|
const n = [
|
|
new ProgressEvent("progress", {
|
|
lengthComputable: !0,
|
|
loaded: a.byteLength,
|
|
total: a.byteLength
|
|
})
|
|
];
|
|
function o() {
|
|
if (g) {
|
|
const u = n.every((y) => y.lengthComputable || y.loaded === 0 && y.total === 0), w = n.reduce((y, d) => y + d.loaded, 0), D = n.reduce((y, d) => y + d.total, 0);
|
|
g(
|
|
new ProgressEvent("progress", {
|
|
lengthComputable: u,
|
|
loaded: w,
|
|
total: D
|
|
})
|
|
);
|
|
}
|
|
}
|
|
const r = {}, h = [], c = ig(a);
|
|
if (C === "pcsogs" && c === void 0)
|
|
throw new Error("Invalid PC SOGS file");
|
|
if (c !== void 0) {
|
|
C = "pcsogs";
|
|
for (const u of ["means", "scales", "quats", "sh0", "shN"]) {
|
|
const w = c[u];
|
|
if (w)
|
|
for (const D of w.files) {
|
|
const y = new URL(D, s).toString(), d = n.length;
|
|
n.push(new ProgressEvent("progress")), this.manager.itemStart(y);
|
|
const S = new Request(y, { headers: B, credentials: i }), M = ug(S, (p) => {
|
|
n[d] = p, o();
|
|
}).then((p) => {
|
|
r[D] = p;
|
|
}).catch((p) => {
|
|
throw this.manager.itemError(y), p;
|
|
}).finally(() => {
|
|
this.manager.itemEnd(y);
|
|
});
|
|
h.push(M);
|
|
}
|
|
}
|
|
}
|
|
if (await Promise.all(h), e) {
|
|
const u = ((l = this.packedSplats) == null ? void 0 : l.splatEncoding) ?? De, w = await Wi({
|
|
input: a,
|
|
extraFiles: r,
|
|
fileType: C,
|
|
pathOrUrl: s,
|
|
splatEncoding: u
|
|
});
|
|
this.packedSplats ? (this.packedSplats.initialize(w), e(this.packedSplats)) : e(new ZA(w));
|
|
}
|
|
}).catch((a) => {
|
|
this.manager.itemError(s), I == null || I(a);
|
|
}).finally(() => {
|
|
this.manager.itemEnd(s);
|
|
});
|
|
}
|
|
async loadAsync(A, e) {
|
|
return new Promise((g, I) => {
|
|
this.load(
|
|
A,
|
|
(s) => {
|
|
g(s);
|
|
},
|
|
e,
|
|
I
|
|
);
|
|
});
|
|
}
|
|
parse(A) {
|
|
return new PA({ packedSplats: A });
|
|
}
|
|
}
|
|
async function ug(t, A) {
|
|
const e = await fetch(t);
|
|
if (!e.ok)
|
|
throw new Error(
|
|
`${e.status} "${e.statusText}" fetching URL: ${t.url}`
|
|
);
|
|
if (!e.body)
|
|
throw new Error(`Response body is null for URL: ${t.url}`);
|
|
const g = e.body.getReader(), I = Number.parseInt(
|
|
e.headers.get("Content-Length") || "0"
|
|
), s = Number.isNaN(I) ? 0 : I;
|
|
let B = 0;
|
|
const i = [];
|
|
for (; ; ) {
|
|
const { done: a, value: n } = await g.read();
|
|
if (a)
|
|
break;
|
|
i.push(n), B += n.length, A && A(
|
|
new ProgressEvent("progress", {
|
|
lengthComputable: s !== 0,
|
|
loaded: B,
|
|
total: s
|
|
})
|
|
);
|
|
}
|
|
const Q = new Uint8Array(B);
|
|
let C = 0;
|
|
for (const a of i)
|
|
Q.set(a, C), C += a.length;
|
|
return Q.buffer;
|
|
}
|
|
var vt = /* @__PURE__ */ ((t) => (t.PLY = "ply", t.SPZ = "spz", t.SPLAT = "splat", t.KSPLAT = "ksplat", t.PCSOGS = "pcsogs", t.PCSOGSZIP = "pcsogszip", t))(vt || {});
|
|
function Vi(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 = XI(t, 4);
|
|
return new DataView(e.buffer).getUint32(0, !0) === 1347635022 ? "spz" : void 0;
|
|
}
|
|
if (A.getUint32(0, !0) === 67324752)
|
|
return Fo(t) ? "pcsogszip" : void 0;
|
|
}
|
|
function No(t) {
|
|
const A = t.split(/[?#]/, 1)[0], e = Math.max(
|
|
A.lastIndexOf("/"),
|
|
A.lastIndexOf("\\")
|
|
), g = A.slice(e + 1), I = g.lastIndexOf(".");
|
|
return I <= 0 || I === g.length - 1 ? "" : g.slice(I + 1).toLowerCase();
|
|
}
|
|
function Xi(t) {
|
|
const A = No(t);
|
|
if (A === "ply")
|
|
return "ply";
|
|
if (A === "spz")
|
|
return "spz";
|
|
if (A === "splat")
|
|
return "splat";
|
|
if (A === "ksplat")
|
|
return "ksplat";
|
|
}
|
|
function xr(t) {
|
|
return ig(t) !== void 0;
|
|
}
|
|
function ig(t) {
|
|
try {
|
|
let A;
|
|
if (typeof t == "string")
|
|
A = t;
|
|
else {
|
|
const g = t instanceof ArrayBuffer ? new Uint8Array(t) : t;
|
|
if (g.length > 65536)
|
|
return;
|
|
A = new TextDecoder().decode(g);
|
|
}
|
|
const e = JSON.parse(A);
|
|
if (!e || typeof e != "object" || Array.isArray(e))
|
|
return;
|
|
for (const g of ["means", "scales", "quats", "sh0"])
|
|
if (!e[g] || typeof e[g] != "object" || Array.isArray(e[g]) || !e[g].shape || !e[g].files || g !== "quats" && (!e[g].mins || !e[g].maxs))
|
|
return;
|
|
return e;
|
|
} catch {
|
|
return;
|
|
}
|
|
}
|
|
function Fo(t) {
|
|
try {
|
|
const A = t instanceof ArrayBuffer ? new Uint8Array(t) : t;
|
|
let e = null;
|
|
const g = vQ(A, {
|
|
filter: ({ name: s }) => s.split(/[\\/]/).pop() === "meta.json" ? (e = s, !0) : !1
|
|
});
|
|
if (!e)
|
|
return;
|
|
const I = ig(g[e]);
|
|
return I ? { name: e, json: I } : void 0;
|
|
} catch {
|
|
return;
|
|
}
|
|
}
|
|
async function Wi({
|
|
input: t,
|
|
extraFiles: A,
|
|
fileType: e,
|
|
pathOrUrl: g,
|
|
splatEncoding: I
|
|
}) {
|
|
const s = t instanceof ArrayBuffer ? new Uint8Array(t) : t;
|
|
let B = e;
|
|
switch (e || (B = Vi(s), !B && g && (B = Xi(g))), B) {
|
|
case "ply": {
|
|
const i = new Ee({ fileBytes: s });
|
|
await i.parseHeader();
|
|
const Q = i.numSplats, C = fA(Q).maxSplats, a = {
|
|
fileBytes: s,
|
|
packedArray: new Uint32Array(C * 4),
|
|
splatEncoding: I
|
|
};
|
|
return await at(async (n) => {
|
|
const { packedArray: o, numSplats: r, extra: h } = await n.call(
|
|
"unpackPly",
|
|
a
|
|
);
|
|
return { packedArray: o, numSplats: r, extra: h };
|
|
});
|
|
}
|
|
case "spz":
|
|
return await at(async (i) => {
|
|
const { packedArray: Q, numSplats: C, extra: a } = await i.call(
|
|
"decodeSpz",
|
|
{
|
|
fileBytes: s,
|
|
splatEncoding: I
|
|
}
|
|
);
|
|
return { packedArray: Q, numSplats: C, extra: a };
|
|
});
|
|
case "splat":
|
|
return await at(async (i) => {
|
|
const { packedArray: Q, numSplats: C } = await i.call(
|
|
"decodeAntiSplat",
|
|
{
|
|
fileBytes: s,
|
|
splatEncoding: I
|
|
}
|
|
);
|
|
return { packedArray: Q, numSplats: C };
|
|
});
|
|
case "ksplat":
|
|
return await at(async (i) => {
|
|
const { packedArray: Q, numSplats: C, extra: a } = await i.call(
|
|
"decodeKsplat",
|
|
{ fileBytes: s, splatEncoding: I }
|
|
);
|
|
return { packedArray: Q, numSplats: C, extra: a };
|
|
});
|
|
case "pcsogs":
|
|
return await at(async (i) => {
|
|
const { packedArray: Q, numSplats: C, extra: a } = await i.call(
|
|
"decodePcSogs",
|
|
{ fileBytes: s, extraFiles: A, splatEncoding: I }
|
|
);
|
|
return { packedArray: Q, numSplats: C, extra: a };
|
|
});
|
|
case "pcsogszip":
|
|
return await at(async (i) => {
|
|
const { packedArray: Q, numSplats: C, extra: a } = await i.call(
|
|
"decodePcSogsZip",
|
|
{ fileBytes: s, splatEncoding: I }
|
|
);
|
|
return { packedArray: Q, numSplats: C, extra: a };
|
|
});
|
|
default:
|
|
throw new Error(`Unknown splat file type: ${B}`);
|
|
}
|
|
}
|
|
class Go {
|
|
constructor({ maxSplats: A = 1 } = {}) {
|
|
this.numSplats = 0, this.maxSplats = fA(A).maxSplats, this.centers = new Float32Array(this.maxSplats * 3), this.scales = new Float32Array(this.maxSplats * 3), this.quaternions = new Float32Array(this.maxSplats * 4), this.opacities = new Float32Array(this.maxSplats), this.colors = new Float32Array(this.maxSplats * 3);
|
|
}
|
|
pushSplat() {
|
|
const A = this.numSplats;
|
|
return this.ensureIndex(A), this.numSplats += 1, A;
|
|
}
|
|
unpushSplat(A) {
|
|
if (A === this.numSplats - 1)
|
|
this.numSplats -= 1;
|
|
else
|
|
throw new Error("Cannot unpush splat from non-last position");
|
|
}
|
|
ensureCapacity(A) {
|
|
if (A > this.maxSplats) {
|
|
const e = Math.max(A, this.maxSplats * 2), g = new Float32Array(e * 3), I = new Float32Array(e * 3), s = new Float32Array(e * 4), B = new Float32Array(e), i = new Float32Array(e * 3);
|
|
if (g.set(this.centers), I.set(this.scales), s.set(this.quaternions), B.set(this.opacities), i.set(this.colors), this.centers = g, this.scales = I, this.quaternions = s, this.opacities = B, this.colors = i, this.sh1) {
|
|
const Q = new Float32Array(e * 9);
|
|
Q.set(this.sh1), this.sh1 = Q;
|
|
}
|
|
if (this.sh2) {
|
|
const Q = new Float32Array(e * 15);
|
|
Q.set(this.sh2), this.sh2 = Q;
|
|
}
|
|
if (this.sh3) {
|
|
const Q = new Float32Array(e * 21);
|
|
Q.set(this.sh3), this.sh3 = Q;
|
|
}
|
|
this.maxSplats = e;
|
|
}
|
|
}
|
|
ensureIndex(A) {
|
|
this.ensureCapacity(A + 1);
|
|
}
|
|
setCenter(A, e, g, I) {
|
|
this.centers[A * 3] = e, this.centers[A * 3 + 1] = g, this.centers[A * 3 + 2] = I;
|
|
}
|
|
setScale(A, e, g, I) {
|
|
this.scales[A * 3] = e, this.scales[A * 3 + 1] = g, this.scales[A * 3 + 2] = I;
|
|
}
|
|
setQuaternion(A, e, g, I, s) {
|
|
this.quaternions[A * 4] = e, this.quaternions[A * 4 + 1] = g, this.quaternions[A * 4 + 2] = I, this.quaternions[A * 4 + 3] = s;
|
|
}
|
|
setOpacity(A, e) {
|
|
this.opacities[A] = e;
|
|
}
|
|
setColor(A, e, g, I) {
|
|
this.colors[A * 3] = e, this.colors[A * 3 + 1] = g, this.colors[A * 3 + 2] = I;
|
|
}
|
|
setSh1(A, e) {
|
|
this.sh1 || (this.sh1 = new Float32Array(this.maxSplats * 9));
|
|
for (let g = 0; g < 9; ++g)
|
|
this.sh1[A * 9 + g] = e[g];
|
|
}
|
|
setSh2(A, e) {
|
|
this.sh2 || (this.sh2 = new Float32Array(this.maxSplats * 15));
|
|
for (let g = 0; g < 15; ++g)
|
|
this.sh2[A * 15 + g] = e[g];
|
|
}
|
|
setSh3(A, e) {
|
|
this.sh3 || (this.sh3 = new Float32Array(this.maxSplats * 21));
|
|
for (let g = 0; g < 21; ++g)
|
|
this.sh3[A * 21 + g] = e[g];
|
|
}
|
|
}
|
|
var xo = `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 De = {
|
|
rgbMin: 0,
|
|
rgbMax: 1,
|
|
lnScaleMin: UA,
|
|
lnScaleMax: LA,
|
|
sh1Min: -1,
|
|
sh1Max: 1,
|
|
sh2Min: -1,
|
|
sh2Max: 1,
|
|
sh3Min: -1,
|
|
sh3Max: 1
|
|
}, IA = class IA {
|
|
constructor(A = {}) {
|
|
this.maxSplats = 0, this.numSplats = 0, this.packedArray = null, this.isInitialized = !1, this.target = null, this.source = null, this.needsUpdate = !0, this.extra = {}, this.dyno = new Qg({ packedSplats: this }), this.dynoRgbMinMaxLnScaleMinMax = new Rt({
|
|
key: "rgbMinMaxLnScaleMinMax",
|
|
value: new E.Vector4(0, 1, UA, LA),
|
|
update: (e) => {
|
|
var g, I, s, B;
|
|
return e.set(
|
|
((g = this.splatEncoding) == null ? void 0 : g.rgbMin) ?? 0,
|
|
((I = this.splatEncoding) == null ? void 0 : I.rgbMax) ?? 1,
|
|
((s = this.splatEncoding) == null ? void 0 : s.lnScaleMin) ?? UA,
|
|
((B = this.splatEncoding) == null ? void 0 : B.lnScaleMax) ?? LA
|
|
), e;
|
|
}
|
|
}), this.dynoSh1MinMax = new Ht({
|
|
key: "sh1MinMax",
|
|
value: new E.Vector2(-1, 1),
|
|
update: (e) => {
|
|
var g, I;
|
|
return e.set(
|
|
((g = this.splatEncoding) == null ? void 0 : g.sh1Min) ?? -1,
|
|
((I = this.splatEncoding) == null ? void 0 : I.sh1Max) ?? 1
|
|
), e;
|
|
}
|
|
}), this.dynoSh2MinMax = new Ht({
|
|
key: "sh2MinMax",
|
|
value: new E.Vector2(-1, 1),
|
|
update: (e) => {
|
|
var g, I;
|
|
return e.set(
|
|
((g = this.splatEncoding) == null ? void 0 : g.sh2Min) ?? -1,
|
|
((I = this.splatEncoding) == null ? void 0 : I.sh2Max) ?? 1
|
|
), e;
|
|
}
|
|
}), this.dynoSh3MinMax = new Ht({
|
|
key: "sh3MinMax",
|
|
value: new E.Vector2(-1, 1),
|
|
update: (e) => {
|
|
var g, I;
|
|
return e.set(
|
|
((g = this.splatEncoding) == null ? void 0 : g.sh3Min) ?? -1,
|
|
((I = this.splatEncoding) == null ? void 0 : I.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 / j) * j, this.numSplats = Math.min(
|
|
this.maxSplats,
|
|
A.numSplats ?? Number.POSITIVE_INFINITY
|
|
)) : (this.maxSplats = A.maxSplats ?? 0, this.numSplats = 0), this.extra = A.extra ?? {};
|
|
}
|
|
async asyncInitialize(A) {
|
|
const { url: e, fileBytes: g, construct: I } = A;
|
|
if (e) {
|
|
const s = new So();
|
|
s.packedSplats = this, await s.loadAsync(e);
|
|
} else if (g) {
|
|
const s = await Wi({
|
|
input: g,
|
|
fileType: A.fileType,
|
|
pathOrUrl: A.fileName ?? e,
|
|
splatEncoding: A.splatEncoding ?? De
|
|
});
|
|
this.initialize(s);
|
|
}
|
|
if (I) {
|
|
const s = I(this);
|
|
s instanceof Promise && await s;
|
|
}
|
|
}
|
|
// Call this when you are finished with the PackedSplats and want to free
|
|
// any buffers it holds.
|
|
dispose() {
|
|
this.target && (this.target.dispose(), this.target = null), this.source && (this.source.dispose(), this.source = null);
|
|
}
|
|
// Ensures that this.packedArray can fit numSplats Gsplats. If it's too small,
|
|
// resize exponentially and copy over the original data.
|
|
//
|
|
// Typically you don't need to call this, because calling this.setSplat(index, ...)
|
|
// and this.pushSplat(...) will automatically call ensureSplats() so we have
|
|
// enough splats.
|
|
ensureSplats(A) {
|
|
const e = A <= this.maxSplats ? this.maxSplats : (
|
|
// Grow exponentially to avoid frequent reallocations
|
|
Math.max(A, 2 * this.maxSplats)
|
|
), g = this.packedArray ? this.packedArray.length / 4 : 0;
|
|
if (!this.packedArray || e > g) {
|
|
this.maxSplats = fA(e).maxSplats;
|
|
const I = new Uint32Array(this.maxSplats * 4);
|
|
this.packedArray && I.set(this.packedArray), this.packedArray = I;
|
|
}
|
|
return this.packedArray;
|
|
}
|
|
// Ensure the extra array for the given level is large enough to hold numSplats
|
|
ensureSplatsSh(A, e) {
|
|
let g, I;
|
|
if (A === 0)
|
|
return this.ensureSplats(e);
|
|
if (A === 1)
|
|
g = 2, I = "sh1";
|
|
else if (A === 2)
|
|
g = 4, I = "sh2";
|
|
else if (A === 3)
|
|
g = 4, I = "sh3";
|
|
else
|
|
throw new Error(`Invalid level: ${A}`);
|
|
let s = this.extra[I] ? this.extra[I].length / g : 0;
|
|
const B = e <= s ? s : Math.max(e, 2 * s);
|
|
if (!this.extra[I] || B > s) {
|
|
s = fA(B).maxSplats;
|
|
const i = new Uint32Array(s * g);
|
|
this.extra[I] && i.set(this.extra[I]), this.extra[I] = i;
|
|
}
|
|
return this.extra[I];
|
|
}
|
|
// Unpack the 16-byte Gsplat data at index into the Three.js components
|
|
// center: THREE.Vector3, scales: THREE.Vector3, quaternion: THREE.Quaternion,
|
|
// opacity: number 0..1, color: THREE.Color 0..1.
|
|
getSplat(A) {
|
|
if (!this.packedArray || A >= this.numSplats)
|
|
throw new Error("Invalid index");
|
|
return be(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, g, I, s, B) {
|
|
const i = this.ensureSplats(A + 1);
|
|
Je(
|
|
i,
|
|
A,
|
|
e.x,
|
|
e.y,
|
|
e.z,
|
|
g.x,
|
|
g.y,
|
|
g.z,
|
|
I.x,
|
|
I.y,
|
|
I.z,
|
|
I.w,
|
|
s,
|
|
B.r,
|
|
B.g,
|
|
B.b
|
|
), this.numSplats = Math.max(this.numSplats, A + 1);
|
|
}
|
|
// Effectively calls this.setSplat(this.numSplats++, center, ...), useful on
|
|
// construction where you just want to iterate and create a collection of Gsplats.
|
|
pushSplat(A, e, g, I, s) {
|
|
const B = this.ensureSplats(this.numSplats + 1);
|
|
Je(
|
|
B,
|
|
this.numSplats,
|
|
A.x,
|
|
A.y,
|
|
A.z,
|
|
e.x,
|
|
e.y,
|
|
e.z,
|
|
g.x,
|
|
g.y,
|
|
g.z,
|
|
g.w,
|
|
I,
|
|
s.r,
|
|
s.g,
|
|
s.b
|
|
), ++this.numSplats;
|
|
}
|
|
// Iterate over Gsplats index 0..=(this.numSplats-1), unpack each Gsplat
|
|
// and invoke the callback function with the Gsplat attributes.
|
|
forEachSplat(A) {
|
|
if (!(!this.packedArray || !this.numSplats))
|
|
for (let e = 0; e < this.numSplats; ++e) {
|
|
const g = be(this.packedArray, e, this.splatEncoding);
|
|
A(
|
|
e,
|
|
g.center,
|
|
g.scales,
|
|
g.quaternion,
|
|
g.opacity,
|
|
g.color
|
|
);
|
|
}
|
|
}
|
|
// Ensures our PackedSplats.target render target has enough space to generate
|
|
// maxSplats total Gsplats, and reallocate if not large enough.
|
|
ensureGenerate(A) {
|
|
if (this.target && (A ?? 1) <= this.maxSplats)
|
|
return !1;
|
|
this.dispose();
|
|
const e = fA(A ?? 1), { width: g, height: I, depth: s } = e;
|
|
return this.maxSplats = e.maxSplats, this.target = new E.WebGLArrayRenderTarget(g, I, s, {
|
|
depthBuffer: !1,
|
|
stencilBuffer: !1,
|
|
generateMipmaps: !1,
|
|
magFilter: E.NearestFilter,
|
|
minFilter: E.NearestFilter
|
|
}), this.target.texture.format = E.RGBAIntegerFormat, this.target.texture.type = E.UnsignedIntType, this.target.texture.internalFormat = "RGBA32UI", this.target.scissorTest = !0, !0;
|
|
}
|
|
// Given an array of splatCounts (.numSplats for each
|
|
// SplatGenerator/SplatMesh in the scene), compute a
|
|
// "mapping layout" in the composite array of generated outputs.
|
|
generateMapping(A) {
|
|
let e = 0;
|
|
const g = A.map((I) => {
|
|
const s = e, B = Math.ceil(I / j) * j;
|
|
return e += B, { base: s, count: I };
|
|
});
|
|
return { maxSplats: e, mapping: g };
|
|
}
|
|
// Returns a THREE.DataArrayTexture representing the PackedSplats content as
|
|
// a Uint32x4 data array texture (2048 x 2048 x depth in size)
|
|
getTexture() {
|
|
return this.target ? this.target.texture : this.source || this.packedArray ? this.maybeUpdateSource() : IA.getEmpty();
|
|
}
|
|
// Check if source texture needs to be created/updated
|
|
maybeUpdateSource() {
|
|
if (!this.packedArray)
|
|
throw new Error("No packed splats");
|
|
if (this.needsUpdate || !this.source) {
|
|
if (this.needsUpdate = !1, this.source) {
|
|
const { width: A, height: e, depth: g } = this.source.image;
|
|
this.maxSplats !== A * e * g && (this.source.dispose(), this.source = null);
|
|
}
|
|
if (this.source)
|
|
this.packedArray.buffer !== this.source.image.data.buffer && (this.source.image.data = new Uint8Array(this.packedArray.buffer));
|
|
else {
|
|
const { width: A, height: e, depth: g } = fA(this.maxSplats);
|
|
this.source = new E.DataArrayTexture(
|
|
this.packedArray,
|
|
A,
|
|
e,
|
|
g
|
|
), this.source.format = E.RGBAIntegerFormat, this.source.type = E.UnsignedIntType, this.source.internalFormat = "RGBA32UI", this.source.needsUpdate = !0;
|
|
}
|
|
this.source.needsUpdate = !0;
|
|
}
|
|
return this.source;
|
|
}
|
|
// Can be used where you need an uninitialized THREE.DataArrayTexture like
|
|
// a uniform you will update with the result of this.getTexture() later.
|
|
static getEmpty() {
|
|
if (!IA.emptySource) {
|
|
const { width: A, height: e, depth: g, maxSplats: I } = fA(1), s = new Uint32Array(I * 4);
|
|
IA.emptySource = new E.DataArrayTexture(
|
|
s,
|
|
A,
|
|
e,
|
|
g
|
|
), IA.emptySource.format = E.RGBAIntegerFormat, IA.emptySource.type = E.UnsignedIntType, IA.emptySource.internalFormat = "RGBA32UI", IA.emptySource.needsUpdate = !0;
|
|
}
|
|
return IA.emptySource;
|
|
}
|
|
// Get a program and THREE.RawShaderMaterial for a given GsplatGenerator,
|
|
// generating it if necessary and caching the result.
|
|
prepareProgramMaterial(A) {
|
|
let e = IA.generatorProgram.get(A);
|
|
if (!e) {
|
|
const I = NA(
|
|
{ index: "int" },
|
|
{ output: "uvec4" },
|
|
({ index: s }) => {
|
|
A.inputs.index = s;
|
|
const B = A.outputs.gsplat;
|
|
return { output: AI(
|
|
B,
|
|
this.dynoRgbMinMaxLnScaleMinMax
|
|
) };
|
|
}
|
|
);
|
|
IA.programTemplate || (IA.programTemplate = new gg(
|
|
xo
|
|
)), e = new eg({
|
|
graph: I,
|
|
inputs: { index: "index" },
|
|
outputs: { output: "target" },
|
|
template: IA.programTemplate
|
|
}), Object.assign(e.uniforms, {
|
|
targetLayer: { value: 0 },
|
|
targetBase: { value: 0 },
|
|
targetCount: { value: 0 }
|
|
}), IA.generatorProgram.set(A, e);
|
|
}
|
|
const g = e.prepareMaterial();
|
|
return IA.fullScreenQuad.material = g, { program: e, material: g };
|
|
}
|
|
saveRenderState(A) {
|
|
return {
|
|
xrEnabled: A.xr.enabled,
|
|
autoClear: A.autoClear
|
|
};
|
|
}
|
|
resetRenderState(A, e) {
|
|
A.setRenderTarget(null), A.xr.enabled = e.xrEnabled, A.autoClear = e.autoClear;
|
|
}
|
|
// Executes a dyno program specified by generator which is any DynoBlock that
|
|
// maps { index: "int" } to { gsplat: Gsplat }. This is called in
|
|
// SparkRenderer.updateInternal() to re-generate Gsplats in the scene for
|
|
// SplatGenerator instances whose version is newer than what was generated
|
|
// for it last time.
|
|
generate({
|
|
generator: A,
|
|
base: e,
|
|
count: g,
|
|
renderer: I
|
|
}) {
|
|
if (!this.target)
|
|
throw new Error("Target must be initialized with ensureSplats");
|
|
if (e + g > this.maxSplats)
|
|
throw new Error("Base + count exceeds maxSplats");
|
|
const { program: s, material: B } = this.prepareProgramMaterial(A);
|
|
s.update();
|
|
const i = this.saveRenderState(I), Q = Math.ceil((e + g) / j) * j, C = j * qA;
|
|
for (B.uniforms.targetBase.value = e, B.uniforms.targetCount.value = g; e < Q; ) {
|
|
const a = Math.floor(e / C);
|
|
B.uniforms.targetLayer.value = a;
|
|
const n = a * C, o = Math.floor((e - n) / j), r = Math.min(
|
|
qA,
|
|
Math.ceil((Q - n) / j)
|
|
);
|
|
this.target.scissor.set(
|
|
0,
|
|
o,
|
|
j,
|
|
r - o
|
|
), I.setRenderTarget(this.target, a), I.xr.enabled = !1, I.autoClear = !1, IA.fullScreenQuad.render(I), e += j * (r - o);
|
|
}
|
|
return this.resetRenderState(I, i), { nextBase: Q };
|
|
}
|
|
};
|
|
IA.emptySource = null, IA.programTemplate = null, IA.generatorProgram = /* @__PURE__ */ new Map(), IA.fullScreenQuad = new pg(
|
|
new E.RawShaderMaterial({ visible: !1 })
|
|
);
|
|
let ZA = IA;
|
|
class Qg extends k {
|
|
constructor({ packedSplats: A } = {}) {
|
|
super({
|
|
key: "packedSplats",
|
|
type: Pt,
|
|
globals: () => [le],
|
|
value: {
|
|
texture: ZA.getEmpty(),
|
|
numSplats: 0,
|
|
rgbMinMaxLnScaleMinMax: new E.Vector4(
|
|
0,
|
|
1,
|
|
UA,
|
|
LA
|
|
)
|
|
},
|
|
update: (e) => {
|
|
var g, I, s, B, i, Q, C, a, n, o;
|
|
return e.texture = ((g = this.packedSplats) == null ? void 0 : g.getTexture()) ?? ZA.getEmpty(), e.numSplats = ((I = this.packedSplats) == null ? void 0 : I.numSplats) ?? 0, e.rgbMinMaxLnScaleMinMax.set(
|
|
((B = (s = this.packedSplats) == null ? void 0 : s.splatEncoding) == null ? void 0 : B.rgbMin) ?? 0,
|
|
((Q = (i = this.packedSplats) == null ? void 0 : i.splatEncoding) == null ? void 0 : Q.rgbMax) ?? 1,
|
|
((a = (C = this.packedSplats) == null ? void 0 : C.splatEncoding) == null ? void 0 : a.lnScaleMin) ?? UA,
|
|
((o = (n = this.packedSplats) == null ? void 0 : n.splatEncoding) == null ? void 0 : o.lnScaleMax) ?? LA
|
|
), e;
|
|
}
|
|
}), this.packedSplats = A;
|
|
}
|
|
}
|
|
class ze extends E.InstancedBufferGeometry {
|
|
constructor(A, e) {
|
|
super(), this.ordering = A, this.setAttribute("position", new E.BufferAttribute(ko, 3)), this.setIndex(new E.BufferAttribute(Ro, 1)), this._maxInstanceCount = A.length, this.instanceCount = e, this.attribute = new E.InstancedBufferAttribute(A, 1, !1, 1), this.attribute.setUsage(E.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 ko = new Float32Array([
|
|
-1,
|
|
-1,
|
|
0,
|
|
1,
|
|
-1,
|
|
0,
|
|
1,
|
|
1,
|
|
0,
|
|
-1,
|
|
1,
|
|
0
|
|
]), Ro = new Uint16Array([0, 1, 2, 0, 2, 3]), It = class It {
|
|
constructor(A) {
|
|
if (this.lastTime = null, this.encodeLinear = !1, this.superXY = 1, this.display = null, this.sorting = null, this.pending = null, this.sortingCheck = !1, this.readback16 = new Uint16Array(0), this.readback32 = new Uint32Array(0), this.spark = A.spark, this.camera = A.camera, this.viewToWorld = A.viewToWorld ?? new E.Matrix4(), A.target) {
|
|
const { width: e, height: g, doubleBuffer: I } = A.target, s = Math.max(1, Math.min(4, A.target.superXY ?? 1));
|
|
if (this.superXY = s, e * s > 8192 || g * s > 8192)
|
|
throw new Error("Target size too large");
|
|
this.target = new E.WebGLRenderTarget(
|
|
e * s,
|
|
g * s,
|
|
{
|
|
format: E.RGBAFormat,
|
|
type: E.UnsignedByteType,
|
|
colorSpace: E.SRGBColorSpace
|
|
}
|
|
), I && (this.back = new E.WebGLRenderTarget(
|
|
e * s,
|
|
g * s,
|
|
{
|
|
format: E.RGBAFormat,
|
|
type: E.UnsignedByteType,
|
|
colorSpace: E.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.orderingFreelist = new vI({
|
|
allocate: (e) => new Uint32Array(e),
|
|
valid: (e, g) => e.length === g
|
|
}), this.autoUpdate = !1, this.setAutoUpdate(A.autoUpdate ?? !1);
|
|
}
|
|
// Call this when you are done with the SparkViewpoint and want to
|
|
// free up its resources (GPU targets, pixel buffers, etc.)
|
|
dispose() {
|
|
var A;
|
|
this.setAutoUpdate(!1), this.target && (this.target.dispose(), this.target = void 0), this.back && (this.back.dispose(), this.back = void 0), this.display && (this.spark.releaseAccumulator(this.display.accumulator), this.display.geometry.dispose(), this.display = null), (A = this.pending) != null && A.accumulator && (this.spark.releaseAccumulator(this.pending.accumulator), this.pending = null);
|
|
}
|
|
// Use this function to change whether this viewpoint will auto-update
|
|
// its sort order whenever the attached SparkRenderer updates the Gsplats.
|
|
// Turn this on or off depending on whether you expect to do renders from
|
|
// this viewpoint most frames.
|
|
setAutoUpdate(A) {
|
|
!this.autoUpdate && A ? this.spark.autoViewpoints.push(this) : this.autoUpdate && !A && (this.spark.autoViewpoints = this.spark.autoViewpoints.filter(
|
|
(e) => e !== this
|
|
)), this.autoUpdate = A;
|
|
}
|
|
// See below async prepareRenderPixels() for explanation of parameters.
|
|
// Awaiting this method updates the Gsplats in the scene and performs a sort of the
|
|
// Gsplats from this viewpoint, preparing it for a subsequent this.renderTarget()
|
|
// call in the same tick.
|
|
async prepare({
|
|
scene: A,
|
|
camera: e,
|
|
viewToWorld: g,
|
|
update: I,
|
|
forceOrigin: s
|
|
}) {
|
|
var i;
|
|
for (g ? this.viewToWorld = g : (this.camera = e ?? this.camera, this.camera && (this.camera.updateMatrixWorld(), this.viewToWorld = this.camera.matrixWorld.clone())); I ?? !0; ) {
|
|
const Q = s ? this.viewToWorld : void 0;
|
|
if (this.spark.updateInternal({ scene: A, originToWorld: Q }))
|
|
break;
|
|
await new Promise((a) => setTimeout(a, 10));
|
|
}
|
|
const B = this.spark.active;
|
|
B !== ((i = this.display) == null ? void 0 : i.accumulator) && (this.spark.active.refCount += 1), await this.sortUpdate({ accumulator: B, viewToWorld: this.viewToWorld });
|
|
}
|
|
// Render out the viewpoint to the view target RGBA buffer.
|
|
// Swaps buffers if doubleBuffer: true was set.
|
|
// Calls onTextureUpdated(texture) with the resulting texture.
|
|
renderTarget({
|
|
scene: A,
|
|
camera: e
|
|
}) {
|
|
var I;
|
|
const g = this.back ?? this.target;
|
|
if (!g)
|
|
throw new Error("Must initialize SparkViewpoint with target");
|
|
if (e = e ?? this.camera, !e)
|
|
throw new Error("Must provide camera");
|
|
if (e instanceof E.PerspectiveCamera) {
|
|
const s = new E.PerspectiveCamera().copy(e, !1);
|
|
s.aspect = g.width / g.height, s.updateProjectionMatrix(), e = s;
|
|
}
|
|
this.viewToWorld = e.matrixWorld.clone();
|
|
try {
|
|
this.spark.renderer.setRenderTarget(g), this.spark.prepareViewpoint(this), this.spark.renderer.render(A, e);
|
|
} finally {
|
|
this.spark.prepareViewpoint(this.spark.defaultView), this.spark.renderer.setRenderTarget(null);
|
|
}
|
|
g !== this.target && ([this.target, this.back] = [this.back, this.target]), (I = this.onTextureUpdated) == null || I.call(this, g.texture);
|
|
}
|
|
// Read back the previously rendered target image as a Uint8Array of packed
|
|
// RGBA values (in that order). If superXY was set greater than 1 then
|
|
// downsampling is performed in the target pixel array with simple averaging
|
|
// to derive the returned pixel values. Subsequent calls to this.readTarget()
|
|
// will reuse the same buffers to minimize memory allocations.
|
|
async readTarget() {
|
|
if (!this.target)
|
|
throw new Error("Must initialize SparkViewpoint with target");
|
|
const { width: A, height: e } = this.target, g = A * e * 4;
|
|
(!this.superPixels || this.superPixels.length < g) && (this.superPixels = new Uint8Array(g)), await this.spark.renderer.readRenderTargetPixelsAsync(
|
|
this.target,
|
|
0,
|
|
0,
|
|
A,
|
|
e,
|
|
this.superPixels
|
|
);
|
|
const { superXY: I } = this;
|
|
if (I === 1)
|
|
return this.superPixels;
|
|
const s = A / I, B = e / I, i = s * B * 4;
|
|
(!this.pixels || this.pixels.length < i) && (this.pixels = new Uint8Array(i));
|
|
const { superPixels: Q, pixels: C } = this, a = I * I;
|
|
for (let n = 0; n < B; n++) {
|
|
const o = n * s;
|
|
for (let r = 0; r < s; r++) {
|
|
const h = r * I;
|
|
let c = 0, l = 0, u = 0, w = 0;
|
|
for (let y = 0; y < I; y++) {
|
|
const d = (n * I + y) * this.target.width;
|
|
for (let S = 0; S < I; S++) {
|
|
const M = (d + h + S) * 4;
|
|
c += Q[M], l += Q[M + 1], u += Q[M + 2], w += Q[M + 3];
|
|
}
|
|
}
|
|
const D = (o + r) * 4;
|
|
C[D] = c / a, C[D + 1] = l / a, C[D + 2] = u / a, C[D + 3] = w / a;
|
|
}
|
|
}
|
|
return C;
|
|
}
|
|
// Render out a viewpoint as a Uint8Array of RGBA values for the provided scene
|
|
// and any camera/viewToWorld viewpoint overrides. By default update is true,
|
|
// which triggers its SparkRenderer to check and potentially update the Gsplats.
|
|
// Setting update to false disables this and sorts the Gsplats as they are.
|
|
// Setting forceOrigin (default: false) to true forces the view update to
|
|
// recalculate the splats with this view origin, potentially altering any
|
|
// view-dependent effects. If you expect view-dependent effects to play a role
|
|
// in the rendering quality, enable this.
|
|
//
|
|
// Underneath, prepareRenderPixels() simply calls await this.prepare(...),
|
|
// this.renderTarget(...), and finally returns the result this.readTarget(),
|
|
// a Promise to a Uint8Array with RGBA values for all the pixels (potentially
|
|
// downsampled if the superXY parameter was used). These steps can also be called
|
|
// manually, for example if you need to alter the scene before and after
|
|
// this.renderTarget(...) to hide UI elements from being rendered.
|
|
async prepareRenderPixels({
|
|
scene: A,
|
|
camera: e,
|
|
viewToWorld: g,
|
|
update: I,
|
|
forceOrigin: s
|
|
}) {
|
|
return await this.prepare({ scene: A, camera: e, viewToWorld: g, update: I, forceOrigin: s }), this.renderTarget({ scene: A, camera: e }), this.readTarget();
|
|
}
|
|
// This is called automatically by SparkRenderer, there is no need to call it!
|
|
// The method cannot be private because then SparkRenderer would
|
|
// not be able to call it.
|
|
autoPoll({ accumulator: A }) {
|
|
var s, B, i, Q;
|
|
this.camera && (this.camera.updateMatrixWorld(), this.viewToWorld = this.camera.matrixWorld.clone());
|
|
let e = !1, g = !1;
|
|
if (!this.display)
|
|
e = !0;
|
|
else if (A) {
|
|
e = !0;
|
|
const { mappingVersion: C } = this.display.accumulator;
|
|
A.mappingVersion === C && (this.spark.releaseAccumulator(this.display.accumulator), this.display.accumulator = A, g = !0);
|
|
}
|
|
const I = ((s = this.sorting) == null ? void 0 : s.viewToWorld) ?? ((B = this.display) == null ? void 0 : B.viewToWorld);
|
|
I && !ne({
|
|
matrix1: this.viewToWorld,
|
|
matrix2: I,
|
|
// By default update sort each 1 cm
|
|
maxDistance: this.sortDistance ?? 0.01,
|
|
// By default for radial sort, update for intermittent movement so that
|
|
// we bring back splats culled by being behind the camera.
|
|
// For depth sort, small rotations can change sort order a lot, so
|
|
// update sort for even small rotations.
|
|
minCoorient: this.sortCoorient ?? this.sortRadial ? 0.99 : 0.999
|
|
}) && (e = !0), e && (A && (A.refCount += 1), A && ((i = this.pending) != null && i.accumulator) && this.pending.accumulator !== ((Q = this.display) == null ? void 0 : Q.accumulator) && this.spark.releaseAccumulator(this.pending.accumulator), this.pending = { accumulator: A, viewToWorld: this.viewToWorld, displayed: g }, this.driveSort());
|
|
}
|
|
async driveSort() {
|
|
var A;
|
|
for (; ; ) {
|
|
if (this.sorting || !this.pending)
|
|
return;
|
|
const { viewToWorld: e, displayed: g } = this.pending;
|
|
let I = this.pending.accumulator ?? ((A = this.display) == null ? void 0 : A.accumulator);
|
|
if (I || (I = this.spark.active, I.refCount += 1), this.pending = null, !I)
|
|
throw new Error("No accumulator to sort");
|
|
this.sorting = { viewToWorld: e }, await this.sortUpdate({ accumulator: I, viewToWorld: e, displayed: g }), this.sorting = null;
|
|
}
|
|
}
|
|
async sortUpdate({
|
|
accumulator: A,
|
|
viewToWorld: e,
|
|
displayed: g = !1
|
|
}) {
|
|
if (this.sortingCheck)
|
|
throw new Error("Only one sort at a time");
|
|
this.sortingCheck = !0, A = A ?? this.spark.active;
|
|
const { numSplats: I, maxSplats: s } = A.splats;
|
|
let B = 0, i = this.orderingFreelist.alloc(s);
|
|
if (I > 0) {
|
|
const {
|
|
reader: Q,
|
|
doubleSortReader: C,
|
|
sort32Reader: a,
|
|
dynoSortRadial: n,
|
|
dynoOrigin: o,
|
|
dynoDirection: r,
|
|
dynoDepthBias: h,
|
|
dynoSort360: c,
|
|
dynoSplats: l
|
|
} = It.makeSorter(), u = this.sort32 ?? !1;
|
|
let w;
|
|
if (u)
|
|
this.readback32 = Q.ensureBuffer(s, this.readback32), w = this.readback32;
|
|
else {
|
|
const p = Math.ceil(s / 2);
|
|
this.readback16 = Q.ensureBuffer(p, this.readback16), w = this.readback16;
|
|
}
|
|
const D = A.toWorld.clone().invert(), y = e.clone().premultiply(D);
|
|
n.value = this.sort360 ? !0 : this.sortRadial, o.value.set(0, 0, 0).applyMatrix4(y), r.value.set(0, 0, -1).applyMatrix4(y).sub(o.value).normalize(), h.value = this.depthBias ?? 1, c.value = this.sort360 ?? !1, l.packedSplats = A.splats;
|
|
const d = u ? a : C, S = u ? I : Math.ceil(I / 2);
|
|
await Q.renderReadback({
|
|
renderer: this.spark.renderer,
|
|
reader: d,
|
|
count: S,
|
|
readback: w
|
|
});
|
|
const M = await at(async (p) => {
|
|
const f = u ? "sort32Splats" : "sortDoubleSplats";
|
|
return p.call(f, {
|
|
maxSplats: s,
|
|
numSplats: I,
|
|
readback: w,
|
|
ordering: i
|
|
});
|
|
});
|
|
u ? this.readback32 = M.readback : this.readback16 = M.readback, i = M.ordering, B = M.activeSplats;
|
|
}
|
|
this.updateDisplay({
|
|
accumulator: A,
|
|
viewToWorld: e,
|
|
ordering: i,
|
|
activeSplats: B,
|
|
displayed: g
|
|
}), this.sortingCheck = !1;
|
|
}
|
|
updateDisplay({
|
|
accumulator: A,
|
|
viewToWorld: e,
|
|
ordering: g,
|
|
activeSplats: I,
|
|
displayed: s = !1
|
|
}) {
|
|
if (!this.display)
|
|
this.display = {
|
|
accumulator: A,
|
|
viewToWorld: e,
|
|
geometry: new ze(g, I)
|
|
};
|
|
else {
|
|
!s && A !== this.display.accumulator && (this.spark.releaseAccumulator(this.display.accumulator), this.display.accumulator = A), this.display.viewToWorld = e;
|
|
const B = this.display.geometry.ordering;
|
|
B.length === g.length ? this.display.geometry.update(g, I) : (this.display.geometry.dispose(), this.display.geometry = new ze(g, I)), this.orderingFreelist.free(B);
|
|
}
|
|
this.spark.viewpoint === this && this.spark.prepareViewpoint(this);
|
|
}
|
|
static makeSorter() {
|
|
if (!It.dynos) {
|
|
const A = new Qe({ value: !0 }), e = new Gt({ value: new E.Vector3() }), g = new Gt({ value: new E.Vector3() }), I = new rt({ value: 1 }), s = new Qe({ value: !1 }), B = new Qg(), i = new Ce(), Q = NA(
|
|
{ index: "int" },
|
|
{ rgba8: "vec4" },
|
|
({ index: a }) => {
|
|
if (!a)
|
|
throw new Error("No index");
|
|
const n = {
|
|
sortRadial: A,
|
|
sortOrigin: e,
|
|
sortDirection: g,
|
|
sortDepthBias: I,
|
|
sort360: s
|
|
}, o = sA(a, v("int", 2)), r = Ft(B, o), h = xe({ gsplat: r, ...n }), c = Ft(
|
|
B,
|
|
cA(o, v("int", 1))
|
|
), l = xe({ gsplat: c, ...n }), u = zA({
|
|
vectorType: "vec2",
|
|
x: h,
|
|
y: l
|
|
});
|
|
return { rgba8: Te(Os(u)) };
|
|
}
|
|
), C = NA(
|
|
{ index: "int" },
|
|
{ rgba8: "vec4" },
|
|
({ index: a }) => {
|
|
if (!a)
|
|
throw new Error("No index");
|
|
const n = {
|
|
sortRadial: A,
|
|
sortOrigin: e,
|
|
sortDirection: g,
|
|
sortDepthBias: I,
|
|
sort360: s
|
|
}, o = Ft(B, a), r = xe({ gsplat: o, ...n });
|
|
return { rgba8: Te(_s(r)) };
|
|
}
|
|
);
|
|
It.dynos = {
|
|
dynoSortRadial: A,
|
|
dynoOrigin: e,
|
|
dynoDirection: g,
|
|
dynoDepthBias: I,
|
|
dynoSort360: s,
|
|
dynoSplats: B,
|
|
reader: i,
|
|
doubleSortReader: Q,
|
|
sort32Reader: C
|
|
};
|
|
}
|
|
return It.dynos;
|
|
}
|
|
};
|
|
It.EMPTY_TEXTURE = new E.Texture(), It.dynos = null;
|
|
let re = It;
|
|
const Uo = oA(`
|
|
float computeSort(Gsplat gsplat, bool sortRadial, vec3 sortOrigin, vec3 sortDirection, float sortDepthBias, bool sort360) {
|
|
if (!isGsplatActive(gsplat.flags)) {
|
|
return INFINITY;
|
|
}
|
|
|
|
vec3 center = gsplat.center - sortOrigin;
|
|
float biasedDepth = dot(center, sortDirection) + sortDepthBias;
|
|
if (!sort360 && (biasedDepth <= 0.0)) {
|
|
return INFINITY;
|
|
}
|
|
|
|
return sortRadial ? length(center) : biasedDepth;
|
|
}
|
|
`);
|
|
function xe({
|
|
gsplat: t,
|
|
sortRadial: A,
|
|
sortOrigin: e,
|
|
sortDirection: g,
|
|
sortDepthBias: I,
|
|
sort360: s
|
|
}) {
|
|
return jt({
|
|
inTypes: {
|
|
gsplat: AA,
|
|
sortRadial: "bool",
|
|
sortOrigin: "vec3",
|
|
sortDirection: "vec3",
|
|
sortDepthBias: "float",
|
|
sort360: "bool"
|
|
},
|
|
outTypes: { metric: "float" },
|
|
globals: () => [FA, Uo],
|
|
inputs: {
|
|
gsplat: t,
|
|
sortRadial: A,
|
|
sortOrigin: e,
|
|
sortDirection: g,
|
|
sortDepthBias: I,
|
|
sort360: s
|
|
},
|
|
statements: ({ inputs: B, outputs: i }) => {
|
|
const {
|
|
gsplat: Q,
|
|
sortRadial: C,
|
|
sortOrigin: a,
|
|
sortDirection: n,
|
|
sortDepthBias: o,
|
|
sort360: r
|
|
} = B;
|
|
return YA(`
|
|
${i.metric} = computeSort(${Q}, ${C}, ${a}, ${n}, ${o}, ${r});
|
|
`);
|
|
}
|
|
}).outputs.metric;
|
|
}
|
|
class ke {
|
|
constructor() {
|
|
this.splats = new ZA(), this.toWorld = new E.Matrix4(), this.mapping = [], this.refCount = 0, this.splatsVersion = -1, this.mappingVersion = -1;
|
|
}
|
|
ensureGenerate(A) {
|
|
this.splats.ensureGenerate(A) && (this.mapping = []);
|
|
}
|
|
// Generate all Gsplats from an array of generators
|
|
generateSplats({
|
|
renderer: A,
|
|
modifier: e,
|
|
generators: g,
|
|
forceUpdate: I,
|
|
originToWorld: s
|
|
}) {
|
|
const B = this.mapping.reduce((C, a) => (C.set(a.node, a), C), /* @__PURE__ */ new Map());
|
|
let i = 0, Q = 0;
|
|
for (const { node: C, generator: a, version: n, base: o, count: r } of g) {
|
|
const h = B.get(C);
|
|
if ((I || a !== (h == null ? void 0 : h.generator) || n !== (h == null ? void 0 : h.version) || o !== (h == null ? void 0 : h.base) || r !== (h == null ? void 0 : h.count)) && a && r > 0) {
|
|
const c = e.apply(a);
|
|
try {
|
|
this.splats.generate({
|
|
generator: c,
|
|
base: o,
|
|
count: r,
|
|
renderer: A
|
|
});
|
|
} catch (l) {
|
|
C.generator = void 0, C.generatorError = l;
|
|
}
|
|
i += 1;
|
|
}
|
|
Q = Math.max(Q, o + r);
|
|
}
|
|
return this.splats.numSplats = Q, this.toWorld = s, this.mapping = g, i !== 0;
|
|
}
|
|
// Check if this accumulator has exactly the same generator mapping as
|
|
// the previous one. If so, we can reuse the Gsplat sort order.
|
|
hasCorrespondence(A) {
|
|
return this.mapping.length !== A.mapping.length ? !1 : this.mapping.every(({ node: e, base: g, count: I }, s) => {
|
|
const {
|
|
node: B,
|
|
base: i,
|
|
count: Q
|
|
} = A.mapping[s];
|
|
return e === B && g === i && I === Q;
|
|
});
|
|
}
|
|
}
|
|
var Lo = `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);
|
|
}`, Yo = `precision highp float;
|
|
precision highp int;
|
|
|
|
#include <splatDefines>
|
|
|
|
uniform float near;
|
|
uniform float far;
|
|
uniform bool premultipliedAlpha;
|
|
uniform bool encodeLinear;
|
|
uniform float maxStdDev;
|
|
uniform float minAlpha;
|
|
uniform bool disableFalloff;
|
|
uniform float falloff;
|
|
|
|
uniform bool splatTexEnable;
|
|
uniform sampler3D splatTexture;
|
|
uniform mat2 splatTexMul;
|
|
uniform vec2 splatTexAdd;
|
|
uniform float splatTexNear;
|
|
uniform float splatTexFar;
|
|
uniform float splatTexMid;
|
|
|
|
out vec4 fragColor;
|
|
|
|
in vec4 vRgba;
|
|
in vec2 vSplatUv;
|
|
in vec3 vNdc;
|
|
|
|
void main() {
|
|
vec4 rgba = vRgba;
|
|
|
|
float z = dot(vSplatUv, vSplatUv);
|
|
if (!splatTexEnable) {
|
|
if (z > (maxStdDev * maxStdDev)) {
|
|
discard;
|
|
}
|
|
} else {
|
|
vec2 uv = splatTexMul * vSplatUv + splatTexAdd;
|
|
float ndcZ = vNdc.z;
|
|
float depth = (2.0 * near * far) / (far + near - ndcZ * (far - near));
|
|
float clampedFar = max(splatTexFar, splatTexNear);
|
|
float clampedDepth = clamp(depth, splatTexNear, clampedFar);
|
|
float logDepth = log2(clampedDepth + 1.0);
|
|
float logNear = log2(splatTexNear + 1.0);
|
|
float logFar = log2(clampedFar + 1.0);
|
|
|
|
float texZ;
|
|
if (splatTexMid > 0.0) {
|
|
float clampedMid = clamp(splatTexMid, splatTexNear, clampedFar);
|
|
float logMid = log2(clampedMid + 1.0);
|
|
texZ = (clampedDepth <= clampedMid) ?
|
|
(0.5 * ((logDepth - logNear) / (logMid - logNear))) :
|
|
(0.5 * ((logDepth - logMid) / (logFar - logMid)) + 0.5);
|
|
} else {
|
|
texZ = (logDepth - logNear) / (logFar - logNear);
|
|
}
|
|
|
|
vec4 modulate = texture(splatTexture, vec3(uv, 1.0 - texZ));
|
|
rgba *= modulate;
|
|
}
|
|
|
|
rgba.a *= mix(1.0, exp(-0.5 * z), falloff);
|
|
|
|
if (rgba.a < minAlpha) {
|
|
discard;
|
|
}
|
|
if (encodeLinear) {
|
|
rgba.rgb = srgbToLinear(rgba.rgb);
|
|
}
|
|
|
|
if (premultipliedAlpha) {
|
|
fragColor = vec4(rgba.rgb * rgba.a, rgba.a);
|
|
} else {
|
|
fragColor = rgba;
|
|
}
|
|
}`, Jo = `precision highp float;
|
|
precision highp int;
|
|
precision highp usampler2DArray;
|
|
|
|
#include <splatDefines>
|
|
|
|
attribute uint splatIndex;
|
|
|
|
out vec4 vRgba;
|
|
out vec2 vSplatUv;
|
|
out vec3 vNdc;
|
|
|
|
uniform vec2 renderSize;
|
|
uniform uint numSplats;
|
|
uniform vec4 renderToViewQuat;
|
|
uniform vec3 renderToViewPos;
|
|
uniform float maxStdDev;
|
|
uniform float maxPixelRadius;
|
|
uniform float time;
|
|
uniform float deltaTime;
|
|
uniform bool debugFlag;
|
|
uniform float minAlpha;
|
|
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;
|
|
}
|
|
if (splatIndex == 0xffffffffu) {
|
|
|
|
return;
|
|
}
|
|
|
|
ivec3 texCoord = ivec3(
|
|
splatIndex & SPLAT_TEX_WIDTH_MASK,
|
|
(splatIndex >> SPLAT_TEX_WIDTH_BITS) & SPLAT_TEX_HEIGHT_MASK,
|
|
splatIndex >> SPLAT_TEX_LAYER_BITS
|
|
);
|
|
uvec4 packed = texelFetch(packedSplats, texCoord, 0);
|
|
|
|
vec3 center, scales;
|
|
vec4 quaternion, rgba;
|
|
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;
|
|
}
|
|
|
|
|
|
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 Re = null;
|
|
function bo() {
|
|
return Re || (E.ShaderChunk.splatDefines = Lo, Re = {
|
|
splatVertex: Jo,
|
|
splatFragment: Yo
|
|
}), Re;
|
|
}
|
|
const wg = 5;
|
|
let Ze = !1, Ve = !1, ji;
|
|
function vo(t) {
|
|
let A = !1;
|
|
return t instanceof PA ? !0 : (t.traverse((e) => {
|
|
A = A || e instanceof PA;
|
|
}), A);
|
|
}
|
|
const Pi = E.Scene.prototype.add;
|
|
E.Scene.prototype.add = function(t) {
|
|
return Ze = Ze || vo(t), Ve = Ve || t instanceof ce, Pi.call(this, t), this;
|
|
};
|
|
const To = E.Scene.prototype.onBeforeRender;
|
|
E.Scene.prototype.onBeforeRender = function(t) {
|
|
if (Ze) {
|
|
if (!Ve) {
|
|
const A = ji || new ce({ renderer: t });
|
|
this.add(A);
|
|
}
|
|
E.Scene.prototype.onBeforeRender = To, E.Scene.prototype.add = Pi;
|
|
}
|
|
};
|
|
const QA = class QA extends E.Mesh {
|
|
constructor(A) {
|
|
const e = QA.makeUniforms(), g = bo(), I = A.premultipliedAlpha ?? !0, s = new E.ShaderMaterial({
|
|
glslVersion: E.GLSL3,
|
|
vertexShader: g.splatVertex,
|
|
fragmentShader: g.splatFragment,
|
|
uniforms: e,
|
|
transparent: !0,
|
|
blending: I ? E.CustomBlending : E.NormalBlending,
|
|
blendSrc: I ? E.OneFactor : E.SrcAlphaFactor,
|
|
blendDst: I ? E.OneMinusSrcAlphaFactor : E.OneFactor,
|
|
depthTest: !0,
|
|
depthWrite: !1,
|
|
side: E.DoubleSide
|
|
});
|
|
super(Dg, s), this.splatTexture = null, this.autoViewpoints = [], this.rotateToAccumulator = new Rt({ value: new E.Quaternion() }), this.translateToAccumulator = new Gt({ value: new E.Vector3() }), this.lastFrame = -1, this.lastUpdateTime = null, this.defaultCameras = [], this.pendingUpdate = null, this.envViewpoint = null, this.frustumCulled = !1, this.renderer = A.renderer, this.material = s, this.uniforms = e;
|
|
const B = NA(
|
|
{ gsplat: AA },
|
|
{ gsplat: AA },
|
|
({ gsplat: i }) => {
|
|
if (!i)
|
|
throw new Error("gsplat not defined");
|
|
return i = $e(i, {
|
|
rotate: this.rotateToAccumulator,
|
|
translate: this.translateToAccumulator
|
|
}), { gsplat: i };
|
|
}
|
|
);
|
|
this.modifier = new oo(B), this.premultipliedAlpha = I, 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 ?? { ...De }, this.active = new ke(), this.accumulatorCount = 1, this.freeAccumulators = [];
|
|
for (let i = 0; i < 1; ++i)
|
|
this.freeAccumulators.push(new ke()), this.accumulatorCount += 1;
|
|
this.defaultView = new re({
|
|
...A.view,
|
|
autoUpdate: !0,
|
|
spark: this
|
|
}), this.viewpoint = this.defaultView, this.prepareViewpoint(this.viewpoint), this.clock = A.clock ? TI(A.clock) : new E.Clock(), ji = this;
|
|
}
|
|
static makeUniforms() {
|
|
return {
|
|
// Size of render viewport in pixels
|
|
renderSize: { value: new E.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 E.Quaternion() },
|
|
// SplatAccumulator to view transformation translation
|
|
renderToViewPos: { value: new E.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 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: QA.EMPTY_SPLAT_TEXTURE },
|
|
// Splat texture UV transform (multiply)
|
|
splatTexMul: { value: new E.Matrix2() },
|
|
// Splat texture UV transform (add)
|
|
splatTexAdd: { value: new E.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: ZA.getEmpty() },
|
|
// Splat encoding ranges
|
|
rgbMinMaxLnScaleMinMax: { value: new E.Vector4() },
|
|
// Time in seconds for time-based effects
|
|
time: { value: 0 },
|
|
// Delta time in seconds since last frame
|
|
deltaTime: { value: 0 },
|
|
// Whether to use premultiplied alpha when accumulating splat RGB
|
|
premultipliedAlpha: { 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 < wg;
|
|
}
|
|
maybeAllocAccumulator() {
|
|
let A = this.freeAccumulators.pop();
|
|
if (A === void 0) {
|
|
if (this.accumulatorCount >= wg)
|
|
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 re({ ...A, spark: this });
|
|
}
|
|
onBeforeRender(A, e, g) {
|
|
var r, h;
|
|
const I = this.time ?? this.clock.getElapsedTime(), s = I - (this.viewpoint.lastTime ?? I);
|
|
this.viewpoint.lastTime = I;
|
|
const B = A.info.render.frame, i = B !== this.lastFrame;
|
|
this.lastFrame = B;
|
|
const Q = this.viewpoint;
|
|
if (Q === this.defaultView) {
|
|
if (i)
|
|
if (!A.xr.isPresenting)
|
|
this.defaultView.viewToWorld = g.matrixWorld.clone(), this.defaultCameras = [this.defaultView.viewToWorld];
|
|
else {
|
|
const c = A.xr.getCamera().cameras;
|
|
this.defaultCameras = c.map((l) => l.matrixWorld), this.defaultView.viewToWorld = Ho(this.defaultCameras) ?? new E.Matrix4();
|
|
}
|
|
this.autoUpdate && this.update({ scene: e, viewToWorld: this.defaultView.viewToWorld });
|
|
}
|
|
if (i) {
|
|
const c = this.premultipliedAlpha ? E.CustomBlending : E.NormalBlending;
|
|
c !== this.material.blending && (this.material.blending = c, this.material.blendSrc = this.premultipliedAlpha ? E.OneFactor : E.SrcAlphaFactor, this.material.blendDst = this.premultipliedAlpha ? E.OneMinusSrcAlphaFactor : E.OneFactor, this.material.needsUpdate = !0), this.uniforms.premultipliedAlpha.value = this.premultipliedAlpha, this.uniforms.time.value = I, this.uniforms.deltaTime.value = s, this.uniforms.debugFlag.value = performance.now() / 1e3 % 2 < 1;
|
|
}
|
|
if (Q.target)
|
|
this.uniforms.renderSize.value.set(
|
|
Q.target.width,
|
|
Q.target.height
|
|
);
|
|
else {
|
|
const c = A.getDrawingBufferSize(
|
|
this.uniforms.renderSize.value
|
|
);
|
|
if (c.x === 1 && c.y === 1) {
|
|
const l = (r = A.xr.getSession()) == null ? void 0 : r.renderState.baseLayer;
|
|
l && (c.x = l.framebufferWidth, c.y = l.framebufferHeight);
|
|
}
|
|
}
|
|
const C = g;
|
|
if (this.uniforms.near.value = C.near, this.uniforms.far.value = C.far, this.uniforms.encodeLinear.value = Q.encodeLinear, this.uniforms.maxStdDev.value = this.maxStdDev, this.uniforms.maxPixelRadius.value = this.maxPixelRadius, this.uniforms.minAlpha.value = this.minAlpha, this.uniforms.enable2DGS.value = this.enable2DGS, this.uniforms.preBlurAmount.value = this.preBlurAmount, this.uniforms.blurAmount.value = this.blurAmount, this.uniforms.focalDistance.value = this.focalDistance, this.uniforms.apertureAngle.value = this.apertureAngle, this.uniforms.falloff.value = this.falloff, this.uniforms.clipXY.value = this.clipXY, this.uniforms.focalAdjustment.value = this.focalAdjustment, this.splatTexture) {
|
|
const { enable: c, texture: l, multiply: u, add: w, near: D, far: y, mid: d } = this.splatTexture;
|
|
c && l ? (this.uniforms.splatTexEnable.value = !0, this.uniforms.splatTexture.value = l, u ? this.uniforms.splatTexMul.value.fromArray(u.elements) : this.uniforms.splatTexMul.value.set(
|
|
0.5 / this.maxStdDev,
|
|
0,
|
|
0,
|
|
0.5 / this.maxStdDev
|
|
), this.uniforms.splatTexAdd.value.set((w == null ? void 0 : w.x) ?? 0.5, (w == null ? void 0 : w.y) ?? 0.5), this.uniforms.splatTexNear.value = D ?? this.uniforms.near.value, this.uniforms.splatTexFar.value = y ?? this.uniforms.far.value, this.uniforms.splatTexMid.value = d ?? 0) : (this.uniforms.splatTexEnable.value = !1, this.uniforms.splatTexture.value = QA.EMPTY_SPLAT_TEXTURE);
|
|
} else
|
|
this.uniforms.splatTexEnable.value = !1, this.uniforms.splatTexture.value = QA.EMPTY_SPLAT_TEXTURE;
|
|
const a = ((h = Q.display) == null ? void 0 : h.accumulator.toWorld) ?? new E.Matrix4(), n = g.matrixWorld.clone().invert();
|
|
a.clone().premultiply(n).decompose(
|
|
this.uniforms.renderToViewPos.value,
|
|
this.uniforms.renderToViewQuat.value,
|
|
new E.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, g, I, s;
|
|
if (this.viewpoint = A ?? this.viewpoint, this.viewpoint.display) {
|
|
const { accumulator: B, geometry: i } = this.viewpoint.display;
|
|
this.uniforms.numSplats.value = B.splats.numSplats, this.uniforms.packedSplats.value = B.splats.getTexture(), this.uniforms.rgbMinMaxLnScaleMinMax.value.set(
|
|
((e = B.splats.splatEncoding) == null ? void 0 : e.rgbMin) ?? 0,
|
|
((g = B.splats.splatEncoding) == null ? void 0 : g.rgbMax) ?? 1,
|
|
((I = B.splats.splatEncoding) == null ? void 0 : I.lnScaleMin) ?? UA,
|
|
((s = B.splats.splatEncoding) == null ? void 0 : s.lnScaleMax) ?? LA
|
|
), this.geometry = i;
|
|
} else
|
|
this.uniforms.numSplats.value = 0, this.uniforms.packedSplats.value = ZA.getEmpty(), this.geometry = Dg;
|
|
}
|
|
// If spark.autoUpdate is false then you must manually call
|
|
// spark.update({ scene }) to have the scene Gsplats be re-generated.
|
|
update({
|
|
scene: A,
|
|
viewToWorld: e
|
|
}) {
|
|
const g = this.matrixWorld.clone();
|
|
this.preUpdate ? this.updateInternal({ scene: A, originToWorld: g, viewToWorld: e }) : (this.pendingUpdate = {
|
|
scene: A,
|
|
originToWorld: g
|
|
}, setTimeout(() => {
|
|
if (this.pendingUpdate) {
|
|
const { scene: I, originToWorld: s } = this.pendingUpdate;
|
|
this.pendingUpdate = null, this.updateInternal({ scene: I, originToWorld: s, viewToWorld: e });
|
|
}
|
|
}, 1));
|
|
}
|
|
updateInternal({
|
|
scene: A,
|
|
originToWorld: e,
|
|
viewToWorld: g
|
|
}) {
|
|
var h;
|
|
if (!this.canAllocAccumulator())
|
|
return !1;
|
|
e || (e = this.active.toWorld), g = g ?? e.clone();
|
|
const I = this.time ?? this.clock.getElapsedTime(), s = I - (this.lastUpdateTime ?? I);
|
|
this.lastUpdateTime = I;
|
|
const B = this.active.mapping.reduce((c, l) => (c.set(l.node, l), c), /* @__PURE__ */ new Map()), { generators: i, visibleGenerators: Q, globalEdits: C } = this.compileScene(A);
|
|
for (const c of i)
|
|
(h = c.frameUpdate) == null || h.call(c, {
|
|
object: c,
|
|
time: I,
|
|
deltaTime: s,
|
|
viewToWorld: g,
|
|
globalEdits: C
|
|
});
|
|
const a = new Set(Q.map((c) => c.uuid));
|
|
for (const c of i) {
|
|
const l = B.get(c), w = c.generator && a.has(c.uuid) ? c.numSplats : 0;
|
|
(this.needsUpdate || c.generator !== (l == null ? void 0 : l.generator) || w !== (l == null ? void 0 : l.count)) && c.updateVersion();
|
|
}
|
|
const n = !ne({
|
|
matrix1: e,
|
|
matrix2: this.active.toWorld,
|
|
maxDistance: this.originDistance
|
|
}), o = this.needsUpdate || n || i.length !== B.size || i.some((c) => {
|
|
var l;
|
|
return c.version !== ((l = B.get(c)) == null ? void 0 : l.version);
|
|
});
|
|
this.needsUpdate = !1;
|
|
let r = null;
|
|
if (o) {
|
|
if (r = this.maybeAllocAccumulator(), !r)
|
|
throw new Error("Unreachable");
|
|
const c = !ne({
|
|
matrix1: e,
|
|
matrix2: this.active.toWorld,
|
|
maxDistance: 1e-5,
|
|
minCoorient: 0.99999
|
|
}), u = Q.map((M, p) => {
|
|
const f = B.get(M);
|
|
return f ? (
|
|
// Sort by version deltas then by previous ordering in the mapping,
|
|
// attempting to keep unchanging generators near the front
|
|
// to improve our chances of avoiding a re-generation.
|
|
[M.version - f.version, f.base, M]
|
|
) : [Number.POSITIVE_INFINITY, M.version, M];
|
|
}).sort((M, p) => M[0] !== p[0] ? M[0] - p[0] : M[1] - p[1]).map(([M, p, f]) => f), w = u.map((M) => M.numSplats), { maxSplats: D, mapping: y } = r.splats.generateMapping(w), d = u.map((M, p) => {
|
|
const { base: f, count: R } = y[p];
|
|
return {
|
|
node: M,
|
|
generator: M.generator,
|
|
version: M.version,
|
|
base: f,
|
|
count: R
|
|
};
|
|
});
|
|
e.clone().invert().decompose(
|
|
this.translateToAccumulator.value,
|
|
this.rotateToAccumulator.value,
|
|
new E.Vector3()
|
|
), r.ensureGenerate(D), r.splats.splatEncoding = { ...this.splatEncoding }, r.generateSplats({
|
|
renderer: this.renderer,
|
|
modifier: this.modifier,
|
|
generators: d,
|
|
forceUpdate: c,
|
|
originToWorld: e
|
|
}), r.splatsVersion = this.active.splatsVersion + 1;
|
|
const S = r.hasCorrespondence(this.active);
|
|
r.mappingVersion = this.active.mappingVersion + (S ? 0 : 1), this.releaseAccumulator(this.active), this.active = r, this.prepareViewpoint();
|
|
}
|
|
return setTimeout(() => {
|
|
for (const c of this.autoViewpoints)
|
|
c.autoPoll({ accumulator: r ?? void 0 });
|
|
}, 1), !0;
|
|
}
|
|
compileScene(A) {
|
|
const e = [];
|
|
A.traverse((s) => {
|
|
s instanceof Zt && e.push(s);
|
|
});
|
|
const g = [];
|
|
A.traverseVisible((s) => {
|
|
s instanceof Zt && g.push(s);
|
|
});
|
|
const I = /* @__PURE__ */ new Set();
|
|
return A.traverseVisible((s) => {
|
|
if (s instanceof ae) {
|
|
let B = s.parent;
|
|
for (; B != null && !(B instanceof PA); )
|
|
B = B.parent;
|
|
B == null && I.add(s);
|
|
}
|
|
}), {
|
|
generators: e,
|
|
visibleGenerators: g,
|
|
globalEdits: Array.from(I)
|
|
};
|
|
}
|
|
// Renders out the scene to an environment map that can be used for
|
|
// Image-based lighting or similar applications. First optionally updates Gsplats,
|
|
// sorts them with respect to the provided worldCenter, renders 6 cube faces,
|
|
// then pre-filters them using THREE.PMREMGenerator and returns a THREE.Texture
|
|
// that can assigned directly to a THREE.MeshStandardMaterial.envMap property.
|
|
async renderEnvMap({
|
|
renderer: A,
|
|
scene: e,
|
|
worldCenter: g,
|
|
size: I = 256,
|
|
near: s = 0.1,
|
|
far: B = 1e3,
|
|
hideObjects: i = [],
|
|
update: Q = !1
|
|
}) {
|
|
var r, h;
|
|
if (this.envViewpoint || (this.envViewpoint = this.newViewpoint({ sort360: !0 })), !QA.cubeRender || QA.cubeRender.target.width !== I || QA.cubeRender.near !== s || QA.cubeRender.far !== B) {
|
|
QA.cubeRender && QA.cubeRender.target.dispose();
|
|
const c = new E.WebGLCubeRenderTarget(I, {
|
|
format: E.RGBAFormat,
|
|
generateMipmaps: !0,
|
|
minFilter: E.LinearMipMapLinearFilter
|
|
}), l = new E.CubeCamera(s, B, c);
|
|
QA.cubeRender = { target: c, camera: l, near: s, far: B };
|
|
}
|
|
QA.pmrem || (QA.pmrem = new E.PMREMGenerator(A ?? this.renderer));
|
|
const C = new E.Matrix4().setPosition(g);
|
|
await ((r = this.envViewpoint) == null ? void 0 : r.prepare({ scene: e, viewToWorld: C, update: Q }));
|
|
const { target: a, camera: n } = QA.cubeRender;
|
|
n.position.copy(g);
|
|
const o = /* @__PURE__ */ new Map();
|
|
for (const c of i)
|
|
o.set(c, c.visible), c.visible = !1;
|
|
this.prepareViewpoint(this.envViewpoint), n.update(A ?? this.renderer, e), this.prepareViewpoint(this.defaultView);
|
|
for (const [c, l] of o.entries())
|
|
c.visible = l;
|
|
return (h = QA.pmrem) == null ? void 0 : h.fromCubemap(a.texture).texture;
|
|
}
|
|
// Utility function to recursively set the envMap property for any
|
|
// THREE.MeshStandardMaterial within the subtree of root.
|
|
recurseSetEnvMap(A, e) {
|
|
A.traverse((g) => {
|
|
if (g instanceof E.Mesh)
|
|
if (Array.isArray(g.material))
|
|
for (const I of g.material)
|
|
I instanceof E.MeshStandardMaterial && (I.envMap = e);
|
|
else
|
|
g.material instanceof E.MeshStandardMaterial && (g.material.envMap = e);
|
|
});
|
|
}
|
|
// Utility function that helps extract the Gsplat RGBA values from a
|
|
// SplatGenerator, including the result of any real-time RGBA SDF edits applied
|
|
// to a SplatMesh. This effectively "bakes" any computed RGBA values, which can
|
|
// now be used as a pipeline input via SplatMesh.splatRgba to inject these
|
|
// baked values into the Gsplat data.
|
|
getRgba({
|
|
generator: A,
|
|
rgba: e
|
|
}) {
|
|
const g = this.active.mapping.find(({ node: I }) => I === A);
|
|
if (!g)
|
|
throw new Error("Generator not found");
|
|
return e = e ?? new qe(), e.fromPackedSplats({
|
|
packedSplats: this.active.splats,
|
|
base: g.base,
|
|
count: g.count,
|
|
renderer: this.renderer
|
|
}), e;
|
|
}
|
|
// Utility function that builds on getRgba({ generator }) and additionally
|
|
// reads back the RGBA values to the CPU in a Uint8Array with packed RGBA
|
|
// in that byte order.
|
|
async readRgba({
|
|
generator: A,
|
|
rgba: e
|
|
}) {
|
|
return e = this.getRgba({ generator: A, rgba: e }), e.read();
|
|
}
|
|
};
|
|
QA.cubeRender = null, QA.pmrem = null, QA.EMPTY_SPLAT_TEXTURE = new E.Data3DTexture();
|
|
let ce = QA;
|
|
const Dg = new ze(new Uint32Array(1), 0);
|
|
NA(
|
|
{ packedSplats: Pt, index: "int" },
|
|
{ gsplat: AA },
|
|
({ packedSplats: t, index: A }) => {
|
|
if (!t || !A)
|
|
throw new Error("Invalid input");
|
|
return { gsplat: Ft(t, A) };
|
|
}
|
|
);
|
|
function Ho(t) {
|
|
if (t.length === 0)
|
|
return null;
|
|
const A = new E.Vector3(), e = new E.Quaternion(), g = new E.Vector3(), I = [], s = [];
|
|
for (const B of t)
|
|
B.decompose(A, e, g), I.push(A), s.push(e);
|
|
return new E.Matrix4().compose(
|
|
KI(I),
|
|
qI(s),
|
|
new E.Vector3(1, 1, 1)
|
|
);
|
|
}
|
|
function Ko(t, A, e) {
|
|
const g = Math.floor(t.length / 32);
|
|
if (g * 32 !== t.length)
|
|
throw new Error("Invalid .splat file size");
|
|
const I = new Float32Array(t.buffer);
|
|
for (let s = 0; s < g; ++s) {
|
|
const B = s * 32, i = s * 8, Q = I[i + 0], C = I[i + 1], a = I[i + 2], n = I[i + 3], o = I[i + 4], r = I[i + 5], h = t[B + 24] / 255, c = t[B + 25] / 255, l = t[B + 26] / 255, u = t[B + 27] / 255, w = (t[B + 28] - 128) / 128, D = (t[B + 29] - 128) / 128, y = (t[B + 30] - 128) / 128, d = (t[B + 31] - 128) / 128;
|
|
e(
|
|
s,
|
|
Q,
|
|
C,
|
|
a,
|
|
n,
|
|
o,
|
|
r,
|
|
D,
|
|
y,
|
|
d,
|
|
w,
|
|
u,
|
|
h,
|
|
c,
|
|
l
|
|
);
|
|
}
|
|
}
|
|
const yg = {
|
|
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
|
|
}
|
|
}, qo = {
|
|
0: 0,
|
|
1: 9,
|
|
2: 24,
|
|
3: 45
|
|
};
|
|
function zo(t, A, e, g) {
|
|
var c;
|
|
let B = 0;
|
|
const i = new DataView(t.buffer, B, 4096);
|
|
B += 4096;
|
|
const Q = i.getUint8(0), C = i.getUint8(1);
|
|
if (Q !== 0 || C < 1)
|
|
throw new Error(
|
|
`Unsupported .ksplat version: ${Q}.${C}`
|
|
);
|
|
const a = i.getUint32(4, !0);
|
|
i.getUint32(16, !0);
|
|
const n = i.getUint16(20, !0);
|
|
if (n < 0 || n > 2)
|
|
throw new Error(`Invalid .ksplat compression level: ${n}`);
|
|
const o = i.getFloat32(36, !0) || -1.5, r = i.getFloat32(40, !0) || 1.5;
|
|
let h = 4096 + a * 1024;
|
|
for (let l = 0; l < a; ++l) {
|
|
let u = function(SA, K) {
|
|
if (n === 0)
|
|
return b.getFloat32(
|
|
SA + W + K * 4,
|
|
!0
|
|
);
|
|
if (n === 1)
|
|
return dA(
|
|
b.getUint16(
|
|
SA + W + K * 2,
|
|
!0
|
|
)
|
|
);
|
|
const WA = b.getUint8(SA + W + K) / 255;
|
|
return o + WA * (r - o);
|
|
};
|
|
const w = new DataView(t.buffer, B, 1024);
|
|
B += 1024;
|
|
const D = w.getUint32(0, !0), y = w.getUint32(4, !0), d = w.getUint32(8, !0), S = w.getUint32(12, !0), M = w.getFloat32(16, !0), p = w.getUint16(20, !0), f = (w.getUint32(24, !0) || ((c = yg[n]) == null ? void 0 : c.scaleRange)) ?? 1, R = w.getUint32(32, !0), N = R * d, m = w.getUint32(36, !0), L = m * 4, x = p * S + L, G = w.getUint16(40, !0), U = qo[G], {
|
|
bytesPerCenter: J,
|
|
bytesPerScale: P,
|
|
bytesPerRotation: T,
|
|
bytesPerColor: eA,
|
|
bytesPerSphericalHarmonicsComponent: z,
|
|
scaleOffsetBytes: _,
|
|
rotationOffsetBytes: H,
|
|
colorOffsetBytes: O,
|
|
sphericalHarmonicsOffsetBytes: W
|
|
} = yg[n], $ = J + P + T + eA + U * z, Y = $ * y, wA = Y + x, CA = [0, 3, 6, 1, 4, 7, 2, 5, 8], DA = [
|
|
9,
|
|
14,
|
|
19,
|
|
10,
|
|
15,
|
|
20,
|
|
11,
|
|
16,
|
|
21,
|
|
12,
|
|
17,
|
|
22,
|
|
13,
|
|
18,
|
|
23
|
|
], yA = [
|
|
24,
|
|
31,
|
|
38,
|
|
25,
|
|
32,
|
|
39,
|
|
26,
|
|
33,
|
|
40,
|
|
27,
|
|
34,
|
|
41,
|
|
28,
|
|
35,
|
|
42,
|
|
29,
|
|
36,
|
|
43,
|
|
30,
|
|
37,
|
|
44
|
|
], MA = G >= 1 ? new Float32Array(3 * 3) : void 0, rA = G >= 2 ? new Float32Array(5 * 3) : void 0, JA = G >= 3 ? new Float32Array(7 * 3) : void 0, mA = M / 2 / f, _A = h + L, OA = h + x, b = new DataView(
|
|
t.buffer,
|
|
OA,
|
|
Y
|
|
), uA = new Float32Array(
|
|
t.buffer,
|
|
_A,
|
|
S * 3
|
|
), XA = new Uint32Array(
|
|
t.buffer,
|
|
h,
|
|
m
|
|
);
|
|
let Lt = R, Ot = N;
|
|
for (let SA = 0; SA < D; ++SA) {
|
|
const K = SA * $;
|
|
let WA;
|
|
if (SA < N)
|
|
WA = Math.floor(SA / d);
|
|
else {
|
|
const $A = XA[Lt - R];
|
|
SA >= Ot + $A && (Lt += 1, Ot += $A), WA = Lt;
|
|
}
|
|
const ye = n === 0 ? b.getFloat32(K + 0, !0) : (b.getUint16(K + 0, !0) - f) * mA + uA[3 * WA + 0], pe = n === 0 ? b.getFloat32(K + 4, !0) : (b.getUint16(K + 2, !0) - f) * mA + uA[3 * WA + 1], de = n === 0 ? b.getFloat32(K + 8, !0) : (b.getUint16(K + 4, !0) - f) * mA + uA[3 * WA + 2], fe = n === 0 ? b.getFloat32(K + _ + 0, !0) : dA(b.getUint16(K + _ + 0, !0)), Me = n === 0 ? b.getFloat32(K + _ + 4, !0) : dA(b.getUint16(K + _ + 2, !0)), sQ = n === 0 ? b.getFloat32(K + _ + 8, !0) : dA(b.getUint16(K + _ + 4, !0)), BQ = n === 0 ? b.getFloat32(K + H + 0, !0) : dA(
|
|
b.getUint16(K + H + 0, !0)
|
|
), iQ = n === 0 ? b.getFloat32(K + H + 4, !0) : dA(
|
|
b.getUint16(K + H + 2, !0)
|
|
), QQ = n === 0 ? b.getFloat32(K + H + 8, !0) : dA(
|
|
b.getUint16(K + H + 4, !0)
|
|
), nQ = n === 0 ? b.getFloat32(K + H + 12, !0) : dA(
|
|
b.getUint16(K + H + 6, !0)
|
|
), CQ = b.getUint8(K + O + 0) / 255, aQ = b.getUint8(K + O + 1) / 255, EQ = b.getUint8(K + O + 2) / 255, oQ = b.getUint8(K + O + 3) / 255;
|
|
if (e(
|
|
SA,
|
|
ye,
|
|
pe,
|
|
de,
|
|
fe,
|
|
Me,
|
|
sQ,
|
|
iQ,
|
|
QQ,
|
|
nQ,
|
|
BQ,
|
|
oQ,
|
|
CQ,
|
|
aQ,
|
|
EQ
|
|
), G >= 1 && MA) {
|
|
for (const [$A, Yt] of CA.entries())
|
|
MA[$A] = u(K, Yt);
|
|
if (rA)
|
|
for (const [$A, Yt] of DA.entries())
|
|
rA[$A] = u(K, Yt);
|
|
if (JA)
|
|
for (const [$A, Yt] of yA.entries())
|
|
JA[$A] = u(K, Yt);
|
|
g == null || g(SA, MA, rA, JA);
|
|
}
|
|
}
|
|
h += wA;
|
|
}
|
|
}
|
|
class Zo {
|
|
constructor({ fileBytes: A }) {
|
|
this.fileBytes = A instanceof ArrayBuffer ? new Uint8Array(A) : A, this.reader = new WI({ fileBytes: this.fileBytes });
|
|
const e = new DataView(this.reader.read(16).buffer);
|
|
if (e.getUint32(0, !0) !== 1347635022)
|
|
throw new Error("Invalid SPZ file");
|
|
if (this.version = e.getUint32(4, !0), this.version < 1 || this.version > 2)
|
|
throw new Error(`Unsupported SPZ version: ${this.version}`);
|
|
this.numSplats = e.getUint32(8, !0), this.shDegree = e.getUint8(12), this.fractionalBits = e.getUint8(13), this.flags = e.getUint8(14), this.flagAntiAlias = (this.flags & 1) !== 0, this.reserved = e.getUint8(15), this.parsed = !1;
|
|
}
|
|
parseSplats(A, e, g, I, s, B) {
|
|
if (this.parsed)
|
|
throw new Error("SPZ file already parsed");
|
|
if (this.parsed = !0, this.version === 1) {
|
|
const i = this.reader.read(this.numSplats * 3 * 2), Q = new Uint16Array(i.buffer);
|
|
for (let C = 0; C < this.numSplats; C++) {
|
|
const a = C * 3, n = dA(Q[a]), o = dA(Q[a + 1]), r = dA(Q[a + 2]);
|
|
A == null || A(C, n, o, r);
|
|
}
|
|
} else if (this.version === 2) {
|
|
const i = 1 << this.fractionalBits, Q = this.reader.read(this.numSplats * 3 * 3);
|
|
for (let C = 0; C < this.numSplats; C++) {
|
|
const a = C * 9, n = ((Q[a + 2] << 24 | Q[a + 1] << 16 | Q[a] << 8) >> 8) / i, o = ((Q[a + 5] << 24 | Q[a + 4] << 16 | Q[a + 3] << 8) >> 8) / i, r = ((Q[a + 8] << 24 | Q[a + 7] << 16 | Q[a + 6] << 8) >> 8) / i;
|
|
A == null || A(C, n, o, r);
|
|
}
|
|
} else
|
|
throw new Error("Unreachable");
|
|
{
|
|
const i = this.reader.read(this.numSplats);
|
|
for (let Q = 0; Q < this.numSplats; Q++)
|
|
e == null || e(Q, i[Q] / 255);
|
|
}
|
|
{
|
|
const i = this.reader.read(this.numSplats * 3), Q = Oi / 0.15;
|
|
for (let C = 0; C < this.numSplats; C++) {
|
|
const a = C * 3, n = (i[a] / 255 - 0.5) * Q + 0.5, o = (i[a + 1] / 255 - 0.5) * Q + 0.5, r = (i[a + 2] / 255 - 0.5) * Q + 0.5;
|
|
g == null || g(C, n, o, r);
|
|
}
|
|
}
|
|
{
|
|
const i = this.reader.read(this.numSplats * 3);
|
|
for (let Q = 0; Q < this.numSplats; Q++) {
|
|
const C = Q * 3, a = Math.exp(i[C] / 16 - 10), n = Math.exp(i[C + 1] / 16 - 10), o = Math.exp(i[C + 2] / 16 - 10);
|
|
I == null || I(Q, a, n, o);
|
|
}
|
|
}
|
|
{
|
|
const i = this.reader.read(this.numSplats * 3);
|
|
for (let Q = 0; Q < this.numSplats; Q++) {
|
|
const C = Q * 3, a = i[C] / 127.5 - 1, n = i[C + 1] / 127.5 - 1, o = i[C + 2] / 127.5 - 1, r = Math.sqrt(
|
|
Math.max(0, 1 - a * a - n * n - o * o)
|
|
);
|
|
s == null || s(Q, a, n, o, r);
|
|
}
|
|
}
|
|
if (B && this.shDegree >= 1) {
|
|
const i = new Float32Array(9), Q = this.shDegree >= 2 ? new Float32Array(5 * 3) : void 0, C = this.shDegree >= 3 ? new Float32Array(7 * 3) : void 0, a = this.reader.read(
|
|
this.numSplats * _i[this.shDegree] * 3
|
|
);
|
|
let n = 0;
|
|
for (let o = 0; o < this.numSplats; o++) {
|
|
for (let r = 0; r < 9; ++r)
|
|
i[r] = (a[n + r] - 128) / 128;
|
|
if (n += 9, Q) {
|
|
for (let r = 0; r < 15; ++r)
|
|
Q[r] = (a[n + r] - 128) / 128;
|
|
n += 15;
|
|
}
|
|
if (C) {
|
|
for (let r = 0; r < 21; ++r)
|
|
C[r] = (a[n + r] - 128) / 128;
|
|
n += 21;
|
|
}
|
|
B == null || B(o, i, Q, C);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
const _i = { 1: 3, 2: 8, 3: 15 }, Oi = 0.28209479177387814, Vo = 1347635022, Xo = 2, Wo = 1;
|
|
class et {
|
|
constructor({
|
|
numSplats: A,
|
|
shDegree: e,
|
|
fractionalBits: g = 12,
|
|
flagAntiAlias: I = !0
|
|
}) {
|
|
this.clippedCount = 0;
|
|
const s = 19 + (e >= 1 ? 9 : 0) + (e >= 2 ? 15 : 0) + (e >= 3 ? 21 : 0), B = 16 + A * s;
|
|
this.buffer = new ArrayBuffer(B), this.view = new DataView(this.buffer), this.view.setUint32(0, Vo, !0), this.view.setUint32(4, Xo, !0), this.view.setUint32(8, A, !0), this.view.setUint8(12, e), this.view.setUint8(13, g), this.view.setUint8(14, I ? Wo : 0), this.view.setUint8(15, 0), this.numSplats = A, this.shDegree = e, this.fractionalBits = g, this.fraction = 1 << g, this.flagAntiAlias = I;
|
|
}
|
|
setCenter(A, e, g, I) {
|
|
const s = Math.round(e * this.fraction), B = Math.max(-8388607, Math.min(8388607, s)), i = Math.round(g * this.fraction), Q = Math.max(-8388607, Math.min(8388607, i)), C = Math.round(I * this.fraction), a = Math.max(-8388607, Math.min(8388607, C));
|
|
(s !== B || i !== Q || C !== a) && (this.clippedCount += 1);
|
|
const r = 16 + A * 9;
|
|
this.view.setUint8(r, B & 255), this.view.setUint8(r + 1, B >> 8 & 255), this.view.setUint8(r + 2, B >> 16 & 255), this.view.setUint8(r + 3, Q & 255), this.view.setUint8(r + 4, Q >> 8 & 255), this.view.setUint8(r + 5, Q >> 16 & 255), this.view.setUint8(r + 6, a & 255), this.view.setUint8(r + 7, a >> 8 & 255), this.view.setUint8(r + 8, a >> 16 & 255);
|
|
}
|
|
setAlpha(A, e) {
|
|
const g = 16 + this.numSplats * 9 + A;
|
|
this.view.setUint8(
|
|
g,
|
|
Math.max(0, Math.min(255, Math.round(e * 255)))
|
|
);
|
|
}
|
|
static scaleRgb(A) {
|
|
const e = ((A - 0.5) / (Oi / 0.15) + 0.5) * 255;
|
|
return Math.max(0, Math.min(255, Math.round(e)));
|
|
}
|
|
setRgb(A, e, g, I) {
|
|
const s = 16 + this.numSplats * 10 + A * 3;
|
|
this.view.setUint8(s, et.scaleRgb(e)), this.view.setUint8(s + 1, et.scaleRgb(g)), this.view.setUint8(s + 2, et.scaleRgb(I));
|
|
}
|
|
setScale(A, e, g, I) {
|
|
const s = 16 + this.numSplats * 13 + A * 3;
|
|
this.view.setUint8(
|
|
s,
|
|
Math.max(0, Math.min(255, Math.round((Math.log(e) + 10) * 16)))
|
|
), this.view.setUint8(
|
|
s + 1,
|
|
Math.max(0, Math.min(255, Math.round((Math.log(g) + 10) * 16)))
|
|
), this.view.setUint8(
|
|
s + 2,
|
|
Math.max(0, Math.min(255, Math.round((Math.log(I) + 10) * 16)))
|
|
);
|
|
}
|
|
setQuat(A, e, g, I, s) {
|
|
const B = 16 + this.numSplats * 16 + A * 3, i = s < 0;
|
|
this.view.setUint8(
|
|
B,
|
|
Math.max(
|
|
0,
|
|
Math.min(255, Math.round(((i ? -e : e) + 1) * 127.5))
|
|
)
|
|
), this.view.setUint8(
|
|
B + 1,
|
|
Math.max(
|
|
0,
|
|
Math.min(255, Math.round(((i ? -g : g) + 1) * 127.5))
|
|
)
|
|
), this.view.setUint8(
|
|
B + 2,
|
|
Math.max(
|
|
0,
|
|
Math.min(255, Math.round(((i ? -I : I) + 1) * 127.5))
|
|
)
|
|
);
|
|
}
|
|
static quantizeSh(A, e) {
|
|
const g = Math.round(A * 128) + 128, I = 1 << 8 - e, s = Math.floor((g + I / 2) / I) * I;
|
|
return Math.max(0, Math.min(255, s));
|
|
}
|
|
setSh(A, e, g, I) {
|
|
const s = _i[this.shDegree] || 0, B = 16 + this.numSplats * 19 + A * s * 3;
|
|
for (let i = 0; i < 9; ++i)
|
|
this.view.setUint8(B + i, et.quantizeSh(e[i], 5));
|
|
if (g) {
|
|
const i = B + 9;
|
|
for (let Q = 0; Q < 15; ++Q)
|
|
this.view.setUint8(i + Q, et.quantizeSh(g[Q], 4));
|
|
if (I) {
|
|
const Q = i + 15;
|
|
for (let C = 0; C < 21; ++C)
|
|
this.view.setUint8(Q + C, et.quantizeSh(I[C], 4));
|
|
}
|
|
}
|
|
}
|
|
async finalize() {
|
|
const A = new Uint8Array(this.buffer), g = new ReadableStream({
|
|
async start(B) {
|
|
B.enqueue(A), B.close();
|
|
}
|
|
}).pipeThrough(new CompressionStream("gzip")), s = await new Response(g).arrayBuffer();
|
|
return console.log(
|
|
"Compressed",
|
|
A.length,
|
|
"bytes to",
|
|
s.byteLength,
|
|
"bytes"
|
|
), new Uint8Array(s);
|
|
}
|
|
}
|
|
async function kr(t) {
|
|
var a, n, o;
|
|
const A = new Go(), {
|
|
inputs: e,
|
|
clipXyz: g,
|
|
maxSh: I,
|
|
fractionalBits: s = 12,
|
|
opacityThreshold: B
|
|
} = t;
|
|
for (const r of e) {
|
|
let h = function(p) {
|
|
return p.multiplyScalar(D), p.applyQuaternion(y), p.add(d), p;
|
|
}, c = function(p) {
|
|
return p.multiplyScalar(D), p;
|
|
}, l = function(p) {
|
|
return p.premultiply(y), p;
|
|
}, u = function(p) {
|
|
return !S || S.containsPoint(p);
|
|
}, w = function(p) {
|
|
return B !== void 0 ? p >= B : !0;
|
|
};
|
|
const D = ((a = r.transform) == null ? void 0 : a.scale) ?? 1, y = new E.Quaternion().fromArray(
|
|
((n = r.transform) == null ? void 0 : n.quaternion) ?? [0, 0, 0, 1]
|
|
), d = new E.Vector3().fromArray(
|
|
((o = r.transform) == null ? void 0 : o.translate) ?? [0, 0, 0]
|
|
), S = g ? new E.Box3(
|
|
new E.Vector3().fromArray(g.min),
|
|
new E.Vector3().fromArray(g.max)
|
|
) : void 0;
|
|
let M = r.fileType;
|
|
switch (M || (M = Vi(r.fileBytes), !M && r.pathOrUrl && (M = Xi(r.pathOrUrl))), M) {
|
|
case vt.PLY: {
|
|
const p = new Ee({ fileBytes: r.fileBytes });
|
|
await p.parseHeader();
|
|
let f = null;
|
|
p.parseSplats(
|
|
(R, N, m, L, x, G, U, J, P, T, eA, z, _, H, O) => {
|
|
const W = h(new E.Vector3(N, m, L));
|
|
if (u(W) && w(z)) {
|
|
f = A.pushSplat(), A.setCenter(f, W.x, W.y, W.z);
|
|
const $ = c(
|
|
new E.Vector3(x, G, U)
|
|
);
|
|
A.setScale(f, $.x, $.y, $.z);
|
|
const Y = l(
|
|
new E.Quaternion(J, P, T, eA)
|
|
);
|
|
A.setQuaternion(
|
|
f,
|
|
Y.x,
|
|
Y.y,
|
|
Y.z,
|
|
Y.w
|
|
), A.setOpacity(f, z), A.setColor(f, _, H, O);
|
|
} else
|
|
f = null;
|
|
},
|
|
(R, N, m, L) => {
|
|
N && f !== null && A.setSh1(f, N), m && f !== null && A.setSh2(f, m), L && f !== null && A.setSh3(f, L);
|
|
}
|
|
);
|
|
break;
|
|
}
|
|
case vt.SPZ: {
|
|
const p = new Zo({ fileBytes: r.fileBytes }), f = new Int32Array(p.numSplats);
|
|
f.fill(-1);
|
|
const R = new Float32Array(p.numSplats * 3), N = new E.Vector3();
|
|
p.parseSplats(
|
|
(m, L, x, G) => {
|
|
const U = h(new E.Vector3(L, x, G));
|
|
R[m * 3] = U.x, R[m * 3 + 1] = U.y, R[m * 3 + 2] = U.z;
|
|
},
|
|
(m, L) => {
|
|
N.fromArray(R, m * 3), u(N) && w(L) && (f[m] = A.pushSplat(), A.setCenter(f[m], N.x, N.y, N.z), A.setOpacity(f[m], L));
|
|
},
|
|
(m, L, x, G) => {
|
|
f[m] >= 0 && A.setColor(f[m], L, x, G);
|
|
},
|
|
(m, L, x, G) => {
|
|
if (f[m] >= 0) {
|
|
const U = c(
|
|
new E.Vector3(L, x, G)
|
|
);
|
|
A.setScale(f[m], U.x, U.y, U.z);
|
|
}
|
|
},
|
|
(m, L, x, G, U) => {
|
|
if (f[m] >= 0) {
|
|
const J = l(
|
|
new E.Quaternion(L, x, G, U)
|
|
);
|
|
A.setQuaternion(
|
|
f[m],
|
|
J.x,
|
|
J.y,
|
|
J.z,
|
|
J.w
|
|
);
|
|
}
|
|
},
|
|
(m, L, x, G) => {
|
|
f[m] >= 0 && (A.setSh1(f[m], L), x && A.setSh2(f[m], x), G && A.setSh3(f[m], G));
|
|
}
|
|
);
|
|
break;
|
|
}
|
|
case vt.SPLAT:
|
|
Ko(
|
|
r.fileBytes,
|
|
(p) => {
|
|
},
|
|
(p, f, R, N, m, L, x, G, U, J, P, T, eA, z, _) => {
|
|
const H = h(new E.Vector3(f, R, N));
|
|
if (u(H) && w(T)) {
|
|
const O = A.pushSplat();
|
|
A.setCenter(O, H.x, H.y, H.z);
|
|
const W = c(
|
|
new E.Vector3(m, L, x)
|
|
);
|
|
A.setScale(O, W.x, W.y, W.z);
|
|
const $ = l(
|
|
new E.Quaternion(G, U, J, P)
|
|
);
|
|
A.setQuaternion(
|
|
O,
|
|
$.x,
|
|
$.y,
|
|
$.z,
|
|
$.w
|
|
), A.setOpacity(O, T), A.setColor(O, eA, z, _);
|
|
}
|
|
}
|
|
);
|
|
break;
|
|
case vt.KSPLAT: {
|
|
let p = null;
|
|
zo(
|
|
r.fileBytes,
|
|
(f) => {
|
|
},
|
|
(f, R, N, m, L, x, G, U, J, P, T, eA, z, _, H) => {
|
|
const O = h(new E.Vector3(R, N, m));
|
|
if (u(O) && w(eA)) {
|
|
p = A.pushSplat(), A.setCenter(p, O.x, O.y, O.z);
|
|
const W = c(
|
|
new E.Vector3(L, x, G)
|
|
);
|
|
A.setScale(p, W.x, W.y, W.z);
|
|
const $ = l(
|
|
new E.Quaternion(U, J, P, T)
|
|
);
|
|
A.setQuaternion(
|
|
p,
|
|
$.x,
|
|
$.y,
|
|
$.z,
|
|
$.w
|
|
), A.setOpacity(p, eA), A.setColor(p, z, _, H);
|
|
} else
|
|
p = null;
|
|
},
|
|
(f, R, N, m) => {
|
|
p !== null && (A.setSh1(p, R), N && A.setSh2(p, N), m && A.setSh3(p, m));
|
|
}
|
|
);
|
|
break;
|
|
}
|
|
default:
|
|
throw new Error(`transcodeSpz not implemented for ${M}`);
|
|
}
|
|
}
|
|
const i = Math.min(
|
|
I ?? 3,
|
|
A.sh3 ? 3 : A.sh2 ? 2 : A.sh1 ? 1 : 0
|
|
), Q = new et({
|
|
numSplats: A.numSplats,
|
|
shDegree: i,
|
|
fractionalBits: s,
|
|
flagAntiAlias: !0
|
|
});
|
|
for (let r = 0; r < A.numSplats; ++r) {
|
|
const h = r * 3, c = r * 4;
|
|
Q.setCenter(
|
|
r,
|
|
A.centers[h],
|
|
A.centers[h + 1],
|
|
A.centers[h + 2]
|
|
), Q.setScale(
|
|
r,
|
|
A.scales[h],
|
|
A.scales[h + 1],
|
|
A.scales[h + 2]
|
|
), Q.setQuat(
|
|
r,
|
|
A.quaternions[c],
|
|
A.quaternions[c + 1],
|
|
A.quaternions[c + 2],
|
|
A.quaternions[c + 3]
|
|
), Q.setAlpha(r, A.opacities[r]), Q.setRgb(
|
|
r,
|
|
A.colors[h],
|
|
A.colors[h + 1],
|
|
A.colors[h + 2]
|
|
), A.sh1 && i >= 1 && Q.setSh(
|
|
r,
|
|
A.sh1.slice(r * 9, (r + 1) * 9),
|
|
i >= 2 && A.sh2 ? A.sh2.slice(r * 15, (r + 1) * 15) : void 0,
|
|
i >= 3 && A.sh3 ? A.sh3.slice(r * 21, (r + 1) * 21) : void 0
|
|
);
|
|
}
|
|
return { fileBytes: await Q.finalize(), clippedCount: Q.clippedCount };
|
|
}
|
|
class Rr {
|
|
constructor(A) {
|
|
this.mesh = A.mesh, this.numSplats = A.numSplats ?? this.mesh.numSplats;
|
|
const { width: e, height: g, depth: I, maxSplats: s } = fA(this.numSplats);
|
|
this.skinData = new Uint16Array(s * 4), this.skinTexture = new E.DataArrayTexture(
|
|
this.skinData,
|
|
e,
|
|
g,
|
|
I
|
|
), this.skinTexture.format = E.RGBAIntegerFormat, this.skinTexture.type = E.UnsignedShortType, this.skinTexture.internalFormat = "RGBA16UI", this.skinTexture.needsUpdate = !0, this.numBones = A.numBones ?? 256, this.boneData = new Float32Array(this.numBones * 16), this.boneTexture = new E.DataTexture(
|
|
this.boneData,
|
|
4,
|
|
this.numBones,
|
|
E.RGBAFormat,
|
|
E.FloatType
|
|
), this.boneTexture.internalFormat = "RGBA32F", this.boneTexture.needsUpdate = !0, this.uniform = new k({
|
|
key: "skinning",
|
|
type: $i,
|
|
globals: () => [AQ],
|
|
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 Po(A, this.uniform);
|
|
}
|
|
// Set the "rest" pose for a bone with position and quaternion orientation.
|
|
setRestQuatPos(A, e, g) {
|
|
const I = A * 16;
|
|
this.boneData[I + 0] = e.x, this.boneData[I + 1] = e.y, this.boneData[I + 2] = e.z, this.boneData[I + 3] = e.w, this.boneData[I + 4] = g.x, this.boneData[I + 5] = g.y, this.boneData[I + 6] = g.z, this.boneData[I + 7] = 0, this.boneData[I + 8] = 0, this.boneData[I + 9] = 0, this.boneData[I + 10] = 0, this.boneData[I + 11] = 1, this.boneData[I + 12] = 0, this.boneData[I + 13] = 0, this.boneData[I + 14] = 0, this.boneData[I + 15] = 0;
|
|
}
|
|
// Set the "current" position and orientation of a bone.
|
|
setBoneQuatPos(A, e, g) {
|
|
const I = A * 16, s = new E.Quaternion(
|
|
this.boneData[I + 0],
|
|
this.boneData[I + 1],
|
|
this.boneData[I + 2],
|
|
this.boneData[I + 3]
|
|
), B = new E.Vector3(
|
|
this.boneData[I + 4],
|
|
this.boneData[I + 5],
|
|
this.boneData[I + 6]
|
|
), i = s.clone().invert(), Q = g.clone().sub(B);
|
|
Q.applyQuaternion(i), i.multiply(e);
|
|
const C = new E.Quaternion(
|
|
Q.x,
|
|
Q.y,
|
|
Q.z,
|
|
0
|
|
).multiply(s);
|
|
this.boneData[I + 8] = i.x, this.boneData[I + 9] = i.y, this.boneData[I + 10] = i.z, this.boneData[I + 11] = i.w, this.boneData[I + 12] = 0.5 * C.x, this.boneData[I + 13] = 0.5 * C.y, this.boneData[I + 14] = 0.5 * C.z, this.boneData[I + 15] = 0.5 * C.w;
|
|
}
|
|
// Set up to 4 bone indices and weights for a Gsplat. For fewer than 4 bones,
|
|
// you can set the remaining weights to 0 (and index=0).
|
|
setSplatBones(A, e, g) {
|
|
const I = A * 4;
|
|
this.skinData[I + 0] = Math.min(255, Math.max(0, Math.round(g.x * 255))) + (e.x << 8), this.skinData[I + 1] = Math.min(255, Math.max(0, Math.round(g.y * 255))) + (e.y << 8), this.skinData[I + 2] = Math.min(255, Math.max(0, Math.round(g.z * 255))) + (e.z << 8), this.skinData[I + 3] = Math.min(255, Math.max(0, Math.round(g.w * 255))) + (e.w << 8);
|
|
}
|
|
// Call this to indicate that the bones have changed and the Gsplats need to be
|
|
// re-generated with updated skinning.
|
|
updateBones() {
|
|
this.boneTexture.needsUpdate = !0, this.mesh.needsUpdate = !0;
|
|
}
|
|
}
|
|
const $i = { type: "GsplatSkinning" }, AQ = oA(`
|
|
struct GsplatSkinning {
|
|
int numSplats;
|
|
int numBones;
|
|
usampler2DArray skinTexture;
|
|
sampler2D boneTexture;
|
|
};
|
|
`), jo = oA(`
|
|
void applyGsplatSkinning(
|
|
int numSplats, int numBones,
|
|
usampler2DArray skinTexture, sampler2D boneTexture,
|
|
int splatIndex, inout vec3 center, inout vec4 quaternion
|
|
) {
|
|
if ((splatIndex < 0) || (splatIndex >= numSplats)) {
|
|
return;
|
|
}
|
|
|
|
uvec4 skinData = texelFetch(skinTexture, splatTexCoord(splatIndex), 0);
|
|
|
|
float weights[4];
|
|
weights[0] = float(skinData.x & 0xffu) / 255.0;
|
|
weights[1] = float(skinData.y & 0xffu) / 255.0;
|
|
weights[2] = float(skinData.z & 0xffu) / 255.0;
|
|
weights[3] = float(skinData.w & 0xffu) / 255.0;
|
|
|
|
uint boneIndices[4];
|
|
boneIndices[0] = (skinData.x >> 8u) & 0xffu;
|
|
boneIndices[1] = (skinData.y >> 8u) & 0xffu;
|
|
boneIndices[2] = (skinData.z >> 8u) & 0xffu;
|
|
boneIndices[3] = (skinData.w >> 8u) & 0xffu;
|
|
|
|
vec4 quat = vec4(0.0);
|
|
vec4 dual = vec4(0.0);
|
|
for (int i = 0; i < 4; i++) {
|
|
if (weights[i] > 0.0) {
|
|
int boneIndex = int(boneIndices[i]);
|
|
vec4 boneQuat = vec4(0.0, 0.0, 0.0, 1.0);
|
|
vec4 boneDual = vec4(0.0);
|
|
if (boneIndex < numBones) {
|
|
boneQuat = texelFetch(boneTexture, ivec2(2, boneIndex), 0);
|
|
boneDual = texelFetch(boneTexture, ivec2(3, boneIndex), 0);
|
|
}
|
|
|
|
if ((i > 0) && (dot(quat, boneQuat) < 0.0)) {
|
|
// Flip sign if next blend is pointing in the opposite direction
|
|
boneQuat = -boneQuat;
|
|
boneDual = -boneDual;
|
|
}
|
|
quat += weights[i] * boneQuat;
|
|
dual += weights[i] * boneDual;
|
|
}
|
|
}
|
|
|
|
// Normalize dual quaternion
|
|
float norm = length(quat);
|
|
quat /= norm;
|
|
dual /= norm;
|
|
vec3 translate = vec3(
|
|
2.0 * (-dual.w * quat.x + dual.x * quat.w - dual.y * quat.z + dual.z * quat.y),
|
|
2.0 * (-dual.w * quat.y + dual.x * quat.z + dual.y * quat.w - dual.z * quat.x),
|
|
2.0 * (-dual.w * quat.z - dual.x * quat.y + dual.y * quat.x + dual.z * quat.w)
|
|
);
|
|
|
|
center = quatVec(quat, center) + translate;
|
|
quaternion = quatQuat(quat, quaternion);
|
|
}
|
|
`);
|
|
function Po(t, A) {
|
|
return new X({
|
|
inTypes: { gsplat: AA, skinning: $i },
|
|
outTypes: { gsplat: AA },
|
|
globals: () => [AQ, jo],
|
|
inputs: { gsplat: t, skinning: A },
|
|
statements: ({ inputs: g, outputs: I }) => {
|
|
const { skinning: s } = g, { gsplat: B } = I;
|
|
return YA(`
|
|
${B} = ${g.gsplat};
|
|
if (isGsplatActive(${B}.flags)) {
|
|
applyGsplatSkinning(
|
|
${s}.numSplats, ${s}.numBones,
|
|
${s}.skinTexture, ${s}.boneTexture,
|
|
${B}.index, ${B}.center, ${B}.quaternion
|
|
);
|
|
}
|
|
`);
|
|
}
|
|
}).outputs.gsplat;
|
|
}
|
|
function Ur({
|
|
// PackedSplats object to add splats to
|
|
splats: t,
|
|
// min and max box extents of the grid
|
|
extents: A,
|
|
// step size along each grid axis
|
|
stepSize: e = 1,
|
|
// spherical radius of each Gsplat
|
|
pointRadius: g = 0.01,
|
|
// relative size of the "shadow copy" of each Gsplat placed behind it
|
|
pointShadowScale: I = 2,
|
|
// Gsplat opacity
|
|
opacity: s = 1,
|
|
// Gsplat color (THREE.Color) or function to set color for position:
|
|
// ((THREE.Color, THREE.Vector3) => void) (default: RGB-modulated grid)
|
|
color: B
|
|
}) {
|
|
const Q = new E.Vector3(), C = new E.Vector3(), a = new E.Quaternion(0, 0, 0, 1);
|
|
B == null && (B = (o, r) => o.set(
|
|
0.55 + 0.45 * Math.cos(r.x * 1),
|
|
0.55 + 0.45 * Math.cos(r.y * 1),
|
|
0.55 + 0.45 * Math.cos(r.z * 1)
|
|
));
|
|
const n = new E.Color();
|
|
for (let o = A.min.z; o < A.max.z + 1e-6; o += e)
|
|
for (let r = A.min.y; r < A.max.y + 1e-6; r += e)
|
|
for (let h = A.min.x; h < A.max.x + 1e-6; h += e) {
|
|
Q.set(h, r, o);
|
|
for (let c = 0; c < 2; ++c)
|
|
C.setScalar(g * (c ? 1 : I)), c ? typeof B == "function" ? B(n, Q) : n.copy(B) : n.setScalar(0), t.pushSplat(Q, C, a, s, n);
|
|
}
|
|
}
|
|
function Lr({
|
|
// PackedSplats object to add splats to
|
|
splats: t,
|
|
// scale (Gsplat scale along axis)
|
|
scale: A = 0.25,
|
|
// radius of the axes (Gsplat scale orthogonal to axis)
|
|
axisRadius: e = 75e-4,
|
|
// relative size of the "shadow copy" of each Gsplat placed behind it
|
|
axisShadowScale: g = 2,
|
|
// origins of the axes (default single axis at origin)
|
|
origins: I = [new E.Vector3()]
|
|
}) {
|
|
const s = new E.Vector3(), B = new E.Vector3(), i = new E.Quaternion(0, 0, 0, 1), Q = new E.Color(), C = 1;
|
|
for (const a of I)
|
|
for (let n = 0; n < 3; ++n) {
|
|
s.set(
|
|
a.x + (n === 0 ? A : 0),
|
|
a.y + (n === 1 ? A : 0),
|
|
a.z + (n === 2 ? A : 0)
|
|
);
|
|
for (let o = 0; o < 2; ++o)
|
|
B.set(
|
|
(n === 0 ? A : e) * (o ? 1 : g),
|
|
(n === 1 ? A : e) * (o ? 1 : g),
|
|
(n === 2 ? A : e) * (o ? 1 : g)
|
|
), Q.setRGB(
|
|
o === 0 ? 0 : n === 0 ? 1 : 0,
|
|
o === 0 ? 0 : n === 1 ? 1 : 0,
|
|
o === 0 ? 0 : n === 2 ? 1 : 0
|
|
), t.pushSplat(s, B, i, C, Q);
|
|
}
|
|
}
|
|
function Yr({
|
|
// PackedSplats object to add splats to
|
|
splats: t,
|
|
// center of the sphere (default: origin)
|
|
origin: A = new E.Vector3(),
|
|
// radius of the sphere
|
|
radius: e = 1,
|
|
// maximum depth of recursion for subdividing the sphere
|
|
// Warning: Gsplat count grows exponentially with depth
|
|
maxDepth: g = 3,
|
|
// filter function to apply to each point, for example to select
|
|
// points in a certain direction or other function ((THREE.Vector3) => boolean)
|
|
// (default: null)
|
|
filter: I = null,
|
|
// radius of each oriented Gsplat
|
|
pointRadius: s = 0.02,
|
|
// flatness of each oriented Gsplat
|
|
pointThickness: B = 1e-3,
|
|
// color of each Gsplat (THREE.Color) or function to set color for point:
|
|
// ((THREE.Color, THREE.Vector3) => void) (default: white)
|
|
color: i = new E.Color(1, 1, 1)
|
|
}) {
|
|
const Q = {};
|
|
function C(c) {
|
|
if (I && !I(c))
|
|
return;
|
|
const l = `${c.x},${c.y},${c.z}`;
|
|
Q[l] || (Q[l] = c);
|
|
}
|
|
function a(c, l, u, w) {
|
|
if (C(l), C(u), C(w), c >= g)
|
|
return;
|
|
const D = new E.Vector3().addVectors(l, u).normalize(), y = new E.Vector3().addVectors(u, w).normalize(), d = new E.Vector3().addVectors(w, l).normalize();
|
|
a(c + 1, l, D, d), a(c + 1, D, u, y), a(c + 1, d, y, w), a(c + 1, D, y, d);
|
|
}
|
|
for (const c of [-1, 1])
|
|
for (const l of [-1, 1])
|
|
for (const u of [-1, 1]) {
|
|
const w = new E.Vector3(c, 0, 0), D = new E.Vector3(0, l, 0), y = new E.Vector3(0, 0, u);
|
|
a(0, w, D, y);
|
|
}
|
|
const n = Object.values(Q), o = new E.Vector3(s, s, B), r = new E.Quaternion(), h = typeof i == "function" ? new E.Color() : i;
|
|
for (const c of n)
|
|
r.setFromUnitVectors(new E.Vector3(0, 0, -1), c), typeof i == "function" && i(h, c), c.multiplyScalar(e), c.add(A), t.pushSplat(c, o, r, 1, h);
|
|
}
|
|
function Jr({
|
|
// text string to display
|
|
text: t,
|
|
// browser font to render text with (default: "Arial")
|
|
font: A,
|
|
// font size in pixels/Gsplats (default: 32)
|
|
fontSize: e,
|
|
// SplatMesh.recolor tint assuming white Gsplats (default: white)
|
|
color: g,
|
|
// Individual Gsplat color (default: white)
|
|
rgb: I,
|
|
// Gsplat radius (default: 0.8 covers 1-unit spacing well)
|
|
dotRadius: s,
|
|
// text alignment: "left", "center", "right", "start", "end" (default: "start")
|
|
textAlign: B,
|
|
// line spacing multiplier, lines delimited by "\n" (default: 1.0)
|
|
lineHeight: i,
|
|
// Coordinate scale in object-space (default: 1.0)
|
|
objectScale: Q
|
|
}) {
|
|
A = A ?? "Arial", e = e ?? 32, g = g ?? new E.Color(1, 1, 1), s = s ?? 0.8, B = B ?? "start", i = i ?? 1, Q = Q ?? 1;
|
|
const C = t.split(`
|
|
`), a = document.createElement("canvas"), n = a.getContext("2d");
|
|
if (!n)
|
|
throw new Error("Failed to create canvas context");
|
|
n.font = `${e}px ${A}`, n.textAlign = B;
|
|
const o = n.measureText(""), r = o.fontBoundingBoxAscent + o.fontBoundingBoxDescent;
|
|
let h = Number.POSITIVE_INFINITY, c = Number.NEGATIVE_INFINITY, l = Number.POSITIVE_INFINITY, u = Number.NEGATIVE_INFINITY;
|
|
for (let x = 0; x < C.length; ++x) {
|
|
const G = n.measureText(C[x]), U = r * i * x;
|
|
h = Math.min(h, -G.actualBoundingBoxLeft), c = Math.max(c, G.actualBoundingBoxRight), l = Math.min(l, U - G.actualBoundingBoxAscent), u = Math.max(u, U + G.actualBoundingBoxDescent);
|
|
}
|
|
const w = Math.floor(h), D = Math.floor(l), y = Math.ceil(c) - w, d = Math.ceil(u) - D;
|
|
a.width = y, a.height = d, n.font = `${e}px ${A}`, n.textAlign = B, n.textBaseline = "alphabetic", n.fillStyle = "#FFFFFF";
|
|
for (let x = 0; x < C.length; ++x) {
|
|
const G = r * i * x - D;
|
|
n.fillText(C[x], -w, G);
|
|
}
|
|
const S = n.getImageData(0, 0, y, d), M = new Uint8Array(S.data.buffer), p = new ZA(), f = new E.Vector3(), R = new E.Vector3().setScalar(s * Q), N = new E.Quaternion(0, 0, 0, 1);
|
|
I = I ?? new E.Color(1, 1, 1);
|
|
let m = 0;
|
|
for (let x = 0; x < d; ++x)
|
|
for (let G = 0; G < y; ++G) {
|
|
const U = M[m + 3];
|
|
if (U > 0) {
|
|
const J = U / 255;
|
|
f.set(G - 0.5 * (y - 1), 0.5 * (d - 1) - x, 0), f.multiplyScalar(Q), p.pushSplat(f, R, N, J, I);
|
|
}
|
|
m += 4;
|
|
}
|
|
const L = new PA({ packedSplats: p });
|
|
return L.recolor = g, L;
|
|
}
|
|
function br({
|
|
// URL of the image to convert to splats (example: `url: "./image.png"`)
|
|
url: t,
|
|
// Radius of each Gsplat, default covers 1-unit spacing well (default: 0.8)
|
|
dotRadius: A,
|
|
// Subsampling factor for the image. Higher values reduce resolution,
|
|
// for example 2 will halve the width and height by averaging (default: 1)
|
|
subXY: e,
|
|
// Optional callback function to modify each Gsplat before it's added.
|
|
// Return null to skip adding the Gsplat, or a number to set the opacity
|
|
// and add the Gsplat with parameter values in the objects center, rgba etc. were
|
|
// passed into the forEachSplat callback. Ending the callback in `return opacity;`
|
|
// will retain the original opacity.
|
|
// ((width: number, height: number, index: number, center: THREE.Vector3, scales: THREE.Vector3, quaternion: THREE.Quaternion, opacity: number, color: THREE.Color) => number | null)
|
|
forEachSplat: g
|
|
}) {
|
|
return A = A ?? 0.8, e = Math.max(1, Math.floor(e ?? 1)), new PA({
|
|
constructSplats: async (I) => new Promise((s, B) => {
|
|
const i = new Image();
|
|
i.crossOrigin = "anonymous", i.onerror = B, i.onload = () => {
|
|
const { width: Q, height: C } = i, a = document.createElement("canvas");
|
|
a.width = Q, a.height = C;
|
|
const n = a.getContext("2d");
|
|
if (!n) {
|
|
B(new Error("Failed to create canvas context"));
|
|
return;
|
|
}
|
|
n.imageSmoothingEnabled = !0, n.imageSmoothingQuality = "high";
|
|
const o = Math.round(Q / e), r = Math.round(C / e);
|
|
n.drawImage(i, 0, 0, o, r);
|
|
try {
|
|
const h = n.getImageData(0, 0, o, r), c = new Uint8Array(h.data.buffer), l = new E.Vector3(), u = new E.Vector3().setScalar(A), w = new E.Quaternion(0, 0, 0, 1), D = new E.Color();
|
|
let y = 0;
|
|
for (let d = 0; d < r; ++d)
|
|
for (let S = 0; S < o; ++S) {
|
|
const M = y * 4, p = c[M + 3];
|
|
if (p > 0) {
|
|
let f = p / 255;
|
|
D.set(
|
|
c[M + 0] / 255,
|
|
c[M + 1] / 255,
|
|
c[M + 2] / 255
|
|
), l.set(
|
|
S - 0.5 * (o - 1),
|
|
0.5 * (r - 1) - d,
|
|
0
|
|
), u.setScalar(A), w.set(0, 0, 0, 1);
|
|
let R = !0;
|
|
if (g) {
|
|
const N = g(
|
|
o,
|
|
r,
|
|
y,
|
|
l,
|
|
u,
|
|
w,
|
|
f,
|
|
D
|
|
);
|
|
f = N ?? f, R = N !== null;
|
|
}
|
|
R && I.pushSplat(l, u, w, f, D);
|
|
}
|
|
y += 1;
|
|
}
|
|
s();
|
|
} catch (h) {
|
|
B(h);
|
|
}
|
|
}, i.src = t;
|
|
})
|
|
});
|
|
}
|
|
function _o({
|
|
box: t,
|
|
cells: A,
|
|
dotScale: e,
|
|
color: g,
|
|
opacity: I
|
|
}) {
|
|
A.x = Math.max(1, Math.round(A.x)), A.y = Math.max(1, Math.round(A.y)), A.z = Math.max(1, Math.round(A.z)), I = I ?? 1;
|
|
const s = A.x * A.y * A.z, B = v("int", A.x), i = v("int", A.y);
|
|
v("int", A.z);
|
|
const Q = HA(0), C = new Zt({
|
|
numSplats: s,
|
|
generator: NA(
|
|
{ index: "int" },
|
|
{ gsplat: AA },
|
|
({ index: n }) => {
|
|
if (!n)
|
|
throw new Error("index is undefined");
|
|
const o = ve(n, B), r = se(n, B), h = ve(r, i), c = se(r, i), l = zA({
|
|
vectorType: "ivec3",
|
|
x: o,
|
|
y: h,
|
|
z: c
|
|
}), u = Ps(Q), w = zA({ vectorType: "ivec2", x: n, y: u }), D = Ai(w), y = v("vec3", t.min), d = v("vec3", t.max), S = ut(d, y), M = se(cA(ht(l), D), v("vec3", A));
|
|
let p, f, R;
|
|
g ? (p = v("float", g.r), f = v("float", g.g), R = v("float", g.b)) : { r: p, g: f, b: R } = lt(M).outputs;
|
|
const N = zA({
|
|
vectorType: "vec4",
|
|
r: p,
|
|
g: f,
|
|
b: R,
|
|
a: v("float", I)
|
|
}), m = cA(y, sA(S, M)), L = ht(v("float", e)), x = v("vec4", new E.Quaternion(0, 0, 0, 1));
|
|
let G = Bt({
|
|
flags: ie("uint", "GSPLAT_FLAG_ACTIVE"),
|
|
index: n,
|
|
center: m,
|
|
scales: L,
|
|
quaternion: x,
|
|
rgba: N
|
|
});
|
|
return G = a.applyGsplat(G), { gsplat: G };
|
|
},
|
|
{
|
|
globals: () => [FA]
|
|
}
|
|
),
|
|
update: ({ time: n }) => {
|
|
Q.value = n, a.update(C), C.updateVersion();
|
|
}
|
|
}), a = new Mt();
|
|
return C;
|
|
}
|
|
const Oo = {
|
|
box: new E.Box3(
|
|
new E.Vector3(-1, -1, -1),
|
|
new E.Vector3(1, 1, 1)
|
|
),
|
|
density: 100,
|
|
fallDirection: new E.Vector3(-1, -3, 1).normalize(),
|
|
fallVelocity: 0.02,
|
|
wanderScale: 0.04,
|
|
wanderVariance: 2,
|
|
color1: new E.Color(1, 1, 1),
|
|
color2: new E.Color(0.5, 0.5, 1),
|
|
minScale: 1e-3,
|
|
maxScale: 5e-3,
|
|
anisoScale: new E.Vector3(1, 1, 1)
|
|
}, $o = {
|
|
box: new E.Box3(
|
|
new E.Vector3(-2, -1, -2),
|
|
new E.Vector3(2, 5, 2)
|
|
),
|
|
density: 10,
|
|
fallDirection: new E.Vector3(0, -1, 0),
|
|
fallVelocity: 2,
|
|
wanderScale: 0.1,
|
|
wanderVariance: 1,
|
|
color1: new E.Color(1, 1, 1),
|
|
color2: new E.Color(0.25, 0.25, 0.5),
|
|
minScale: 5e-3,
|
|
maxScale: 0.01,
|
|
anisoScale: new E.Vector3(0.1, 1, 0.1)
|
|
};
|
|
function Ar({
|
|
// min and max box extents of the snowBox
|
|
box: t,
|
|
// minimum y-coordinate to clamp particle position, which can be used to
|
|
// fake hitting a ground plane and lingering there for a bit
|
|
minY: A,
|
|
// number of Gsplats to generate (default: calculated from box and density)
|
|
numSplats: e,
|
|
// density of Gsplats per unit volume (default: 100)
|
|
density: g,
|
|
// The xyz anisotropic scale of the Gsplat, which can be used for example
|
|
// to elongate rain particles (default: (1, 1, 1))
|
|
anisoScale: I,
|
|
// Minimum Gsplat particle scale (default: 0.001)
|
|
minScale: s,
|
|
// Maximum Gsplat particle scale (default: 0.005)
|
|
maxScale: B,
|
|
// The average direction of fall (default: (0, -1, 0))
|
|
fallDirection: i,
|
|
// The average speed of the fall (multiplied with fallDirection) (default: 0.02)
|
|
fallVelocity: Q,
|
|
// The world scale of wandering overlay motion (default: 0.01)
|
|
wanderScale: C,
|
|
// Controls how uniformly the particles wander in sync, more variance mean
|
|
// more randomness in the motion (default: 2)
|
|
wanderVariance: a,
|
|
// Color 1 of the two colors interpolated between (default: (1, 1, 1))
|
|
color1: n,
|
|
// Color 2 of the two colors interpolated between (default: (0.5, 0.5, 1))
|
|
color2: o,
|
|
// The base opacity of the Gsplats (default: 1)
|
|
opacity: r,
|
|
// Optional callback function to call each frame.
|
|
onFrame: h
|
|
}) {
|
|
t = t ?? new E.Box3(new E.Vector3(-1, -1, -1), new E.Vector3(1, 1, 1));
|
|
const c = (t.max.x - t.min.x) * (t.max.y - t.min.y) * (t.max.z - t.min.z);
|
|
g = g ?? 100, e = e ?? Math.max(1, Math.min(1e6, Math.round(c * g)));
|
|
const l = HA(s ?? 1e-3), u = HA(B ?? 5e-3), w = tt(
|
|
((I == null ? void 0 : I.clone()) ?? new E.Vector3(1, 1, 1)).normalize()
|
|
), D = tt(
|
|
(i ?? new E.Vector3(0, -1, 0)).normalize()
|
|
), y = HA(Q ?? 0.02), d = HA(C ?? 0.01), S = HA(a ?? 2), M = tt(n ?? new E.Color(1, 1, 1)), p = tt(o ?? new E.Color(0.5, 0.5, 1)), f = HA(r ?? 1), R = HA(0), N = tt(new E.Vector3(0, 0, 0)), m = tt(t.min), L = tt(t.max), x = HA(A ?? Number.NEGATIVE_INFINITY), G = ut(L, m), U = new Zt({
|
|
numSplats: e,
|
|
generator: NA(
|
|
{ index: "int" },
|
|
{ gsplat: AA },
|
|
({ index: P }) => {
|
|
if (!P)
|
|
throw new Error("index not defined");
|
|
const T = He(P), eA = lt(T).outputs.w;
|
|
let z = ht(T), _ = Be(sA(eA, v("float", 100)));
|
|
_ = Ke(sA(ie("float", "PI"), _)), _ = cA(l, sA(_, ut(u, l)));
|
|
const H = sA(_, w), O = Be(sA(eA, v("float", 10))), W = Be(eA), $ = $I(M, p, W), Y = sA($, O), wA = He(
|
|
zA({
|
|
vectorType: "ivec2",
|
|
x: P,
|
|
y: v("int", 6837)
|
|
})
|
|
);
|
|
let CA = ht(wA), DA = sA(lt(wA).outputs.w, S);
|
|
DA = cA(R, DA), z = cA(z, N);
|
|
const yA = _I(
|
|
z,
|
|
v("vec3", new E.Vector3(1, 1, 1))
|
|
);
|
|
z = cA(m, sA(G, yA));
|
|
const MA = v("vec4", new E.Quaternion(0, 0, 0, 1));
|
|
CA = Ke(cA(ht(DA), CA)), CA = sA(CA, d);
|
|
let rA = cA(z, CA), JA = lt(rA).outputs.y;
|
|
JA = OI(x, JA), rA = zA({ vector: rA, y: JA });
|
|
let mA = Bt({
|
|
flags: ie("uint", "GSPLAT_FLAG_ACTIVE"),
|
|
index: P,
|
|
center: rA,
|
|
scales: H,
|
|
quaternion: MA,
|
|
rgb: Y,
|
|
opacity: f
|
|
});
|
|
return mA = J.applyGsplat(mA), { gsplat: mA };
|
|
},
|
|
{
|
|
globals: () => [FA]
|
|
}
|
|
),
|
|
update: ({ object: P, time: T, deltaTime: eA }) => {
|
|
R.value = T, J.update(U);
|
|
const z = D.value.clone().multiplyScalar(y.value * eA);
|
|
N.value.add(z), P.visible = f.value > 0, h == null || h({ object: P, time: T, deltaTime: eA }), U.updateVersion();
|
|
}
|
|
}), J = new Mt();
|
|
return {
|
|
snow: U,
|
|
min: m,
|
|
max: L,
|
|
minY: x,
|
|
color1: M,
|
|
color2: p,
|
|
opacity: f,
|
|
fallVelocity: y,
|
|
wanderVariance: S,
|
|
wanderScale: d,
|
|
fallDirection: D,
|
|
minScale: l,
|
|
maxScale: u,
|
|
anisoScale: w
|
|
};
|
|
}
|
|
const vr = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
__proto__: null,
|
|
DEFAULT_RAIN: $o,
|
|
DEFAULT_SNOW: Oo,
|
|
snowBox: Ar,
|
|
staticBox: _o
|
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
function tQ(t) {
|
|
return NA({ gsplat: AA }, { gsplat: AA }, ({ gsplat: A }) => {
|
|
if (!A)
|
|
throw new Error("No gsplat input");
|
|
let e = Ye(A);
|
|
const g = t.applyGsplat(A), I = ot(g).outputs.center, s = Ye(g), B = FB(I, s), i = xs(B, v("float", 0));
|
|
e = Bg(i, sg(e), e);
|
|
const Q = cA(
|
|
sA(e, v("float", 0.5)),
|
|
v("float", 0.5)
|
|
);
|
|
return A = Bt({ gsplat: A, rgb: Q }), { gsplat: A };
|
|
});
|
|
}
|
|
function tr(t) {
|
|
t.enableWorldToView = !0, t.worldModifier = tQ(t.context.worldToView), t.updateGenerator();
|
|
}
|
|
function eQ(t, A, e, g) {
|
|
return NA({ gsplat: AA }, { gsplat: AA }, ({ gsplat: I }) => {
|
|
if (!I)
|
|
throw new Error("No gsplat input");
|
|
let { center: s } = ot(I).outputs;
|
|
s = t.apply(s);
|
|
const { z: B } = lt(s).outputs;
|
|
let i = ti(sg(B), A, e);
|
|
return i = Bg(g, ut(v("float", 1), i), i), I = Bt({ gsplat: I, r: i, g: i, b: i }), { gsplat: I };
|
|
});
|
|
}
|
|
function er(t, A, e, g) {
|
|
t.enableWorldToView = !0;
|
|
const I = v("float", A), s = v("float", e), B = v("bool", g ?? !1);
|
|
return t.worldModifier = eQ(
|
|
t.context.worldToView,
|
|
I,
|
|
s,
|
|
B
|
|
), t.updateGenerator(), {
|
|
minDepth: I,
|
|
maxDepth: s,
|
|
reverse: B
|
|
};
|
|
}
|
|
const Tr = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
__proto__: null,
|
|
makeDepthColorModifier: eQ,
|
|
makeNormalColorModifier: tQ,
|
|
setDepthColor: er,
|
|
setWorldNormalColor: tr
|
|
}, Symbol.toStringTag, { value: "Module" })), qt = class qt {
|
|
static createButton(A, e = {}) {
|
|
const g = navigator.xr;
|
|
if (!g)
|
|
return null;
|
|
const I = g, s = document.createElement("button");
|
|
A.xr.enabled = !0, A.xr.setReferenceSpaceType("local");
|
|
function B() {
|
|
let n = null;
|
|
async function o(c) {
|
|
console.log("onSessionStarted"), c.addEventListener("end", r), await A.xr.setSession(c), s.textContent = "EXIT VR", n = c;
|
|
}
|
|
function r() {
|
|
console.log("onSessionEnded"), n == null || n.removeEventListener("end", r), s.textContent = "ENTER VR", n = null;
|
|
}
|
|
s.style.display = "", s.style.cursor = "pointer", s.style.left = "calc(50% - 100px)", s.style.width = "200px", s.style.height = "100px", s.textContent = "ENTER VR";
|
|
const h = {
|
|
...e,
|
|
optionalFeatures: [
|
|
// "local-floor",
|
|
// "bounded-floor",
|
|
// "layers",
|
|
...e.optionalFeatures || []
|
|
]
|
|
};
|
|
s.onmouseenter = () => {
|
|
s.style.opacity = "1.0";
|
|
}, s.onmouseleave = () => {
|
|
s.style.opacity = "0.5";
|
|
}, s.onclick = () => {
|
|
n === null ? (console.log("requesting session"), I.requestSession("immersive-vr", h).then(
|
|
o
|
|
)) : (console.log("ending session"), n.end());
|
|
};
|
|
}
|
|
function i() {
|
|
s.style.display = "none", s.style.cursor = "auto", s.style.left = "calc(50% - 75px)", s.style.width = "150px", s.onmouseenter = null, s.onmouseleave = null, s.onclick = null;
|
|
}
|
|
function Q() {
|
|
i(), s.textContent = "VR NOT SUPPORTED";
|
|
}
|
|
function C(n) {
|
|
i(), console.warn(
|
|
"Exception when trying to call xr.isSessionSupported",
|
|
n
|
|
), s.textContent = "VR NOT ALLOWED";
|
|
}
|
|
function a(n) {
|
|
n.style.position = "absolute", n.style.bottom = "20px", n.style.padding = "12px 6px", n.style.border = "1px solid #fff", n.style.borderRadius = "4px", n.style.background = "rgba(0,0,0,0.1)", n.style.color = "#fff", n.style.font = "normal 13px sans-serif", n.style.textAlign = "center", n.style.opacity = "0.5", n.style.outline = "none", n.style.zIndex = "999";
|
|
}
|
|
return s.id = "VRButton", s.style.display = "none", a(s), I.isSessionSupported("immersive-vr").then((n) => {
|
|
n ? B() : Q(), n && qt.xrSessionIsGranted && s.click();
|
|
}).catch(C), s;
|
|
}
|
|
static registerSessionGrantedListener() {
|
|
const A = navigator.xr;
|
|
if (!A)
|
|
return null;
|
|
const e = A;
|
|
/WebXRViewer\//i.test(navigator.userAgent) || e.addEventListener("sessiongranted", () => {
|
|
qt.xrSessionIsGranted = !0;
|
|
});
|
|
}
|
|
};
|
|
qt.xrSessionIsGranted = !1;
|
|
let Xe = qt;
|
|
Xe.registerSessionGrantedListener();
|
|
const gr = 0.5, Ir = 0.5, sr = 0;
|
|
var ng = /* @__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))(ng || {});
|
|
const gQ = Object.keys(ng), Hr = gQ.length, Kr = {
|
|
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
|
|
}, ge = {
|
|
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
|
|
}, Br = [
|
|
["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"]
|
|
], ir = [
|
|
[8, 10, 8, 6],
|
|
[8, 19, 14, 8, 6],
|
|
[8, 19, 14, 8, 6],
|
|
[8, 19, 14, 8, 6],
|
|
[8, 19, 14, 8, 6]
|
|
], qr = ["t3", "i4", "m4", "r4", "p4"], zr = ["i4", "m4", "r4", "p4"];
|
|
var IQ = /* @__PURE__ */ ((t) => (t.left = "left", t.right = "right", t))(IQ || {});
|
|
const We = Object.keys(IQ);
|
|
class Zr {
|
|
constructor() {
|
|
this.hands = {}, this.last = {}, this.values = {}, this.tests = {}, this.lastTests = {}, this.updated = !1;
|
|
}
|
|
update({ xr: A, xrFrame: e }) {
|
|
const g = A.getSession();
|
|
if (!g)
|
|
return;
|
|
const I = A.getReferenceSpace();
|
|
if (I && e.getJointPose) {
|
|
this.last = this.hands, this.lastTests = this.tests, this.hands = {}, this.values = {}, this.tests = {};
|
|
for (const s of g.inputSources) {
|
|
if (!s.hand)
|
|
continue;
|
|
const B = s.handedness;
|
|
this.hands[B] = {};
|
|
for (const i of gQ) {
|
|
const Q = s.hand.get(ng[i]);
|
|
if (Q) {
|
|
const C = e.getJointPose(Q, I);
|
|
if (C) {
|
|
const { position: a, orientation: n } = C.transform;
|
|
this.hands[B][i] = {
|
|
position: new vA(a.x, a.y, a.z),
|
|
quaternion: new ag(
|
|
n.x,
|
|
n.y,
|
|
n.z,
|
|
n.w
|
|
),
|
|
radius: C.radius || 1e-3
|
|
};
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (const s of We)
|
|
for (const { key: B, value: i } of [
|
|
{ key: `${s}AllTips`, value: this.allTipsTouching(s) },
|
|
{
|
|
key: `${s}IndexThumb`,
|
|
value: this.touching(s, "i4", s, "t3")
|
|
},
|
|
{
|
|
key: `${s}MiddleThumb`,
|
|
value: this.touching(s, "m4", s, "t3")
|
|
},
|
|
{
|
|
key: `${s}RingThumb`,
|
|
value: this.touching(s, "r4", s, "t3")
|
|
},
|
|
{
|
|
key: `${s}PinkyThumb`,
|
|
value: this.touching(s, "p4", s, "t3")
|
|
},
|
|
{ key: `${s}TriTips`, value: this.triTipsTouching(s) }
|
|
])
|
|
this.values[B] = i, this.tests[B] = i === 1 ? !0 : i === 0 ? !1 : this.lastTests[B] ?? !1;
|
|
}
|
|
}
|
|
makeGhostMesh() {
|
|
const A = new vA(), e = new vA(0.01, 0.01, 0.01), g = new ag(0, 0, 0, 1), I = new Eg(1, 1, 1), s = Math.PI * 3;
|
|
new Eg(1, 1, 1);
|
|
let B = 1;
|
|
const i = new PA({
|
|
onFrame: () => {
|
|
let Q = 0;
|
|
for (const C of We) {
|
|
const a = this.hands[C];
|
|
for (const [n, o] of Br.entries())
|
|
for (let r = 1; r < o.length; ++r) {
|
|
const h = ir[n][r - 1] * 2, c = r + 1 === o.length, l = a == null ? void 0 : a[o[r - 1]], u = a == null ? void 0 : a[o[r]];
|
|
for (let w = 0; w < h; ++w) {
|
|
const D = (w + 0.5) / h;
|
|
if (B = 0, l && u) {
|
|
A.copy(l.position).lerp(u.position, D), g.copy(l.quaternion).slerp(u.quaternion, D);
|
|
const y = ge[o[r - 1]], d = ge[o[r]];
|
|
let S = (1 - D) * y + D * d;
|
|
c && D > 0.8 && (S *= Math.sqrt(1 - ((D - 0.8) / 0.2) ** 2)), e.set(0.65 * S, 0.5 * S, 3e-3), I.set(
|
|
0.55 + 0.45 * Math.sin(A.x * s),
|
|
0.55 + 0.45 * Math.sin(A.y * s),
|
|
0.55 + 0.45 * Math.sin(A.z * s)
|
|
), C === "right" && I.set(1 - I.r, 1 - I.g, 1 - I.b), B = 0.75;
|
|
}
|
|
i.packedSplats.setSplat(
|
|
Q,
|
|
A,
|
|
e,
|
|
g,
|
|
B,
|
|
I
|
|
), Q += 1;
|
|
}
|
|
}
|
|
}
|
|
i.packedSplats.numSplats = Q, i.packedSplats.needsUpdate = !0, i.numSplats = Q, i.updateVersion();
|
|
}
|
|
});
|
|
return i;
|
|
}
|
|
distance(A, e, g, I, s = !1) {
|
|
const B = s ? this.last[A] : this.hands[A], i = s ? this.last[g] : this.hands[g], Q = B == null ? void 0 : B[e], C = i == null ? void 0 : i[I];
|
|
return !Q || !C ? Number.POSITIVE_INFINITY : Q.position.distanceTo(C.position);
|
|
}
|
|
separation(A, e, g, I, s = !1) {
|
|
const B = this.distance(A, e, g, I, s);
|
|
return B === Number.POSITIVE_INFINITY ? Number.POSITIVE_INFINITY : B - ge[e] - ge[I];
|
|
}
|
|
touching(A, e, g, I, s = !1) {
|
|
const B = this.separation(A, e, g, I, s);
|
|
return B === Number.POSITIVE_INFINITY ? Number.POSITIVE_INFINITY : 1 - Math.max(0, Math.min(1, B / 0.01 - sr));
|
|
}
|
|
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 Vr {
|
|
constructor({
|
|
xrHands: A,
|
|
control: e,
|
|
moveInertia: g,
|
|
rotateInertia: I
|
|
}) {
|
|
this.lastGrip = {}, this.lastPivot = new vA(), this.rotateVelocity = 0, this.velocity = new vA(), this.xrHands = A, this.control = e, this.moveInertia = g ?? gr, this.rotateInertia = I ?? Ir;
|
|
}
|
|
update(A) {
|
|
var s, B, i, Q, C;
|
|
const e = {};
|
|
for (const a of We) {
|
|
const n = this.xrHands.hands[a];
|
|
n && this.xrHands.tests[`${a}MiddleThumb`] && (e[a] = new vA().add(((s = n.t3) == null ? void 0 : s.position) ?? new vA()).add(((B = n.i4) == null ? void 0 : B.position) ?? new vA()).add(((i = n.m4) == null ? void 0 : i.position) ?? new vA()).add(((Q = n.r4) == null ? void 0 : Q.position) ?? new vA()).add(((C = n.p4) == null ? void 0 : C.position) ?? new vA()).multiplyScalar(1 / 5));
|
|
}
|
|
if (e.left && e.right && this.lastGrip.left && this.lastGrip.right) {
|
|
const a = e.left.clone().add(e.right).multiplyScalar(0.5), n = this.lastGrip.left.clone().add(this.lastGrip.right).multiplyScalar(0.5);
|
|
this.lastPivot = a;
|
|
const o = a.clone().applyMatrix4(this.control.matrix);
|
|
o.sub(n.clone().applyMatrix4(this.control.matrix)), o.multiplyScalar(1 / A), this.velocity.lerp(o, 1 - Math.exp(-20 * A));
|
|
const r = Math.atan2(e.left.z - a.z, e.left.x - a.x), h = Math.atan2(
|
|
this.lastGrip.left.z - n.z,
|
|
this.lastGrip.left.x - n.x
|
|
);
|
|
let c = r - h;
|
|
c > Math.PI ? c -= Math.PI * 2 : c < -Math.PI && (c += Math.PI * 2);
|
|
const l = c / A, u = Math.exp(-20 * A);
|
|
this.rotateVelocity = this.rotateVelocity * u + l * (1 - u);
|
|
} else if (this.rotateVelocity *= Math.exp(-A / this.rotateInertia), e.left && this.lastGrip.left) {
|
|
const a = e.left.clone().applyMatrix4(this.control.matrix);
|
|
a.sub(this.lastGrip.left.clone().applyMatrix4(this.control.matrix)), a.multiplyScalar(1 / A), this.velocity.lerp(a, 1 - Math.exp(-20 * A));
|
|
} else if (e.right && this.lastGrip.right) {
|
|
const a = e.right.clone().applyMatrix4(this.control.matrix);
|
|
a.sub(
|
|
this.lastGrip.right.clone().applyMatrix4(this.control.matrix)
|
|
), a.multiplyScalar(1 / A), this.velocity.lerp(a, 1 - Math.exp(-20 * A));
|
|
} else
|
|
this.velocity.multiplyScalar(Math.exp(-A / this.moveInertia));
|
|
const g = this.lastPivot.clone().negate(), I = new me().makeTranslation(g).premultiply(new me().makeRotationY(this.rotateVelocity * A)).premultiply(new me().makeTranslation(this.lastPivot));
|
|
this.control.matrix.multiply(I), this.control.matrix.decompose(
|
|
this.control.position,
|
|
this.control.quaternion,
|
|
this.control.scale
|
|
), this.control.updateMatrixWorld(!0), this.control.position.sub(this.velocity.clone().multiplyScalar(A)), this.lastGrip = e;
|
|
}
|
|
}
|
|
const Qr = 1, nr = 2, Cr = 2e-3, ar = 6e-3, Er = 15e-4, or = 0.15, rr = 0.15, cr = 0.1, hr = 2, lr = 1, ur = 200, wr = 400, Dr = 50, yr = {
|
|
KeyW: new E.Vector3(0, 0, -1),
|
|
KeyS: new E.Vector3(0, 0, 1),
|
|
KeyA: new E.Vector3(-1, 0, 0),
|
|
KeyD: new E.Vector3(1, 0, 0),
|
|
KeyR: new E.Vector3(0, 1, 0),
|
|
KeyF: new E.Vector3(0, -1, 0)
|
|
}, pr = {
|
|
ArrowUp: new E.Vector3(0, 0, -1),
|
|
ArrowDown: new E.Vector3(0, 0, 1),
|
|
ArrowLeft: new E.Vector3(-1, 0, 0),
|
|
ArrowRight: new E.Vector3(1, 0, 0),
|
|
PageUp: new E.Vector3(0, 1, 0),
|
|
PageDown: new E.Vector3(0, -1, 0)
|
|
}, dr = {
|
|
KeyQ: new E.Vector3(0, 0, 1),
|
|
KeyE: new E.Vector3(0, 0, -1)
|
|
}, fr = {
|
|
Home: new E.Vector3(0, -1, 0),
|
|
End: new E.Vector3(0, 1, 0),
|
|
Insert: new E.Vector3(-1, 0, 0),
|
|
Delete: new E.Vector3(1, 0, 0)
|
|
};
|
|
class Xr {
|
|
constructor({ canvas: A }) {
|
|
this.lastTime = 0, this.fpsMovement = new Mr({}), this.pointerControls = new mr({ canvas: A });
|
|
}
|
|
update(A) {
|
|
const e = performance.now(), g = (e - (this.lastTime || e)) / 1e3;
|
|
this.lastTime = e, this.fpsMovement.update(g, A), this.pointerControls.update(g, A);
|
|
}
|
|
}
|
|
class Mr {
|
|
constructor({
|
|
moveSpeed: A,
|
|
rollSpeed: e,
|
|
stickThreshold: g,
|
|
rotateSpeed: I,
|
|
keycodeMoveMapping: s,
|
|
keycodeRotateMapping: B,
|
|
gamepadMapping: i,
|
|
capsMultiplier: Q,
|
|
shiftMultiplier: C,
|
|
ctrlMultiplier: a,
|
|
xr: n
|
|
} = {}) {
|
|
this.enable = !0, this.moveSpeed = A ?? Qr, this.rollSpeed = e ?? nr, this.stickThreshold = g ?? cr, this.rotateSpeed = I ?? hr, this.keycodeMoveMapping = s ?? {
|
|
...yr,
|
|
...pr
|
|
}, this.keycodeRotateMapping = B ?? {
|
|
...dr,
|
|
...fr
|
|
}, this.gamepadMapping = i ?? {
|
|
4: "rollLeft",
|
|
5: "rollRight",
|
|
6: "ctrl",
|
|
7: "shift"
|
|
}, this.capsMultiplier = Q ?? 10, this.shiftMultiplier = C ?? 5, this.ctrlMultiplier = a ?? 1 / 5, this.xr = n, this.keydown = {}, this.keycode = {}, document.addEventListener("keydown", (o) => {
|
|
this.keydown[o.key] = !0, this.keycode[o.code] = !0;
|
|
}), document.addEventListener("keyup", (o) => {
|
|
this.keydown[o.key] = !1, this.keycode[o.code] = !1;
|
|
}), window.addEventListener("blur", () => {
|
|
this.keydown = {}, this.keycode = {};
|
|
});
|
|
}
|
|
// Call this method in your render loop with `control` set to the object to control
|
|
// (`THREE.Camera` or a `THREE.Object3D` that contains it), with `deltaTime`
|
|
// in seconds since the last update.
|
|
update(A, e) {
|
|
var a, n;
|
|
if (!this.enable)
|
|
return;
|
|
const g = [new E.Vector2(), new E.Vector2()], I = navigator.getGamepads()[0];
|
|
I && (g[0].set(I.axes[0], I.axes[1]), g[1].set(I.axes[2], I.axes[3]));
|
|
const s = (I == null ? void 0 : I.buttons.map((o) => o.pressed)) || [], B = Array.from(((n = (a = this.xr) == null ? void 0 : a.getSession()) == null ? void 0 : n.inputSources) ?? []);
|
|
for (const o of B) {
|
|
const r = o.gamepad;
|
|
if (r)
|
|
switch (o.handedness) {
|
|
case "none": {
|
|
g[0].x += r.axes[0], g[0].y += r.axes[1], g[1].x += r.axes[2], g[1].y += r.axes[3];
|
|
break;
|
|
}
|
|
case "left": {
|
|
g[0].x += r.axes[2], g[0].y += r.axes[3];
|
|
break;
|
|
}
|
|
case "right": {
|
|
g[1].x += r.axes[2], g[1].y += r.axes[3];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
for (const o of g)
|
|
o.x = Math.abs(o.x) >= this.stickThreshold ? o.x : 0, o.y = Math.abs(o.y) >= this.stickThreshold ? o.y : 0;
|
|
const i = new E.Vector3(
|
|
g[1].x,
|
|
g[1].y,
|
|
0
|
|
).multiplyScalar(this.rotateSpeed);
|
|
for (const [o, r] of Object.entries(this.keycodeRotateMapping))
|
|
this.keycode[o] && i.add(r);
|
|
for (const o in this.gamepadMapping)
|
|
if (s[Number.parseInt(o)])
|
|
switch (this.gamepadMapping[o]) {
|
|
case "rollLeft":
|
|
i.z += 1;
|
|
break;
|
|
case "rollRight":
|
|
i.z -= 1;
|
|
break;
|
|
}
|
|
if (i.multiply(
|
|
new E.Vector3(this.rotateSpeed, this.rotateSpeed, this.rollSpeed)
|
|
), i.manhattanLength() > 0) {
|
|
i.multiplyScalar(A);
|
|
const o = new E.Euler().setFromQuaternion(
|
|
e.quaternion,
|
|
"YXZ"
|
|
);
|
|
o.y -= i.x, o.x = Math.max(
|
|
-Math.PI / 2,
|
|
Math.min(Math.PI / 2, o.x - i.y)
|
|
), o.z = Math.max(-Math.PI, Math.min(Math.PI, o.z + i.z)), e.quaternion.setFromEuler(o);
|
|
}
|
|
const Q = new E.Vector3(g[0].x, 0, g[0].y);
|
|
for (const [o, r] of Object.entries(this.keycodeMoveMapping))
|
|
this.keycode[o] && Q.add(r);
|
|
let C = 1;
|
|
this.keydown.CapsLock && (C *= this.capsMultiplier), (this.keycode.ShiftLeft || this.keycode.ShiftRight) && (C *= this.shiftMultiplier), (this.keycode.ControlLeft || this.keycode.ControlRight) && (C *= this.ctrlMultiplier);
|
|
for (const o in this.gamepadMapping)
|
|
if (s[Number.parseInt(o)])
|
|
switch (this.gamepadMapping[o]) {
|
|
case "shift":
|
|
C *= this.shiftMultiplier;
|
|
break;
|
|
case "ctrl":
|
|
C *= this.ctrlMultiplier;
|
|
break;
|
|
}
|
|
Q.applyQuaternion(e.quaternion), e.position.add(
|
|
Q.multiplyScalar(this.moveSpeed * C * A)
|
|
);
|
|
}
|
|
}
|
|
class mr {
|
|
constructor({
|
|
// The HTML canvas element to attach pointer events to
|
|
canvas: A,
|
|
// Speed of rotation (default DEFAULT_ROTATE_SPEED)
|
|
rotateSpeed: e,
|
|
// Speed of sliding when dragging with right/middle mouse button or two fingers
|
|
// (default DEFAULT_SLIDE_SPEED)
|
|
slideSpeed: g,
|
|
// Speed of movement when using mouse scroll wheel (default DEFAULT_SCROLL_SPEED)
|
|
scrollSpeed: I,
|
|
// Swap the direction of rotation and sliding (default: false)
|
|
swapRotateSlide: s,
|
|
// Reverse the direction of rotation (default: false)
|
|
reverseRotate: B,
|
|
// Reverse the direction of sliding (default: false)
|
|
reverseSlide: i,
|
|
// Reverse the direction of swipe gestures (default: false)
|
|
reverseSwipe: Q,
|
|
// Reverse the direction of scroll wheel movement (default: false)
|
|
reverseScroll: C,
|
|
// Inertia factor for movement (default: DEFAULT_MOVE_INERTIA)
|
|
moveInertia: a,
|
|
// Inertia factor for rotation (default: DEFAULT_ROTATE_INERTIA)
|
|
rotateInertia: n,
|
|
// Pointer rolling scale factor (default: DEFAULT_POINTER_ROLL_SCALE)
|
|
pointerRollScale: o,
|
|
// Callback for double press events (default: () => {})
|
|
doublePress: r
|
|
}) {
|
|
this.enable = !0, this.canvas = A, this.rotateSpeed = e ?? Cr, this.slideSpeed = g ?? ar, this.scrollSpeed = I ?? Er, this.swapRotateSlide = s ?? !1, this.reverseRotate = B ?? !1, this.reverseSlide = i ?? !1, this.reverseSwipe = Q ?? !1, this.reverseScroll = C ?? !1, this.moveInertia = a ?? rr, this.rotateInertia = n ?? or, this.pointerRollScale = o ?? lr, this.doublePress = r ?? (() => {
|
|
}), this.doublePressLimitMs = wr, this.doublePressDistance = Dr, this.lastUp = null, this.rotating = null, this.sliding = null, this.dualPress = !1, this.scroll = new E.Vector3(), this.rotateVelocity = new E.Vector3(), this.moveVelocity = new E.Vector3(), A.addEventListener("pointerdown", (c) => {
|
|
const l = this.getPointerPosition(c), u = l.clone(), w = l.clone(), D = !this.swapRotateSlide && !this.rotating && (c.pointerType !== "mouse" || c.button === 0) || this.swapRotateSlide && this.sliding && !this.rotating && (c.pointerType !== "mouse" || c.button === 1), { pointerId: y, timeStamp: d } = c;
|
|
if (D)
|
|
this.rotating = { initial: u, last: w, position: l, pointerId: y, timeStamp: d }, A.setPointerCapture(c.pointerId), this.dualPress = !1;
|
|
else if (!this.sliding) {
|
|
const S = c.pointerType === "mouse" ? c.button : void 0;
|
|
this.sliding = {
|
|
initial: u,
|
|
last: w,
|
|
position: l,
|
|
pointerId: y,
|
|
button: S,
|
|
timeStamp: d
|
|
}, A.setPointerCapture(c.pointerId), this.dualPress = this.rotating != null && d - this.rotating.timeStamp < ur;
|
|
}
|
|
});
|
|
const h = (c) => {
|
|
var w, D;
|
|
((w = this.rotating) == null ? void 0 : w.pointerId) === c.pointerId ? (this.rotating = null, A.releasePointerCapture(c.pointerId), this.dualPress && this.sliding && (A.releasePointerCapture(this.sliding.pointerId), this.sliding = null)) : ((D = this.sliding) == null ? void 0 : D.pointerId) === c.pointerId && (this.sliding = null, A.releasePointerCapture(c.pointerId), this.dualPress && this.rotating && (A.releasePointerCapture(this.rotating.pointerId), this.rotating = null));
|
|
const l = this.getPointerPosition(c), u = this.lastUp;
|
|
if (this.lastUp = { position: l, time: c.timeStamp }, u && u.position.distanceTo(l) < this.doublePressDistance) {
|
|
const d = c.timeStamp - u.time;
|
|
d < this.doublePressLimitMs && (this.lastUp = null, this.doublePress({ position: l, intervalMs: d }));
|
|
}
|
|
};
|
|
document.addEventListener("pointerup", h), document.addEventListener("pointercancel", h), document.addEventListener("pointermove", (c) => {
|
|
var l, u;
|
|
((l = this.rotating) == null ? void 0 : l.pointerId) === c.pointerId ? this.rotating.position = this.getPointerPosition(c) : ((u = this.sliding) == null ? void 0 : u.pointerId) === c.pointerId && (this.sliding.position = this.getPointerPosition(c));
|
|
}), A.addEventListener("contextmenu", (c) => {
|
|
c.preventDefault();
|
|
}), A.addEventListener("wheel", (c) => {
|
|
this.scroll.add(
|
|
new E.Vector3(c.deltaX, c.deltaY, c.deltaZ)
|
|
), c.preventDefault();
|
|
});
|
|
}
|
|
getPointerPosition(A) {
|
|
const e = this.canvas.getBoundingClientRect();
|
|
return new E.Vector2(
|
|
A.clientX - e.left,
|
|
A.clientY - e.top
|
|
);
|
|
}
|
|
update(A, e) {
|
|
if (!this.enable)
|
|
return;
|
|
if (this.dualPress && this.rotating && this.sliding) {
|
|
const I = [
|
|
this.rotating.position.clone().sub(this.rotating.last),
|
|
this.sliding.position.clone().sub(this.sliding.last)
|
|
], s = I[0].dot(I[1]);
|
|
if (s >= 0.2) {
|
|
const B = I[0].clone().add(I[1]), i = new E.Vector3(B.x, -B.y, 0);
|
|
i.multiplyScalar(this.slideSpeed * (this.reverseSwipe ? 1 : -1)), i.applyQuaternion(e.quaternion), e.position.add(i), this.moveVelocity = i.clone().multiplyScalar(1 / A);
|
|
} else if (s <= -0.2) {
|
|
const B = this.sliding.last.clone().sub(this.rotating.last), i = B.length();
|
|
B.multiplyScalar(1 / i).normalize();
|
|
const Q = new E.Vector2(-B.y, B.x), C = [I[0].dot(B), I[1].dot(B)], a = [I[0].dot(Q), I[1].dot(Q)], n = this.rotating.last.clone().add(this.sliding.last).multiplyScalar(0.5);
|
|
let o = new E.Vector3();
|
|
if (e instanceof E.Camera) {
|
|
const w = new E.Vector2(
|
|
n.x / this.canvas.clientWidth * 2 - 1,
|
|
-(n.y / this.canvas.clientHeight) * 2 + 1
|
|
), D = new E.Raycaster();
|
|
D.setFromCamera(w, e), o = D.ray.direction;
|
|
}
|
|
const r = C[1] - C[0], h = o.multiplyScalar(r * this.slideSpeed);
|
|
e.position.add(h), this.moveVelocity = h.clone().multiplyScalar(1 / A);
|
|
const c = [
|
|
Math.atan(a[0] / (-0.5 * i)),
|
|
Math.atan(a[1] / (0.5 * i))
|
|
], l = 0.5 * (c[0] + c[1]) * this.pointerRollScale, u = new E.Euler().setFromQuaternion(
|
|
e.quaternion,
|
|
"YXZ"
|
|
);
|
|
u.z = Math.max(
|
|
-Math.PI,
|
|
Math.min(Math.PI, u.z + 0.5 * l)
|
|
), e.quaternion.setFromEuler(u);
|
|
}
|
|
this.rotating.last.copy(this.rotating.position), this.sliding.last.copy(this.sliding.position);
|
|
} else {
|
|
const I = new E.Vector3();
|
|
if (this.rotating && !this.dualPress) {
|
|
const B = this.rotating.position.clone().sub(this.rotating.last);
|
|
this.rotating.last.copy(this.rotating.position), I.set(B.x, B.y, 0), I.multiplyScalar(this.rotateSpeed * (this.reverseRotate ? -1 : 1)), this.rotateVelocity = I.clone().multiplyScalar(1 / A);
|
|
} else
|
|
this.rotateVelocity.multiplyScalar(
|
|
Math.exp(-A / this.rotateInertia)
|
|
), I.addScaledVector(this.rotateVelocity, A);
|
|
const s = new E.Euler().setFromQuaternion(
|
|
e.quaternion,
|
|
"YXZ"
|
|
);
|
|
if (s.y -= I.x, s.x = Math.max(
|
|
-Math.PI / 2,
|
|
Math.min(Math.PI / 2, s.x - I.y)
|
|
), s.z *= Math.exp(-0 * A), e.quaternion.setFromEuler(s), this.sliding && !this.dualPress) {
|
|
const B = this.sliding.position.clone().sub(this.sliding.last);
|
|
this.sliding.last.copy(this.sliding.position);
|
|
const i = this.sliding.button !== 2 ? new E.Vector3(B.x, 0, B.y) : new E.Vector3(B.x, -B.y, 0);
|
|
i.multiplyScalar(this.slideSpeed * (this.reverseSlide ? -1 : 1)), i.applyQuaternion(e.quaternion), e.position.add(i), this.moveVelocity = i.clone().multiplyScalar(1 / A);
|
|
} else
|
|
this.moveVelocity.multiplyScalar(
|
|
Math.exp(-A / this.moveInertia)
|
|
), e.position.addScaledVector(this.moveVelocity, A);
|
|
}
|
|
const g = this.scroll.multiplyScalar(this.scrollSpeed);
|
|
g.set(g.x, g.z, g.y), this.reverseScroll && g.multiplyScalar(-1), g.applyQuaternion(e.quaternion), e.position.add(g), this.scroll.set(0, 0, 0);
|
|
}
|
|
}
|
|
export {
|
|
zr as FINGER_TIPS,
|
|
Mr as FpsMovement,
|
|
We as HANDS,
|
|
IQ as Hand,
|
|
Vr as HandMovement,
|
|
gQ as JOINT_IDS,
|
|
Kr as JOINT_INDEX,
|
|
ge as JOINT_RADIUS,
|
|
Br as JOINT_SEGMENTS,
|
|
ir as JOINT_SEGMENT_STEPS,
|
|
qr as JOINT_TIPS,
|
|
ng as JointEnum,
|
|
LA as LN_SCALE_MAX,
|
|
UA as LN_SCALE_MIN,
|
|
Hr as NUM_JOINTS,
|
|
ZA as PackedSplats,
|
|
Ee as PlyReader,
|
|
mr as PointerControls,
|
|
Ce as Readback,
|
|
On as Sint8ToFloat,
|
|
Xr as SparkControls,
|
|
ce as SparkRenderer,
|
|
re as SparkViewpoint,
|
|
ke as SplatAccumulator,
|
|
ae as SplatEdit,
|
|
Qo as SplatEditRgbaBlendMode,
|
|
Co as SplatEditSdf,
|
|
Bo as SplatEditSdfType,
|
|
ao as SplatEdits,
|
|
vt as SplatFileType,
|
|
Zt as SplatGenerator,
|
|
So as SplatLoader,
|
|
PA as SplatMesh,
|
|
oo as SplatModifier,
|
|
Rr as SplatSkinning,
|
|
Mt as SplatTransformer,
|
|
Zo as SpzReader,
|
|
et as SpzWriter,
|
|
_n as Uint8ToFloat,
|
|
Xe as VRButton,
|
|
Zr as XrHands,
|
|
Lr as constructAxes,
|
|
Ur as constructGrid,
|
|
Yr as constructSpherePoints,
|
|
Nr as defines,
|
|
Gr as dyno,
|
|
uC as flipPixels,
|
|
Ie as floatToSint8,
|
|
GA as floatToUint8,
|
|
dA as fromHalf,
|
|
vr as generators,
|
|
Vi as getSplatFileType,
|
|
br as imageSplats,
|
|
hC as isAndroid,
|
|
cC as isMobile,
|
|
lC as isOculus,
|
|
xr as isPcSogs,
|
|
Tr as modifiers,
|
|
wC as pixelsToPngUrl,
|
|
Je as setPackedSplat,
|
|
Jr as textSplats,
|
|
ct as toHalf,
|
|
kr as transcodeSpz,
|
|
be as unpackSplat,
|
|
Wi as unpackSplats,
|
|
Fr as utils
|
|
};
|
|
//# sourceMappingURL=spark.module.min.js.map
|