Files
spark/dist/forge.module.min.js
T
Andreas Sundquist 8b5f854848 Remove obsolete code
2025-05-30 10:49:49 -07:00

10046 lines
758 KiB
JavaScript

import * as B from "three";
import { Loader as Ur, FileLoader as Rr, Quaternion as ze, Vector3 as UA, Color as _e, Matrix4 as le } from "three";
let zA;
const ts = typeof TextDecoder < "u" ? new TextDecoder("utf-8", { ignoreBOM: !0, fatal: !0 }) : { decode: () => {
throw Error("TextDecoder not available");
} };
typeof TextDecoder < "u" && ts.decode();
let yt = null;
function Gr() {
return (yt === null || yt.byteLength === 0) && (yt = new Uint8Array(zA.memory.buffer)), yt;
}
function br(t, A) {
return t = t >>> 0, ts.decode(Gr().subarray(t, t + A));
}
function vr(t, A, e, s, i, n, a, r, g, I, Q) {
return zA.raycast_splats(t, A, e, s, i, n, a, r, g, I, Q);
}
async function Lr(t, A) {
if (typeof Response == "function" && t instanceof Response) {
if (typeof WebAssembly.instantiateStreaming == "function")
try {
return await WebAssembly.instantiateStreaming(t, A);
} catch (s) {
if (t.headers.get("Content-Type") != "application/wasm")
console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", s);
else
throw s;
}
const e = await t.arrayBuffer();
return await WebAssembly.instantiate(e, A);
} else {
const e = await WebAssembly.instantiate(t, A);
return e instanceof WebAssembly.Instance ? { instance: e, module: t } : e;
}
}
function Jr() {
const t = {};
return t.wbg = {}, t.wbg.__wbg_buffer_609cc3eee51ed158 = function(A) {
return A.buffer;
}, t.wbg.__wbg_length_3b4f022188ae8db6 = function(A) {
return A.length;
}, t.wbg.__wbg_length_6ca527665d89694d = function(A) {
return A.length;
}, t.wbg.__wbg_length_8cfd2c6409af88ad = function(A) {
return A.length;
}, t.wbg.__wbg_new_9fee97a409b32b68 = function(A) {
return new Uint16Array(A);
}, t.wbg.__wbg_new_e3b321dcfef89fc7 = function(A) {
return new Uint32Array(A);
}, t.wbg.__wbg_newwithbyteoffsetandlength_e6b7e69acd4c7354 = function(A, e, s) {
return new Float32Array(A, e >>> 0, s >>> 0);
}, t.wbg.__wbg_newwithbyteoffsetandlength_f1dead44d1fc7212 = function(A, e, s) {
return new Uint32Array(A, e >>> 0, s >>> 0);
}, t.wbg.__wbg_newwithlength_5a5efe313cfd59f1 = function(A) {
return new Float32Array(A >>> 0);
}, t.wbg.__wbg_set_10bad9bee0e9c58b = function(A, e, s) {
A.set(e, s >>> 0);
}, t.wbg.__wbg_set_d23661d19148b229 = function(A, e, s) {
A.set(e, s >>> 0);
}, t.wbg.__wbg_set_f4f1f0daa30696fc = function(A, e, s) {
A.set(e, s >>> 0);
}, t.wbg.__wbg_subarray_3aaeec89bb2544f0 = function(A, e, s) {
return A.subarray(e >>> 0, s >>> 0);
}, t.wbg.__wbg_subarray_769e1e0f81bb259b = function(A, e, s) {
return A.subarray(e >>> 0, s >>> 0);
}, t.wbg.__wbindgen_init_externref_table = function() {
const A = zA.__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 zA.memory;
}, t.wbg.__wbindgen_throw = function(A, e) {
throw new Error(br(A, e));
}, t;
}
function Yr(t, A) {
return zA = t.exports, es.__wbindgen_wasm_module = A, yt = null, zA.__wbindgen_start(), zA;
}
async function es(t) {
if (zA !== void 0) return zA;
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,AGFzbQEAAAAB/QElYAJ/fwF/YAN/f38Bf2ACf38AYAN/f38AYAF/AGABfwF/YAV/f39/fwBgA29/fwFvYAV/f39/fwF/YAR/f39/AGABbwFvYANvb38AYAFvAX9gAAF/YAAAYAd/f39/f39/AX9gAX0BfWAGf39/f39/AGAEf39/fwF/YAF/AW9gAAFvYAd/f39/f39/AGACfn8Bf2ACf34Bf2ADf35+AGACf34AYAt9fX19fX19fX9vfwFvYAZ/f39/f38Bf2AFf39+f38AYAR/fn9/AGAFf399f38AYAR/fX9/AGAFf398f38AYAR/fH9/AGADf35+AX9gA39vbwF/YAJ9fQF9AvIEEQN3YmcdX193YmdfYnVmZmVyXzYwOWNjM2VlZTUxZWQxNTgACgN3YmcaX193YmdfbmV3XzlmZWU5N2E0MDliMzJiNjgACgN3YmcaX193Ymdfc2V0X2Y0ZjFmMGRhYTMwNjk2ZmMACwN3YmcdX193YmdfbGVuZ3RoXzhjZmQyYzY0MDlhZjg4YWQADAN3YmcxX193YmdfbmV3d2l0aGJ5dGVvZmZzZXRhbmRsZW5ndGhfZjFkZWFkNDRkMWZjNzIxMgAHA3diZxpfX3diZ19uZXdfZTNiMzIxZGNmZWY4OWZjNwAKA3diZxpfX3diZ19zZXRfZDIzNjYxZDE5MTQ4YjIyOQALA3diZx1fX3diZ19sZW5ndGhfNmNhNTI3NjY1ZDg5Njk0ZAAMA3diZzFfX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9lNmI3ZTY5YWNkNGM3MzU0AAcDd2JnGl9fd2JnX3NldF8xMGJhZDliZWUwZTljNThiAAsDd2JnHV9fd2JnX2xlbmd0aF8zYjRmMDIyMTg4YWU4ZGI2AAwDd2JnH19fd2JnX3N1YmFycmF5Xzc2OWUxZTBmODFiYjI1OWIABwN3YmcfX193Ymdfc3ViYXJyYXlfM2FhZWVjODliYjI1NDRmMAAHA3diZyRfX3diZ19uZXd3aXRobGVuZ3RoXzVhNWVmZTMxM2NmZDU5ZjEAEwN3YmcQX193YmluZGdlbl90aHJvdwACA3diZxFfX3diaW5kZ2VuX21lbW9yeQAUA3diZx9fX3diaW5kZ2VuX2luaXRfZXh0ZXJucmVmX3RhYmxlAA4DvwG9AQUA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A0ECNgIMIANB2LHAADYCCCADQgI3AhQgA0KAgICA8AIiBCADQQRqrYQ3AyggAyAEIAOthDcDICADIANBIGo2AhAgA0EIaiACEHAAC2kCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQZitwAA2AgggA0ICNwIUIANCgICAgPACIgQgA62ENwMoIAMgBCADQQRqrYQ3AyAgAyADQSBqNgIQIANBCGogAhBwAAtpAgF/AX4jAEEwayIDJAAgAyAANgIAIAMgATYCBCADQQI2AgwgA0H4scAANgIIIANCAjcCFCADQoCAgIDwAiIEIANBBGqthDcDKCADIAQgA62ENwMgIAMgA0EgajYCECADQQhqIAIQcAALaQIBfwF+IwBBMGsiAyQAIAMgADYCACADIAE2AgQgA0ECNgIMIANBrLLAADYCCCADQgI3AhQgA0KAgICA8AIiBCADQQRqrYQ3AyggAyAEIAOthDcDICADIANBIGo2AhAgA0EIaiACEHAAC2MBAX8jAEEQayIAJAACfyACKAIABEBBwJXAACEDQQkMAQsgAEEEaiACKAIEIAIoAggQJEHAlcAAIAAoAgggACgCBCICGyEDQQkgACgCDCACGwshAiADIAIgARBaIABBEGokAAtmACMAQTBrIgAkAEGwzsAALQAABEAgAEECNgIMIABB8JXAADYCCCAAQgE3AhQgACABNgIsIAAgAEEsaq1CgICAgPAChDcDICAAIABBIGo2AhAgAEEIakGQlsAAEHAACyAAQTBqJAAL5hoCEn8BfiMAQSBrIg8kAAJ/IAAoAgAiACgCAARAAn8gASEMIwBBMGsiBiQAIAAoAgghESAAKAIEIQggACgCACEOAkACQAJAAkACQANAAkAgESAQIglGBEBBACECDAELIAhFDQYgCSARRyESIAlBAWohECAIQQFrIQcgDiIELQAAIQFBACEAAkACQAJAAkADQAJAIAHAQQBIBEAgAUEfcSECIAAgBGoiBUEBai0AAEE/cSEDIAFB/wFxIg5B3wFNBEAgAkEGdCADciEBDAILIAVBAmotAABBP3EgA0EGdHIhASAOQfABSQRAIAEgAkEMdHIhAQwCCyACQRJ0QYCA8ABxIAVBA2otAABBP3EgAUEGdHJyIgFBgIDEAEcNAQwNCyABQf8BcSEBCwJAAkAg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AAEMAwtBACEBA0AgAi0AACILQTBrIglBCk8EQEF/IAtBIHIiCUHXAGsiCyALIAlB4QBrSRsiCUEQTw0DCyACQQFqIQIgCSABQQR0aiEBIABBAWsiAA0ACwsgCiABNgIEIApBADoAAAwCCyAKQQE6AAEgCkEBOgAADAELIApBAToAAAsgBi0AFA0BIA1FQYCAxAAgBigCGCIAIABBgLADc0GAgMQAa0GAkLx/SRsiAEGAgMQARnINASAGIAA2AgQgAEEgSSAAQf8Aa0EhSXINASAGQQRqIAwQREUNA0EBIQIMBAsgACACQQEgAkHonsAAEJsBAAsgEiECIAwgBCADEJcBRQ0DDAILQQEhAiAMIABBARCXAUUNAAsLCyAGQTBqJAAgAgwFCyABIAVBASAFQYSewAAQmwEACyAEIAMgASADQdSewAAQmwEACyAEIANBASABQcSewAAQmwEACyAEIAMgAiADQaSewAAQmwEAC0GwncAAELEBAAsMAQsgD0EANgIcIA8gATYCGCAPQgA3AhAgDyAAKQIENwIIIA9BCGpBARASCyAPQSBqJAALmAECA38BbyMAQSBrIgMkACADIAAoAgAQygEiBDYCACADIAI2AgQgAiAERwRAIANBADYCCCADIANBBGogA0EIahB9AAsQnAEiBBCTASIFJQEQBSEGEDMiAiAGJgEgBUGEAU8EQCAFEFgLIAIgACgCACABQQJ2EK0BIAJBhAFPBEAgAhBYCyAEQYQBTwRAIAQQWAsgA0EgaiQAC08BAX8jAEEwayIAJAAgAEEBNgIMIABBqKzAADYCCCAAQgE3AhQgACAAQS9qrUKAgICA8AuENwMgIAAgAEEgajYCECAAQQhqQfyDwAAQcAALQwEDfwJAIAJFDQADQCAALQAAIgQgAS0AACIFRgRAIABBAWohACABQQFqIQEgAkEBayICDQEMAgsLIAQgBWshAwsgAwu0AgEDfyMAQSBrIgIkACACQRBqIgMgAEEQaikCADcDACACQQhqIgQgAEEIaikCADcDACACQQE7ARwgAiABNgIYIAIgACkCADcDACMAQSBrIgAkACACKAIYIQEgAEEQaiADKQIANwMAIABBCGogBCkCADcDACAAIAI2AhwgACABNgIYIAAgAikCADcDAEEAIQIjAEEQayIBJAAgACgCDCEDAkACQAJAAkAgACgCBA4CAAECCyADDQFBASEDDAILIAMNACAAKAIAIgMoAgQhAiADKAIAIQMMAQsgAUGAgICAeDYCACABIAA2AgwgAUHglsAAIAAoAhggACgCHCIALQAcIAAtAB0QUQALIAEgAjYCBCABIAM2AgAgAUHElsAAIAAoAhggACgCHCIALQAcIAAtAB0QUQALQQEBfyACIAAoAgAgACgCCCIDa0sEQCAAIAMgAhBCIAAoAgghAwsgACgCBCADaiABIAIQPBogACACIANqNgIIQQALQQEBfyACIAAoAgAgACgCCCIDa0sEQCAAIAMgAhBIIAAoAgghAwsgACgCBCADaiABIAIQPBogACACIANqNgIIQQALTwECfyAAKAIEIQIgACgCACEDAkAgACgCCCIALQAARQ0AIANB5K7AAEEEIAIoAgwRAQBFDQBBAQ8LIAAgAUEKRjoAACADIAEgAigCEBEAAAtHAQF/IwBBEGsiAiQAIAJBCGogARB5IAIgAigCCCACKAIMKAIYEQIAIAIoAgQhASAAIAIoAgA2AgAgACABNgIEIAJBEGokAAtPAQJ/QbHOwAAtAAAaIAEoAgQhAiABKAIAIQNBCEEEEKQBIgFFBEBBBEEIEMIBAAsgASACNgIEIAEgAzYCACAAQbSWwAA2AgQgACABNgIAC0EBAX8gAiAAKAIAIAAoAggiA2tLBEAgACADIAIQVCAAKAIIIQMLIAAoAgQgA2ogASACEDwaIAAgAiADajYCCEEAC0EBAX8jAEEgayIDJAAgA0EANgIQIANBATYCBCADQgQ3AgggAyABNgIcIAMgADYCGCADIANBGGo2AgAgAyACEHAACz0BAn8gACAAKAIEIgMgAms2AgQgACAAKAIAIAIgA0tyIgQ2AgBBASEDIAQEfyADBSAAKAIIIAEgAhCXAQsLPgEBfyMAQRBrIgIkACACQQhqIAEgASgCACgCBBECACACKAIMIQEgACACKAIINgIAIAAgATYCBCACQRBqJAALxAIBA38gACgCACECIAEoAhwiAEEQcUUEQCAAQSBxRQRAIAIgARCwAQ8LQQAhACMAQYABayIEJAAgAigCACECA0AgACAEakH/AGogAkEPcSIDQTByIANBN2ogA0EKSRs6AAAgAEEBayEAIAJBEEkgAkEEdiECRQ0ACyAAQYABaiICQYEBTwRAIAJB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EFgLICYiIyAqSQ0ACwsgIigCECEjICsoAgBBAWoLNgIAICMQDSEJEDMiCCAJJgEgIiAINgIkICIoAgwhIyAiKAIQISQjAEEgayIlJAAgIkEkaigCACIKJQEQCiEmICUgJDYCBCAlICY2AgACQCAkICZGBEAQnAEiKhCTASImJQEgIyAkEAghCRAzIiMgCSYBICpBhAFPBEAgKhBYCyAmQYQBTwRAICYQWAsgCiUBICMlAUEAEAkgI0GEAU8EQCAjEFgLICVBIGokAAwBCyAlQQA2AgggJSAlQQRqICVBCGoQfQALICIoAggiCgRAICIoAgwgCkECdEEEEK4BCyAiKAIEIgpBhAFPBEAgChBYCyAiQTBqJAAgCAwCCyAjICxB5IbAABBoAAsQbgALIgglASAIEFgLJQAgAEUEQEGcj8AAQTIQtwEACyAAIAIgAyAEIAUgASgCEBEIAAsoACABIAAoAgAtAABBAnQiAEHkp8AAaigCACAAQdCnwABqKAIAEJcBCyMAIABFBEBBnI/AAEEyELcBAAsgACACIAMgBCABKAIQEQkACyMAIABFBEBBnI/AAEEyELcBAAsgACACIAMgBCABKAIQER0ACyMAIABFBEBBnI/AAEEyELcBAAsgACACIAMgBCABKAIQERIACyMAIABFBEBBnI/AAEEyELcBAAsgACACIAMgBCABKAIQER8ACyMAIABFBEBBnI/AAEEyELcBAAsgACACIAMgBCABKAIQESEACygBAX8gACgCACIBQYCAgIB4ckGAgICAeEcEQCAAKAIEIAFBARCuAQsLKAAgAEEcakEAIAJC2anxiMTDnf6/f1EbQQAgAUKX34DY1/KkrypRGwshACAARQRAQZyPwABBMhC3AQALIAAgAiADIAEoAhARAwALHwAgAEUEQEGcj8AAQTIQtwEACyAAIAIgASgCEBEAAAvjFQEMfxAzIgQgASYBAn8gACEGEDMiACACJgEjAEHQAGsiCCQAIAggADYCGCAIIAQ2AhQgCEEUaigCABDJASELQfDNwAAoAgBFBEBBmM7AAEEANgIAQYzOwABBADYCAEGAzsAAQQA2AgBB9M3AAEEANgIAQZTOwAAoAgAhBUGUzsAAQQQ2AgBBkM7AACgCACENQZDOwABBADYCAEGIzsAAKAIAIQNBiM7AAEEENgIAQYTOwAAoAgAh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AgAgARA+Cw4AQbmswABBKyAAEHcACwsAIAApAwAgARA+Cw4AIAFB5IfAAEEFEJcBC6cDAgd/AX4gACgCACEAIwBB0ABrIgIkACACQSBqIAAgACgCACgCBBECACACIAJByABqrUKAgICAwAOENwMoQQEhAyACQQE2AjQgAkGUisAANgIwIAJCATcCPCACIAIpAyA3AkggAiACQShqNgI4AkAgASgCFCIHIAEoAhgiCCACQTBqECkNACABLQAcQQRxRQRAQQAhAwwBCyACQRhqIAAgACgCACgCBBECACACQShqrUKAgICAwAOEIQkgAigCHCEEIAIoAhghBUEAIQBBASEGA0ACQCAAQQFxBEAgBCEBIAUhAAwBCyAFIQAgBCEBA0AgAEUEQEEAIQMMBAsgAkEQaiAAIAEoAhgRAgAgAigCFCEBIAIoAhAhACAGQQFrIgYNAAsLIABBAEchAyAARQ0BIAJBCGogACABKAIYEQIAIAIoAgwhBCACKAIIIQUgAiABNgIsIAIgADYCKEEBIQAgAkEBNgI0IAJBoIrAADYCMCACQgE3AjwgAiAJNwNIIAIgAkHIAGo2AjhBACEGIAcgCCACQTBqEClFDQALCyACQdAAaiQAIAMLDQAgAEHYi8AAIAEQKQsNACAAQYSOwAAgARApCwkAIAAgARAOAAspAAJ/IAAoAgAtAABFBEAgAUH5sMAAQQUQHgwBCyABQf6wwABBBBAeCwsNACAAQbCRwAAgARApC+4BAQZ/An8gACgCACECIwBBgAFrIgQkACABKAIEIQcgASgCACEGIAEoAhwiBSEAAkAgBUEEcUUNACAFQQhyIQAgBg0AIAFCgYCAgKABNwIACyABIABBBHI2AhxBACEAA0AgACAEakH/AGogAkEPcSIDQTByIANB1wBqIANBCkkbOgAAIABBAWshACACQRBJIAJBBHYhAkUNAAsgAEGAAWoiAkGBAUkEQCABQZyvwABBAiAAIARqQYABakEAIABrECEgASAFNgIcIAEgBzYCBCABIAY2AgAgBEGAAWokAAwBCyACQYABQYyvwAAQZgALCwwAIAAgASkCADcDAAsNACABQfCYwABBAhAeCw0AIABBhJzAACABECkLDgAgAUGvm8AAQQUQlwELDgAgAUG8p8AAQRIQlwELDQAgAEHQqcAAIAEQKQsOACABQcipwABBBRCXAQsZACAAIAFBwM7AACgCACIAQTogABsRAgAAC78CAQJ/IwBBEGsiAiQAAkACfwJAIAFBgAFPBEAgAkEANgIMIAFBgBBJDQEgAUGAgARJBEAgAiABQT9xQYABcjoADiACIAFBDHZB4AFyOgAMIAIgAUEGdkE/cUGAAXI6AA1BAwwDCyACIAFBP3FBgAFyOgAPIAIgAUESdkHwAXI6AAwgAiABQQZ2QT9xQYABcjoADiACIAFBDHZBP3FBgAFyOgANQQQMAgsgACgCCCIDIAAoAgBGBEAgABBTCyAAIANBAWo2AgggACgCBCADaiABOgAADAILIAIgAUE/cUGAAXI6AA0gAiABQQZ2QcABcjoADEECCyEBIAEgACgCACAAKAIIIgNrSwRAIAAgAyABEFQgACgCCCEDCyAAKAIEIANqIAJBDGogARA8GiAAIAEgA2o2AggLIAJBEGokAEEACw0AIABBzK7AACABECkLCgAgAiAAIAEQHguQBQEHfwJAAn8CQCACIgUgACABa0sEQCABIAJqIQMgACACaiECIAAgBUEQSQ0CGiACQXxxIQRBACACQQNxIgZrIQcgBgRAIANBAWshAANAIAJBAWsiAiAALQAAOgAAIABBAWshACACIARLDQALCyAEIAUgBmsiBkF8cSIFayECIAMgB2oiA0EDcQRAIAVBAEwNAiADQQN0IgBBGHEhByADQXxxIghBBGshAUEAIABrQRhxIQkgCCgCACEAA0AgBEEEayIEIAAgCXQgASgCACIAIAd2cjYCACABQQRrIQEgAiAESQ0ACwwCCyAFQQBMDQEgASAGakEEayEBA0AgBEEEayIEIAEoAgA2AgAgAUEEayEBIAIgBEkNAAsMAQsCQCAFQRBJBEAgACECDAELIABBACAAa0EDcSIDaiEEIAMEQCAAIQIgASEAA0AgAiAALQAAOgAAIABBAWohACACQQFqIgIgBEkNAAsLIAQgBSADayIFQXxxIgZqIQICQCABIANqIgNBA3EEQCAGQQBMDQEgA0EDdCIAQRhxIQcgA0F8cSIIQQRqIQFBACAAa0EYcSEJIAgoAgAhAANAIAQgACAHdiABKAIAIgAgCXRyNgIAIAFBBGohASAEQQRqIgQgAkkNAAsMAQsgBkEATA0AIAMhAQNAIAQgASgCADYCACABQQRqIQEgBEEE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AAAAMwAAACADEAAcAAAAJwAAAC0AAAABAAAAAAAAACADEAAcAAAAPwAAACgAAAAvcnVzdGMvZjZlNTExZWVjNzM0MmY1OWEyNWY3YzA1MzRmMWRiZWEwMGQwMWIxNC9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL2luZGV4LnJzAHQDEABPAAAAbwMAADQAAAB0AxAATwAAAHYDAAAyAAAARXJyb3Jhc3NlcnRpb24gZmFpbGVkOiBzZWxmLmlzX2NoYXJfYm91bmRhcnkobmV3X2xlbikvcnVzdGMvZjZlNTExZWVjNzM0MmY1OWEyNWY3YzA1MzRmMWRiZWEwMGQwMWIxNC9saWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMZBBAASwAAAH8FAAANAAAAAAAAABAAAAAEAAAAHgAAAB8AAAAgAAAAYmFja3RyYWNlIGNhcHR1cmUgZmFpbGVkL1VzZXJzL2FzdW5kcXVpLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvYW55aG93LTEuMC45OC9zcmMvZXJyb3IucnMApAQQAF8AAABnBAAADgAAAAEAAAAAAAAAOiAAABwFEAACAAAACgpDYXVzZWQgYnk6CgAAACEAAAAMAAAABAAAACIAAAAjAAAAJAAAAAoKc3RhY2sgYmFja3RyYWNlOlN0YWNrIGJhY2t0cmFjZToKAGIFEAARAAAAUwBBiIvAAAuNBgEAAAAlAAAAYSBEaXNwbGF5IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yIHVuZXhwZWN0ZWRseQAZBBAASwAAAAYKAAAOAAAAAAAAABAAAAAEAAAAHgAAAB8AAAAgAAAAICAgIDogAAABAAAAAAAAAPQFEAACAAAAICAgICAgIC9ydXN0Yy9mNmU1MTFlZWM3MzQyZjU5YTI1ZjdjMDUzNGYxZGJlYTAwZDAxYjE0L2xpYnJhcnkvYWxsb2Mvc3JjL3ZlYy9tb2QucnMADwYQAEwAAACfCAAAJAAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuaXNfY2hhcl9ib3VuZGFyeShuKS9ydXN0Yy9mNmU1MTFlZWM3MzQyZjU5YTI1ZjdjMDUzNGYxZGJlYTAwZDAxYjE0L2xpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwAAAJYGEABLAAAAfwcAAB0AAACWBhAASwAAAIcHAAAdAAAAJgAAAAwAAAAEAAAAJwAAACgAAAAkAAAAL1VzZXJzL2FzdW5kcXVpLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvanMtc3lzLTAuMy43Ny9zcmMvbGliLnJzAAAAHAcQAF0AAAD7GAAAAQAAAAAAAAAEAAAABAAAADUAAABjbG9zdXJlIGludm9rZWQgcmVjdXJzaXZlbHkgb3IgYWZ0ZXIgYmVpbmcgZHJvcHBlZExhenkgaW5zdGFuY2UgaGFzIHByZXZpb3VzbHkgYmVlbiBwb2lzb25lZM4HEAAqAAAAL1VzZXJzL2FzdW5kcXVpLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvb25jZV9jZWxsLTEuMjEuMy9zcmMvbGliLnJzAAgQAGAAAAAIAwAAGQAAAHJlZW50cmFudCBpbml0AABwCBAADgAAAAAIEABgAAAAegIAAA0AQaCRwAALkQ8EAAAABAAAADsAAAA6AAAAPAAAAAwAAAAEAAAAPQAAAD4AAAA/AAAAL3J1c3QvZGVwcy9kbG1hbGxvYy0wLjIuNi9zcmMvZGxtYWxsb2MucnNhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA+PSBzaXplICsgbWluX292ZXJoZWFkAMgIEAApAAAAqAQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAADICBAAKQAAAK4EAAANAAAAc3RkL3NyYy9iYWNrdHJhY2UucnNvcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JthAkQACgAAAAkAAAAAgAAAKwJEAB1bnN1cHBvcnRlZCBiYWNrdHJhY2VkaXNhYmxlZCBiYWNrdHJhY2UAcAkQABQAAACKAQAAHQAAAEAAAAAQAAAABAAAAEEAAABCAAAAAQAAAAAAAAA6IHN0ZC9zcmMvc3luYy9sYXp5X2xvY2sucnMAFgoQABkAAACcAAAAEwAAAGNhbm5vdCByZWN1cnNpdmVseSBhY3F1aXJlIG11dGV4QAoQACAAAABzdGQvc3JjL3N5cy9zeW5jL211dGV4L25vX3RocmVhZHMucnNoChAAJAAAABQAAAAJAAAAc3RkL3NyYy9zeW5jL29uY2UucnOcChAAFAAAAJ4AAAAyAAAAPHVua25vd24+77+9bWVtb3J5IGFsbG9jYXRpb24gb2YgIGJ5dGVzIGZhaWxlZAAAzAoQABUAAADhChAADQAAAHN0ZC9zcmMvYWxsb2MucnMACxAAEAAAAGMBAAAJAAAACgAAADwAAAAMAAAABAAAAEMAAAAAAAAACAAAAAQAAABEAAAAAAAAAAgAAAAEAAAARQAAAEYAAABHAAAASAAAAEkAAAAQAAAABAAAAEoAAABLAAAATAAAAE0AAABzdGQvc3JjLy4uLy4uL2JhY2t0cmFjZS9zcmMvc3ltYm9saXplL21vZC5yc3wLEAAsAAAAZwEAADAAAAABAAAAAAAAABQKEAACAAAAIC0gAAEAAAAAAAAAyAsQAAMAAAAgICAgICAgICAgICAgICAgICAgYXQgAACsCBAAAQAAAE9uY2UgaW5zdGFuY2UgaGFzIHByZXZpb3VzbHkgYmVlbiBwb2lzb25lZAAA/AsQACoAAABvbmUtdGltZSBpbml0aWFsaXphdGlvbiBtYXkgbm90IGJlIHBlcmZvcm1lZCByZWN1cnNpdmVseTAMEAA4AAAAKCkAAAAAAAAEAAAABAAAAFEAAAAvcnVzdGMvZjZlNTExZWVjNzM0MmY1OWEyNWY3YzA1MzRmMWRiZWEwMGQwMWIxNC9saWJyYXJ5L2NvcmUvc3JjL29wcy9mdW5jdGlvbi5yc4QMEABQAAAApgAAAAUAAAAvcnVzdGMvZjZlNTExZWVjNzM0MmY1OWEyNWY3YzA1MzRmMWRiZWEwMGQwMWIxNC9saWJyYXJ5L2NvcmUvc3JjL3N0ci9wYXR0ZXJuLnJzAOQMEABPAAAAyAUAABQAAADkDBAATwAAAMgFAAAhAAAA5AwQAE8AAAC8BQAAIQAAADAxMjM0NTY3ODlhYmNkZWYAAAAAAAAAAAEAAABSAAAAY2FsbGVkIGBSZXN1bHQ6OnVud3JhcCgpYCBvbiBhbiBgRXJyYCB2YWx1ZUVycm9yRW1wdHlJbnZhbGlkRGlnaXRQb3NPdmVyZmxvd05lZ092ZXJmbG93WmVybwAAAAAABAAAAAQAAABTAAAAUGFyc2VJbnRFcnJvcmtpbmQAAAAAAAAADAAAAAQAAABUAAAAVQAAAFYAAADkDBAATwAAAEwEAAAkAAAA5AwQAE8AAAC+AQAANwAAAF9aTi9ydXN0L2RlcHMvcnVzdGMtZGVtYW5nbGUtMC4xLjI0L3NyYy9sZWdhY3kucnMAAAA/DhAALgAAAD0AAAALAAAAPw4QAC4AAAA6AAAACwAAAD8OEAAuAAAANgAAAAsAAAA/DhAALgAAAGYAAAAcAAAAPw4QAC4AAABvAAAAJwAAAD8OEAAuAAAAcAAAAB0AAAA/DhAALgAAAHIAAAAhAAAAPw4QAC4AAABzAAAAGgAAAD8OEAAuAAAAdAAAABkAAAA6OgAAPw4QAC4AAAB+AAAAHQAAAD8OEAAuAAAAtAAAACYAAAA/DhAALgAAALUAAAAhAAAAPw4QAC4AAACKAAAASQAAAD8OEAAuAAAAiwAAAB8AAAA/DhAALgAAAIsAAAAvAAAAQwAAAD8OEAAuAAAAnQAAADUAAAAsKSg+PCYqQD8OEAAuAAAAggAAACwAAAA/DhAALgAAAIQAAAAlAAAALgAAAD8OEAAuAAAAhwAAACUAAAAAAAAAAQAAAAEAAABXAAAAPw4QAC4AAAByAAAASAAAAF9fUi9ydXN0L2RlcHMvcnVzdGMtZGVtYW5nbGUtMC4xLjI0L3NyYy92MC5ycwAAANcPEAAqAAAAMgAAABMAAADXDxAAKgAAAC8AAAATAAAA1w8QACoAAAArAAAAEwBBvKDAAAvpCQEAAABYAAAAYGZtdDo6RXJyb3JgcyBzaG91bGQgYmUgaW1wb3NzaWJsZSB3aXRob3V0IGEgYGZtdDo6Rm9ybWF0dGVyYAAAANcPEAAqAAAASwAAAA4AAADXDxAAKgAAAFoAAAAoAAAA1w8QACoAAACKAAAADQAAAHB1bnljb2Rley19MNcPEAAqAAAAHgEAADEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2Rl1w8QACoAAAAxAQAAFgAAANcPEAAqAAAANAEAAEcAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBzdHI6OmZyb21fdXRmOCgpID0gIHdhcyBleHBlY3RlZCB0byBoYXZlIDEgY2hhciwgYnV0ICBjaGFycyB3ZXJlIGZvdW5kGBEQADkAAABRERAABAAAAFUREAAiAAAAdxEQABEAAADXDxAAKgAAAFwBAAAaAAAAYm9vbGNoYXJzdHJpOGkxNmkzMmk2NGkxMjhpc2l6ZXU4dTE2dTMydTY0dTEyOHVzaXplZjMyZjY0IV8uLi4AANcPEAAqAAAAvwEAAB8AAADXDxAAKgAAAB4CAAAeAAAA1w8QACoAAAAjAgAAIgAAANcPEAAqAAAAJAIAACUAAADXDxAAKgAAAIcCAAARAAAAe2ludmFsaWQgc3ludGF4fXtyZWN1cnNpb24gbGltaXQgcmVhY2hlZH0/J2Zvcjw+ICwgW106OntjbG9zdXJlc2hpbTojIGFzICBtdXQgY29uc3QgOyBkeW4gICsgdW5zYWZlIGV4dGVybiAi1w8QACoAAADUAwAALQAAACIgZm4oIC0+ICA9IGZhbHNldHJ1ZXsgeyAgfTogMHgA1w8QACoAAADKBAAALQAAAC5sbHZtLi9ydXN0L2RlcHMvcnVzdGMtZGVtYW5nbGUtMC4xLjI0L3NyYy9saWIucnMAAAD6EhAAKwAAAGIAAAAbAAAA+hIQACsAAABpAAAAEwAAAAEAAAAAAAAAe3NpemUgbGltaXQgcmVhY2hlZH0AAAAAAAAAAAEAAABZAAAAYGZtdDo6RXJyb3JgIGZyb20gYFNpemVMaW1pdGVkRm10QWRhcHRlcmAgd2FzIGRpc2NhcmRlZAD6EhAAKwAAAFMBAAAeAAAAU2l6ZUxpbWl0RXhoYXVzdGVkAAAFAAAADAAAAAsAAAALAAAABAAAALQNEAC5DRAAxQ0QANANEADbDRAAAgAAAAQAAAAEAAAAAwAAAAMAAAADAAAABAAAAAIAAAAFAAAABQAAAAQAAAADAAAAAwAAAAQAAAAEAAAAAQAAAAQAAAAEAAAAAwAAAAMAAAACAAAAAwAAAAQAAAADAAAAAwAAAAEAAADDERAAuBEQALwREADuERAAwBEQAOsREAC4ERAA1xEQANIREADmERAAuBEQAMgREADcERAAzhEQAOIREADyERAAuBEQALgREADFERAA2REQAHAMEADzERAAuBEQAMsREADfERAA8REQAEVycm9yAAAAWgAAAAwAAAAEAAAAWwAAAFwAAABdAAAAY2FwYWNpdHkgb3ZlcmZsb3cAAADoFBAAEQAAAGFsbG9jL3NyYy9yYXdfdmVjLnJzBBUQABQAAAAYAAAABQBBsKrAAAuwCgEAAABeAAAAYSBmb3JtYXR0aW5nIHRyYWl0IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yIHdoZW4gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGRpZCBub3RhbGxvYy9zcmMvZm10LnJzAACOFRAAEAAAAH4CAAAOAAAAZnJvbV9zdHJfcmFkaXhfaW50OiBtdXN0IGxpZSBpbiB0aGUgcmFuZ2UgYFsyLCAzNl1gIC0gZm91bmQgsBUQADwAAAAuLjAxMjM0NTY3ODlhYmNkZWZCb3Jyb3dNdXRFcnJvcmFscmVhZHkgYm9ycm93ZWQ6IAAAFBYQABIAAAABAAAAAAAAAFtjYWxsZWQgYE9wdGlvbjo6dW53cmFwKClgIG9uIGEgYE5vbmVgIHZhbHVlaW5kZXggb3V0IG9mIGJvdW5kczogdGhlIGxlbiBpcyAgYnV0IHRoZSBpbmRleCBpcyAAAGQWEAAgAAAAhBYQABIAAAA9PSE9bWF0Y2hlc2Fzc2VydGlvbiBgbGVmdCAgcmlnaHRgIGZhaWxlZAogIGxlZnQ6IAogcmlnaHQ6IACzFhAAEAAAAMMWEAAXAAAA2hYQAAkAAAAgcmlnaHRgIGZhaWxlZDogCiAgbGVmdDogAAAAsxYQABAAAAD8FhAAEAAAAAwXEAAJAAAA2hYQAAkAAAA6IAAAAQAAAAAAAAA4FxAAAgAAAAAAAAAMAAAABAAAAGUAAABmAAAAZwAAACAgICAgeyAsICB7CiwKfSB9Cl1jb3JlL3NyYy9mbXQvbnVtLnJzAAB3FxAAEwAAAGYAAAAXAAAAMHgwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5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", import.meta.url));
const A = Jr();
(typeof t == "string" || typeof Request == "function" && t instanceof Request || typeof URL == "function" && t instanceof URL) && (t = fetch(t));
const { instance: e, module: s } = await Lr(await t, A);
return Yr(e, s);
}
const JA = -9, Tr = 9, _A = (Tr - JA) / 254, Hr = 11, Kr = 11, O = 1 << Hr, XA = 1 << Kr, ss = 1;
function rt(t) {
return t === "bool" || t === "bvec2" || t === "bvec3" || t === "bvec4";
}
function gt(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 Rt(t) {
return t === "float" || t === "vec2" || t === "vec3" || t === "vec4";
}
function is(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 jA(t) {
return Rt(t) || is(t);
}
function ut(t) {
return t === "vec2" || t === "ivec2" || t === "uvec2";
}
function dt(t) {
return t === "vec3" || t === "ivec3" || t === "uvec3";
}
function Gt(t) {
return t === "vec4" || t === "ivec4" || t === "uvec4";
}
function qr(t) {
return ut(t) || dt(t) || Gt(t);
}
function tt(t) {
return t === "mat2" || t === "mat2x2";
}
function et(t) {
return t === "mat3" || t === "mat3x3";
}
function st(t) {
return t === "mat4" || t === "mat4x4";
}
function ns(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 as(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 zr(t) {
if (gt(t))
return "float";
if (ut(t))
return "vec2";
if (dt(t))
return "vec3";
if (Gt(t))
return "vec4";
throw new Error(`Invalid vector type: ${t}`);
}
function rs(t) {
if (gt(t))
return "uint";
if (ut(t))
return "uvec2";
if (dt(t))
return "uvec3";
if (Gt(t))
return "uvec4";
throw new Error(`Invalid vector type: ${t}`);
}
function _r(t) {
if (gt(t))
return "int";
if (ut(t))
return "ivec2";
if (dt(t))
return "ivec3";
if (Gt(t))
return "ivec4";
throw new Error(`Invalid vector type: ${t}`);
}
function gs(t) {
if (typeof t == "string")
return t;
if (typeof t == "object" && t.type)
return t.type;
throw new Error(`Invalid DynoType: ${String(t)}`);
}
function nA(t) {
return Math.trunc(t).toString();
}
function aA(t) {
return `${Math.max(0, Math.trunc(t)).toString()}u`;
}
function K(t) {
return t === Number.POSITIVE_INFINITY ? "INFINITY" : t === Number.NEGATIVE_INFINITY ? "-INFINITY" : Number.isInteger(t) ? t.toFixed(1) : t.toString();
}
function q(t) {
return t instanceof $A ? t.type : t.dynoOut().type;
}
class $A {
constructor(A) {
this.__isDynoValue = !0, this.type = A;
}
}
class z extends $A {
constructor(A, e) {
super(A.outTypes[e]), this.dyno = A, this.key = e;
}
}
class ct extends $A {
constructor(A, e) {
super(A), this.literal = e;
}
getLiteral() {
return this.literal;
}
}
function Ot(t, A) {
return new ct(t, A);
}
class os extends ct {
constructor(A, e) {
super(A, ""), this.value = e;
}
getLiteral() {
const { type: A, value: e } = this;
switch (A) {
case "bool":
return e ? "true" : "false";
case "uint":
return aA(e);
case "int":
return nA(e);
case "float":
return K(e);
case "bvec2": {
const s = e;
return `bvec2(${s[0]}, ${s[1]})`;
}
case "uvec2": {
if (e instanceof B.Vector2)
return `uvec2(${aA(e.x)}, ${aA(e.y)})`;
const s = e;
return `uvec2(${aA(s[0])}, ${aA(s[1])})`;
}
case "ivec2": {
if (e instanceof B.Vector2)
return `ivec2(${nA(e.x)}, ${nA(e.y)})`;
const s = e;
return `ivec2(${nA(s[0])}, ${nA(s[1])})`;
}
case "vec2": {
if (e instanceof B.Vector2)
return `vec2(${K(e.x)}, ${K(e.y)})`;
const s = e;
return `vec2(${K(s[0])}, ${K(s[1])})`;
}
case "bvec3": {
const s = e;
return `bvec3(${s[0]}, ${s[1]}, ${s[2]})`;
}
case "uvec3": {
if (e instanceof B.Vector3)
return `uvec3(${aA(e.x)}, ${aA(e.y)}, ${aA(e.z)})`;
const s = e;
return `uvec3(${aA(s[0])}, ${aA(s[1])}, ${aA(s[2])})`;
}
case "ivec3": {
if (e instanceof B.Vector3)
return `ivec3(${nA(e.x)}, ${nA(e.y)}, ${nA(e.z)})`;
const s = e;
return `ivec3(${nA(s[0])}, ${nA(s[1])}, ${nA(s[2])})`;
}
case "vec3": {
if (e instanceof B.Vector3)
return `vec3(${K(e.x)}, ${K(e.y)}, ${K(e.z)})`;
const s = e;
return `vec3(${K(s[0])}, ${K(s[1])}, ${K(s[2])})`;
}
case "bvec4": {
const s = e;
return `bvec4(${s[0]}, ${s[1]}, ${s[2]}, ${s[3]})`;
}
case "uvec4": {
if (e instanceof B.Vector4)
return `uvec4(${aA(e.x)}, ${aA(e.y)}, ${aA(e.z)}, ${aA(e.w)})`;
const s = e;
return `uvec4(${aA(s[0])}, ${aA(s[1])}, ${aA(s[2])}, ${aA(s[3])})`;
}
case "ivec4": {
if (e instanceof B.Vector4)
return `ivec4(${nA(e.x)}, ${nA(e.y)}, ${nA(e.z)}, ${nA(e.w)})`;
const s = e;
return `ivec4(${nA(s[0])}, ${nA(s[1])}, ${nA(s[2])}, ${nA(s[3])})`;
}
case "vec4": {
if (e instanceof B.Vector4)
return `vec4(${K(e.x)}, ${K(e.y)}, ${K(e.z)}, ${K(e.w)})`;
if (e instanceof B.Quaternion)
return `vec4(${K(e.x)}, ${K(e.y)}, ${K(e.z)}, ${K(e.w)})`;
const s = e;
return `vec4(${K(s[0])}, ${K(s[1])}, ${K(s[2])}, ${K(s[3])})`;
}
case "mat2":
case "mat2x2": {
const s = e, i = s instanceof B.Matrix2 ? s.elements : e, n = new Array(4).fill(0).map((a, r) => K(i[r]));
return `${A}(${n.join(", ")})`;
}
case "mat2x3": {
const s = e, i = new Array(6).fill(0).map((n, a) => K(s[a]));
return `${A}(${i.join(", ")})`;
}
case "mat2x4": {
const s = e, i = new Array(8).fill(0).map((n, a) => K(s[a]));
return `${A}(${i.join(", ")})`;
}
case "mat3":
case "mat3x3": {
const s = e, i = s instanceof B.Matrix3 ? s.elements : e, n = new Array(9).fill(0).map((a, r) => K(i[r]));
return `${A}(${n.join(", ")})`;
}
case "mat3x2": {
const s = e, i = new Array(6).fill(0).map((n, a) => K(s[a]));
return `${A}(${i.join(", ")})`;
}
case "mat3x4": {
const s = e, i = new Array(12).fill(0).map((n, a) => K(s[a]));
return `${A}(${i.join(", ")})`;
}
case "mat4":
case "mat4x4": {
const s = e, i = s instanceof B.Matrix4 ? s.elements : e, n = new Array(16).fill(0).map((a, r) => K(i[r]));
return `${A}(${n.join(", ")})`;
}
case "mat4x2": {
const s = e, i = new Array(8).fill(0).map((n, a) => K(s[a]));
return `${A}(${i.join(", ")})`;
}
case "mat4x3": {
const s = e, i = new Array(12).fill(0).map((n, a) => K(s[a]));
return `${A}(${i.join(", ")})`;
}
default:
throw new Error(`Type not implemented: ${String(A)}`);
}
}
}
function tA(t, A) {
return new os(t, A);
}
function pt(t) {
const A = String(t);
if (rt(t))
return `${A}(false)`;
if (jA(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 Vr(t) {
const A = String(t);
if (rt(t))
return `${A}(true)`;
if (jA(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 Pr(t) {
const A = String(t);
if (rt(t))
return `${A}(true)`;
if (jA(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 Ve = " ";
class Is {
constructor({ indent: A } = {}) {
this.globals = /* @__PURE__ */ new Set(), this.statements = [], this.uniforms = {}, this.declares = /* @__PURE__ */ new Set(), this.updaters = [], this.sequence = 0, this.indent = Ve, this.indent = A ?? Ve;
}
nextSequence() {
return this.sequence++;
}
}
class V {
constructor({
inTypes: A,
outTypes: e,
inputs: s,
update: i,
globals: n,
statements: a,
generate: r
}) {
this.inTypes = A ?? {}, this.outTypes = e ?? {}, this.inputs = s ?? {}, this.update = i, this.globals = n, this.statements = a, this.generate = r ?? (({ inputs: g, outputs: I, compile: Q }) => {
var o, E;
return {
globals: (o = this.globals) == null ? void 0 : o.call(this, { inputs: g, outputs: I, compile: Q }),
statements: (E = this.statements) == null ? void 0 : E.call(this, { inputs: g, outputs: I, compile: Q })
};
});
}
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: s
}) {
const i = [
`// ${this.constructor.name}(${Object.values(A).join(", ")}) => (${Object.values(e).join(", ")})`
], n = [];
for (const I in e) {
const Q = e[I];
Q && !s.declares.has(Q) && (s.declares.add(Q), n.push(I));
}
const { globals: a, statements: r, uniforms: g } = this.generate({
inputs: A,
outputs: e,
compile: s
});
for (const I of a ?? [])
s.globals.add(I);
for (const I in g)
s.uniforms[I] = g[I];
this.update && s.updaters.push(this.update);
for (const I of n) {
const Q = e[I];
Q && (s.uniforms[Q] || i.push(`${be(Q, this.outTypes[I])};`));
}
return r != null && r.length && (i.push("{"), i.push(...r.map((I) => s.indent + I)), i.push("}")), i;
}
}
class HA extends V {
constructor({
inTypes: A,
outTypes: e,
inputs: s,
update: i,
globals: n,
construct: a
}) {
super({
inTypes: A,
outTypes: e,
inputs: s,
update: i,
globals: n,
generate: (r) => this.generateBlock(r)
}), this.construct = a;
}
generateBlock({
inputs: A,
outputs: e,
compile: s
}) {
var c, h;
const i = {}, n = {};
for (const l in A)
A[l] != null && (i[l] = new ct(this.inTypes[l], A[l]));
for (const l in e)
e[l] != null && (n[l] = new $A(this.outTypes[l]));
const a = { roots: [] }, r = this.construct(i, n, a);
for (const l of ((c = this.globals) == null ? void 0 : c.call(this, { inputs: A, outputs: e, compile: s })) ?? [])
s.globals.add(l);
const g = [], I = /* @__PURE__ */ new Map();
function Q(l, u, w) {
let d = I.get(l);
if (!d) {
d = {
sequence: s.nextSequence(),
outNames: /* @__PURE__ */ new Map(),
newOuts: /* @__PURE__ */ new Set()
}, I.set(l, d);
for (const p in l.inputs) {
let y = l.inputs[p];
for (; y; ) {
if (y instanceof $A) {
y instanceof z && Q(y.dyno, y.key);
break;
}
y = y.dynoOut();
}
}
g.push(l);
}
u && (w || d.newOuts.add(u), d.outNames.set(u, w ?? `${u}_${d.sequence}`));
}
for (const l of a.roots)
Q(l);
for (const l in n) {
let u = (r == null ? void 0 : r[l]) ?? n[l];
for (; u; ) {
if (u instanceof $A) {
u instanceof z && Q(u.dyno, u.key, e[l]);
break;
}
u = u.dynoOut();
}
n[l] = u;
}
const o = [];
for (const l of g) {
const u = {}, w = {};
for (const y in l.inputs) {
let m = l.inputs[y];
for (; m; ) {
if (m instanceof $A) {
if (m instanceof ct)
u[y] = m.getLiteral();
else if (m instanceof z) {
const F = (h = I.get(m.dyno)) == null ? void 0 : h.outNames.get(m.key);
if (!F)
throw new Error(
`Source not found for ${m.dyno.constructor.name}.${m.key}`
);
u[y] = F;
}
break;
}
m = m.dynoOut();
}
}
const d = I.get(l) ?? { outNames: /* @__PURE__ */ new Map() };
for (const [y, m] of d.outNames.entries())
w[y] = m;
const p = l.compile({ inputs: u, outputs: w, compile: s });
o.push(p);
}
const E = [];
for (const l in e)
n[l] instanceof ct && E.push(
`${e[l]} = ${n[l].getLiteral()};`
);
return E.length > 0 && o.push(E), { statements: o.flatMap((l, u) => u === 0 ? l : ["", ...l]) };
}
}
function RA(t, A, e, { update: s, globals: i } = {}) {
return new HA({ inTypes: t, outTypes: A, construct: e, update: s, globals: i });
}
function bt({
inTypes: t,
outTypes: A,
inputs: e,
update: s,
globals: i,
statements: n,
generate: a
}) {
return new V({
inTypes: t,
outTypes: A,
inputs: e,
update: s,
globals: i,
statements: n,
generate: a
});
}
function be(t, A, e) {
const s = typeof A == "string" ? A : A.type;
if (!s)
throw new Error(`Invalid DynoType: ${String(A)}`);
return `${s} ${t}${e != null ? `[${e}]` : ""}`;
}
function NA(t) {
var n;
let A = !1;
const e = t.split(`
`).map((a) => {
const r = a.trimEnd();
return A ? r : r.length > 0 ? (A = !0, r) : null;
}).filter((a) => a != null);
for (; e.length > 0 && e[e.length - 1].length === 0; )
e.pop();
if (e.length === 0)
return [];
const s = (n = e[0].match(/^\s*/)) == null ? void 0 : n[0];
if (!s)
return e;
const i = new RegExp(`^${s}`);
return e.map((a) => a.replace(i, ""));
}
function BA(t) {
return NA(t).join(`
`);
}
class x extends V {
constructor({
a: A,
outKey: e,
outTypeFunc: s
}) {
const i = { a: q(A) }, n = s(q(A)), a = { [e]: n };
super({ inTypes: i, outTypes: a, inputs: { a: A } }), this.outKey = e;
}
dynoOut() {
return new z(this, this.outKey);
}
}
class W extends V {
constructor({
a: A,
b: e,
outKey: s,
outTypeFunc: i
}) {
const n = { a: q(A), b: q(e) }, a = i(q(A), q(e)), r = { [s]: a };
super({ inTypes: n, outTypes: r, inputs: { a: A, b: e } }), this.outKey = s;
}
dynoOut() {
return new z(this, this.outKey);
}
}
class ot extends V {
constructor({
a: A,
b: e,
c: s,
outKey: i,
outTypeFunc: n
}) {
const a = { a: q(A), b: q(e), c: q(s) }, r = n(q(A), q(e), q(s)), g = { [i]: r };
super({ inTypes: a, outTypes: g, inputs: { a: A, b: e, c: s } }), this.outKey = i;
}
dynoOut() {
return new z(this, this.outKey);
}
}
const sA = { type: "Gsplat" }, vt = { type: "PackedSplats" }, Zr = (t) => new Qs({ packedSplats: t }), Nt = (t, A) => new Cs({ packedSplats: t, index: A }), Bs = (t, A, e, s) => new cs({ packedSplats: t, index: A, base: e, count: s }), mt = (t) => new hs({ gsplat: t }), ht = ({
gsplat: t,
flags: A,
index: e,
center: s,
scales: i,
quaternion: n,
rgba: a,
rgb: r,
opacity: g,
x: I,
y: Q,
z: o,
r: E,
g: C,
b: c
}) => new ls({
gsplat: t,
flags: A,
index: e,
center: s,
scales: i,
quaternion: n,
rgba: a,
rgb: r,
opacity: g,
x: I,
y: Q,
z: o,
r: E,
g: C,
b: c
}), Or = (t) => new ds({ gsplat: t }), ve = (t, {
scale: A,
rotate: e,
translate: s,
recolor: i
}) => new ws({ gsplat: t, scale: A, rotate: e, translate: s, recolor: i }), mA = BA(`
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;
}
`), ne = BA(`
struct PackedSplats {
usampler2DArray texture;
int numSplats;
};
`);
class Qs extends x {
constructor({
packedSplats: A
}) {
super({ a: A, outKey: "numSplats", outTypeFunc: () => "int" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.numSplats} = ${e.a}.numSplats;`
];
}
}
const Es = BA(`
bool readPackedSplat(usampler2DArray texture, int numSplats, int index, out Gsplat gsplat) {
if ((index >= 0) && (index < numSplats)) {
uvec4 packed = texelFetch(texture, splatTexCoord(index), 0);
unpackSplat(packed, gsplat.center, gsplat.scales, gsplat.quaternion, gsplat.rgba);
return true;
} else {
return false;
}
}
`);
class Cs extends V {
constructor({
packedSplats: A,
index: e
}) {
super({
inTypes: { packedSplats: vt, index: "int" },
outTypes: { gsplat: sA },
inputs: { packedSplats: A, index: e },
globals: () => [mA, ne, Es],
statements: ({ inputs: s, outputs: i }) => {
const { gsplat: n } = i;
if (!n)
return [];
const { packedSplats: a, index: r } = s;
let g;
return a && r ? g = NA(`
if (readPackedSplat(${a}.texture, ${a}.numSplats, ${r}, ${n})) {
bool zeroSize = all(equal(${n}.scales, vec3(0.0, 0.0, 0.0)));
${n}.flags = zeroSize ? 0u : GSPLAT_FLAG_ACTIVE;
} else {
${n}.flags = 0u;
}
`) : g = [`${n}.flags = 0u;`], g.push(`${n}.index = ${r ?? "0"};`), g;
}
});
}
dynoOut() {
return new z(this, "gsplat");
}
}
class cs extends V {
constructor({
packedSplats: A,
index: e,
base: s,
count: i
}) {
super({
inTypes: {
packedSplats: vt,
index: "int",
base: "int",
count: "int"
},
outTypes: { gsplat: sA },
inputs: { packedSplats: A, index: e, base: s, count: i },
globals: () => [mA, ne, Es],
statements: ({ inputs: n, outputs: a }) => {
const { gsplat: r } = a;
if (!r)
return [];
const { packedSplats: g, index: I, base: Q, count: o } = n;
let E;
return g && I && Q && o ? E = NA(`
${r}.flags = 0u;
if ((${I} >= ${Q}) && (${I} < (${Q} + ${o}))) {
if (readPackedSplat(${g}.texture, ${g}.numSplats, ${I}, ${r})) {
bool zeroSize = all(equal(${r}.scales, vec3(0.0, 0.0, 0.0)));
${r}.flags = zeroSize ? 0u : GSPLAT_FLAG_ACTIVE;
}
}
`) : E = [`${r}.flags = 0u;`], E.push(`${r}.index = ${I ?? "0"};`), E;
}
});
}
dynoOut() {
return new z(this, "gsplat");
}
}
class hs extends V {
constructor({ gsplat: A }) {
super({
inTypes: { gsplat: sA },
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: () => [mA],
statements: ({ inputs: e, outputs: s }) => {
const { gsplat: i } = e, {
flags: n,
active: a,
index: r,
center: g,
scales: I,
quaternion: Q,
rgba: o,
rgb: E,
opacity: C,
x: c,
y: h,
z: l,
r: u,
g: w,
b: d
} = s;
return [
n ? `${n} = ${i ? `${i}.flags` : "0u"};` : null,
a ? `${a} = isGsplatActive(${i ? `${i}.flags` : "0u"});` : null,
r ? `${r} = ${i ? `${i}.index` : "0"};` : null,
g ? `${g} = ${i ? `${i}.center` : "vec3(0.0, 0.0, 0.0)"};` : null,
I ? `${I} = ${i ? `${i}.scales` : "vec3(0.0, 0.0, 0.0)"};` : null,
Q ? `${Q} = ${i ? `${i}.quaternion` : "vec4(0.0, 0.0, 0.0, 1.0)"};` : null,
o ? `${o} = ${i ? `${i}.rgba` : "vec4(0.0, 0.0, 0.0, 0.0)"};` : null,
E ? `${E} = ${i ? `${i}.rgba.rgb` : "vec3(0.0, 0.0, 0.0)"};` : null,
C ? `${C} = ${i ? `${i}.rgba.a` : "0.0"};` : null,
c ? `${c} = ${i ? `${i}.center.x` : "0.0"};` : null,
h ? `${h} = ${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 ls extends V {
constructor({
gsplat: A,
flags: e,
index: s,
center: i,
scales: n,
quaternion: a,
rgba: r,
rgb: g,
opacity: I,
x: Q,
y: o,
z: E,
r: C,
g: c,
b: h
}) {
super({
inTypes: {
gsplat: sA,
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: sA },
inputs: {
gsplat: A,
flags: e,
index: s,
center: i,
scales: n,
quaternion: a,
rgba: r,
rgb: g,
opacity: I,
x: Q,
y: o,
z: E,
r: C,
g: c,
b: h
},
globals: () => [mA],
statements: ({ inputs: l, outputs: u }) => {
const { gsplat: w } = u;
if (!w)
return [];
const {
gsplat: d,
flags: p,
index: y,
center: m,
scales: F,
quaternion: D,
rgba: f,
rgb: U,
opacity: S,
x: M,
y: b,
z: N,
r: R,
g: G,
b: L
} = l;
return [
`${w}.flags = ${p ?? (d ? `${d}.flags` : "0u")};`,
`${w}.index = ${y ?? (d ? `${d}.index` : "0")};`,
`${w}.center = ${m ?? (d ? `${d}.center` : "vec3(0.0, 0.0, 0.0)")};`,
`${w}.scales = ${F ?? (d ? `${d}.scales` : "vec3(0.0, 0.0, 0.0)")};`,
`${w}.quaternion = ${D ?? (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)")};`,
U ? `${w}.rgba.rgb = ${U};` : null,
S ? `${w}.rgba.a = ${S};` : null,
M ? `${w}.center.x = ${M};` : null,
b ? `${w}.center.y = ${b};` : null,
N ? `${w}.center.z = ${N};` : null,
R ? `${w}.rgba.r = ${R};` : null,
G ? `${w}.rgba.g = ${G};` : null,
L ? `${w}.rgba.b = ${L};` : null
].filter(Boolean);
}
});
}
dynoOut() {
return new z(this, "gsplat");
}
}
const us = BA(`
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 ds extends x {
constructor({ gsplat: A }) {
super({ a: A, outKey: "normal", outTypeFunc: () => "vec3" }), this.globals = () => [mA, us], this.statements = ({ inputs: e, outputs: s }) => [
`${s.normal} = gsplatNormal(${e.a}.scales, ${e.a}.quaternion);`
];
}
}
class ws extends V {
constructor({
gsplat: A,
scale: e,
rotate: s,
translate: i,
recolor: n
}) {
super({
inTypes: {
gsplat: sA,
scale: "float",
rotate: "vec4",
translate: "vec3",
recolor: "vec4"
},
outTypes: { gsplat: sA },
inputs: { gsplat: A, scale: e, rotate: s, translate: i, recolor: n },
globals: () => [mA],
statements: ({ inputs: a, outputs: r, compile: g }) => {
const { gsplat: I } = r;
if (!I || !a.gsplat)
return [];
const { scale: Q, rotate: o, translate: E, recolor: C } = a, c = g.indent;
return [
`${I} = ${a.gsplat};`,
`if (isGsplatActive(${I}.flags)) {`,
Q ? `${c}${I}.center *= ${Q};` : null,
o ? `${c}${I}.center = quatVec(${o}, ${I}.center);` : null,
E ? `${c}${I}.center += ${E};` : null,
Q ? `${c}${I}.scales *= ${Q};` : null,
o ? `${c}${I}.quaternion = quatQuat(${o}, ${I}.quaternion);` : null,
C ? `${c}${I}.rgba *= ${C};` : null,
"}"
].filter(Boolean);
}
});
}
dynoOut() {
return new z(this, "gsplat");
}
}
const ys = (t) => new ps({ gsplat: t }), Wr = (t) => new Le({ rgba8: t });
class ps extends V {
constructor({ gsplat: A }) {
super({
inTypes: { gsplat: sA },
inputs: { gsplat: A },
globals: () => [mA],
statements: ({ inputs: e, outputs: s }) => {
const { output: i } = s;
if (!i)
return [];
const { gsplat: n } = e;
return n ? NA(`
if (isGsplatActive(${n}.flags)) {
${i} = packSplat(${n}.center, ${n}.scales, ${n}.quaternion, ${n}.rgba);
} else {
${i} = uvec4(0u, 0u, 0u, 0u);
}
`) : [`${i} = uvec4(0u, 0u, 0u, 0u);`];
}
});
}
dynoOut() {
return new z(this, "output");
}
}
class Le extends V {
constructor({ rgba8: A }) {
super({
inTypes: { rgba8: "vec4" },
inputs: { rgba8: A },
statements: ({ inputs: e, outputs: s }) => [
`target = ${e.rgba8 ?? "vec4(0.0, 0.0, 0.0, 0.0)"};`
]
});
}
dynoOut() {
return new z(this, "rgba8");
}
}
const Xr = (t, A, e) => new k({ key: t, type: A, value: e }), $r = (t = !1, A) => new Wt({ key: A, value: t }), jr = (t = 0, A) => new Ds({ key: A, value: t }), Ag = (t = 0, A) => new kt({ key: A, value: t }), LA = (t = 0, A) => new it({ key: A, value: t }), tg = (t, A) => new fs({ key: A, value: t }), eg = (t, A) => new ms({ key: A, value: t }), sg = (t, A) => new Ms({ key: A, value: t }), ig = (t, A) => new xs({ key: A, value: t }), ng = (t, A) => new Ss({ key: A, value: t }), ag = (t, A) => new Fs({ key: A, value: t }), rg = (t, A) => new Ns({ key: A, value: t }), PA = (t, A) => new lt({ key: A, value: t }), gg = (t, A) => new ks({ key: A, value: t }), og = (t, A) => new Us({ key: A, value: t }), Ig = (t, A) => new Rs({ key: A, value: t }), Bg = (t, A) => new Lt({ key: A, value: t }), Qg = (t, A) => new Gs({ key: A, value: t }), Eg = (t, A) => new bs({ key: A, value: t }), Cg = (t, A) => new vs({ key: A, value: t }), cg = (t, A) => new Ls({ key: A, value: t }), hg = (t, A) => new Js({ key: A, value: t }), lg = (t, A) => new Ys({ key: A, value: t }), ug = (t, A) => new Ts({ key: A, value: t }), dg = (t, A) => new Hs({ key: A, value: t }), wg = (t, A) => new Ks({ key: A, value: t }), yg = (t, A) => new qs({ key: A, value: t }), pg = (t, A) => new zs({ key: A, value: t }), Dg = (t, A) => new _s({ key: A, value: t }), fg = (t, A) => new Vs({ key: A, value: t }), mg = (t, A) => new Ps({ key: A, value: t }), Mg = (t, A) => new Zs({ key: A, value: t }), xg = (t, A) => new Mt({ key: A, value: t }), Sg = (t, A) => new Os({ key: t, value: A }), Fg = (t, A) => new Ws({ key: A, value: t }), Ng = (t, A) => new Xs({ key: A, value: t }), kg = (t, A) => new $s({ key: A, value: t }), Ug = (t, A) => new js({ key: A, value: t }), Rg = (t, A) => new Ai({ key: A, value: t }), Gg = (t, A) => new ti({ key: A, value: t }), bg = (t, A) => new ei({ key: A, value: t }), vg = (t, A) => new si({ key: A, value: t }), Lg = (t, A) => new ii({ key: A, value: t }), Jg = (t, A) => new ni({ key: A, value: t });
class k extends V {
constructor({
key: A,
type: e,
count: s,
value: i,
update: n,
globals: a
}) {
A = A ?? "value", super({
outTypes: { [A]: e },
update: () => {
if (n) {
const r = n(this.value);
r !== void 0 && (this.value = r);
}
this.uniform.value = this.value;
},
generate: ({ inputs: r, outputs: g }) => {
const I = (a == null ? void 0 : a({ inputs: r, outputs: g })) ?? [], Q = {}, o = g[A];
return o && (I.push(`uniform ${be(o, e, s)};`), Q[o] = this.uniform), { globals: I, uniforms: Q };
}
}), this.type = e, this.count = s, this.value = i, this.uniform = { value: i }, this.outKey = A;
}
dynoOut() {
return new z(this, this.outKey);
}
}
class Wt extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "bool", value: e, update: s });
}
}
class Ds extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "uint", value: e, update: s });
}
}
class kt extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "int", value: e, update: s });
}
}
class it extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "float", value: e, update: s });
}
}
class fs extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "bvec2", value: e, update: s });
}
}
class ms extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "uvec2", value: e, update: s });
}
}
class Ms extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "ivec2", value: e, update: s });
}
}
class xs extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "vec2", value: e, update: s });
}
}
class Ss extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "bvec3", value: e, update: s });
}
}
class Fs extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "uvec3", value: e, update: s });
}
}
class Ns extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "ivec3", value: e, update: s });
}
}
class lt extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "vec3", value: e, update: s });
}
}
class ks extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "bvec4", value: e, update: s });
}
}
class Us extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "uvec4", value: e, update: s });
}
}
class Rs extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "ivec4", value: e, update: s });
}
}
class Lt extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "vec4", value: e, update: s });
}
}
class Gs extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat2", value: e, update: s });
}
}
class bs extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat2x2", value: e, update: s });
}
}
class vs extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat2x3", value: e, update: s });
}
}
class Ls extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat2x4", value: e, update: s });
}
}
class Js extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat3", value: e, update: s });
}
}
class Ys extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat3x2", value: e, update: s });
}
}
class Ts extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat3x3", value: e, update: s });
}
}
class Hs extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat3x4", value: e, update: s });
}
}
class Ks extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat4", value: e, update: s });
}
}
class qs extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat4x2", value: e, update: s });
}
}
class zs extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat4x3", value: e, update: s });
}
}
class _s extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "mat4x4", value: e, update: s });
}
}
class Vs extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "usampler2D", value: e, update: s });
}
}
class Ps extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "isampler2D", value: e, update: s });
}
}
class Zs extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "sampler2D", value: e, update: s });
}
}
class Mt extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "usampler2DArray", value: e, update: s });
}
}
class Os extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "isampler2DArray", value: e, update: s });
}
}
class Ws extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "sampler2DArray", value: e, update: s });
}
}
class Xs extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "usampler3D", value: e, update: s });
}
}
class $s extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "isampler3D", value: e, update: s });
}
}
class js extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "sampler3D", value: e, update: s });
}
}
class Ai extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "usamplerCube", value: e, update: s });
}
}
class ti extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "isamplerCube", value: e, update: s });
}
}
class ei extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "samplerCube", value: e, update: s });
}
}
class si extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "sampler2DShadow", value: e, update: s });
}
}
class ii extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "sampler2DArrayShadow", value: e, update: s });
}
}
class ni extends k {
constructor({
key: A,
value: e,
update: s
}) {
super({ key: A, type: "samplerCubeShadow", value: e, update: s });
}
}
var cA = Uint8Array, Qt = Uint16Array, Yg = Int32Array, ai = new cA([
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
]), ri = new cA([
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
]), Tg = new cA([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]), gi = function(t, A) {
for (var e = new Qt(31), s = 0; s < 31; ++s)
e[s] = A += 1 << t[s - 1];
for (var i = new Yg(e[30]), s = 1; s < 30; ++s)
for (var n = e[s]; n < e[s + 1]; ++n)
i[n] = n - e[s] << 5 | s;
return { b: e, r: i };
}, oi = gi(ai, 2), Ii = oi.b, Hg = oi.r;
Ii[28] = 258, Hg[258] = 28;
var Kg = gi(ri, 0), qg = Kg.b, De = new Qt(32768);
for (var eA = 0; eA < 32768; ++eA) {
var VA = (eA & 43690) >> 1 | (eA & 21845) << 1;
VA = (VA & 52428) >> 2 | (VA & 13107) << 2, VA = (VA & 61680) >> 4 | (VA & 3855) << 4, De[eA] = ((VA & 65280) >> 8 | (VA & 255) << 8) >> 1;
}
var xt = function(t, A, e) {
for (var s = t.length, i = 0, n = new Qt(A); i < s; ++i)
t[i] && ++n[t[i] - 1];
var a = new Qt(A);
for (i = 1; i < A; ++i)
a[i] = a[i - 1] + n[i - 1] << 1;
var r;
if (e) {
r = new Qt(1 << A);
var g = 15 - A;
for (i = 0; i < s; ++i)
if (t[i])
for (var I = i << 4 | t[i], Q = A - t[i], o = a[t[i] - 1]++ << Q, E = o | (1 << Q) - 1; o <= E; ++o)
r[De[o] >> g] = I;
} else
for (r = new Qt(s), i = 0; i < s; ++i)
t[i] && (r[i] = De[a[t[i] - 1]++] >> 15 - t[i]);
return r;
}, Jt = new cA(288);
for (var eA = 0; eA < 144; ++eA)
Jt[eA] = 8;
for (var eA = 144; eA < 256; ++eA)
Jt[eA] = 9;
for (var eA = 256; eA < 280; ++eA)
Jt[eA] = 7;
for (var eA = 280; eA < 288; ++eA)
Jt[eA] = 8;
var Bi = new cA(32);
for (var eA = 0; eA < 32; ++eA)
Bi[eA] = 5;
var zg = /* @__PURE__ */ xt(Jt, 9, 1), _g = /* @__PURE__ */ xt(Bi, 5, 1), ue = function(t) {
for (var A = t[0], e = 1; e < t.length; ++e)
t[e] > A && (A = t[e]);
return A;
}, kA = function(t, A, e) {
var s = A / 8 | 0;
return (t[s] | t[s + 1] << 8) >> (A & 7) & e;
}, de = function(t, A) {
var e = A / 8 | 0;
return (t[e] | t[e + 1] << 8 | t[e + 2] << 16) >> (A & 7);
}, Qi = function(t) {
return (t + 7) / 8 | 0;
}, _t = function(t, A, e) {
return (A == null || A < 0) && (A = 0), (e == null || e > t.length) && (e = t.length), new cA(t.subarray(A, e));
}, Vg = [
"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
], xA = function(t, A, e) {
var s = new Error(A || Vg[t]);
if (s.code = t, Error.captureStackTrace && Error.captureStackTrace(s, xA), !e)
throw s;
return s;
}, Pg = function(t, A, e, s) {
var i = t.length, n = 0;
if (!i || A.f && !A.l)
return e || new cA(0);
var a = !e, r = a || A.i != 2, g = A.i;
a && (e = new cA(i * 3));
var I = function(QA) {
var EA = e.length;
if (QA > EA) {
var Y = new cA(Math.max(EA * 2, QA));
Y.set(e), e = Y;
}
}, Q = A.f || 0, o = A.p || 0, E = A.b || 0, C = A.l, c = A.d, h = A.m, l = A.n, u = i * 8;
do {
if (!C) {
Q = kA(t, o, 1);
var w = kA(t, o + 1, 3);
if (o += 3, w)
if (w == 1)
C = zg, c = _g, h = 9, l = 5;
else if (w == 2) {
var m = kA(t, o, 31) + 257, F = kA(t, o + 10, 15) + 4, D = m + kA(t, o + 5, 31) + 1;
o += 14;
for (var f = new cA(D), U = new cA(19), S = 0; S < F; ++S)
U[Tg[S]] = kA(t, o + S * 3, 7);
o += F * 3;
for (var M = ue(U), b = (1 << M) - 1, N = xt(U, M, 1), S = 0; S < D; ) {
var R = N[kA(t, o, b)];
o += R & 15;
var d = R >> 4;
if (d < 16)
f[S++] = d;
else {
var G = 0, L = 0;
for (d == 16 ? (L = 3 + kA(t, o, 3), o += 2, G = f[S - 1]) : d == 17 ? (L = 3 + kA(t, o, 7), o += 3) : d == 18 && (L = 11 + kA(t, o, 127), o += 7); L--; )
f[S++] = G;
}
}
var T = f.subarray(0, m), H = f.subarray(m);
h = ue(T), l = ue(H), C = xt(T, h, 1), c = xt(H, l, 1);
} else
xA(1);
else {
var d = Qi(o) + 4, p = t[d - 4] | t[d - 3] << 8, y = d + p;
if (y > i) {
g && xA(0);
break;
}
r && I(E + p), e.set(t.subarray(d, y), E), A.b = E += p, A.p = o = y * 8, A.f = Q;
continue;
}
if (o > u) {
g && xA(0);
break;
}
}
r && I(E + 131072);
for (var iA = (1 << h) - 1, P = (1 << l) - 1, AA = o; ; AA = o) {
var G = C[de(t, o) & iA], j = G >> 4;
if (o += G & 15, o > u) {
g && xA(0);
break;
}
if (G || xA(2), j < 256)
e[E++] = j;
else if (j == 256) {
AA = o, C = null;
break;
} else {
var X = j - 254;
if (j > 264) {
var S = j - 257, Z = ai[S];
X = kA(t, o, (1 << Z) - 1) + Ii[S], o += Z;
}
var _ = c[de(t, o) & P], v = _ >> 4;
_ || xA(3), o += _ & 15;
var H = qg[v];
if (v > 3) {
var Z = ri[v];
H += de(t, o) & (1 << Z) - 1, o += Z;
}
if (o > u) {
g && xA(0);
break;
}
r && I(E + 131072);
var wA = E + X;
if (E < H) {
var gA = n - H, J = Math.min(H, wA);
for (gA + E < 0 && xA(3); E < J; ++E)
e[E] = s[gA + E];
}
for (; E < wA; ++E)
e[E] = e[E - H];
}
}
A.l = C, A.p = AA, A.b = E, A.f = Q, C && (Q = 1, A.m = h, A.d = c, A.n = l);
} while (!Q);
return E != e.length && a ? _t(e, 0, E) : e.subarray(0, E);
}, Zg = /* @__PURE__ */ new cA(0), Og = function(t) {
(t[0] != 31 || t[1] != 139 || t[2] != 8) && xA(6, "invalid gzip data");
var A = t[3], e = 10;
A & 4 && (e += (t[10] | t[11] << 8) + 2);
for (var s = (A >> 3 & 1) + (A >> 4 & 1); s > 0; s -= !t[e++])
;
return e + (A & 2);
}, we = /* @__PURE__ */ function() {
function t(A, e) {
typeof A == "function" && (e = A, A = {}), this.ondata = e;
var s = A && A.dictionary && A.dictionary.subarray(-32768);
this.s = { i: 0, b: s ? s.length : 0 }, this.o = new cA(32768), this.p = new cA(0), s && this.o.set(s);
}
return t.prototype.e = function(A) {
if (this.ondata || xA(5), this.d && xA(4), !this.p.length)
this.p = A;
else if (A.length) {
var e = new cA(this.p.length + A.length);
e.set(this.p), e.set(A, this.p.length), this.p = e;
}
}, t.prototype.c = function(A) {
this.s.i = +(this.d = A || !1);
var e = this.s.b, s = Pg(this.p, this.s, this.o);
this.ondata(_t(s, e, this.s.b), this.d), this.o = _t(s, this.s.b - 32768), this.s.b = this.o.length, this.p = _t(this.p, this.s.p / 8 | 0), this.s.p &= 7;
}, t.prototype.push = function(A, e) {
this.e(A), this.c(e);
}, t;
}(), Ei = /* @__PURE__ */ function() {
function t(A, e) {
this.v = 1, this.r = 0, we.call(this, A, e);
}
return t.prototype.push = function(A, e) {
if (we.prototype.e.call(this, A), this.r += A.length, this.v) {
var s = this.p.subarray(this.v - 1), i = s.length > 3 ? Og(s) : 4;
if (i > s.length) {
if (!e)
return;
} else this.v > 1 && this.onmember && this.onmember(this.r - s.length);
this.p = s.subarray(i), this.v = 0;
}
we.prototype.c.call(this, e), this.s.f && !this.s.l && !e && (this.v = Qi(this.s.p) + 9, this.s = { i: 0 }, this.o = new cA(0), this.push(new cA(0), e));
}, t;
}(), Wg = typeof TextDecoder < "u" && /* @__PURE__ */ new TextDecoder(), Xg = 0;
try {
Wg.decode(Zg, { stream: !0 }), Xg = 1;
} catch {
}
const Yt = new Float32Array(1), ae = new Uint32Array(Yt.buffer);
function $g(t) {
return Yt[0] = t, ae[0];
}
function jg(t) {
return ae[0] = t, Yt[0];
}
function nt(t) {
Yt[0] = t;
const A = ae[0], e = A >> 31 & 1, s = A >> 23 & 255, i = A & 8388607, n = e << 15;
if (s === 255)
return i !== 0 ? n | 32767 : n | 31744;
const a = s - 127 + 15;
if (a >= 31)
return n | 31744;
if (a <= 0) {
if (a < -10)
return n;
const g = (i | 8388608) >> 1 - a + 13;
return n | g;
}
const r = i >> 13;
return n | a << 10 | r;
}
function DA(t) {
const A = t >> 15 & 1, e = t >> 10 & 31, s = t & 1023;
let i;
if (e === 0)
if (s === 0)
i = A << 31;
else {
let n = s, a = -14;
for (; (n & 1024) === 0; )
n <<= 1, a--;
n &= 1023;
const r = a + 127, g = n << 13;
i = A << 31 | r << 23 | g;
}
else if (e === 31)
s === 0 ? i = A << 31 | 2139095040 : i = A << 31 | 2143289344;
else {
const n = e - 15 + 127, a = s << 13;
i = A << 31 | n << 23 | a;
}
return ae[0] = i, Yt[0];
}
function qA(t) {
return Math.max(0, Math.min(255, Math.round(t * 255)));
}
function Vt(t) {
return Math.max(-127, Math.min(127, Math.round(t * 127)));
}
function Ao(t) {
return t / 255;
}
function to(t) {
return t / 127;
}
class eo {
// 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 s = await this.asyncFetch(A);
for (this.items.push({ key: A, data: s }); this.items.length > this.maxItems; )
this.items.shift();
return s;
}
}
function so(t, A) {
const e = Object.entries(t).map(([s, i]) => [
s,
A(i, s)
]);
return Object.fromEntries(e);
}
function io(t, A) {
const e = Object.entries(t).map(([s, i]) => [s, A(i, s)]).filter(([s, i]) => i !== void 0);
return Object.fromEntries(e);
}
function Ci(t) {
const A = [], e = /* @__PURE__ */ new Set();
function s(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(s) : Object.values(i).forEach(s));
}
return s(t), A;
}
function no(t, A) {
return new Array(t).fill(null).map((e, s) => A(s));
}
class ci {
constructor({
// Allocate a new item with the given args
allocate: A,
// Dispose of an item (optional, if GC is enough)
dispose: e,
// Check if an existing item in the list is valid for the given args,
// allowing you to store heterogeneous items in the list.
valid: s
}) {
this.items = [], this.allocate = A, this.dispose = e, this.valid = s;
}
// Allocate a new item from the free list, first checking if a existing item
// on the freelist is valid for the given args.
alloc(A) {
for (; ; ) {
const e = this.items.pop();
if (!e)
break;
if (this.valid(e, A))
return e;
this.dispose && this.dispose(e);
}
return this.allocate(A);
}
free(A) {
this.items.push(A);
}
disposeAll() {
let A;
for (A = this.items.pop(); A; )
this.dispose && this.dispose(A), A = this.items.pop();
}
}
function fe(t, A, e, s, i, n, a, r, g, I, Q, o, E, C, c, h) {
const l = qA(C), u = qA(c), w = qA(h), d = qA(E), p = Je(
new B.Quaternion(g, I, Q, o)
), y = p & 255, m = p >>> 8 & 255, F = p >>> 16 & 255, D = n === 0 ? 0 : Math.min(
255,
Math.max(
0,
Math.round((Math.log(n) - JA) / _A) + 1
)
), f = a === 0 ? 0 : Math.min(
255,
Math.max(
0,
Math.round((Math.log(a) - JA) / _A) + 1
)
), U = r === 0 ? 0 : Math.min(
255,
Math.max(
0,
Math.round((Math.log(r) - JA) / _A) + 1
)
), S = nt(e), M = nt(s), b = nt(i), N = A * 4;
t[N] = l | u << 8 | w << 16 | d << 24, t[N + 1] = S | M << 16, t[N + 2] = b | y << 16 | m << 24, t[N + 3] = D | f << 8 | U << 16 | F << 24;
}
function ao(t, A, e, s, i) {
const n = nt(e), a = nt(s), r = nt(i), g = A * 4;
t[g + 1] = n | a << 16, t[g + 2] = r | t[g + 2] & 4294901760;
}
function ro(t, A, e, s, i) {
const n = e === 0 ? 0 : Math.min(
255,
Math.max(
0,
Math.round((Math.log(e) - JA) / _A) + 1
)
), a = s === 0 ? 0 : Math.min(
255,
Math.max(
0,
Math.round((Math.log(s) - JA) / _A) + 1
)
), r = i === 0 ? 0 : Math.min(
255,
Math.max(
0,
Math.round((Math.log(i) - JA) / _A) + 1
)
), g = A * 4;
t[g + 3] = n | a << 8 | r << 16 | t[g + 3] & 4278190080;
}
function go(t, A, e, s, i, n) {
const a = Je(
new B.Quaternion(e, s, i, n)
), r = a & 255, g = a >>> 8 & 255, I = a >>> 16 & 255, Q = A * 4;
t[Q + 2] = t[Q + 2] & 65535 | r << 16 | g << 24, t[Q + 3] = t[Q + 3] & 16777215 | I << 24;
}
function oo(t, A, e, s, i) {
const n = qA(e), a = qA(s), r = qA(i), g = A * 4;
t[g] = n | a << 8 | r << 16 | t[g] & 4278190080;
}
function Io(t, A, e) {
const s = qA(e), i = A * 4;
t[i] = t[i] & 16777215 | s << 24;
}
const Bo = new B.Vector3(), Qo = new B.Vector3(), Eo = new B.Quaternion(), Co = new B.Color(), co = {
center: Bo,
scales: Qo,
quaternion: Eo,
color: Co,
opacity: 0
};
function me(t, A) {
const e = co, s = A * 4, i = t[s], n = t[s + 1], a = t[s + 2], r = t[s + 3];
e.color.set(
(i & 255) / 255,
(i >>> 8 & 255) / 255,
(i >>> 16 & 255) / 255
), e.opacity = (i >>> 24 & 255) / 255, e.center.set(
DA(n & 65535),
DA(n >>> 16 & 65535),
DA(a & 65535)
);
const g = r & 255;
e.scales.x = g === 0 ? 0 : Math.exp(JA + (g - 1) * _A);
const I = r >>> 8 & 255;
e.scales.y = I === 0 ? 0 : Math.exp(JA + (I - 1) * _A);
const Q = r >>> 16 & 255;
e.scales.z = Q === 0 ? 0 : Math.exp(JA + (Q - 1) * _A);
const o = a >>> 16 & 65535 | r >>> 8 & 16711680;
return pi(o, e.quaternion), e;
}
function yA(t) {
const A = O, e = Math.max(
ss,
Math.min(XA, Math.ceil(t / A))
), s = Math.ceil(t / (A * e)), i = A * e * s;
return { width: A, height: e, depth: s, maxSplats: i };
}
function ho(t) {
const A = O, e = Math.max(
ss,
Math.min(XA, Math.ceil(t / A))
), s = Math.ceil(t / (A * e));
return A * e * s;
}
function lo() {
return navigator.maxTouchPoints > 0 ? !0 : /Mobi|Android|iPhone|iPad|iPod|Opera Mini|IEMobile/.test(
navigator.userAgent
);
}
function uo() {
return /Android/.test(navigator.userAgent);
}
function wo() {
return /Oculus/.test(navigator.userAgent);
}
function yo(t, A, e) {
const s = new Uint8Array(A * 4);
for (let i = 0; i < e / 2; i++) {
const n = i * A * 4, a = (e - 1 - i) * A * 4;
s.set(t.subarray(n, n + A * 4)), t.set(
t.subarray(a, a + A * 4),
n
), t.set(s, a);
}
return t;
}
function po(t, A, e) {
const s = document.createElement("canvas");
s.width = A, s.height = e;
const i = s.getContext("2d");
if (!i)
throw new Error("Can't get 2d context");
const n = i.createImageData(A, e);
return n.data.set(t), i.putImageData(n, 0, 0), s.toDataURL("image/png");
}
function hi(t) {
const A = new B.Clock(t.autoStart);
return A.startTime = t.startTime, A.oldTime = t.oldTime, A.elapsedTime = t.elapsedTime, A.running = t.running, A;
}
function Do(t) {
return Object.fromEntries(
Object.entries(t).filter(([A, e]) => e !== void 0)
);
}
const li = BA(`
precision highp float;
in vec3 position;
void main() {
gl_Position = vec4(position.xy, 0.0, 1.0);
}
`);
function ui(t) {
const A = new B.Vector3();
for (const e of t)
A.add(e);
return A.divideScalar(t.length);
}
function di(t) {
if (t.length === 0)
return new B.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 wi(t, A) {
const e = new B.Vector3(0, 0, 0).applyMatrix4(t), s = new B.Vector3(0, 0, 0).applyMatrix4(A), i = new B.Vector3(0, 0, -1).applyMatrix4(t).sub(e).normalize(), n = new B.Vector3(0, 0, -1).applyMatrix4(A).sub(s).normalize(), a = e.distanceTo(s), r = i.dot(n);
return { distance: a, coincidence: r };
}
function fo({
matrix1: t,
matrix2: A,
maxDistance: e
}) {
const s = new B.Vector3(0, 0, 0).applyMatrix4(t), i = new B.Vector3(0, 0, 0).applyMatrix4(A);
return s.distanceTo(i) <= e;
}
function mo({
matrix1: t,
matrix2: A,
maxDistance: e,
minCoincidence: s
}) {
const { distance: i, coincidence: n } = wi(t, A);
return i <= e && (s == null || n >= s);
}
function yi(t, A) {
const [e, s] = [new B.Vector3(), new B.Quaternion()], [i, n] = [new B.Vector3(), new B.Quaternion()];
t.decompose(e, s, new B.Vector3()), A.decompose(i, n, new B.Vector3());
const a = e.distanceTo(i), r = Math.abs(s.dot(n));
return { distance: a, coorient: r };
}
function Xt({
matrix1: t,
matrix2: A,
maxDistance: e,
minCoorient: s
}) {
const { distance: i, coorient: n } = yi(t, A);
return i <= e && (s == null || n >= s);
}
function Mo(t, A = 1e-3) {
return Math.abs(t) < A ? 0 : Math.sign(t);
}
function xo(t) {
const A = t.w < 0, e = Vt(A ? -t.x : t.x), s = Vt(A ? -t.y : t.y), i = Vt(A ? -t.z : t.z), n = e & 255, a = s & 255, r = i & 255;
return n | a << 8 | r << 16;
}
function So(t, A) {
const e = t << 24 >> 24, s = t << 16 >> 24, i = t << 8 >> 24;
A.set(e / 127, s / 127, i / 127, 0);
const n = A.x * A.x + A.y * A.y + A.z * A.z;
return A.w = Math.sqrt(Math.max(0, 1 - n)), A;
}
function Je(t) {
const A = t.clone().normalize();
A.w < 0 && A.set(-A.x, -A.y, -A.z, -A.w);
const e = 2 * Math.acos(A.w), s = Math.sqrt(
A.x * A.x + A.y * A.y + A.z * A.z
), i = s < 1e-6 ? new B.Vector3(1, 0, 0) : new B.Vector3(A.x, A.y, A.z).divideScalar(s), n = Math.abs(i.x) + Math.abs(i.y) + Math.abs(i.z);
let a = i.x / n, r = i.y / n;
if (i.z < 0) {
const C = a;
a = (1 - Math.abs(r)) * (a >= 0 ? 1 : -1), r = (1 - Math.abs(C)) * (r >= 0 ? 1 : -1);
}
const g = a * 0.5 + 0.5, I = r * 0.5 + 0.5, Q = Math.round(g * 255), o = Math.round(I * 255);
return Math.round(e * (255 / Math.PI)) << 16 | o << 8 | Q;
}
function pi(t, A) {
const e = t & 255, s = t >>> 8 & 255, i = t >>> 16 & 255, n = e / 255, a = s / 255;
let r = (n - 0.5) * 2, g = (a - 0.5) * 2;
const I = 1 - (Math.abs(r) + Math.abs(g)), Q = Math.max(-I, 0);
r += r >= 0 ? -Q : Q, g += g >= 0 ? -Q : Q;
const o = new B.Vector3(r, g, I).normalize(), C = i / 255 * Math.PI * 0.5, c = Math.sin(C), h = Math.cos(C);
return A.set(o.x * c, o.y * c, o.z * c, h), A;
}
function Fo(t) {
const A = t.clone().normalize(), e = 2 * (A.w * A.x + A.y * A.z), s = 1 - 2 * (A.x * A.x + A.y * A.y), i = Math.atan2(e, s), n = 2 * (A.w * A.y - A.z * A.x), a = Math.abs(n) >= 1 ? Math.sign(n) * (Math.PI / 2) : Math.asin(n), r = 2 * (A.w * A.z + A.x * A.y), g = 1 - 2 * (A.y * A.y + A.z * A.z), I = Math.atan2(r, g), Q = (i + Math.PI) / (2 * Math.PI), o = (a + Math.PI) / (2 * Math.PI), E = (I + Math.PI) / (2 * Math.PI), C = Math.round(Q * 255), c = Math.round(o * 255);
return Math.round(E * 255) << 16 | c << 8 | C;
}
function No(t, A) {
const e = t & 255, s = t >>> 8 & 255, i = t >>> 16 & 255, n = e / 255, a = s / 255, r = i / 255, g = n * (2 * Math.PI) - Math.PI, I = a * (2 * Math.PI) - Math.PI, Q = r * (2 * Math.PI) - Math.PI, o = Math.cos(g * 0.5), E = Math.sin(g * 0.5), C = Math.cos(I * 0.5), c = Math.sin(I * 0.5), h = Math.cos(Q * 0.5), l = Math.sin(Q * 0.5);
return A.w = o * C * h + E * c * l, A.x = E * C * h - o * c * l, A.y = o * c * h + E * C * l, A.z = o * C * l - E * c * h, A.normalize(), A;
}
function Tt(t, A, e, s) {
const i = Math.max(-127, Math.min(127, t * 127)), n = Math.max(-127, Math.min(127, A * 127)), a = Math.max(-127, Math.min(127, e * 127)), r = Math.max(-127, Math.min(127, s * 127));
return i & 255 | (n & 255) << 8 | (a & 255) << 16 | (r & 255) << 24;
}
function ko(t, A, e) {
const s = A * 2;
for (let i = 0; i < 9; ++i) {
const n = Math.max(-63, Math.min(63, e[i] * 63)) & 127, a = i * 7, r = a + 7, g = Math.floor(a / 32), I = a - g * 32, Q = n << I & 4294967295;
if (t[s + g] |= Q, r > g * 32 + 32) {
const o = n >>> 32 - I & 4294967295;
t[s + g + 1] |= o;
}
}
}
function Uo(t, A, e) {
t[A * 4 + 0] = Tt(
e[0],
e[1],
e[2],
e[3]
), t[A * 4 + 1] = Tt(
e[4],
e[5],
e[6],
e[7]
), t[A * 4 + 2] = Tt(
e[8],
e[9],
e[10],
e[11]
), t[A * 4 + 3] = Tt(
e[12],
e[13],
e[14],
0
);
}
function Ro(t, A, e) {
const s = A * 4;
for (let i = 0; i < 21; ++i) {
const n = Math.max(-31, Math.min(31, e[i] * 31)) & 63, a = i * 6, r = a + 6, g = Math.floor(a / 32), I = a - g * 32, Q = n << I & 4294967295;
if (t[s + g] |= Q, r > g * 32 + 32) {
const o = n >>> 32 - I & 4294967295;
t[s + g + 1] |= o;
}
}
}
function Di(t, A) {
const e = [];
let s = 0, i = null;
const n = new Ei((g, I) => {
if (e.push(g), s += g.length, I || s >= A) {
const Q = new Uint8Array(s);
let o = 0;
for (const E of e)
Q.set(E, o), o += E.length;
i = Q.slice(0, A);
}
}), a = 1024;
let r = 0;
for (; i == null && r < t.length; ) {
const g = t.slice(r, r + a);
n.push(g, !1), r += a;
}
if (i == null && (n.push(new Uint8Array(), !0), i == null))
throw new Error("Failed to decompress partial gzip");
return i;
}
class fi {
constructor({
fileBytes: A,
chunkBytes: e = 64 * 1024
}) {
this.fileBytes = A, this.chunkBytes = e, this.offset = 0, this.chunks = [], this.totalBytes = 0, this.gunzip = new Ei((s, i) => {
this.chunks.push(s), this.totalBytes += s.length;
});
}
read(A) {
for (; this.totalBytes < A && this.offset < this.fileBytes.length; ) {
const n = Math.min(
this.offset + this.chunkBytes,
this.fileBytes.length
);
this.gunzip.push(this.fileBytes.subarray(this.offset, n), !1), this.offset = n;
}
if (this.totalBytes < A && this.offset >= this.fileBytes.length && this.gunzip.push(new Uint8Array(0), !0), this.totalBytes < A)
throw new Error(
`Unexpected EOF: needed ${A}, got ${this.totalBytes}`
);
const e = new Uint8Array(this.totalBytes);
let s = 0;
for (const n of this.chunks)
e.set(n, s), s += n.length;
const i = e.subarray(0, A);
return this.chunks = [e.subarray(A)], this.totalBytes -= A, i;
}
}
const FE = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
DataCache: eo,
FreeList: ci,
GunzipReader: fi,
IDENT_VERTEX_SHADER: li,
Sint8ToFloat: to,
Uint8ToFloat: Ao,
averagePositions: ui,
averageQuaternions: di,
cloneClock: hi,
coinciDist: wi,
computeMaxSplats: ho,
coorientDist: yi,
decodeQuatEulerXyz888: No,
decodeQuatOctXy88R8: pi,
decodeQuatXyz888: So,
decompressPartialGzip: Di,
encodeQuatEulerXyz888: Fo,
encodeQuatOctXy88R8: Je,
encodeQuatXyz888: xo,
encodeSh1Rgb: ko,
encodeSh2Rgb: Uo,
encodeSh3Rgb: Ro,
epsilonSign: Mo,
flipPixels: yo,
floatBitsToUint: $g,
floatToSint8: Vt,
floatToUint8: qA,
fromHalf: DA,
getArrayBuffers: Ci,
getTextureSize: yA,
isAndroid: uo,
isMobile: lo,
isOculus: wo,
mapFilterObject: io,
mapObject: so,
newArray: no,
omitUndefined: Do,
pixelsToPngUrl: po,
setPackedSplat: fe,
setPackedSplatCenter: ao,
setPackedSplatOpacity: Io,
setPackedSplatQuat: go,
setPackedSplatRgb: oo,
setPackedSplatScales: ro,
toHalf: nt,
uintBitsToFloat: jg,
unpackSplat: me,
withinCoinciDist: mo,
withinCoorientDist: Xt,
withinDist: fo
}, Symbol.toStringTag, { value: "Module" }));
class Ye {
constructor({
graph: A,
inputs: e,
outputs: s,
template: i
}) {
this.graph = A, this.template = i, this.inputs = e ?? {}, this.outputs = s ?? {};
const n = new Is({ indent: this.template.indent });
for (const r in this.outputs)
this.outputs[r] && n.declares.add(this.outputs[r]);
const a = A.compile({
inputs: this.inputs,
outputs: this.outputs,
compile: n
});
this.shader = i.generate({ globals: n.globals, statements: a }), this.uniforms = n.uniforms, this.updaters = n.updaters;
}
prepareMaterial() {
return Go(this);
}
update() {
for (const A of this.updaters)
A();
}
}
class Te {
constructor(A) {
const e = A.match(/^([ \t]*)\{\{\s*GLOBALS\s*\}\}/m), s = A.match(/^([ \t]*)\{\{\s*STATEMENTS\s*\}\}/m);
if (!e || !s)
throw new Error(
"Template must contain {{ GLOBALS }} and {{ STATEMENTS }}"
);
this.before = A.substring(0, e.index), this.between = A.substring(
e.index + e[0].length,
s.index
), this.after = A.substring(
s.index + s[0].length
), this.indent = s[1];
}
generate({
globals: A,
statements: e
}) {
return this.before + Array.from(A).join(`
`) + this.between + e.map((s) => this.indent + s).join(`
`) + this.after;
}
}
const Pe = /* @__PURE__ */ new Map();
function Go(t) {
let A = Pe.get(t);
return A || (A = new B.RawShaderMaterial({
glslVersion: B.GLSL3,
vertexShader: li,
fragmentShader: t.shader,
uniforms: t.uniforms
}), Pe.set(t, A), A);
}
function He(t, A, e = "add") {
const s = () => {
throw new Error(`Invalid ${e} types: ${t}, ${A}`);
};
if (t === A) return t;
if (t === "int") {
if (hA(A)) return A;
s();
}
if (A === "int") {
if (hA(t)) return t;
s();
}
if (t === "uint") {
if (lA(A)) return A;
s();
}
if (A === "uint") {
if (lA(t)) return t;
s();
}
if (t === "float") {
if (jA(A)) return A;
s();
}
if (A === "float") {
if (jA(t)) return t;
s();
}
throw new Error(`Invalid ${e} types: ${t}, ${A}`);
}
function bo(t, A) {
return He(t, A, "sub");
}
function vo(t, A) {
const e = () => {
throw new Error(`Invalid mul types: ${t}, ${A}`);
}, s = (i) => i;
if (t === "int") {
if (hA(A)) return s(A);
e();
}
if (A === "int") {
if (hA(t)) return s(t);
e();
}
if (t === "uint") {
if (lA(A)) return s(A);
e();
}
if (A === "uint") {
if (lA(t)) return s(t);
e();
}
if (t === "float") {
if (jA(A)) return s(A);
e();
}
if (A === "float") {
if (jA(t)) return s(t);
e();
}
if (hA(t) || lA(t) || hA(A) || lA(A)) {
if (t === A) return s(t);
e();
}
if (t === "vec2") {
if (A === "vec2" || tt(A)) return s("vec2");
if (A === "mat3x2") return s("vec3");
if (A === "mat4x2") return s("vec4");
e();
}
if (t === "vec3") {
if (A === "mat2x3") return s("vec2");
if (A === "vec3" || et(A)) return s("vec3");
if (A === "mat4x3") return s("vec4");
e();
}
if (t === "vec4") {
if (A === "mat2x4") return s("vec2");
if (A === "mat3x4") return s("vec3");
if (A === "vec4" || st(A)) return s("vec4");
e();
}
if (A === "vec2") {
if (tt(t)) return s("vec2");
if (t === "mat2x3") return s("vec3");
if (t === "mat2x4") return s("vec4");
e();
}
if (A === "vec3") {
if (t === "mat3x2") return s("vec2");
if (et(t)) return s("vec3");
if (t === "mat3x4") return s("vec4");
e();
}
if (A === "vec4") {
if (t === "mat4x2") return s("vec2");
if (t === "mat4x3") return s("vec3");
if (st(t)) return s("vec4");
e();
}
if (tt(t)) {
if (tt(A)) return s("mat2");
if (A === "mat3x2") return s("mat3x2");
if (A === "mat4x2") return s("mat4x2");
e();
}
if (t === "mat2x3") {
if (tt(A)) return s("mat2x3");
if (A === "mat3x2") return s("mat3");
if (A === "mat4x2") return s("mat4x3");
e();
}
if (t === "mat2x4") {
if (tt(A)) return s("mat2x4");
if (A === "mat3x2") return s("mat3x4");
if (A === "mat4x2") return s("mat4");
e();
}
if (t === "mat3x2") {
if (A === "mat2x3") return s("mat2");
if (et(A)) return s("mat3x2");
if (A === "mat4x3") return s("mat4x2");
e();
}
if (et(t)) {
if (A === "mat2x3") return s("mat2x3");
if (et(A)) return s("mat3");
if (A === "mat4x3") return s("mat4x3");
e();
}
if (t === "mat3x4") {
if (A === "mat2x3") return s("mat2x4");
if (et(A)) return s("mat3x4");
if (A === "mat4x3") return s("mat4");
e();
}
if (t === "mat4x2") {
if (A === "mat2x4") return s("mat2");
if (A === "mat3x4") return s("mat3x2");
if (st(A)) return s("mat4x2");
e();
}
if (t === "mat4x3") {
if (A === "mat2x4") return s("mat2x3");
if (A === "mat3x4") return s("mat3");
if (st(A)) return s("mat4x3");
e();
}
if (st(t)) {
if (A === "mat2x4") return s("mat2x4");
if (A === "mat3x4") return s("mat3x4");
if (st(A)) return s("mat4");
e();
}
throw new Error(`Invalid mul types: ${t}, ${A}`);
}
function Lo(t, A) {
return He(t, A, "div");
}
function Jo(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 Yo(t, A) {
if (t === A || A === "float") return t;
throw new Error(`Invalid mod types: ${t}, ${A}`);
}
function To(t) {
return t;
}
function Ho(t) {
return t;
}
function Ko(t) {
return t;
}
function qo(t) {
return t;
}
function zo(t) {
return t;
}
function _o(t) {
return t;
}
function Vo(t) {
return t;
}
function Po(t) {
return t;
}
function Zo(t) {
return t;
}
function Oo(t) {
return t;
}
function Wo(t) {
return t;
}
function Xo(t) {
return t;
}
function $o(t) {
return t;
}
function jo(t) {
return t;
}
function AI(t) {
return t;
}
function tI(t) {
return t;
}
function mi(t, A, e = "min") {
if (t === A) return t;
if (A === "float") {
if (Rt(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 eI(t, A) {
return mi(t, A, "max");
}
function sI(t, A, e) {
if (A === "float") {
if (Rt(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 iI(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 nI(t, A) {
if (t === A || A === "float") return A;
throw new Error(`Invalid step types: ${t}, ${A}`);
}
function aI(t, A, e) {
if (t === A && (t === e || t === "float"))
return e;
throw new Error(`Invalid smoothstep types: ${t}, ${A}, ${e}`);
}
function Mi(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 rI(t) {
return Mi(t, "isInf");
}
const fA = (t, A) => new Ni({ a: t, b: A }), Ut = (t, A) => new ki({ a: t, b: A }), CA = (t, A) => new Ui({ a: t, b: A }), Pt = (t, A) => new Ri({ a: t, b: A }), Me = (t, A) => new Gi({ a: t, b: A }), xi = (t, A) => new bi({ a: t, b: A }), gI = (t) => new vi({ a: t }).outputs, oI = (t) => new Li({ a: t }), II = (t) => new Ji({ a: t }), BI = (t) => new Yi({ a: t }), QI = (t) => new Ti({ a: t }), EI = (t) => new Hi({ a: t }), CI = (t) => new Ki({ a: t }), cI = (t) => new qi({ a: t }), Zt = (t) => new zi({ a: t }), hI = (t, A) => new _i({ a: t, b: A }), lI = (t) => new Vi({ a: t }), uI = (t) => new Pi({ a: t }), dI = (t) => new Zi({ a: t }), wI = (t) => new Oi({ a: t }), yI = (t) => new Wi({ a: t }), pI = (t) => new Xi({ a: t }), DI = (t) => new $i({ a: t }), fI = (t, A) => new ji({ a: t, b: A }), Si = (t, A) => new An({ a: t, b: A }), mI = (t, A, e) => new tn({ a: t, min: A, max: e }), Fi = (t, A, e) => new en({ a: t, b: A, t: e }), MI = (t, A) => new sn({ edge: t, x: A }), xI = (t, A, e) => new nn({ edge0: t, edge1: A, x: e }), SI = (t) => new an({ a: t }), FI = (t) => new rn({ a: t });
class Ni extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "sum", outTypeFunc: He }), this.statements = ({ inputs: s, outputs: i }) => [`${i.sum} = ${s.a} + ${s.b};`];
}
}
class ki extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "difference", outTypeFunc: bo }), this.statements = ({ inputs: s, outputs: i }) => [`${i.difference} = ${s.a} - ${s.b};`];
}
}
class Ui extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "product", outTypeFunc: vo }), this.statements = ({ inputs: s, outputs: i }) => [`${i.product} = ${s.a} * ${s.b};`];
}
}
class Ri extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "quotient", outTypeFunc: Lo }), this.statements = ({ inputs: s, outputs: i }) => [`${i.quotient} = ${s.a} / ${s.b};`];
}
}
class Gi extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "remainder", outTypeFunc: Jo }), this.statements = ({ inputs: s, outputs: i }) => [`${i.remainder} = ${s.a} % ${s.b};`];
}
}
class bi extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "remainder", outTypeFunc: Yo }), this.statements = ({ inputs: s, outputs: i }) => [`${i.remainder} = mod(${s.a}, ${s.b});`];
}
}
class vi extends V {
constructor({ a: A }) {
const e = { a: q(A) }, s = e.a, i = {
fract: s,
integer: s
};
super({ inTypes: e, outTypes: i, inputs: { a: A } }), this.statements = ({ inputs: n, outputs: a }) => [`${a.fract} = modf(${n.a}, ${a.integer});`];
}
}
class Li extends x {
constructor({ a: A }) {
super({ a: A, outKey: "neg", outTypeFunc: To }), this.statements = ({ inputs: e, outputs: s }) => [`${s.neg} = -${e.a};`];
}
}
class Ji extends x {
constructor({ a: A }) {
super({ a: A, outKey: "abs", outTypeFunc: Ho }), this.statements = ({ inputs: e, outputs: s }) => [`${s.abs} = abs(${e.a});`];
}
}
class Yi extends x {
constructor({ a: A }) {
super({ a: A, outKey: "sign", outTypeFunc: Ko }), this.statements = ({ inputs: e, outputs: s }) => [`${s.sign} = sign(${e.a});`];
}
}
class Ti extends x {
constructor({ a: A }) {
super({ a: A, outKey: "floor", outTypeFunc: qo }), this.statements = ({ inputs: e, outputs: s }) => [`${s.floor} = floor(${e.a});`];
}
}
class Hi extends x {
constructor({ a: A }) {
super({ a: A, outKey: "ceil", outTypeFunc: zo }), this.statements = ({ inputs: e, outputs: s }) => [`${s.ceil} = ceil(${e.a});`];
}
}
class Ki extends x {
constructor({ a: A }) {
super({ a: A, outKey: "trunc", outTypeFunc: _o }), this.statements = ({ inputs: e, outputs: s }) => [`${s.trunc} = trunc(${e.a});`];
}
}
class qi extends x {
constructor({ a: A }) {
super({ a: A, outKey: "round", outTypeFunc: Vo }), this.statements = ({ inputs: e, outputs: s }) => [`${s.round} = round(${e.a});`];
}
}
class zi extends x {
constructor({ a: A }) {
super({ a: A, outKey: "fract", outTypeFunc: Po }), this.statements = ({ inputs: e, outputs: s }) => [`${s.fract} = fract(${e.a});`];
}
}
class _i extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "power", outTypeFunc: Zo }), this.statements = ({ inputs: s, outputs: i }) => [`${i.power} = pow(${s.a}, ${s.b});`];
}
}
class Vi extends x {
constructor({ a: A }) {
super({ a: A, outKey: "exp", outTypeFunc: Oo }), this.statements = ({ inputs: e, outputs: s }) => [`${s.exp} = exp(${e.a});`];
}
}
class Pi extends x {
constructor({ a: A }) {
super({ a: A, outKey: "exp2", outTypeFunc: Wo }), this.statements = ({ inputs: e, outputs: s }) => [`${s.exp2} = exp2(${e.a});`];
}
}
class Zi extends x {
constructor({ a: A }) {
super({ a: A, outKey: "log", outTypeFunc: Xo }), this.statements = ({ inputs: e, outputs: s }) => [`${s.log} = log(${e.a});`];
}
}
class Oi extends x {
constructor({ a: A }) {
super({ a: A, outKey: "log2", outTypeFunc: $o }), this.statements = ({ inputs: e, outputs: s }) => [`${s.log2} = log2(${e.a});`];
}
}
class Wi extends x {
constructor({ a: A }) {
super({ a: A, outKey: "sqr", outTypeFunc: jo }), this.statements = ({ inputs: e, outputs: s }) => [`${s.sqr} = ${e.a} * ${e.a};`];
}
}
class Xi extends x {
constructor({ a: A }) {
super({ a: A, outKey: "sqrt", outTypeFunc: AI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.sqrt} = sqrt(${e.a});`];
}
}
class $i extends x {
constructor({ a: A }) {
super({ a: A, outKey: "inversesqrt", outTypeFunc: tI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.inversesqrt} = inversesqrt(${e.a});`];
}
}
class ji extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "min", outTypeFunc: mi }), this.statements = ({ inputs: s, outputs: i }) => [`${i.min} = min(${s.a}, ${s.b});`];
}
}
class An extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "max", outTypeFunc: eI }), this.statements = ({ inputs: s, outputs: i }) => [`${i.max} = max(${s.a}, ${s.b});`];
}
}
class tn extends ot {
constructor({
a: A,
min: e,
max: s
}) {
super({
a: A,
b: e,
c: s,
outKey: "clamp",
outTypeFunc: sI
}), this.statements = ({ inputs: i, outputs: n }) => {
const { a, b: r, c: g } = i;
return [`${n.clamp} = clamp(${a}, ${r}, ${g});`];
};
}
}
class en extends ot {
constructor({ a: A, b: e, t: s }) {
super({ a: A, b: e, c: s, outKey: "mix", outTypeFunc: iI }), this.statements = ({ inputs: i, outputs: n }) => {
const { a, b: r, c: g } = i;
return [`${n.mix} = mix(${a}, ${r}, ${g});`];
};
}
}
class sn extends W {
constructor({ edge: A, x: e }) {
super({
a: A,
b: e,
outKey: "step",
outTypeFunc: nI
}), this.statements = ({ inputs: s, outputs: i }) => {
const { a: n, b: a } = s;
return [`${i.step} = step(${n}, ${a});`];
};
}
}
class nn extends ot {
constructor({
edge0: A,
edge1: e,
x: s
}) {
super({
a: A,
b: e,
c: s,
outKey: "smoothstep",
outTypeFunc: aI
}), this.statements = ({ inputs: i, outputs: n }) => {
const { a, b: r, c: g } = i;
return [`${n.smoothstep} = smoothstep(${a}, ${r}, ${g});`];
};
}
}
class an extends x {
constructor({ a: A }) {
super({ a: A, outKey: "isNan", outTypeFunc: Mi }), this.statements = ({ inputs: e, outputs: s }) => [`${s.isNan} = isNan(${e.a});`];
}
}
class rn extends x {
constructor({ a: A }) {
super({ a: A, outKey: "isInf", outTypeFunc: rI }), this.statements = ({ inputs: e, outputs: s }) => [`${s.isInf} = isInf(${e.a});`];
}
}
const NI = (t, A) => new gn({ a: t, b: A }), kI = (t, A) => new on({ a: t, b: A }), UI = (t, A) => new In({ a: t, b: A }), RI = (t) => new Bn({ a: t }), GI = (t, A) => new Qn({ a: t, b: A }), bI = (t, A) => new En({ a: t, b: A }), vI = (t, A) => new Cn({ a: t, b: A }), LI = (t, A) => new cn({ a: t, b: A }), JI = (t, A) => new hn({ a: t, b: A }), YI = (t, A) => new ln({ a: t, b: A }), TI = (t) => new un({ a: t }), HI = (t) => new dn({ a: t }), KI = (t, A, e) => new wn({ cond: t, t: A, f: e }), qI = (t) => new pn({ a: t });
class gn extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outTypeFunc: (s, i) => s, outKey: "and" }), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.and === "bool" ? [`${i.and} = ${s.a} && ${s.b};`] : [`${i.and} = ${s.a} & ${s.b};`];
}
}
class on extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outTypeFunc: (s, i) => s, outKey: "or" }), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.or === "bool" ? [`${i.or} = ${s.a} || ${s.b};`] : [`${i.or} = ${s.a} | ${s.b};`];
}
}
class In extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outTypeFunc: (s, i) => s, outKey: "xor" }), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.xor === "bool" ? [`${i.xor} = ${s.a} ^^ ${s.b};`] : [`${i.xor} = ${s.a} ^ ${s.b};`];
}
}
class Bn extends x {
constructor({ a: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "not" }), this.statements = ({ inputs: e, outputs: s }) => this.outTypes.not === "bool" ? [`${s.not} = !${e.a};`] : [`${s.not} = not(${e.a});`];
}
}
class Qn extends W {
constructor({ a: A, b: e }) {
super({
a: A,
b: e,
outTypeFunc: (s, i) => re(s, "lessThan"),
outKey: "lessThan"
}), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.lessThan === "bool" ? [`${i.lessThan} = ${s.a} < ${s.b};`] : [`${i.lessThan} = lessThan(${s.a}, ${s.b});`];
}
}
class En extends W {
constructor({ a: A, b: e }) {
super({
a: A,
b: e,
outTypeFunc: (s, i) => re(s, "lessThanEqual"),
outKey: "lessThanEqual"
}), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.lessThanEqual === "bool" ? [`${i.lessThanEqual} = ${s.a} <= ${s.b};`] : [
`${i.lessThanEqual} = lessThanEqual(${s.a}, ${s.b});`
];
}
}
class Cn extends W {
constructor({ a: A, b: e }) {
super({
a: A,
b: e,
outTypeFunc: (s, i) => re(s, "greaterThan"),
outKey: "greaterThan"
}), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.greaterThan === "bool" ? [`${i.greaterThan} = ${s.a} > ${s.b};`] : [
`${i.greaterThan} = greaterThan(${s.a}, ${s.b});`
];
}
}
class cn extends W {
constructor({ a: A, b: e }) {
super({
a: A,
b: e,
outTypeFunc: (s, i) => re(s, "greaterThanEqual"),
outKey: "greaterThanEqual"
}), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.greaterThanEqual === "bool" ? [`${i.greaterThanEqual} = ${s.a} >= ${s.b};`] : [
`${i.greaterThanEqual} = greaterThanEqual(${s.a}, ${s.b});`
];
}
}
class hn extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outTypeFunc: yn, outKey: "equal" }), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.equal === "bool" ? [`${i.equal} = ${s.a} == ${s.b};`] : [`${i.equal} = equal(${s.a}, ${s.b});`];
}
}
class ln extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outTypeFunc: zI, outKey: "notEqual" }), this.statements = ({ inputs: s, outputs: i }) => this.outTypes.notEqual === "bool" ? [`${i.notEqual} = ${s.a} != ${s.b};`] : [`${i.notEqual} = notEqual(${s.a}, ${s.b});`];
}
}
class un extends x {
constructor({ a: A }) {
super({ a: A, outTypeFunc: (e) => "bool", outKey: "any" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.any} = any(${e.a});`];
}
}
class dn extends x {
constructor({ a: A }) {
super({ a: A, outTypeFunc: (e) => "bool", outKey: "all" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.all} = all(${e.a});`];
}
}
class wn extends ot {
constructor({
cond: A,
t: e,
f: s
}) {
super({
a: A,
b: e,
c: s,
outKey: "select",
outTypeFunc: (i, n, a) => n
}), this.statements = ({ inputs: i, outputs: n }) => {
const { a, b: r, c: g } = i;
return [`${n.select} = (${a}) ? (${r}) : (${g});`];
};
}
}
function re(t, A) {
if (gt(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 yn(t, A = "equal") {
if (gt(t))
return "bool";
if (rt(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 zI(t) {
return yn(t, "notEqual");
}
function _I(t) {
if (rt(t))
return "bool";
if (hA(t))
return "int";
if (lA(t))
return "uint";
throw new Error(`Invalid compXor type: ${t}`);
}
class pn extends x {
constructor({ a: A }) {
const e = _I(q(A));
super({ a: A, outTypeFunc: (s) => e, outKey: "compXor" }), this.statements = ({ inputs: s, outputs: i }) => {
if (gt(this.outTypes.compXor))
return [`${i.compXor} = ${s.a};`];
const a = (ut(e) ? ["x", "y"] : dt(e) ? ["x", "y", "z"] : ["x", "y", "z", "w"]).map((g) => `${s.a}.${g}`), r = rt(e) ? "^^" : "^";
return [`${i.compXor} = ${a.join(` ${r} `)};`];
};
}
}
const VI = (t) => new Fn({ value: t }), PI = (t) => new Nn({ value: t }), ZI = (t) => new kn({ value: t }), Dn = (t) => new Un({ value: t }), OI = (t) => new Rn({ value: t }), WI = (t) => new Gn({ value: t }), XI = (t) => new bn({ value: t }), $I = (t) => new vn({ value: t }), jI = (t) => new Ln({ value: t }), AB = (t) => new Jn({ value: t }), tB = (t) => new Yn({ value: t }), eB = (t) => new Tn({ value: t }), sB = (t) => new Hn({ value: t }), fn = (t) => new Kn({ value: t }), at = (t) => new qn({ value: t }), mn = (t) => new zn({ value: t }), iB = (t) => new _n({ value: t }), nB = (t) => new Vn({ value: t }), aB = (t) => new Pn({ value: t }), Mn = (t) => new Zn({ value: t }), rB = (t) => new On({ value: t }), gB = (t) => new Wn({ value: t }), oB = (t) => new Xn({ value: t }), IB = (t) => new $n({ value: t }), BB = (t) => new jn({ value: t }), QB = (t) => new Aa({ value: t }), EB = (t) => new ta({ value: t }), xn = (t) => new ea({ value: t }), CB = (t) => new sa({ value: t }), Sn = (t) => new ia({ value: t });
class rA extends x {
constructor({
value: A,
outType: e,
outKey: s
}) {
super({ a: A, outTypeFunc: () => e, outKey: s }), this.statements = ({ inputs: i, outputs: n }) => [
`${n[s]} = ${gs(e)}(${i.a});`
];
}
}
class Fn extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "bool", outKey: "bool" });
}
}
class Nn extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "int", outKey: "int" });
}
}
class kn extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "uint", outKey: "uint" });
}
}
class Un extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "float", outKey: "float" });
}
}
class Rn extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "bvec2", outKey: "bvec2" });
}
}
class Gn extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "bvec3", outKey: "bvec3" });
}
}
class bn extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "bvec4", outKey: "bvec4" });
}
}
class vn extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "ivec2", outKey: "ivec2" });
}
}
class Ln extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "ivec3", outKey: "ivec3" });
}
}
class Jn extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "ivec4", outKey: "ivec4" });
}
}
class Yn extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "uvec2", outKey: "uvec2" });
}
}
class Tn extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "uvec3", outKey: "uvec3" });
}
}
class Hn extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "uvec4", outKey: "uvec4" });
}
}
class Kn extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "vec2", outKey: "vec2" });
}
}
class qn extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "vec3", outKey: "vec3" });
}
}
class zn extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "vec4", outKey: "vec4" });
}
}
class _n extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "mat2", outKey: "mat2" });
}
}
class Vn extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "mat3", outKey: "mat3" });
}
}
class Pn extends rA {
constructor({
value: A
}) {
super({ value: A, outType: "mat4", outKey: "mat4" });
}
}
class Zn extends x {
constructor({ value: A }) {
super({ a: A, outKey: "int", outTypeFunc: () => "int" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.int} = floatBitsToInt(${e.a});`];
}
}
class On extends x {
constructor({ value: A }) {
super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.uint} = floatBitsToUint(${e.a});`];
}
}
class Wn extends x {
constructor({ value: A }) {
super({ a: A, outKey: "float", outTypeFunc: () => "float" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.float} = intBitsToFloat(${e.a});`];
}
}
class Xn extends x {
constructor({ value: A }) {
super({ a: A, outKey: "float", outTypeFunc: () => "float" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.float} = uintBitsToFloat(${e.a});`];
}
}
class $n extends x {
constructor({ value: A }) {
super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.uint} = packSnorm2x16(${e.a});`];
}
}
class jn extends x {
constructor({ value: A }) {
super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.vec2} = unpackSnorm2x16(${e.a});`];
}
}
class Aa extends x {
constructor({ value: A }) {
super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.uint} = packUnorm2x16(${e.a});`];
}
}
class ta extends x {
constructor({ value: A }) {
super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.vec2} = unpackUnorm2x16(${e.a});`];
}
}
class ea extends x {
constructor({ value: A }) {
super({ a: A, outKey: "uint", outTypeFunc: () => "uint" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.uint} = packHalf2x16(${e.a});`];
}
}
class sa extends x {
constructor({ value: A }) {
super({ a: A, outKey: "vec2", outTypeFunc: () => "vec2" }), this.statements = ({ inputs: e, outputs: s }) => [`${s.vec2} = unpackHalf2x16(${e.a});`];
}
}
class ia extends x {
constructor({ value: A }) {
super({ a: A, outKey: "rgba8", outTypeFunc: () => "vec4" }), this.statements = ({ inputs: e, outputs: s }) => [
`uvec4 uRgba = uvec4(${e.a} & 0xffu, (${e.a} >> 8u) & 0xffu, (${e.a} >> 16u) & 0xffu, (${e.a} >> 24u) & 0xffu);`,
`${s.rgba8} = vec4(uRgba) / 255.0;`
];
}
}
const cB = (t) => new ra({ a: t }), hB = (t, A) => new ga({ a: t, b: A }), lB = (t, A) => new oa({ a: t, b: A }), uB = (t, A) => new Ia({ a: t, b: A }), na = (t) => new Ba({ a: t }), dB = (t, A, e) => new Ca({ a: t, b: A, c: e }), wB = (t, A) => new ca({ incident: t, normal: A }), yB = (t, A, e) => new ha({ incident: t, normal: A, eta: e }), St = (t) => new pa({ vector: t }), YA = ({
vector: t,
vectorType: A,
x: e,
y: s,
z: i,
w: n,
r: a,
g: r,
b: g,
a: I
}) => new Da({ vector: t, vectorType: A, x: e, y: s, z: i, w: n, r: a, g: r, b: g, a: I }), pB = (t) => new Qa({ a: t }), aa = (t, A) => new Ea({ a: t, b: A }), DB = (t, A) => new fa({ vector: t, select: A }), fB = (t, A) => new la({ a: t, b: A }), mB = (t, A) => new ua({ a: t, b: A }), MB = (t) => new da({ a: t }), xB = (t) => new wa({ a: t }), SB = (t) => new ya({ a: t });
class ra extends x {
constructor({ a: A }) {
super({ a: A, outTypeFunc: (e) => "float", outKey: "length" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.length} = length(${e.a});`
];
}
}
class ga extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "distance", outTypeFunc: (s, i) => "float" }), this.statements = ({ inputs: s, outputs: i }) => [
`${i.distance} = distance(${s.a}, ${s.b});`
];
}
}
class oa extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "dot", outTypeFunc: (s, i) => "float" }), this.statements = ({ inputs: s, outputs: i }) => [
`${i.dot} = dot(${s.a}, ${s.b});`
];
}
}
class Ia extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "cross", outTypeFunc: (s, i) => "vec3" }), this.statements = ({ inputs: s, outputs: i }) => [
`${i.cross} = cross(${s.a}, ${s.b});`
];
}
}
class Ba extends x {
constructor({ a: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "normalize" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.normalize} = normalize(${e.a});`
];
}
}
function FB(t) {
if (t === "vec3")
return "vec2";
if (t === "vec4")
return "vec3";
throw new Error("Invalid type");
}
class Qa extends x {
constructor({ a: A }) {
super({
a: A,
outTypeFunc: (e) => FB(e),
outKey: "projected"
}), this.statements = ({ inputs: e, outputs: s }) => {
if (this.inTypes.a === "vec3")
return [`${s.projected} = ${e.a}.xy / ${e.a}.z;`];
if (this.inTypes.a === "vec4")
return [`${s.projected} = ${e.a}.xyz / ${e.a}.w;`];
throw new Error("Invalid type");
};
}
}
function NB(t) {
if (t === "float") return "vec2";
if (t === "vec2") return "vec3";
if (t === "vec3") return "vec4";
throw new Error("Invalid type");
}
class Ea extends W {
constructor({ a: A, b: e }) {
const s = q(A), i = NB(s);
super({ a: A, b: e, outKey: "extend", outTypeFunc: () => i }), this.statements = ({ inputs: n, outputs: a }) => [
`${a.extend} = ${i}(${n.a}, ${n.b});`
];
}
}
class Ca extends ot {
constructor({ a: A, b: e, c: s }) {
super({
a: A,
b: e,
c: s,
outKey: "forward",
outTypeFunc: (i, n, a) => i
}), this.statements = ({ inputs: i, outputs: n }) => [
`${n.forward} = faceforward(${i.a}, ${i.b}, ${i.c});`
];
}
}
class ca extends W {
constructor({
incident: A,
normal: e
}) {
super({
a: A,
b: e,
outKey: "reflection",
outTypeFunc: (s, i) => s
}), this.statements = ({ inputs: s, outputs: i }) => [
`${i.reflection} = reflect(${s.a}, ${s.b});`
];
}
}
class ha extends ot {
constructor({
incident: A,
normal: e,
eta: s
}) {
super({
a: A,
b: e,
c: s,
outKey: "refraction",
outTypeFunc: (i, n, a) => i
}), this.statements = ({ inputs: i, outputs: n }) => [
`${n.refraction} = refract(${i.a}, ${i.b}, ${i.c});`
];
}
}
class la extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "product", outTypeFunc: (s, i) => s }), this.statements = ({ inputs: s, outputs: i }) => [
`${i.product} = matrixCompMult(${A}, ${e});`
];
}
}
function kB(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 ua extends W {
constructor({ a: A, b: e }) {
super({ a: A, b: e, outKey: "outer", outTypeFunc: kB }), this.statements = ({ inputs: s, outputs: i }) => [
`${i.outer} = outerProduct(${s.a}, ${s.b});`
];
}
}
function UB(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 da extends x {
constructor({ a: A }) {
super({ a: A, outKey: "transpose", outTypeFunc: UB }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.transpose} = transpose(${e.a});`
];
}
}
class wa extends x {
constructor({ a: A }) {
super({ a: A, outKey: "det", outTypeFunc: (e) => "float" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.det} = determinant(${e.a});`
];
}
}
class ya extends x {
constructor({ a: A }) {
super({ a: A, outKey: "inverse", outTypeFunc: (e) => e }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.inverse} = inverse(${A});`
];
}
}
function RB(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 pa extends V {
constructor({ vector: A }) {
const s = { vector: q(A) }, i = RB(s.vector);
super({ inTypes: s, outTypes: i, inputs: { vector: A } }), this.statements = ({ inputs: n, outputs: a }) => {
const { x: r, y: g, z: I, w: Q, r: o, g: E, b: C, a: c } = a, { vector: h } = n;
return [
r ? `${r} = ${h}.x;` : null,
g ? `${g} = ${h}.y;` : null,
I ? `${I} = ${h}.z;` : null,
Q ? `${Q} = ${h}.w;` : null,
o ? `${o} = ${h}.r;` : null,
E ? `${E} = ${h}.g;` : null,
C ? `${C} = ${h}.b;` : null,
c ? `${c} = ${h}.a;` : null
].filter(Boolean);
};
}
}
class Da extends V {
constructor({
vector: A,
vectorType: e,
x: s,
y: i,
z: n,
w: a,
r,
g,
b: I,
a: Q
}) {
if (!A && !e)
throw new Error("Either vector or vectorType must be provided");
const o = e ?? q(A), E = ns(o), C = as(o), c = {
vector: o,
x: E,
y: E,
r: E,
g: E
}, h = { vector: A, x: s, y: i, r, g };
C >= 3 && (Object.assign(c, { z: E, b: E }), Object.assign(h, { z: n, b: I })), C >= 4 && (Object.assign(c, { w: E, a: E }), Object.assign(h, { w: a, a: Q })), super({ inTypes: c, outTypes: { vector: o }, inputs: h }), this.statements = ({ inputs: l, outputs: u }) => {
const { vector: w } = u, {
vector: d,
x: p,
y,
z: m,
w: F,
r: D,
g: f,
b: U,
a: S
} = l, M = [
`${w}.x = ${p ?? D ?? (d ? `${d}.x` : pt(E))};`,
`${w}.y = ${y ?? f ?? (d ? `${d}.y` : pt(E))};`
];
return C >= 3 && M.push(
`${w}.z = ${m ?? U ?? (d ? `${d}.z` : pt(E))};`
), C >= 4 && M.push(
`${w}.w = ${F ?? S ?? (d ? `${d}.w` : pt(E))};`
), M;
};
}
dynoOut() {
return new z(
this,
"vector"
);
}
}
function GB(t, A) {
let e = null;
if (Rt(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 fa extends x {
constructor({ vector: A, select: e }) {
super({
a: A,
outKey: "swizzle",
outTypeFunc: (s) => GB(s, e)
}), this.statements = ({ inputs: s, outputs: i }) => [
`${i.swizzle} = ${s.a}.${e};`
];
}
}
const bB = (t, A, e) => new Na({ index: t, from: A, to: e }), vB = (t) => new wt({ value: t }), LB = (t) => new SA({ state: t }), JB = (t) => new FA({ state: t }), ma = (t) => new ka({ value: t }), Ma = (t) => new Ua({ value: t }), xa = (t) => new Ra({ value: t }), Sa = (t) => new Ga({ value: t }), YB = (t) => new ba({ value: t }), TB = (t) => new va({ value: t }), Fa = (t) => new La({ value: t }), xe = (t) => new Ja({ value: t });
class Na extends V {
constructor({
from: A,
to: e,
index: s
}) {
super({
inTypes: { from: "int", to: "int", index: "int" },
outTypes: { index: "int" },
inputs: { from: A, to: e, index: s },
statements: ({ inputs: i, outputs: n }) => [
`${n.index} = ${i.index} - ${i.from} + ${i.to};`
]
});
}
dynoOut() {
return new z(this, "index");
}
}
class SA extends V {
constructor({ state: A }) {
const e = q(A);
super({
inTypes: { state: e },
outTypes: { state: "uint" },
inputs: { state: A },
globals: () => [
BA(`
uint pcg_next(uint state) {
return state * 747796405u + 2891336453u;
}
`)
],
statements: ({ inputs: s, outputs: i }) => {
const n = e === "uint" ? `${s.state}` : e === "int" ? `uint(${s.state})` : `floatBitsToUint(${s.state})`;
return [`${i.state} = pcg_next(${n});`];
}
});
}
dynoOut() {
return new z(this, "state");
}
}
class FA extends V {
constructor({ state: A }) {
super({
inTypes: { state: "uint" },
outTypes: { hash: "uint" },
inputs: { state: A },
globals: () => [
BA(`
uint pcg_hash(uint state) {
uint hash = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;
return (hash >> 22u) ^ hash;
}
`)
],
statements: ({ inputs: e, outputs: s }) => [
`${s.hash} = pcg_hash(${e.state});`
]
});
}
dynoOut() {
return new z(this, "hash");
}
}
class wt extends V {
constructor({ value: A }) {
const e = q(A), s = rs(e);
super({
inTypes: { value: e },
outTypes: { state: "uint" },
inputs: { value: A },
globals: () => [
BA(`
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: n }) => {
const a = lA(e) ? `${i.value}` : hA(e) ? `${s}(${i.value})` : `floatBitsToUint(${i.value})`;
return [
`${s} bits = ${a};`,
`${n.state} = pcg_mix(bits);`
];
}
});
}
dynoOut() {
return new z(this, "state");
}
}
class ka extends HA {
constructor({ value: A }) {
super({
inTypes: { value: q(A) },
outTypes: { hash: "uint" },
inputs: { value: A },
construct: ({ value: e }) => {
if (!e)
throw new Error("value is required");
let s = new wt({ value: e }).outputs.state;
return s = new SA({ state: s }).outputs.state, new FA({ state: s }).outputs;
}
});
}
dynoOut() {
return new z(this, "hash");
}
}
class Ua extends HA {
constructor({ value: A }) {
super({
inTypes: { value: q(A) },
outTypes: { hash: "uvec2" },
inputs: { value: A },
construct: ({ value: e }) => {
if (!e)
throw new Error("value is required");
let s = new wt({ value: e }).outputs.state;
s = new SA({ state: s }).outputs.state;
const i = new FA({ state: s }).outputs.hash;
s = new SA({ state: s }).outputs.state;
const n = new FA({ state: s }).outputs.hash;
return { hash: YA({ vectorType: "uvec2", x: i, y: n }) };
}
});
}
dynoOut() {
return new z(this, "hash");
}
}
class Ra extends HA {
constructor({ value: A }) {
super({
inTypes: { value: q(A) },
outTypes: { hash: "uvec3" },
inputs: { value: A },
construct: ({ value: e }) => {
if (!e)
throw new Error("value is required");
let s = new wt({ value: e }).outputs.state;
s = new SA({ state: s }).outputs.state;
const i = new FA({ state: s }).outputs.hash;
s = new SA({ state: s }).outputs.state;
const n = new FA({ state: s }).outputs.hash;
s = new SA({ state: s }).outputs.state;
const a = new FA({ state: s }).outputs.hash;
return { hash: YA({ vectorType: "uvec3", x: i, y: n, z: a }) };
}
});
}
dynoOut() {
return new z(this, "hash");
}
}
class Ga extends HA {
constructor({ value: A }) {
super({
inTypes: { value: q(A) },
outTypes: { hash: "uvec4" },
inputs: { value: A },
construct: ({ value: e }) => {
if (!e)
throw new Error("value is required");
let s = new wt({ value: e }).outputs.state;
s = new SA({ state: s }).outputs.state;
const i = new FA({ state: s }).outputs.hash;
s = new SA({ state: s }).outputs.state;
const n = new FA({ state: s }).outputs.hash;
s = new SA({ state: s }).outputs.state;
const a = new FA({ state: s }).outputs.hash;
s = new SA({ state: s }).outputs.state;
const r = new FA({ state: s }).outputs.hash;
return { hash: YA({ vectorType: "uvec4", x: i, y: n, z: a, w: r }) };
}
});
}
dynoOut() {
return new z(this, "hash");
}
}
class ba extends HA {
constructor({ value: A }) {
super({
inTypes: { value: q(A) },
outTypes: { hash: "float" },
inputs: { value: A },
construct: ({ value: e }) => {
if (!e)
throw new Error("value is required");
const s = ma(e);
return { hash: CA(Dn(s), tA("float", 1 / 2 ** 32)) };
}
});
}
dynoOut() {
return new z(this, "hash");
}
}
class va extends HA {
constructor({ value: A }) {
super({
inTypes: { value: q(A) },
outTypes: { hash: "vec2" },
inputs: { value: A },
construct: ({ value: e }) => {
if (!e)
throw new Error("value is required");
const s = Ma(e);
return { hash: CA(fn(s), tA("float", 1 / 2 ** 32)) };
}
});
}
dynoOut() {
return new z(this, "hash");
}
}
class La extends HA {
constructor({ value: A }) {
super({
inTypes: { value: q(A) },
outTypes: { hash: "vec3" },
inputs: { value: A },
construct: ({ value: e }) => {
if (!e)
throw new Error("value is required");
const s = xa(e);
return { hash: CA(at(s), tA("float", 1 / 2 ** 32)) };
}
});
}
dynoOut() {
return new z(this, "hash");
}
}
class Ja extends HA {
constructor({ value: A }) {
super({
inTypes: { value: q(A) },
outTypes: { hash: "vec4" },
inputs: { value: A },
construct: ({ value: e }) => {
if (!e)
throw new Error("value is required");
const s = Sa(e);
return { hash: CA(mn(s), tA("float", 1 / 2 ** 32)) };
}
});
}
dynoOut() {
return new z(this, "hash");
}
}
const Ya = (t, {
scale: A,
scales: e,
rotate: s,
translate: i
}) => new Ha({ position: t, scale: A, scales: e, rotate: s, translate: i }).outputs.position, Ta = (t, {
scale: A,
scales: e,
rotate: s
}) => new Ka({ dir: t, scale: A, scales: e, rotate: s }).outputs.dir, HB = (t, { rotate: A }) => new qa({ quaternion: t, rotate: A }).outputs.quaternion;
class Ha extends V {
constructor({
position: A,
scale: e,
scales: s,
rotate: i,
translate: n
}) {
super({
inTypes: {
position: "vec3",
scale: "float",
scales: "vec3",
rotate: "vec4",
translate: "vec3"
},
outTypes: { position: "vec3" },
inputs: { position: A, scale: e, scales: s, rotate: i, translate: n },
statements: ({ inputs: a, outputs: r }) => {
const { position: g } = r;
if (!g)
return [];
const { scale: I, scales: Q, rotate: o, translate: E } = a;
return [
`${g} = ${a.position ?? "vec3(0.0, 0.0, 0.0)"};`,
I ? `${g} *= ${I};` : null,
Q ? `${g} *= ${Q};` : null,
o ? `${g} = quatVec(${o}, ${g});` : null,
E ? `${g} += ${E};` : null
].filter(Boolean);
}
});
}
}
class Ka extends V {
constructor({
dir: A,
scale: e,
scales: s,
rotate: i
}) {
super({
inTypes: { dir: "vec3", scale: "float", scales: "vec3", rotate: "vec4" },
outTypes: { dir: "vec3" },
inputs: { dir: A, scale: e, scales: s, rotate: i },
statements: ({ inputs: n, outputs: a }) => {
const { dir: r } = a;
if (!r)
return [];
const { scale: g, scales: I, rotate: Q } = n;
return [
`${r} = ${n.dir ?? "vec3(0.0, 0.0, 0.0)"};`,
g ? `${r} *= ${g};` : null,
I ? `${r} *= ${I};` : null,
Q ? `${r} = quatVec(${Q}, ${r});` : null
].filter(Boolean);
}
});
}
}
class qa extends V {
constructor({
quaternion: A,
rotate: e
}) {
super({
inTypes: { quaternion: "vec4", rotate: "vec4" },
outTypes: { quaternion: "vec4" },
inputs: { quaternion: A, rotate: e },
statements: ({ inputs: s, outputs: i }) => {
const { quaternion: n } = i;
return n ? [
`${n} = ${s.quaternion ?? "vec4(0.0, 0.0, 0.0, 1.0)"};`,
e ? `${n} = quatQuat(${s.rotate}, ${n});` : null
].filter(Boolean) : [];
}
});
}
}
const KB = () => {
throw new Error("Not implemented");
}, qB = () => {
throw new Error("Not implemented");
}, zB = () => {
throw new Error("Not implemented");
}, _B = () => {
throw new Error("Not implemented");
}, VB = () => {
throw new Error("Not implemented");
}, PB = () => {
throw new Error("Not implemented");
}, ZB = (t, A) => new za({ texture: t, lod: A }), OB = (t, A, e) => new _a({ texture: t, coord: A, bias: e }), WB = (t, A, e) => new Va({ texture: t, coord: A, lod: e });
class za extends V {
constructor({ texture: A, lod: e }) {
const s = q(A);
super({
inTypes: { texture: s, lod: "int" },
outTypes: { size: Pa(s) },
inputs: { texture: A, lod: e },
statements: ({ inputs: i, outputs: n }) => [
`${n.size} = textureSize(${i.texture}, ${i.lod ?? "0"});`
]
});
}
dynoOut() {
return new z(this, "size");
}
}
class _a extends V {
constructor({
texture: A,
coord: e,
bias: s
}) {
const i = q(A);
super({
inTypes: {
texture: i,
coord: XB(i),
bias: "float"
},
outTypes: { sample: Za(i) },
inputs: { texture: A, coord: e, bias: s },
statements: ({ inputs: n, outputs: a }) => [
`${a.sample} = texture(${n.texture}, ${n.coord}${n.bias ? `, ${n.bias}` : ""});`
]
});
}
dynoOut() {
return new z(this, "sample");
}
}
class Va extends V {
constructor({
texture: A,
coord: e,
lod: s
}) {
const i = q(A);
super({
inTypes: {
texture: i,
coord: Pa(i),
lod: "int"
},
outTypes: { texel: Za(i) },
inputs: { texture: A, coord: e, lod: s },
statements: ({ inputs: n, outputs: a }) => [
`${a.texel} = texelFetch(${n.texture}, ${n.coord}, ${n.lod ?? "0"});`
]
});
}
dynoOut() {
return new z(this, "texel");
}
}
function Pa(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 XB(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 Za(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 $B = (t) => new Oa({ degrees: t }), jB = (t) => new Wa({ radians: t }), Se = (t) => new Xa({ radians: t }), AQ = (t) => new $a({ radians: t }), tQ = (t) => new ja({ radians: t }), eQ = (t) => new Ar({ sin: t }), sQ = (t) => new tr({ cos: t }), iQ = (t) => new er({ tan: t }), nQ = (t, A) => new sr({ y: t, x: A }), aQ = (t) => new ir({ x: t }), rQ = (t) => new nr({ x: t }), gQ = (t) => new ar({ x: t }), oQ = (t) => new rr({ x: t }), IQ = (t) => new gr({ x: t }), BQ = (t) => new or({ x: t });
class Oa extends x {
constructor({ degrees: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "radians" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.radians} = radians(${e.a});`
];
}
}
class Wa extends x {
constructor({ radians: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "degrees" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.degrees} = degrees(${e.a});`
];
}
}
class Xa extends x {
constructor({ radians: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "sin" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.sin} = sin(${e.a});`
];
}
}
class $a extends x {
constructor({ radians: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "cos" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.cos} = cos(${e.a});`
];
}
}
class ja extends x {
constructor({ radians: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "tan" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.tan} = tan(${e.a});`
];
}
}
class Ar extends x {
constructor({ sin: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "asin" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.asin} = asin(${e.a});`
];
}
}
class tr extends x {
constructor({ cos: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "acos" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.acos} = acos(${e.a});`
];
}
}
class er extends x {
constructor({ tan: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "atan" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.atan} = atan(${e.a});`
];
}
}
class sr extends W {
constructor({ y: A, x: e }) {
super({
a: A,
b: e,
outTypeFunc: (s, i) => s,
outKey: "atan2"
}), this.statements = ({ inputs: s, outputs: i }) => [
`${i.atan2} = atan2(${s.a}, ${s.b});`
];
}
}
class ir extends x {
constructor({ x: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "sinh" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.sinh} = sinh(${e.a});`
];
}
}
class nr extends x {
constructor({ x: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "cosh" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.cosh} = cosh(${e.a});`
];
}
}
class ar extends x {
constructor({ x: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "tanh" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.tanh} = tanh(${e.a});`
];
}
}
class rr extends x {
constructor({ x: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "asinh" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.asinh} = asinh(${e.a});`
];
}
}
class gr extends x {
constructor({ x: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "acosh" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.acosh} = acosh(${e.a});`
];
}
}
class or extends x {
constructor({ x: A }) {
super({ a: A, outTypeFunc: (e) => e, outKey: "atanh" }), this.statements = ({ inputs: e, outputs: s }) => [
`${s.atanh} = atanh(${e.a});`
];
}
}
const NE = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
Abs: Ji,
Acos: tr,
Acosh: gr,
Add: Ni,
All: dn,
And: gn,
Any: un,
Asin: Ar,
Asinh: rr,
Atan: er,
Atan2: sr,
Atanh: or,
BVec2: Rn,
BVec3: Gn,
BVec4: bn,
BinaryOp: W,
Bool: Fn,
Ceil: Hi,
Clamp: tn,
Combine: Da,
CombineGsplat: ls,
CompMult: la,
CompXor: pn,
Compilation: Is,
Cos: $a,
Cosh: nr,
Cross: Ia,
Degrees: Wa,
Determinant: wa,
Distance: ga,
Div: Ri,
Dot: oa,
Dyno: V,
DynoBlock: HA,
DynoBool: Wt,
DynoBvec2: fs,
DynoBvec3: Ss,
DynoBvec4: ks,
DynoConst: os,
DynoFloat: it,
DynoInt: kt,
DynoIsampler2D: Ps,
DynoIsampler2DArray: Os,
DynoIsampler3D: $s,
DynoIsamplerCube: ti,
DynoIvec2: Ms,
DynoIvec3: Ns,
DynoIvec4: Rs,
DynoLiteral: ct,
DynoMat2: Gs,
DynoMat2x2: bs,
DynoMat2x3: vs,
DynoMat2x4: Ls,
DynoMat3: Js,
DynoMat3x2: Ys,
DynoMat3x3: Ts,
DynoMat3x4: Hs,
DynoMat4: Ks,
DynoMat4x2: qs,
DynoMat4x3: zs,
DynoMat4x4: _s,
DynoOutput: z,
DynoProgram: Ye,
DynoProgramTemplate: Te,
DynoRemapIndex: Na,
DynoSampler2D: Zs,
DynoSampler2DArray: Ws,
DynoSampler2DArrayShadow: ii,
DynoSampler2DShadow: si,
DynoSampler3D: js,
DynoSamplerCube: ei,
DynoSamplerCubeShadow: ni,
DynoUint: Ds,
DynoUniform: k,
DynoUsampler2D: Vs,
DynoUsampler2DArray: Mt,
DynoUsampler3D: Xs,
DynoUsamplerCube: Ai,
DynoUvec2: ms,
DynoUvec3: Fs,
DynoUvec4: Us,
DynoValue: $A,
DynoVec2: xs,
DynoVec3: lt,
DynoVec4: Lt,
Equal: hn,
Exp: Vi,
Exp2: Pi,
ExtendVec: Ea,
FaceForward: Ca,
Float: Un,
FloatBitsToInt: Zn,
FloatBitsToUint: On,
Floor: Ti,
Fract: zi,
GreaterThan: Cn,
GreaterThanEqual: cn,
Gsplat: sA,
GsplatNormal: ds,
Hash: ka,
Hash2: Ua,
Hash3: Ra,
Hash4: Ga,
HashFloat: ba,
HashVec2: va,
HashVec3: La,
HashVec4: Ja,
IMod: Gi,
IVec2: vn,
IVec3: Ln,
IVec4: Jn,
Int: Nn,
IntBitsToFloat: Wn,
Inverse: ya,
InverseSqrt: $i,
IsInf: rn,
IsNan: an,
Length: ra,
LessThan: Qn,
LessThanEqual: En,
Log: Zi,
Log2: Oi,
Mat2: _n,
Mat3: Vn,
Mat4: Pn,
Max: An,
Min: ji,
Mix: en,
Mod: bi,
Modf: vi,
Mul: Ui,
Neg: Li,
Normalize: Ba,
Not: Bn,
NotEqual: ln,
NumPackedSplats: Qs,
Or: on,
Outer: ua,
OutputPackedSplat: ps,
OutputRgba8: Le,
PackHalf2x16: ea,
PackSnorm2x16: $n,
PackUnorm2x16: Aa,
PcgHash: FA,
PcgMix: wt,
PcgNext: SA,
Pow: _i,
ProjectH: Qa,
Radians: Oa,
ReadPackedSplat: Cs,
ReadPackedSplatRange: cs,
ReflectVec: ca,
RefractVec: ha,
Round: qi,
Select: wn,
Sign: Yi,
SimpleCast: rA,
Sin: Xa,
Sinh: ir,
Smoothstep: nn,
Split: pa,
SplitGsplat: hs,
Sqr: Wi,
Sqrt: Xi,
Step: sn,
Sub: ki,
Swizzle: fa,
TPackedSplats: vt,
Tan: ja,
Tanh: ar,
TexelFetch: Va,
Texture: _a,
TextureSize: za,
TransformDir: Ka,
TransformGsplat: ws,
TransformPosition: Ha,
TransformQuaternion: qa,
Transpose: da,
TrinaryOp: ot,
Trunc: Ki,
UVec2: Yn,
UVec3: Tn,
UVec4: Hn,
Uint: kn,
UintBitsToFloat: Xn,
UintToRgba8: ia,
UnaryOp: x,
UnpackHalf2x16: sa,
UnpackSnorm2x16: jn,
UnpackUnorm2x16: ta,
Vec2: Kn,
Vec3: qn,
Vec4: zn,
Xor: In,
abs: II,
acos: sQ,
acosh: IQ,
add: fA,
all: HI,
and: NI,
any: TI,
arrayIndex: VB,
arrayLength: PB,
asin: eQ,
asinh: oQ,
atan: iQ,
atan2: nQ,
atanh: BQ,
bool: VI,
bvec2: OI,
bvec3: WI,
bvec4: XI,
ceil: EI,
clamp: mI,
combine: YA,
combineGsplat: ht,
comment: _B,
compMult: fB,
compXor: qI,
cos: AQ,
cosh: rQ,
cross: uB,
defineGsplat: mA,
defineGsplatNormal: us,
definePackedSplats: ne,
degrees: jB,
determinant: xB,
distance: hB,
div: Pt,
dot: lB,
dyno: bt,
dynoBlock: RA,
dynoBool: $r,
dynoBvec2: tg,
dynoBvec3: ng,
dynoBvec4: gg,
dynoConst: tA,
dynoDeclare: be,
dynoFloat: LA,
dynoFor: zB,
dynoIf: KB,
dynoInt: Ag,
dynoIsampler2D: mg,
dynoIsampler2DArray: Sg,
dynoIsampler3D: kg,
dynoIsamplerCube: Gg,
dynoIvec2: sg,
dynoIvec3: rg,
dynoIvec4: Ig,
dynoLiteral: Ot,
dynoMat2: Qg,
dynoMat2x2: Eg,
dynoMat2x3: Cg,
dynoMat2x4: cg,
dynoMat3: hg,
dynoMat3x2: lg,
dynoMat3x3: ug,
dynoMat3x4: dg,
dynoMat4: wg,
dynoMat4x2: yg,
dynoMat4x3: pg,
dynoMat4x4: Dg,
dynoSampler2D: Mg,
dynoSampler2DArray: Fg,
dynoSampler2DArrayShadow: Lg,
dynoSampler2DShadow: vg,
dynoSampler3D: Ug,
dynoSamplerCube: bg,
dynoSamplerCubeShadow: Jg,
dynoSwitch: qB,
dynoUint: jr,
dynoUsampler2D: fg,
dynoUsampler2DArray: xg,
dynoUsampler3D: Ng,
dynoUsamplerCube: Rg,
dynoUvec2: eg,
dynoUvec3: ag,
dynoUvec4: og,
dynoVec2: ig,
dynoVec3: PA,
dynoVec4: Bg,
equal: JI,
exp: lI,
exp2: uI,
extendVec: aa,
faceforward: dB,
float: Dn,
floatBitsToInt: Mn,
floatBitsToUint: rB,
floor: QI,
fract: Zt,
greaterThan: vI,
greaterThanEqual: LI,
gsplatNormal: Or,
hash: ma,
hash2: Ma,
hash3: xa,
hash4: Sa,
hashFloat: YB,
hashVec2: TB,
hashVec3: Fa,
hashVec4: xe,
imod: Me,
int: PI,
intBitsToFloat: gB,
inverse: SB,
inversesqrt: DI,
isAllFloatType: jA,
isBoolType: rt,
isFloatType: Rt,
isInf: FI,
isIntType: hA,
isMat2: tt,
isMat3: et,
isMat4: st,
isMatFloatType: is,
isNan: SI,
isScalarType: gt,
isUintType: lA,
isVector2Type: ut,
isVector3Type: dt,
isVector4Type: Gt,
isVectorType: qr,
ivec2: $I,
ivec3: jI,
ivec4: AB,
length: cB,
lessThan: GI,
lessThanEqual: bI,
literalNegOne: Pr,
literalOne: Vr,
literalZero: pt,
log: dI,
log2: wI,
mat2: iB,
mat3: nB,
mat4: aB,
max: Si,
min: fI,
mix: Fi,
mod: xi,
modf: gI,
mul: CA,
neg: oI,
normalize: na,
not: RI,
notEqual: YI,
numPackedSplats: Zr,
numberAsFloat: K,
numberAsInt: nA,
numberAsUint: aA,
or: kI,
outer: mB,
outputPackedSplat: ys,
outputRgba8: Wr,
packHalf2x16: xn,
packSnorm2x16: IB,
packUnorm2x16: QB,
pcgHash: JB,
pcgMix: vB,
pcgNext: LB,
pow: hI,
projectH: pB,
radians: $B,
readPackedSplat: Nt,
readPackedSplatRange: Bs,
reflectVec: wB,
refractVec: yB,
remapIndex: bB,
round: cI,
sameSizeIvec: _r,
sameSizeUvec: rs,
sameSizeVec: zr,
select: KI,
sign: BI,
sin: Se,
sinh: aQ,
smoothstep: xI,
split: St,
splitGsplat: mt,
sqr: yI,
sqrt: pI,
step: MI,
sub: Ut,
swizzle: DB,
tan: tQ,
tanh: gQ,
texelFetch: WB,
texture: OB,
textureSize: ZB,
transformDir: Ta,
transformGsplat: ve,
transformPos: Ya,
transformQuat: HB,
transpose: MB,
trunc: CI,
typeLiteral: gs,
uint: ZI,
uintBitsToFloat: oB,
uintToRgba8: Sn,
uniform: Xr,
unindent: BA,
unindentLines: NA,
unpackHalf2x16: CB,
unpackSnorm2x16: BB,
unpackUnorm2x16: EB,
uvec2: tB,
uvec3: eB,
uvec4: sB,
valType: q,
vec2: fn,
vec3: at,
vec4: mn,
vectorDim: as,
vectorElementType: ns,
xor: UI
}, Symbol.toStringTag, { value: "Module" }));
var QQ = `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 oA = class oA {
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) / O) * O * 4;
if (e.byteLength >= i)
return e;
const n = new ArrayBuffer(i);
if (e instanceof ArrayBuffer)
return n;
const a = e.constructor;
return new a(n);
}
// Ensure our render target is large enough for the readback of capacity indices.
ensureCapacity(A) {
const { width: e, height: s, depth: i, maxSplats: n } = yA(A);
(!this.target || n > this.capacity) && (this.dispose(), this.capacity = n, this.target = new B.WebGLArrayRenderTarget(e, s, i, {
depthBuffer: !1,
stencilBuffer: !1,
generateMipmaps: !1,
magFilter: B.NearestFilter,
minFilter: B.NearestFilter
}), this.target.texture.format = B.RGBAFormat, this.target.texture.type = B.UnsignedByteType, this.target.texture.internalFormat = "RGBA8");
}
// Get a program and THREE.RawShaderMaterial for a given Rgba8Readback,
// generating it if necessary and caching the result.
prepareProgramMaterial(A) {
let e = oA.readbackProgram.get(A);
if (!e) {
const i = RA(
{ index: "int" },
{ rgba8: "vec4" },
({ index: n }) => (A.inputs.index = n, { rgba8: new Le({ rgba8: A.outputs.rgba8 }) })
);
oA.programTemplate || (oA.programTemplate = new Te(QQ)), e = new Ye({
graph: i,
inputs: { index: "index" },
outputs: { rgba8: "target" },
template: oA.programTemplate
}), Object.assign(e.uniforms, {
targetLayer: { value: 0 },
targetBase: { value: 0 },
targetCount: { value: 0 }
}), oA.readbackProgram.set(A, e);
}
const s = e.prepareMaterial();
return oA.mesh.material = s, { program: e, material: s };
}
saveRenderState(A) {
return {
xrPresenting: A.xr.isPresenting,
autoClear: A.autoClear,
scissorTest: A.getScissorTest(),
pixelRatio: A.getPixelRatio()
};
}
resetRenderState(A, e) {
A.setRenderTarget(null), A.setPixelRatio(e.pixelRatio), A.xr.isPresenting = e.xrPresenting, A.autoClear = e.autoClear, A.setScissorTest(e.scissorTest);
}
process({
count: A,
material: e
}) {
const s = this.renderer;
if (!s)
throw new Error("No renderer");
if (!this.target)
throw new Error("No target");
const i = O * XA;
e.uniforms.targetBase.value = 0, e.uniforms.targetCount.value = A;
let n = 0;
for (; n < A; ) {
const a = Math.floor(n / i), r = a * i, g = Math.min(
XA,
Math.ceil((A - r) / O)
);
e.uniforms.targetLayer.value = a, s.setPixelRatio(1), s.setRenderTarget(this.target, a), s.xr.isPresenting = !1, s.autoClear = !1, s.setScissorTest(!0), s.setScissor(0, 0, O, g), s.render(oA.scene, oA.camera), n += O * g;
}
this.count = A;
}
async read({
readback: A
}) {
const e = this.renderer;
if (!e)
throw new Error("No renderer");
if (!this.target)
throw new Error("No target");
const s = Math.ceil(this.count / O) * O;
if (A.byteLength < s * 4)
throw new Error(
`Readback buffer too small: ${A.byteLength} < ${s * 4}`
);
const i = new Uint8Array(
A instanceof ArrayBuffer ? A : A.buffer
), n = O * XA;
let a = 0;
const r = [];
for (; a < this.count; ) {
const g = Math.floor(a / n), I = g * n, Q = Math.min(
XA,
Math.ceil((this.count - I) / O)
);
e.setPixelRatio(1), e.setRenderTarget(this.target, g);
const o = O * Q * 4, E = i.subarray(
I * 4,
I * 4 + o
), C = e == null ? void 0 : e.readRenderTargetPixelsAsync(
this.target,
0,
0,
O,
Q,
E
);
r.push(C), a += O * Q;
}
return Promise.all(r).then(() => A);
}
// Perform render operation to run the Rgba8Readback program
// but don't perform the readback yet.
render({
reader: A,
count: e,
renderer: s
}) {
if (this.renderer = s || this.renderer, !this.renderer)
throw new Error("No renderer");
this.ensureCapacity(e);
const { program: i, material: n } = this.prepareProgramMaterial(A);
i.update();
const a = this.saveRenderState(this.renderer);
this.process({ count: e, material: n }), this.resetRenderState(this.renderer, a);
}
// Perform a readback of the render target, returning a buffer of the
// given type.
async readback({
readback: A
}) {
if (!this.renderer)
throw new Error("No renderer");
const e = this.saveRenderState(this.renderer), s = this.read({ readback: A });
return this.resetRenderState(this.renderer, e), s;
}
// Perform a render and readback operation for the given Rgba8Readback,
// and readback buffer (call ensureBuffer first).
async renderReadback({
reader: A,
count: e,
renderer: s,
readback: i
}) {
if (this.renderer = s || this.renderer, !this.renderer)
throw new Error("No renderer");
this.ensureCapacity(e);
const { program: n, material: a } = this.prepareProgramMaterial(A);
n.update();
const r = this.saveRenderState(this.renderer);
this.process({ count: e, material: a });
const g = this.read({ readback: i });
return this.resetRenderState(this.renderer, r), g;
}
getTexture() {
var A;
return (A = this.target) == null ? void 0 : A.texture;
}
};
oA.programTemplate = null, oA.readbackProgram = /* @__PURE__ */ new Map(), oA.geometry = new B.PlaneGeometry(2, 2), oA.mesh = new B.Mesh(
oA.geometry,
new B.RawShaderMaterial({ visible: !1 })
), oA.scene = new B.Scene().add(oA.mesh), oA.camera = new B.Camera();
let $t = oA;
const IA = class IA {
constructor(A = {}) {
this.capacity = 0, this.count = 0, this.array = null, this.readback = null, this.source = null, this.needsUpdate = !0, this.dyno = new k({
key: "rgbaArray",
type: Ir,
globals: () => [Br],
value: {
texture: IA.getEmpty(),
count: 0
},
update: (e) => {
var s;
return e.texture = ((s = this.readback) == null ? void 0 : s.getTexture()) ?? this.source ?? IA.getEmpty(), e.count = this.count, e;
}
}), A.array ? (this.array = A.array, this.capacity = Math.floor(this.array.length / 4), this.capacity = Math.floor(this.capacity / O) * O, 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 = yA(A).maxSplats;
const s = new Uint8Array(this.capacity * 4);
this.array && s.set(this.array), this.array = s;
}
return this.array;
}
// Get the THREE.DataArrayTexture from either the readback or the source.
getTexture() {
var e;
let A = (e = this.readback) == null ? void 0 : e.getTexture();
return (this.source || this.array) && (A = this.maybeUpdateSource()), A ?? IA.getEmpty();
}
// Create or get a THREE.DataArrayTexture from the data array.
maybeUpdateSource() {
if (!this.array)
throw new Error("No array");
if (this.needsUpdate || !this.source) {
if (this.needsUpdate = !1, this.source) {
const { width: A, height: e, depth: s } = this.source.image;
this.capacity !== A * e * s && (this.source.dispose(), this.source = null);
}
if (this.source)
this.array.buffer !== this.source.image.data.buffer && (this.source.image.data = new Uint8Array(this.array.buffer));
else {
const { width: A, height: e, depth: s } = yA(this.capacity);
this.source = new B.DataArrayTexture(
this.array,
A,
e,
s
), this.source.format = B.RGBAFormat, this.source.type = B.UnsignedByteType, this.source.internalFormat = "RGBA8", this.source.needsUpdate = !0;
}
this.source.needsUpdate = !0;
}
return this.source;
}
// Generate the RGBA8 values from a Rgba8Readback dyno program.
render({
reader: A,
count: e,
renderer: s
}) {
this.readback || (this.readback = new $t({ renderer: s })), this.readback.render({ reader: A, count: e, renderer: s }), this.capacity = this.readback.capacity, this.count = this.readback.count;
}
// Extract the RGBA8 values from a PackedSplats collection.
fromPackedSplats({
packedSplats: A,
base: e,
count: s,
renderer: i
}) {
const { dynoSplats: n, dynoBase: a, dynoCount: r, reader: g } = IA.makeDynos();
return n.packedSplats = A, a.value = e, r.value = s, this.render({ reader: g, count: s, 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 (!IA.emptySource) {
const A = new Uint8Array(4);
IA.emptySource = new B.DataArrayTexture(A, 1, 1, 1), IA.emptySource.format = B.RGBAFormat, IA.emptySource.type = B.UnsignedByteType, IA.emptySource.internalFormat = "RGBA8", IA.emptySource.needsUpdate = !0;
}
return IA.emptySource;
}
// Create a dyno program that can extract RGBA8 values from a PackedSplats
static makeDynos() {
if (!IA.dynos) {
const A = new Ke(), e = new kt({ value: 0 }), s = new kt({ value: 0 }), i = RA(
{ index: "int" },
{ rgba8: "vec4" },
({ index: n }) => {
if (!n)
throw new Error("index is undefined");
n = fA(n, e);
const a = Bs(
A,
n,
e,
s
);
return { rgba8: mt(a).outputs.rgba };
}
);
IA.dynos = { dynoSplats: A, dynoBase: e, dynoCount: s, reader: i };
}
return IA.dynos;
}
};
IA.emptySource = null, IA.dynos = null;
let Fe = IA;
const Ir = { type: "RgbaArray" }, Br = BA(`
struct RgbaArray {
sampler2DArray texture;
int count;
};
`);
function EQ(t, A) {
return new V({
inTypes: { rgba: Ir, index: "int" },
outTypes: { rgba: "vec4" },
inputs: { rgba: t, index: A },
globals: () => [Br],
statements: ({ inputs: s, outputs: i }) => NA(`
if ((index >= 0) && (index < ${s.rgba}.count)) {
${i.rgba} = texelFetch(${s.rgba}.texture, splatTexCoord(index), 0);
} else {
${i.rgba} = vec4(0.0, 0.0, 0.0, 0.0);
}
`)
}).outputs.rgba;
}
var CQ = /* @__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))(CQ || {});
function cQ(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 hQ = /* @__PURE__ */ ((t) => (t.MULTIPLY = "multiply", t.SET_RGB = "set_rgb", t.ADD_RGBA = "add_rgba", t))(hQ || {});
function lQ(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 uQ extends B.Object3D {
constructor(A = {}) {
super();
const { type: e, invert: s, opacity: i, color: n, displace: a, radius: r } = A;
this.type = e ?? "sphere", this.invert = s ?? !1, this.opacity = i ?? 1, this.color = n ?? new B.Color(1, 1, 1), this.displace = a ?? new B.Vector3(0, 0, 0), this.radius = r ?? 0;
}
}
const ie = class ie extends B.Object3D {
constructor(A = {}) {
const {
name: e,
rgbaBlendMode: s = "multiply",
sdfSmooth: i = 0,
softEdge: n = 0,
invert: a = !1,
sdfs: r = null
} = A;
super(), this.rgbaBlendMode = s, this.sdfSmooth = i, this.softEdge = n, this.invert = a, this.sdfs = r, this.ordering = ie.nextOrdering++, this.name = e ?? `Edit ${this.ordering}`;
}
addSdf(A) {
this.sdfs == null && (this.sdfs = []), this.sdfs.push(A);
}
removeSdf(A) {
this.sdfs != null && (this.sdfs = this.sdfs.filter((e) => e !== A));
}
};
ie.nextOrdering = 1;
let jt = ie;
class dQ {
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: Qr,
globals: () => [Er],
value: {
numSdfs: 0,
sdfTexture: this.sdfTexture
},
update: (s) => (s.numSdfs = this.numSdfs, s.sdfTexture = this.sdfTexture, s)
}), this.maxEdits = Math.max(16, e ?? 0), this.numEdits = 0, this.editData = new Uint32Array(this.maxEdits * 4), this.editFloatData = new Float32Array(this.editData.buffer), this.dynoNumEdits = new kt({ value: 0 }), this.dynoEdits = this.newEdits(this.editData, this.maxEdits);
}
newSdfTexture(A, e) {
const s = new B.DataTexture(
A,
8,
e,
B.RGBAIntegerFormat,
B.UnsignedIntType
);
return s.internalFormat = "RGBA32UI", s.needsUpdate = !0, s;
}
newEdits(A, e) {
return new k({
key: "edits",
type: "uvec4",
count: e,
globals: () => [Cr],
value: A
});
}
// Ensure our SDF texture and edits uniform array have enough capacity.
// Reallocate if not.
ensureCapacity({
maxSdfs: A,
maxEdits: e
}) {
let s = !1;
return A > this.sdfTexture.image.height && (this.sdfTexture.dispose(), this.maxSdfs = Math.max(this.maxSdfs * 2, A), this.sdfData = new Uint32Array(this.maxSdfs * 8 * 4), this.sdfFloatData = new Float32Array(this.sdfData.buffer), this.sdfTexture = this.newSdfTexture(this.sdfData, this.maxSdfs)), e > (this.dynoEdits.count ?? 0) && (this.maxEdits = Math.max(this.maxEdits * 2, e), this.editData = new Uint32Array(this.maxEdits * 4), this.editFloatData = new Float32Array(this.editData.buffer), this.dynoEdits = this.newEdits(this.editData, this.maxEdits), s = !0), s;
}
updateEditData(A, e) {
const s = this.editData[A] !== e;
return this.editData[A] = e, s;
}
updateEditFloatData(A, e) {
It[0] = e;
const s = this.editFloatData[A] !== It[0];
return s && (this.editFloatData[A] = It[0]), s;
}
encodeEdit(A, {
sdfFirst: e,
sdfCount: s,
invert: i,
rgbaBlendMode: n,
softEdge: a,
sdfSmooth: r
}) {
const g = A * 4;
let I = !1;
return I = this.updateEditData(g + 0, n | (i ? 256 : 0)) || I, I = this.updateEditData(g + 1, e | s << 16) || I, I = this.updateEditFloatData(g + 2, a) || I, I = this.updateEditFloatData(g + 3, r) || I, I;
}
updateSdfData(A, e) {
const s = this.sdfData[A] !== e;
return this.sdfData[A] = e, s;
}
updateSdfFloatData(A, e) {
It[0] = e;
const s = this.sdfFloatData[A] !== It[0];
return s && (this.sdfFloatData[A] = It[0]), s;
}
encodeSdf(A, {
sdfType: e,
invert: s,
center: i,
quaternion: n,
scale: a,
sizes: r
}, g) {
const I = A * 32, Q = e | (s ? 256 : 0);
let o = !1;
o = this.updateSdfFloatData(I + 0, (i == null ? void 0 : i.x) ?? 0) || o, o = this.updateSdfFloatData(I + 1, (i == null ? void 0 : i.y) ?? 0) || o, o = this.updateSdfFloatData(I + 2, (i == null ? void 0 : i.z) ?? 0) || o, o = this.updateSdfData(I + 3, Q) || o, o = this.updateSdfFloatData(I + 4, (n == null ? void 0 : n.x) ?? 0) || o, o = this.updateSdfFloatData(I + 5, (n == null ? void 0 : n.y) ?? 0) || o, o = this.updateSdfFloatData(I + 6, (n == null ? void 0 : n.z) ?? 0) || o, o = this.updateSdfFloatData(I + 7, (n == null ? void 0 : n.w) ?? 0) || o, o = this.updateSdfFloatData(I + 8, (a == null ? void 0 : a.x) ?? 0) || o, o = this.updateSdfFloatData(I + 9, (a == null ? void 0 : a.y) ?? 0) || o, o = this.updateSdfFloatData(I + 10, (a == null ? void 0 : a.z) ?? 0) || o, o = this.updateSdfData(I + 11, 0) || o, o = this.updateSdfFloatData(I + 12, (r == null ? void 0 : r.x) ?? 0) || o, o = this.updateSdfFloatData(I + 13, (r == null ? void 0 : r.y) ?? 0) || o, o = this.updateSdfFloatData(I + 14, (r == null ? void 0 : r.z) ?? 0) || o, o = this.updateSdfFloatData(I + 15, (r == null ? void 0 : r.w) ?? 0) || o;
const E = Math.min(4, g.length);
for (let C = 0; C < E; ++C) {
const c = I + 16 + C * 4;
o = this.updateSdfFloatData(c + 0, g[C].x) || o, o = this.updateSdfFloatData(c + 1, g[C].y) || o, o = this.updateSdfFloatData(c + 2, g[C].z) || o, o = this.updateSdfFloatData(c + 3, g[C].w) || o;
}
return o;
}
// 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((o, { sdfs: E }) => o + E.length, 0), s = this.ensureCapacity({
maxEdits: A.length,
maxSdfs: e
}), i = [new B.Vector4(), new B.Vector4()], n = new B.Vector3(), a = new B.Quaternion(), r = new B.Vector3(), g = new B.Vector4();
let I = 0, Q = s;
A.length !== this.dynoNumEdits.value && (this.dynoNumEdits.value = A.length, this.numEdits = A.length, Q = !0);
for (const [o, { edit: E, sdfs: C }] of A.entries()) {
Q = this.encodeEdit(o, {
sdfFirst: I,
sdfCount: C.length,
invert: E.invert,
rgbaBlendMode: lQ(E.rgbaBlendMode),
softEdge: E.softEdge,
sdfSmooth: E.sdfSmooth
}) || Q;
let c = !1;
for (const h of C)
g.set(h.scale.x, h.scale.y, h.scale.z, h.radius), h.scale.setScalar(1), h.updateMatrixWorld(), h.matrixWorld.clone().invert().decompose(n, a, r), h.scale.set(g.x, g.y, g.z), h.updateMatrixWorld(), i[0].set(h.color.r, h.color.g, h.color.b, h.opacity), i[1].set(h.displace.x, h.displace.y, h.displace.z, 1), c = this.encodeSdf(
I,
{
sdfType: cQ(h.type),
invert: h.invert,
center: n,
quaternion: a,
scale: r,
sizes: g
},
i
) || c, I += 1;
this.numSdfs = I, c && (this.sdfTexture.needsUpdate = !0), Q || (Q = c);
}
return { updated: Q, dynoUpdated: s };
}
// Modify a Gsplat in a dyno shader program using the current edits and SDFs.
modify(A) {
return wQ(
A,
this.dynoSdfArray,
this.dynoNumEdits,
this.dynoEdits
);
}
}
const Qr = { type: "SdfArray" }, Er = BA(`
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);
}
`), Cr = BA(`
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 wQ(t, A, e, s) {
return new V({
inTypes: {
gsplat: sA,
sdfArray: Qr,
numEdits: "int",
rgbaDisplaceEdits: "uvec4"
},
outTypes: { gsplat: sA },
globals: () => [Er, Cr],
inputs: { gsplat: t, sdfArray: A, numEdits: e, rgbaDisplaceEdits: s },
statements: ({ inputs: n, outputs: a }) => {
const { sdfArray: r, numEdits: g, rgbaDisplaceEdits: I } = n, { gsplat: Q } = a;
return NA(`
${Q} = ${n.gsplat};
if (isGsplatActive(${Q}.flags)) {
for (int editIndex = 0; editIndex < ${g}; ++editIndex) {
applyPackedRgbaDisplaceEdit(
${I}[editIndex], ${r}.sdfTexture, ${r}.numSdfs,
${Q}.center, ${Q}.rgba
);
}
}
`);
}
}).outputs.gsplat;
}
const It = new Float32Array(1);
class yQ {
constructor(A) {
this.modifier = A, this.cache = /* @__PURE__ */ new Map();
}
apply(A) {
let e = this.cache.get(A);
return e || (e = RA(
{ index: "int" },
{ gsplat: sA },
({ index: s }) => {
const { gsplat: i } = A.apply({ index: s });
return this.modifier.apply({ gsplat: i });
}
), this.cache.set(A, e)), e;
}
}
class Et {
// Create the dyno uniforms that parameterize the transform, setting them
// to initial values that are different from any valid transform.
constructor() {
this.scale = new it({ value: Number.NEGATIVE_INFINITY }), this.rotate = new Lt({
value: new B.Quaternion(
Number.POSITIVE_INFINITY,
Number.POSITIVE_INFINITY,
Number.POSITIVE_INFINITY,
Number.POSITIVE_INFINITY
)
}), this.translate = new lt({
value: new B.Vector3(
Number.POSITIVE_INFINITY,
Number.POSITIVE_INFINITY,
Number.POSITIVE_INFINITY
)
});
}
// Apply the transform to a Vec3 position in a dyno program.
apply(A) {
return Ya(A, {
scale: this.scale,
rotate: this.rotate,
translate: this.translate
});
}
applyDir(A) {
return Ta(A, {
rotate: this.rotate
});
}
// Apply the transform to a Gsplat in a dyno program.
applyGsplat(A) {
return ve(A, {
scale: this.scale,
rotate: this.rotate,
translate: this.translate
});
}
// Update the uniforms to match the given transform matrix.
updateFromMatrix(A) {
const e = new B.Vector3(), s = new B.Quaternion(), i = new B.Vector3();
A.decompose(i, s, e);
const n = (e.x + e.y + e.z) / 3;
let a = !1;
return n !== this.scale.value && (this.scale.value = n, a = !0), i.equals(this.translate.value) || (this.translate.value.copy(i), a = !0), s.equals(this.rotate.value) || (this.rotate.value.copy(s), a = !0), a;
}
// Update this transform to match the object's to-world transform.
update(A) {
return A.updateMatrixWorld(), this.updateFromMatrix(A.matrixWorld);
}
}
class ge extends B.Object3D {
constructor({
numSplats: A,
generator: e,
construct: s,
update: i
}) {
if (super(), this.numSplats = A ?? 0, this.generator = e, this.frameUpdate = i, this.version = 0, s) {
const n = s(this);
Object.assign(this, n);
}
}
updateVersion() {
this.version += 1;
}
set needsUpdate(A) {
A && this.updateVersion();
}
}
const OA = class OA extends ge {
constructor(A = {}) {
const e = new Et(), s = new Et(), i = new Et(), n = new Et(), a = new Lt({
value: new B.Vector4(
Number.NEGATIVE_INFINITY,
Number.NEGATIVE_INFINITY,
Number.NEGATIVE_INFINITY,
Number.NEGATIVE_INFINITY
)
}), r = new it({ value: 0 }), g = new it({ value: 0 }), I = {
transform: e,
viewToWorld: s,
worldToView: i,
viewToObject: n,
recolor: a,
time: r,
deltaTime: g
};
if (super({
update: ({ time: Q, deltaTime: o, viewToWorld: E, globalEdits: C }) => this.update({ time: Q, deltaTime: o, viewToWorld: E, globalEdits: C })
}), this.isInitialized = !1, this.recolor = new B.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 TA(), this.numSplats = this.packedSplats.numSplats, this.editable = A.editable ?? !0, this.onFrame = A.onFrame, this.context = I, 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 Q = A.onLoad(this);
Q instanceof Promise && await Q;
}
return this;
});
else if (this.isInitialized = !0, this.initialized = Promise.resolve(this), A.onLoad) {
const Q = A.onLoad(this);
Q instanceof Promise && (this.initialized = Q.then(() => this));
}
}
async asyncInitialize(A) {
const { url: e, fileBytes: s, fileType: i, fileName: n, maxSplats: a, constructSplats: r } = A;
if (e || s || r) {
const g = {
url: e,
fileBytes: s,
fileType: i,
fileName: n,
maxSplats: a,
construct: r
};
this.packedSplats.reinitialize(g);
}
this.packedSplats && (await this.packedSplats.initialized, this.numSplats = this.packedSplats.numSplats, this.updateGenerator());
}
static async staticInitialize() {
await es(), OA.isStaticInitialized = !0;
}
// Creates a new Gsplat with the provided parameters (all values in "float" space,
// i.e. 0-1 for opacity and color) and adds it to the end of the packedSplats,
// increasing numSplats by 1. If necessary, reallocates the buffer with an exponential
// doubling strategy to fit the new data, so it's fairly efficient to just
// pushSplat(...) each Gsplat you want to create in a loop.
pushSplat(A, e, s, i, n) {
this.packedSplats.pushSplat(A, e, s, i, n);
}
// 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: s, recolor: i } = A, n = RA(
{ index: "int" },
{ gsplat: sA },
({ index: a }) => {
if (!a)
throw new Error("index is undefined");
let r = Nt(this.packedSplats.dyno, a);
if (this.maxSh >= 1) {
const { sh1Texture: I, sh2Texture: Q, sh3Texture: o } = this.ensureShTextures();
if (I) {
const E = s.translate, { center: C } = mt(r).outputs, c = na(Ut(C, E));
let h = mQ(r, I, c);
this.maxSh >= 2 && Q && (h = fA(h, MQ(r, Q, c))), this.maxSh >= 3 && o && (h = fA(h, xQ(r, o, c)));
let { rgba: l } = mt(r).outputs;
l = fA(l, aa(h, tA("float", 0))), r = ht({ gsplat: r, rgba: l });
}
}
if (this.splatRgba) {
const I = EQ(this.splatRgba.dyno, a);
r = ht({ gsplat: r, rgba: I });
}
this.skinning && (r = this.skinning.modify(r)), this.objectModifier && (r = this.objectModifier.apply({ gsplat: r }).gsplat), r = e.applyGsplat(r);
const g = CA(i, mt(r).outputs.rgba);
return r = ht({ gsplat: r, rgba: g }), this.rgbaDisplaceEdits && (r = this.rgbaDisplaceEdits.modify(r)), this.worldModifier && (r = this.worldModifier.apply({ gsplat: r }).gsplat), { gsplat: r };
}
);
this.generator = n;
}
// 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 ForgeRenderer and you should not have to
// call it. It updates parameters for the generated pipeline and calls
// updateGenerator() if the pipeline needs to change.
update({
time: A,
viewToWorld: e,
deltaTime: s,
globalEdits: i
}) {
var l;
this.numSplats = this.packedSplats.numSplats, this.context.time.value = A, this.context.deltaTime.value = s, OA.dynoTime.value = A;
const { transform: n, viewToObject: a, recolor: r } = this.context;
let g = n.update(this);
this.context.viewToWorld.updateFromMatrix(e) && this.enableViewToWorld && (g = !0);
const I = e.clone().invert();
this.context.worldToView.updateFromMatrix(I) && this.enableWorldToView && (g = !0);
const E = new B.Matrix4().compose(
n.translate.value,
n.rotate.value,
new B.Vector3().setScalar(n.scale.value)
).invert().multiply(e);
a.updateFromMatrix(E) && (this.enableViewToObject || this.packedSplats.extra.sh1) && (g = !0);
const C = new B.Vector4(
this.recolor.r,
this.recolor.g,
this.recolor.b,
this.opacity
);
C.equals(r.value) || (r.value.copy(C), g = !0);
const c = this.editable ? (this.edits ?? []).concat(i) : [];
this.editable && !this.edits && this.traverseVisible((u) => {
u instanceof jt && c.push(u);
}), c.sort((u, w) => u.ordering - w.ordering);
const h = c.map((u) => {
if (u.sdfs != null)
return { edit: u, sdfs: u.sdfs };
const w = [];
return u.traverseVisible((d) => {
d instanceof uQ && w.push(d);
}), { edit: u, sdfs: w };
});
if (h.length > 0 && !this.rgbaDisplaceEdits) {
const u = h.length, w = h.reduce(
(d, p) => d + p.sdfs.length,
0
);
this.rgbaDisplaceEdits = new dQ({
maxEdits: u,
maxSdfs: w
}), this.updateGenerator();
}
if (this.rgbaDisplaceEdits) {
const u = this.rgbaDisplaceEdits.update(h);
g || (g = u.updated), u.dynoUpdated && this.updateGenerator();
}
g && this.updateVersion(), (l = this.onFrame) == null || l.call(this, { mesh: this, time: A, deltaTime: s });
}
// This method conforms to the standard THREE.Raycaster API, performing object-ray
// intersections using this method to populate the provided intersects[] array
// with each intersection point.
raycast(A, e) {
if (!this.packedSplats.packedArray || !this.packedSplats.numSplats)
return;
const { near: s, far: i, ray: n } = A, a = this.matrixWorld.clone().invert(), r = new B.Matrix3().setFromMatrix4(a), g = n.origin.clone().applyMatrix4(a), I = n.direction.clone().applyMatrix3(r), Q = new B.Vector3();
a.decompose(new B.Vector3(), new B.Quaternion(), Q), (Q.x * Q.y * Q.z) ** (1 / 3);
const E = vr(
g.x,
g.y,
g.z,
I.x,
I.y,
I.z,
s,
i,
this.packedSplats.numSplats,
this.packedSplats.packedArray,
!0
);
for (const C of E) {
const c = n.direction.clone().multiplyScalar(C).add(n.origin);
e.push({
distance: C,
point: c,
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: n, height: a, depth: r, maxSplats: g } = yA(
i.length / 2
);
if (i.length < g * 2) {
const Q = new Uint32Array(g * 2);
Q.set(i), this.packedSplats.extra.sh1 = Q, i = Q;
}
const I = new B.DataArrayTexture(i, n, a, r);
I.format = B.RGIntegerFormat, I.type = B.UnsignedIntType, I.internalFormat = "RG32UI", I.needsUpdate = !0, A = new Mt({
value: I,
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: n, height: a, depth: r, maxSplats: g } = yA(
i.length / 4
);
if (i.length < g * 4) {
const Q = new Uint32Array(g * 4);
Q.set(i), this.packedSplats.extra.sh2 = Q, i = Q;
}
const I = new B.DataArrayTexture(i, n, a, r);
I.format = B.RGBAIntegerFormat, I.type = B.UnsignedIntType, I.internalFormat = "RGBA32UI", I.needsUpdate = !0, e = new Mt({
value: I,
key: "sh2"
}), this.packedSplats.extra.sh2Texture = e;
}
if (!this.packedSplats.extra.sh3)
return { sh1Texture: A, sh2Texture: e };
let s = this.packedSplats.extra.sh3Texture;
if (!s) {
let i = this.packedSplats.extra.sh3;
const { width: n, height: a, depth: r, maxSplats: g } = yA(
i.length / 4
);
if (i.length < g * 4) {
const Q = new Uint32Array(g * 4);
Q.set(i), this.packedSplats.extra.sh3 = Q, i = Q;
}
const I = new B.DataArrayTexture(i, n, a, r);
I.format = B.RGBAIntegerFormat, I.type = B.UnsignedIntType, I.internalFormat = "RGBA32UI", I.needsUpdate = !0, s = new Mt({
value: I,
key: "sh3"
}), this.packedSplats.extra.sh3Texture = s;
}
return { sh1Texture: A, sh2Texture: e, sh3Texture: s };
}
};
OA.staticInitialized = OA.staticInitialize(), OA.isStaticInitialized = !1, OA.dynoTime = new it({ value: 0 });
let At = OA;
const pQ = BA(`
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);
}
`), DQ = BA(`
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));
}
`), fQ = BA(`
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 mQ(t, A, e) {
return bt({
inTypes: { gsplat: sA, sh1: "usampler2DArray", viewDir: "vec3" },
outTypes: { rgb: "vec3" },
inputs: { gsplat: t, sh1: A, viewDir: e },
globals: () => [mA, pQ],
statements: ({ inputs: s, outputs: i }) => NA(`
if (isGsplatActive(${s.gsplat}.flags)) {
${i.rgb} = evaluateSH1(${s.gsplat}, ${s.sh1}, ${s.viewDir});
} else {
${i.rgb} = vec3(0.0);
}
`)
}).outputs.rgb;
}
function MQ(t, A, e) {
return bt({
inTypes: { gsplat: sA, sh2: "usampler2DArray", viewDir: "vec3" },
outTypes: { rgb: "vec3" },
inputs: { gsplat: t, sh2: A, viewDir: e },
globals: () => [mA, DQ],
statements: ({ inputs: s, outputs: i }) => NA(`
if (isGsplatActive(${s.gsplat}.flags)) {
${i.rgb} = evaluateSH2(${s.gsplat}, ${s.sh2}, ${s.viewDir});
} else {
${i.rgb} = vec3(0.0);
}
`)
}).outputs.rgb;
}
function xQ(t, A, e) {
return bt({
inTypes: { gsplat: sA, sh3: "usampler2DArray", viewDir: "vec3" },
outTypes: { rgb: "vec3" },
inputs: { gsplat: t, sh3: A, viewDir: e },
globals: () => [mA, fQ],
statements: ({ inputs: s, outputs: i }) => NA(`
if (isGsplatActive(${s.gsplat}.flags)) {
${i.rgb} = evaluateSH3(${s.gsplat}, ${s.sh3}, ${s.viewDir});
} else {
${i.rgb} = vec3(0.0);
}
`)
}).outputs.rgb;
}
const Ct = class Ct {
// 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: (a) => {
a.enqueue(this.fileBytes.slice(0, 65536)), a.close();
}
}).pipeThrough(new TextDecoderStream()).getReader();
this.header = "";
const s = `end_header
`;
for (; ; ) {
const { value: a, done: r } = await e.read();
if (r)
throw new Error("Failed to read header");
this.header += a;
const g = this.header.indexOf(s);
if (g >= 0) {
this.header = this.header.slice(0, g + s.length);
break;
}
}
const i = new TextEncoder().encode(this.header).length;
this.data = new DataView(this.fileBytes.buffer, i), this.elements = {};
let n = null;
this.comments = [], this.header.trim().split(`
`).forEach((a, r) => {
const g = a.trim();
if (r === 0) {
if (g !== "ply")
throw new Error("Invalid PLY header");
return;
}
if (g.length === 0)
return;
const I = g.split(" ");
switch (I[0]) {
case "format":
if (I[1] === "binary_little_endian")
this.littleEndian = !0;
else if (I[1] === "binary_big_endian")
this.littleEndian = !1;
else
throw new Error(`Unsupported PLY format: ${I[1]}`);
if (I[2] !== "1.0")
throw new Error(`Unsupported PLY version: ${I[2]}`);
break;
case "end_header":
break;
case "comment":
this.comments.push(g.slice(8));
break;
case "element": {
const Q = I[1];
n = {
name: Q,
count: Number.parseInt(I[2]),
properties: {}
}, this.elements[Q] = n;
break;
}
case "property":
if (n == null)
throw new Error("Property must be inside an element");
I[1] === "list" ? n.properties[I[4]] = {
isList: !0,
type: I[3],
countType: I[2]
} : n.properties[I[2]] = {
isList: !1,
type: I[1]
};
break;
}
}), this.elements.vertex && (this.numSplats = this.elements.vertex.count);
}
parseData(A) {
let e = 0;
const s = this.data;
if (s == null)
throw new Error("No data to parse");
for (const i in this.elements) {
const n = this.elements[i], { count: a, properties: r } = n, g = {}, I = [];
for (const [o, E] of Object.entries(r))
E.isList ? (g[o] = [], I.push(() => {
const C = g[o];
C.length = Kt[E.countType](
s,
e,
this.littleEndian
), e += Bt[E.countType];
for (let c = 0; c < C.length; c++)
C[c] = Kt[E.type](
s,
e,
this.littleEndian
), e += Bt[E.type];
})) : (g[o] = 0, I.push(() => {
g[o] = Kt[E.type](
s,
e,
this.littleEndian
), e += Bt[E.type];
}));
const Q = A(n) ?? (() => {
});
for (let o = 0; o < a; o++) {
for (const E of I)
E();
Q(o, g);
}
}
}
// Parse all the Gsplat data in the PLY file in go, invoking the given
// callbacks for each Gsplat.
parseSplats(A, e) {
if (this.elements.vertex == null)
throw new Error("No vertex element found");
let s = !1;
const i = [];
let n = 0, a = [], r = [], g = [], I, Q, o;
function E() {
const u = FQ[n];
a = new Array(3).fill(null).flatMap(
(w, d) => [0, 1, 2].map((p, y) => `f_rest_${d + y * u / 3}`)
), r = new Array(5).fill(null).flatMap(
(w, d) => [0, 1, 2].map((p, y) => `f_rest_${3 + d + y * u / 3}`)
), g = new Array(7).fill(null).flatMap(
(w, d) => [0, 1, 2].map((p, y) => `f_rest_${8 + d + y * u / 3}`)
), I = n >= 1 ? new Float32Array(3 * 3) : void 0, Q = n >= 2 ? new Float32Array(5 * 3) : void 0, o = n >= 3 ? new Float32Array(7 * 3) : void 0;
}
function C(u, w) {
if (!I)
throw new Error("Missing sh1");
for (const [d, p] of a.entries())
I[d] = w[p] * 8 / 255 - 4;
if (Q)
for (const [d, p] of r.entries())
Q[d] = w[p] * 8 / 255 - 4;
if (o)
for (const [d, p] of g.entries())
o[d] = w[p] * 8 / 255 - 4;
e == null || e(u, I, Q, o);
}
function c(u) {
const {
min_x: w,
min_y: d,
min_z: p,
max_x: y,
max_y: m,
max_z: F,
min_scale_x: D,
min_scale_y: f,
min_scale_z: U,
max_scale_x: S,
max_scale_y: M,
max_scale_z: b,
min_r: N,
min_g: R,
min_b: G,
max_r: L,
max_g: T,
max_b: H
} = u.properties;
if (!w || !d || !p || !y || !m || !F || !D || !f || !U || !S || !M || !b || !N || !R || !G || !L || !T || !H)
throw new Error("Missing PLY chunk properties");
return s = !0, (iA, P) => {
const {
min_x: AA,
min_y: j,
min_z: X,
max_x: Z,
max_y: _,
max_z: v,
min_scale_x: wA,
min_scale_y: gA,
min_scale_z: J,
max_scale_x: QA,
max_scale_y: EA,
max_scale_z: Y,
min_r: MA,
min_g: pA,
min_b: GA,
max_r: bA,
max_g: vA,
max_b: uA
} = P;
i.push({
min_x: AA,
min_y: j,
min_z: X,
max_x: Z,
max_y: _,
max_z: v,
min_scale_x: wA,
min_scale_y: gA,
min_scale_z: J,
max_scale_x: QA,
max_scale_y: EA,
max_scale_z: Y,
min_r: MA,
min_g: pA,
min_b: GA,
max_r: bA,
max_g: vA,
max_b: uA
});
};
}
function h(u) {
if (e && u.name === "sh")
return n = Oe(u.properties), E(), C;
if (u.name !== "vertex")
return null;
const { packed_position: w, packed_rotation: d, packed_scale: p, packed_color: y } = u.properties;
if (!w || !d || !p || !y)
throw new Error(
"Missing PLY properties: packed_position, packed_rotation, packed_scale, packed_color"
);
const m = Math.sqrt(2);
return (F, D) => {
const f = i[F >>> 8];
if (f == null)
throw new Error("Missing PLY chunk");
const {
min_x: U,
min_y: S,
min_z: M,
max_x: b,
max_y: N,
max_z: R,
min_scale_x: G,
min_scale_y: L,
min_scale_z: T,
max_scale_x: H,
max_scale_y: iA,
max_scale_z: P,
min_r: AA,
min_g: j,
min_b: X,
max_r: Z,
max_g: _,
max_b: v
} = f, { packed_position: wA, packed_rotation: gA, packed_scale: J, packed_color: QA } = D, EA = (wA >>> 21 & 2047) / 2047 * (b - U) + U, Y = (wA >>> 11 & 1023) / 1023 * (N - S) + S, MA = (wA & 2047) / 2047 * (R - M) + M, pA = ((gA >>> 20 & 1023) / 1023 - 0.5) * m, GA = ((gA >>> 10 & 1023) / 1023 - 0.5) * m, bA = ((gA & 1023) / 1023 - 0.5) * m, vA = Math.sqrt(Math.max(0, 1 - pA * pA - GA * GA - bA * bA)), uA = gA >>> 30, KA = uA === 0 ? pA : uA === 1 ? vA : GA, oe = uA <= 1 ? GA : uA === 2 ? vA : bA, Ie = uA <= 2 ? bA : vA, Be = uA === 0 ? vA : pA, Qe = Math.exp(
(J >>> 21 & 2047) / 2047 * (H - G) + G
), Ee = Math.exp(
(J >>> 11 & 1023) / 1023 * (iA - L) + L
), Ce = Math.exp(
(J & 2047) / 2047 * (P - T) + T
), ce = (QA >>> 24 & 255) / 255 * (Z - AA) + AA, he = (QA >>> 16 & 255) / 255 * (_ - j) + j, Nr = (QA >>> 8 & 255) / 255 * (v - X) + X, kr = (QA & 255) / 255;
A(
F,
EA,
Y,
MA,
Qe,
Ee,
Ce,
KA,
oe,
Ie,
Be,
kr,
ce,
he,
Nr
);
};
}
const l = (u) => {
if (u.name === "chunk" && this.comments.some(
(_) => _.toLowerCase().includes("supersplat")
))
return c(u);
if (s)
return h(u);
if (u.name !== "vertex")
return null;
const {
x: w,
y: d,
z: p,
scale_0: y,
scale_1: m,
scale_2: F,
rot_0: D,
rot_1: f,
rot_2: U,
rot_3: S,
opacity: M,
f_dc_0: b,
f_dc_1: N,
f_dc_2: R,
red: G,
green: L,
blue: T,
alpha: H
} = u.properties;
if (!w || !d || !p)
throw new Error("Missing PLY properties: x, y, z");
const iA = y && m && F, P = D && f && U && S, AA = H != null ? qt[H.type] : 1, j = G != null ? qt[G.type] : 1, X = L != null ? qt[L.type] : 1, Z = T != null ? qt[T.type] : 1;
return n = Oe(u.properties), E(), (_, v) => {
const wA = iA ? Math.exp(v.scale_0) : Ct.defaultPointScale, gA = iA ? Math.exp(v.scale_1) : Ct.defaultPointScale, J = iA ? Math.exp(v.scale_2) : Ct.defaultPointScale, QA = P ? v.rot_1 : 0, EA = P ? v.rot_2 : 0, Y = P ? v.rot_3 : 0, MA = P ? v.rot_0 : 1, pA = M != null ? 1 / (1 + Math.exp(-v.opacity)) : H != null ? v.alpha / AA : 1, GA = b != null ? v.f_dc_0 * Ht + 0.5 : G != null ? v.red / j : 1, bA = N != null ? v.f_dc_1 * Ht + 0.5 : L != null ? v.green / X : 1, vA = R != null ? v.f_dc_2 * Ht + 0.5 : T != null ? v.blue / Z : 1;
if (A(
_,
v.x,
v.y,
v.z,
wA,
gA,
J,
QA,
EA,
Y,
MA,
pA,
GA,
bA,
vA
), e && I) {
if (I)
for (const [uA, KA] of a.entries())
I[uA] = v[KA];
if (Q)
for (const [uA, KA] of r.entries())
Q[uA] = v[KA];
if (o)
for (const [uA, KA] of g.entries())
o[uA] = v[KA];
e(_, I, Q, o);
}
};
};
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 s = this.data;
if (s == null)
throw new Error("No parsed data");
if (A.length !== this.numSplats * 4)
throw new Error("Invalid RGBA array length");
for (const i in this.elements) {
const n = this.elements[i], { count: a, properties: r } = n, g = [];
let I = 0;
const Q = i === "vertex";
if (Q) {
for (const o of ["opacity", "f_dc_0", "f_dc_1", "f_dc_2"])
if (!r[o] || r[o].type !== "float")
throw new Error(`Can't injectRgba due to property: ${o}`);
}
for (const [o, E] of Object.entries(r))
if (E.isList)
g.push(() => {
const C = Kt[E.countType](
s,
e,
this.littleEndian
);
e += Bt[E.countType], e += C * Bt[E.type];
});
else {
if (Q)
if (o === "f_dc_0" || o === "f_dc_1" || o === "f_dc_2") {
const C = Number.parseInt(
o.slice(5)
);
g.push(() => {
const c = (A[I + C] / 255 - 0.5) / Ht;
Ze[E.type](
s,
e,
this.littleEndian,
c
);
});
} else o === "opacity" && g.push(() => {
const C = Math.max(
-100,
Math.min(
100,
-Math.log(1 / (A[I + 3] / 255) - 1)
)
);
Ze[E.type](
s,
e,
this.littleEndian,
C
);
});
g.push(() => {
e += Bt[E.type];
});
}
for (let o = 0; o < a; o++) {
for (const E of g)
E();
Q && (I += 4);
}
}
}
};
Ct.defaultPointScale = 1e-3;
let Ae = Ct;
const Ht = 0.28209479177387814, Kt = {
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)
}, Ze = {
char: (t, A, e, s) => {
t.setInt8(A, s);
},
uchar: (t, A, e, s) => {
t.setUint8(A, s);
},
short: (t, A, e, s) => {
t.setInt16(A, s, e);
},
ushort: (t, A, e, s) => {
t.setUint16(A, s, e);
},
int: (t, A, e, s) => {
t.setInt32(A, s, e);
},
uint: (t, A, e, s) => {
t.setUint32(A, s, e);
},
float: (t, A, e, s) => {
t.setFloat32(A, s, e);
},
double: (t, A, e, s) => {
t.setFloat64(A, s, e);
}
}, Bt = {
char: 1,
uchar: 1,
short: 2,
ushort: 2,
int: 4,
uint: 4,
float: 4,
double: 8
}, qt = {
char: 127,
uchar: 255,
short: 32767,
ushort: 65535,
int: 2147483647,
uint: 4294967295,
float: 1,
double: 1
}, SQ = {
0: 0,
9: 1,
24: 2,
45: 3
}, FQ = {
0: 0,
1: 9,
2: 24,
3: 45
};
function Oe(t) {
let A = 0;
for (; t[`f_rest_${A}`]; )
A += 1;
const e = SQ[A];
if (e == null)
throw new Error(`Unsupported number of SH coefficients: ${A}`);
return e;
}
const cr = '(function(){"use strict";let _A;const Xi=typeof TextDecoder<"u"?new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}):{decode:()=>{throw Error("TextDecoder not available")}};typeof TextDecoder<"u"&&Xi.decode();let Vt=null;function Mn(){return(Vt===null||Vt.byteLength===0)&&(Vt=new Uint8Array(_A.memory.buffer)),Vt}function Sn(g,A){return g=g>>>0,Xi.decode(Mn().subarray(g,g+A))}function Fn(g,A,t){return _A.sort_splats(g,A,t)>>>0}function Nn(g,A,t,e,i,s,n,r,a,o,B){return _A.raycast_splats(g,A,t,e,i,s,n,r,a,o,B)}async function kn(g,A){if(typeof Response=="function"&&g instanceof Response){if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(g,A)}catch(e){if(g.headers.get("Content-Type")!="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n",e);else throw e}const t=await g.arrayBuffer();return await WebAssembly.instantiate(t,A)}else{const t=await WebAssembly.instantiate(g,A);return t instanceof WebAssembly.Instance?{instance:t,module:g}:t}}function Rn(){const g={};return g.wbg={},g.wbg.__wbg_buffer_609cc3eee51ed158=function(A){return A.buffer},g.wbg.__wbg_length_3b4f022188ae8db6=function(A){return A.length},g.wbg.__wbg_length_6ca527665d89694d=function(A){return A.length},g.wbg.__wbg_length_8cfd2c6409af88ad=function(A){return A.length},g.wbg.__wbg_new_9fee97a409b32b68=function(A){return new Uint16Array(A)},g.wbg.__wbg_new_e3b321dcfef89fc7=function(A){return new Uint32Array(A)},g.wbg.__wbg_newwithbyteoffsetandlength_e6b7e69acd4c7354=function(A,t,e){return new Float32Array(A,t>>>0,e>>>0)},g.wbg.__wbg_newwithbyteoffsetandlength_f1dead44d1fc7212=function(A,t,e){return new Uint32Array(A,t>>>0,e>>>0)},g.wbg.__wbg_newwithlength_5a5efe313cfd59f1=function(A){return new Float32Array(A>>>0)},g.wbg.__wbg_set_10bad9bee0e9c58b=function(A,t,e){A.set(t,e>>>0)},g.wbg.__wbg_set_d23661d19148b229=function(A,t,e){A.set(t,e>>>0)},g.wbg.__wbg_set_f4f1f0daa30696fc=function(A,t,e){A.set(t,e>>>0)},g.wbg.__wbg_subarray_3aaeec89bb2544f0=function(A,t,e){return A.subarray(t>>>0,e>>>0)},g.wbg.__wbg_subarray_769e1e0f81bb259b=function(A,t,e){return A.subarray(t>>>0,e>>>0)},g.wbg.__wbindgen_init_externref_table=function(){const A=_A.__wbindgen_export_0,t=A.grow(4);A.set(0,void 0),A.set(t+0,void 0),A.set(t+1,null),A.set(t+2,!0),A.set(t+3,!1)},g.wbg.__wbindgen_memory=function(){return _A.memory},g.wbg.__wbindgen_throw=function(A,t){throw new Error(Sn(A,t))},g}function Un(g,A){return _A=g.exports,ni.__wbindgen_wasm_module=A,Vt=null,_A.__wbindgen_start(),_A}async function ni(g){if(_A!==void 0)return _A;typeof g<"u"&&(Object.getPrototypeOf(g)===Object.prototype?{module_or_path:g}=g:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),typeof g>"u"&&(g=new URL("data:application/wasm;base64,AGFzbQEAAAAB/QElYAJ/fwF/YAN/f38Bf2ACf38AYAN/f38AYAF/AGABfwF/YAV/f39/fwBgA29/fwFvYAV/f39/fwF/YAR/f39/AGABbwFvYANvb38AYAFvAX9gAAF/YAAAYAd/f39/f39/AX9gAX0BfWAGf39/f39/AGAEf39/fwF/YAF/AW9gAAFvYAd/f39/f39/AGACfn8Bf2ACf34Bf2ADf35+AGACf34AYAt9fX19fX19fX9vfwFvYAZ/f39/f38Bf2AFf39+f38AYAR/fn9/AGAFf399f38AYAR/fX9/AGAFf398f38AYAR/fH9/AGADf35+AX9gA39vbwF/YAJ9fQF9AvIEEQN3YmcdX193YmdfYnVmZmVyXzYwOWNjM2VlZTUxZWQxNTgACgN3YmcaX193YmdfbmV3XzlmZWU5N2E0MDliMzJiNjgACgN3YmcaX193Ymdfc2V0X2Y0ZjFmMGRhYTMwNjk2ZmMACwN3YmcdX193YmdfbGVuZ3RoXzhjZmQyYzY0MDlhZjg4YWQADAN3YmcxX193YmdfbmV3d2l0aGJ5dGVvZmZzZXRhbmRsZW5ndGhfZjFkZWFkNDRkMWZjNzIxMgAHA3diZxpfX3diZ19uZXdfZTNiMzIxZGNmZWY4OWZjNwAKA3diZxpfX3diZ19zZXRfZDIzNjYxZDE5MTQ4YjIyOQALA3diZx1fX3diZ19sZW5ndGhfNmNhNTI3NjY1ZDg5Njk0ZAAMA3diZzFfX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9lNmI3ZTY5YWNkNGM3MzU0AAcDd2JnGl9fd2JnX3NldF8xMGJhZDliZWUwZTljNThiAAsDd2JnHV9fd2JnX2xlbmd0aF8zYjRmMDIyMTg4YWU4ZGI2AAwDd2JnH19fd2JnX3N1YmFycmF5Xzc2OWUxZTBmODFiYjI1OWIABwN3YmcfX193Ymdfc3ViYXJyYXlfM2FhZWVjODliYjI1NDRmMAAHA3diZyRfX3diZ19uZXd3aXRobGVuZ3RoXzVhNWVmZTMxM2NmZDU5ZjEAEwN3YmcQX193YmluZGdlbl90aHJvdwACA3diZxFfX3diaW5kZ2VuX21lbW9yeQAUA3diZx9fX3diaW5kZ2VuX2luaXRfZXh0ZXJucmVmX3RhYmxlAA4DvwG9AQUA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A0ECNgIMIANB2LHAADYCCCADQgI3AhQgA0KAgICA8AIiBCADQQRqrYQ3AyggAyAEIAOthDcDICADIANBIGo2AhAgA0EIaiACEHAAC2kCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAjYCDCADQZitwAA2AgggA0ICNwIUIANCgICAgPACIgQgA62ENwMoIAMgBCADQQRqrYQ3AyAgAyADQSBqNgIQIANBCGogAhBwAAtpAgF/AX4jAEEwayIDJAAgAyAANgIAIAMgATYCBCADQQI2AgwgA0H4scAANgIIIANCAjcCFCADQoCAgIDwAiIEIANBBGqthDcDKCADIAQgA62ENwMgIAMgA0EgajYCECADQQhqIAIQcAALaQIBfwF+IwBBMGsiAyQAIAMgADYCACADIAE2AgQgA0ECNgIMIANBrLLAADYCCCADQgI3AhQgA0KAgICA8AIiBCADQQRqrYQ3AyggAyAEIAOthDcDICADIANBIGo2AhAgA0EIaiACEHAAC2MBAX8jAEEQayIAJAACfyACKAIABEBBwJXAACEDQQkMAQsgAEEEaiACKAIEIAIoAggQJEHAlcAAIAAoAgggACgCBCICGyEDQQkgACgCDCACGwshAiADIAIgARBaIABBEGokAAtmACMAQTBrIgAkAEGwzsAALQAABEAgAEECNgIMIABB8JXAADYCCCAAQgE3AhQgACABNgIsIAAgAEEsaq1CgICAgPAChDcDICAAIABBIGo2AhAgAEEIakGQlsAAEHAACyAAQTBqJAAL5hoCEn8BfiMAQSBrIg8kAAJ/IAAoAgAiACgCAARAAn8gASEMIwBBMGsiBiQAIAAoAgghESAAKAIEIQggACgCACEOAkACQAJAAkACQANAAkAgESAQIglGBEBBACECDAELIAhFDQYgCSARRyESIAlBAWohECAIQQFrIQcgDiIELQAAIQFBACEAAkACQAJAAkADQAJAIAHAQQBIBEAgAUEfcSECIAAgBGoiBUEBai0AAEE/cSEDIAFB/wFxIg5B3wFNBEAgAkEGdCADciEBDAILIAVBAmotAABBP3EgA0EGdHIhASAOQfABSQRAIAEgAkEMdHIhAQwCCyACQRJ0QYCA8ABxIAVBA2otAABBP3EgAUEGdHJyIgFBgIDEAEcNAQwNCyABQf8BcSEBCwJAAkAgAUEwa0EJTQRAIAAgB0YNDiAAIARqIgJBAWosAAAiAUG/f0oNASACIAggAGsiAEEBIABBwJ3AABCbAQALIAAEQCAAIARqLAAAQb9/TA0CCyAGQRRqIQcgBCECQQAhAwJAAkACQAJAAkACQAJAIAAiAQ4CBAABC0EBIQMgAi0AAEEraw4DAwEDAQsgAi0AAEErRgRAIAJBAWohAiABQQpJIAFBAWsiAyEBDQEMAgsgASEDIAFBCEsNAQtBACEFA0AgAi0AAEEwayIBQQlLBEBBASEDDAMLIAJBAWohAiABIAVBCmxqIQUgA0EBayIDDQALDAILQQAhBQNAIAFFDQIgAi0AAEEwayIOQQlLBEBBASEDDAILQQIhAyAFrUIKfiIUQiCIpw0BIAJBAWohAiABQQFrIQEgDiAUpyIKaiIFIApPDQALCyAHIAM6AAEgB0EBOgAADAELIAcgBTYCBCAHQQA6AAALIAYtABQNAyAIIAYoAhgiBWshCgJAIAVFDQAgCCAAayIBIAVLBEAgBCAFaiAAaiICLAAAQb9/TA0GIAIsAABBv39KDQEgACAEaiABQQAgBUHwncAAEJsBAAsgACAKRw0FCyAAIARqIgEhByAEIAVqIABqIQ4gBUUgECARR3INBiAMKAIcQQRxRQ0GIActAABB6ABHDQYgBUEBRwRAIAFBAWosAABBv39MDQYLIAAgBGpBAWohAQNAQQAhAiABIA5GDQgCfyABLAAAIgNBAE4EQCADQf8BcSEIIAFBAWoMAQsgAS0AAUE/cSENIANBH3EhCCADQV9NBEAgCEEGdCANciEIIAFBAmoMAQsgAS0AAkE/cSANQQZ0ciENIANBcEkEQCANIAhBDHRyIQggAUEDagwBCyAIQRJ0QYCA8ABxIAEtAANBP3EgDUEGdHJyIghBgIDEAEYNCSABQQRqCyEBIAhBMGtBCkkgCEEgckHhAGtBBklyDQALDAYLIABBAWohAAwBCwsgBCAIQQAgAEHQncAAEJsBAAsgBiAGLQAVOgAIQYSbwABBKyAGQQhqQbSfwABBxJ/AABBjAAsgACAEaiABIAUgAUHgncAAEJsBAAsgASAFQQEgBUGgncAAEJsBAAsCQCAJRQ0AIAxBgJ7AAEECEJcBRQ0AIBIhAgwBCwJAIAVBAkkNACAHLwAAQd/IAEcNACAAIARqIgFBAWoiBywAAEG/f0wNAyAFQQFrIQULIAogAGshCANAIAchBAJAAkACQAJAAkACQAJAAkACQAJAIAUiA0UNAAJAIAQtAABBJGsOCwIBAQEBAQEBAQEAAQsgA0EBRg0FIAQsAAFBv39KDQQgBCADQQEgA0GAn8AAEJsBAAsgAyAEaiEJQQAhACAEIQEDQCAAIQIgASIAIAlGDQgCfyAALAAAIgVBAE4EQCAFQf8BcSEFIABBAWoMAQsgAC0AAUE/cSEHIAVBH3EhASAFQV9NBEAgAUEGdCAHciEFIABBAmoMAQsgAC0AAkE/cSAHQQZ0ciEHIAVBcEkEQCAHIAFBDHRyIQUgAEEDagwBCyABQRJ0QYCA8ABxIAAtAANBP3EgB0EGdHJyIQUgAEEEagsiASACIABraiEAIAVBJGsOCwIAAAAAAAAAAAACAAsACyADQQFGDQEgBCwAAUG/f0oNASAEIANBASADQbSewAAQmwEACwJAAkACQCACBEACQCACIANPIgBFBEAgAiAEaiwAAEG/f0wNASAMIAQgAhCXAUUNBEEBIQIMDgsgAiADRg0CCyAEIANBACACQZSewAAQmwEACyAMIAQgAhCXAUUNAkEBIQIMCwsgDCAEIAIQlwFFDQBBASECDAoLIABFBEAgAiAEaiwAAEG/f0oNAQwPCyACIANHDQ4LIAIgBGohByADIAJrIQUMBwsgBiADQQFrIgA2AiQgBkEANgIgIAYgADYCHCAGQSQ2AhQgBkEkNgIoIAZBAToALCAGIARBAWoiADYCGCAGQQhqIAZBFGoQLiAGKAIIQQFHDQQCQCAGKAIMIgJBf0cEQCACQQFqIQEgA0EBRw0BDAULIwBBIGsiACQAIABBADYCGCAAQQE2AgwgAEHYs8AANgIIIABCBDcCECAAQQhqQcSewAAQcAALIAAsAABBv39KDQMMCwsCQAJ/IAQsAAEiAEEATgRAIABB/wFxDAELIAQtAAJBP3EiAiAAQR9xIgFBBnRyIABBX00NABogBC0AA0E/cSACQQZ0ciICIAFBDHRyIABBcEkNABogAUESdEGAgPAAcSAELQAEQT9xIAJBBnRycgtBLkcEQEEBIQIgDEGgn8AAQQEQlwENCCAELAABQUBIDQEMAwsgDEGAnsAAQQIQlwEEQEEBIQIMCAsCQCADQQNPBEAgBCwAAkFASA0BCyAEQQJqIQcgA0ECayEFDAcLIAQgA0ECIANBkJ/AABCbAQALIAQgA0EBIANBpJ/AABCbAQALQQEhAiAMQaCfwABBARCXAQ0FCyAEQQFqIQcgA0EBayEFDAMLAkACQAJAAkAgASADSQRAIAEgBGosAABBQEgNDCACQQJqIQEMAQsgASADRw0LIAJBAmoiAUUNAQsCQCABIANJBEAgASAEaiwAAEG/f0oNAQwLCyABIANHDQoLIAEgBGohByADIAFrIQUCQAJAIAIOAwUBAAILIAAvAABB06ABRgRAQf+ewAAhAAwGCyAALwAAQcKgAUYEQEH+nsAAIQAMBgsgAC8AAEHSjAFGBEBB/Z7AACEADAYLIAAvAABBzKgBRgRAQfyewAAhAAwGCyAALwAAQceoAUYEQEH7nsAAIQAMBgsgAC8AAEHMoAFGBEBB+p7AACEADAYLIAAvAABB0qABRw0BQfmewAAhAAwFCyAALQAAQcMARgRAQfiewAAhAAwFCyAALQAAQfUARg0BDAMLIAQtAAFB9QBHDQIgAkECSQ0BIAQsAAJBv39MDQELIAAgAmohEyACQQFrIQkgBEECaiICIQACQANAQQEhDSAAIBNGDQECfyAALAAAIgFBAE4EQCABQf8BcSEBIABBAWoMAQsgAC0AAUE/cSELIAFBH3EhCiABQV9NBEAgCkEGdCALciEBIABBAmoMAQsgAC0AAkE/cSALQQZ0ciELIAFBcEkEQCALIApBDHRyIQEgAEEDagwBCyAKQRJ0QYCA8ABxIAAtAANBP3EgC0EGdHJyIgFBgIDEAEYNAiAAQQRqCyEAIAFBMGtBCkkgAUHhAGtBBklyDQALQQAhDQsgBkEUaiEKAkACQAJAAkACQAJAAkAgCSIADgIAAQILIApBADoAAQwECyACLQAAIgFBK2sOAwIBAgELIAItAAAhAQsCQAJAAkAgAUH/AXFBK0YEQCAAQQFrIQEgAkEBaiECIABBCUsEQCABIQAMAgsgASIADQJBACEBDAMLIABBCEsNAAwBC0EAIQECQANAIABFDQMgAi0AACILQTBrIglBCk8EQEF/IAtBIHIiCUHXAGsiCyALIAlB4QBrSRsiCUEQTw0FCyABrUIEhiIUQiCIpw0BIAJBAWohAiAAQQFrIQAgCSAUpyILaiIBIAtPDQALIApBAjoAAQwECyAKQQI6AAEMAwtBACEBA0AgAi0AACILQTBrIglBCk8EQEF/IAtBIHIiCUHXAGsiCyALIAlB4QBrSRsiCUEQTw0DCyACQQFqIQIgCSABQQR0aiEBIABBAWsiAA0ACwsgCiABNgIEIApBADoAAAwCCyAKQQE6AAEgCkEBOgAADAELIApBAToAAAsgBi0AFA0BIA1FQYCAxAAgBigCGCIAIABBgLADc0GAgMQAa0GAkLx/SRsiAEGAgMQARnINASAGIAA2AgQgAEEgSSAAQf8Aa0EhSXINASAGQQRqIAwQREUNA0EBIQIMBAsgACACQQEgAkHonsAAEJsBAAsgEiECIAwgBCADEJcBRQ0DDAILQQEhAiAMIABBARCXAUUNAAsLCyAGQTBqJAAgAgwFCyABIAVBASAFQYSewAAQmwEACyAEIAMgASADQdSewAAQmwEACyAEIANBASABQcSewAAQmwEACyAEIAMgAiADQaSewAAQmwEAC0GwncAAELEBAAsMAQsgD0EANgIcIA8gATYCGCAPQgA3AhAgDyAAKQIENwIIIA9BCGpBARASCyAPQSBqJAALmAECA38BbyMAQSBrIgMkACADIAAoAgAQygEiBDYCACADIAI2AgQgAiAERwRAIANBADYCCCADIANBBGogA0EIahB9AAsQnAEiBBCTASIFJQEQBSEGEDMiAiAGJgEgBUGEAU8EQCAFEFgLIAIgACgCACABQQJ2EK0BIAJBhAFPBEAgAhBYCyAEQYQBTwRAIAQQWAsgA0EgaiQAC08BAX8jAEEwayIAJAAgAEEBNgIMIABBqKzAADYCCCAAQgE3AhQgACAAQS9qrUKAgICA8AuENwMgIAAgAEEgajYCECAAQQhqQfyDwAAQcAALQwEDfwJAIAJFDQADQCAALQAAIgQgAS0AACIFRgRAIABBAWohACABQQFqIQEgAkEBayICDQEMAgsLIAQgBWshAwsgAwu0AgEDfyMAQSBrIgIkACACQRBqIgMgAEEQaikCADcDACACQQhqIgQgAEEIaikCADcDACACQQE7ARwgAiABNgIYIAIgACkCADcDACMAQSBrIgAkACACKAIYIQEgAEEQaiADKQIANwMAIABBCGogBCkCADcDACAAIAI2AhwgACABNgIYIAAgAikCADcDAEEAIQIjAEEQayIBJAAgACgCDCEDAkACQAJAAkAgACgCBA4CAAECCyADDQFBASEDDAILIAMNACAAKAIAIgMoAgQhAiADKAIAIQMMAQsgAUGAgICAeDYCACABIAA2AgwgAUHglsAAIAAoAhggACgCHCIALQAcIAAtAB0QUQALIAEgAjYCBCABIAM2AgAgAUHElsAAIAAoAhggACgCHCIALQAcIAAtAB0QUQALQQEBfyACIAAoAgAgACgCCCIDa0sEQCAAIAMgAhBCIAAoAgghAwsgACgCBCADaiABIAIQPBogACACIANqNgIIQQALQQEBfyACIAAoAgAgACgCCCIDa0sEQCAAIAMgAhBIIAAoAgghAwsgACgCBCADaiABIAIQPBogACACIANqNgIIQQALTwECfyAAKAIEIQIgACgCACEDAkAgACgCCCIALQAARQ0AIANB5K7AAEEEIAIoAgwRAQBFDQBBAQ8LIAAgAUEKRjoAACADIAEgAigCEBEAAAtHAQF/IwBBEGsiAiQAIAJBCGogARB5IAIgAigCCCACKAIMKAIYEQIAIAIoAgQhASAAIAIoAgA2AgAgACABNgIEIAJBEGokAAtPAQJ/QbHOwAAtAAAaIAEoAgQhAiABKAIAIQNBCEEEEKQBIgFFBEBBBEEIEMIBAAsgASACNgIEIAEgAzYCACAAQbSWwAA2AgQgACABNgIAC0EBAX8gAiAAKAIAIAAoAggiA2tLBEAgACADIAIQVCAAKAIIIQMLIAAoAgQgA2ogASACEDwaIAAgAiADajYCCEEAC0EBAX8jAEEgayIDJAAgA0EANgIQIANBATYCBCADQgQ3AgggAyABNgIcIAMgADYCGCADIANBGGo2AgAgAyACEHAACz0BAn8gACAAKAIEIgMgAms2AgQgACAAKAIAIAIgA0tyIgQ2AgBBASEDIAQEfyADBSAAKAIIIAEgAhCXAQsLPgEBfyMAQRBrIgIkACACQQhqIAEgASgCACgCBBECACACKAIMIQEgACACKAIINgIAIAAgATYCBCACQRBqJAALxAIBA38gACgCACECIAEoAhwiAEEQcUUEQCAAQSBxRQRAIAIgARCwAQ8LQQAhACMAQYABayIEJAAgAigCACECA0AgACAEakH/AGogAkEPcSIDQTByIANBN2ogA0EKSRs6AAAgAEEBayEAIAJBEEkgAkEEdiECRQ0ACyAAQYABaiICQYEBTwRAIAJB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EFgLICYiIyAqSQ0ACwsgIigCECEjICsoAgBBAWoLNgIAICMQDSEJEDMiCCAJJgEgIiAINgIkICIoAgwhIyAiKAIQISQjAEEgayIlJAAgIkEkaigCACIKJQEQCiEmICUgJDYCBCAlICY2AgACQCAkICZGBEAQnAEiKhCTASImJQEgIyAkEAghCRAzIiMgCSYBICpBhAFPBEAgKhBYCyAmQYQBTwRAICYQWAsgCiUBICMlAUEAEAkgI0GEAU8EQCAjEFgLICVBIGokAAwBCyAlQQA2AgggJSAlQQRqICVBCGoQfQALICIoAggiCgRAICIoAgwgCkECdEEEEK4BCyAiKAIEIgpBhAFPBEAgChBYCyAiQTBqJAAgCAwCCyAjICxB5IbAABBoAAsQbgALIgglASAIEFgLJQAgAEUEQEGcj8AAQTIQtwEACyAAIAIgAyAEIAUgASgCEBEIAAsoACABIAAoAgAtAABBAnQiAEHkp8AAaigCACAAQdCnwABqKAIAEJcBCyMAIABFBEBBnI/AAEEyELcBAAsgACACIAMgBCABKAIQEQkACyMAIABFBEBBnI/AAEEyELcBAAsgACACIAMgBCABKAIQER0ACyMAIABFBEBBnI/AAEEyELcBAAsgACACIAMgBCABKAIQERIACyMAIABFBEBBnI/AAEEyELcBAAsgACACIAMgBCABKAIQER8ACyMAIABFBEBBnI/AAEEyELcBAAsgACACIAMgBCABKAIQESEACygBAX8gACgCACIBQYCAgIB4ckGAgICAeEcEQCAAKAIEIAFBARCuAQsLKAAgAEEcakEAIAJC2anxiMTDnf6/f1EbQQAgAUKX34DY1/KkrypRGwshACAARQRAQZyPwABBMhC3AQALIAAgAiADIAEoAhARAwALHwAgAEUEQEGcj8AAQTIQtwEACyAAIAIgASgCEBEAAAvjFQEMfxAzIgQgASYBAn8gACEGEDMiACACJgEjAEHQAGsiCCQAIAggADYCGCAIIAQ2AhQgCEEUaigCABDJASELQfDNwAAoAgBFBEBBmM7AAEEANgIAQYzOwABBADYCAEGAzsAAQQA2AgBB9M3AAEEANgIAQZTOwAAoAgAhBUGUzsAAQQQ2AgBBkM7AACgCACENQZDOwABBADYCAEGIzsAAKAIAIQNBiM7AAEEENgIAQYTOwAAoAgAh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AgAgARA+Cw4AQbmswABBKyAAEHcACwsAIAApAwAgARA+Cw4AIAFB5IfAAEEFEJcBC6cDAgd/AX4gACgCACEAIwBB0ABrIgIkACACQSBqIAAgACgCACgCBBECACACIAJByABqrUKAgICAwAOENwMoQQEhAyACQQE2AjQgAkGUisAANgIwIAJCATcCPCACIAIpAyA3AkggAiACQShqNgI4AkAgASgCFCIHIAEoAhgiCCACQTBqECkNACABLQAcQQRxRQRAQQAhAwwBCyACQRhqIAAgACgCACgCBBECACACQShqrUKAgICAwAOEIQkgAigCHCEEIAIoAhghBUEAIQBBASEGA0ACQCAAQQFxBEAgBCEBIAUhAAwBCyAFIQAgBCEBA0AgAEUEQEEAIQMMBAsgAkEQaiAAIAEoAhgRAgAgAigCFCEBIAIoAhAhACAGQQFrIgYNAAsLIABBAEchAyAARQ0BIAJBCGogACABKAIYEQIAIAIoAgwhBCACKAIIIQUgAiABNgIsIAIgADYCKEEBIQAgAkEBNgI0IAJBoIrAADYCMCACQgE3AjwgAiAJNwNIIAIgAkHIAGo2AjhBACEGIAcgCCACQTBqEClFDQALCyACQdAAaiQAIAMLDQAgAEHYi8AAIAEQKQsNACAAQYSOwAAgARApCwkAIAAgARAOAAspAAJ/IAAoAgAtAABFBEAgAUH5sMAAQQUQHgwBCyABQf6wwABBBBAeCwsNACAAQbCRwAAgARApC+4BAQZ/An8gACgCACECIwBBgAFrIgQkACABKAIEIQcgASgCACEGIAEoAhwiBSEAAkAgBUEEcUUNACAFQQhyIQAgBg0AIAFCgYCAgKABNwIACyABIABBBHI2AhxBACEAA0AgACAEakH/AGogAkEPcSIDQTByIANB1wBqIANBCkkbOgAAIABBAWshACACQRBJIAJBBHYhAkUNAAsgAEGAAWoiAkGBAUkEQCABQZyvwABBAiAAIARqQYABakEAIABrECEgASAFNgIcIAEgBzYCBCABIAY2AgAgBEGAAWokAAwBCyACQYABQYyvwAAQZgALCwwAIAAgASkCADcDAAsNACABQfCYwABBAhAeCw0AIABBhJzAACABECkLDgAgAUGvm8AAQQUQlwELDgAgAUG8p8AAQRIQlwELDQAgAEHQqcAAIAEQKQsOACABQcipwABBBRCXAQsZACAAIAFBwM7AACgCACIAQTogABsRAgAAC78CAQJ/IwBBEGsiAiQAAkACfwJAIAFBgAFPBEAgAkEANgIMIAFBgBBJDQEgAUGAgARJBEAgAiABQT9xQYABcjoADiACIAFBDHZB4AFyOgAMIAIgAUEGdkE/cUGAAXI6AA1BAwwDCyACIAFBP3FBgAFyOgAPIAIgAUESdkHwAXI6AAwgAiABQQZ2QT9xQYABcjoADiACIAFBDHZBP3FBgAFyOgANQQQMAgsgACgCCCIDIAAoAgBGBEAgABBTCyAAIANBAWo2AgggACgCBCADaiABOgAADAILIAIgAUE/cUGAAXI6AA0gAiABQQZ2QcABcjoADEECCyEBIAEgACgCACAAKAIIIgNrSwRAIAAgAyABEFQgACgCCCEDCyAAKAIEIANqIAJBDGogARA8GiAAIAEgA2o2AggLIAJBEGokAEEACw0AIABBzK7AACABECkLCgAgAiAAIAEQHguQBQEHfwJAAn8CQCACIgUgACABa0sEQCABIAJqIQMgACACaiECIAAgBUEQSQ0CGiACQXxxIQRBACACQQNxIgZrIQcgBgRAIANBAWshAANAIAJBAWsiAiAALQAAOgAAIABBAWshACACIARLDQALCyAEIAUgBmsiBkF8cSIFayECIAMgB2oiA0EDcQRAIAVBAEwNAiADQQN0IgBBGHEhByADQXxxIghBBGshAUEAIABrQRhxIQkgCCgCACEAA0AgBEEEayIEIAAgCXQgASgCACIAIAd2cjYCACABQQRrIQEgAiAESQ0ACwwCCyAFQQBMDQEgASAGakEEayEBA0AgBEEEayIEIAEoAgA2AgAgAUEEayEBIAIgBEkNAAsMAQsCQCAFQRBJBEAgACECDAELIABBACAAa0EDcSIDaiEEIAMEQCAAIQIgASEAA0AgAiAALQAAOgAAIABBAWohACACQQFqIgIgBEkNAAsLIAQgBSADayIFQXxxIgZqIQICQCABIANqIgNBA3EEQCAGQQBMDQEgA0EDdCIAQRhxIQcgA0F8cSIIQQRqIQFBACAAa0EYcSEJIAgoAgAhAANAIAQgACAHdiABKAIAIgAgCXRyNgIAIAFBBGohASAEQQRqIgQgAkkNAAsMAQsgBkEATA0AIAMhAQNAIAQgASgCADYCACABQQRqIQEgBEEE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AAAAMwAAACADEAAcAAAAJwAAAC0AAAABAAAAAAAAACADEAAcAAAAPwAAACgAAAAvcnVzdGMvZjZlNTExZWVjNzM0MmY1OWEyNWY3YzA1MzRmMWRiZWEwMGQwMWIxNC9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL2luZGV4LnJzAHQDEABPAAAAbwMAADQAAAB0AxAATwAAAHYDAAAyAAAARXJyb3Jhc3NlcnRpb24gZmFpbGVkOiBzZWxmLmlzX2NoYXJfYm91bmRhcnkobmV3X2xlbikvcnVzdGMvZjZlNTExZWVjNzM0MmY1OWEyNWY3YzA1MzRmMWRiZWEwMGQwMWIxNC9saWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMZBBAASwAAAH8FAAANAAAAAAAAABAAAAAEAAAAHgAAAB8AAAAgAAAAYmFja3RyYWNlIGNhcHR1cmUgZmFpbGVkL1VzZXJzL2FzdW5kcXVpLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvYW55aG93LTEuMC45OC9zcmMvZXJyb3IucnMApAQQAF8AAABnBAAADgAAAAEAAAAAAAAAOiAAABwFEAACAAAACgpDYXVzZWQgYnk6CgAAACEAAAAMAAAABAAAACIAAAAjAAAAJAAAAAoKc3RhY2sgYmFja3RyYWNlOlN0YWNrIGJhY2t0cmFjZToKAGIFEAARAAAAUwBBiIvAAAuNBgEAAAAlAAAAYSBEaXNwbGF5IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yIHVuZXhwZWN0ZWRseQAZBBAASwAAAAYKAAAOAAAAAAAAABAAAAAEAAAAHgAAAB8AAAAgAAAAICAgIDogAAABAAAAAAAAAPQFEAACAAAAICAgICAgIC9ydXN0Yy9mNmU1MTFlZWM3MzQyZjU5YTI1ZjdjMDUzNGYxZGJlYTAwZDAxYjE0L2xpYnJhcnkvYWxsb2Mvc3JjL3ZlYy9tb2QucnMADwYQAEwAAACfCAAAJAAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuaXNfY2hhcl9ib3VuZGFyeShuKS9ydXN0Yy9mNmU1MTFlZWM3MzQyZjU5YTI1ZjdjMDUzNGYxZGJlYTAwZDAxYjE0L2xpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwAAAJYGEABLAAAAfwcAAB0AAACWBhAASwAAAIcHAAAdAAAAJgAAAAwAAAAEAAAAJwAAACgAAAAkAAAAL1VzZXJzL2FzdW5kcXVpLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvanMtc3lzLTAuMy43Ny9zcmMvbGliLnJzAAAAHAcQAF0AAAD7GAAAAQAAAAAAAAAEAAAABAAAADUAAABjbG9zdXJlIGludm9rZWQgcmVjdXJzaXZlbHkgb3IgYWZ0ZXIgYmVpbmcgZHJvcHBlZExhenkgaW5zdGFuY2UgaGFzIHByZXZpb3VzbHkgYmVlbiBwb2lzb25lZM4HEAAqAAAAL1VzZXJzL2FzdW5kcXVpLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvb25jZV9jZWxsLTEuMjEuMy9zcmMvbGliLnJzAAgQAGAAAAAIAwAAGQAAAHJlZW50cmFudCBpbml0AABwCBAADgAAAAAIEABgAAAAegIAAA0AQaCRwAALkQ8EAAAABAAAADsAAAA6AAAAPAAAAAwAAAAEAAAAPQAAAD4AAAA/AAAAL3J1c3QvZGVwcy9kbG1hbGxvYy0wLjIuNi9zcmMvZGxtYWxsb2MucnNhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA+PSBzaXplICsgbWluX292ZXJoZWFkAMgIEAApAAAAqAQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAADICBAAKQAAAK4EAAANAAAAc3RkL3NyYy9iYWNrdHJhY2UucnNvcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JthAkQACgAAAAkAAAAAgAAAKwJEAB1bnN1cHBvcnRlZCBiYWNrdHJhY2VkaXNhYmxlZCBiYWNrdHJhY2UAcAkQABQAAACKAQAAHQAAAEAAAAAQAAAABAAAAEEAAABCAAAAAQAAAAAAAAA6IHN0ZC9zcmMvc3luYy9sYXp5X2xvY2sucnMAFgoQABkAAACcAAAAEwAAAGNhbm5vdCByZWN1cnNpdmVseSBhY3F1aXJlIG11dGV4QAoQACAAAABzdGQvc3JjL3N5cy9zeW5jL211dGV4L25vX3RocmVhZHMucnNoChAAJAAAABQAAAAJAAAAc3RkL3NyYy9zeW5jL29uY2UucnOcChAAFAAAAJ4AAAAyAAAAPHVua25vd24+77+9bWVtb3J5IGFsbG9jYXRpb24gb2YgIGJ5dGVzIGZhaWxlZAAAzAoQABUAAADhChAADQAAAHN0ZC9zcmMvYWxsb2MucnMACxAAEAAAAGMBAAAJAAAACgAAADwAAAAMAAAABAAAAEMAAAAAAAAACAAAAAQAAABEAAAAAAAAAAgAAAAEAAAARQAAAEYAAABHAAAASAAAAEkAAAAQAAAABAAAAEoAAABLAAAATAAAAE0AAABzdGQvc3JjLy4uLy4uL2JhY2t0cmFjZS9zcmMvc3ltYm9saXplL21vZC5yc3wLEAAsAAAAZwEAADAAAAABAAAAAAAAABQKEAACAAAAIC0gAAEAAAAAAAAAyAsQAAMAAAAgICAgICAgICAgICAgICAgICAgYXQgAACsCBAAAQAAAE9uY2UgaW5zdGFuY2UgaGFzIHByZXZpb3VzbHkgYmVlbiBwb2lzb25lZAAA/AsQACoAAABvbmUtdGltZSBpbml0aWFsaXphdGlvbiBtYXkgbm90IGJlIHBlcmZvcm1lZCByZWN1cnNpdmVseTAMEAA4AAAAKCkAAAAAAAAEAAAABAAAAFEAAAAvcnVzdGMvZjZlNTExZWVjNzM0MmY1OWEyNWY3YzA1MzRmMWRiZWEwMGQwMWIxNC9saWJyYXJ5L2NvcmUvc3JjL29wcy9mdW5jdGlvbi5yc4QMEABQAAAApgAAAAUAAAAvcnVzdGMvZjZlNTExZWVjNzM0MmY1OWEyNWY3YzA1MzRmMWRiZWEwMGQwMWIxNC9saWJyYXJ5L2NvcmUvc3JjL3N0ci9wYXR0ZXJuLnJzAOQMEABPAAAAyAUAABQAAADkDBAATwAAAMgFAAAhAAAA5AwQAE8AAAC8BQAAIQAAADAxMjM0NTY3ODlhYmNkZWYAAAAAAAAAAAEAAABSAAAAY2FsbGVkIGBSZXN1bHQ6OnVud3JhcCgpYCBvbiBhbiBgRXJyYCB2YWx1ZUVycm9yRW1wdHlJbnZhbGlkRGlnaXRQb3NPdmVyZmxvd05lZ092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AFwAAABdAAAAY2FwYWNpdHkgb3ZlcmZsb3cAAADoFBAAEQAAAGFsbG9jL3NyYy9yYXdfdmVjLnJzBBUQABQAAAAYAAAABQBBsKrAAAuwCgEAAABeAAAAYSBmb3JtYXR0aW5nIHRyYWl0IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yIHdoZW4gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGRpZCBub3RhbGxvYy9zcmMvZm10LnJzAACOFRAAEAAAAH4CAAAOAAAAZnJvbV9zdHJfcmFkaXhfaW50OiBtdXN0IGxpZSBpbiB0aGUgcmFuZ2UgYFsyLCAzNl1gIC0gZm91bmQgsBUQADwAAAAuLjAxMjM0NTY3ODlhYmNkZWZCb3Jyb3dNdXRFcnJvcmFscmVhZHkgYm9ycm93ZWQ6IAAAFBYQABIAAAABAAAAAAAAAFtjYWxsZWQgYE9wdGlvbjo6dW53cmFwKClgIG9uIGEgYE5vbmVgIHZhbHVlaW5kZXggb3V0IG9mIGJvdW5kczogdGhlIGxlbiBpcyAgYnV0IHRoZSBpbmRleCBpcyAAAGQWEAAgAAAAhBYQABIAAAA9PSE9bWF0Y2hlc2Fzc2VydGlvbiBgbGVmdCAgcmlnaHRgIGZhaWxlZAogIGxlZnQ6IAogcmlnaHQ6IACzFhAAEAAAAMMWEAAXAAAA2hYQAAkAAAAgcmlnaHRgIGZhaWxlZDogCiAgbGVmdDogAAAAsxYQABAAAAD8FhAAEAAAAAwXEAAJAAAA2hYQAAkAAAA6IAAAAQAAAAAAAAA4FxAAAgAAAAAAAAAMAAAABAAAAGUAAABmAAAAZwAAACAgICAgeyAsICB7CiwKfSB9Cl1jb3JlL3NyYy9mbXQvbnVtLnJzAAB3FxAAEwAAAGYAAAAXAAAAMHgwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5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",self.location.href));const A=Rn();(typeof g=="string"||typeof Request=="function"&&g instanceof Request||typeof URL=="function"&&g instanceof URL)&&(g=fetch(g));const{instance:t,module:e}=await kn(await g,A);return Un(t,e)}var QA=Uint8Array,Dt=Uint16Array,Gn=Int32Array,ji=new QA([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]),$i=new QA([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]),bn=new QA([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),As=function(g,A){for(var t=new Dt(31),e=0;e<31;++e)t[e]=A+=1<<g[e-1];for(var i=new Gn(t[30]),e=1;e<30;++e)for(var s=t[e];s<t[e+1];++s)i[s]=s-t[e]<<5|e;return{b:t,r:i}},ts=As(ji,2),es=ts.b,Ln=ts.r;es[28]=258,Ln[258]=28;for(var Yn=As($i,0),Jn=Yn.b,ri=new Dt(32768),j=0;j<32768;++j){var st=(j&43690)>>1|(j&21845)<<1;st=(st&52428)>>2|(st&13107)<<2,st=(st&61680)>>4|(st&3855)<<4,ri[j]=((st&65280)>>8|(st&255)<<8)>>1}for(var Xt=function(g,A,t){for(var e=g.length,i=0,s=new Dt(A);i<e;++i)g[i]&&++s[g[i]-1];var n=new Dt(A);for(i=1;i<A;++i)n[i]=n[i-1]+s[i-1]<<1;var r;if(t){r=new Dt(1<<A);var a=15-A;for(i=0;i<e;++i)if(g[i])for(var o=i<<4|g[i],B=A-g[i],I=n[g[i]-1]++<<B,Q=I|(1<<B)-1;I<=Q;++I)r[ri[I]>>a]=o}else for(r=new Dt(e),i=0;i<e;++i)g[i]&&(r[i]=ri[n[g[i]-1]++]>>15-g[i]);return r},jt=new QA(288),j=0;j<144;++j)jt[j]=8;for(var j=144;j<256;++j)jt[j]=9;for(var j=256;j<280;++j)jt[j]=7;for(var j=280;j<288;++j)jt[j]=8;for(var is=new QA(32),j=0;j<32;++j)is[j]=5;var Hn=Xt(jt,9,1),Tn=Xt(is,5,1),ai=function(g){for(var A=g[0],t=1;t<g.length;++t)g[t]>A&&(A=g[t]);return A},bA=function(g,A,t){var e=A/8|0;return(g[e]|g[e+1]<<8)>>(A&7)&t},gi=function(g,A){var t=A/8|0;return(g[t]|g[t+1]<<8|g[t+2]<<16)>>(A&7)},ss=function(g){return(g+7)/8|0},fe=function(g,A,t){return(A==null||A<0)&&(A=0),(t==null||t>g.length)&&(t=g.length),new QA(g.subarray(A,t))},zn=["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"],kA=function(g,A,t){var e=new Error(A||zn[g]);if(e.code=g,Error.captureStackTrace&&Error.captureStackTrace(e,kA),!t)throw e;return e},vn=function(g,A,t,e){var i=g.length,s=0;if(!i||A.f&&!A.l)return t||new QA(0);var n=!t,r=n||A.i!=2,a=A.i;n&&(t=new QA(i*3));var o=function(hA){var aA=t.length;if(hA>aA){var Y=new QA(Math.max(aA*2,hA));Y.set(t),t=Y}},B=A.f||0,I=A.p||0,Q=A.b||0,h=A.l,E=A.d,C=A.m,c=A.n,l=i*8;do{if(!h){B=bA(g,I,1);var y=bA(g,I+1,3);if(I+=3,y)if(y==1)h=Hn,E=Tn,C=9,c=5;else if(y==2){var m=bA(g,I,31)+257,x=bA(g,I+10,15)+4,w=m+bA(g,I+5,31)+1;I+=14;for(var D=new QA(w),N=new QA(19),M=0;M<x;++M)N[bn[M]]=bA(g,I+M*3,7);I+=x*3;for(var S=ai(N),F=(1<<S)-1,k=Xt(N,S,1),M=0;M<w;){var U=k[bA(g,I,F)];I+=U&15;var d=U>>4;if(d<16)D[M++]=d;else{var R=0,G=0;for(d==16?(G=3+bA(g,I,3),I+=2,R=D[M-1]):d==17?(G=3+bA(g,I,7),I+=3):d==18&&(G=11+bA(g,I,127),I+=7);G--;)D[M++]=R}}var v=D.subarray(0,m),T=D.subarray(m);C=ai(v),c=ai(T),h=Xt(v,C,1),E=Xt(T,c,1)}else kA(1);else{var d=ss(I)+4,f=g[d-4]|g[d-3]<<8,p=d+f;if(p>i){a&&kA(0);break}r&&o(Q+f),t.set(g.subarray(d,p),Q),A.b=Q+=f,A.p=I=p*8,A.f=B;continue}if(I>l){a&&kA(0);break}}r&&o(Q+131072);for(var $=(1<<C)-1,V=(1<<c)-1,X=I;;X=I){var R=h[gi(g,I)&$],K=R>>4;if(I+=R&15,I>l){a&&kA(0);break}if(R||kA(2),K<256)t[Q++]=K;else if(K==256){X=I,h=null;break}else{var Z=K-254;if(K>264){var M=K-257,W=ji[M];Z=bA(g,I,(1<<W)-1)+es[M],I+=W}var q=E[gi(g,I)&V],b=q>>4;q||kA(3),I+=q&15;var T=Jn[b];if(b>3){var W=$i[b];T+=gi(g,I)&(1<<W)-1,I+=W}if(I>l){a&&kA(0);break}r&&o(Q+131072);var DA=Q+Z;if(Q<T){var dA=s-T,J=Math.min(T,DA);for(dA+Q<0&&kA(3);Q<J;++Q)t[Q]=e[dA+Q]}for(;Q<DA;++Q)t[Q]=t[Q-T]}}A.l=h,A.p=X,A.b=Q,A.f=B,h&&(B=1,A.m=C,A.d=E,A.n=c)}while(!B);return Q!=t.length&&n?fe(t,0,Q):t.subarray(0,Q)},Kn=new QA(0),_n=function(g){(g[0]!=31||g[1]!=139||g[2]!=8)&&kA(6,"invalid gzip data");var A=g[3],t=10;A&4&&(t+=(g[10]|g[11]<<8)+2);for(var e=(A>>3&1)+(A>>4&1);e>0;e-=!g[t++]);return t+(A&2)},oi=function(){function g(A,t){typeof A=="function"&&(t=A,A={}),this.ondata=t;var e=A&&A.dictionary&&A.dictionary.subarray(-32768);this.s={i:0,b:e?e.length:0},this.o=new QA(32768),this.p=new QA(0),e&&this.o.set(e)}return g.prototype.e=function(A){if(this.ondata||kA(5),this.d&&kA(4),!this.p.length)this.p=A;else if(A.length){var t=new QA(this.p.length+A.length);t.set(this.p),t.set(A,this.p.length),this.p=t}},g.prototype.c=function(A){this.s.i=+(this.d=A||!1);var t=this.s.b,e=vn(this.p,this.s,this.o);this.ondata(fe(e,t,this.s.b),this.d),this.o=fe(e,this.s.b-32768),this.s.b=this.o.length,this.p=fe(this.p,this.s.p/8|0),this.s.p&=7},g.prototype.push=function(A,t){this.e(A),this.c(t)},g}(),ns=function(){function g(A,t){this.v=1,this.r=0,oi.call(this,A,t)}return g.prototype.push=function(A,t){if(oi.prototype.e.call(this,A),this.r+=A.length,this.v){var e=this.p.subarray(this.v-1),i=e.length>3?_n(e):4;if(i>e.length){if(!t)return}else this.v>1&&this.onmember&&this.onmember(this.r-e.length);this.p=e.subarray(i),this.v=0}oi.prototype.c.call(this,t),this.s.f&&!this.s.l&&!t&&(this.v=ss(this.s.p)+9,this.s={i:0},this.o=new QA(0),this.push(new QA(0),t))},g}(),qn=typeof TextDecoder<"u"&&new TextDecoder,Zn=0;try{qn.decode(Kn,{stream:!0}),Zn=1}catch{}/**\n * @license\n * Copyright 2010-2024 Three.js Authors\n * SPDX-License-Identifier: MIT\n */const rs="172",Ii=0,Wn=1,as=1,gs=100,os=204,Is=205,Bs=3,Pn=0,Qs=300,hs=1e3,$t=1001,Es=1002,nt=1003,Cs=1006,On=1008,we=1009,ct=1014,Vn=1015,pe=1023,Xn=1031,mt=1033,cs="",LA="srgb",ls="srgb-linear",us="linear",Bi="srgb",xt=7680,ds=519,ys=35044,jn="300 es",Ae=2e3,fs=2001;class te{addEventListener(A,t){this._listeners===void 0&&(this._listeners={});const e=this._listeners;e[A]===void 0&&(e[A]=[]),e[A].indexOf(t)===-1&&e[A].push(t)}hasEventListener(A,t){if(this._listeners===void 0)return!1;const e=this._listeners;return e[A]!==void 0&&e[A].indexOf(t)!==-1}removeEventListener(A,t){if(this._listeners===void 0)return;const i=this._listeners[A];if(i!==void 0){const s=i.indexOf(t);s!==-1&&i.splice(s,1)}}dispatchEvent(A){if(this._listeners===void 0)return;const e=this._listeners[A.type];if(e!==void 0){A.target=this;const i=e.slice(0);for(let s=0,n=i.length;s<n;s++)i[s].call(this,A);A.target=null}}}const EA=["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f","50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f","60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f","70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f","80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f","90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df","e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff"];function ee(){const g=Math.random()*4294967295|0,A=Math.random()*4294967295|0,t=Math.random()*4294967295|0,e=Math.random()*4294967295|0;return(EA[g&255]+EA[g>>8&255]+EA[g>>16&255]+EA[g>>24&255]+"-"+EA[A&255]+EA[A>>8&255]+"-"+EA[A>>16&15|64]+EA[A>>24&255]+"-"+EA[t&63|128]+EA[t>>8&255]+"-"+EA[t>>16&255]+EA[t>>24&255]+EA[e&255]+EA[e>>8&255]+EA[e>>16&255]+EA[e>>24&255]).toLowerCase()}function H(g,A,t){return Math.max(A,Math.min(t,g))}function $n(g,A){return(g%A+A)%A}function Qi(g,A,t){return(1-t)*g+t*A}function ie(g,A){switch(A.constructor){case Float32Array:return g;case Uint32Array:return g/4294967295;case Uint16Array:return g/65535;case Uint8Array:return g/255;case Int32Array:return Math.max(g/2147483647,-1);case Int16Array:return Math.max(g/32767,-1);case Int8Array:return Math.max(g/127,-1);default:throw new Error("Invalid component type.")}}function yA(g,A){switch(A.constructor){case Float32Array:return g;case Uint32Array:return Math.round(g*4294967295);case Uint16Array:return Math.round(g*65535);case Uint8Array:return Math.round(g*255);case Int32Array:return Math.round(g*2147483647);case Int16Array:return Math.round(g*32767);case Int8Array:return Math.round(g*127);default:throw new Error("Invalid component type.")}}class fA{constructor(A=0,t=0){fA.prototype.isVector2=!0,this.x=A,this.y=t}get width(){return this.x}set width(A){this.x=A}get height(){return this.y}set height(A){this.y=A}set(A,t){return this.x=A,this.y=t,this}setScalar(A){return this.x=A,this.y=A,this}setX(A){return this.x=A,this}setY(A){return this.y=A,this}setComponent(A,t){switch(A){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("index is out of range: "+A)}return this}getComponent(A){switch(A){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+A)}}clone(){return new this.constructor(this.x,this.y)}copy(A){return this.x=A.x,this.y=A.y,this}add(A){return this.x+=A.x,this.y+=A.y,this}addScalar(A){return this.x+=A,this.y+=A,this}addVectors(A,t){return this.x=A.x+t.x,this.y=A.y+t.y,this}addScaledVector(A,t){return this.x+=A.x*t,this.y+=A.y*t,this}sub(A){return this.x-=A.x,this.y-=A.y,this}subScalar(A){return this.x-=A,this.y-=A,this}subVectors(A,t){return this.x=A.x-t.x,this.y=A.y-t.y,this}multiply(A){return this.x*=A.x,this.y*=A.y,this}multiplyScalar(A){return this.x*=A,this.y*=A,this}divide(A){return this.x/=A.x,this.y/=A.y,this}divideScalar(A){return this.multiplyScalar(1/A)}applyMatrix3(A){const t=this.x,e=this.y,i=A.elements;return this.x=i[0]*t+i[3]*e+i[6],this.y=i[1]*t+i[4]*e+i[7],this}min(A){return this.x=Math.min(this.x,A.x),this.y=Math.min(this.y,A.y),this}max(A){return this.x=Math.max(this.x,A.x),this.y=Math.max(this.y,A.y),this}clamp(A,t){return this.x=H(this.x,A.x,t.x),this.y=H(this.y,A.y,t.y),this}clampScalar(A,t){return this.x=H(this.x,A,t),this.y=H(this.y,A,t),this}clampLength(A,t){const e=this.length();return this.divideScalar(e||1).multiplyScalar(H(e,A,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(A){return this.x*A.x+this.y*A.y}cross(A){return this.x*A.y-this.y*A.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(A){const t=Math.sqrt(this.lengthSq()*A.lengthSq());if(t===0)return Math.PI/2;const e=this.dot(A)/t;return Math.acos(H(e,-1,1))}distanceTo(A){return Math.sqrt(this.distanceToSquared(A))}distanceToSquared(A){const t=this.x-A.x,e=this.y-A.y;return t*t+e*e}manhattanDistanceTo(A){return Math.abs(this.x-A.x)+Math.abs(this.y-A.y)}setLength(A){return this.normalize().multiplyScalar(A)}lerp(A,t){return this.x+=(A.x-this.x)*t,this.y+=(A.y-this.y)*t,this}lerpVectors(A,t,e){return this.x=A.x+(t.x-A.x)*e,this.y=A.y+(t.y-A.y)*e,this}equals(A){return A.x===this.x&&A.y===this.y}fromArray(A,t=0){return this.x=A[t],this.y=A[t+1],this}toArray(A=[],t=0){return A[t]=this.x,A[t+1]=this.y,A}fromBufferAttribute(A,t){return this.x=A.getX(t),this.y=A.getY(t),this}rotateAround(A,t){const e=Math.cos(t),i=Math.sin(t),s=this.x-A.x,n=this.y-A.y;return this.x=s*e-n*i+A.x,this.y=s*i+n*e+A.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class qA{constructor(A,t,e,i,s,n,r,a,o){qA.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],A!==void 0&&this.set(A,t,e,i,s,n,r,a,o)}set(A,t,e,i,s,n,r,a,o){const B=this.elements;return B[0]=A,B[1]=i,B[2]=r,B[3]=t,B[4]=s,B[5]=a,B[6]=e,B[7]=n,B[8]=o,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(A){const t=this.elements,e=A.elements;return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],this}extractBasis(A,t,e){return A.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),e.setFromMatrix3Column(this,2),this}setFromMatrix4(A){const t=A.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(A){return this.multiplyMatrices(this,A)}premultiply(A){return this.multiplyMatrices(A,this)}multiplyMatrices(A,t){const e=A.elements,i=t.elements,s=this.elements,n=e[0],r=e[3],a=e[6],o=e[1],B=e[4],I=e[7],Q=e[2],h=e[5],E=e[8],C=i[0],c=i[3],l=i[6],y=i[1],d=i[4],f=i[7],p=i[2],m=i[5],x=i[8];return s[0]=n*C+r*y+a*p,s[3]=n*c+r*d+a*m,s[6]=n*l+r*f+a*x,s[1]=o*C+B*y+I*p,s[4]=o*c+B*d+I*m,s[7]=o*l+B*f+I*x,s[2]=Q*C+h*y+E*p,s[5]=Q*c+h*d+E*m,s[8]=Q*l+h*f+E*x,this}multiplyScalar(A){const t=this.elements;return t[0]*=A,t[3]*=A,t[6]*=A,t[1]*=A,t[4]*=A,t[7]*=A,t[2]*=A,t[5]*=A,t[8]*=A,this}determinant(){const A=this.elements,t=A[0],e=A[1],i=A[2],s=A[3],n=A[4],r=A[5],a=A[6],o=A[7],B=A[8];return t*n*B-t*r*o-e*s*B+e*r*a+i*s*o-i*n*a}invert(){const A=this.elements,t=A[0],e=A[1],i=A[2],s=A[3],n=A[4],r=A[5],a=A[6],o=A[7],B=A[8],I=B*n-r*o,Q=r*a-B*s,h=o*s-n*a,E=t*I+e*Q+i*h;if(E===0)return this.set(0,0,0,0,0,0,0,0,0);const C=1/E;return A[0]=I*C,A[1]=(i*o-B*e)*C,A[2]=(r*e-i*n)*C,A[3]=Q*C,A[4]=(B*t-i*a)*C,A[5]=(i*s-r*t)*C,A[6]=h*C,A[7]=(e*a-o*t)*C,A[8]=(n*t-e*s)*C,this}transpose(){let A;const t=this.elements;return A=t[1],t[1]=t[3],t[3]=A,A=t[2],t[2]=t[6],t[6]=A,A=t[5],t[5]=t[7],t[7]=A,this}getNormalMatrix(A){return this.setFromMatrix4(A).invert().transpose()}transposeIntoArray(A){const t=this.elements;return A[0]=t[0],A[1]=t[3],A[2]=t[6],A[3]=t[1],A[4]=t[4],A[5]=t[7],A[6]=t[2],A[7]=t[5],A[8]=t[8],this}setUvTransform(A,t,e,i,s,n,r){const a=Math.cos(s),o=Math.sin(s);return this.set(e*a,e*o,-e*(a*n+o*r)+n+A,-i*o,i*a,-i*(-o*n+a*r)+r+t,0,0,1),this}scale(A,t){return this.premultiply(hi.makeScale(A,t)),this}rotate(A){return this.premultiply(hi.makeRotation(-A)),this}translate(A,t){return this.premultiply(hi.makeTranslation(A,t)),this}makeTranslation(A,t){return A.isVector2?this.set(1,0,A.x,0,1,A.y,0,0,1):this.set(1,0,A,0,1,t,0,0,1),this}makeRotation(A){const t=Math.cos(A),e=Math.sin(A);return this.set(t,-e,0,e,t,0,0,0,1),this}makeScale(A,t){return this.set(A,0,0,0,t,0,0,0,1),this}equals(A){const t=this.elements,e=A.elements;for(let i=0;i<9;i++)if(t[i]!==e[i])return!1;return!0}fromArray(A,t=0){for(let e=0;e<9;e++)this.elements[e]=A[e+t];return this}toArray(A=[],t=0){const e=this.elements;return A[t]=e[0],A[t+1]=e[1],A[t+2]=e[2],A[t+3]=e[3],A[t+4]=e[4],A[t+5]=e[5],A[t+6]=e[6],A[t+7]=e[7],A[t+8]=e[8],A}clone(){return new this.constructor().fromArray(this.elements)}}const hi=new qA;function Ar(g){for(let A=g.length-1;A>=0;--A)if(g[A]>=65535)return!0;return!1}function ws(g){return document.createElementNS("http://www.w3.org/1999/xhtml",g)}const ps=new qA().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),Ds=new qA().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function tr(){const g={enabled:!0,workingColorSpace:ls,spaces:{},convert:function(i,s,n){return this.enabled===!1||s===n||!s||!n||(this.spaces[s].transfer===Bi&&(i.r=WA(i.r),i.g=WA(i.g),i.b=WA(i.b)),this.spaces[s].primaries!==this.spaces[n].primaries&&(i.applyMatrix3(this.spaces[s].toXYZ),i.applyMatrix3(this.spaces[n].fromXYZ)),this.spaces[n].transfer===Bi&&(i.r=Mt(i.r),i.g=Mt(i.g),i.b=Mt(i.b))),i},fromWorkingColorSpace:function(i,s){return this.convert(i,this.workingColorSpace,s)},toWorkingColorSpace:function(i,s){return this.convert(i,s,this.workingColorSpace)},getPrimaries:function(i){return this.spaces[i].primaries},getTransfer:function(i){return i===cs?us:this.spaces[i].transfer},getLuminanceCoefficients:function(i,s=this.workingColorSpace){return i.fromArray(this.spaces[s].luminanceCoefficients)},define:function(i){Object.assign(this.spaces,i)},_getMatrix:function(i,s,n){return i.copy(this.spaces[s].toXYZ).multiply(this.spaces[n].fromXYZ)},_getDrawingBufferColorSpace:function(i){return this.spaces[i].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(i=this.workingColorSpace){return this.spaces[i].workingColorSpaceConfig.unpackColorSpace}},A=[.64,.33,.3,.6,.15,.06],t=[.2126,.7152,.0722],e=[.3127,.329];return g.define({[ls]:{primaries:A,whitePoint:e,transfer:us,toXYZ:ps,fromXYZ:Ds,luminanceCoefficients:t,workingColorSpaceConfig:{unpackColorSpace:LA},outputColorSpaceConfig:{drawingBufferColorSpace:LA}},[LA]:{primaries:A,whitePoint:e,transfer:Bi,toXYZ:ps,fromXYZ:Ds,luminanceCoefficients:t,outputColorSpaceConfig:{drawingBufferColorSpace:LA}}}),g}const YA=tr();function WA(g){return g<.04045?g*.0773993808:Math.pow(g*.9478672986+.0521327014,2.4)}function Mt(g){return g<.0031308?g*12.92:1.055*Math.pow(g,.41666)-.055}let St;class er{static getDataURL(A){if(/^data:/i.test(A.src)||typeof HTMLCanvasElement>"u")return A.src;let t;if(A instanceof HTMLCanvasElement)t=A;else{St===void 0&&(St=ws("canvas")),St.width=A.width,St.height=A.height;const e=St.getContext("2d");A instanceof ImageData?e.putImageData(A,0,0):e.drawImage(A,0,0,A.width,A.height),t=St}return t.width>2048||t.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",A),t.toDataURL("image/jpeg",.6)):t.toDataURL("image/png")}static sRGBToLinear(A){if(typeof HTMLImageElement<"u"&&A instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&A instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&A instanceof ImageBitmap){const t=ws("canvas");t.width=A.width,t.height=A.height;const e=t.getContext("2d");e.drawImage(A,0,0,A.width,A.height);const i=e.getImageData(0,0,A.width,A.height),s=i.data;for(let n=0;n<s.length;n++)s[n]=WA(s[n]/255)*255;return e.putImageData(i,0,0),t}else if(A.data){const t=A.data.slice(0);for(let e=0;e<t.length;e++)t instanceof Uint8Array||t instanceof Uint8ClampedArray?t[e]=Math.floor(WA(t[e]/255)*255):t[e]=WA(t[e]);return{data:t,width:A.width,height:A.height}}else return console.warn("THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied."),A}}let ir=0;class ms{constructor(A=null){this.isSource=!0,Object.defineProperty(this,"id",{value:ir++}),this.uuid=ee(),this.data=A,this.dataReady=!0,this.version=0}set needsUpdate(A){A===!0&&this.version++}toJSON(A){const t=A===void 0||typeof A=="string";if(!t&&A.images[this.uuid]!==void 0)return A.images[this.uuid];const e={uuid:this.uuid,url:""},i=this.data;if(i!==null){let s;if(Array.isArray(i)){s=[];for(let n=0,r=i.length;n<r;n++)i[n].isDataTexture?s.push(Ei(i[n].image)):s.push(Ei(i[n]))}else s=Ei(i);e.url=s}return t||(A.images[this.uuid]=e),e}}function Ei(g){return typeof HTMLImageElement<"u"&&g instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&g instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&g instanceof ImageBitmap?er.getDataURL(g):g.data?{data:Array.from(g.data),width:g.width,height:g.height,type:g.data.constructor.name}:(console.warn("THREE.Texture: Unable to serialize Texture."),{})}let sr=0;class ZA extends te{constructor(A=ZA.DEFAULT_IMAGE,t=ZA.DEFAULT_MAPPING,e=$t,i=$t,s=Cs,n=On,r=pe,a=we,o=ZA.DEFAULT_ANISOTROPY,B=cs){super(),this.isTexture=!0,Object.defineProperty(this,"id",{value:sr++}),this.uuid=ee(),this.name="",this.source=new ms(A),this.mipmaps=[],this.mapping=t,this.channel=0,this.wrapS=e,this.wrapT=i,this.magFilter=s,this.minFilter=n,this.anisotropy=o,this.format=r,this.internalFormat=null,this.type=a,this.offset=new fA(0,0),this.repeat=new fA(1,1),this.center=new fA(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new qA,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.colorSpace=B,this.userData={},this.version=0,this.onUpdate=null,this.renderTarget=null,this.isRenderTargetTexture=!1,this.pmremVersion=0}get image(){return this.source.data}set image(A=null){this.source.data=A}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}clone(){return new this.constructor().copy(this)}copy(A){return this.name=A.name,this.source=A.source,this.mipmaps=A.mipmaps.slice(0),this.mapping=A.mapping,this.channel=A.channel,this.wrapS=A.wrapS,this.wrapT=A.wrapT,this.magFilter=A.magFilter,this.minFilter=A.minFilter,this.anisotropy=A.anisotropy,this.format=A.format,this.internalFormat=A.internalFormat,this.type=A.type,this.offset.copy(A.offset),this.repeat.copy(A.repeat),this.center.copy(A.center),this.rotation=A.rotation,this.matrixAutoUpdate=A.matrixAutoUpdate,this.matrix.copy(A.matrix),this.generateMipmaps=A.generateMipmaps,this.premultiplyAlpha=A.premultiplyAlpha,this.flipY=A.flipY,this.unpackAlignment=A.unpackAlignment,this.colorSpace=A.colorSpace,this.renderTarget=A.renderTarget,this.isRenderTargetTexture=A.isRenderTargetTexture,this.userData=JSON.parse(JSON.stringify(A.userData)),this.needsUpdate=!0,this}toJSON(A){const t=A===void 0||typeof A=="string";if(!t&&A.textures[this.uuid]!==void 0)return A.textures[this.uuid];const e={metadata:{version:4.6,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(A).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(e.userData=this.userData),t||(A.textures[this.uuid]=e),e}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(A){if(this.mapping!==Qs)return A;if(A.applyMatrix3(this.matrix),A.x<0||A.x>1)switch(this.wrapS){case hs:A.x=A.x-Math.floor(A.x);break;case $t:A.x=A.x<0?0:1;break;case Es:Math.abs(Math.floor(A.x)%2)===1?A.x=Math.ceil(A.x)-A.x:A.x=A.x-Math.floor(A.x);break}if(A.y<0||A.y>1)switch(this.wrapT){case hs:A.y=A.y-Math.floor(A.y);break;case $t:A.y=A.y<0?0:1;break;case Es:Math.abs(Math.floor(A.y)%2)===1?A.y=Math.ceil(A.y)-A.y:A.y=A.y-Math.floor(A.y);break}return this.flipY&&(A.y=1-A.y),A}set needsUpdate(A){A===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(A){A===!0&&this.pmremVersion++}}ZA.DEFAULT_IMAGE=null,ZA.DEFAULT_MAPPING=Qs,ZA.DEFAULT_ANISOTROPY=1;class uA{constructor(A=0,t=0,e=0,i=1){uA.prototype.isVector4=!0,this.x=A,this.y=t,this.z=e,this.w=i}get width(){return this.z}set width(A){this.z=A}get height(){return this.w}set height(A){this.w=A}set(A,t,e,i){return this.x=A,this.y=t,this.z=e,this.w=i,this}setScalar(A){return this.x=A,this.y=A,this.z=A,this.w=A,this}setX(A){return this.x=A,this}setY(A){return this.y=A,this}setZ(A){return this.z=A,this}setW(A){return this.w=A,this}setComponent(A,t){switch(A){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw new Error("index is out of range: "+A)}return this}getComponent(A){switch(A){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+A)}}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!==void 0?A.w:1,this}add(A){return this.x+=A.x,this.y+=A.y,this.z+=A.z,this.w+=A.w,this}addScalar(A){return this.x+=A,this.y+=A,this.z+=A,this.w+=A,this}addVectors(A,t){return this.x=A.x+t.x,this.y=A.y+t.y,this.z=A.z+t.z,this.w=A.w+t.w,this}addScaledVector(A,t){return this.x+=A.x*t,this.y+=A.y*t,this.z+=A.z*t,this.w+=A.w*t,this}sub(A){return this.x-=A.x,this.y-=A.y,this.z-=A.z,this.w-=A.w,this}subScalar(A){return this.x-=A,this.y-=A,this.z-=A,this.w-=A,this}subVectors(A,t){return this.x=A.x-t.x,this.y=A.y-t.y,this.z=A.z-t.z,this.w=A.w-t.w,this}multiply(A){return this.x*=A.x,this.y*=A.y,this.z*=A.z,this.w*=A.w,this}multiplyScalar(A){return this.x*=A,this.y*=A,this.z*=A,this.w*=A,this}applyMatrix4(A){const t=this.x,e=this.y,i=this.z,s=this.w,n=A.elements;return this.x=n[0]*t+n[4]*e+n[8]*i+n[12]*s,this.y=n[1]*t+n[5]*e+n[9]*i+n[13]*s,this.z=n[2]*t+n[6]*e+n[10]*i+n[14]*s,this.w=n[3]*t+n[7]*e+n[11]*i+n[15]*s,this}divide(A){return this.x/=A.x,this.y/=A.y,this.z/=A.z,this.w/=A.w,this}divideScalar(A){return this.multiplyScalar(1/A)}setAxisAngleFromQuaternion(A){this.w=2*Math.acos(A.w);const t=Math.sqrt(1-A.w*A.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=A.x/t,this.y=A.y/t,this.z=A.z/t),this}setAxisAngleFromRotationMatrix(A){let t,e,i,s;const a=A.elements,o=a[0],B=a[4],I=a[8],Q=a[1],h=a[5],E=a[9],C=a[2],c=a[6],l=a[10];if(Math.abs(B-Q)<.01&&Math.abs(I-C)<.01&&Math.abs(E-c)<.01){if(Math.abs(B+Q)<.1&&Math.abs(I+C)<.1&&Math.abs(E+c)<.1&&Math.abs(o+h+l-3)<.1)return this.set(1,0,0,0),this;t=Math.PI;const d=(o+1)/2,f=(h+1)/2,p=(l+1)/2,m=(B+Q)/4,x=(I+C)/4,w=(E+c)/4;return d>f&&d>p?d<.01?(e=0,i=.707106781,s=.707106781):(e=Math.sqrt(d),i=m/e,s=x/e):f>p?f<.01?(e=.707106781,i=0,s=.707106781):(i=Math.sqrt(f),e=m/i,s=w/i):p<.01?(e=.707106781,i=.707106781,s=0):(s=Math.sqrt(p),e=x/s,i=w/s),this.set(e,i,s,t),this}let y=Math.sqrt((c-E)*(c-E)+(I-C)*(I-C)+(Q-B)*(Q-B));return Math.abs(y)<.001&&(y=1),this.x=(c-E)/y,this.y=(I-C)/y,this.z=(Q-B)/y,this.w=Math.acos((o+h+l-1)/2),this}setFromMatrixPosition(A){const t=A.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this.w=t[15],this}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.w=Math.min(this.w,A.w),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.w=Math.max(this.w,A.w),this}clamp(A,t){return this.x=H(this.x,A.x,t.x),this.y=H(this.y,A.y,t.y),this.z=H(this.z,A.z,t.z),this.w=H(this.w,A.w,t.w),this}clampScalar(A,t){return this.x=H(this.x,A,t),this.y=H(this.y,A,t),this.z=H(this.z,A,t),this.w=H(this.w,A,t),this}clampLength(A,t){const e=this.length();return this.divideScalar(e||1).multiplyScalar(H(e,A,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,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)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(A){return this.normalize().multiplyScalar(A)}lerp(A,t){return this.x+=(A.x-this.x)*t,this.y+=(A.y-this.y)*t,this.z+=(A.z-this.z)*t,this.w+=(A.w-this.w)*t,this}lerpVectors(A,t,e){return this.x=A.x+(t.x-A.x)*e,this.y=A.y+(t.y-A.y)*e,this.z=A.z+(t.z-A.z)*e,this.w=A.w+(t.w-A.w)*e,this}equals(A){return A.x===this.x&&A.y===this.y&&A.z===this.z&&A.w===this.w}fromArray(A,t=0){return this.x=A[t],this.y=A[t+1],this.z=A[t+2],this.w=A[t+3],this}toArray(A=[],t=0){return A[t]=this.x,A[t+1]=this.y,A[t+2]=this.z,A[t+3]=this.w,A}fromBufferAttribute(A,t){return this.x=A.getX(t),this.y=A.getY(t),this.z=A.getZ(t),this.w=A.getW(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}class nr extends te{constructor(A=1,t=1,e={}){super(),this.isRenderTarget=!0,this.width=A,this.height=t,this.depth=1,this.scissor=new uA(0,0,A,t),this.scissorTest=!1,this.viewport=new uA(0,0,A,t);const i={width:A,height:t,depth:1};e=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:Cs,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1},e);const s=new ZA(i,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.colorSpace);s.flipY=!1,s.generateMipmaps=e.generateMipmaps,s.internalFormat=e.internalFormat,this.textures=[];const n=e.count;for(let r=0;r<n;r++)this.textures[r]=s.clone(),this.textures[r].isRenderTargetTexture=!0,this.textures[r].renderTarget=this;this.depthBuffer=e.depthBuffer,this.stencilBuffer=e.stencilBuffer,this.resolveDepthBuffer=e.resolveDepthBuffer,this.resolveStencilBuffer=e.resolveStencilBuffer,this._depthTexture=null,this.depthTexture=e.depthTexture,this.samples=e.samples}get texture(){return this.textures[0]}set texture(A){this.textures[0]=A}set depthTexture(A){this._depthTexture!==null&&(this._depthTexture.renderTarget=null),A!==null&&(A.renderTarget=this),this._depthTexture=A}get depthTexture(){return this._depthTexture}setSize(A,t,e=1){if(this.width!==A||this.height!==t||this.depth!==e){this.width=A,this.height=t,this.depth=e;for(let i=0,s=this.textures.length;i<s;i++)this.textures[i].image.width=A,this.textures[i].image.height=t,this.textures[i].image.depth=e;this.dispose()}this.viewport.set(0,0,A,t),this.scissor.set(0,0,A,t)}clone(){return new this.constructor().copy(this)}copy(A){this.width=A.width,this.height=A.height,this.depth=A.depth,this.scissor.copy(A.scissor),this.scissorTest=A.scissorTest,this.viewport.copy(A.viewport),this.textures.length=0;for(let e=0,i=A.textures.length;e<i;e++)this.textures[e]=A.textures[e].clone(),this.textures[e].isRenderTargetTexture=!0,this.textures[e].renderTarget=this;const t=Object.assign({},A.texture.image);return this.texture.source=new ms(t),this.depthBuffer=A.depthBuffer,this.stencilBuffer=A.stencilBuffer,this.resolveDepthBuffer=A.resolveDepthBuffer,this.resolveStencilBuffer=A.resolveStencilBuffer,A.depthTexture!==null&&(this.depthTexture=A.depthTexture.clone()),this.samples=A.samples,this}dispose(){this.dispatchEvent({type:"dispose"})}}class rr extends nr{constructor(A=1,t=1,e={}){super(A,t,e),this.isWebGLRenderTarget=!0}}class rt extends ZA{constructor(A=null,t=1,e=1,i=1){super(null),this.isDataArrayTexture=!0,this.image={data:A,width:t,height:e,depth:i},this.magFilter=nt,this.minFilter=nt,this.wrapR=$t,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.layerUpdates=new Set}addLayerUpdate(A){this.layerUpdates.add(A)}clearLayerUpdates(){this.layerUpdates.clear()}}class xs extends rr{constructor(A=1,t=1,e=1,i={}){super(A,t,i),this.isWebGLArrayRenderTarget=!0,this.depth=e,this.texture=new rt(null,A,t,e),this.texture.isRenderTargetTexture=!0}}class gA{constructor(A=0,t=0,e=0,i=1){this.isQuaternion=!0,this._x=A,this._y=t,this._z=e,this._w=i}static slerpFlat(A,t,e,i,s,n,r){let a=e[i+0],o=e[i+1],B=e[i+2],I=e[i+3];const Q=s[n+0],h=s[n+1],E=s[n+2],C=s[n+3];if(r===0){A[t+0]=a,A[t+1]=o,A[t+2]=B,A[t+3]=I;return}if(r===1){A[t+0]=Q,A[t+1]=h,A[t+2]=E,A[t+3]=C;return}if(I!==C||a!==Q||o!==h||B!==E){let c=1-r;const l=a*Q+o*h+B*E+I*C,y=l>=0?1:-1,d=1-l*l;if(d>Number.EPSILON){const p=Math.sqrt(d),m=Math.atan2(p,l*y);c=Math.sin(c*m)/p,r=Math.sin(r*m)/p}const f=r*y;if(a=a*c+Q*f,o=o*c+h*f,B=B*c+E*f,I=I*c+C*f,c===1-r){const p=1/Math.sqrt(a*a+o*o+B*B+I*I);a*=p,o*=p,B*=p,I*=p}}A[t]=a,A[t+1]=o,A[t+2]=B,A[t+3]=I}static multiplyQuaternionsFlat(A,t,e,i,s,n){const r=e[i],a=e[i+1],o=e[i+2],B=e[i+3],I=s[n],Q=s[n+1],h=s[n+2],E=s[n+3];return A[t]=r*E+B*I+a*h-o*Q,A[t+1]=a*E+B*Q+o*I-r*h,A[t+2]=o*E+B*h+r*Q-a*I,A[t+3]=B*E-r*I-a*Q-o*h,A}get x(){return this._x}set x(A){this._x=A,this._onChangeCallback()}get y(){return this._y}set y(A){this._y=A,this._onChangeCallback()}get z(){return this._z}set z(A){this._z=A,this._onChangeCallback()}get w(){return this._w}set w(A){this._w=A,this._onChangeCallback()}set(A,t,e,i){return this._x=A,this._y=t,this._z=e,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(A){return this._x=A.x,this._y=A.y,this._z=A.z,this._w=A.w,this._onChangeCallback(),this}setFromEuler(A,t=!0){const e=A._x,i=A._y,s=A._z,n=A._order,r=Math.cos,a=Math.sin,o=r(e/2),B=r(i/2),I=r(s/2),Q=a(e/2),h=a(i/2),E=a(s/2);switch(n){case"XYZ":this._x=Q*B*I+o*h*E,this._y=o*h*I-Q*B*E,this._z=o*B*E+Q*h*I,this._w=o*B*I-Q*h*E;break;case"YXZ":this._x=Q*B*I+o*h*E,this._y=o*h*I-Q*B*E,this._z=o*B*E-Q*h*I,this._w=o*B*I+Q*h*E;break;case"ZXY":this._x=Q*B*I-o*h*E,this._y=o*h*I+Q*B*E,this._z=o*B*E+Q*h*I,this._w=o*B*I-Q*h*E;break;case"ZYX":this._x=Q*B*I-o*h*E,this._y=o*h*I+Q*B*E,this._z=o*B*E-Q*h*I,this._w=o*B*I+Q*h*E;break;case"YZX":this._x=Q*B*I+o*h*E,this._y=o*h*I+Q*B*E,this._z=o*B*E-Q*h*I,this._w=o*B*I-Q*h*E;break;case"XZY":this._x=Q*B*I-o*h*E,this._y=o*h*I-Q*B*E,this._z=o*B*E+Q*h*I,this._w=o*B*I+Q*h*E;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+n)}return t===!0&&this._onChangeCallback(),this}setFromAxisAngle(A,t){const e=t/2,i=Math.sin(e);return this._x=A.x*i,this._y=A.y*i,this._z=A.z*i,this._w=Math.cos(e),this._onChangeCallback(),this}setFromRotationMatrix(A){const t=A.elements,e=t[0],i=t[4],s=t[8],n=t[1],r=t[5],a=t[9],o=t[2],B=t[6],I=t[10],Q=e+r+I;if(Q>0){const h=.5/Math.sqrt(Q+1);this._w=.25/h,this._x=(B-a)*h,this._y=(s-o)*h,this._z=(n-i)*h}else if(e>r&&e>I){const h=2*Math.sqrt(1+e-r-I);this._w=(B-a)/h,this._x=.25*h,this._y=(i+n)/h,this._z=(s+o)/h}else if(r>I){const h=2*Math.sqrt(1+r-e-I);this._w=(s-o)/h,this._x=(i+n)/h,this._y=.25*h,this._z=(a+B)/h}else{const h=2*Math.sqrt(1+I-e-r);this._w=(n-i)/h,this._x=(s+o)/h,this._y=(a+B)/h,this._z=.25*h}return this._onChangeCallback(),this}setFromUnitVectors(A,t){let e=A.dot(t)+1;return e<Number.EPSILON?(e=0,Math.abs(A.x)>Math.abs(A.z)?(this._x=-A.y,this._y=A.x,this._z=0,this._w=e):(this._x=0,this._y=-A.z,this._z=A.y,this._w=e)):(this._x=A.y*t.z-A.z*t.y,this._y=A.z*t.x-A.x*t.z,this._z=A.x*t.y-A.y*t.x,this._w=e),this.normalize()}angleTo(A){return 2*Math.acos(Math.abs(H(this.dot(A),-1,1)))}rotateTowards(A,t){const e=this.angleTo(A);if(e===0)return this;const i=Math.min(1,t/e);return this.slerp(A,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(A){return this._x*A._x+this._y*A._y+this._z*A._z+this._w*A._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let A=this.length();return A===0?(this._x=0,this._y=0,this._z=0,this._w=1):(A=1/A,this._x=this._x*A,this._y=this._y*A,this._z=this._z*A,this._w=this._w*A),this._onChangeCallback(),this}multiply(A){return this.multiplyQuaternions(this,A)}premultiply(A){return this.multiplyQuaternions(A,this)}multiplyQuaternions(A,t){const e=A._x,i=A._y,s=A._z,n=A._w,r=t._x,a=t._y,o=t._z,B=t._w;return this._x=e*B+n*r+i*o-s*a,this._y=i*B+n*a+s*r-e*o,this._z=s*B+n*o+e*a-i*r,this._w=n*B-e*r-i*a-s*o,this._onChangeCallback(),this}slerp(A,t){if(t===0)return this;if(t===1)return this.copy(A);const e=this._x,i=this._y,s=this._z,n=this._w;let r=n*A._w+e*A._x+i*A._y+s*A._z;if(r<0?(this._w=-A._w,this._x=-A._x,this._y=-A._y,this._z=-A._z,r=-r):this.copy(A),r>=1)return this._w=n,this._x=e,this._y=i,this._z=s,this;const a=1-r*r;if(a<=Number.EPSILON){const h=1-t;return this._w=h*n+t*this._w,this._x=h*e+t*this._x,this._y=h*i+t*this._y,this._z=h*s+t*this._z,this.normalize(),this}const o=Math.sqrt(a),B=Math.atan2(o,r),I=Math.sin((1-t)*B)/o,Q=Math.sin(t*B)/o;return this._w=n*I+this._w*Q,this._x=e*I+this._x*Q,this._y=i*I+this._y*Q,this._z=s*I+this._z*Q,this._onChangeCallback(),this}slerpQuaternions(A,t,e){return this.copy(A).slerp(t,e)}random(){const A=2*Math.PI*Math.random(),t=2*Math.PI*Math.random(),e=Math.random(),i=Math.sqrt(1-e),s=Math.sqrt(e);return this.set(i*Math.sin(A),i*Math.cos(A),s*Math.sin(t),s*Math.cos(t))}equals(A){return A._x===this._x&&A._y===this._y&&A._z===this._z&&A._w===this._w}fromArray(A,t=0){return this._x=A[t],this._y=A[t+1],this._z=A[t+2],this._w=A[t+3],this._onChangeCallback(),this}toArray(A=[],t=0){return A[t]=this._x,A[t+1]=this._y,A[t+2]=this._z,A[t+3]=this._w,A}fromBufferAttribute(A,t){return this._x=A.getX(t),this._y=A.getY(t),this._z=A.getZ(t),this._w=A.getW(t),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(A){return this._onChangeCallback=A,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class u{constructor(A=0,t=0,e=0){u.prototype.isVector3=!0,this.x=A,this.y=t,this.z=e}set(A,t,e){return e===void 0&&(e=this.z),this.x=A,this.y=t,this.z=e,this}setScalar(A){return this.x=A,this.y=A,this.z=A,this}setX(A){return this.x=A,this}setY(A){return this.y=A,this}setZ(A){return this.z=A,this}setComponent(A,t){switch(A){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("index is out of range: "+A)}return this}getComponent(A){switch(A){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+A)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(A){return this.x=A.x,this.y=A.y,this.z=A.z,this}add(A){return this.x+=A.x,this.y+=A.y,this.z+=A.z,this}addScalar(A){return this.x+=A,this.y+=A,this.z+=A,this}addVectors(A,t){return this.x=A.x+t.x,this.y=A.y+t.y,this.z=A.z+t.z,this}addScaledVector(A,t){return this.x+=A.x*t,this.y+=A.y*t,this.z+=A.z*t,this}sub(A){return this.x-=A.x,this.y-=A.y,this.z-=A.z,this}subScalar(A){return this.x-=A,this.y-=A,this.z-=A,this}subVectors(A,t){return this.x=A.x-t.x,this.y=A.y-t.y,this.z=A.z-t.z,this}multiply(A){return this.x*=A.x,this.y*=A.y,this.z*=A.z,this}multiplyScalar(A){return this.x*=A,this.y*=A,this.z*=A,this}multiplyVectors(A,t){return this.x=A.x*t.x,this.y=A.y*t.y,this.z=A.z*t.z,this}applyEuler(A){return this.applyQuaternion(Ms.setFromEuler(A))}applyAxisAngle(A,t){return this.applyQuaternion(Ms.setFromAxisAngle(A,t))}applyMatrix3(A){const t=this.x,e=this.y,i=this.z,s=A.elements;return this.x=s[0]*t+s[3]*e+s[6]*i,this.y=s[1]*t+s[4]*e+s[7]*i,this.z=s[2]*t+s[5]*e+s[8]*i,this}applyNormalMatrix(A){return this.applyMatrix3(A).normalize()}applyMatrix4(A){const t=this.x,e=this.y,i=this.z,s=A.elements,n=1/(s[3]*t+s[7]*e+s[11]*i+s[15]);return this.x=(s[0]*t+s[4]*e+s[8]*i+s[12])*n,this.y=(s[1]*t+s[5]*e+s[9]*i+s[13])*n,this.z=(s[2]*t+s[6]*e+s[10]*i+s[14])*n,this}applyQuaternion(A){const t=this.x,e=this.y,i=this.z,s=A.x,n=A.y,r=A.z,a=A.w,o=2*(n*i-r*e),B=2*(r*t-s*i),I=2*(s*e-n*t);return this.x=t+a*o+n*I-r*B,this.y=e+a*B+r*o-s*I,this.z=i+a*I+s*B-n*o,this}project(A){return this.applyMatrix4(A.matrixWorldInverse).applyMatrix4(A.projectionMatrix)}unproject(A){return this.applyMatrix4(A.projectionMatrixInverse).applyMatrix4(A.matrixWorld)}transformDirection(A){const t=this.x,e=this.y,i=this.z,s=A.elements;return this.x=s[0]*t+s[4]*e+s[8]*i,this.y=s[1]*t+s[5]*e+s[9]*i,this.z=s[2]*t+s[6]*e+s[10]*i,this.normalize()}divide(A){return this.x/=A.x,this.y/=A.y,this.z/=A.z,this}divideScalar(A){return this.multiplyScalar(1/A)}min(A){return this.x=Math.min(this.x,A.x),this.y=Math.min(this.y,A.y),this.z=Math.min(this.z,A.z),this}max(A){return this.x=Math.max(this.x,A.x),this.y=Math.max(this.y,A.y),this.z=Math.max(this.z,A.z),this}clamp(A,t){return this.x=H(this.x,A.x,t.x),this.y=H(this.y,A.y,t.y),this.z=H(this.z,A.z,t.z),this}clampScalar(A,t){return this.x=H(this.x,A,t),this.y=H(this.y,A,t),this.z=H(this.z,A,t),this}clampLength(A,t){const e=this.length();return this.divideScalar(e||1).multiplyScalar(H(e,A,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(A){return this.x*A.x+this.y*A.y+this.z*A.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(A){return this.normalize().multiplyScalar(A)}lerp(A,t){return this.x+=(A.x-this.x)*t,this.y+=(A.y-this.y)*t,this.z+=(A.z-this.z)*t,this}lerpVectors(A,t,e){return this.x=A.x+(t.x-A.x)*e,this.y=A.y+(t.y-A.y)*e,this.z=A.z+(t.z-A.z)*e,this}cross(A){return this.crossVectors(this,A)}crossVectors(A,t){const e=A.x,i=A.y,s=A.z,n=t.x,r=t.y,a=t.z;return this.x=i*a-s*r,this.y=s*n-e*a,this.z=e*r-i*n,this}projectOnVector(A){const t=A.lengthSq();if(t===0)return this.set(0,0,0);const e=A.dot(this)/t;return this.copy(A).multiplyScalar(e)}projectOnPlane(A){return Ci.copy(this).projectOnVector(A),this.sub(Ci)}reflect(A){return this.sub(Ci.copy(A).multiplyScalar(2*this.dot(A)))}angleTo(A){const t=Math.sqrt(this.lengthSq()*A.lengthSq());if(t===0)return Math.PI/2;const e=this.dot(A)/t;return Math.acos(H(e,-1,1))}distanceTo(A){return Math.sqrt(this.distanceToSquared(A))}distanceToSquared(A){const t=this.x-A.x,e=this.y-A.y,i=this.z-A.z;return t*t+e*e+i*i}manhattanDistanceTo(A){return Math.abs(this.x-A.x)+Math.abs(this.y-A.y)+Math.abs(this.z-A.z)}setFromSpherical(A){return this.setFromSphericalCoords(A.radius,A.phi,A.theta)}setFromSphericalCoords(A,t,e){const i=Math.sin(t)*A;return this.x=i*Math.sin(e),this.y=Math.cos(t)*A,this.z=i*Math.cos(e),this}setFromCylindrical(A){return this.setFromCylindricalCoords(A.radius,A.theta,A.y)}setFromCylindricalCoords(A,t,e){return this.x=A*Math.sin(t),this.y=e,this.z=A*Math.cos(t),this}setFromMatrixPosition(A){const t=A.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(A){const t=this.setFromMatrixColumn(A,0).length(),e=this.setFromMatrixColumn(A,1).length(),i=this.setFromMatrixColumn(A,2).length();return this.x=t,this.y=e,this.z=i,this}setFromMatrixColumn(A,t){return this.fromArray(A.elements,t*4)}setFromMatrix3Column(A,t){return this.fromArray(A.elements,t*3)}setFromEuler(A){return this.x=A._x,this.y=A._y,this.z=A._z,this}setFromColor(A){return this.x=A.r,this.y=A.g,this.z=A.b,this}equals(A){return A.x===this.x&&A.y===this.y&&A.z===this.z}fromArray(A,t=0){return this.x=A[t],this.y=A[t+1],this.z=A[t+2],this}toArray(A=[],t=0){return A[t]=this.x,A[t+1]=this.y,A[t+2]=this.z,A}fromBufferAttribute(A,t){return this.x=A.getX(t),this.y=A.getY(t),this.z=A.getZ(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const A=Math.random()*Math.PI*2,t=Math.random()*2-1,e=Math.sqrt(1-t*t);return this.x=e*Math.cos(A),this.y=t,this.z=e*Math.sin(A),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const Ci=new u,Ms=new gA;class Ft{constructor(A=new u(1/0,1/0,1/0),t=new u(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=A,this.max=t}set(A,t){return this.min.copy(A),this.max.copy(t),this}setFromArray(A){this.makeEmpty();for(let t=0,e=A.length;t<e;t+=3)this.expandByPoint(JA.fromArray(A,t));return this}setFromBufferAttribute(A){this.makeEmpty();for(let t=0,e=A.count;t<e;t++)this.expandByPoint(JA.fromBufferAttribute(A,t));return this}setFromPoints(A){this.makeEmpty();for(let t=0,e=A.length;t<e;t++)this.expandByPoint(A[t]);return this}setFromCenterAndSize(A,t){const e=JA.copy(t).multiplyScalar(.5);return this.min.copy(A).sub(e),this.max.copy(A).add(e),this}setFromObject(A,t=!1){return this.makeEmpty(),this.expandByObject(A,t)}clone(){return new this.constructor().copy(this)}copy(A){return this.min.copy(A.min),this.max.copy(A.max),this}makeEmpty(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-1/0,this}isEmpty(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z}getCenter(A){return this.isEmpty()?A.set(0,0,0):A.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(A){return this.isEmpty()?A.set(0,0,0):A.subVectors(this.max,this.min)}expandByPoint(A){return this.min.min(A),this.max.max(A),this}expandByVector(A){return this.min.sub(A),this.max.add(A),this}expandByScalar(A){return this.min.addScalar(-A),this.max.addScalar(A),this}expandByObject(A,t=!1){A.updateWorldMatrix(!1,!1);const e=A.geometry;if(e!==void 0){const s=e.getAttribute("position");if(t===!0&&s!==void 0&&A.isInstancedMesh!==!0)for(let n=0,r=s.count;n<r;n++)A.isMesh===!0?A.getVertexPosition(n,JA):JA.fromBufferAttribute(s,n),JA.applyMatrix4(A.matrixWorld),this.expandByPoint(JA);else A.boundingBox!==void 0?(A.boundingBox===null&&A.computeBoundingBox(),De.copy(A.boundingBox)):(e.boundingBox===null&&e.computeBoundingBox(),De.copy(e.boundingBox)),De.applyMatrix4(A.matrixWorld),this.union(De)}const i=A.children;for(let s=0,n=i.length;s<n;s++)this.expandByObject(i[s],t);return this}containsPoint(A){return A.x>=this.min.x&&A.x<=this.max.x&&A.y>=this.min.y&&A.y<=this.max.y&&A.z>=this.min.z&&A.z<=this.max.z}containsBox(A){return this.min.x<=A.min.x&&A.max.x<=this.max.x&&this.min.y<=A.min.y&&A.max.y<=this.max.y&&this.min.z<=A.min.z&&A.max.z<=this.max.z}getParameter(A,t){return t.set((A.x-this.min.x)/(this.max.x-this.min.x),(A.y-this.min.y)/(this.max.y-this.min.y),(A.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(A){return A.max.x>=this.min.x&&A.min.x<=this.max.x&&A.max.y>=this.min.y&&A.min.y<=this.max.y&&A.max.z>=this.min.z&&A.min.z<=this.max.z}intersectsSphere(A){return this.clampPoint(A.center,JA),JA.distanceToSquared(A.center)<=A.radius*A.radius}intersectsPlane(A){let t,e;return A.normal.x>0?(t=A.normal.x*this.min.x,e=A.normal.x*this.max.x):(t=A.normal.x*this.max.x,e=A.normal.x*this.min.x),A.normal.y>0?(t+=A.normal.y*this.min.y,e+=A.normal.y*this.max.y):(t+=A.normal.y*this.max.y,e+=A.normal.y*this.min.y),A.normal.z>0?(t+=A.normal.z*this.min.z,e+=A.normal.z*this.max.z):(t+=A.normal.z*this.max.z,e+=A.normal.z*this.min.z),t<=-A.constant&&e>=-A.constant}intersectsTriangle(A){if(this.isEmpty())return!1;this.getCenter(se),me.subVectors(this.max,se),Nt.subVectors(A.a,se),kt.subVectors(A.b,se),Rt.subVectors(A.c,se),at.subVectors(kt,Nt),gt.subVectors(Rt,kt),lt.subVectors(Nt,Rt);let t=[0,-at.z,at.y,0,-gt.z,gt.y,0,-lt.z,lt.y,at.z,0,-at.x,gt.z,0,-gt.x,lt.z,0,-lt.x,-at.y,at.x,0,-gt.y,gt.x,0,-lt.y,lt.x,0];return!ci(t,Nt,kt,Rt,me)||(t=[1,0,0,0,1,0,0,0,1],!ci(t,Nt,kt,Rt,me))?!1:(xe.crossVectors(at,gt),t=[xe.x,xe.y,xe.z],ci(t,Nt,kt,Rt,me))}clampPoint(A,t){return t.copy(A).clamp(this.min,this.max)}distanceToPoint(A){return this.clampPoint(A,JA).distanceTo(A)}getBoundingSphere(A){return this.isEmpty()?A.makeEmpty():(this.getCenter(A.center),A.radius=this.getSize(JA).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:(PA[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(A),PA[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(A),PA[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(A),PA[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(A),PA[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(A),PA[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(A),PA[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(A),PA[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(A),this.setFromPoints(PA),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 PA=[new u,new u,new u,new u,new u,new u,new u,new u],JA=new u,De=new Ft,Nt=new u,kt=new u,Rt=new u,at=new u,gt=new u,lt=new u,se=new u,me=new u,xe=new u,ut=new u;function ci(g,A,t,e,i){for(let s=0,n=g.length-3;s<=n;s+=3){ut.fromArray(g,s);const r=i.x*Math.abs(ut.x)+i.y*Math.abs(ut.y)+i.z*Math.abs(ut.z),a=A.dot(ut),o=t.dot(ut),B=e.dot(ut);if(Math.max(-Math.max(a,o,B),Math.min(a,o,B))>r)return!1}return!0}const ar=new Ft,ne=new u,li=new u;class Ss{constructor(A=new u,t=-1){this.isSphere=!0,this.center=A,this.radius=t}set(A,t){return this.center.copy(A),this.radius=t,this}setFromPoints(A,t){const e=this.center;t!==void 0?e.copy(t):ar.setFromPoints(A).getCenter(e);let i=0;for(let s=0,n=A.length;s<n;s++)i=Math.max(i,e.distanceToSquared(A[s]));return this.radius=Math.sqrt(i),this}copy(A){return this.center.copy(A.center),this.radius=A.radius,this}isEmpty(){return this.radius<0}makeEmpty(){return this.center.set(0,0,0),this.radius=-1,this}containsPoint(A){return A.distanceToSquared(this.center)<=this.radius*this.radius}distanceToPoint(A){return A.distanceTo(this.center)-this.radius}intersectsSphere(A){const t=this.radius+A.radius;return A.center.distanceToSquared(this.center)<=t*t}intersectsBox(A){return A.intersectsSphere(this)}intersectsPlane(A){return Math.abs(A.distanceToPoint(this.center))<=this.radius}clampPoint(A,t){const e=this.center.distanceToSquared(A);return t.copy(A),e>this.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t}getBoundingBox(A){return this.isEmpty()?(A.makeEmpty(),A):(A.set(this.center,this.center),A.expandByScalar(this.radius),A)}applyMatrix4(A){return this.center.applyMatrix4(A),this.radius=this.radius*A.getMaxScaleOnAxis(),this}translate(A){return this.center.add(A),this}expandByPoint(A){if(this.isEmpty())return this.center.copy(A),this.radius=0,this;ne.subVectors(A,this.center);const t=ne.lengthSq();if(t>this.radius*this.radius){const e=Math.sqrt(t),i=(e-this.radius)*.5;this.center.addScaledVector(ne,i/e),this.radius+=i}return this}union(A){return A.isEmpty()?this:this.isEmpty()?(this.copy(A),this):(this.center.equals(A.center)===!0?this.radius=Math.max(this.radius,A.radius):(li.subVectors(A.center,this.center).setLength(A.radius),this.expandByPoint(ne.copy(A.center).add(li)),this.expandByPoint(ne.copy(A.center).sub(li))),this)}equals(A){return A.center.equals(this.center)&&A.radius===this.radius}clone(){return new this.constructor().copy(this)}}const OA=new u,ui=new u,Me=new u,ot=new u,di=new u,Se=new u,yi=new u;class gr{constructor(A=new u,t=new u(0,0,-1)){this.origin=A,this.direction=t}set(A,t){return this.origin.copy(A),this.direction.copy(t),this}copy(A){return this.origin.copy(A.origin),this.direction.copy(A.direction),this}at(A,t){return t.copy(this.origin).addScaledVector(this.direction,A)}lookAt(A){return this.direction.copy(A).sub(this.origin).normalize(),this}recast(A){return this.origin.copy(this.at(A,OA)),this}closestPointToPoint(A,t){t.subVectors(A,this.origin);const e=t.dot(this.direction);return e<0?t.copy(this.origin):t.copy(this.origin).addScaledVector(this.direction,e)}distanceToPoint(A){return Math.sqrt(this.distanceSqToPoint(A))}distanceSqToPoint(A){const t=OA.subVectors(A,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(A):(OA.copy(this.origin).addScaledVector(this.direction,t),OA.distanceToSquared(A))}distanceSqToSegment(A,t,e,i){ui.copy(A).add(t).multiplyScalar(.5),Me.copy(t).sub(A).normalize(),ot.copy(this.origin).sub(ui);const s=A.distanceTo(t)*.5,n=-this.direction.dot(Me),r=ot.dot(this.direction),a=-ot.dot(Me),o=ot.lengthSq(),B=Math.abs(1-n*n);let I,Q,h,E;if(B>0)if(I=n*a-r,Q=n*r-a,E=s*B,I>=0)if(Q>=-E)if(Q<=E){const C=1/B;I*=C,Q*=C,h=I*(I+n*Q+2*r)+Q*(n*I+Q+2*a)+o}else Q=s,I=Math.max(0,-(n*Q+r)),h=-I*I+Q*(Q+2*a)+o;else Q=-s,I=Math.max(0,-(n*Q+r)),h=-I*I+Q*(Q+2*a)+o;else Q<=-E?(I=Math.max(0,-(-n*s+r)),Q=I>0?-s:Math.min(Math.max(-s,-a),s),h=-I*I+Q*(Q+2*a)+o):Q<=E?(I=0,Q=Math.min(Math.max(-s,-a),s),h=Q*(Q+2*a)+o):(I=Math.max(0,-(n*s+r)),Q=I>0?s:Math.min(Math.max(-s,-a),s),h=-I*I+Q*(Q+2*a)+o);else Q=n>0?-s:s,I=Math.max(0,-(n*Q+r)),h=-I*I+Q*(Q+2*a)+o;return e&&e.copy(this.origin).addScaledVector(this.direction,I),i&&i.copy(ui).addScaledVector(Me,Q),h}intersectSphere(A,t){OA.subVectors(A.center,this.origin);const e=OA.dot(this.direction),i=OA.dot(OA)-e*e,s=A.radius*A.radius;if(i>s)return null;const n=Math.sqrt(s-i),r=e-n,a=e+n;return a<0?null:r<0?this.at(a,t):this.at(r,t)}intersectsSphere(A){return this.distanceSqToPoint(A.center)<=A.radius*A.radius}distanceToPlane(A){const t=A.normal.dot(this.direction);if(t===0)return A.distanceToPoint(this.origin)===0?0:null;const e=-(this.origin.dot(A.normal)+A.constant)/t;return e>=0?e:null}intersectPlane(A,t){const e=this.distanceToPlane(A);return e===null?null:this.at(e,t)}intersectsPlane(A){const t=A.distanceToPoint(this.origin);return t===0||A.normal.dot(this.direction)*t<0}intersectBox(A,t){let e,i,s,n,r,a;const o=1/this.direction.x,B=1/this.direction.y,I=1/this.direction.z,Q=this.origin;return o>=0?(e=(A.min.x-Q.x)*o,i=(A.max.x-Q.x)*o):(e=(A.max.x-Q.x)*o,i=(A.min.x-Q.x)*o),B>=0?(s=(A.min.y-Q.y)*B,n=(A.max.y-Q.y)*B):(s=(A.max.y-Q.y)*B,n=(A.min.y-Q.y)*B),e>n||s>i||((s>e||isNaN(e))&&(e=s),(n<i||isNaN(i))&&(i=n),I>=0?(r=(A.min.z-Q.z)*I,a=(A.max.z-Q.z)*I):(r=(A.max.z-Q.z)*I,a=(A.min.z-Q.z)*I),e>a||r>i)||((r>e||e!==e)&&(e=r),(a<i||i!==i)&&(i=a),i<0)?null:this.at(e>=0?e:i,t)}intersectsBox(A){return this.intersectBox(A,OA)!==null}intersectTriangle(A,t,e,i,s){di.subVectors(t,A),Se.subVectors(e,A),yi.crossVectors(di,Se);let n=this.direction.dot(yi),r;if(n>0){if(i)return null;r=1}else if(n<0)r=-1,n=-n;else return null;ot.subVectors(this.origin,A);const a=r*this.direction.dot(Se.crossVectors(ot,Se));if(a<0)return null;const o=r*this.direction.dot(di.cross(ot));if(o<0||a+o>n)return null;const B=-r*ot.dot(yi);return B<0?null:this.at(B/n,s)}applyMatrix4(A){return this.origin.applyMatrix4(A),this.direction.transformDirection(A),this}equals(A){return A.origin.equals(this.origin)&&A.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}}class CA{constructor(A,t,e,i,s,n,r,a,o,B,I,Q,h,E,C,c){CA.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],A!==void 0&&this.set(A,t,e,i,s,n,r,a,o,B,I,Q,h,E,C,c)}set(A,t,e,i,s,n,r,a,o,B,I,Q,h,E,C,c){const l=this.elements;return l[0]=A,l[4]=t,l[8]=e,l[12]=i,l[1]=s,l[5]=n,l[9]=r,l[13]=a,l[2]=o,l[6]=B,l[10]=I,l[14]=Q,l[3]=h,l[7]=E,l[11]=C,l[15]=c,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new CA().fromArray(this.elements)}copy(A){const t=this.elements,e=A.elements;return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],this}copyPosition(A){const t=this.elements,e=A.elements;return t[12]=e[12],t[13]=e[13],t[14]=e[14],this}setFromMatrix3(A){const t=A.elements;return this.set(t[0],t[3],t[6],0,t[1],t[4],t[7],0,t[2],t[5],t[8],0,0,0,0,1),this}extractBasis(A,t,e){return A.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),e.setFromMatrixColumn(this,2),this}makeBasis(A,t,e){return this.set(A.x,t.x,e.x,0,A.y,t.y,e.y,0,A.z,t.z,e.z,0,0,0,0,1),this}extractRotation(A){const t=this.elements,e=A.elements,i=1/Ut.setFromMatrixColumn(A,0).length(),s=1/Ut.setFromMatrixColumn(A,1).length(),n=1/Ut.setFromMatrixColumn(A,2).length();return t[0]=e[0]*i,t[1]=e[1]*i,t[2]=e[2]*i,t[3]=0,t[4]=e[4]*s,t[5]=e[5]*s,t[6]=e[6]*s,t[7]=0,t[8]=e[8]*n,t[9]=e[9]*n,t[10]=e[10]*n,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromEuler(A){const t=this.elements,e=A.x,i=A.y,s=A.z,n=Math.cos(e),r=Math.sin(e),a=Math.cos(i),o=Math.sin(i),B=Math.cos(s),I=Math.sin(s);if(A.order==="XYZ"){const Q=n*B,h=n*I,E=r*B,C=r*I;t[0]=a*B,t[4]=-a*I,t[8]=o,t[1]=h+E*o,t[5]=Q-C*o,t[9]=-r*a,t[2]=C-Q*o,t[6]=E+h*o,t[10]=n*a}else if(A.order==="YXZ"){const Q=a*B,h=a*I,E=o*B,C=o*I;t[0]=Q+C*r,t[4]=E*r-h,t[8]=n*o,t[1]=n*I,t[5]=n*B,t[9]=-r,t[2]=h*r-E,t[6]=C+Q*r,t[10]=n*a}else if(A.order==="ZXY"){const Q=a*B,h=a*I,E=o*B,C=o*I;t[0]=Q-C*r,t[4]=-n*I,t[8]=E+h*r,t[1]=h+E*r,t[5]=n*B,t[9]=C-Q*r,t[2]=-n*o,t[6]=r,t[10]=n*a}else if(A.order==="ZYX"){const Q=n*B,h=n*I,E=r*B,C=r*I;t[0]=a*B,t[4]=E*o-h,t[8]=Q*o+C,t[1]=a*I,t[5]=C*o+Q,t[9]=h*o-E,t[2]=-o,t[6]=r*a,t[10]=n*a}else if(A.order==="YZX"){const Q=n*a,h=n*o,E=r*a,C=r*o;t[0]=a*B,t[4]=C-Q*I,t[8]=E*I+h,t[1]=I,t[5]=n*B,t[9]=-r*B,t[2]=-o*B,t[6]=h*I+E,t[10]=Q-C*I}else if(A.order==="XZY"){const Q=n*a,h=n*o,E=r*a,C=r*o;t[0]=a*B,t[4]=-I,t[8]=o*B,t[1]=Q*I+C,t[5]=n*B,t[9]=h*I-E,t[2]=E*I-h,t[6]=r*B,t[10]=C*I+Q}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromQuaternion(A){return this.compose(or,A,Ir)}lookAt(A,t,e){const i=this.elements;return xA.subVectors(A,t),xA.lengthSq()===0&&(xA.z=1),xA.normalize(),It.crossVectors(e,xA),It.lengthSq()===0&&(Math.abs(e.z)===1?xA.x+=1e-4:xA.z+=1e-4,xA.normalize(),It.crossVectors(e,xA)),It.normalize(),Fe.crossVectors(xA,It),i[0]=It.x,i[4]=Fe.x,i[8]=xA.x,i[1]=It.y,i[5]=Fe.y,i[9]=xA.y,i[2]=It.z,i[6]=Fe.z,i[10]=xA.z,this}multiply(A){return this.multiplyMatrices(this,A)}premultiply(A){return this.multiplyMatrices(A,this)}multiplyMatrices(A,t){const e=A.elements,i=t.elements,s=this.elements,n=e[0],r=e[4],a=e[8],o=e[12],B=e[1],I=e[5],Q=e[9],h=e[13],E=e[2],C=e[6],c=e[10],l=e[14],y=e[3],d=e[7],f=e[11],p=e[15],m=i[0],x=i[4],w=i[8],D=i[12],N=i[1],M=i[5],S=i[9],F=i[13],k=i[2],U=i[6],R=i[10],G=i[14],v=i[3],T=i[7],$=i[11],V=i[15];return s[0]=n*m+r*N+a*k+o*v,s[4]=n*x+r*M+a*U+o*T,s[8]=n*w+r*S+a*R+o*$,s[12]=n*D+r*F+a*G+o*V,s[1]=B*m+I*N+Q*k+h*v,s[5]=B*x+I*M+Q*U+h*T,s[9]=B*w+I*S+Q*R+h*$,s[13]=B*D+I*F+Q*G+h*V,s[2]=E*m+C*N+c*k+l*v,s[6]=E*x+C*M+c*U+l*T,s[10]=E*w+C*S+c*R+l*$,s[14]=E*D+C*F+c*G+l*V,s[3]=y*m+d*N+f*k+p*v,s[7]=y*x+d*M+f*U+p*T,s[11]=y*w+d*S+f*R+p*$,s[15]=y*D+d*F+f*G+p*V,this}multiplyScalar(A){const t=this.elements;return t[0]*=A,t[4]*=A,t[8]*=A,t[12]*=A,t[1]*=A,t[5]*=A,t[9]*=A,t[13]*=A,t[2]*=A,t[6]*=A,t[10]*=A,t[14]*=A,t[3]*=A,t[7]*=A,t[11]*=A,t[15]*=A,this}determinant(){const A=this.elements,t=A[0],e=A[4],i=A[8],s=A[12],n=A[1],r=A[5],a=A[9],o=A[13],B=A[2],I=A[6],Q=A[10],h=A[14],E=A[3],C=A[7],c=A[11],l=A[15];return E*(+s*a*I-i*o*I-s*r*Q+e*o*Q+i*r*h-e*a*h)+C*(+t*a*h-t*o*Q+s*n*Q-i*n*h+i*o*B-s*a*B)+c*(+t*o*I-t*r*h-s*n*I+e*n*h+s*r*B-e*o*B)+l*(-i*r*B-t*a*I+t*r*Q+i*n*I-e*n*Q+e*a*B)}transpose(){const A=this.elements;let t;return t=A[1],A[1]=A[4],A[4]=t,t=A[2],A[2]=A[8],A[8]=t,t=A[6],A[6]=A[9],A[9]=t,t=A[3],A[3]=A[12],A[12]=t,t=A[7],A[7]=A[13],A[13]=t,t=A[11],A[11]=A[14],A[14]=t,this}setPosition(A,t,e){const i=this.elements;return A.isVector3?(i[12]=A.x,i[13]=A.y,i[14]=A.z):(i[12]=A,i[13]=t,i[14]=e),this}invert(){const A=this.elements,t=A[0],e=A[1],i=A[2],s=A[3],n=A[4],r=A[5],a=A[6],o=A[7],B=A[8],I=A[9],Q=A[10],h=A[11],E=A[12],C=A[13],c=A[14],l=A[15],y=I*c*o-C*Q*o+C*a*h-r*c*h-I*a*l+r*Q*l,d=E*Q*o-B*c*o-E*a*h+n*c*h+B*a*l-n*Q*l,f=B*C*o-E*I*o+E*r*h-n*C*h-B*r*l+n*I*l,p=E*I*a-B*C*a-E*r*Q+n*C*Q+B*r*c-n*I*c,m=t*y+e*d+i*f+s*p;if(m===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const x=1/m;return A[0]=y*x,A[1]=(C*Q*s-I*c*s-C*i*h+e*c*h+I*i*l-e*Q*l)*x,A[2]=(r*c*s-C*a*s+C*i*o-e*c*o-r*i*l+e*a*l)*x,A[3]=(I*a*s-r*Q*s-I*i*o+e*Q*o+r*i*h-e*a*h)*x,A[4]=d*x,A[5]=(B*c*s-E*Q*s+E*i*h-t*c*h-B*i*l+t*Q*l)*x,A[6]=(E*a*s-n*c*s-E*i*o+t*c*o+n*i*l-t*a*l)*x,A[7]=(n*Q*s-B*a*s+B*i*o-t*Q*o-n*i*h+t*a*h)*x,A[8]=f*x,A[9]=(E*I*s-B*C*s-E*e*h+t*C*h+B*e*l-t*I*l)*x,A[10]=(n*C*s-E*r*s+E*e*o-t*C*o-n*e*l+t*r*l)*x,A[11]=(B*r*s-n*I*s-B*e*o+t*I*o+n*e*h-t*r*h)*x,A[12]=p*x,A[13]=(B*C*i-E*I*i+E*e*Q-t*C*Q-B*e*c+t*I*c)*x,A[14]=(E*r*i-n*C*i-E*e*a+t*C*a+n*e*c-t*r*c)*x,A[15]=(n*I*i-B*r*i+B*e*a-t*I*a-n*e*Q+t*r*Q)*x,this}scale(A){const t=this.elements,e=A.x,i=A.y,s=A.z;return t[0]*=e,t[4]*=i,t[8]*=s,t[1]*=e,t[5]*=i,t[9]*=s,t[2]*=e,t[6]*=i,t[10]*=s,t[3]*=e,t[7]*=i,t[11]*=s,this}getMaxScaleOnAxis(){const A=this.elements,t=A[0]*A[0]+A[1]*A[1]+A[2]*A[2],e=A[4]*A[4]+A[5]*A[5]+A[6]*A[6],i=A[8]*A[8]+A[9]*A[9]+A[10]*A[10];return Math.sqrt(Math.max(t,e,i))}makeTranslation(A,t,e){return A.isVector3?this.set(1,0,0,A.x,0,1,0,A.y,0,0,1,A.z,0,0,0,1):this.set(1,0,0,A,0,1,0,t,0,0,1,e,0,0,0,1),this}makeRotationX(A){const t=Math.cos(A),e=Math.sin(A);return this.set(1,0,0,0,0,t,-e,0,0,e,t,0,0,0,0,1),this}makeRotationY(A){const t=Math.cos(A),e=Math.sin(A);return this.set(t,0,e,0,0,1,0,0,-e,0,t,0,0,0,0,1),this}makeRotationZ(A){const t=Math.cos(A),e=Math.sin(A);return this.set(t,-e,0,0,e,t,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(A,t){const e=Math.cos(t),i=Math.sin(t),s=1-e,n=A.x,r=A.y,a=A.z,o=s*n,B=s*r;return this.set(o*n+e,o*r-i*a,o*a+i*r,0,o*r+i*a,B*r+e,B*a-i*n,0,o*a-i*r,B*a+i*n,s*a*a+e,0,0,0,0,1),this}makeScale(A,t,e){return this.set(A,0,0,0,0,t,0,0,0,0,e,0,0,0,0,1),this}makeShear(A,t,e,i,s,n){return this.set(1,e,s,0,A,1,n,0,t,i,1,0,0,0,0,1),this}compose(A,t,e){const i=this.elements,s=t._x,n=t._y,r=t._z,a=t._w,o=s+s,B=n+n,I=r+r,Q=s*o,h=s*B,E=s*I,C=n*B,c=n*I,l=r*I,y=a*o,d=a*B,f=a*I,p=e.x,m=e.y,x=e.z;return i[0]=(1-(C+l))*p,i[1]=(h+f)*p,i[2]=(E-d)*p,i[3]=0,i[4]=(h-f)*m,i[5]=(1-(Q+l))*m,i[6]=(c+y)*m,i[7]=0,i[8]=(E+d)*x,i[9]=(c-y)*x,i[10]=(1-(Q+C))*x,i[11]=0,i[12]=A.x,i[13]=A.y,i[14]=A.z,i[15]=1,this}decompose(A,t,e){const i=this.elements;let s=Ut.set(i[0],i[1],i[2]).length();const n=Ut.set(i[4],i[5],i[6]).length(),r=Ut.set(i[8],i[9],i[10]).length();this.determinant()<0&&(s=-s),A.x=i[12],A.y=i[13],A.z=i[14],HA.copy(this);const o=1/s,B=1/n,I=1/r;return HA.elements[0]*=o,HA.elements[1]*=o,HA.elements[2]*=o,HA.elements[4]*=B,HA.elements[5]*=B,HA.elements[6]*=B,HA.elements[8]*=I,HA.elements[9]*=I,HA.elements[10]*=I,t.setFromRotationMatrix(HA),e.x=s,e.y=n,e.z=r,this}makePerspective(A,t,e,i,s,n,r=Ae){const a=this.elements,o=2*s/(t-A),B=2*s/(e-i),I=(t+A)/(t-A),Q=(e+i)/(e-i);let h,E;if(r===Ae)h=-(n+s)/(n-s),E=-2*n*s/(n-s);else if(r===fs)h=-n/(n-s),E=-n*s/(n-s);else throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+r);return a[0]=o,a[4]=0,a[8]=I,a[12]=0,a[1]=0,a[5]=B,a[9]=Q,a[13]=0,a[2]=0,a[6]=0,a[10]=h,a[14]=E,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(A,t,e,i,s,n,r=Ae){const a=this.elements,o=1/(t-A),B=1/(e-i),I=1/(n-s),Q=(t+A)*o,h=(e+i)*B;let E,C;if(r===Ae)E=(n+s)*I,C=-2*I;else if(r===fs)E=s*I,C=-1*I;else throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+r);return a[0]=2*o,a[4]=0,a[8]=0,a[12]=-Q,a[1]=0,a[5]=2*B,a[9]=0,a[13]=-h,a[2]=0,a[6]=0,a[10]=C,a[14]=-E,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(A){const t=this.elements,e=A.elements;for(let i=0;i<16;i++)if(t[i]!==e[i])return!1;return!0}fromArray(A,t=0){for(let e=0;e<16;e++)this.elements[e]=A[e+t];return this}toArray(A=[],t=0){const e=this.elements;return A[t]=e[0],A[t+1]=e[1],A[t+2]=e[2],A[t+3]=e[3],A[t+4]=e[4],A[t+5]=e[5],A[t+6]=e[6],A[t+7]=e[7],A[t+8]=e[8],A[t+9]=e[9],A[t+10]=e[10],A[t+11]=e[11],A[t+12]=e[12],A[t+13]=e[13],A[t+14]=e[14],A[t+15]=e[15],A}}const Ut=new u,HA=new CA,or=new u(0,0,0),Ir=new u(1,1,1),It=new u,Fe=new u,xA=new u,Fs=new CA,Ns=new gA;class dt{constructor(A=0,t=0,e=0,i=dt.DEFAULT_ORDER){this.isEuler=!0,this._x=A,this._y=t,this._z=e,this._order=i}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 order(){return this._order}set order(A){this._order=A,this._onChangeCallback()}set(A,t,e,i=this._order){return this._x=A,this._y=t,this._z=e,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(A){return this._x=A._x,this._y=A._y,this._z=A._z,this._order=A._order,this._onChangeCallback(),this}setFromRotationMatrix(A,t=this._order,e=!0){const i=A.elements,s=i[0],n=i[4],r=i[8],a=i[1],o=i[5],B=i[9],I=i[2],Q=i[6],h=i[10];switch(t){case"XYZ":this._y=Math.asin(H(r,-1,1)),Math.abs(r)<.9999999?(this._x=Math.atan2(-B,h),this._z=Math.atan2(-n,s)):(this._x=Math.atan2(Q,o),this._z=0);break;case"YXZ":this._x=Math.asin(-H(B,-1,1)),Math.abs(B)<.9999999?(this._y=Math.atan2(r,h),this._z=Math.atan2(a,o)):(this._y=Math.atan2(-I,s),this._z=0);break;case"ZXY":this._x=Math.asin(H(Q,-1,1)),Math.abs(Q)<.9999999?(this._y=Math.atan2(-I,h),this._z=Math.atan2(-n,o)):(this._y=0,this._z=Math.atan2(a,s));break;case"ZYX":this._y=Math.asin(-H(I,-1,1)),Math.abs(I)<.9999999?(this._x=Math.atan2(Q,h),this._z=Math.atan2(a,s)):(this._x=0,this._z=Math.atan2(-n,o));break;case"YZX":this._z=Math.asin(H(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-B,o),this._y=Math.atan2(-I,s)):(this._x=0,this._y=Math.atan2(r,h));break;case"XZY":this._z=Math.asin(-H(n,-1,1)),Math.abs(n)<.9999999?(this._x=Math.atan2(Q,o),this._y=Math.atan2(r,s)):(this._x=Math.atan2(-B,h),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+t)}return this._order=t,e===!0&&this._onChangeCallback(),this}setFromQuaternion(A,t,e){return Fs.makeRotationFromQuaternion(A),this.setFromRotationMatrix(Fs,t,e)}setFromVector3(A,t=this._order){return this.set(A.x,A.y,A.z,t)}reorder(A){return Ns.setFromEuler(this),this.setFromQuaternion(Ns,A)}equals(A){return A._x===this._x&&A._y===this._y&&A._z===this._z&&A._order===this._order}fromArray(A){return this._x=A[0],this._y=A[1],this._z=A[2],A[3]!==void 0&&(this._order=A[3]),this._onChangeCallback(),this}toArray(A=[],t=0){return A[t]=this._x,A[t+1]=this._y,A[t+2]=this._z,A[t+3]=this._order,A}_onChange(A){return this._onChangeCallback=A,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}dt.DEFAULT_ORDER="XYZ";class Br{constructor(){this.mask=1}set(A){this.mask=(1<<A|0)>>>0}enable(A){this.mask|=1<<A|0}enableAll(){this.mask=-1}toggle(A){this.mask^=1<<A|0}disable(A){this.mask&=~(1<<A|0)}disableAll(){this.mask=0}test(A){return(this.mask&A.mask)!==0}isEnabled(A){return(this.mask&(1<<A|0))!==0}}let Qr=0;const ks=new u,Gt=new gA,VA=new CA,Ne=new u,re=new u,hr=new u,Er=new gA,Rs=new u(1,0,0),Us=new u(0,1,0),Gs=new u(0,0,1),bs={type:"added"},Cr={type:"removed"},bt={type:"childadded",child:null},fi={type:"childremoved",child:null};class wA extends te{constructor(){super(),this.isObject3D=!0,Object.defineProperty(this,"id",{value:Qr++}),this.uuid=ee(),this.name="",this.type="Object3D",this.parent=null,this.children=[],this.up=wA.DEFAULT_UP.clone();const A=new u,t=new dt,e=new gA,i=new u(1,1,1);function s(){e.setFromEuler(t,!1)}function n(){t.setFromQuaternion(e,void 0,!1)}t._onChange(s),e._onChange(n),Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:A},rotation:{configurable:!0,enumerable:!0,value:t},quaternion:{configurable:!0,enumerable:!0,value:e},scale:{configurable:!0,enumerable:!0,value:i},modelViewMatrix:{value:new CA},normalMatrix:{value:new qA}}),this.matrix=new CA,this.matrixWorld=new CA,this.matrixAutoUpdate=wA.DEFAULT_MATRIX_AUTO_UPDATE,this.matrixWorldAutoUpdate=wA.DEFAULT_MATRIX_WORLD_AUTO_UPDATE,this.matrixWorldNeedsUpdate=!1,this.layers=new Br,this.visible=!0,this.castShadow=!1,this.receiveShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.animations=[],this.userData={}}onBeforeShadow(){}onAfterShadow(){}onBeforeRender(){}onAfterRender(){}applyMatrix4(A){this.matrixAutoUpdate&&this.updateMatrix(),this.matrix.premultiply(A),this.matrix.decompose(this.position,this.quaternion,this.scale)}applyQuaternion(A){return this.quaternion.premultiply(A),this}setRotationFromAxisAngle(A,t){this.quaternion.setFromAxisAngle(A,t)}setRotationFromEuler(A){this.quaternion.setFromEuler(A,!0)}setRotationFromMatrix(A){this.quaternion.setFromRotationMatrix(A)}setRotationFromQuaternion(A){this.quaternion.copy(A)}rotateOnAxis(A,t){return Gt.setFromAxisAngle(A,t),this.quaternion.multiply(Gt),this}rotateOnWorldAxis(A,t){return Gt.setFromAxisAngle(A,t),this.quaternion.premultiply(Gt),this}rotateX(A){return this.rotateOnAxis(Rs,A)}rotateY(A){return this.rotateOnAxis(Us,A)}rotateZ(A){return this.rotateOnAxis(Gs,A)}translateOnAxis(A,t){return ks.copy(A).applyQuaternion(this.quaternion),this.position.add(ks.multiplyScalar(t)),this}translateX(A){return this.translateOnAxis(Rs,A)}translateY(A){return this.translateOnAxis(Us,A)}translateZ(A){return this.translateOnAxis(Gs,A)}localToWorld(A){return this.updateWorldMatrix(!0,!1),A.applyMatrix4(this.matrixWorld)}worldToLocal(A){return this.updateWorldMatrix(!0,!1),A.applyMatrix4(VA.copy(this.matrixWorld).invert())}lookAt(A,t,e){A.isVector3?Ne.copy(A):Ne.set(A,t,e);const i=this.parent;this.updateWorldMatrix(!0,!1),re.setFromMatrixPosition(this.matrixWorld),this.isCamera||this.isLight?VA.lookAt(re,Ne,this.up):VA.lookAt(Ne,re,this.up),this.quaternion.setFromRotationMatrix(VA),i&&(VA.extractRotation(i.matrixWorld),Gt.setFromRotationMatrix(VA),this.quaternion.premultiply(Gt.invert()))}add(A){if(arguments.length>1){for(let t=0;t<arguments.length;t++)this.add(arguments[t]);return this}return A===this?(console.error("THREE.Object3D.add: object can\'t be added as a child of itself.",A),this):(A&&A.isObject3D?(A.removeFromParent(),A.parent=this,this.children.push(A),A.dispatchEvent(bs),bt.child=A,this.dispatchEvent(bt),bt.child=null):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",A),this)}remove(A){if(arguments.length>1){for(let e=0;e<arguments.length;e++)this.remove(arguments[e]);return this}const t=this.children.indexOf(A);return t!==-1&&(A.parent=null,this.children.splice(t,1),A.dispatchEvent(Cr),fi.child=A,this.dispatchEvent(fi),fi.child=null),this}removeFromParent(){const A=this.parent;return A!==null&&A.remove(this),this}clear(){return this.remove(...this.children)}attach(A){return this.updateWorldMatrix(!0,!1),VA.copy(this.matrixWorld).invert(),A.parent!==null&&(A.parent.updateWorldMatrix(!0,!1),VA.multiply(A.parent.matrixWorld)),A.applyMatrix4(VA),A.removeFromParent(),A.parent=this,this.children.push(A),A.updateWorldMatrix(!1,!0),A.dispatchEvent(bs),bt.child=A,this.dispatchEvent(bt),bt.child=null,this}getObjectById(A){return this.getObjectByProperty("id",A)}getObjectByName(A){return this.getObjectByProperty("name",A)}getObjectByProperty(A,t){if(this[A]===t)return this;for(let e=0,i=this.children.length;e<i;e++){const n=this.children[e].getObjectByProperty(A,t);if(n!==void 0)return n}}getObjectsByProperty(A,t,e=[]){this[A]===t&&e.push(this);const i=this.children;for(let s=0,n=i.length;s<n;s++)i[s].getObjectsByProperty(A,t,e);return e}getWorldPosition(A){return this.updateWorldMatrix(!0,!1),A.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(A){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(re,A,hr),A}getWorldScale(A){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(re,Er,A),A}getWorldDirection(A){this.updateWorldMatrix(!0,!1);const t=this.matrixWorld.elements;return A.set(t[8],t[9],t[10]).normalize()}raycast(){}traverse(A){A(this);const t=this.children;for(let e=0,i=t.length;e<i;e++)t[e].traverse(A)}traverseVisible(A){if(this.visible===!1)return;A(this);const t=this.children;for(let e=0,i=t.length;e<i;e++)t[e].traverseVisible(A)}traverseAncestors(A){const t=this.parent;t!==null&&(A(t),t.traverseAncestors(A))}updateMatrix(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0}updateMatrixWorld(A){this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||A)&&(this.matrixWorldAutoUpdate===!0&&(this.parent===null?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix)),this.matrixWorldNeedsUpdate=!1,A=!0);const t=this.children;for(let e=0,i=t.length;e<i;e++)t[e].updateMatrixWorld(A)}updateWorldMatrix(A,t){const e=this.parent;if(A===!0&&e!==null&&e.updateWorldMatrix(!0,!1),this.matrixAutoUpdate&&this.updateMatrix(),this.matrixWorldAutoUpdate===!0&&(this.parent===null?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix)),t===!0){const i=this.children;for(let s=0,n=i.length;s<n;s++)i[s].updateWorldMatrix(!1,!0)}}toJSON(A){const t=A===void 0||typeof A=="string",e={};t&&(A={geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{},nodes:{}},e.metadata={version:4.6,type:"Object",generator:"Object3D.toJSON"});const i={};i.uuid=this.uuid,i.type=this.type,this.name!==""&&(i.name=this.name),this.castShadow===!0&&(i.castShadow=!0),this.receiveShadow===!0&&(i.receiveShadow=!0),this.visible===!1&&(i.visible=!1),this.frustumCulled===!1&&(i.frustumCulled=!1),this.renderOrder!==0&&(i.renderOrder=this.renderOrder),Object.keys(this.userData).length>0&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),i.up=this.up.toArray(),this.matrixAutoUpdate===!1&&(i.matrixAutoUpdate=!1),this.isInstancedMesh&&(i.type="InstancedMesh",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(i.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(i.type="BatchedMesh",i.perObjectFrustumCulled=this.perObjectFrustumCulled,i.sortObjects=this.sortObjects,i.drawRanges=this._drawRanges,i.reservedRanges=this._reservedRanges,i.visibility=this._visibility,i.active=this._active,i.bounds=this._bounds.map(r=>({boxInitialized:r.boxInitialized,boxMin:r.box.min.toArray(),boxMax:r.box.max.toArray(),sphereInitialized:r.sphereInitialized,sphereRadius:r.sphere.radius,sphereCenter:r.sphere.center.toArray()})),i.maxInstanceCount=this._maxInstanceCount,i.maxVertexCount=this._maxVertexCount,i.maxIndexCount=this._maxIndexCount,i.geometryInitialized=this._geometryInitialized,i.geometryCount=this._geometryCount,i.matricesTexture=this._matricesTexture.toJSON(A),this._colorsTexture!==null&&(i.colorsTexture=this._colorsTexture.toJSON(A)),this.boundingSphere!==null&&(i.boundingSphere={center:i.boundingSphere.center.toArray(),radius:i.boundingSphere.radius}),this.boundingBox!==null&&(i.boundingBox={min:i.boundingBox.min.toArray(),max:i.boundingBox.max.toArray()}));function s(r,a){return r[a.uuid]===void 0&&(r[a.uuid]=a.toJSON(A)),a.uuid}if(this.isScene)this.background&&(this.background.isColor?i.background=this.background.toJSON():this.background.isTexture&&(i.background=this.background.toJSON(A).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(i.environment=this.environment.toJSON(A).uuid);else if(this.isMesh||this.isLine||this.isPoints){i.geometry=s(A.geometries,this.geometry);const r=this.geometry.parameters;if(r!==void 0&&r.shapes!==void 0){const a=r.shapes;if(Array.isArray(a))for(let o=0,B=a.length;o<B;o++){const I=a[o];s(A.shapes,I)}else s(A.shapes,a)}}if(this.isSkinnedMesh&&(i.bindMode=this.bindMode,i.bindMatrix=this.bindMatrix.toArray(),this.skeleton!==void 0&&(s(A.skeletons,this.skeleton),i.skeleton=this.skeleton.uuid)),this.material!==void 0)if(Array.isArray(this.material)){const r=[];for(let a=0,o=this.material.length;a<o;a++)r.push(s(A.materials,this.material[a]));i.material=r}else i.material=s(A.materials,this.material);if(this.children.length>0){i.children=[];for(let r=0;r<this.children.length;r++)i.children.push(this.children[r].toJSON(A).object)}if(this.animations.length>0){i.animations=[];for(let r=0;r<this.animations.length;r++){const a=this.animations[r];i.animations.push(s(A.animations,a))}}if(t){const r=n(A.geometries),a=n(A.materials),o=n(A.textures),B=n(A.images),I=n(A.shapes),Q=n(A.skeletons),h=n(A.animations),E=n(A.nodes);r.length>0&&(e.geometries=r),a.length>0&&(e.materials=a),o.length>0&&(e.textures=o),B.length>0&&(e.images=B),I.length>0&&(e.shapes=I),Q.length>0&&(e.skeletons=Q),h.length>0&&(e.animations=h),E.length>0&&(e.nodes=E)}return e.object=i,e;function n(r){const a=[];for(const o in r){const B=r[o];delete B.metadata,a.push(B)}return a}}clone(A){return new this.constructor().copy(this,A)}copy(A,t=!0){if(this.name=A.name,this.up.copy(A.up),this.position.copy(A.position),this.rotation.order=A.rotation.order,this.quaternion.copy(A.quaternion),this.scale.copy(A.scale),this.matrix.copy(A.matrix),this.matrixWorld.copy(A.matrixWorld),this.matrixAutoUpdate=A.matrixAutoUpdate,this.matrixWorldAutoUpdate=A.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=A.matrixWorldNeedsUpdate,this.layers.mask=A.layers.mask,this.visible=A.visible,this.castShadow=A.castShadow,this.receiveShadow=A.receiveShadow,this.frustumCulled=A.frustumCulled,this.renderOrder=A.renderOrder,this.animations=A.animations.slice(),this.userData=JSON.parse(JSON.stringify(A.userData)),t===!0)for(let e=0;e<A.children.length;e++){const i=A.children[e];this.add(i.clone())}return this}}wA.DEFAULT_UP=new u(0,1,0),wA.DEFAULT_MATRIX_AUTO_UPDATE=!0,wA.DEFAULT_MATRIX_WORLD_AUTO_UPDATE=!0;const TA=new u,XA=new u,wi=new u,jA=new u,Lt=new u,Yt=new u,Ls=new u,pi=new u,Di=new u,mi=new u,xi=new uA,Mi=new uA,Si=new uA;class zA{constructor(A=new u,t=new u,e=new u){this.a=A,this.b=t,this.c=e}static getNormal(A,t,e,i){i.subVectors(e,t),TA.subVectors(A,t),i.cross(TA);const s=i.lengthSq();return s>0?i.multiplyScalar(1/Math.sqrt(s)):i.set(0,0,0)}static getBarycoord(A,t,e,i,s){TA.subVectors(i,t),XA.subVectors(e,t),wi.subVectors(A,t);const n=TA.dot(TA),r=TA.dot(XA),a=TA.dot(wi),o=XA.dot(XA),B=XA.dot(wi),I=n*o-r*r;if(I===0)return s.set(0,0,0),null;const Q=1/I,h=(o*a-r*B)*Q,E=(n*B-r*a)*Q;return s.set(1-h-E,E,h)}static containsPoint(A,t,e,i){return this.getBarycoord(A,t,e,i,jA)===null?!1:jA.x>=0&&jA.y>=0&&jA.x+jA.y<=1}static getInterpolation(A,t,e,i,s,n,r,a){return this.getBarycoord(A,t,e,i,jA)===null?(a.x=0,a.y=0,"z"in a&&(a.z=0),"w"in a&&(a.w=0),null):(a.setScalar(0),a.addScaledVector(s,jA.x),a.addScaledVector(n,jA.y),a.addScaledVector(r,jA.z),a)}static getInterpolatedAttribute(A,t,e,i,s,n){return xi.setScalar(0),Mi.setScalar(0),Si.setScalar(0),xi.fromBufferAttribute(A,t),Mi.fromBufferAttribute(A,e),Si.fromBufferAttribute(A,i),n.setScalar(0),n.addScaledVector(xi,s.x),n.addScaledVector(Mi,s.y),n.addScaledVector(Si,s.z),n}static isFrontFacing(A,t,e,i){return TA.subVectors(e,t),XA.subVectors(A,t),TA.cross(XA).dot(i)<0}set(A,t,e){return this.a.copy(A),this.b.copy(t),this.c.copy(e),this}setFromPointsAndIndices(A,t,e,i){return this.a.copy(A[t]),this.b.copy(A[e]),this.c.copy(A[i]),this}setFromAttributeAndIndices(A,t,e,i){return this.a.fromBufferAttribute(A,t),this.b.fromBufferAttribute(A,e),this.c.fromBufferAttribute(A,i),this}clone(){return new this.constructor().copy(this)}copy(A){return this.a.copy(A.a),this.b.copy(A.b),this.c.copy(A.c),this}getArea(){return TA.subVectors(this.c,this.b),XA.subVectors(this.a,this.b),TA.cross(XA).length()*.5}getMidpoint(A){return A.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(A){return zA.getNormal(this.a,this.b,this.c,A)}getPlane(A){return A.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(A,t){return zA.getBarycoord(A,this.a,this.b,this.c,t)}getInterpolation(A,t,e,i,s){return zA.getInterpolation(A,this.a,this.b,this.c,t,e,i,s)}containsPoint(A){return zA.containsPoint(A,this.a,this.b,this.c)}isFrontFacing(A){return zA.isFrontFacing(this.a,this.b,this.c,A)}intersectsBox(A){return A.intersectsTriangle(this)}closestPointToPoint(A,t){const e=this.a,i=this.b,s=this.c;let n,r;Lt.subVectors(i,e),Yt.subVectors(s,e),pi.subVectors(A,e);const a=Lt.dot(pi),o=Yt.dot(pi);if(a<=0&&o<=0)return t.copy(e);Di.subVectors(A,i);const B=Lt.dot(Di),I=Yt.dot(Di);if(B>=0&&I<=B)return t.copy(i);const Q=a*I-B*o;if(Q<=0&&a>=0&&B<=0)return n=a/(a-B),t.copy(e).addScaledVector(Lt,n);mi.subVectors(A,s);const h=Lt.dot(mi),E=Yt.dot(mi);if(E>=0&&h<=E)return t.copy(s);const C=h*o-a*E;if(C<=0&&o>=0&&E<=0)return r=o/(o-E),t.copy(e).addScaledVector(Yt,r);const c=B*E-h*I;if(c<=0&&I-B>=0&&h-E>=0)return Ls.subVectors(s,i),r=(I-B)/(I-B+(h-E)),t.copy(i).addScaledVector(Ls,r);const l=1/(c+C+Q);return n=C*l,r=Q*l,t.copy(e).addScaledVector(Lt,n).addScaledVector(Yt,r)}equals(A){return A.a.equals(this.a)&&A.b.equals(this.b)&&A.c.equals(this.c)}}const Ys={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},Bt={h:0,s:0,l:0},ke={h:0,s:0,l:0};function Fi(g,A,t){return t<0&&(t+=1),t>1&&(t-=1),t<1/6?g+(A-g)*6*t:t<1/2?A:t<2/3?g+(A-g)*6*(2/3-t):g}class yt{constructor(A,t,e){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(A,t,e)}set(A,t,e){if(t===void 0&&e===void 0){const i=A;i&&i.isColor?this.copy(i):typeof i=="number"?this.setHex(i):typeof i=="string"&&this.setStyle(i)}else this.setRGB(A,t,e);return this}setScalar(A){return this.r=A,this.g=A,this.b=A,this}setHex(A,t=LA){return A=Math.floor(A),this.r=(A>>16&255)/255,this.g=(A>>8&255)/255,this.b=(A&255)/255,YA.toWorkingColorSpace(this,t),this}setRGB(A,t,e,i=YA.workingColorSpace){return this.r=A,this.g=t,this.b=e,YA.toWorkingColorSpace(this,i),this}setHSL(A,t,e,i=YA.workingColorSpace){if(A=$n(A,1),t=H(t,0,1),e=H(e,0,1),t===0)this.r=this.g=this.b=e;else{const s=e<=.5?e*(1+t):e+t-e*t,n=2*e-s;this.r=Fi(n,s,A+1/3),this.g=Fi(n,s,A),this.b=Fi(n,s,A-1/3)}return YA.toWorkingColorSpace(this,i),this}setStyle(A,t=LA){function e(s){s!==void 0&&parseFloat(s)<1&&console.warn("THREE.Color: Alpha component of "+A+" will be ignored.")}let i;if(i=/^(\\w+)\\(([^\\)]*)\\)/.exec(A)){let s;const n=i[1],r=i[2];switch(n){case"rgb":case"rgba":if(s=/^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(r))return e(s[4]),this.setRGB(Math.min(255,parseInt(s[1],10))/255,Math.min(255,parseInt(s[2],10))/255,Math.min(255,parseInt(s[3],10))/255,t);if(s=/^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(r))return e(s[4]),this.setRGB(Math.min(100,parseInt(s[1],10))/100,Math.min(100,parseInt(s[2],10))/100,Math.min(100,parseInt(s[3],10))/100,t);break;case"hsl":case"hsla":if(s=/^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(r))return e(s[4]),this.setHSL(parseFloat(s[1])/360,parseFloat(s[2])/100,parseFloat(s[3])/100,t);break;default:console.warn("THREE.Color: Unknown color model "+A)}}else if(i=/^\\#([A-Fa-f\\d]+)$/.exec(A)){const s=i[1],n=s.length;if(n===3)return this.setRGB(parseInt(s.charAt(0),16)/15,parseInt(s.charAt(1),16)/15,parseInt(s.charAt(2),16)/15,t);if(n===6)return this.setHex(parseInt(s,16),t);console.warn("THREE.Color: Invalid hex color "+A)}else if(A&&A.length>0)return this.setColorName(A,t);return this}setColorName(A,t=LA){const e=Ys[A.toLowerCase()];return e!==void 0?this.setHex(e,t):console.warn("THREE.Color: Unknown color "+A),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(A){return this.r=A.r,this.g=A.g,this.b=A.b,this}copySRGBToLinear(A){return this.r=WA(A.r),this.g=WA(A.g),this.b=WA(A.b),this}copyLinearToSRGB(A){return this.r=Mt(A.r),this.g=Mt(A.g),this.b=Mt(A.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(A=LA){return YA.fromWorkingColorSpace(cA.copy(this),A),Math.round(H(cA.r*255,0,255))*65536+Math.round(H(cA.g*255,0,255))*256+Math.round(H(cA.b*255,0,255))}getHexString(A=LA){return("000000"+this.getHex(A).toString(16)).slice(-6)}getHSL(A,t=YA.workingColorSpace){YA.fromWorkingColorSpace(cA.copy(this),t);const e=cA.r,i=cA.g,s=cA.b,n=Math.max(e,i,s),r=Math.min(e,i,s);let a,o;const B=(r+n)/2;if(r===n)a=0,o=0;else{const I=n-r;switch(o=B<=.5?I/(n+r):I/(2-n-r),n){case e:a=(i-s)/I+(i<s?6:0);break;case i:a=(s-e)/I+2;break;case s:a=(e-i)/I+4;break}a/=6}return A.h=a,A.s=o,A.l=B,A}getRGB(A,t=YA.workingColorSpace){return YA.fromWorkingColorSpace(cA.copy(this),t),A.r=cA.r,A.g=cA.g,A.b=cA.b,A}getStyle(A=LA){YA.fromWorkingColorSpace(cA.copy(this),A);const t=cA.r,e=cA.g,i=cA.b;return A!==LA?`color(${A} ${t.toFixed(3)} ${e.toFixed(3)} ${i.toFixed(3)})`:`rgb(${Math.round(t*255)},${Math.round(e*255)},${Math.round(i*255)})`}offsetHSL(A,t,e){return this.getHSL(Bt),this.setHSL(Bt.h+A,Bt.s+t,Bt.l+e)}add(A){return this.r+=A.r,this.g+=A.g,this.b+=A.b,this}addColors(A,t){return this.r=A.r+t.r,this.g=A.g+t.g,this.b=A.b+t.b,this}addScalar(A){return this.r+=A,this.g+=A,this.b+=A,this}sub(A){return this.r=Math.max(0,this.r-A.r),this.g=Math.max(0,this.g-A.g),this.b=Math.max(0,this.b-A.b),this}multiply(A){return this.r*=A.r,this.g*=A.g,this.b*=A.b,this}multiplyScalar(A){return this.r*=A,this.g*=A,this.b*=A,this}lerp(A,t){return this.r+=(A.r-this.r)*t,this.g+=(A.g-this.g)*t,this.b+=(A.b-this.b)*t,this}lerpColors(A,t,e){return this.r=A.r+(t.r-A.r)*e,this.g=A.g+(t.g-A.g)*e,this.b=A.b+(t.b-A.b)*e,this}lerpHSL(A,t){this.getHSL(Bt),A.getHSL(ke);const e=Qi(Bt.h,ke.h,t),i=Qi(Bt.s,ke.s,t),s=Qi(Bt.l,ke.l,t);return this.setHSL(e,i,s),this}setFromVector3(A){return this.r=A.x,this.g=A.y,this.b=A.z,this}applyMatrix3(A){const t=this.r,e=this.g,i=this.b,s=A.elements;return this.r=s[0]*t+s[3]*e+s[6]*i,this.g=s[1]*t+s[4]*e+s[7]*i,this.b=s[2]*t+s[5]*e+s[8]*i,this}equals(A){return A.r===this.r&&A.g===this.g&&A.b===this.b}fromArray(A,t=0){return this.r=A[t],this.g=A[t+1],this.b=A[t+2],this}toArray(A=[],t=0){return A[t]=this.r,A[t+1]=this.g,A[t+2]=this.b,A}fromBufferAttribute(A,t){return this.r=A.getX(t),this.g=A.getY(t),this.b=A.getZ(t),this}toJSON(){return this.getHex()}*[Symbol.iterator](){yield this.r,yield this.g,yield this.b}}const cA=new yt;yt.NAMES=Ys;let cr=0;class Js extends te{constructor(){super(),this.isMaterial=!0,Object.defineProperty(this,"id",{value:cr++}),this.uuid=ee(),this.name="",this.type="Material",this.blending=as,this.side=Ii,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.alphaHash=!1,this.blendSrc=os,this.blendDst=Is,this.blendEquation=gs,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.blendColor=new yt(0,0,0),this.blendAlpha=0,this.depthFunc=Bs,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=ds,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=xt,this.stencilZFail=xt,this.stencilZPass=xt,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.forceSinglePass=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(A){this._alphaTest>0!=A>0&&this.version++,this._alphaTest=A}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(A){if(A!==void 0)for(const t in A){const e=A[t];if(e===void 0){console.warn(`THREE.Material: parameter \'${t}\' has value of undefined.`);continue}const i=this[t];if(i===void 0){console.warn(`THREE.Material: \'${t}\' is not a property of THREE.${this.type}.`);continue}i&&i.isColor?i.set(e):i&&i.isVector3&&e&&e.isVector3?i.copy(e):this[t]=e}}toJSON(A){const t=A===void 0||typeof A=="string";t&&(A={textures:{},images:{}});const e={metadata:{version:4.6,type:"Material",generator:"Material.toJSON"}};e.uuid=this.uuid,e.type=this.type,this.name!==""&&(e.name=this.name),this.color&&this.color.isColor&&(e.color=this.color.getHex()),this.roughness!==void 0&&(e.roughness=this.roughness),this.metalness!==void 0&&(e.metalness=this.metalness),this.sheen!==void 0&&(e.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(e.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(e.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(e.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(e.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(e.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(e.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(e.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(e.shininess=this.shininess),this.clearcoat!==void 0&&(e.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(e.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(e.clearcoatMap=this.clearcoatMap.toJSON(A).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(e.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(A).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(e.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(A).uuid,e.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.dispersion!==void 0&&(e.dispersion=this.dispersion),this.iridescence!==void 0&&(e.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(e.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(e.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(e.iridescenceMap=this.iridescenceMap.toJSON(A).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(e.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(A).uuid),this.anisotropy!==void 0&&(e.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(e.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(e.anisotropyMap=this.anisotropyMap.toJSON(A).uuid),this.map&&this.map.isTexture&&(e.map=this.map.toJSON(A).uuid),this.matcap&&this.matcap.isTexture&&(e.matcap=this.matcap.toJSON(A).uuid),this.alphaMap&&this.alphaMap.isTexture&&(e.alphaMap=this.alphaMap.toJSON(A).uuid),this.lightMap&&this.lightMap.isTexture&&(e.lightMap=this.lightMap.toJSON(A).uuid,e.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(e.aoMap=this.aoMap.toJSON(A).uuid,e.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(e.bumpMap=this.bumpMap.toJSON(A).uuid,e.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(e.normalMap=this.normalMap.toJSON(A).uuid,e.normalMapType=this.normalMapType,e.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(e.displacementMap=this.displacementMap.toJSON(A).uuid,e.displacementScale=this.displacementScale,e.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(e.roughnessMap=this.roughnessMap.toJSON(A).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(e.metalnessMap=this.metalnessMap.toJSON(A).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(e.emissiveMap=this.emissiveMap.toJSON(A).uuid),this.specularMap&&this.specularMap.isTexture&&(e.specularMap=this.specularMap.toJSON(A).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(e.specularIntensityMap=this.specularIntensityMap.toJSON(A).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(e.specularColorMap=this.specularColorMap.toJSON(A).uuid),this.envMap&&this.envMap.isTexture&&(e.envMap=this.envMap.toJSON(A).uuid,this.combine!==void 0&&(e.combine=this.combine)),this.envMapRotation!==void 0&&(e.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(e.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(e.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(e.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(e.gradientMap=this.gradientMap.toJSON(A).uuid),this.transmission!==void 0&&(e.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(e.transmissionMap=this.transmissionMap.toJSON(A).uuid),this.thickness!==void 0&&(e.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(e.thicknessMap=this.thicknessMap.toJSON(A).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(e.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(e.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(e.size=this.size),this.shadowSide!==null&&(e.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(e.sizeAttenuation=this.sizeAttenuation),this.blending!==as&&(e.blending=this.blending),this.side!==Ii&&(e.side=this.side),this.vertexColors===!0&&(e.vertexColors=!0),this.opacity<1&&(e.opacity=this.opacity),this.transparent===!0&&(e.transparent=!0),this.blendSrc!==os&&(e.blendSrc=this.blendSrc),this.blendDst!==Is&&(e.blendDst=this.blendDst),this.blendEquation!==gs&&(e.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(e.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(e.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(e.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(e.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(e.blendAlpha=this.blendAlpha),this.depthFunc!==Bs&&(e.depthFunc=this.depthFunc),this.depthTest===!1&&(e.depthTest=this.depthTest),this.depthWrite===!1&&(e.depthWrite=this.depthWrite),this.colorWrite===!1&&(e.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(e.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==ds&&(e.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(e.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(e.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==xt&&(e.stencilFail=this.stencilFail),this.stencilZFail!==xt&&(e.stencilZFail=this.stencilZFail),this.stencilZPass!==xt&&(e.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(e.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(e.rotation=this.rotation),this.polygonOffset===!0&&(e.polygonOffset=!0),this.polygonOffsetFactor!==0&&(e.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(e.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(e.linewidth=this.linewidth),this.dashSize!==void 0&&(e.dashSize=this.dashSize),this.gapSize!==void 0&&(e.gapSize=this.gapSize),this.scale!==void 0&&(e.scale=this.scale),this.dithering===!0&&(e.dithering=!0),this.alphaTest>0&&(e.alphaTest=this.alphaTest),this.alphaHash===!0&&(e.alphaHash=!0),this.alphaToCoverage===!0&&(e.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(e.premultipliedAlpha=!0),this.forceSinglePass===!0&&(e.forceSinglePass=!0),this.wireframe===!0&&(e.wireframe=!0),this.wireframeLinewidth>1&&(e.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(e.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(e.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(e.flatShading=!0),this.visible===!1&&(e.visible=!1),this.toneMapped===!1&&(e.toneMapped=!1),this.fog===!1&&(e.fog=!1),Object.keys(this.userData).length>0&&(e.userData=this.userData);function i(s){const n=[];for(const r in s){const a=s[r];delete a.metadata,n.push(a)}return n}if(t){const s=i(A.textures),n=i(A.images);s.length>0&&(e.textures=s),n.length>0&&(e.images=n)}return e}clone(){return new this.constructor().copy(this)}copy(A){this.name=A.name,this.blending=A.blending,this.side=A.side,this.vertexColors=A.vertexColors,this.opacity=A.opacity,this.transparent=A.transparent,this.blendSrc=A.blendSrc,this.blendDst=A.blendDst,this.blendEquation=A.blendEquation,this.blendSrcAlpha=A.blendSrcAlpha,this.blendDstAlpha=A.blendDstAlpha,this.blendEquationAlpha=A.blendEquationAlpha,this.blendColor.copy(A.blendColor),this.blendAlpha=A.blendAlpha,this.depthFunc=A.depthFunc,this.depthTest=A.depthTest,this.depthWrite=A.depthWrite,this.stencilWriteMask=A.stencilWriteMask,this.stencilFunc=A.stencilFunc,this.stencilRef=A.stencilRef,this.stencilFuncMask=A.stencilFuncMask,this.stencilFail=A.stencilFail,this.stencilZFail=A.stencilZFail,this.stencilZPass=A.stencilZPass,this.stencilWrite=A.stencilWrite;const t=A.clippingPlanes;let e=null;if(t!==null){const i=t.length;e=new Array(i);for(let s=0;s!==i;++s)e[s]=t[s].clone()}return this.clippingPlanes=e,this.clipIntersection=A.clipIntersection,this.clipShadows=A.clipShadows,this.shadowSide=A.shadowSide,this.colorWrite=A.colorWrite,this.precision=A.precision,this.polygonOffset=A.polygonOffset,this.polygonOffsetFactor=A.polygonOffsetFactor,this.polygonOffsetUnits=A.polygonOffsetUnits,this.dithering=A.dithering,this.alphaTest=A.alphaTest,this.alphaHash=A.alphaHash,this.alphaToCoverage=A.alphaToCoverage,this.premultipliedAlpha=A.premultipliedAlpha,this.forceSinglePass=A.forceSinglePass,this.visible=A.visible,this.toneMapped=A.toneMapped,this.userData=JSON.parse(JSON.stringify(A.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(A){A===!0&&this.version++}onBuild(){console.warn("Material: onBuild() has been removed.")}}class lr extends Js{constructor(A){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new yt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new dt,this.combine=Pn,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(A)}copy(A){return super.copy(A),this.color.copy(A.color),this.map=A.map,this.lightMap=A.lightMap,this.lightMapIntensity=A.lightMapIntensity,this.aoMap=A.aoMap,this.aoMapIntensity=A.aoMapIntensity,this.specularMap=A.specularMap,this.alphaMap=A.alphaMap,this.envMap=A.envMap,this.envMapRotation.copy(A.envMapRotation),this.combine=A.combine,this.reflectivity=A.reflectivity,this.refractionRatio=A.refractionRatio,this.wireframe=A.wireframe,this.wireframeLinewidth=A.wireframeLinewidth,this.wireframeLinecap=A.wireframeLinecap,this.wireframeLinejoin=A.wireframeLinejoin,this.fog=A.fog,this}}const eA=new u,Re=new fA;class Jt{constructor(A,t,e=!1){if(Array.isArray(A))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,this.name="",this.array=A,this.itemSize=t,this.count=A!==void 0?A.length/t:0,this.normalized=e,this.usage=ys,this.updateRanges=[],this.gpuType=Vn,this.version=0}onUploadCallback(){}set needsUpdate(A){A===!0&&this.version++}setUsage(A){return this.usage=A,this}addUpdateRange(A,t){this.updateRanges.push({start:A,count:t})}clearUpdateRanges(){this.updateRanges.length=0}copy(A){return this.name=A.name,this.array=new A.array.constructor(A.array),this.itemSize=A.itemSize,this.count=A.count,this.normalized=A.normalized,this.usage=A.usage,this.gpuType=A.gpuType,this}copyAt(A,t,e){A*=this.itemSize,e*=t.itemSize;for(let i=0,s=this.itemSize;i<s;i++)this.array[A+i]=t.array[e+i];return this}copyArray(A){return this.array.set(A),this}applyMatrix3(A){if(this.itemSize===2)for(let t=0,e=this.count;t<e;t++)Re.fromBufferAttribute(this,t),Re.applyMatrix3(A),this.setXY(t,Re.x,Re.y);else if(this.itemSize===3)for(let t=0,e=this.count;t<e;t++)eA.fromBufferAttribute(this,t),eA.applyMatrix3(A),this.setXYZ(t,eA.x,eA.y,eA.z);return this}applyMatrix4(A){for(let t=0,e=this.count;t<e;t++)eA.fromBufferAttribute(this,t),eA.applyMatrix4(A),this.setXYZ(t,eA.x,eA.y,eA.z);return this}applyNormalMatrix(A){for(let t=0,e=this.count;t<e;t++)eA.fromBufferAttribute(this,t),eA.applyNormalMatrix(A),this.setXYZ(t,eA.x,eA.y,eA.z);return this}transformDirection(A){for(let t=0,e=this.count;t<e;t++)eA.fromBufferAttribute(this,t),eA.transformDirection(A),this.setXYZ(t,eA.x,eA.y,eA.z);return this}set(A,t=0){return this.array.set(A,t),this}getComponent(A,t){let e=this.array[A*this.itemSize+t];return this.normalized&&(e=ie(e,this.array)),e}setComponent(A,t,e){return this.normalized&&(e=yA(e,this.array)),this.array[A*this.itemSize+t]=e,this}getX(A){let t=this.array[A*this.itemSize];return this.normalized&&(t=ie(t,this.array)),t}setX(A,t){return this.normalized&&(t=yA(t,this.array)),this.array[A*this.itemSize]=t,this}getY(A){let t=this.array[A*this.itemSize+1];return this.normalized&&(t=ie(t,this.array)),t}setY(A,t){return this.normalized&&(t=yA(t,this.array)),this.array[A*this.itemSize+1]=t,this}getZ(A){let t=this.array[A*this.itemSize+2];return this.normalized&&(t=ie(t,this.array)),t}setZ(A,t){return this.normalized&&(t=yA(t,this.array)),this.array[A*this.itemSize+2]=t,this}getW(A){let t=this.array[A*this.itemSize+3];return this.normalized&&(t=ie(t,this.array)),t}setW(A,t){return this.normalized&&(t=yA(t,this.array)),this.array[A*this.itemSize+3]=t,this}setXY(A,t,e){return A*=this.itemSize,this.normalized&&(t=yA(t,this.array),e=yA(e,this.array)),this.array[A+0]=t,this.array[A+1]=e,this}setXYZ(A,t,e,i){return A*=this.itemSize,this.normalized&&(t=yA(t,this.array),e=yA(e,this.array),i=yA(i,this.array)),this.array[A+0]=t,this.array[A+1]=e,this.array[A+2]=i,this}setXYZW(A,t,e,i,s){return A*=this.itemSize,this.normalized&&(t=yA(t,this.array),e=yA(e,this.array),i=yA(i,this.array),s=yA(s,this.array)),this.array[A+0]=t,this.array[A+1]=e,this.array[A+2]=i,this.array[A+3]=s,this}onUpload(A){return this.onUploadCallback=A,this}clone(){return new this.constructor(this.array,this.itemSize).copy(this)}toJSON(){const A={itemSize:this.itemSize,type:this.array.constructor.name,array:Array.from(this.array),normalized:this.normalized};return this.name!==""&&(A.name=this.name),this.usage!==ys&&(A.usage=this.usage),A}}class ur extends Jt{constructor(A,t,e){super(new Uint16Array(A),t,e)}}class dr extends Jt{constructor(A,t,e){super(new Uint32Array(A),t,e)}}class Ue extends Jt{constructor(A,t,e){super(new Float32Array(A),t,e)}}let yr=0;const RA=new CA,Ni=new wA,Ht=new u,MA=new Ft,ae=new Ft,oA=new u;class Ge extends te{constructor(){super(),this.isBufferGeometry=!0,Object.defineProperty(this,"id",{value:yr++}),this.uuid=ee(),this.name="",this.type="BufferGeometry",this.index=null,this.indirect=null,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(A){return Array.isArray(A)?this.index=new(Ar(A)?dr:ur)(A,1):this.index=A,this}setIndirect(A){return this.indirect=A,this}getIndirect(){return this.indirect}getAttribute(A){return this.attributes[A]}setAttribute(A,t){return this.attributes[A]=t,this}deleteAttribute(A){return delete this.attributes[A],this}hasAttribute(A){return this.attributes[A]!==void 0}addGroup(A,t,e=0){this.groups.push({start:A,count:t,materialIndex:e})}clearGroups(){this.groups=[]}setDrawRange(A,t){this.drawRange.start=A,this.drawRange.count=t}applyMatrix4(A){const t=this.attributes.position;t!==void 0&&(t.applyMatrix4(A),t.needsUpdate=!0);const e=this.attributes.normal;if(e!==void 0){const s=new qA().getNormalMatrix(A);e.applyNormalMatrix(s),e.needsUpdate=!0}const i=this.attributes.tangent;return i!==void 0&&(i.transformDirection(A),i.needsUpdate=!0),this.boundingBox!==null&&this.computeBoundingBox(),this.boundingSphere!==null&&this.computeBoundingSphere(),this}applyQuaternion(A){return RA.makeRotationFromQuaternion(A),this.applyMatrix4(RA),this}rotateX(A){return RA.makeRotationX(A),this.applyMatrix4(RA),this}rotateY(A){return RA.makeRotationY(A),this.applyMatrix4(RA),this}rotateZ(A){return RA.makeRotationZ(A),this.applyMatrix4(RA),this}translate(A,t,e){return RA.makeTranslation(A,t,e),this.applyMatrix4(RA),this}scale(A,t,e){return RA.makeScale(A,t,e),this.applyMatrix4(RA),this}lookAt(A){return Ni.lookAt(A),Ni.updateMatrix(),this.applyMatrix4(Ni.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(Ht).negate(),this.translate(Ht.x,Ht.y,Ht.z),this}setFromPoints(A){const t=this.getAttribute("position");if(t===void 0){const e=[];for(let i=0,s=A.length;i<s;i++){const n=A[i];e.push(n.x,n.y,n.z||0)}this.setAttribute("position",new Ue(e,3))}else{const e=Math.min(A.length,t.count);for(let i=0;i<e;i++){const s=A[i];t.setXYZ(i,s.x,s.y,s.z||0)}A.length>t.count&&console.warn("THREE.BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),t.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new Ft);const A=this.attributes.position,t=this.morphAttributes.position;if(A&&A.isGLBufferAttribute){console.error("THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),this.boundingBox.set(new u(-1/0,-1/0,-1/0),new u(1/0,1/0,1/0));return}if(A!==void 0){if(this.boundingBox.setFromBufferAttribute(A),t)for(let e=0,i=t.length;e<i;e++){const s=t[e];MA.setFromBufferAttribute(s),this.morphTargetsRelative?(oA.addVectors(this.boundingBox.min,MA.min),this.boundingBox.expandByPoint(oA),oA.addVectors(this.boundingBox.max,MA.max),this.boundingBox.expandByPoint(oA)):(this.boundingBox.expandByPoint(MA.min),this.boundingBox.expandByPoint(MA.max))}}else this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error(\'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.\',this)}computeBoundingSphere(){this.boundingSphere===null&&(this.boundingSphere=new Ss);const A=this.attributes.position,t=this.morphAttributes.position;if(A&&A.isGLBufferAttribute){console.error("THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.",this),this.boundingSphere.set(new u,1/0);return}if(A){const e=this.boundingSphere.center;if(MA.setFromBufferAttribute(A),t)for(let s=0,n=t.length;s<n;s++){const r=t[s];ae.setFromBufferAttribute(r),this.morphTargetsRelative?(oA.addVectors(MA.min,ae.min),MA.expandByPoint(oA),oA.addVectors(MA.max,ae.max),MA.expandByPoint(oA)):(MA.expandByPoint(ae.min),MA.expandByPoint(ae.max))}MA.getCenter(e);let i=0;for(let s=0,n=A.count;s<n;s++)oA.fromBufferAttribute(A,s),i=Math.max(i,e.distanceToSquared(oA));if(t)for(let s=0,n=t.length;s<n;s++){const r=t[s],a=this.morphTargetsRelative;for(let o=0,B=r.count;o<B;o++)oA.fromBufferAttribute(r,o),a&&(Ht.fromBufferAttribute(A,o),oA.add(Ht)),i=Math.max(i,e.distanceToSquared(oA))}this.boundingSphere.radius=Math.sqrt(i),isNaN(this.boundingSphere.radius)&&console.error(\'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.\',this)}}computeTangents(){const A=this.index,t=this.attributes;if(A===null||t.position===void 0||t.normal===void 0||t.uv===void 0){console.error("THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)");return}const e=t.position,i=t.normal,s=t.uv;this.hasAttribute("tangent")===!1&&this.setAttribute("tangent",new Jt(new Float32Array(4*e.count),4));const n=this.getAttribute("tangent"),r=[],a=[];for(let w=0;w<e.count;w++)r[w]=new u,a[w]=new u;const o=new u,B=new u,I=new u,Q=new fA,h=new fA,E=new fA,C=new u,c=new u;function l(w,D,N){o.fromBufferAttribute(e,w),B.fromBufferAttribute(e,D),I.fromBufferAttribute(e,N),Q.fromBufferAttribute(s,w),h.fromBufferAttribute(s,D),E.fromBufferAttribute(s,N),B.sub(o),I.sub(o),h.sub(Q),E.sub(Q);const M=1/(h.x*E.y-E.x*h.y);isFinite(M)&&(C.copy(B).multiplyScalar(E.y).addScaledVector(I,-h.y).multiplyScalar(M),c.copy(I).multiplyScalar(h.x).addScaledVector(B,-E.x).multiplyScalar(M),r[w].add(C),r[D].add(C),r[N].add(C),a[w].add(c),a[D].add(c),a[N].add(c))}let y=this.groups;y.length===0&&(y=[{start:0,count:A.count}]);for(let w=0,D=y.length;w<D;++w){const N=y[w],M=N.start,S=N.count;for(let F=M,k=M+S;F<k;F+=3)l(A.getX(F+0),A.getX(F+1),A.getX(F+2))}const d=new u,f=new u,p=new u,m=new u;function x(w){p.fromBufferAttribute(i,w),m.copy(p);const D=r[w];d.copy(D),d.sub(p.multiplyScalar(p.dot(D))).normalize(),f.crossVectors(m,D);const M=f.dot(a[w])<0?-1:1;n.setXYZW(w,d.x,d.y,d.z,M)}for(let w=0,D=y.length;w<D;++w){const N=y[w],M=N.start,S=N.count;for(let F=M,k=M+S;F<k;F+=3)x(A.getX(F+0)),x(A.getX(F+1)),x(A.getX(F+2))}}computeVertexNormals(){const A=this.index,t=this.getAttribute("position");if(t!==void 0){let e=this.getAttribute("normal");if(e===void 0)e=new Jt(new Float32Array(t.count*3),3),this.setAttribute("normal",e);else for(let Q=0,h=e.count;Q<h;Q++)e.setXYZ(Q,0,0,0);const i=new u,s=new u,n=new u,r=new u,a=new u,o=new u,B=new u,I=new u;if(A)for(let Q=0,h=A.count;Q<h;Q+=3){const E=A.getX(Q+0),C=A.getX(Q+1),c=A.getX(Q+2);i.fromBufferAttribute(t,E),s.fromBufferAttribute(t,C),n.fromBufferAttribute(t,c),B.subVectors(n,s),I.subVectors(i,s),B.cross(I),r.fromBufferAttribute(e,E),a.fromBufferAttribute(e,C),o.fromBufferAttribute(e,c),r.add(B),a.add(B),o.add(B),e.setXYZ(E,r.x,r.y,r.z),e.setXYZ(C,a.x,a.y,a.z),e.setXYZ(c,o.x,o.y,o.z)}else for(let Q=0,h=t.count;Q<h;Q+=3)i.fromBufferAttribute(t,Q+0),s.fromBufferAttribute(t,Q+1),n.fromBufferAttribute(t,Q+2),B.subVectors(n,s),I.subVectors(i,s),B.cross(I),e.setXYZ(Q+0,B.x,B.y,B.z),e.setXYZ(Q+1,B.x,B.y,B.z),e.setXYZ(Q+2,B.x,B.y,B.z);this.normalizeNormals(),e.needsUpdate=!0}}normalizeNormals(){const A=this.attributes.normal;for(let t=0,e=A.count;t<e;t++)oA.fromBufferAttribute(A,t),oA.normalize(),A.setXYZ(t,oA.x,oA.y,oA.z)}toNonIndexed(){function A(r,a){const o=r.array,B=r.itemSize,I=r.normalized,Q=new o.constructor(a.length*B);let h=0,E=0;for(let C=0,c=a.length;C<c;C++){r.isInterleavedBufferAttribute?h=a[C]*r.data.stride+r.offset:h=a[C]*B;for(let l=0;l<B;l++)Q[E++]=o[h++]}return new Jt(Q,B,I)}if(this.index===null)return console.warn("THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed."),this;const t=new Ge,e=this.index.array,i=this.attributes;for(const r in i){const a=i[r],o=A(a,e);t.setAttribute(r,o)}const s=this.morphAttributes;for(const r in s){const a=[],o=s[r];for(let B=0,I=o.length;B<I;B++){const Q=o[B],h=A(Q,e);a.push(h)}t.morphAttributes[r]=a}t.morphTargetsRelative=this.morphTargetsRelative;const n=this.groups;for(let r=0,a=n.length;r<a;r++){const o=n[r];t.addGroup(o.start,o.count,o.materialIndex)}return t}toJSON(){const A={metadata:{version:4.6,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};if(A.uuid=this.uuid,A.type=this.type,this.name!==""&&(A.name=this.name),Object.keys(this.userData).length>0&&(A.userData=this.userData),this.parameters!==void 0){const a=this.parameters;for(const o in a)a[o]!==void 0&&(A[o]=a[o]);return A}A.data={attributes:{}};const t=this.index;t!==null&&(A.data.index={type:t.array.constructor.name,array:Array.prototype.slice.call(t.array)});const e=this.attributes;for(const a in e){const o=e[a];A.data.attributes[a]=o.toJSON(A.data)}const i={};let s=!1;for(const a in this.morphAttributes){const o=this.morphAttributes[a],B=[];for(let I=0,Q=o.length;I<Q;I++){const h=o[I];B.push(h.toJSON(A.data))}B.length>0&&(i[a]=B,s=!0)}s&&(A.data.morphAttributes=i,A.data.morphTargetsRelative=this.morphTargetsRelative);const n=this.groups;n.length>0&&(A.data.groups=JSON.parse(JSON.stringify(n)));const r=this.boundingSphere;return r!==null&&(A.data.boundingSphere={center:r.center.toArray(),radius:r.radius}),A}clone(){return new this.constructor().copy(this)}copy(A){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const t={};this.name=A.name;const e=A.index;e!==null&&this.setIndex(e.clone(t));const i=A.attributes;for(const o in i){const B=i[o];this.setAttribute(o,B.clone(t))}const s=A.morphAttributes;for(const o in s){const B=[],I=s[o];for(let Q=0,h=I.length;Q<h;Q++)B.push(I[Q].clone(t));this.morphAttributes[o]=B}this.morphTargetsRelative=A.morphTargetsRelative;const n=A.groups;for(let o=0,B=n.length;o<B;o++){const I=n[o];this.addGroup(I.start,I.count,I.materialIndex)}const r=A.boundingBox;r!==null&&(this.boundingBox=r.clone());const a=A.boundingSphere;return a!==null&&(this.boundingSphere=a.clone()),this.drawRange.start=A.drawRange.start,this.drawRange.count=A.drawRange.count,this.userData=A.userData,this}dispose(){this.dispatchEvent({type:"dispose"})}}const Hs=new CA,ft=new gr,be=new Ss,Ts=new u,Le=new u,Ye=new u,Je=new u,ki=new u,He=new u,zs=new u,Te=new u;class vs extends wA{constructor(A=new Ge,t=new lr){super(),this.isMesh=!0,this.type="Mesh",this.geometry=A,this.material=t,this.updateMorphTargets()}copy(A,t){return super.copy(A,t),A.morphTargetInfluences!==void 0&&(this.morphTargetInfluences=A.morphTargetInfluences.slice()),A.morphTargetDictionary!==void 0&&(this.morphTargetDictionary=Object.assign({},A.morphTargetDictionary)),this.material=Array.isArray(A.material)?A.material.slice():A.material,this.geometry=A.geometry,this}updateMorphTargets(){const t=this.geometry.morphAttributes,e=Object.keys(t);if(e.length>0){const i=t[e[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let s=0,n=i.length;s<n;s++){const r=i[s].name||String(s);this.morphTargetInfluences.push(0),this.morphTargetDictionary[r]=s}}}}getVertexPosition(A,t){const e=this.geometry,i=e.attributes.position,s=e.morphAttributes.position,n=e.morphTargetsRelative;t.fromBufferAttribute(i,A);const r=this.morphTargetInfluences;if(s&&r){He.set(0,0,0);for(let a=0,o=s.length;a<o;a++){const B=r[a],I=s[a];B!==0&&(ki.fromBufferAttribute(I,A),n?He.addScaledVector(ki,B):He.addScaledVector(ki.sub(t),B))}t.add(He)}return t}raycast(A,t){const e=this.geometry,i=this.material,s=this.matrixWorld;i!==void 0&&(e.boundingSphere===null&&e.computeBoundingSphere(),be.copy(e.boundingSphere),be.applyMatrix4(s),ft.copy(A.ray).recast(A.near),!(be.containsPoint(ft.origin)===!1&&(ft.intersectSphere(be,Ts)===null||ft.origin.distanceToSquared(Ts)>(A.far-A.near)**2))&&(Hs.copy(s).invert(),ft.copy(A.ray).applyMatrix4(Hs),!(e.boundingBox!==null&&ft.intersectsBox(e.boundingBox)===!1)&&this._computeIntersections(A,t,ft)))}_computeIntersections(A,t,e){let i;const s=this.geometry,n=this.material,r=s.index,a=s.attributes.position,o=s.attributes.uv,B=s.attributes.uv1,I=s.attributes.normal,Q=s.groups,h=s.drawRange;if(r!==null)if(Array.isArray(n))for(let E=0,C=Q.length;E<C;E++){const c=Q[E],l=n[c.materialIndex],y=Math.max(c.start,h.start),d=Math.min(r.count,Math.min(c.start+c.count,h.start+h.count));for(let f=y,p=d;f<p;f+=3){const m=r.getX(f),x=r.getX(f+1),w=r.getX(f+2);i=ze(this,l,A,e,o,B,I,m,x,w),i&&(i.faceIndex=Math.floor(f/3),i.face.materialIndex=c.materialIndex,t.push(i))}}else{const E=Math.max(0,h.start),C=Math.min(r.count,h.start+h.count);for(let c=E,l=C;c<l;c+=3){const y=r.getX(c),d=r.getX(c+1),f=r.getX(c+2);i=ze(this,n,A,e,o,B,I,y,d,f),i&&(i.faceIndex=Math.floor(c/3),t.push(i))}}else if(a!==void 0)if(Array.isArray(n))for(let E=0,C=Q.length;E<C;E++){const c=Q[E],l=n[c.materialIndex],y=Math.max(c.start,h.start),d=Math.min(a.count,Math.min(c.start+c.count,h.start+h.count));for(let f=y,p=d;f<p;f+=3){const m=f,x=f+1,w=f+2;i=ze(this,l,A,e,o,B,I,m,x,w),i&&(i.faceIndex=Math.floor(f/3),i.face.materialIndex=c.materialIndex,t.push(i))}}else{const E=Math.max(0,h.start),C=Math.min(a.count,h.start+h.count);for(let c=E,l=C;c<l;c+=3){const y=c,d=c+1,f=c+2;i=ze(this,n,A,e,o,B,I,y,d,f),i&&(i.faceIndex=Math.floor(c/3),t.push(i))}}}}function fr(g,A,t,e,i,s,n,r){let a;if(A.side===Wn?a=e.intersectTriangle(n,s,i,!0,r):a=e.intersectTriangle(i,s,n,A.side===Ii,r),a===null)return null;Te.copy(r),Te.applyMatrix4(g.matrixWorld);const o=t.ray.origin.distanceTo(Te);return o<t.near||o>t.far?null:{distance:o,point:Te.clone(),object:g}}function ze(g,A,t,e,i,s,n,r,a,o){g.getVertexPosition(r,Le),g.getVertexPosition(a,Ye),g.getVertexPosition(o,Je);const B=fr(g,A,t,e,Le,Ye,Je,zs);if(B){const I=new u;zA.getBarycoord(zs,Le,Ye,Je,I),i&&(B.uv=zA.getInterpolatedAttribute(i,r,a,o,I,new fA)),s&&(B.uv1=zA.getInterpolatedAttribute(s,r,a,o,I,new fA)),n&&(B.normal=zA.getInterpolatedAttribute(n,r,a,o,I,new u),B.normal.dot(e.direction)>0&&B.normal.multiplyScalar(-1));const Q={a:r,b:a,c:o,normal:new u,materialIndex:0};zA.getNormal(Le,Ye,Je,Q.normal),B.face=Q,B.barycoord=I}return B}function wr(g){const A={};for(const t in g){A[t]={};for(const e in g[t]){const i=g[t][e];i&&(i.isColor||i.isMatrix3||i.isMatrix4||i.isVector2||i.isVector3||i.isVector4||i.isTexture||i.isQuaternion)?i.isRenderTargetTexture?(console.warn("UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms()."),A[t][e]=null):A[t][e]=i.clone():Array.isArray(i)?A[t][e]=i.slice():A[t][e]=i}}return A}function pr(g){const A=[];for(let t=0;t<g.length;t++)A.push(g[t].clone());return A}var Dr=`void main() {\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}`,mr=`void main() {\n gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}`;class xr extends Js{constructor(A){super(),this.isShaderMaterial=!0,this.type="ShaderMaterial",this.defines={},this.uniforms={},this.uniformsGroups=[],this.vertexShader=Dr,this.fragmentShader=mr,this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.forceSinglePass=!0,this.extensions={clipCullDistance:!1,multiDraw:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv1:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,this.glslVersion=null,A!==void 0&&this.setValues(A)}copy(A){return super.copy(A),this.fragmentShader=A.fragmentShader,this.vertexShader=A.vertexShader,this.uniforms=wr(A.uniforms),this.uniformsGroups=pr(A.uniformsGroups),this.defines=Object.assign({},A.defines),this.wireframe=A.wireframe,this.wireframeLinewidth=A.wireframeLinewidth,this.fog=A.fog,this.lights=A.lights,this.clipping=A.clipping,this.extensions=Object.assign({},A.extensions),this.glslVersion=A.glslVersion,this}toJSON(A){const t=super.toJSON(A);t.glslVersion=this.glslVersion,t.uniforms={};for(const i in this.uniforms){const n=this.uniforms[i].value;n&&n.isTexture?t.uniforms[i]={type:"t",value:n.toJSON(A).uuid}:n&&n.isColor?t.uniforms[i]={type:"c",value:n.getHex()}:n&&n.isVector2?t.uniforms[i]={type:"v2",value:n.toArray()}:n&&n.isVector3?t.uniforms[i]={type:"v3",value:n.toArray()}:n&&n.isVector4?t.uniforms[i]={type:"v4",value:n.toArray()}:n&&n.isMatrix3?t.uniforms[i]={type:"m3",value:n.toArray()}:n&&n.isMatrix4?t.uniforms[i]={type:"m4",value:n.toArray()}:t.uniforms[i]={value:n}}Object.keys(this.defines).length>0&&(t.defines=this.defines),t.vertexShader=this.vertexShader,t.fragmentShader=this.fragmentShader,t.lights=this.lights,t.clipping=this.clipping;const e={};for(const i in this.extensions)this.extensions[i]===!0&&(e[i]=!0);return Object.keys(e).length>0&&(t.extensions=e),t}}class Ks extends wA{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new CA,this.projectionMatrix=new CA,this.projectionMatrixInverse=new CA,this.coordinateSystem=Ae}copy(A,t){return super.copy(A,t),this.matrixWorldInverse.copy(A.matrixWorldInverse),this.projectionMatrix.copy(A.projectionMatrix),this.projectionMatrixInverse.copy(A.projectionMatrixInverse),this.coordinateSystem=A.coordinateSystem,this}getWorldDirection(A){return super.getWorldDirection(A).negate()}updateMatrixWorld(A){super.updateMatrixWorld(A),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(A,t){super.updateWorldMatrix(A,t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return new this.constructor().copy(this)}}class _s extends wA{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new dt,this.environmentIntensity=1,this.environmentRotation=new dt,this.overrideMaterial=null,typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(A,t){return super.copy(A,t),A.background!==null&&(this.background=A.background.clone()),A.environment!==null&&(this.environment=A.environment.clone()),A.fog!==null&&(this.fog=A.fog.clone()),this.backgroundBlurriness=A.backgroundBlurriness,this.backgroundIntensity=A.backgroundIntensity,this.backgroundRotation.copy(A.backgroundRotation),this.environmentIntensity=A.environmentIntensity,this.environmentRotation.copy(A.environmentRotation),A.overrideMaterial!==null&&(this.overrideMaterial=A.overrideMaterial.clone()),this.matrixAutoUpdate=A.matrixAutoUpdate,this}toJSON(A){const t=super.toJSON(A);return this.fog!==null&&(t.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(t.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(t.object.backgroundIntensity=this.backgroundIntensity),t.object.backgroundRotation=this.backgroundRotation.toArray(),this.environmentIntensity!==1&&(t.object.environmentIntensity=this.environmentIntensity),t.object.environmentRotation=this.environmentRotation.toArray(),t}}class Mr extends ZA{constructor(A=null,t=1,e=1,i,s,n,r,a,o=nt,B=nt,I,Q){super(null,n,r,a,o,B,i,s,I,Q),this.isDataTexture=!0,this.image={data:A,width:t,height:e},this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}class ve extends Ge{constructor(A=1,t=1,e=1,i=1){super(),this.type="PlaneGeometry",this.parameters={width:A,height:t,widthSegments:e,heightSegments:i};const s=A/2,n=t/2,r=Math.floor(e),a=Math.floor(i),o=r+1,B=a+1,I=A/r,Q=t/a,h=[],E=[],C=[],c=[];for(let l=0;l<B;l++){const y=l*Q-n;for(let d=0;d<o;d++){const f=d*I-s;E.push(f,-y,0),C.push(0,0,1),c.push(d/r),c.push(1-l/a)}}for(let l=0;l<a;l++)for(let y=0;y<r;y++){const d=y+o*l,f=y+o*(l+1),p=y+1+o*(l+1),m=y+1+o*l;h.push(d,f,m),h.push(f,p,m)}this.setIndex(h),this.setAttribute("position",new Ue(E,3)),this.setAttribute("normal",new Ue(C,3)),this.setAttribute("uv",new Ue(c,2))}copy(A){return super.copy(A),this.parameters=Object.assign({},A.parameters),this}static fromJSON(A){return new ve(A.width,A.height,A.widthSegments,A.heightSegments)}}class Ri extends xr{constructor(A){super(A),this.isRawShaderMaterial=!0,this.type="RawShaderMaterial"}}class Ui{constructor(A,t,e,i){Ui.prototype.isMatrix2=!0,this.elements=[1,0,0,1],A!==void 0&&this.set(A,t,e,i)}identity(){return this.set(1,0,0,1),this}fromArray(A,t=0){for(let e=0;e<4;e++)this.elements[e]=A[e+t];return this}set(A,t,e,i){const s=this.elements;return s[0]=A,s[2]=t,s[1]=e,s[3]=i,this}}typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:rs}})),typeof window<"u"&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=rs);const vA=-9,$A=(9-vA)/254,Gi=Math.exp(vA),Sr=11,Fr=11,P=1<<Sr,Qt=1<<Fr,qs=1,Nr=!0;function Tt(g){return g==="int"||g==="ivec2"||g==="ivec3"||g==="ivec4"}function zt(g){return g==="uint"||g==="uvec2"||g==="uvec3"||g==="uvec4"}function kr(g){return g==="float"||g==="vec2"||g==="vec3"||g==="vec4"}function Rr(g){return g==="mat2"||g==="mat2x2"||g==="mat2x3"||g==="mat2x4"||g==="mat3"||g==="mat3x2"||g==="mat3x3"||g==="mat3x4"||g==="mat4"||g==="mat4x2"||g==="mat4x3"||g==="mat4x4"}function Ke(g){return kr(g)||Rr(g)}function vt(g){return g==="mat2"||g==="mat2x2"}function Kt(g){return g==="mat3"||g==="mat3x3"}function _t(g){return g==="mat4"||g==="mat4x4"}function nA(g){return Math.trunc(g).toString()}function rA(g){return`${Math.max(0,Math.trunc(g)).toString()}u`}function _(g){return g===Number.POSITIVE_INFINITY?"INFINITY":g===Number.NEGATIVE_INFINITY?"-INFINITY":Number.isInteger(g)?g.toFixed(1):g.toString()}function wt(g){return g instanceof pt?g.type:g.dynoOut().type}class pt{constructor(A){this.__isDynoValue=!0,this.type=A}}class SA extends pt{constructor(A,t){super(A.outTypes[t]),this.dyno=A,this.key=t}}class _e extends pt{constructor(A,t){super(A),this.literal=t}getLiteral(){return this.literal}}class Ur extends _e{constructor(A,t){super(A,""),this.value=t}getLiteral(){const{type:A,value:t}=this;switch(A){case"bool":return t?"true":"false";case"uint":return rA(t);case"int":return nA(t);case"float":return _(t);case"bvec2":{const e=t;return`bvec2(${e[0]}, ${e[1]})`}case"uvec2":{if(t instanceof fA)return`uvec2(${rA(t.x)}, ${rA(t.y)})`;const e=t;return`uvec2(${rA(e[0])}, ${rA(e[1])})`}case"ivec2":{if(t instanceof fA)return`ivec2(${nA(t.x)}, ${nA(t.y)})`;const e=t;return`ivec2(${nA(e[0])}, ${nA(e[1])})`}case"vec2":{if(t instanceof fA)return`vec2(${_(t.x)}, ${_(t.y)})`;const e=t;return`vec2(${_(e[0])}, ${_(e[1])})`}case"bvec3":{const e=t;return`bvec3(${e[0]}, ${e[1]}, ${e[2]})`}case"uvec3":{if(t instanceof u)return`uvec3(${rA(t.x)}, ${rA(t.y)}, ${rA(t.z)})`;const e=t;return`uvec3(${rA(e[0])}, ${rA(e[1])}, ${rA(e[2])})`}case"ivec3":{if(t instanceof u)return`ivec3(${nA(t.x)}, ${nA(t.y)}, ${nA(t.z)})`;const e=t;return`ivec3(${nA(e[0])}, ${nA(e[1])}, ${nA(e[2])})`}case"vec3":{if(t instanceof u)return`vec3(${_(t.x)}, ${_(t.y)}, ${_(t.z)})`;const e=t;return`vec3(${_(e[0])}, ${_(e[1])}, ${_(e[2])})`}case"bvec4":{const e=t;return`bvec4(${e[0]}, ${e[1]}, ${e[2]}, ${e[3]})`}case"uvec4":{if(t instanceof uA)return`uvec4(${rA(t.x)}, ${rA(t.y)}, ${rA(t.z)}, ${rA(t.w)})`;const e=t;return`uvec4(${rA(e[0])}, ${rA(e[1])}, ${rA(e[2])}, ${rA(e[3])})`}case"ivec4":{if(t instanceof uA)return`ivec4(${nA(t.x)}, ${nA(t.y)}, ${nA(t.z)}, ${nA(t.w)})`;const e=t;return`ivec4(${nA(e[0])}, ${nA(e[1])}, ${nA(e[2])}, ${nA(e[3])})`}case"vec4":{if(t instanceof uA)return`vec4(${_(t.x)}, ${_(t.y)}, ${_(t.z)}, ${_(t.w)})`;if(t instanceof gA)return`vec4(${_(t.x)}, ${_(t.y)}, ${_(t.z)}, ${_(t.w)})`;const e=t;return`vec4(${_(e[0])}, ${_(e[1])}, ${_(e[2])}, ${_(e[3])})`}case"mat2":case"mat2x2":{const e=t,i=e instanceof Ui?e.elements:t,s=new Array(4).fill(0).map((n,r)=>_(i[r]));return`${A}(${s.join(", ")})`}case"mat2x3":{const e=t,i=new Array(6).fill(0).map((s,n)=>_(e[n]));return`${A}(${i.join(", ")})`}case"mat2x4":{const e=t,i=new Array(8).fill(0).map((s,n)=>_(e[n]));return`${A}(${i.join(", ")})`}case"mat3":case"mat3x3":{const e=t,i=e instanceof qA?e.elements:t,s=new Array(9).fill(0).map((n,r)=>_(i[r]));return`${A}(${s.join(", ")})`}case"mat3x2":{const e=t,i=new Array(6).fill(0).map((s,n)=>_(e[n]));return`${A}(${i.join(", ")})`}case"mat3x4":{const e=t,i=new Array(12).fill(0).map((s,n)=>_(e[n]));return`${A}(${i.join(", ")})`}case"mat4":case"mat4x4":{const e=t,i=e instanceof CA?e.elements:t,s=new Array(16).fill(0).map((n,r)=>_(i[r]));return`${A}(${s.join(", ")})`}case"mat4x2":{const e=t,i=new Array(8).fill(0).map((s,n)=>_(e[n]));return`${A}(${i.join(", ")})`}case"mat4x3":{const e=t,i=new Array(12).fill(0).map((s,n)=>_(e[n]));return`${A}(${i.join(", ")})`}default:throw new Error(`Type not implemented: ${String(A)}`)}}}function Gr(g,A){return new Ur(g,A)}const Zs=" ";class br{constructor({indent:A}={}){this.globals=new Set,this.statements=[],this.uniforms={},this.declares=new Set,this.updaters=[],this.sequence=0,this.indent=Zs,this.indent=A??Zs}nextSequence(){return this.sequence++}}class lA{constructor({inTypes:A,outTypes:t,inputs:e,update:i,globals:s,statements:n,generate:r}){this.inTypes=A??{},this.outTypes=t??{},this.inputs=e??{},this.update=i,this.globals=s,this.statements=n,this.generate=r??(({inputs:a,outputs:o,compile:B})=>{var I,Q;return{globals:(I=this.globals)==null?void 0:I.call(this,{inputs:a,outputs:o,compile:B}),statements:(Q=this.statements)==null?void 0:Q.call(this,{inputs:a,outputs:o,compile:B})}})}get outputs(){const A={};for(const t in this.outTypes)A[t]=new SA(this,t);return A}apply(A){return Object.assign(this.inputs,A),this.outputs}compile({inputs:A,outputs:t,compile:e}){const i=[`// ${this.constructor.name}(${Object.values(A).join(", ")}) => (${Object.values(t).join(", ")})`],s=[];for(const o in t){const B=t[o];B&&!e.declares.has(B)&&(e.declares.add(B),s.push(o))}const{globals:n,statements:r,uniforms:a}=this.generate({inputs:A,outputs:t,compile:e});for(const o of n??[])e.globals.add(o);for(const o in a)e.uniforms[o]=a[o];this.update&&e.updaters.push(this.update);for(const o of s){const B=t[o];B&&(e.uniforms[B]||i.push(`${Ws(B,this.outTypes[o])};`))}return r!=null&&r.length&&(i.push("{"),i.push(...r.map(o=>e.indent+o)),i.push("}")),i}}class Lr extends lA{constructor({inTypes:A,outTypes:t,inputs:e,update:i,globals:s,construct:n}){super({inTypes:A,outTypes:t,inputs:e,update:i,globals:s,generate:r=>this.generateBlock(r)}),this.construct=n}generateBlock({inputs:A,outputs:t,compile:e}){var E,C;const i={},s={};for(const c in A)A[c]!=null&&(i[c]=new _e(this.inTypes[c],A[c]));for(const c in t)t[c]!=null&&(s[c]=new pt(this.outTypes[c]));const n={roots:[]},r=this.construct(i,s,n);for(const c of((E=this.globals)==null?void 0:E.call(this,{inputs:A,outputs:t,compile:e}))??[])e.globals.add(c);const a=[],o=new Map;function B(c,l,y){let d=o.get(c);if(!d){d={sequence:e.nextSequence(),outNames:new Map,newOuts:new Set},o.set(c,d);for(const f in c.inputs){let p=c.inputs[f];for(;p;){if(p instanceof pt){p instanceof SA&&B(p.dyno,p.key);break}p=p.dynoOut()}}a.push(c)}l&&(y||d.newOuts.add(l),d.outNames.set(l,y??`${l}_${d.sequence}`))}for(const c of n.roots)B(c);for(const c in s){let l=(r==null?void 0:r[c])??s[c];for(;l;){if(l instanceof pt){l instanceof SA&&B(l.dyno,l.key,t[c]);break}l=l.dynoOut()}s[c]=l}const I=[];for(const c of a){const l={},y={};for(const p in c.inputs){let m=c.inputs[p];for(;m;){if(m instanceof pt){if(m instanceof _e)l[p]=m.getLiteral();else if(m instanceof SA){const x=(C=o.get(m.dyno))==null?void 0:C.outNames.get(m.key);if(!x)throw new Error(`Source not found for ${m.dyno.constructor.name}.${m.key}`);l[p]=x}break}m=m.dynoOut()}}const d=o.get(c)??{outNames:new Map};for(const[p,m]of d.outNames.entries())y[p]=m;const f=c.compile({inputs:l,outputs:y,compile:e});I.push(f)}const Q=[];for(const c in t)s[c]instanceof _e&&Q.push(`${t[c]} = ${s[c].getLiteral()};`);return Q.length>0&&I.push(Q),{statements:I.flatMap((c,l)=>l===0?c:["",...c])}}}function qe(g,A,t,{update:e,globals:i}={}){return new Lr({inTypes:g,outTypes:A,construct:t,update:e,globals:i})}function bi({inTypes:g,outTypes:A,inputs:t,update:e,globals:i,statements:s,generate:n}){return new lA({inTypes:g,outTypes:A,inputs:t,update:e,globals:i,statements:s,generate:n})}function Ws(g,A,t){const e=typeof A=="string"?A:A.type;if(!e)throw new Error(`Invalid DynoType: ${String(A)}`);return`${e} ${g}${t!=null?`[${t}]`:""}`}function At(g){var s;let A=!1;const t=g.split(`\n`).map(n=>{const r=n.trimEnd();return A?r:r.length>0?(A=!0,r):null}).filter(n=>n!=null);for(;t.length>0&&t[t.length-1].length===0;)t.pop();if(t.length===0)return[];const e=(s=t[0].match(/^\\s*/))==null?void 0:s[0];if(!e)return t;const i=new RegExp(`^${e}`);return t.map(n=>n.replace(i,""))}function KA(g){return At(g).join(`\n`)}class Yr extends lA{constructor({a:A,outKey:t,outTypeFunc:e}){const i={a:wt(A)},s=e(wt(A)),n={[t]:s};super({inTypes:i,outTypes:n,inputs:{a:A}}),this.outKey=t}dynoOut(){return new SA(this,this.outKey)}}class Ze extends lA{constructor({a:A,b:t,outKey:e,outTypeFunc:i}){const s={a:wt(A),b:wt(t)},n=i(wt(A),wt(t)),r={[e]:n};super({inTypes:s,outTypes:r,inputs:{a:A,b:t}}),this.outKey=e}dynoOut(){return new SA(this,this.outKey)}}const Li=new Float32Array(1),Ps=new Uint32Array(Li.buffer);function qt(g){Li[0]=g;const A=Ps[0],t=A>>31&1,e=A>>23&255,i=A&8388607,s=t<<15;if(e===255)return i!==0?s|32767:s|31744;const n=e-127+15;if(n>=31)return s|31744;if(n<=0){if(n<-10)return s;const a=(i|8388608)>>1-n+13;return s|a}const r=i>>13;return s|n<<10|r}function tA(g){const A=g>>15&1,t=g>>10&31,e=g&1023;let i;if(t===0)if(e===0)i=A<<31;else{let s=e,n=-14;for(;(s&1024)===0;)s<<=1,n--;s&=1023;const r=n+127,a=s<<13;i=A<<31|r<<23|a}else if(t===31)e===0?i=A<<31|2139095040:i=A<<31|2143289344;else{const s=t-15+127,n=e<<13;i=A<<31|s<<23|n}return Ps[0]=i,Li[0]}function ht(g){return Math.max(0,Math.min(255,Math.round(g*255)))}function Os(g){const A=[],t=new Set;function e(i){i&&typeof i=="object"&&!t.has(i)&&(t.add(i),i instanceof ArrayBuffer?A.push(i):ArrayBuffer.isView(i)?A.push(i.buffer):Array.isArray(i)?i.forEach(e):Object.values(i).forEach(e))}return e(g),A}function ge(g,A,t,e,i,s,n,r,a,o,B,I,Q,h,E,C){const c=ht(h),l=ht(E),y=ht(C),d=ht(Q),f=Xs(new gA(a,o,B,I)),p=f&255,m=f>>>8&255,x=f>>>16&255,w=s===0?0:Math.min(255,Math.max(0,Math.round((Math.log(s)-vA)/$A)+1)),D=n===0?0:Math.min(255,Math.max(0,Math.round((Math.log(n)-vA)/$A)+1)),N=r===0?0:Math.min(255,Math.max(0,Math.round((Math.log(r)-vA)/$A)+1)),M=qt(t),S=qt(e),F=qt(i),k=A*4;g[k]=c|l<<8|y<<16|d<<24,g[k+1]=M|S<<16,g[k+2]=F|p<<16|m<<24,g[k+3]=w|D<<8|N<<16|x<<24}function Jr(g,A,t,e,i){const s=qt(t),n=qt(e),r=qt(i),a=A*4;g[a+1]=s|n<<16,g[a+2]=r|g[a+2]&4294901760}function Hr(g,A,t,e,i){const s=t===0?0:Math.min(255,Math.max(0,Math.round((Math.log(t)-vA)/$A)+1)),n=e===0?0:Math.min(255,Math.max(0,Math.round((Math.log(e)-vA)/$A)+1)),r=i===0?0:Math.min(255,Math.max(0,Math.round((Math.log(i)-vA)/$A)+1)),a=A*4;g[a+3]=s|n<<8|r<<16|g[a+3]&4278190080}function Tr(g,A,t,e,i,s){const n=Xs(new gA(t,e,i,s)),r=n&255,a=n>>>8&255,o=n>>>16&255,B=A*4;g[B+2]=g[B+2]&65535|r<<16|a<<24,g[B+3]=g[B+3]&16777215|o<<24}function zr(g,A,t,e,i){const s=ht(t),n=ht(e),r=ht(i),a=A*4;g[a]=s|n<<8|r<<16|g[a]&4278190080}function vr(g,A,t){const e=ht(t),i=A*4;g[i]=g[i]&16777215|e<<24}const Kr=new u,_r=new u,qr=new gA,Zr=new yt,Wr={center:Kr,scales:_r,quaternion:qr,color:Zr,opacity:0};function Vs(g,A){const t=Wr,e=A*4,i=g[e],s=g[e+1],n=g[e+2],r=g[e+3];t.color.set((i&255)/255,(i>>>8&255)/255,(i>>>16&255)/255),t.opacity=(i>>>24&255)/255,t.center.set(tA(s&65535),tA(s>>>16&65535),tA(n&65535));const a=r&255;t.scales.x=a===0?0:Math.exp(vA+(a-1)*$A);const o=r>>>8&255;t.scales.y=o===0?0:Math.exp(vA+(o-1)*$A);const B=r>>>16&255;t.scales.z=B===0?0:Math.exp(vA+(B-1)*$A);const I=n>>>16&65535|r>>>8&16711680;return Or(I,t.quaternion),t}function FA(g){const A=P,t=Math.max(qs,Math.min(Qt,Math.ceil(g/A))),e=Math.ceil(g/(A*t)),i=A*t*e;return{width:A,height:t,depth:e,maxSplats:i}}function Yi(g){const A=P,t=Math.max(qs,Math.min(Qt,Math.ceil(g/A))),e=Math.ceil(g/(A*t));return A*t*e}const Pr=KA(`\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 Xs(g){const A=g.clone().normalize();A.w<0&&A.set(-A.x,-A.y,-A.z,-A.w);const t=2*Math.acos(A.w),e=Math.sqrt(A.x*A.x+A.y*A.y+A.z*A.z),i=e<1e-6?new u(1,0,0):new u(A.x,A.y,A.z).divideScalar(e),s=Math.abs(i.x)+Math.abs(i.y)+Math.abs(i.z);let n=i.x/s,r=i.y/s;if(i.z<0){const h=n;n=(1-Math.abs(r))*(n>=0?1:-1),r=(1-Math.abs(h))*(r>=0?1:-1)}const a=n*.5+.5,o=r*.5+.5,B=Math.round(a*255),I=Math.round(o*255);return Math.round(t*(255/Math.PI))<<16|I<<8|B}function Or(g,A){const t=g&255,e=g>>>8&255,i=g>>>16&255,s=t/255,n=e/255;let r=(s-.5)*2,a=(n-.5)*2;const o=1-(Math.abs(r)+Math.abs(a)),B=Math.max(-o,0);r+=r>=0?-B:B,a+=a>=0?-B:B;const I=new u(r,a,o).normalize(),h=i/255*Math.PI*.5,E=Math.sin(h),C=Math.cos(h);return A.set(I.x*E,I.y*E,I.z*E,C),A}function We(g,A,t,e){const i=Math.max(-127,Math.min(127,g*127)),s=Math.max(-127,Math.min(127,A*127)),n=Math.max(-127,Math.min(127,t*127)),r=Math.max(-127,Math.min(127,e*127));return i&255|(s&255)<<8|(n&255)<<16|(r&255)<<24}function Ji(g,A,t){const e=A*2;for(let i=0;i<9;++i){const s=Math.max(-63,Math.min(63,t[i]*63))&127,n=i*7,r=n+7,a=Math.floor(n/32),o=n-a*32,B=s<<o&4294967295;if(g[e+a]|=B,r>a*32+32){const I=s>>>32-o&4294967295;g[e+a+1]|=I}}}function Hi(g,A,t){g[A*4+0]=We(t[0],t[1],t[2],t[3]),g[A*4+1]=We(t[4],t[5],t[6],t[7]),g[A*4+2]=We(t[8],t[9],t[10],t[11]),g[A*4+3]=We(t[12],t[13],t[14],0)}function Ti(g,A,t){const e=A*4;for(let i=0;i<21;++i){const s=Math.max(-31,Math.min(31,t[i]*31))&63,n=i*6,r=n+6,a=Math.floor(n/32),o=n-a*32,B=s<<o&4294967295;if(g[e+a]|=B,r>a*32+32){const I=s>>>32-o&4294967295;g[e+a+1]|=I}}}function Vr(g,A){const t=[];let e=0,i=null;const s=new ns((a,o)=>{if(t.push(a),e+=a.length,o||e>=A){const B=new Uint8Array(e);let I=0;for(const Q of t)B.set(Q,I),I+=Q.length;i=B.slice(0,A)}}),n=1024;let r=0;for(;i==null&&r<g.length;){const a=g.slice(r,r+n);s.push(a,!1),r+=n}if(i==null&&(s.push(new Uint8Array,!0),i==null))throw new Error("Failed to decompress partial gzip");return i}class Xr{constructor({fileBytes:A,chunkBytes:t=64*1024}){this.fileBytes=A,this.chunkBytes=t,this.offset=0,this.chunks=[],this.totalBytes=0,this.gunzip=new ns((e,i)=>{this.chunks.push(e),this.totalBytes+=e.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 t=new Uint8Array(this.totalBytes);let e=0;for(const s of this.chunks)t.set(s,e),e+=s.length;const i=t.subarray(0,A);return this.chunks=[t.subarray(A)],this.totalBytes-=A,i}}function js(g,A,t){const e=Math.floor(g.length/32);if(e*32!==g.length)throw new Error("Invalid .splat file size");A(e);const i=new Float32Array(g.buffer);for(let s=0;s<e;++s){const n=s*32,r=s*8,a=i[r+0],o=i[r+1],B=i[r+2],I=i[r+3],Q=i[r+4],h=i[r+5],E=g[n+24]/255,C=g[n+25]/255,c=g[n+26]/255,l=g[n+27]/255,y=(g[n+28]-128)/128,d=(g[n+29]-128)/128,f=(g[n+30]-128)/128,p=(g[n+31]-128)/128;t(s,a,o,B,I,Q,h,d,f,p,y,l,E,C,c)}}function jr(g){let A=0,t=0,e=new Uint32Array(0);return js(g,i=>{A=i,t=Yi(A),e=new Uint32Array(t*4)},(i,s,n,r,a,o,B,I,Q,h,E,C,c,l,y)=>{ge(e,i,s,n,r,a,o,B,I,Q,h,E,C,c,l,y)}),{packedArray:e,numSplats:A}}const Pe={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}},$s={0:0,1:9,2:24,3:45};function $r(g,A,t,e){var h;let n=0;const r=new DataView(g.buffer,n,4096);n+=4096;const a=r.getUint8(0),o=r.getUint8(1);if(a!==0||o<1)throw new Error(`Unsupported .ksplat version: ${a}.${o}`);const B=r.getUint32(4,!0);r.getUint32(16,!0);const I=r.getUint16(20,!0);if(I<0||I>2)throw new Error(`Invalid .ksplat compression level: ${I}`);r.getFloat32(36,!0),r.getFloat32(40,!0);let Q=4096+B*1024;for(let E=0;E<B;++E){const C=new DataView(g.buffer,n,1024);n+=1024;const c=C.getUint32(0,!0),l=C.getUint32(4,!0),y=C.getUint32(8,!0),d=C.getUint32(12,!0),f=C.getFloat32(16,!0),p=C.getUint16(20,!0),m=(C.getUint32(24,!0)||((h=Pe[I])==null?void 0:h.scaleRange))??1,w=C.getUint32(36,!0)*4,D=p*d+w,N=C.getUint16(40,!0),M=$s[N],{bytesPerCenter:S,bytesPerScale:F,bytesPerRotation:k,bytesPerColor:U,bytesPerSphericalHarmonicsComponent:R,scaleOffsetBytes:G,rotationOffsetBytes:v,colorOffsetBytes:T,sphericalHarmonicsOffsetBytes:$}=Pe[I],V=S+F+k+U+M*R,X=V*l,K=X+D,Z=N>=1?new Float32Array(3*3):void 0,W=N>=2?new Float32Array(5*3):void 0,q=N>=3?new Float32Array(7*3):void 0,b=f/2/m,DA=Q+w,dA=Q+D,J=new DataView(g.buffer,dA,X),hA=new Float32Array(g.buffer,DA,d*3);for(let aA=0;aA<c;++aA){const Y=aA*V,NA=Math.floor(aA/y),mA=I===0?J.getFloat32(Y+0,!0):(J.getUint16(Y+0,!0)-m)*b+hA[3*NA+0],UA=I===0?J.getFloat32(Y+4,!0):(J.getUint16(Y+2,!0)-m)*b+hA[3*NA+1],GA=I===0?J.getFloat32(Y+8,!0):(J.getUint16(Y+4,!0)-m)*b+hA[3*NA+2],L=I===0?J.getFloat32(Y+G+0,!0):tA(J.getUint16(Y+G+0,!0)),sA=I===0?J.getFloat32(Y+G+4,!0):tA(J.getUint16(Y+G+2,!0)),AA=I===0?J.getFloat32(Y+G+8,!0):tA(J.getUint16(Y+G+4,!0)),z=I===0?J.getFloat32(Y+v+0,!0):tA(J.getUint16(Y+v+0,!0)),it=I===0?J.getFloat32(Y+v+4,!0):tA(J.getUint16(Y+v+2,!0)),he=I===0?J.getFloat32(Y+v+8,!0):tA(J.getUint16(Y+v+4,!0)),Ee=I===0?J.getFloat32(Y+v+12,!0):tA(J.getUint16(Y+v+6,!0)),Ce=J.getUint8(Y+T+0)/255,ce=J.getUint8(Y+T+1)/255,le=J.getUint8(Y+T+2)/255,ue=J.getUint8(Y+T+3)/255;t(aA,mA,UA,GA,L,sA,AA,it,he,Ee,z,ue,Ce,ce,le),N>=1&&Z&&(e==null||e(aA,Z,W,q))}Q+=K}}function Aa(g){var l;let e=0;const i=new DataView(g.buffer,e,4096);e+=4096;const s=i.getUint8(0),n=i.getUint8(1);if(s!==0||n<1)throw new Error(`Unsupported .ksplat version: ${s}.${n}`);const r=i.getUint32(4,!0),a=i.getUint32(16,!0),o=i.getUint16(20,!0);if(o<0||o>2)throw new Error(`Invalid .ksplat compression level: ${o}`);const B=i.getFloat32(36,!0)||-1.5,I=i.getFloat32(40,!0)||1.5,Q=a,h=Yi(Q),E=new Uint32Array(h*4),C={};let c=4096+r*1024;for(let y=0;y<r;++y){let d=function(AA,z){if(o===0)return L.getFloat32(AA+W+z*4,!0);if(o===1)return tA(L.getUint16(AA+W+z*2,!0));const it=L.getUint8(AA+W+z)/255;return B+it*(I-B)};const f=new DataView(g.buffer,e,1024);e+=1024;const p=f.getUint32(0,!0),m=f.getUint32(4,!0),x=f.getUint32(8,!0),w=f.getUint32(12,!0),D=f.getFloat32(16,!0),N=f.getUint16(20,!0),M=(f.getUint32(24,!0)||((l=Pe[o])==null?void 0:l.scaleRange))??1,F=f.getUint32(36,!0)*4,k=N*w+F,U=f.getUint16(40,!0),R=$s[U],{bytesPerCenter:G,bytesPerScale:v,bytesPerRotation:T,bytesPerColor:$,bytesPerSphericalHarmonicsComponent:V,scaleOffsetBytes:X,rotationOffsetBytes:K,colorOffsetBytes:Z,sphericalHarmonicsOffsetBytes:W}=Pe[o],q=G+v+T+$+R*V,b=q*m,DA=b+k,dA=[0,3,6,1,4,7,2,5,8],J=[9,14,19,10,15,20,11,16,21,12,17,22,13,18,23],hA=[24,31,38,25,32,39,26,33,40,27,34,41,28,35,42,29,36,43,30,37,44],aA=U>=1?new Float32Array(3*3):void 0,Y=U>=2?new Float32Array(5*3):void 0,NA=U>=3?new Float32Array(7*3):void 0,mA=D/2/M,UA=c+F,GA=c+k,L=new DataView(g.buffer,GA,b),sA=new Float32Array(g.buffer,UA,w*3);for(let AA=0;AA<p;++AA){const z=AA*q,it=Math.floor(AA/x),he=o===0?L.getFloat32(z+0,!0):(L.getUint16(z+0,!0)-M)*mA+sA[3*it+0],Ee=o===0?L.getFloat32(z+4,!0):(L.getUint16(z+2,!0)-M)*mA+sA[3*it+1],Ce=o===0?L.getFloat32(z+8,!0):(L.getUint16(z+4,!0)-M)*mA+sA[3*it+2],ce=o===0?L.getFloat32(z+X+0,!0):tA(L.getUint16(z+X+0,!0)),le=o===0?L.getFloat32(z+X+4,!0):tA(L.getUint16(z+X+2,!0)),ue=o===0?L.getFloat32(z+X+8,!0):tA(L.getUint16(z+X+4,!0)),Oi=o===0?L.getFloat32(z+K+0,!0):tA(L.getUint16(z+K+0,!0)),Vi=o===0?L.getFloat32(z+K+4,!0):tA(L.getUint16(z+K+2,!0)),gg=o===0?L.getFloat32(z+K+8,!0):tA(L.getUint16(z+K+4,!0)),og=o===0?L.getFloat32(z+K+12,!0):tA(L.getUint16(z+K+6,!0)),Ig=L.getUint8(z+Z+0)/255,Bg=L.getUint8(z+Z+1)/255,Qg=L.getUint8(z+Z+2)/255,hg=L.getUint8(z+Z+3)/255;if(ge(E,AA,he,Ee,Ce,ce,le,ue,Vi,gg,og,Oi,hg,Ig,Bg,Qg),U>=1){if(aA){C.sh1||(C.sh1=new Uint32Array(Q*2));for(const[de,ye]of dA.entries())aA[de]=d(z,ye);Ji(C.sh1,AA,aA)}if(Y){C.sh2||(C.sh2=new Uint32Array(Q*4));for(const[de,ye]of J.entries())Y[de]=d(z,ye);Hi(C.sh2,AA,Y)}if(NA){C.sh3||(C.sh3=new Uint32Array(Q*4));for(const[de,ye]of hA.entries())NA[de]=d(z,ye);Ti(C.sh3,AA,NA)}}}c+=DA}return{packedArray:E,numSplats:Q,extra:C}}const Ot=class Ot{constructor({fileBytes:A}){this.header="",this.littleEndian=!0,this.elements={},this.comments=[],this.data=null,this.numSplats=0,this.fileBytes=A instanceof ArrayBuffer?new Uint8Array(A):A}async parseHeader(){const t=new ReadableStream({start:n=>{n.enqueue(this.fileBytes.slice(0,65536)),n.close()}}).pipeThrough(new TextDecoderStream).getReader();this.header="";const e=`end_header\n`;for(;;){const{value:n,done:r}=await t.read();if(r)throw new Error("Failed to read header");this.header+=n;const a=this.header.indexOf(e);if(a>=0){this.header=this.header.slice(0,a+e.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(`\n`).forEach((n,r)=>{const a=n.trim();if(r===0){if(a!=="ply")throw new Error("Invalid PLY header");return}if(a.length===0)return;const o=a.split(" ");switch(o[0]){case"format":if(o[1]==="binary_little_endian")this.littleEndian=!0;else if(o[1]==="binary_big_endian")this.littleEndian=!1;else throw new Error(`Unsupported PLY format: ${o[1]}`);if(o[2]!=="1.0")throw new Error(`Unsupported PLY version: ${o[2]}`);break;case"end_header":break;case"comment":this.comments.push(a.slice(8));break;case"element":{const B=o[1];s={name:B,count:Number.parseInt(o[2]),properties:{}},this.elements[B]=s;break}case"property":if(s==null)throw new Error("Property must be inside an element");o[1]==="list"?s.properties[o[4]]={isList:!0,type:o[3],countType:o[2]}:s.properties[o[2]]={isList:!1,type:o[1]};break}}),this.elements.vertex&&(this.numSplats=this.elements.vertex.count)}parseData(A){let t=0;const e=this.data;if(e==null)throw new Error("No data to parse");for(const i in this.elements){const s=this.elements[i],{count:n,properties:r}=s,a={},o=[];for(const[I,Q]of Object.entries(r))Q.isList?(a[I]=[],o.push(()=>{const h=a[I];h.length=Ve[Q.countType](e,t,this.littleEndian),t+=Zt[Q.countType];for(let E=0;E<h.length;E++)h[E]=Ve[Q.type](e,t,this.littleEndian),t+=Zt[Q.type]})):(a[I]=0,o.push(()=>{a[I]=Ve[Q.type](e,t,this.littleEndian),t+=Zt[Q.type]}));const B=A(s)??(()=>{});for(let I=0;I<n;I++){for(const Q of o)Q();B(I,a)}}}parseSplats(A,t){if(this.elements.vertex==null)throw new Error("No vertex element found");let e=!1;const i=[];let s=0,n=[],r=[],a=[],o,B,I;function Q(){const l=ea[s];n=new Array(3).fill(null).flatMap((y,d)=>[0,1,2].map((f,p)=>`f_rest_${d+p*l/3}`)),r=new Array(5).fill(null).flatMap((y,d)=>[0,1,2].map((f,p)=>`f_rest_${3+d+p*l/3}`)),a=new Array(7).fill(null).flatMap((y,d)=>[0,1,2].map((f,p)=>`f_rest_${8+d+p*l/3}`)),o=s>=1?new Float32Array(3*3):void 0,B=s>=2?new Float32Array(5*3):void 0,I=s>=3?new Float32Array(7*3):void 0}function h(l,y){if(!o)throw new Error("Missing sh1");for(const[d,f]of n.entries())o[d]=y[f]*8/255-4;if(B)for(const[d,f]of r.entries())B[d]=y[f]*8/255-4;if(I)for(const[d,f]of a.entries())I[d]=y[f]*8/255-4;t==null||t(l,o,B,I)}function E(l){const{min_x:y,min_y:d,min_z:f,max_x:p,max_y:m,max_z:x,min_scale_x:w,min_scale_y:D,min_scale_z:N,max_scale_x:M,max_scale_y:S,max_scale_z:F,min_r:k,min_g:U,min_b:R,max_r:G,max_g:v,max_b:T}=l.properties;if(!y||!d||!f||!p||!m||!x||!w||!D||!N||!M||!S||!F||!k||!U||!R||!G||!v||!T)throw new Error("Missing PLY chunk properties");return e=!0,($,V)=>{const{min_x:X,min_y:K,min_z:Z,max_x:W,max_y:q,max_z:b,min_scale_x:DA,min_scale_y:dA,min_scale_z:J,max_scale_x:hA,max_scale_y:aA,max_scale_z:Y,min_r:NA,min_g:mA,min_b:UA,max_r:GA,max_g:L,max_b:sA}=V;i.push({min_x:X,min_y:K,min_z:Z,max_x:W,max_y:q,max_z:b,min_scale_x:DA,min_scale_y:dA,min_scale_z:J,max_scale_x:hA,max_scale_y:aA,max_scale_z:Y,min_r:NA,min_g:mA,min_b:UA,max_r:GA,max_g:L,max_b:sA})}}function C(l){if(t&&l.name==="sh")return s=tn(l.properties),Q(),h;if(l.name!=="vertex")return null;const{packed_position:y,packed_rotation:d,packed_scale:f,packed_color:p}=l.properties;if(!y||!d||!f||!p)throw new Error("Missing PLY properties: packed_position, packed_rotation, packed_scale, packed_color");const m=Math.sqrt(2);return(x,w)=>{const D=i[x>>>8];if(D==null)throw new Error("Missing PLY chunk");const{min_x:N,min_y:M,min_z:S,max_x:F,max_y:k,max_z:U,min_scale_x:R,min_scale_y:G,min_scale_z:v,max_scale_x:T,max_scale_y:$,max_scale_z:V,min_r:X,min_g:K,min_b:Z,max_r:W,max_g:q,max_b:b}=D,{packed_position:DA,packed_rotation:dA,packed_scale:J,packed_color:hA}=w,aA=(DA>>>21&2047)/2047*(F-N)+N,Y=(DA>>>11&1023)/1023*(k-M)+M,NA=(DA&2047)/2047*(U-S)+S,mA=((dA>>>20&1023)/1023-.5)*m,UA=((dA>>>10&1023)/1023-.5)*m,GA=((dA&1023)/1023-.5)*m,L=Math.sqrt(Math.max(0,1-mA*mA-UA*UA-GA*GA)),sA=dA>>>30,AA=sA===0?mA:sA===1?L:UA,z=sA<=1?UA:sA===2?L:GA,it=sA<=2?GA:L,he=sA===0?L:mA,Ee=Math.exp((J>>>21&2047)/2047*(T-R)+R),Ce=Math.exp((J>>>11&1023)/1023*($-G)+G),ce=Math.exp((J&2047)/2047*(V-v)+v),le=(hA>>>24&255)/255*(W-X)+X,ue=(hA>>>16&255)/255*(q-K)+K,Oi=(hA>>>8&255)/255*(b-Z)+Z,Vi=(hA&255)/255;A(x,aA,Y,NA,Ee,Ce,ce,AA,z,it,he,Vi,le,ue,Oi)}}const c=l=>{if(l.name==="chunk"&&this.comments.some(q=>q.toLowerCase().includes("supersplat")))return E(l);if(e)return C(l);if(l.name!=="vertex")return null;const{x:y,y:d,z:f,scale_0:p,scale_1:m,scale_2:x,rot_0:w,rot_1:D,rot_2:N,rot_3:M,opacity:S,f_dc_0:F,f_dc_1:k,f_dc_2:U,red:R,green:G,blue:v,alpha:T}=l.properties;if(!y||!d||!f)throw new Error("Missing PLY properties: x, y, z");const $=p&&m&&x,V=w&&D&&N&&M,X=T!=null?Xe[T.type]:1,K=R!=null?Xe[R.type]:1,Z=G!=null?Xe[G.type]:1,W=v!=null?Xe[v.type]:1;return s=tn(l.properties),Q(),(q,b)=>{const DA=$?Math.exp(b.scale_0):Ot.defaultPointScale,dA=$?Math.exp(b.scale_1):Ot.defaultPointScale,J=$?Math.exp(b.scale_2):Ot.defaultPointScale,hA=V?b.rot_1:0,aA=V?b.rot_2:0,Y=V?b.rot_3:0,NA=V?b.rot_0:1,mA=S!=null?1/(1+Math.exp(-b.opacity)):T!=null?b.alpha/X:1,UA=F!=null?b.f_dc_0*Oe+.5:R!=null?b.red/K:1,GA=k!=null?b.f_dc_1*Oe+.5:G!=null?b.green/Z:1,L=U!=null?b.f_dc_2*Oe+.5:v!=null?b.blue/W:1;if(A(q,b.x,b.y,b.z,DA,dA,J,hA,aA,Y,NA,mA,UA,GA,L),t&&o){if(o)for(const[sA,AA]of n.entries())o[sA]=b[AA];if(B)for(const[sA,AA]of r.entries())B[sA]=b[AA];if(I)for(const[sA,AA]of a.entries())I[sA]=b[AA];t(q,o,B,I)}}};this.parseData(c)}injectRgba(A){let t=0;const e=this.data;if(e==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:n,properties:r}=s,a=[];let o=0;const B=i==="vertex";if(B){for(const I of["opacity","f_dc_0","f_dc_1","f_dc_2"])if(!r[I]||r[I].type!=="float")throw new Error(`Can\'t injectRgba due to property: ${I}`)}for(const[I,Q]of Object.entries(r))if(Q.isList)a.push(()=>{const h=Ve[Q.countType](e,t,this.littleEndian);t+=Zt[Q.countType],t+=h*Zt[Q.type]});else{if(B)if(I==="f_dc_0"||I==="f_dc_1"||I==="f_dc_2"){const h=Number.parseInt(I.slice(5));a.push(()=>{const E=(A[o+h]/255-.5)/Oe;An[Q.type](e,t,this.littleEndian,E)})}else I==="opacity"&&a.push(()=>{const h=Math.max(-100,Math.min(100,-Math.log(1/(A[o+3]/255)-1)));An[Q.type](e,t,this.littleEndian,h)});a.push(()=>{t+=Zt[Q.type]})}for(let I=0;I<n;I++){for(const Q of a)Q();B&&(o+=4)}}}};Ot.defaultPointScale=.001;let oe=Ot;const Oe=.28209479177387814,Ve={char:(g,A,t)=>g.getInt8(A),uchar:(g,A,t)=>g.getUint8(A),short:(g,A,t)=>g.getInt16(A,t),ushort:(g,A,t)=>g.getUint16(A,t),int:(g,A,t)=>g.getInt32(A,t),uint:(g,A,t)=>g.getUint32(A,t),float:(g,A,t)=>g.getFloat32(A,t),double:(g,A,t)=>g.getFloat64(A,t)},An={char:(g,A,t,e)=>{g.setInt8(A,e)},uchar:(g,A,t,e)=>{g.setUint8(A,e)},short:(g,A,t,e)=>{g.setInt16(A,e,t)},ushort:(g,A,t,e)=>{g.setUint16(A,e,t)},int:(g,A,t,e)=>{g.setInt32(A,e,t)},uint:(g,A,t,e)=>{g.setUint32(A,e,t)},float:(g,A,t,e)=>{g.setFloat32(A,e,t)},double:(g,A,t,e)=>{g.setFloat64(A,e,t)}},Zt={char:1,uchar:1,short:2,ushort:2,int:4,uint:4,float:4,double:8},Xe={char:127,uchar:255,short:32767,ushort:65535,int:2147483647,uint:4294967295,float:1,double:1},ta={0:0,9:1,24:2,45:3},ea={0:0,1:9,2:24,3:45};function tn(g){let A=0;for(;g[`f_rest_${A}`];)A+=1;const t=ta[A];if(t==null)throw new Error(`Unsupported number of SH coefficients: ${A}`);return t}const pA={type:"Gsplat"},zi={type:"PackedSplats"},ia=(g,A)=>new ra({packedSplats:g,index:A}),sa=(g,A,t,e)=>new aa({packedSplats:g,index:A,base:t,count:e}),je=g=>new ga({gsplat:g}),vi=({gsplat:g,flags:A,index:t,center:e,scales:i,quaternion:s,rgba:n,rgb:r,opacity:a,x:o,y:B,z:I,r:Q,g:h,b:E})=>new oa({gsplat:g,flags:A,index:t,center:e,scales:i,quaternion:s,rgba:n,rgb:r,opacity:a,x:o,y:B,z:I,r:Q,g:h,b:E}),na=(g,{scale:A,rotate:t,translate:e,recolor:i})=>new Ia({gsplat:g,scale:A,rotate:t,translate:e,recolor:i}),tt=KA(`\n struct Gsplat {\n vec3 center;\n uint flags;\n vec3 scales;\n int index;\n vec4 quaternion;\n vec4 rgba;\n };\n const uint GSPLAT_FLAG_ACTIVE = 1u << 0u;\n\n bool isGsplatActive(uint flags) {\n return (flags & GSPLAT_FLAG_ACTIVE) != 0u;\n }\n`),Ki=KA(`\n struct PackedSplats {\n usampler2DArray texture;\n int numSplats;\n };\n`),en=KA(`\n bool readPackedSplat(usampler2DArray texture, int numSplats, int index, out Gsplat gsplat) {\n if ((index >= 0) && (index < numSplats)) {\n uvec4 packed = texelFetch(texture, splatTexCoord(index), 0);\n unpackSplat(packed, gsplat.center, gsplat.scales, gsplat.quaternion, gsplat.rgba);\n return true;\n } else {\n return false;\n }\n }\n`);class ra extends lA{constructor({packedSplats:A,index:t}){super({inTypes:{packedSplats:zi,index:"int"},outTypes:{gsplat:pA},inputs:{packedSplats:A,index:t},globals:()=>[tt,Ki,en],statements:({inputs:e,outputs:i})=>{const{gsplat:s}=i;if(!s)return[];const{packedSplats:n,index:r}=e;let a;return n&&r?a=At(`\n if (readPackedSplat(${n}.texture, ${n}.numSplats, ${r}, ${s})) {\n bool zeroSize = all(equal(${s}.scales, vec3(0.0, 0.0, 0.0)));\n ${s}.flags = zeroSize ? 0u : GSPLAT_FLAG_ACTIVE;\n } else {\n ${s}.flags = 0u;\n }\n `):a=[`${s}.flags = 0u;`],a.push(`${s}.index = ${r??"0"};`),a}})}dynoOut(){return new SA(this,"gsplat")}}class aa extends lA{constructor({packedSplats:A,index:t,base:e,count:i}){super({inTypes:{packedSplats:zi,index:"int",base:"int",count:"int"},outTypes:{gsplat:pA},inputs:{packedSplats:A,index:t,base:e,count:i},globals:()=>[tt,Ki,en],statements:({inputs:s,outputs:n})=>{const{gsplat:r}=n;if(!r)return[];const{packedSplats:a,index:o,base:B,count:I}=s;let Q;return a&&o&&B&&I?Q=At(`\n ${r}.flags = 0u;\n if ((${o} >= ${B}) && (${o} < (${B} + ${I}))) {\n if (readPackedSplat(${a}.texture, ${a}.numSplats, ${o}, ${r})) {\n bool zeroSize = all(equal(${r}.scales, vec3(0.0, 0.0, 0.0)));\n ${r}.flags = zeroSize ? 0u : GSPLAT_FLAG_ACTIVE;\n }\n }\n `):Q=[`${r}.flags = 0u;`],Q.push(`${r}.index = ${o??"0"};`),Q}})}dynoOut(){return new SA(this,"gsplat")}}class ga extends lA{constructor({gsplat:A}){super({inTypes:{gsplat:pA},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:()=>[tt],statements:({inputs:t,outputs:e})=>{const{gsplat:i}=t,{flags:s,active:n,index:r,center:a,scales:o,quaternion:B,rgba:I,rgb:Q,opacity:h,x:E,y:C,z:c,r:l,g:y,b:d}=e;return[s?`${s} = ${i?`${i}.flags`:"0u"};`:null,n?`${n} = isGsplatActive(${i?`${i}.flags`:"0u"});`:null,r?`${r} = ${i?`${i}.index`:"0"};`:null,a?`${a} = ${i?`${i}.center`:"vec3(0.0, 0.0, 0.0)"};`:null,o?`${o} = ${i?`${i}.scales`:"vec3(0.0, 0.0, 0.0)"};`:null,B?`${B} = ${i?`${i}.quaternion`:"vec4(0.0, 0.0, 0.0, 1.0)"};`:null,I?`${I} = ${i?`${i}.rgba`:"vec4(0.0, 0.0, 0.0, 0.0)"};`:null,Q?`${Q} = ${i?`${i}.rgba.rgb`:"vec3(0.0, 0.0, 0.0)"};`:null,h?`${h} = ${i?`${i}.rgba.a`:"0.0"};`:null,E?`${E} = ${i?`${i}.center.x`:"0.0"};`:null,C?`${C} = ${i?`${i}.center.y`:"0.0"};`:null,c?`${c} = ${i?`${i}.center.z`:"0.0"};`:null,l?`${l} = ${i?`${i}.rgba.r`:"0.0"};`:null,y?`${y} = ${i?`${i}.rgba.g`:"0.0"};`:null,d?`${d} = ${i?`${i}.rgba.b`:"0.0"};`:null].filter(Boolean)}})}}class oa extends lA{constructor({gsplat:A,flags:t,index:e,center:i,scales:s,quaternion:n,rgba:r,rgb:a,opacity:o,x:B,y:I,z:Q,r:h,g:E,b:C}){super({inTypes:{gsplat:pA,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:pA},inputs:{gsplat:A,flags:t,index:e,center:i,scales:s,quaternion:n,rgba:r,rgb:a,opacity:o,x:B,y:I,z:Q,r:h,g:E,b:C},globals:()=>[tt],statements:({inputs:c,outputs:l})=>{const{gsplat:y}=l;if(!y)return[];const{gsplat:d,flags:f,index:p,center:m,scales:x,quaternion:w,rgba:D,rgb:N,opacity:M,x:S,y:F,z:k,r:U,g:R,b:G}=c;return[`${y}.flags = ${f??(d?`${d}.flags`:"0u")};`,`${y}.index = ${p??(d?`${d}.index`:"0")};`,`${y}.center = ${m??(d?`${d}.center`:"vec3(0.0, 0.0, 0.0)")};`,`${y}.scales = ${x??(d?`${d}.scales`:"vec3(0.0, 0.0, 0.0)")};`,`${y}.quaternion = ${w??(d?`${d}.quaternion`:"vec4(0.0, 0.0, 0.0, 1.0)")};`,`${y}.rgba = ${D??(d?`${d}.rgba`:"vec4(0.0, 0.0, 0.0, 0.0)")};`,N?`${y}.rgba.rgb = ${N};`:null,M?`${y}.rgba.a = ${M};`:null,S?`${y}.center.x = ${S};`:null,F?`${y}.center.y = ${F};`:null,k?`${y}.center.z = ${k};`:null,U?`${y}.rgba.r = ${U};`:null,R?`${y}.rgba.g = ${R};`:null,G?`${y}.rgba.b = ${G};`:null].filter(Boolean)}})}dynoOut(){return new SA(this,"gsplat")}}KA(`\n vec3 gsplatNormal(vec3 scales, vec4 quaternion) {\n float minScale = min(scales.x, min(scales.y, scales.z));\n vec3 normal;\n if (scales.z == minScale) {\n normal = vec3(0.0, 0.0, 1.0);\n } else if (scales.y == minScale) {\n normal = vec3(0.0, 1.0, 0.0);\n } else {\n normal = vec3(1.0, 0.0, 0.0);\n }\n return quatVec(quaternion, normal);\n }\n`);class Ia extends lA{constructor({gsplat:A,scale:t,rotate:e,translate:i,recolor:s}){super({inTypes:{gsplat:pA,scale:"float",rotate:"vec4",translate:"vec3",recolor:"vec4"},outTypes:{gsplat:pA},inputs:{gsplat:A,scale:t,rotate:e,translate:i,recolor:s},globals:()=>[tt],statements:({inputs:n,outputs:r,compile:a})=>{const{gsplat:o}=r;if(!o||!n.gsplat)return[];const{scale:B,rotate:I,translate:Q,recolor:h}=n,E=a.indent;return[`${o} = ${n.gsplat};`,`if (isGsplatActive(${o}.flags)) {`,B?`${E}${o}.center *= ${B};`:null,I?`${E}${o}.center = quatVec(${I}, ${o}.center);`:null,Q?`${E}${o}.center += ${Q};`:null,B?`${E}${o}.scales *= ${B};`:null,I?`${E}${o}.quaternion = quatQuat(${I}, ${o}.quaternion);`:null,h?`${E}${o}.rgba *= ${h};`:null,"}"].filter(Boolean)}})}dynoOut(){return new SA(this,"gsplat")}}const Ba=g=>new Qa({gsplat:g});class Qa extends lA{constructor({gsplat:A}){super({inTypes:{gsplat:pA},inputs:{gsplat:A},globals:()=>[tt],statements:({inputs:t,outputs:e})=>{const{output:i}=e;if(!i)return[];const{gsplat:s}=t;return s?At(`\n if (isGsplatActive(${s}.flags)) {\n ${i} = packSplat(${s}.center, ${s}.scales, ${s}.quaternion, ${s}.rgba);\n } else {\n ${i} = uvec4(0u, 0u, 0u, 0u);\n }\n `):[`${i} = uvec4(0u, 0u, 0u, 0u);`]}})}dynoOut(){return new SA(this,"output")}}class ha extends lA{constructor({rgba8:A}){super({inTypes:{rgba8:"vec4"},inputs:{rgba8:A},statements:({inputs:t,outputs:e})=>[`target = ${t.rgba8??"vec4(0.0, 0.0, 0.0, 0.0)"};`]})}dynoOut(){return new SA(this,"rgba8")}}class et extends lA{constructor({key:A,type:t,count:e,value:i,update:s,globals:n}){A=A??"value",super({outTypes:{[A]:t},update:()=>{if(s){const r=s(this.value);r!==void 0&&(this.value=r)}this.uniform.value=this.value},generate:({inputs:r,outputs:a})=>{const o=(n==null?void 0:n({inputs:r,outputs:a}))??[],B={},I=a[A];return I&&(o.push(`uniform ${Ws(I,t,e)};`),B[I]=this.uniform),{globals:o,uniforms:B}}}),this.type=t,this.count=e,this.value=i,this.uniform={value:i},this.outKey=A}dynoOut(){return new SA(this,this.outKey)}}class _i extends et{constructor({key:A,value:t,update:e}){super({key:A,type:"int",value:t,update:e})}}class $e extends et{constructor({key:A,value:t,update:e}){super({key:A,type:"float",value:t,update:e})}}class Ea extends et{constructor({key:A,value:t,update:e}){super({key:A,type:"vec3",value:t,update:e})}}class sn extends et{constructor({key:A,value:t,update:e}){super({key:A,type:"vec4",value:t,update:e})}}class qi extends et{constructor({key:A,value:t,update:e}){super({key:A,type:"usampler2DArray",value:t,update:e})}}class nn{constructor({graph:A,inputs:t,outputs:e,template:i}){this.graph=A,this.template=i,this.inputs=t??{},this.outputs=e??{};const s=new br({indent:this.template.indent});for(const r in this.outputs)this.outputs[r]&&s.declares.add(this.outputs[r]);const n=A.compile({inputs:this.inputs,outputs:this.outputs,compile:s});this.shader=i.generate({globals:s.globals,statements:n}),this.uniforms=s.uniforms,this.updaters=s.updaters}prepareMaterial(){return Ca(this)}update(){for(const A of this.updaters)A()}}class rn{constructor(A){const t=A.match(/^([ \\t]*)\\{\\{\\s*GLOBALS\\s*\\}\\}/m),e=A.match(/^([ \\t]*)\\{\\{\\s*STATEMENTS\\s*\\}\\}/m);if(!t||!e)throw new Error("Template must contain {{ GLOBALS }} and {{ STATEMENTS }}");this.before=A.substring(0,t.index),this.between=A.substring(t.index+t[0].length,e.index),this.after=A.substring(e.index+e[0].length),this.indent=e[1]}generate({globals:A,statements:t}){return this.before+Array.from(A).join(`\n\n`)+this.between+t.map(e=>this.indent+e).join(`\n`)+this.after}}const an=new Map;function Ca(g){let A=an.get(g);return A||(A=new Ri({glslVersion:jn,vertexShader:Pr,fragmentShader:g.shader,uniforms:g.uniforms}),an.set(g,A),A)}function gn(g,A,t="add"){const e=()=>{throw new Error(`Invalid ${t} types: ${g}, ${A}`)};if(g===A)return g;if(g==="int"){if(Tt(A))return A;e()}if(A==="int"){if(Tt(g))return g;e()}if(g==="uint"){if(zt(A))return A;e()}if(A==="uint"){if(zt(g))return g;e()}if(g==="float"){if(Ke(A))return A;e()}if(A==="float"){if(Ke(g))return g;e()}throw new Error(`Invalid ${t} types: ${g}, ${A}`)}function ca(g,A){return gn(g,A,"sub")}function la(g,A){const t=()=>{throw new Error(`Invalid mul types: ${g}, ${A}`)},e=i=>i;if(g==="int"){if(Tt(A))return e(A);t()}if(A==="int"){if(Tt(g))return e(g);t()}if(g==="uint"){if(zt(A))return e(A);t()}if(A==="uint"){if(zt(g))return e(g);t()}if(g==="float"){if(Ke(A))return e(A);t()}if(A==="float"){if(Ke(g))return e(g);t()}if(Tt(g)||zt(g)||Tt(A)||zt(A)){if(g===A)return e(g);t()}if(g==="vec2"){if(A==="vec2"||vt(A))return e("vec2");if(A==="mat3x2")return e("vec3");if(A==="mat4x2")return e("vec4");t()}if(g==="vec3"){if(A==="mat2x3")return e("vec2");if(A==="vec3"||Kt(A))return e("vec3");if(A==="mat4x3")return e("vec4");t()}if(g==="vec4"){if(A==="mat2x4")return e("vec2");if(A==="mat3x4")return e("vec3");if(A==="vec4"||_t(A))return e("vec4");t()}if(A==="vec2"){if(vt(g))return e("vec2");if(g==="mat2x3")return e("vec3");if(g==="mat2x4")return e("vec4");t()}if(A==="vec3"){if(g==="mat3x2")return e("vec2");if(Kt(g))return e("vec3");if(g==="mat3x4")return e("vec4");t()}if(A==="vec4"){if(g==="mat4x2")return e("vec2");if(g==="mat4x3")return e("vec3");if(_t(g))return e("vec4");t()}if(vt(g)){if(vt(A))return e("mat2");if(A==="mat3x2")return e("mat3x2");if(A==="mat4x2")return e("mat4x2");t()}if(g==="mat2x3"){if(vt(A))return e("mat2x3");if(A==="mat3x2")return e("mat3");if(A==="mat4x2")return e("mat4x3");t()}if(g==="mat2x4"){if(vt(A))return e("mat2x4");if(A==="mat3x2")return e("mat3x4");if(A==="mat4x2")return e("mat4");t()}if(g==="mat3x2"){if(A==="mat2x3")return e("mat2");if(Kt(A))return e("mat3x2");if(A==="mat4x3")return e("mat4x2");t()}if(Kt(g)){if(A==="mat2x3")return e("mat2x3");if(Kt(A))return e("mat3");if(A==="mat4x3")return e("mat4x3");t()}if(g==="mat3x4"){if(A==="mat2x3")return e("mat2x4");if(Kt(A))return e("mat3x4");if(A==="mat4x3")return e("mat4");t()}if(g==="mat4x2"){if(A==="mat2x4")return e("mat2");if(A==="mat3x4")return e("mat3x2");if(_t(A))return e("mat4x2");t()}if(g==="mat4x3"){if(A==="mat2x4")return e("mat2x3");if(A==="mat3x4")return e("mat3");if(_t(A))return e("mat4x3");t()}if(_t(g)){if(A==="mat2x4")return e("mat2x4");if(A==="mat3x4")return e("mat3x4");if(_t(A))return e("mat4");t()}throw new Error(`Invalid mul types: ${g}, ${A}`)}const Ai=(g,A)=>new ya({a:g,b:A}),ua=(g,A)=>new fa({a:g,b:A}),da=(g,A)=>new wa({a:g,b:A});class ya extends Ze{constructor({a:A,b:t}){super({a:A,b:t,outKey:"sum",outTypeFunc:gn}),this.statements=({inputs:e,outputs:i})=>[`${i.sum} = ${e.a} + ${e.b};`]}}class fa extends Ze{constructor({a:A,b:t}){super({a:A,b:t,outKey:"difference",outTypeFunc:ca}),this.statements=({inputs:e,outputs:i})=>[`${i.difference} = ${e.a} - ${e.b};`]}}class wa extends Ze{constructor({a:A,b:t}){super({a:A,b:t,outKey:"product",outTypeFunc:la}),this.statements=({inputs:e,outputs:i})=>[`${i.product} = ${e.a} * ${e.b};`]}}const pa=g=>new ma({a:g}),Da=(g,A)=>new Ma({a:g,b:A});class ma extends Yr{constructor({a:A}){super({a:A,outTypeFunc:t=>t,outKey:"normalize"}),this.statements=({inputs:t,outputs:e})=>[`${e.normalize} = normalize(${t.a});`]}}function xa(g){if(g==="float")return"vec2";if(g==="vec2")return"vec3";if(g==="vec3")return"vec4";throw new Error("Invalid type")}class Ma extends Ze{constructor({a:A,b:t}){const e=wt(A),i=xa(e);super({a:A,b:t,outKey:"extend",outTypeFunc:()=>i}),this.statements=({inputs:s,outputs:n})=>[`${n.extend} = ${i}(${s.a}, ${s.b});`]}}const Sa=(g,{scale:A,scales:t,rotate:e,translate:i})=>new Na({position:g,scale:A,scales:t,rotate:e,translate:i}).outputs.position,Fa=(g,{scale:A,scales:t,rotate:e})=>new ka({dir:g,scale:A,scales:t,rotate:e}).outputs.dir;class Na extends lA{constructor({position:A,scale:t,scales:e,rotate:i,translate:s}){super({inTypes:{position:"vec3",scale:"float",scales:"vec3",rotate:"vec4",translate:"vec3"},outTypes:{position:"vec3"},inputs:{position:A,scale:t,scales:e,rotate:i,translate:s},statements:({inputs:n,outputs:r})=>{const{position:a}=r;if(!a)return[];const{scale:o,scales:B,rotate:I,translate:Q}=n;return[`${a} = ${n.position??"vec3(0.0, 0.0, 0.0)"};`,o?`${a} *= ${o};`:null,B?`${a} *= ${B};`:null,I?`${a} = quatVec(${I}, ${a});`:null,Q?`${a} += ${Q};`:null].filter(Boolean)}})}}class ka extends lA{constructor({dir:A,scale:t,scales:e,rotate:i}){super({inTypes:{dir:"vec3",scale:"float",scales:"vec3",rotate:"vec4"},outTypes:{dir:"vec3"},inputs:{dir:A,scale:t,scales:e,rotate:i},statements:({inputs:s,outputs:n})=>{const{dir:r}=n;if(!r)return[];const{scale:a,scales:o,rotate:B}=s;return[`${r} = ${s.dir??"vec3(0.0, 0.0, 0.0)"};`,a?`${r} *= ${a};`:null,o?`${r} *= ${o};`:null,B?`${r} = quatVec(${B}, ${r});`:null].filter(Boolean)}})}}var Ra=`precision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp usampler2D;\nprecision highp isampler2D;\nprecision highp sampler2DArray;\nprecision highp usampler2DArray;\nprecision highp isampler2DArray;\nprecision highp sampler3D;\nprecision highp usampler3D;\nprecision highp isampler3D;\n\n#include <splatDefines>\n\nuniform uint targetLayer;\nuniform int targetBase;\nuniform int targetCount;\n\nout uvec4 target;\n\n{{ GLOBALS }}\n\nvoid produceSplat(int index) {\n {{ STATEMENTS }}\n}\n\nvoid main() {\n int targetIndex = int(targetLayer << SPLAT_TEX_LAYER_BITS) + int(uint(gl_FragCoord.y) << SPLAT_TEX_WIDTH_BITS) + int(gl_FragCoord.x);\n int index = targetIndex - targetBase;\n\n if ((index >= 0) && (index < targetCount)) {\n produceSplat(index);\n } else {\n target = uvec4(0u, 0u, 0u, 0u);\n }\n}`;const O=class O{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 on({packedSplats:this}),this.initialized=Promise.resolve(this),this.reinitialize(A)}reinitialize(A){this.isInitialized=!1,A.url||A.fileBytes||A.construct?this.initialized=this.asyncInitialize(A).then(()=>(this.isInitialized=!0,this)):(this.initialize(A),this.isInitialized=!0,this.initialized=Promise.resolve(this))}initialize(A){A.packedArray?(this.packedArray=A.packedArray,this.maxSplats=Math.floor(this.packedArray.length/4),this.maxSplats=Math.floor(this.maxSplats/P)*P,this.numSplats=Math.min(this.maxSplats,A.numSplats??Number.POSITIVE_INFINITY)):(this.maxSplats=A.maxSplats??0,this.numSplats=0),this.extra=A.extra??{}}async asyncInitialize(A){let{url:t,fileBytes:e,construct:i}=A;if(t&&(e=await fetch(t).then(async s=>{if(!s.ok)throw new Error(`${s.status} "${s.statusText}" fetching URL: ${t}`);return await s.arrayBuffer()})),e){const s=await ja({input:e,fileType:A.fileType,pathOrUrl:A.fileName??t});this.initialize(s)}if(i){const s=i(this);s instanceof Promise&&await s}}dispose(){this.target&&(this.target.dispose(),this.target=null),this.source&&(this.source.dispose(),this.source=null)}ensureSplats(A){const t=A<=this.maxSplats?this.maxSplats:Math.max(A,2*this.maxSplats),e=this.packedArray?this.packedArray.length/4:0;if(!this.packedArray||t>e){this.maxSplats=FA(t).maxSplats;const i=new Uint32Array(this.maxSplats*4);this.packedArray&&i.set(this.packedArray),this.packedArray=i}return this.packedArray}ensureSplatsSh(A,t){let e,i;if(A===0)return this.ensureSplats(t);if(A===1)e=2,i="sh1";else if(A===2)e=4,i="sh2";else if(A===3)e=4,i="sh3";else throw new Error(`Invalid level: ${A}`);let s=this.extra[i]?this.extra[i].length/e:0;const n=t<=s?s:Math.max(t,2*s);if(!this.extra[i]||n>s){s=FA(n).maxSplats;const r=new Uint32Array(s*e);this.extra[i]&&r.set(this.extra[i]),this.extra[i]=r}return this.extra[i]}getSplat(A){if(!this.packedArray||A>=this.numSplats)throw new Error("Invalid index");return Vs(this.packedArray,A)}setSplat(A,t,e,i,s,n){const r=this.ensureSplats(A+1);ge(r,A,t.x,t.y,t.z,e.x,e.y,e.z,i.x,i.y,i.z,i.w,s,n.r,n.g,n.b),this.numSplats=Math.max(this.numSplats,A+1)}pushSplat(A,t,e,i,s){const n=this.ensureSplats(this.numSplats+1);ge(n,this.numSplats,A.x,A.y,A.z,t.x,t.y,t.z,e.x,e.y,e.z,e.w,i,s.r,s.g,s.b),++this.numSplats}forEachSplat(A){if(!(!this.packedArray||!this.numSplats))for(let t=0;t<this.numSplats;++t){const e=Vs(this.packedArray,t);A(t,e.center,e.scales,e.quaternion,e.opacity,e.color)}}ensureGenerate(A){if(this.target&&(A??1)<=this.maxSplats)return!1;this.dispose();const t=FA(A??1),{width:e,height:i,depth:s}=t;return this.maxSplats=t.maxSplats,this.target=new xs(e,i,s,{depthBuffer:!1,stencilBuffer:!1,generateMipmaps:!1,magFilter:nt,minFilter:nt}),this.target.texture.format=mt,this.target.texture.type=ct,this.target.texture.internalFormat="RGBA32UI",!0}generateMapping(A){let t=0;const e=A.map(i=>{const s=t,n=Math.ceil(i/P)*P;return t+=n,{base:s,count:i}});return{maxSplats:t,mapping:e}}getTexture(){return this.target?this.target.texture:this.source||this.packedArray?this.maybeUpdateSource():O.getEmpty()}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:t,depth:e}=this.source.image;this.maxSplats!==A*t*e&&(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:t,depth:e}=FA(this.maxSplats);this.source=new rt(this.packedArray,A,t,e),this.source.format=mt,this.source.type=ct,this.source.internalFormat="RGBA32UI",this.source.needsUpdate=!0}this.source.needsUpdate=!0}return this.source}static getEmpty(){if(!O.emptySource){const{width:A,height:t,depth:e,maxSplats:i}=FA(1),s=new Uint32Array(i*4);O.emptySource=new rt(s,A,t,e),O.emptySource.format=mt,O.emptySource.type=ct,O.emptySource.internalFormat="RGBA32UI",O.emptySource.needsUpdate=!0}return O.emptySource}prepareProgramMaterial(A){let t=O.generatorProgram.get(A);if(!t){const i=qe({index:"int"},{output:"uvec4"},({index:s})=>{A.inputs.index=s;const n=A.outputs.gsplat;return{output:Ba(n)}});O.programTemplate||(O.programTemplate=new rn(Ra)),t=new nn({graph:i,inputs:{index:"index"},outputs:{output:"target"},template:O.programTemplate}),Object.assign(t.uniforms,{targetLayer:{value:0},targetBase:{value:0},targetCount:{value:0}}),O.generatorProgram.set(A,t)}const e=t.prepareMaterial();return O.mesh.material=e,{program:t,material:e}}saveRenderState(A){return{xrPresenting:A.xr.isPresenting,autoClear:A.autoClear,scissorTest:A.getScissorTest(),pixelRatio:A.getPixelRatio()}}resetRenderState(A,t){A.setRenderTarget(null),A.setPixelRatio(t.pixelRatio),A.xr.isPresenting=t.xrPresenting,A.autoClear=t.autoClear,A.setScissorTest(t.scissorTest)}generate({generator:A,base:t,count:e,renderer:i}){if(!this.target)throw new Error("Target must be initialized with ensureSplats");if(t+e>this.maxSplats)throw new Error("Base + count exceeds maxSplats");const{program:s,material:n}=this.prepareProgramMaterial(A);s.update();const r=this.saveRenderState(i),a=Math.ceil((t+e)/P)*P,o=P*Qt;for(n.uniforms.targetBase.value=t,n.uniforms.targetCount.value=e;t<a;){const B=Math.floor(t/o);n.uniforms.targetLayer.value=B;const I=B*o,Q=Math.floor((t-I)/P),h=Math.min(Qt,Math.ceil((a-I)/P));i.setPixelRatio(1),i.setRenderTarget(this.target,B),i.xr.isPresenting=!1,i.autoClear=!1,i.setScissorTest(!0),i.setScissor(0,Q,P,h-Q),i.render(O.scene,O.camera),t+=P*(h-Q)}return this.resetRenderState(i,r),{nextBase:a}}};O.emptySource=null,O.programTemplate=null,O.generatorProgram=new Map,O.geometry=new ve(2,2),O.mesh=new vs(O.geometry,new Ri({visible:!1})),O.scene=new _s().add(O.mesh),O.camera=new Ks;let Ie=O;class on extends et{constructor({packedSplats:A}={}){super({key:"packedSplats",type:zi,globals:()=>[Ki],value:{texture:Ie.getEmpty(),numSplats:0},update:t=>{var e,i;return t.texture=((e=this.packedSplats)==null?void 0:e.getTexture())??Ie.getEmpty(),t.numSplats=((i=this.packedSplats)==null?void 0:i.numSplats)??0,t}}),this.packedSplats=A}}var Ua=`precision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp usampler2D;\nprecision highp isampler2D;\nprecision highp sampler2DArray;\nprecision highp usampler2DArray;\nprecision highp isampler2DArray;\nprecision highp sampler3D;\nprecision highp usampler3D;\nprecision highp isampler3D;\n\n#include <splatDefines>\n\nuniform uint targetLayer;\nuniform int targetBase;\nuniform int targetCount;\n\nout vec4 target;\n\n{{ GLOBALS }}\n\nvoid computeReadback(int index) {\n {{ STATEMENTS }}\n}\n\nvoid main() {\n int targetIndex = int(targetLayer << SPLAT_TEX_LAYER_BITS) + int(uint(gl_FragCoord.y) << SPLAT_TEX_WIDTH_BITS) + int(gl_FragCoord.x);\n int index = targetIndex - targetBase;\n\n if ((index >= 0) && (index < targetCount)) {\n computeReadback(index);\n } else {\n target = vec4(0.0, 0.0, 0.0, 0.0);\n }\n}`;const IA=class IA{constructor({renderer:A}={}){this.renderer=A,this.capacity=0,this.count=0}dispose(){this.target&&(this.target.dispose(),this.target=void 0)}ensureBuffer(A,t){const i=Math.ceil(Math.max(1,A)/P)*P*4;if(t.byteLength>=i)return t;const s=new ArrayBuffer(i);if(t instanceof ArrayBuffer)return s;const n=t.constructor;return new n(s)}ensureCapacity(A){const{width:t,height:e,depth:i,maxSplats:s}=FA(A);(!this.target||s>this.capacity)&&(this.dispose(),this.capacity=s,this.target=new xs(t,e,i,{depthBuffer:!1,stencilBuffer:!1,generateMipmaps:!1,magFilter:nt,minFilter:nt}),this.target.texture.format=pe,this.target.texture.type=we,this.target.texture.internalFormat="RGBA8")}prepareProgramMaterial(A){let t=IA.readbackProgram.get(A);if(!t){const i=qe({index:"int"},{rgba8:"vec4"},({index:s})=>(A.inputs.index=s,{rgba8:new ha({rgba8:A.outputs.rgba8})}));IA.programTemplate||(IA.programTemplate=new rn(Ua)),t=new nn({graph:i,inputs:{index:"index"},outputs:{rgba8:"target"},template:IA.programTemplate}),Object.assign(t.uniforms,{targetLayer:{value:0},targetBase:{value:0},targetCount:{value:0}}),IA.readbackProgram.set(A,t)}const e=t.prepareMaterial();return IA.mesh.material=e,{program:t,material:e}}saveRenderState(A){return{xrPresenting:A.xr.isPresenting,autoClear:A.autoClear,scissorTest:A.getScissorTest(),pixelRatio:A.getPixelRatio()}}resetRenderState(A,t){A.setRenderTarget(null),A.setPixelRatio(t.pixelRatio),A.xr.isPresenting=t.xrPresenting,A.autoClear=t.autoClear,A.setScissorTest(t.scissorTest)}process({count:A,material:t}){const e=this.renderer;if(!e)throw new Error("No renderer");if(!this.target)throw new Error("No target");const i=P*Qt;t.uniforms.targetBase.value=0,t.uniforms.targetCount.value=A;let s=0;for(;s<A;){const n=Math.floor(s/i),r=n*i,a=Math.min(Qt,Math.ceil((A-r)/P));t.uniforms.targetLayer.value=n,e.setPixelRatio(1),e.setRenderTarget(this.target,n),e.xr.isPresenting=!1,e.autoClear=!1,e.setScissorTest(!0),e.setScissor(0,0,P,a),e.render(IA.scene,IA.camera),s+=P*a}this.count=A}async read({readback:A}){const t=this.renderer;if(!t)throw new Error("No renderer");if(!this.target)throw new Error("No target");const e=Math.ceil(this.count/P)*P;if(A.byteLength<e*4)throw new Error(`Readback buffer too small: ${A.byteLength} < ${e*4}`);const i=new Uint8Array(A instanceof ArrayBuffer?A:A.buffer),s=P*Qt;let n=0;const r=[];for(;n<this.count;){const a=Math.floor(n/s),o=a*s,B=Math.min(Qt,Math.ceil((this.count-o)/P));t.setPixelRatio(1),t.setRenderTarget(this.target,a);const I=P*B*4,Q=i.subarray(o*4,o*4+I),h=t==null?void 0:t.readRenderTargetPixelsAsync(this.target,0,0,P,B,Q);r.push(h),n+=P*B}return Promise.all(r).then(()=>A)}render({reader:A,count:t,renderer:e}){if(this.renderer=e||this.renderer,!this.renderer)throw new Error("No renderer");this.ensureCapacity(t);const{program:i,material:s}=this.prepareProgramMaterial(A);i.update();const n=this.saveRenderState(this.renderer);this.process({count:t,material:s}),this.resetRenderState(this.renderer,n)}async readback({readback:A}){if(!this.renderer)throw new Error("No renderer");const t=this.saveRenderState(this.renderer),e=this.read({readback:A});return this.resetRenderState(this.renderer,t),e}async renderReadback({reader:A,count:t,renderer:e,readback:i}){if(this.renderer=e||this.renderer,!this.renderer)throw new Error("No renderer");this.ensureCapacity(t);const{program:s,material:n}=this.prepareProgramMaterial(A);s.update();const r=this.saveRenderState(this.renderer);this.process({count:t,material:n});const a=this.read({readback:i});return this.resetRenderState(this.renderer,r),a}getTexture(){var A;return(A=this.target)==null?void 0:A.texture}};IA.programTemplate=null,IA.readbackProgram=new Map,IA.geometry=new ve(2,2),IA.mesh=new vs(IA.geometry,new Ri({visible:!1})),IA.scene=new _s().add(IA.mesh),IA.camera=new Ks;let Zi=IA;const BA=class BA{constructor(A={}){this.capacity=0,this.count=0,this.array=null,this.readback=null,this.source=null,this.needsUpdate=!0,this.dyno=new et({key:"rgbaArray",type:Bn,globals:()=>[Qn],value:{texture:BA.getEmpty(),count:0},update:t=>{var e;return t.texture=((e=this.readback)==null?void 0:e.getTexture())??this.source??BA.getEmpty(),t.count=this.count,t}}),A.array?(this.array=A.array,this.capacity=Math.floor(this.array.length/4),this.capacity=Math.floor(this.capacity/P)*P,this.count=Math.min(this.capacity,A.count??Number.POSITIVE_INFINITY)):(this.capacity=A.capacity??0,this.count=0)}dispose(){this.readback&&(this.readback.dispose(),this.readback=null),this.source&&(this.source.dispose(),this.source=null)}ensureCapacity(A){var t;if(!this.array||A>(((t=this.array)==null?void 0:t.length)??0)/4){this.capacity=FA(A).maxSplats;const e=new Uint8Array(this.capacity*4);this.array&&e.set(this.array),this.array=e}return this.array}getTexture(){var t;let A=(t=this.readback)==null?void 0:t.getTexture();return(this.source||this.array)&&(A=this.maybeUpdateSource()),A??BA.getEmpty()}maybeUpdateSource(){if(!this.array)throw new Error("No array");if(this.needsUpdate||!this.source){if(this.needsUpdate=!1,this.source){const{width:A,height:t,depth:e}=this.source.image;this.capacity!==A*t*e&&(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:t,depth:e}=FA(this.capacity);this.source=new rt(this.array,A,t,e),this.source.format=pe,this.source.type=we,this.source.internalFormat="RGBA8",this.source.needsUpdate=!0}this.source.needsUpdate=!0}return this.source}render({reader:A,count:t,renderer:e}){this.readback||(this.readback=new Zi({renderer:e})),this.readback.render({reader:A,count:t,renderer:e}),this.capacity=this.readback.capacity,this.count=this.readback.count}fromPackedSplats({packedSplats:A,base:t,count:e,renderer:i}){const{dynoSplats:s,dynoBase:n,dynoCount:r,reader:a}=BA.makeDynos();return s.packedSplats=A,n.value=t,r.value=e,this.render({reader:a,count:e,renderer:i}),this}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)}static getEmpty(){if(!BA.emptySource){const A=new Uint8Array(4);BA.emptySource=new rt(A,1,1,1),BA.emptySource.format=pe,BA.emptySource.type=we,BA.emptySource.internalFormat="RGBA8",BA.emptySource.needsUpdate=!0}return BA.emptySource}static makeDynos(){if(!BA.dynos){const A=new on,t=new _i({value:0}),e=new _i({value:0}),i=qe({index:"int"},{rgba8:"vec4"},({index:s})=>{if(!s)throw new Error("index is undefined");s=Ai(s,t);const n=sa(A,s,t,e);return{rgba8:je(n).outputs.rgba}});BA.dynos={dynoSplats:A,dynoBase:t,dynoCount:e,reader:i}}return BA.dynos}};BA.emptySource=null,BA.dynos=null;let In=BA;const Bn={type:"RgbaArray"},Qn=KA(`\n struct RgbaArray {\n sampler2DArray texture;\n int count;\n };\n`);function Ga(g,A){return new lA({inTypes:{rgba:Bn,index:"int"},outTypes:{rgba:"vec4"},inputs:{rgba:g,index:A},globals:()=>[Qn],statements:({inputs:e,outputs:i})=>At(`\n if ((index >= 0) && (index < ${e.rgba}.count)) {\n ${i.rgba} = texelFetch(${e.rgba}.texture, splatTexCoord(index), 0);\n } else {\n ${i.rgba} = vec4(0.0, 0.0, 0.0, 0.0);\n }\n `)}).outputs.rgba}function ba(g){switch(g){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: ${g}`)}}function La(g){switch(g){case"multiply":return 0;case"set_rgb":return 1;case"add_rgba":return 2;default:throw new Error(`Unknown blend mode: ${g}`)}}class Ya extends wA{constructor(A={}){super();const{type:t,invert:e,opacity:i,color:s,displace:n,radius:r}=A;this.type=t??"sphere",this.invert=e??!1,this.opacity=i??1,this.color=s??new yt(1,1,1),this.displace=n??new u(0,0,0),this.radius=r??0}}const si=class si extends wA{constructor(A={}){const{name:t,rgbaBlendMode:e="multiply",sdfSmooth:i=0,softEdge:s=0,invert:n=!1,sdfs:r=null}=A;super(),this.rgbaBlendMode=e,this.sdfSmooth=i,this.softEdge=s,this.invert=n,this.sdfs=r,this.ordering=si.nextOrdering++,this.name=t??`Edit ${this.ordering}`}addSdf(A){this.sdfs==null&&(this.sdfs=[]),this.sdfs.push(A)}removeSdf(A){this.sdfs!=null&&(this.sdfs=this.sdfs.filter(t=>t!==A))}};si.nextOrdering=1;let Wi=si;class Ja{constructor({maxSdfs:A,maxEdits:t}){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 et({key:"sdfArray",type:hn,globals:()=>[En],value:{numSdfs:0,sdfTexture:this.sdfTexture},update:e=>(e.numSdfs=this.numSdfs,e.sdfTexture=this.sdfTexture,e)}),this.maxEdits=Math.max(16,t??0),this.numEdits=0,this.editData=new Uint32Array(this.maxEdits*4),this.editFloatData=new Float32Array(this.editData.buffer),this.dynoNumEdits=new _i({value:0}),this.dynoEdits=this.newEdits(this.editData,this.maxEdits)}newSdfTexture(A,t){const e=new Mr(A,8,t,mt,ct);return e.internalFormat="RGBA32UI",e.needsUpdate=!0,e}newEdits(A,t){return new et({key:"edits",type:"uvec4",count:t,globals:()=>[Cn],value:A})}ensureCapacity({maxSdfs:A,maxEdits:t}){let e=!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)),t>(this.dynoEdits.count??0)&&(this.maxEdits=Math.max(this.maxEdits*2,t),this.editData=new Uint32Array(this.maxEdits*4),this.editFloatData=new Float32Array(this.editData.buffer),this.dynoEdits=this.newEdits(this.editData,this.maxEdits),e=!0),e}updateEditData(A,t){const e=this.editData[A]!==t;return this.editData[A]=t,e}updateEditFloatData(A,t){Wt[0]=t;const e=this.editFloatData[A]!==Wt[0];return e&&(this.editFloatData[A]=Wt[0]),e}encodeEdit(A,{sdfFirst:t,sdfCount:e,invert:i,rgbaBlendMode:s,softEdge:n,sdfSmooth:r}){const a=A*4;let o=!1;return o=this.updateEditData(a+0,s|(i?256:0))||o,o=this.updateEditData(a+1,t|e<<16)||o,o=this.updateEditFloatData(a+2,n)||o,o=this.updateEditFloatData(a+3,r)||o,o}updateSdfData(A,t){const e=this.sdfData[A]!==t;return this.sdfData[A]=t,e}updateSdfFloatData(A,t){Wt[0]=t;const e=this.sdfFloatData[A]!==Wt[0];return e&&(this.sdfFloatData[A]=Wt[0]),e}encodeSdf(A,{sdfType:t,invert:e,center:i,quaternion:s,scale:n,sizes:r},a){const o=A*32,B=t|(e?256:0);let I=!1;I=this.updateSdfFloatData(o+0,(i==null?void 0:i.x)??0)||I,I=this.updateSdfFloatData(o+1,(i==null?void 0:i.y)??0)||I,I=this.updateSdfFloatData(o+2,(i==null?void 0:i.z)??0)||I,I=this.updateSdfData(o+3,B)||I,I=this.updateSdfFloatData(o+4,(s==null?void 0:s.x)??0)||I,I=this.updateSdfFloatData(o+5,(s==null?void 0:s.y)??0)||I,I=this.updateSdfFloatData(o+6,(s==null?void 0:s.z)??0)||I,I=this.updateSdfFloatData(o+7,(s==null?void 0:s.w)??0)||I,I=this.updateSdfFloatData(o+8,(n==null?void 0:n.x)??0)||I,I=this.updateSdfFloatData(o+9,(n==null?void 0:n.y)??0)||I,I=this.updateSdfFloatData(o+10,(n==null?void 0:n.z)??0)||I,I=this.updateSdfData(o+11,0)||I,I=this.updateSdfFloatData(o+12,(r==null?void 0:r.x)??0)||I,I=this.updateSdfFloatData(o+13,(r==null?void 0:r.y)??0)||I,I=this.updateSdfFloatData(o+14,(r==null?void 0:r.z)??0)||I,I=this.updateSdfFloatData(o+15,(r==null?void 0:r.w)??0)||I;const Q=Math.min(4,a.length);for(let h=0;h<Q;++h){const E=o+16+h*4;I=this.updateSdfFloatData(E+0,a[h].x)||I,I=this.updateSdfFloatData(E+1,a[h].y)||I,I=this.updateSdfFloatData(E+2,a[h].z)||I,I=this.updateSdfFloatData(E+3,a[h].w)||I}return I}update(A){const t=A.reduce((I,{sdfs:Q})=>I+Q.length,0),e=this.ensureCapacity({maxEdits:A.length,maxSdfs:t}),i=[new uA,new uA],s=new u,n=new gA,r=new u,a=new uA;let o=0,B=e;A.length!==this.dynoNumEdits.value&&(this.dynoNumEdits.value=A.length,this.numEdits=A.length,B=!0);for(const[I,{edit:Q,sdfs:h}]of A.entries()){B=this.encodeEdit(I,{sdfFirst:o,sdfCount:h.length,invert:Q.invert,rgbaBlendMode:La(Q.rgbaBlendMode),softEdge:Q.softEdge,sdfSmooth:Q.sdfSmooth})||B;let E=!1;for(const C of h)a.set(C.scale.x,C.scale.y,C.scale.z,C.radius),C.scale.setScalar(1),C.updateMatrixWorld(),C.matrixWorld.clone().invert().decompose(s,n,r),C.scale.set(a.x,a.y,a.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),E=this.encodeSdf(o,{sdfType:ba(C.type),invert:C.invert,center:s,quaternion:n,scale:r,sizes:a},i)||E,o+=1;this.numSdfs=o,E&&(this.sdfTexture.needsUpdate=!0),B||(B=E)}return{updated:B,dynoUpdated:e}}modify(A){return Ha(A,this.dynoSdfArray,this.dynoNumEdits,this.dynoEdits)}}const hn={type:"SdfArray"},En=KA(`\n struct SdfArray {\n int numSdfs;\n usampler2D sdfTexture;\n };\n\n void unpackSdfArray(\n usampler2D sdfTexture, int sdfIndex, out uint flags,\n out vec3 center, out vec4 quaternion, out vec3 scale, out vec4 sizes,\n int numValues, out vec4 values[4]\n ) {\n uvec4 temp = texelFetch(sdfTexture, ivec2(0, sdfIndex), 0);\n flags = temp.w;\n center = vec3(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z));\n\n temp = texelFetch(sdfTexture, ivec2(1, sdfIndex), 0);\n quaternion = vec4(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z), uintBitsToFloat(temp.w));\n\n temp = texelFetch(sdfTexture, ivec2(2, sdfIndex), 0);\n scale = vec3(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z));\n\n temp = texelFetch(sdfTexture, ivec2(3, sdfIndex), 0);\n sizes = vec4(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z), uintBitsToFloat(temp.w));\n\n for (int i = 0; i < numValues; ++i) {\n temp = texelFetch(sdfTexture, ivec2(4 + i, sdfIndex), 0);\n values[i] = vec4(uintBitsToFloat(temp.x), uintBitsToFloat(temp.y), uintBitsToFloat(temp.z), uintBitsToFloat(temp.w));\n }\n }\n\n const uint SDF_FLAG_TYPE = 0xFFu;\n const uint SDF_FLAG_INVERT = 1u << 8u;\n\n const uint SDF_TYPE_ALL = 0u;\n const uint SDF_TYPE_PLANE = 1u;\n const uint SDF_TYPE_SPHERE = 2u;\n const uint SDF_TYPE_BOX = 3u;\n const uint SDF_TYPE_ELLIPSOID = 4u;\n const uint SDF_TYPE_CYLINDER = 5u;\n const uint SDF_TYPE_CAPSULE = 6u;\n const uint SDF_TYPE_INFINITE_CONE = 7u;\n\n float evaluateSdfArray(\n usampler2D sdfTexture, int numSdfs, int sdfFirst, int sdfCount, vec3 pos,\n float smoothK, int numValues, out vec4 outValues[4]\n ) {\n float distanceAccum = (smoothK == 0.0) ? 1.0 / 0.0 : 0.0;\n float maxExp = -1.0 / 0.0;\n for (int i = 0; i < numValues; ++i) {\n outValues[i] = vec4(0.0);\n }\n\n uint flags;\n vec3 center, scale;\n vec4 quaternion, sizes;\n vec4 values[4];\n\n int sdfLast = min(sdfFirst + sdfCount, numSdfs);\n for (int index = sdfFirst; index < sdfLast; ++index) {\n unpackSdfArray(sdfTexture, index, flags, center, quaternion, scale, sizes, numValues, values);\n uint sdfType = flags & SDF_FLAG_TYPE;\n vec3 sdfPos = quatVec(quaternion, pos * scale) + center;\n\n float distance;\n switch (sdfType) {\n case SDF_TYPE_ALL:\n distance = -1.0 / 0.0;\n break;\n case SDF_TYPE_PLANE: {\n distance = sdfPos.z;\n break;\n }\n case SDF_TYPE_SPHERE: {\n distance = length(sdfPos) - sizes.w;\n break;\n }\n case SDF_TYPE_BOX: {\n vec3 q = abs(sdfPos) - sizes.xyz + sizes.w;\n distance = length(max(q, 0.0)) + min(max(q.x, max(q.y, q.z)), 0.0) - sizes.w;\n break;\n }\n case SDF_TYPE_ELLIPSOID: {\n vec3 sizes = sizes.xyz;\n float k0 = length(sdfPos / sizes);\n float k1 = length(sdfPos / dot(sizes, sizes));\n distance = k0 * (k0 - 1.0) / k1;\n break;\n }\n case SDF_TYPE_CYLINDER: {\n vec2 d = abs(vec2(length(sdfPos.xz), sdfPos.y)) - sizes.wy;\n distance = min(max(d.x, d.y), 0.0) + length(max(d, 0.0));\n break;\n }\n case SDF_TYPE_CAPSULE: {\n sdfPos.y -= clamp(sdfPos.y, -0.5 * sizes.y, 0.5 * sizes.y);\n distance = length(sdfPos) - sizes.w;\n break;\n }\n case SDF_TYPE_INFINITE_CONE: {\n float angle = 0.25 * PI * sizes.w;\n vec2 c = vec2(sin(angle), cos(angle));\n vec2 q = vec2(length(sdfPos.xy), -sdfPos.z);\n float d = length(q - c * max(dot(q, c), 0.0));\n distance = d * (((q.x * c.y - q.y * c.x) < 0.0) ? -1.0 : 1.0);\n break;\n }\n }\n\n if ((flags & SDF_FLAG_INVERT) != 0u) {\n distance = -distance;\n }\n\n if (smoothK == 0.0) {\n if (distance < distanceAccum) {\n distanceAccum = distance;\n for (int i = 0; i < numValues; ++i) {\n outValues[i] = values[i];\n }\n }\n } else {\n float scaledDistance = -distance / smoothK;\n if (scaledDistance > maxExp) {\n float scale = exp(maxExp - scaledDistance);\n distanceAccum *= scale;\n for (int i = 0; i < numValues; ++i) {\n outValues[i] *= scale;\n }\n maxExp = scaledDistance;\n }\n\n float weight = exp(scaledDistance - maxExp);\n distanceAccum += weight;\n for (int i = 0; i < numValues; ++i) {\n outValues[i] += weight * values[i];\n }\n }\n }\n\n if (smoothK == 0.0) {\n return distanceAccum;\n } else {\n // Very distant SDFs may result in 0 accumulation\n if (distanceAccum == 0.0) {\n return 1.0 / 0.0;\n }\n for (int i = 0; i < numValues; ++i) {\n outValues[i] /= distanceAccum;\n }\n return (-log(distanceAccum) - maxExp) * smoothK;\n }\n }\n\n float modulateSdfArray(\n usampler2D sdfTexture, int numSdfs, int sdfFirst, int sdfCount, vec3 pos,\n float smoothK, int numValues, out vec4 values[4],\n float softEdge, bool invert\n ) {\n float distance = evaluateSdfArray(sdfTexture, numSdfs, sdfFirst, sdfCount, pos, smoothK, numValues, values);\n if (invert) {\n distance = -distance;\n }\n\n return (softEdge == 0.0) ? ((distance < 0.0) ? 1.0 : 0.0)\n : clamp(-distance / softEdge + 0.5, 0.0, 1.0);\n }\n`),Cn=KA(`\n const uint EDIT_FLAG_BLEND = 0xFFu;\n const uint EDIT_BLEND_MULTIPLY = 0u;\n const uint EDIT_BLEND_SET_RGB = 1u;\n const uint EDIT_BLEND_ADD_RGBA = 2u;\n const uint EDIT_FLAG_INVERT = 0x100u;\n\n void decodeEdit(\n uvec4 packedEdit, out int sdfFirst, out int sdfCount,\n out bool invert, out uint rgbaBlendMode, out float softEdge, out float sdfSmooth\n ) {\n rgbaBlendMode = packedEdit.x & EDIT_FLAG_BLEND;\n invert = (packedEdit.x & EDIT_FLAG_INVERT) != 0u;\n\n sdfFirst = int(packedEdit.y & 0xFFFFu);\n sdfCount = int(packedEdit.y >> 16u);\n\n softEdge = uintBitsToFloat(packedEdit.z);\n sdfSmooth = uintBitsToFloat(packedEdit.w);\n }\n\n void applyRgbaDisplaceEdit(\n usampler2D sdfTexture, int numSdfs, int sdfFirst, int sdfCount, inout vec3 pos,\n float smoothK, float softEdge, bool invert, uint rgbaBlendMode, inout vec4 rgba\n ) {\n vec4 values[4];\n float modulate = modulateSdfArray(sdfTexture, numSdfs, sdfFirst, sdfCount, pos, smoothK, 2, values, softEdge, invert);\n // On Android, moving values[0] is necessary to work around a compiler bug.\n vec4 sdfRgba = values[0];\n vec4 sdfDisplaceScale = values[1];\n\n vec4 target;\n switch (rgbaBlendMode) {\n case EDIT_BLEND_MULTIPLY:\n target = rgba * sdfRgba;\n break;\n case EDIT_BLEND_SET_RGB:\n target = vec4(sdfRgba.rgb, rgba.a * sdfRgba.a);\n break;\n case EDIT_BLEND_ADD_RGBA:\n target = rgba + sdfRgba;\n break;\n default:\n // Debug output if blend mode not set\n target = vec4(fract(pos), 1.0);\n }\n rgba = mix(rgba, target, modulate);\n pos += sdfDisplaceScale.xyz * modulate;\n }\n\n void applyPackedRgbaDisplaceEdit(uvec4 packedEdit, usampler2D sdfTexture, int numSdfs, inout vec3 pos, inout vec4 rgba) {\n int sdfFirst, sdfCount;\n bool invert;\n uint rgbaBlendMode;\n float softEdge, sdfSmooth;\n decodeEdit(packedEdit, sdfFirst, sdfCount, invert, rgbaBlendMode, softEdge, sdfSmooth);\n applyRgbaDisplaceEdit(sdfTexture, numSdfs, sdfFirst, sdfCount, pos, sdfSmooth, softEdge, invert, rgbaBlendMode, rgba);\n }\n`);function Ha(g,A,t,e){return new lA({inTypes:{gsplat:pA,sdfArray:hn,numEdits:"int",rgbaDisplaceEdits:"uvec4"},outTypes:{gsplat:pA},globals:()=>[En,Cn],inputs:{gsplat:g,sdfArray:A,numEdits:t,rgbaDisplaceEdits:e},statements:({inputs:s,outputs:n})=>{const{sdfArray:r,numEdits:a,rgbaDisplaceEdits:o}=s,{gsplat:B}=n;return At(`\n ${B} = ${s.gsplat};\n if (isGsplatActive(${B}.flags)) {\n for (int editIndex = 0; editIndex < ${a}; ++editIndex) {\n applyPackedRgbaDisplaceEdit(\n ${o}[editIndex], ${r}.sdfTexture, ${r}.numSdfs,\n ${B}.center, ${B}.rgba\n );\n }\n }\n `)}}).outputs.gsplat}const Wt=new Float32Array(1);class ti{constructor(){this.scale=new $e({value:Number.NEGATIVE_INFINITY}),this.rotate=new sn({value:new gA(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY)}),this.translate=new Ea({value:new u(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY)})}apply(A){return Sa(A,{scale:this.scale,rotate:this.rotate,translate:this.translate})}applyDir(A){return Fa(A,{rotate:this.rotate})}applyGsplat(A){return na(A,{scale:this.scale,rotate:this.rotate,translate:this.translate})}updateFromMatrix(A){const t=new u,e=new gA,i=new u;A.decompose(i,e,t);const s=(t.x+t.y+t.z)/3;let n=!1;return s!==this.scale.value&&(this.scale.value=s,n=!0),i.equals(this.translate.value)||(this.translate.value.copy(i),n=!0),e.equals(this.rotate.value)||(this.rotate.value.copy(e),n=!0),n}update(A){return A.updateMatrixWorld(),this.updateFromMatrix(A.matrixWorld)}}class Ta extends wA{constructor({numSplats:A,generator:t,construct:e,update:i}){if(super(),this.numSplats=A??0,this.generator=t,this.frameUpdate=i,this.version=0,e){const s=e(this);Object.assign(this,s)}}updateVersion(){this.version+=1}set needsUpdate(A){A&&this.updateVersion()}}const Ct=class Ct extends Ta{constructor(A={}){const t=new ti,e=new ti,i=new ti,s=new ti,n=new sn({value:new uA(Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY)}),r=new $e({value:0}),a=new $e({value:0}),o={transform:t,viewToWorld:e,worldToView:i,viewToObject:s,recolor:n,time:r,deltaTime:a};if(super({update:({time:B,deltaTime:I,viewToWorld:Q,globalEdits:h})=>this.update({time:B,deltaTime:I,viewToWorld:Q,globalEdits:h})}),this.isInitialized=!1,this.recolor=new yt(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 Ie,this.numSplats=this.packedSplats.numSplats,this.editable=A.editable??!0,this.onFrame=A.onFrame,this.context=o,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 B=A.onLoad(this);B instanceof Promise&&await B}return this});else if(this.isInitialized=!0,this.initialized=Promise.resolve(this),A.onLoad){const B=A.onLoad(this);B instanceof Promise&&(this.initialized=B.then(()=>this))}}async asyncInitialize(A){const{url:t,fileBytes:e,fileType:i,fileName:s,maxSplats:n,constructSplats:r}=A;if(t||e||r){const a={url:t,fileBytes:e,fileType:i,fileName:s,maxSplats:n,construct:r};this.packedSplats.reinitialize(a)}this.packedSplats&&(await this.packedSplats.initialized,this.numSplats=this.packedSplats.numSplats,this.updateGenerator())}static async staticInitialize(){await ni(),Ct.isStaticInitialized=!0}pushSplat(A,t,e,i,s){this.packedSplats.pushSplat(A,t,e,i,s)}forEachSplat(A){this.packedSplats.forEachSplat(A)}dispose(){this.packedSplats.dispose()}constructGenerator(A){const{transform:t,viewToObject:e,recolor:i}=A,s=qe({index:"int"},{gsplat:pA},({index:n})=>{if(!n)throw new Error("index is undefined");let r=ia(this.packedSplats.dyno,n);if(this.maxSh>=1){const{sh1Texture:o,sh2Texture:B,sh3Texture:I}=this.ensureShTextures();if(o){const Q=e.translate,{center:h}=je(r).outputs,E=pa(ua(h,Q));let C=_a(r,o,E);this.maxSh>=2&&B&&(C=Ai(C,qa(r,B,E))),this.maxSh>=3&&I&&(C=Ai(C,Za(r,I,E)));let{rgba:c}=je(r).outputs;c=Ai(c,Da(C,Gr("float",0))),r=vi({gsplat:r,rgba:c})}}if(this.splatRgba){const o=Ga(this.splatRgba.dyno,n);r=vi({gsplat:r,rgba:o})}this.skinning&&(r=this.skinning.modify(r)),this.objectModifier&&(r=this.objectModifier.apply({gsplat:r}).gsplat),r=t.applyGsplat(r);const a=da(i,je(r).outputs.rgba);return r=vi({gsplat:r,rgba:a}),this.rgbaDisplaceEdits&&(r=this.rgbaDisplaceEdits.modify(r)),this.worldModifier&&(r=this.worldModifier.apply({gsplat:r}).gsplat),{gsplat:r}});this.generator=s}updateGenerator(){this.constructGenerator(this.context)}update({time:A,viewToWorld:t,deltaTime:e,globalEdits:i}){var c;this.numSplats=this.packedSplats.numSplats,this.context.time.value=A,this.context.deltaTime.value=e,Ct.dynoTime.value=A;const{transform:s,viewToObject:n,recolor:r}=this.context;let a=s.update(this);this.context.viewToWorld.updateFromMatrix(t)&&this.enableViewToWorld&&(a=!0);const o=t.clone().invert();this.context.worldToView.updateFromMatrix(o)&&this.enableWorldToView&&(a=!0);const Q=new CA().compose(s.translate.value,s.rotate.value,new u().setScalar(s.scale.value)).invert().multiply(t);n.updateFromMatrix(Q)&&(this.enableViewToObject||this.packedSplats.extra.sh1)&&(a=!0);const h=new uA(this.recolor.r,this.recolor.g,this.recolor.b,this.opacity);h.equals(r.value)||(r.value.copy(h),a=!0);const E=this.editable?(this.edits??[]).concat(i):[];this.editable&&!this.edits&&this.traverseVisible(l=>{l instanceof Wi&&E.push(l)}),E.sort((l,y)=>l.ordering-y.ordering);const C=E.map(l=>{if(l.sdfs!=null)return{edit:l,sdfs:l.sdfs};const y=[];return l.traverseVisible(d=>{d instanceof Ya&&y.push(d)}),{edit:l,sdfs:y}});if(C.length>0&&!this.rgbaDisplaceEdits){const l=C.length,y=C.reduce((d,f)=>d+f.sdfs.length,0);this.rgbaDisplaceEdits=new Ja({maxEdits:l,maxSdfs:y}),this.updateGenerator()}if(this.rgbaDisplaceEdits){const l=this.rgbaDisplaceEdits.update(C);a||(a=l.updated),l.dynoUpdated&&this.updateGenerator()}a&&this.updateVersion(),(c=this.onFrame)==null||c.call(this,{mesh:this,time:A,deltaTime:e})}raycast(A,t){if(!this.packedSplats.packedArray||!this.packedSplats.numSplats)return;const{near:e,far:i,ray:s}=A,n=this.matrixWorld.clone().invert(),r=new qA().setFromMatrix4(n),a=s.origin.clone().applyMatrix4(n),o=s.direction.clone().applyMatrix3(r),B=new u;n.decompose(new u,new gA,B),(B.x*B.y*B.z)**(1/3);const Q=Nn(a.x,a.y,a.z,o.x,o.y,o.z,e,i,this.packedSplats.numSplats,this.packedSplats.packedArray,!0);for(const h of Q){const E=s.direction.clone().multiplyScalar(h).add(s.origin);t.push({distance:h,point:E,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:n,depth:r,maxSplats:a}=FA(i.length/2);if(i.length<a*2){const B=new Uint32Array(a*2);B.set(i),this.packedSplats.extra.sh1=B,i=B}const o=new rt(i,s,n,r);o.format=Xn,o.type=ct,o.internalFormat="RG32UI",o.needsUpdate=!0,A=new qi({value:o,key:"sh1"}),this.packedSplats.extra.sh1Texture=A}if(!this.packedSplats.extra.sh2)return{sh1Texture:A};let t=this.packedSplats.extra.sh2Texture;if(!t){let i=this.packedSplats.extra.sh2;const{width:s,height:n,depth:r,maxSplats:a}=FA(i.length/4);if(i.length<a*4){const B=new Uint32Array(a*4);B.set(i),this.packedSplats.extra.sh2=B,i=B}const o=new rt(i,s,n,r);o.format=mt,o.type=ct,o.internalFormat="RGBA32UI",o.needsUpdate=!0,t=new qi({value:o,key:"sh2"}),this.packedSplats.extra.sh2Texture=t}if(!this.packedSplats.extra.sh3)return{sh1Texture:A,sh2Texture:t};let e=this.packedSplats.extra.sh3Texture;if(!e){let i=this.packedSplats.extra.sh3;const{width:s,height:n,depth:r,maxSplats:a}=FA(i.length/4);if(i.length<a*4){const B=new Uint32Array(a*4);B.set(i),this.packedSplats.extra.sh3=B,i=B}const o=new rt(i,s,n,r);o.format=mt,o.type=ct,o.internalFormat="RGBA32UI",o.needsUpdate=!0,e=new qi({value:o,key:"sh3"}),this.packedSplats.extra.sh3Texture=e}return{sh1Texture:A,sh2Texture:t,sh3Texture:e}}};Ct.staticInitialized=Ct.staticInitialize(),Ct.isStaticInitialized=!1,Ct.dynoTime=new $e({value:0});let cn=Ct;const za=KA(`\n vec3 evaluateSH1(Gsplat gsplat, usampler2DArray sh1, vec3 viewDir) {\n // Extract sint7 values packed into 2 x uint32\n uvec2 packed = texelFetch(sh1, splatTexCoord(gsplat.index), 0).rg;\n vec3 sh1_0 = vec3(ivec3(\n int(packed.x << 25u) >> 25,\n int(packed.x << 18u) >> 25,\n int(packed.x << 11u) >> 25\n )) / 63.0;\n vec3 sh1_1 = vec3(ivec3(\n int(packed.x << 4u) >> 25,\n int((packed.x >> 3u) | (packed.y << 29u)) >> 25,\n int(packed.y << 22u) >> 25\n )) / 63.0;\n vec3 sh1_2 = vec3(ivec3(\n int(packed.y << 15u) >> 25,\n int(packed.y << 8u) >> 25,\n int(packed.y << 1u) >> 25\n )) / 63.0;\n\n return sh1_0 * (-0.4886025 * viewDir.y)\n + sh1_1 * (0.4886025 * viewDir.z)\n + sh1_2 * (-0.4886025 * viewDir.x);\n }\n`),va=KA(`\n vec3 evaluateSH2(Gsplat gsplat, usampler2DArray sh2, vec3 viewDir) {\n // Extract sint8 values packed into 4 x uint32\n uvec4 packed = texelFetch(sh2, splatTexCoord(gsplat.index), 0);\n vec3 sh2_0 = vec3(ivec3(\n int(packed.x << 24u) >> 24,\n int(packed.x << 16u) >> 24,\n int(packed.x << 8u) >> 24\n )) / 127.0;\n vec3 sh2_1 = vec3(ivec3(\n int(packed.x) >> 24,\n int(packed.y << 24u) >> 24,\n int(packed.y << 16u) >> 24\n )) / 127.0;\n vec3 sh2_2 = vec3(ivec3(\n int(packed.y << 8u) >> 24,\n int(packed.y) >> 24,\n int(packed.z << 24u) >> 24\n )) / 127.0;\n vec3 sh2_3 = vec3(ivec3(\n int(packed.z << 16u) >> 24,\n int(packed.z << 8u) >> 24,\n int(packed.z) >> 24\n )) / 127.0;\n vec3 sh2_4 = vec3(ivec3(\n int(packed.w << 24u) >> 24,\n int(packed.w << 16u) >> 24,\n int(packed.w << 8u) >> 24\n )) / 127.0;\n\n return sh2_0 * (1.0925484 * viewDir.x * viewDir.y)\n + sh2_1 * (1.0925484 * viewDir.y * viewDir.z)\n + sh2_2 * (0.3153915 * (2.0 * viewDir.z * viewDir.z - viewDir.x * viewDir.x - viewDir.y * viewDir.y))\n + sh2_3 * (1.0925484 * viewDir.x * viewDir.z)\n + sh2_4 * (0.5462742 * (viewDir.x * viewDir.x - viewDir.y * viewDir.y));\n }\n`),Ka=KA(`\n vec3 evaluateSH3(Gsplat gsplat, usampler2DArray sh3, vec3 viewDir) {\n // Extract sint6 values packed into 4 x uint32\n uvec4 packed = texelFetch(sh3, splatTexCoord(gsplat.index), 0);\n vec3 sh3_0 = vec3(ivec3(\n int(packed.x << 26u) >> 26,\n int(packed.x << 20u) >> 26,\n int(packed.x << 14u) >> 26\n )) / 31.0;\n vec3 sh3_1 = vec3(ivec3(\n int(packed.x << 8u) >> 26,\n int(packed.x << 2u) >> 26,\n int((packed.x >> 4u) | (packed.y << 28u)) >> 26\n )) / 31.0;\n vec3 sh3_2 = vec3(ivec3(\n int(packed.y << 22u) >> 26,\n int(packed.y << 16u) >> 26,\n int(packed.y << 10u) >> 26\n )) / 31.0;\n vec3 sh3_3 = vec3(ivec3(\n int(packed.y << 4u) >> 26,\n int((packed.y >> 2u) | (packed.z << 30u)) >> 26,\n int(packed.z << 24u) >> 26\n )) / 31.0;\n vec3 sh3_4 = vec3(ivec3(\n int(packed.z << 18u) >> 26,\n int(packed.z << 12u) >> 26,\n int(packed.z << 6u) >> 26\n )) / 31.0;\n vec3 sh3_5 = vec3(ivec3(\n int(packed.z) >> 26,\n int(packed.w << 26u) >> 26,\n int(packed.w << 20u) >> 26\n )) / 31.0;\n vec3 sh3_6 = vec3(ivec3(\n int(packed.w << 14u) >> 26,\n int(packed.w << 8u) >> 26,\n int(packed.w << 2u) >> 26\n )) / 31.0;\n\n float xx = viewDir.x * viewDir.x;\n float yy = viewDir.y * viewDir.y;\n float zz = viewDir.z * viewDir.z;\n float xy = viewDir.x * viewDir.y;\n float yz = viewDir.y * viewDir.z;\n float zx = viewDir.z * viewDir.x;\n\n return sh3_0 * (-0.5900436 * viewDir.y * (3.0 * xx - yy))\n + sh3_1 * (2.8906114 * xy * viewDir.z) +\n + sh3_2 * (-0.4570458 * viewDir.y * (4.0 * zz - xx - yy))\n + sh3_3 * (0.3731763 * viewDir.z * (2.0 * zz - 3.0 * xx - 3.0 * yy))\n + sh3_4 * (-0.4570458 * viewDir.x * (4.0 * zz - xx - yy))\n + sh3_5 * (1.4453057 * viewDir.z * (xx - yy))\n + sh3_6 * (-0.5900436 * viewDir.x * (xx - 3.0 * yy));\n }\n`);function _a(g,A,t){return bi({inTypes:{gsplat:pA,sh1:"usampler2DArray",viewDir:"vec3"},outTypes:{rgb:"vec3"},inputs:{gsplat:g,sh1:A,viewDir:t},globals:()=>[tt,za],statements:({inputs:e,outputs:i})=>At(`\n if (isGsplatActive(${e.gsplat}.flags)) {\n ${i.rgb} = evaluateSH1(${e.gsplat}, ${e.sh1}, ${e.viewDir});\n } else {\n ${i.rgb} = vec3(0.0);\n }\n `)}).outputs.rgb}function qa(g,A,t){return bi({inTypes:{gsplat:pA,sh2:"usampler2DArray",viewDir:"vec3"},outTypes:{rgb:"vec3"},inputs:{gsplat:g,sh2:A,viewDir:t},globals:()=>[tt,va],statements:({inputs:e,outputs:i})=>At(`\n if (isGsplatActive(${e.gsplat}.flags)) {\n ${i.rgb} = evaluateSH2(${e.gsplat}, ${e.sh2}, ${e.viewDir});\n } else {\n ${i.rgb} = vec3(0.0);\n }\n `)}).outputs.rgb}function Za(g,A,t){return bi({inTypes:{gsplat:pA,sh3:"usampler2DArray",viewDir:"vec3"},outTypes:{rgb:"vec3"},inputs:{gsplat:g,sh3:A,viewDir:t},globals:()=>[tt,Ka],statements:({inputs:e,outputs:i})=>At(`\n if (isGsplatActive(${e.gsplat}.flags)) {\n ${i.rgb} = evaluateSH3(${e.gsplat}, ${e.sh3}, ${e.viewDir});\n } else {\n ${i.rgb} = vec3(0.0);\n }\n `)}).outputs.rgb}function Wa(g){return new Worker(self.location.href,{name:g==null?void 0:g.name})}class Pa{constructor(){this.messages={},this.messageIdNext=0,this.worker=new Wa,this.worker.onmessage=A=>this.onMessage(A)}makeMessageId(){return++this.messageIdNext}makeMessagePromiseId(){const A=this.makeMessageId(),t=new Promise((e,i)=>{this.messages[A]={resolve:e,reject:i}});return{id:A,promise:t}}onMessage(A){const{id:t,result:e,error:i}=A.data,s=this.messages[t];s&&(delete this.messages[t],i?s.reject(i):s.resolve(e))}async call(A,t){const{id:e,promise:i}=this.makeMessagePromiseId();return this.worker.postMessage({name:A,args:t,id:e},{transfer:Os(t)}),i}}let ln=4,ei=0;const un=[],dn=[];async function Oa(){const g=un.shift();if(g)return g;if(ei<ln){const A=new Pa;return ei+=1,A}return new Promise(A=>{dn.push(A)})}function Va(g){if(ei>ln){ei-=1;return}const A=dn.shift();if(A){A(g);return}un.push(g)}async function ii(g){const A=await Oa();try{return await g(A)}finally{Va(A)}}var Be=(g=>(g.PLY="ply",g.SPZ="spz",g.SPLAT="splat",g.KSPLAT="ksplat",g))(Be||{});function yn(g){const A=new DataView(g.buffer);if((A.getUint32(0,!0)&16777215)===7957616)return"ply";if((A.getUint32(0,!0)&16777215)===559903){const t=Vr(g,4);return new DataView(t.buffer).getUint32(0,!0)===1347635022?"spz":void 0}}function Xa(g){const A=g.split(/[?#]/,1)[0],t=Math.max(A.lastIndexOf("/"),A.lastIndexOf("\\\\")),e=A.slice(t+1),i=e.lastIndexOf(".");return i<=0||i===e.length-1?"":e.slice(i+1).toLowerCase()}function fn(g){const A=Xa(g);if(A==="ply")return"ply";if(A==="spz")return"spz";if(A==="splat")return"splat";if(A==="ksplat")return"ksplat"}async function ja({input:g,fileType:A,pathOrUrl:t}){const e=g instanceof ArrayBuffer?new Uint8Array(g):g;let i=A;switch(A||(i=yn(e),!i&&t&&(i=fn(t))),i){case"ply":{const s=new oe({fileBytes:e});await s.parseHeader();const n=s.numSplats,r=FA(n).maxSplats,a={fileBytes:e,packedArray:new Uint32Array(r*4)};return await ii(async o=>{const{packedArray:B,numSplats:I,extra:Q}=await o.call("unpackPly",a);return{packedArray:B,numSplats:I,extra:Q}})}case"spz":return await ii(async s=>{const{packedArray:n,numSplats:r,extra:a}=await s.call("decodeSpz",{fileBytes:e});return{packedArray:n,numSplats:r,extra:a}});case"splat":return await ii(async s=>{const{packedArray:n,numSplats:r}=await s.call("decodeAntiSplat",{fileBytes:e});return{packedArray:n,numSplats:r}});case"ksplat":return await ii(async s=>{const{packedArray:n,numSplats:r,extra:a}=await s.call("decodeKsplat",{fileBytes:e});return{packedArray:n,numSplats:r,extra:a}});default:throw new Error(`Unknown splat file type: ${i}`)}}class $a{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 t=Math.max(A,this.maxSplats*2),e=new Float32Array(t*3),i=new Float32Array(t*3),s=new Float32Array(t*4),n=new Float32Array(t),r=new Float32Array(t*3);if(e.set(this.centers),i.set(this.scales),s.set(this.quaternions),n.set(this.opacities),r.set(this.colors),this.centers=e,this.scales=i,this.quaternions=s,this.opacities=n,this.colors=r,this.sh1){const a=new Float32Array(t*9);a.set(this.sh1),this.sh1=a}if(this.sh2){const a=new Float32Array(t*15);a.set(this.sh2),this.sh2=a}if(this.sh3){const a=new Float32Array(t*21);a.set(this.sh3),this.sh3=a}this.maxSplats=t}}ensureIndex(A){this.ensureCapacity(A+1)}setCenter(A,t,e,i){this.centers[A*3]=t,this.centers[A*3+1]=e,this.centers[A*3+2]=i}setScale(A,t,e,i){this.scales[A*3]=t,this.scales[A*3+1]=e,this.scales[A*3+2]=i}setQuaternion(A,t,e,i,s){this.quaternions[A*4]=t,this.quaternions[A*4+1]=e,this.quaternions[A*4+2]=i,this.quaternions[A*4+3]=s}setOpacity(A,t){this.opacities[A]=t}setColor(A,t,e,i){this.colors[A*3]=t,this.colors[A*3+1]=e,this.colors[A*3+2]=i}setSh1(A,t){this.sh1||(this.sh1=new Float32Array(this.maxSplats*9));for(let e=0;e<9;++e)this.sh1[A*9+e]=t[e]}setSh2(A,t){this.sh2||(this.sh2=new Float32Array(this.maxSplats*15));for(let e=0;e<15;++e)this.sh2[A*15+e]=t[e]}setSh3(A,t){this.sh3||(this.sh3=new Float32Array(this.maxSplats*21));for(let e=0;e<21;++e)this.sh3[A*21+e]=t[e]}}class wn{constructor({fileBytes:A}){this.fileBytes=A instanceof ArrayBuffer?new Uint8Array(A):A,this.reader=new Xr({fileBytes:this.fileBytes});const t=new DataView(this.reader.read(16).buffer);if(t.getUint32(0,!0)!==1347635022)throw new Error("Invalid SPZ file");if(this.version=t.getUint32(4,!0),this.version<1||this.version>2)throw new Error(`Unsupported SPZ version: ${this.version}`);this.numSplats=t.getUint32(8,!0),this.shDegree=t.getUint8(12),this.fractionalBits=t.getUint8(13),this.flags=t.getUint8(14),this.flagAntiAlias=(this.flags&1)!==0,this.reserved=t.getUint8(15),this.parsed=!1}parseSplats(A,t,e,i,s,n){if(this.parsed)throw new Error("SPZ file already parsed");if(this.parsed=!0,this.version===1){const r=this.reader.read(this.numSplats*3*2),a=new Uint16Array(r.buffer);for(let o=0;o<this.numSplats;o++){const B=o*3,I=tA(a[B]),Q=tA(a[B+1]),h=tA(a[B+2]);A==null||A(o,I,Q,h)}}else if(this.version===2){const r=1<<this.fractionalBits,a=this.reader.read(this.numSplats*3*3);for(let o=0;o<this.numSplats;o++){const B=o*9,I=((a[B+2]<<24|a[B+1]<<16|a[B]<<8)>>8)/r,Q=((a[B+5]<<24|a[B+4]<<16|a[B+3]<<8)>>8)/r,h=((a[B+8]<<24|a[B+7]<<16|a[B+6]<<8)>>8)/r;A==null||A(o,I,Q,h)}}else throw new Error("Unreachable");{const r=this.reader.read(this.numSplats);for(let a=0;a<this.numSplats;a++)t==null||t(a,r[a]/255)}{const r=this.reader.read(this.numSplats*3),a=Dn/.15;for(let o=0;o<this.numSplats;o++){const B=o*3,I=(r[B]/255-.5)*a+.5,Q=(r[B+1]/255-.5)*a+.5,h=(r[B+2]/255-.5)*a+.5;e==null||e(o,I,Q,h)}}{const r=this.reader.read(this.numSplats*3);for(let a=0;a<this.numSplats;a++){const o=a*3,B=Math.exp(r[o]/16-10),I=Math.exp(r[o+1]/16-10),Q=Math.exp(r[o+2]/16-10);i==null||i(a,B,I,Q)}}{const r=this.reader.read(this.numSplats*3);for(let a=0;a<this.numSplats;a++){const o=a*3,B=r[o]/127.5-1,I=r[o+1]/127.5-1,Q=r[o+2]/127.5-1,h=Math.sqrt(Math.max(0,1-B*B-I*I-Q*Q));s==null||s(a,B,I,Q,h)}}if(n&&this.shDegree>=1){const r=new Float32Array(9),a=this.shDegree>=2?new Float32Array(5*3):void 0,o=this.shDegree>=3?new Float32Array(7*3):void 0,B=this.reader.read(this.numSplats*pn[this.shDegree]*3);let I=0;for(let Q=0;Q<this.numSplats;Q++){for(let h=0;h<9;++h)r[h]=(B[I+h]-128)/128;if(I+=9,a){for(let h=0;h<15;++h)a[h]=(B[I+h]-128)/128;I+=15}if(o){for(let h=0;h<21;++h)o[h]=(B[I+h]-128)/128;I+=21}n==null||n(Q,r,a,o)}}}}const pn={1:3,2:8,3:15},Dn=.28209479177387814,Ag=1347635022,tg=2,eg=1;class Et{constructor({numSplats:A,shDegree:t,fractionalBits:e=12,flagAntiAlias:i=!0}){this.clippedCount=0;const s=19+(t>=1?9:0)+(t>=2?15:0)+(t>=3?21:0),n=16+A*s;this.buffer=new ArrayBuffer(n),this.view=new DataView(this.buffer),this.view.setUint32(0,Ag,!0),this.view.setUint32(4,tg,!0),this.view.setUint32(8,A,!0),this.view.setUint8(12,t),this.view.setUint8(13,e),this.view.setUint8(14,i?eg:0),this.view.setUint8(15,0),this.numSplats=A,this.shDegree=t,this.fractionalBits=e,this.fraction=1<<e,this.flagAntiAlias=i}setCenter(A,t,e,i){const s=Math.round(t*this.fraction),n=Math.max(-8388607,Math.min(8388607,s)),r=Math.round(e*this.fraction),a=Math.max(-8388607,Math.min(8388607,r)),o=Math.round(i*this.fraction),B=Math.max(-8388607,Math.min(8388607,o));(s!==n||r!==a||o!==B)&&(this.clippedCount+=1);const h=16+A*9;this.view.setUint8(h,n&255),this.view.setUint8(h+1,n>>8&255),this.view.setUint8(h+2,n>>16&255),this.view.setUint8(h+3,a&255),this.view.setUint8(h+4,a>>8&255),this.view.setUint8(h+5,a>>16&255),this.view.setUint8(h+6,B&255),this.view.setUint8(h+7,B>>8&255),this.view.setUint8(h+8,B>>16&255)}setAlpha(A,t){const e=16+this.numSplats*9+A;this.view.setUint8(e,Math.max(0,Math.min(255,Math.round(t*255))))}static scaleRgb(A){const t=((A-.5)/(Dn/.15)+.5)*255;return Math.max(0,Math.min(255,Math.round(t)))}setRgb(A,t,e,i){const s=16+this.numSplats*10+A*3;this.view.setUint8(s,Et.scaleRgb(t)),this.view.setUint8(s+1,Et.scaleRgb(e)),this.view.setUint8(s+2,Et.scaleRgb(i))}setScale(A,t,e,i){const s=16+this.numSplats*13+A*3;this.view.setUint8(s,Math.max(0,Math.min(255,Math.round((Math.log(t)+10)*16)))),this.view.setUint8(s+1,Math.max(0,Math.min(255,Math.round((Math.log(e)+10)*16)))),this.view.setUint8(s+2,Math.max(0,Math.min(255,Math.round((Math.log(i)+10)*16))))}setQuat(A,t,e,i,s){const n=16+this.numSplats*16+A*3,r=s<0;this.view.setUint8(n,Math.max(0,Math.min(255,Math.round(((r?-t:t)+1)*127.5)))),this.view.setUint8(n+1,Math.max(0,Math.min(255,Math.round(((r?-e:e)+1)*127.5)))),this.view.setUint8(n+2,Math.max(0,Math.min(255,Math.round(((r?-i:i)+1)*127.5))))}static quantizeSh(A,t){const e=Math.round(A*128)+128,i=1<<8-t,s=Math.floor((e+i/2)/i)*i;return Math.max(0,Math.min(255,s))}setSh(A,t,e,i){const s=pn[this.shDegree]||0,n=16+this.numSplats*19+A*s*3;for(let r=0;r<9;++r)this.view.setUint8(n+r,Et.quantizeSh(t[r],5));if(e){const r=n+9;for(let a=0;a<15;++a)this.view.setUint8(r+a,Et.quantizeSh(e[a],4));if(i){const a=r+15;for(let o=0;o<21;++o)this.view.setUint8(a+o,Et.quantizeSh(i[o],4))}}}async finalize(){const A=new Uint8Array(this.buffer),e=new ReadableStream({async start(n){n.enqueue(A),n.close()}}).pipeThrough(new CompressionStream("gzip")),s=await new Response(e).arrayBuffer();return console.log("Compressed",A.length,"bytes to",s.byteLength,"bytes"),new Uint8Array(s)}}async function ig(g){var B,I,Q;const A=new $a,{inputs:t,clipXyz:e,maxSh:i,fractionalBits:s=12,opacityThreshold:n}=g;for(const h of t){let E=function(w){return w.multiplyScalar(d),w.applyQuaternion(f),w.add(p),w},C=function(w){return w.multiplyScalar(d),w},c=function(w){return w.premultiply(f),w},l=function(w){return!m||m.containsPoint(w)},y=function(w){return n!==void 0?w>=n:!0};const d=((B=h.transform)==null?void 0:B.scale)??1,f=new gA().fromArray(((I=h.transform)==null?void 0:I.quaternion)??[0,0,0,1]),p=new u().fromArray(((Q=h.transform)==null?void 0:Q.translate)??[0,0,0]),m=e?new Ft(new u().fromArray(e.min),new u().fromArray(e.max)):void 0;let x=h.fileType;switch(x||(x=yn(h.fileBytes),!x&&h.pathOrUrl&&(x=fn(h.pathOrUrl))),x){case Be.PLY:{const w=new oe({fileBytes:h.fileBytes});await w.parseHeader();let D=null;w.parseSplats((N,M,S,F,k,U,R,G,v,T,$,V,X,K,Z)=>{const W=E(new u(M,S,F));if(l(W)&&y(V)){D=A.pushSplat(),A.setCenter(D,W.x,W.y,W.z);const q=C(new u(k,U,R));A.setScale(D,q.x,q.y,q.z);const b=c(new gA(G,v,T,$));A.setQuaternion(D,b.x,b.y,b.z,b.w),A.setOpacity(D,V),A.setColor(D,X,K,Z)}else D=null},(N,M,S,F)=>{M&&D!==null&&A.setSh1(D,M),S&&D!==null&&A.setSh2(D,S),F&&D!==null&&A.setSh3(D,F)});break}case Be.SPZ:{const w=new wn({fileBytes:h.fileBytes}),D=new Int32Array(w.numSplats);D.fill(-1);const N=new Float32Array(w.numSplats*3),M=new u;w.parseSplats((S,F,k,U)=>{const R=E(new u(F,k,U));N[S*3]=R.x,N[S*3+1]=R.y,N[S*3+2]=R.z},(S,F)=>{M.fromArray(N,S*3),l(M)&&y(F)&&(D[S]=A.pushSplat(),A.setCenter(D[S],M.x,M.y,M.z),A.setOpacity(D[S],F))},(S,F,k,U)=>{D[S]>=0&&A.setColor(D[S],F,k,U)},(S,F,k,U)=>{if(D[S]>=0){const R=C(new u(F,k,U));A.setScale(D[S],R.x,R.y,R.z)}},(S,F,k,U,R)=>{if(D[S]>=0){const G=c(new gA(F,k,U,R));A.setQuaternion(D[S],G.x,G.y,G.z,G.w)}},(S,F,k,U)=>{D[S]>=0&&(A.setSh1(D[S],F),k&&A.setSh2(D[S],k),U&&A.setSh3(D[S],U))});break}case Be.SPLAT:js(h.fileBytes,w=>{},(w,D,N,M,S,F,k,U,R,G,v,T,$,V,X)=>{const K=E(new u(D,N,M));if(l(K)&&y(T)){const Z=A.pushSplat();A.setCenter(Z,K.x,K.y,K.z);const W=C(new u(S,F,k));A.setScale(Z,W.x,W.y,W.z);const q=c(new gA(U,R,G,v));A.setQuaternion(Z,q.x,q.y,q.z,q.w),A.setOpacity(Z,T),A.setColor(Z,$,V,X)}});break;case Be.KSPLAT:{let w=null;$r(h.fileBytes,D=>{},(D,N,M,S,F,k,U,R,G,v,T,$,V,X,K)=>{const Z=E(new u(N,M,S));if(l(Z)&&y($)){w=A.pushSplat(),A.setCenter(w,Z.x,Z.y,Z.z);const W=C(new u(F,k,U));A.setScale(w,W.x,W.y,W.z);const q=c(new gA(R,G,v,T));A.setQuaternion(w,q.x,q.y,q.z,q.w),A.setOpacity(w,$),A.setColor(w,V,X,K)}else w=null},(D,N,M,S)=>{w!==null&&(A.setSh1(w,N),M&&A.setSh2(w,M),S&&A.setSh3(w,S))});break}default:throw new Error(`transcodeSpz not implemented for ${x}`)}}const r=Math.min(i??3,A.sh3?3:A.sh2?2:A.sh1?1:0),a=new Et({numSplats:A.numSplats,shDegree:r,fractionalBits:s,flagAntiAlias:!0});for(let h=0;h<A.numSplats;++h){const E=h*3,C=h*4;a.setCenter(h,A.centers[E],A.centers[E+1],A.centers[E+2]),a.setScale(h,A.scales[E],A.scales[E+1],A.scales[E+2]),a.setQuat(h,A.quaternions[C],A.quaternions[C+1],A.quaternions[C+2],A.quaternions[C+3]),a.setAlpha(h,A.opacities[h]),a.setRgb(h,A.colors[E],A.colors[E+1],A.colors[E+2]),A.sh1&&r>=1&&a.setSh(h,A.sh1.slice(h*9,(h+1)*9),r>=2&&A.sh2?A.sh2.slice(h*15,(h+1)*15):void 0,r>=3&&A.sh3?A.sh3.slice(h*21,(h+1)*21):void 0)}return{fileBytes:await a.finalize(),clippedCount:a.clippedCount}}async function mn(g){const{name:A,args:t,id:e}=g.data;let i,s;try{switch(A){case"unpackPly":{const{packedArray:n,fileBytes:r}=t,a=await sg({packedArray:n,fileBytes:r});i={id:e,numSplats:a.numSplats,packedArray:a.packedArray,extra:a.extra};break}case"decodeSpz":{const{fileBytes:n}=t,r=ng(n);i={id:e,numSplats:r.numSplats,packedArray:r.packedArray,extra:r.extra};break}case"decodeAntiSplat":{const{fileBytes:n}=t,r=jr(n);i={id:e,numSplats:r.numSplats,packedArray:r.packedArray};break}case"decodeKsplat":{const{fileBytes:n}=t,r=Aa(n);i={id:e,numSplats:r.numSplats,packedArray:r.packedArray,extra:r.extra};break}case"sortSplats":{const{maxSplats:n,totalSplats:r,readback:a,ordering:o}=t;i={id:e,readback:a,...rg({totalSplats:r,readback:a,ordering:o})};break}case"sortDoubleSplats":{const{numSplats:n,readback:r,ordering:a}=t;i={id:e,readback:r,ordering:a},Nr&&(i={id:e,readback:r,ordering:a,activeSplats:Fn(n,r,a)});break}case"transcodeSpz":{const n=t,r=await ig(n);i={id:e,fileBytes:r,input:n};break}default:throw new Error(`Unknown name: ${A}`)}}catch(n){s=n}self.postMessage({id:e,result:i,error:s},{transfer:Os(i)})}async function sg({packedArray:g,fileBytes:A}){const t=new oe({fileBytes:A});await t.parseHeader();const e=t.numSplats,i={},s=Math.exp(-20);return t.parseSplats((n,r,a,o,B,I,Q,h,E,C,c,l,y,d,f)=>{ge(g,n,r,a,o,B<s?0:Math.max(Gi,B),I<s?0:Math.max(Gi,I),Q<s?0:Math.max(Gi,Q),h,E,C,c,l,y,d,f)},(n,r,a,o)=>{r&&(i.sh1||(i.sh1=new Uint32Array(e*2)),Ji(i.sh1,n,r)),a&&(i.sh2||(i.sh2=new Uint32Array(e*4)),Hi(i.sh2,n,a)),o&&(i.sh3||(i.sh3=new Uint32Array(e*4)),Ti(i.sh3,n,o))}),{packedArray:g,numSplats:e,extra:i}}function ng(g){const A=new wn({fileBytes:g}),t=A.numSplats,e=Yi(t),i=new Uint32Array(e*4),s={};return A.parseSplats((n,r,a,o)=>{Jr(i,n,r,a,o)},(n,r)=>{vr(i,n,r)},(n,r,a,o)=>{zr(i,n,r,a,o)},(n,r,a,o)=>{Hr(i,n,r,a,o)},(n,r,a,o,B)=>{Tr(i,n,r,a,o,B)},(n,r,a,o)=>{r&&(s.sh1||(s.sh1=new Uint32Array(t*2)),Ji(s.sh1,n,r)),a&&(s.sh2||(s.sh2=new Uint32Array(t*4)),Hi(s.sh2,n,a)),o&&(s.sh3||(s.sh3=new Uint32Array(t*4)),Ti(s.sh3,n,o))}),{packedArray:i,numSplats:t,extra:s}}const Pt=31744,Qe=Pt+1;let iA=null;function rg({totalSplats:g,readback:A,ordering:t}){iA||(iA=new Uint32Array(Qe)),iA.fill(0);const e=A.map(a=>new Uint32Array(a.buffer)),i=e[0].length,s=Math.ceil(g/i);let n=0;for(let a=0;a<s;++a){const o=e[a],B=Math.min(o.length,g-n);for(let I=0;I<B;++I){const Q=o[I]&32767;Q<Pt&&(iA[Q]+=1)}n+=B}let r=0;for(let a=0;a<Qe;++a){const o=r+iA[a];iA[a]=r,r=o}n=0;for(let a=0;a<s;++a){const o=e[a],B=Math.min(o.length,g-n);for(let I=0;I<B;++I){const Q=o[I]&32767;Q<Pt&&(t[iA[Q]]=n+I,iA[Q]+=1)}n+=B}if(iA[Qe-1]!==r)throw new Error(`Expected ${r} active splats but got ${iA[Qe-1]}`);return{activeSplats:r,ordering:t}}function Cg({numSplats:g,readback:A,ordering:t}){iA||(iA=new Uint32Array(Qe)),iA.fill(0);for(let i=0;i<g;++i){const s=A[i];s<Pt&&(iA[s]+=1)}let e=0;for(let i=Pt-1;i>=0;--i){const s=e+iA[i];iA[i]=e,e=s}for(let i=0;i<g;++i){const s=A[i];s<Pt&&(t[iA[s]]=i,iA[s]+=1)}if(iA[0]!==e)throw new Error(`Expected ${e} active splats but got ${iA[0]}`);return{activeSplats:e,ordering:t}}const Pi=[];function xn(g){Pi.push(g)}async function ag(){self.addEventListener("message",xn),await ni(),self.removeEventListener("message",xn),self.addEventListener("message",mn);for(const g of Pi)mn(g);Pi.length=0}ag().catch(console.error)})();\n', We = typeof self < "u" && self.Blob && new Blob([cr], { type: "text/javascript;charset=utf-8" });
function NQ(t) {
let A;
try {
if (A = We && (self.URL || self.webkitURL).createObjectURL(We), !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(cr),
{
name: t == null ? void 0 : t.name
}
);
} finally {
A && (self.URL || self.webkitURL).revokeObjectURL(A);
}
}
class kQ {
constructor() {
this.messages = {}, this.messageIdNext = 0, this.worker = new NQ(), this.worker.onmessage = (A) => this.onMessage(A);
}
makeMessageId() {
return ++this.messageIdNext;
}
makeMessagePromiseId() {
const A = this.makeMessageId(), e = new Promise((s, i) => {
this.messages[A] = { resolve: s, reject: i };
});
return { id: A, promise: e };
}
onMessage(A) {
const { id: e, result: s, error: i } = A.data, n = this.messages[e];
n && (delete this.messages[e], i ? n.reject(i) : n.resolve(s));
}
// Invoke an RPC on the worker with the given name and arguments.
// The normal usage of a worker is to run one activity at a time,
// but this function allows for concurrent calls, tagging each request
// with a unique message Id and awaiting a response to that same Id.
// The method will automatically transfer any ArrayBuffers in the
// arguments to the worker. If you'd like to transfer a copy of a
// buffer then you must clone it before passing to this function.
async call(A, e) {
const { id: s, promise: i } = this.makeMessagePromiseId();
return this.worker.postMessage(
{ name: A, args: e, id: s },
{ transfer: Ci(e) }
), i;
}
}
let hr = 4, te = 0;
const lr = [], ur = [];
async function UQ() {
const t = lr.shift();
if (t)
return t;
if (te < hr) {
const A = new kQ();
return te += 1, A;
}
return new Promise((A) => {
ur.push(A);
});
}
function RQ(t) {
if (te > hr) {
te -= 1;
return;
}
const A = ur.shift();
if (A) {
A(t);
return;
}
lr.push(t);
}
async function Dt(t) {
const A = await UQ();
try {
return await t(A);
} finally {
RQ(A);
}
}
class kE extends Ur {
constructor(A) {
super(A), this.fileLoader = new Rr(A);
}
load(A, e, s, i) {
this.fileLoader.setResponseType("arraybuffer"), this.fileLoader.setCrossOrigin(this.crossOrigin), this.fileLoader.setWithCredentials(this.withCredentials), this.fileLoader.setPath(this.path), this.fileLoader.setResourcePath(this.resourcePath), this.fileLoader.setRequestHeader(this.requestHeader), this.fileLoader.load(
A,
async (n) => {
if (e) {
const r = await yr({
input: n,
fileType: this.fileType,
pathOrUrl: A
});
e(new TA(r));
}
},
s,
i
);
}
async loadAsync(A, e) {
return new Promise((s, i) => {
this.load(
A,
(n) => {
s(n);
},
e,
i
);
});
}
parse(A) {
return new At({ packedSplats: A });
}
}
var ft = /* @__PURE__ */ ((t) => (t.PLY = "ply", t.SPZ = "spz", t.SPLAT = "splat", t.KSPLAT = "ksplat", t))(ft || {});
function dr(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 = Di(t, 4);
return new DataView(e.buffer).getUint32(0, !0) === 1347635022 ? "spz" : void 0;
}
}
function GQ(t) {
const A = t.split(/[?#]/, 1)[0], e = Math.max(
A.lastIndexOf("/"),
A.lastIndexOf("\\")
), s = A.slice(e + 1), i = s.lastIndexOf(".");
return i <= 0 || i === s.length - 1 ? "" : s.slice(i + 1).toLowerCase();
}
function wr(t) {
const A = GQ(t);
if (A === "ply")
return "ply";
if (A === "spz")
return "spz";
if (A === "splat")
return "splat";
if (A === "ksplat")
return "ksplat";
}
async function yr({
input: t,
fileType: A,
pathOrUrl: e
}) {
const s = t instanceof ArrayBuffer ? new Uint8Array(t) : t;
let i = A;
switch (A || (i = dr(s), !i && e && (i = wr(e))), i) {
case "ply": {
const n = new Ae({ fileBytes: s });
await n.parseHeader();
const a = n.numSplats, r = yA(a).maxSplats, g = { fileBytes: s, packedArray: new Uint32Array(r * 4) };
return await Dt(async (I) => {
const { packedArray: Q, numSplats: o, extra: E } = await I.call(
"unpackPly",
g
);
return { packedArray: Q, numSplats: o, extra: E };
});
}
case "spz":
return await Dt(async (n) => {
const { packedArray: a, numSplats: r, extra: g } = await n.call(
"decodeSpz",
{
fileBytes: s
}
);
return { packedArray: a, numSplats: r, extra: g };
});
case "splat":
return await Dt(async (n) => {
const { packedArray: a, numSplats: r } = await n.call(
"decodeAntiSplat",
{
fileBytes: s
}
);
return { packedArray: a, numSplats: r };
});
case "ksplat":
return await Dt(async (n) => {
const { packedArray: a, numSplats: r, extra: g } = await n.call(
"decodeKsplat",
{ fileBytes: s }
);
return { packedArray: a, numSplats: r, extra: g };
});
default:
throw new Error(`Unknown splat file type: ${i}`);
}
}
class bQ {
constructor({ maxSplats: A = 1 } = {}) {
this.numSplats = 0, this.maxSplats = yA(A).maxSplats, this.centers = new Float32Array(this.maxSplats * 3), this.scales = new Float32Array(this.maxSplats * 3), this.quaternions = new Float32Array(this.maxSplats * 4), this.opacities = new Float32Array(this.maxSplats), this.colors = new Float32Array(this.maxSplats * 3);
}
pushSplat() {
const A = this.numSplats;
return this.ensureIndex(A), this.numSplats += 1, A;
}
unpushSplat(A) {
if (A === this.numSplats - 1)
this.numSplats -= 1;
else
throw new Error("Cannot unpush splat from non-last position");
}
ensureCapacity(A) {
if (A > this.maxSplats) {
const e = Math.max(A, this.maxSplats * 2), s = new Float32Array(e * 3), i = new Float32Array(e * 3), n = new Float32Array(e * 4), a = new Float32Array(e), r = new Float32Array(e * 3);
if (s.set(this.centers), i.set(this.scales), n.set(this.quaternions), a.set(this.opacities), r.set(this.colors), this.centers = s, this.scales = i, this.quaternions = n, this.opacities = a, this.colors = r, this.sh1) {
const g = new Float32Array(e * 9);
g.set(this.sh1), this.sh1 = g;
}
if (this.sh2) {
const g = new Float32Array(e * 15);
g.set(this.sh2), this.sh2 = g;
}
if (this.sh3) {
const g = new Float32Array(e * 21);
g.set(this.sh3), this.sh3 = g;
}
this.maxSplats = e;
}
}
ensureIndex(A) {
this.ensureCapacity(A + 1);
}
setCenter(A, e, s, i) {
this.centers[A * 3] = e, this.centers[A * 3 + 1] = s, this.centers[A * 3 + 2] = i;
}
setScale(A, e, s, i) {
this.scales[A * 3] = e, this.scales[A * 3 + 1] = s, this.scales[A * 3 + 2] = i;
}
setQuaternion(A, e, s, i, n) {
this.quaternions[A * 4] = e, this.quaternions[A * 4 + 1] = s, this.quaternions[A * 4 + 2] = i, this.quaternions[A * 4 + 3] = n;
}
setOpacity(A, e) {
this.opacities[A] = e;
}
setColor(A, e, s, i) {
this.colors[A * 3] = e, this.colors[A * 3 + 1] = s, this.colors[A * 3 + 2] = i;
}
setSh1(A, e) {
this.sh1 || (this.sh1 = new Float32Array(this.maxSplats * 9));
for (let s = 0; s < 9; ++s)
this.sh1[A * 9 + s] = e[s];
}
setSh2(A, e) {
this.sh2 || (this.sh2 = new Float32Array(this.maxSplats * 15));
for (let s = 0; s < 15; ++s)
this.sh2[A * 15 + s] = e[s];
}
setSh3(A, e) {
this.sh3 || (this.sh3 = new Float32Array(this.maxSplats * 21));
for (let s = 0; s < 21; ++s)
this.sh3[A * 21 + s] = e[s];
}
}
var vQ = `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 $ = class $ {
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 Ke({ packedSplats: this }), this.initialized = Promise.resolve(this), this.reinitialize(A);
}
reinitialize(A) {
this.isInitialized = !1, A.url || A.fileBytes || A.construct ? this.initialized = this.asyncInitialize(A).then(() => (this.isInitialized = !0, this)) : (this.initialize(A), this.isInitialized = !0, this.initialized = Promise.resolve(this));
}
initialize(A) {
A.packedArray ? (this.packedArray = A.packedArray, this.maxSplats = Math.floor(this.packedArray.length / 4), this.maxSplats = Math.floor(this.maxSplats / O) * O, 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) {
let { url: e, fileBytes: s, construct: i } = A;
if (e && (s = await fetch(e).then(async (n) => {
if (!n.ok)
throw new Error(
`${n.status} "${n.statusText}" fetching URL: ${e}`
);
return await n.arrayBuffer();
})), s) {
const n = await yr({
input: s,
fileType: A.fileType,
pathOrUrl: A.fileName ?? e
});
this.initialize(n);
}
if (i) {
const n = i(this);
n instanceof Promise && await n;
}
}
// Call this when you are finished with the PackedSplats and want to free
// any buffers it holds.
dispose() {
this.target && (this.target.dispose(), this.target = null), this.source && (this.source.dispose(), this.source = null);
}
// Ensures that this.packedArray can fit numSplats Gsplats. If it's too small,
// resize exponentially and copy over the original data.
//
// Typically you don't need to call this, because calling this.setSplat(index, ...)
// and this.pushSplat(...) will automatically call ensureSplats() so we have
// enough splats.
ensureSplats(A) {
const e = A <= this.maxSplats ? this.maxSplats : (
// Grow exponentially to avoid frequent reallocations
Math.max(A, 2 * this.maxSplats)
), s = this.packedArray ? this.packedArray.length / 4 : 0;
if (!this.packedArray || e > s) {
this.maxSplats = yA(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 s, i;
if (A === 0)
return this.ensureSplats(e);
if (A === 1)
s = 2, i = "sh1";
else if (A === 2)
s = 4, i = "sh2";
else if (A === 3)
s = 4, i = "sh3";
else
throw new Error(`Invalid level: ${A}`);
let n = this.extra[i] ? this.extra[i].length / s : 0;
const a = e <= n ? n : Math.max(e, 2 * n);
if (!this.extra[i] || a > n) {
n = yA(a).maxSplats;
const r = new Uint32Array(n * s);
this.extra[i] && r.set(this.extra[i]), this.extra[i] = r;
}
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 me(this.packedArray, A);
}
// Set all PackedSplat components at index with the provided Gsplat attributes
// (can be the same objects returned by getSplat). Ensures there is capacity
// for at least index+1 Gsplats.
setSplat(A, e, s, i, n, a) {
const r = this.ensureSplats(A + 1);
fe(
r,
A,
e.x,
e.y,
e.z,
s.x,
s.y,
s.z,
i.x,
i.y,
i.z,
i.w,
n,
a.r,
a.g,
a.b
), this.numSplats = Math.max(this.numSplats, A + 1);
}
// Effectively calls this.setSplat(this.numSplats++, center, ...), useful on
// construction where you just want to iterate and create a collection of Gsplats.
pushSplat(A, e, s, i, n) {
const a = this.ensureSplats(this.numSplats + 1);
fe(
a,
this.numSplats,
A.x,
A.y,
A.z,
e.x,
e.y,
e.z,
s.x,
s.y,
s.z,
s.w,
i,
n.r,
n.g,
n.b
), ++this.numSplats;
}
// Iterate over Gsplats index 0..=(this.numSplats-1), unpack each Gsplat
// and invoke the callback function with the Gsplat attributes.
forEachSplat(A) {
if (!(!this.packedArray || !this.numSplats))
for (let e = 0; e < this.numSplats; ++e) {
const s = me(this.packedArray, e);
A(
e,
s.center,
s.scales,
s.quaternion,
s.opacity,
s.color
);
}
}
// Ensures our PackedSplats.target render target has enough space to generate
// maxSplats total Gsplats, and reallocate if not large enough.
ensureGenerate(A) {
if (this.target && (A ?? 1) <= this.maxSplats)
return !1;
this.dispose();
const e = yA(A ?? 1), { width: s, height: i, depth: n } = e;
return this.maxSplats = e.maxSplats, this.target = new B.WebGLArrayRenderTarget(s, i, n, {
depthBuffer: !1,
stencilBuffer: !1,
generateMipmaps: !1,
magFilter: B.NearestFilter,
minFilter: B.NearestFilter
}), this.target.texture.format = B.RGBAIntegerFormat, this.target.texture.type = B.UnsignedIntType, this.target.texture.internalFormat = "RGBA32UI", !0;
}
// Given an array of splatCounts (.numSplats for each
// SplatGenerator/SplatMesh in the scene), compute a
// "mapping layout" in the composite array of generated outputs.
generateMapping(A) {
let e = 0;
const s = A.map((i) => {
const n = e, a = Math.ceil(i / O) * O;
return e += a, { base: n, count: i };
});
return { maxSplats: e, mapping: s };
}
// Returns a THREE.DataArrayTexture representing the PackedSplats content as
// a Uint32x4 data array texture (2048 x 2048 x depth in size)
getTexture() {
return this.target ? this.target.texture : this.source || this.packedArray ? this.maybeUpdateSource() : $.getEmpty();
}
// Check if source texture needs to be created/updated
maybeUpdateSource() {
if (!this.packedArray)
throw new Error("No packed splats");
if (this.needsUpdate || !this.source) {
if (this.needsUpdate = !1, this.source) {
const { width: A, height: e, depth: s } = this.source.image;
this.maxSplats !== A * e * s && (this.source.dispose(), this.source = null);
}
if (this.source)
this.packedArray.buffer !== this.source.image.data.buffer && (this.source.image.data = new Uint8Array(this.packedArray.buffer));
else {
const { width: A, height: e, depth: s } = yA(this.maxSplats);
this.source = new B.DataArrayTexture(
this.packedArray,
A,
e,
s
), this.source.format = B.RGBAIntegerFormat, this.source.type = B.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 (!$.emptySource) {
const { width: A, height: e, depth: s, maxSplats: i } = yA(1), n = new Uint32Array(i * 4);
$.emptySource = new B.DataArrayTexture(
n,
A,
e,
s
), $.emptySource.format = B.RGBAIntegerFormat, $.emptySource.type = B.UnsignedIntType, $.emptySource.internalFormat = "RGBA32UI", $.emptySource.needsUpdate = !0;
}
return $.emptySource;
}
// Get a program and THREE.RawShaderMaterial for a given GsplatGenerator,
// generating it if necessary and caching the result.
prepareProgramMaterial(A) {
let e = $.generatorProgram.get(A);
if (!e) {
const i = RA(
{ index: "int" },
{ output: "uvec4" },
({ index: n }) => {
A.inputs.index = n;
const a = A.outputs.gsplat;
return { output: ys(a) };
}
);
$.programTemplate || ($.programTemplate = new Te(
vQ
)), e = new Ye({
graph: i,
inputs: { index: "index" },
outputs: { output: "target" },
template: $.programTemplate
}), Object.assign(e.uniforms, {
targetLayer: { value: 0 },
targetBase: { value: 0 },
targetCount: { value: 0 }
}), $.generatorProgram.set(A, e);
}
const s = e.prepareMaterial();
return $.mesh.material = s, { program: e, material: s };
}
saveRenderState(A) {
return {
xrPresenting: A.xr.isPresenting,
autoClear: A.autoClear,
scissorTest: A.getScissorTest(),
pixelRatio: A.getPixelRatio()
};
}
resetRenderState(A, e) {
A.setRenderTarget(null), A.setPixelRatio(e.pixelRatio), A.xr.isPresenting = e.xrPresenting, A.autoClear = e.autoClear, A.setScissorTest(e.scissorTest);
}
// Executes a dyno program specified by generator which is any DynoBlock that
// maps { index: "int" } to { gsplat: Gsplat }. This is called in
// ForgeRenderer.updateInternal() to re-generate Gsplats in the scene for
// SplatGenerator instances whose version is newer than what was generated
// for it last time.
generate({
generator: A,
base: e,
count: s,
renderer: i
}) {
if (!this.target)
throw new Error("Target must be initialized with ensureSplats");
if (e + s > this.maxSplats)
throw new Error("Base + count exceeds maxSplats");
const { program: n, material: a } = this.prepareProgramMaterial(A);
n.update();
const r = this.saveRenderState(i), g = Math.ceil((e + s) / O) * O, I = O * XA;
for (a.uniforms.targetBase.value = e, a.uniforms.targetCount.value = s; e < g; ) {
const Q = Math.floor(e / I);
a.uniforms.targetLayer.value = Q;
const o = Q * I, E = Math.floor((e - o) / O), C = Math.min(
XA,
Math.ceil((g - o) / O)
);
i.setPixelRatio(1), i.setRenderTarget(this.target, Q), i.xr.isPresenting = !1, i.autoClear = !1, i.setScissorTest(!0), i.setScissor(
0,
E,
O,
C - E
), i.render($.scene, $.camera), e += O * (C - E);
}
return this.resetRenderState(i, r), { nextBase: g };
}
};
$.emptySource = null, $.programTemplate = null, $.generatorProgram = /* @__PURE__ */ new Map(), $.geometry = new B.PlaneGeometry(2, 2), $.mesh = new B.Mesh(
$.geometry,
new B.RawShaderMaterial({ visible: !1 })
), $.scene = new B.Scene().add($.mesh), $.camera = new B.Camera();
let TA = $;
class Ke extends k {
constructor({ packedSplats: A } = {}) {
super({
key: "packedSplats",
type: vt,
globals: () => [ne],
value: {
texture: TA.getEmpty(),
numSplats: 0
},
update: (e) => {
var s, i;
return e.texture = ((s = this.packedSplats) == null ? void 0 : s.getTexture()) ?? TA.getEmpty(), e.numSplats = ((i = this.packedSplats) == null ? void 0 : i.numSplats) ?? 0, e;
}
}), this.packedSplats = A;
}
}
class Ne extends B.InstancedBufferGeometry {
constructor(A, e) {
super(), this.ordering = A, this.setAttribute("position", new B.BufferAttribute(LQ, 3)), this.setIndex(new B.BufferAttribute(JQ, 1)), this._maxInstanceCount = A.length, this.instanceCount = e, this.attribute = new B.InstancedBufferAttribute(A, 1, !1, 1), this.attribute.setUsage(B.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 LQ = new Float32Array([
-1,
-1,
0,
1,
-1,
0,
1,
1,
0,
-1,
1,
0
]), JQ = new Uint16Array([0, 1, 2, 0, 2, 3]), WA = class WA {
constructor(A) {
if (this.lastTime = null, this.encodeLinear = !1, this.superXY = 1, this.display = null, this.sorting = null, this.pending = null, this.sortingCheck = !1, this.readback = new Uint16Array(0), this.forge = A.forge, this.camera = A.camera, this.viewToWorld = A.viewToWorld ?? new B.Matrix4(), A.target) {
const { width: e, height: s, doubleBuffer: i } = A.target, n = Math.max(1, Math.min(4, A.target.superXY ?? 1));
if (this.superXY = n, e * n > 8192 || s * n > 8192)
throw new Error("Target size too large");
this.target = new B.WebGLRenderTarget(
e * n,
s * n,
{
format: B.RGBAFormat,
type: B.UnsignedByteType,
colorSpace: B.SRGBColorSpace
}
), i && (this.back = new B.WebGLRenderTarget(
e * n,
s * n,
{
format: B.RGBAFormat,
type: B.UnsignedByteType,
colorSpace: B.SRGBColorSpace
}
)), this.encodeLinear = !0;
}
this.onTextureUpdated = A.onTextureUpdated, this.sortRadial = A.sortRadial ?? !0, this.sortDistance = A.sortDistance, this.sortCoorient = A.sortCoorient, this.depthBias = A.depthBias, this.sort360 = A.sort360, this.orderingFreelist = new ci({
allocate: (e) => new Uint32Array(e),
valid: (e, s) => e.length === s
}), this.autoUpdate = !1, this.setAutoUpdate(A.autoUpdate ?? !1);
}
// Call this when you are done with the ForgeViewpoint 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.forge.releaseAccumulator(this.display.accumulator), this.display.geometry.dispose(), this.display = null), (A = this.pending) != null && A.accumulator && (this.forge.releaseAccumulator(this.pending.accumulator), this.pending = null);
}
// Use this function to change whether this viewpoint will auto-update
// its sort order whenever the attached ForgeRenderer 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.forge.autoViewpoints.push(this) : this.autoUpdate && !A && (this.forge.autoViewpoints = this.forge.autoViewpoints.filter(
(e) => e !== this
)), this.autoUpdate = A;
}
// See below async prepareRenderPixels() for explanation of parameters.
// Awaiting this method updates the Gsplats in the scene and performs a sort of the
// Gsplats from this viewpoint, preparing it for a subsequent this.renderTarget()
// call in the same tick.
async prepare({
scene: A,
camera: e,
viewToWorld: s,
update: i,
forceOrigin: n
}) {
var r;
for (s ? this.viewToWorld = s : (this.camera = e ?? this.camera, this.camera && (this.camera.updateMatrixWorld(), this.viewToWorld = this.camera.matrixWorld.clone())); i ?? !0; ) {
const g = n ? this.viewToWorld : void 0;
if (this.forge.updateInternal({ scene: A, originToWorld: g }))
break;
await new Promise((Q) => setTimeout(Q, 10));
}
const a = this.forge.active;
a !== ((r = this.display) == null ? void 0 : r.accumulator) && (this.forge.active.refCount += 1), await this.sortUpdate({ accumulator: a, 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 s = this.back ?? this.target;
if (!s)
throw new Error("Must initialize ForgeViewpoint with target");
if (e = e ?? this.camera, !e)
throw new Error("Must provide camera");
if (e instanceof B.PerspectiveCamera) {
const n = new B.PerspectiveCamera().copy(e, !1);
n.aspect = s.width / s.height, n.updateProjectionMatrix(), e = n;
}
this.viewToWorld = e.matrixWorld.clone();
try {
this.forge.renderer.setRenderTarget(s), this.forge.prepareViewpoint(this), this.forge.renderer.render(A, e);
} finally {
this.forge.prepareViewpoint(this.forge.defaultView), this.forge.renderer.setRenderTarget(null);
}
s !== this.target && ([this.target, this.back] = [this.back, this.target]), (i = this.onTextureUpdated) == null || i.call(this, s.texture);
}
// Read back the previously rendered target image as a Uint8Array of packed
// RGBA values (in that order). If superXY was set greater than 1 then
// downsampling is performed in the target pixel array with simple averaging
// to derive the returned pixel values. Subsequent calls to this.readTarget()
// will reuse the same buffers to minimize memory allocations.
async readTarget() {
if (!this.target)
throw new Error("Must initialize ForgeViewpoint with target");
const { width: A, height: e } = this.target, s = A * e * 4;
(!this.superPixels || this.superPixels.length < s) && (this.superPixels = new Uint8Array(s)), await this.forge.renderer.readRenderTargetPixelsAsync(
this.target,
0,
0,
A,
e,
this.superPixels
);
const { superXY: i } = this;
if (i === 1)
return this.superPixels;
const n = A / i, a = e / i, r = n * a * 4;
(!this.pixels || this.pixels.length < r) && (this.pixels = new Uint8Array(r));
const { superPixels: g, pixels: I } = this, Q = i * i;
for (let o = 0; o < a; o++) {
const E = o * n;
for (let C = 0; C < n; C++) {
const c = C * i;
let h = 0, l = 0, u = 0, w = 0;
for (let p = 0; p < i; p++) {
const y = (o * i + p) * this.target.width;
for (let m = 0; m < i; m++) {
const F = (y + c + m) * 4;
h += g[F], l += g[F + 1], u += g[F + 2], w += g[F + 3];
}
}
const d = (E + C) * 4;
I[d] = h / Q, I[d + 1] = l / Q, I[d + 2] = u / Q, I[d + 3] = w / Q;
}
}
return I;
}
// 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 ForgeRenderer to check and potentially update the Gsplats.
// Setting update to false disables this and sorts the Gsplats as they are.
// Setting forceOrigin (default: false) to true forces the view update to
// recalculate the splats with this view origin, potentially altering any
// view-dependent effects. If you expect view-dependent effects to play a role
// in the rendering quality, enable this.
//
// Underneath, prepareRenderPixels() simply calls await this.prepare(...),
// this.renderTarget(...), and finally returns the result this.readTarget(),
// a Promise to a Uint8Array with RGBA values for all the pixels (potentially
// downsampled if the superXY parameter was used). These steps can also be called
// manually, for example if you need to alter the scene before and after
// this.renderTarget(...) to hide UI elements from being rendered.
async prepareRenderPixels({
scene: A,
camera: e,
viewToWorld: s,
update: i,
forceOrigin: n
}) {
return await this.prepare({ scene: A, camera: e, viewToWorld: s, update: i, forceOrigin: n }), this.renderTarget({ scene: A, camera: e }), this.readTarget();
}
// This is called automatically by ForgeRenderer, there is no need to call it!
// The method cannot be private because then ForgeRenderer would
// not be able to call it.
autoPoll({ accumulator: A }) {
var n, a, r, g;
this.camera && (this.camera.updateMatrixWorld(), this.viewToWorld = this.camera.matrixWorld.clone());
let e = !1, s = !1;
if (!this.display)
e = !0;
else if (A) {
e = !0;
const { mappingVersion: I } = this.display.accumulator;
A.mappingVersion === I && (this.forge.releaseAccumulator(this.display.accumulator), this.display.accumulator = A, s = !0);
}
const i = ((n = this.sorting) == null ? void 0 : n.viewToWorld) ?? ((a = this.display) == null ? void 0 : a.viewToWorld);
i && !Xt({
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 && ((r = this.pending) != null && r.accumulator) && this.pending.accumulator !== ((g = this.display) == null ? void 0 : g.accumulator) && this.forge.releaseAccumulator(this.pending.accumulator), this.pending = { accumulator: A, viewToWorld: this.viewToWorld, displayed: s }, this.driveSort());
}
async driveSort() {
var A;
for (; ; ) {
if (this.sorting || !this.pending)
return;
const { viewToWorld: e, displayed: s } = this.pending;
let i = this.pending.accumulator ?? ((A = this.display) == null ? void 0 : A.accumulator);
if (i || (i = this.forge.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: s }), this.sorting = null;
}
}
async sortUpdate({
accumulator: A,
viewToWorld: e,
displayed: s = !1
}) {
if (this.sortingCheck)
throw new Error("Only one sort at a time");
this.sortingCheck = !0, A = A ?? this.forge.active;
const { numSplats: i, maxSplats: n } = A.splats;
let a = 0, r = this.orderingFreelist.alloc(n);
if (i > 0) {
const {
reader: g,
doubleSortReader: I,
dynoSortRadial: Q,
dynoOrigin: o,
dynoDirection: E,
dynoDepthBias: C,
dynoSort360: c,
dynoSplats: h
} = WA.makeSorter(), l = Math.ceil(n / 2);
this.readback = g.ensureBuffer(l, this.readback);
const u = A.toWorld.clone().invert(), w = e.clone().premultiply(u);
Q.value = this.sort360 ? !0 : this.sortRadial, o.value.set(0, 0, 0).applyMatrix4(w), E.value.set(0, 0, -1).applyMatrix4(w).sub(o.value).normalize(), C.value = this.depthBias ?? 1, c.value = this.sort360 ?? !1, h.packedSplats = A.splats, await g.renderReadback({
renderer: this.forge.renderer,
reader: I,
count: Math.ceil(i / 2),
readback: this.readback
});
const d = await Dt(async (p) => p.call("sortDoubleSplats", {
numSplats: i,
readback: this.readback,
ordering: r
}));
this.readback = d.readback, r = d.ordering, a = d.activeSplats;
}
this.updateDisplay({
accumulator: A,
viewToWorld: e,
ordering: r,
activeSplats: a,
displayed: s
}), this.sortingCheck = !1;
}
updateDisplay({
accumulator: A,
viewToWorld: e,
ordering: s,
activeSplats: i,
displayed: n = !1
}) {
if (!this.display)
this.display = {
accumulator: A,
viewToWorld: e,
geometry: new Ne(s, i)
};
else {
!n && A !== this.display.accumulator && (this.forge.releaseAccumulator(this.display.accumulator), this.display.accumulator = A), this.display.viewToWorld = e;
const a = this.display.geometry.ordering;
a.length === s.length ? this.display.geometry.update(s, i) : (this.display.geometry.dispose(), this.display.geometry = new Ne(s, i)), this.orderingFreelist.free(a);
}
this.forge.viewpoint === this && this.forge.prepareViewpoint(this);
}
static makeSorter() {
if (!WA.dynos) {
const A = new Wt({ value: !0 }), e = new lt({ value: new B.Vector3() }), s = new lt({ value: new B.Vector3() }), i = new it({ value: 1 }), n = new Wt({ value: !1 }), a = new Ke(), r = new $t(), g = RA(
{ index: "int" },
{ rgba8: "vec4" },
({ index: I }) => {
if (!I)
throw new Error("No index");
const Q = {
sortRadial: A,
sortOrigin: e,
sortDirection: s,
sortDepthBias: i,
sort360: n
}, o = CA(I, tA("int", 2)), E = Nt(a, o), C = Xe({ gsplat: E, ...Q }), c = Nt(
a,
fA(o, tA("int", 1))
), h = Xe({ gsplat: c, ...Q }), l = YA({
vectorType: "vec2",
x: C,
y: h
});
return { rgba8: Sn(xn(l)) };
}
);
WA.dynos = {
dynoSortRadial: A,
dynoOrigin: e,
dynoDirection: s,
dynoDepthBias: i,
dynoSort360: n,
dynoSplats: a,
reader: r,
doubleSortReader: g
};
}
return WA.dynos;
}
};
WA.EMPTY_TEXTURE = new B.Texture(), WA.dynos = null;
let ee = WA;
const YQ = BA(`
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: s,
sortDepthBias: i,
sort360: n
}) {
return bt({
inTypes: {
gsplat: sA,
sortRadial: "bool",
sortOrigin: "vec3",
sortDirection: "vec3",
sortDepthBias: "float",
sort360: "bool"
},
outTypes: { metric: "float" },
globals: () => [mA, YQ],
inputs: {
gsplat: t,
sortRadial: A,
sortOrigin: e,
sortDirection: s,
sortDepthBias: i,
sort360: n
},
statements: ({ inputs: a, outputs: r }) => {
const {
gsplat: g,
sortRadial: I,
sortOrigin: Q,
sortDirection: o,
sortDepthBias: E,
sort360: C
} = a;
return NA(`
${r.metric} = computeSort(${g}, ${I}, ${Q}, ${o}, ${E}, ${C});
`);
}
}).outputs.metric;
}
class ye {
constructor() {
this.splats = new TA(), this.toWorld = new B.Matrix4(), this.mapping = [], this.refCount = 0, this.splatsVersion = -1, this.mappingVersion = -1;
}
ensureGenerate(A) {
this.splats.ensureGenerate(A) && (this.mapping = []);
}
// Generate all Gsplats from an array of generators
generateSplats({
renderer: A,
modifier: e,
generators: s,
forceUpdate: i,
originToWorld: n
}) {
const a = this.mapping.reduce((I, Q) => (I.set(Q.node, Q), I), /* @__PURE__ */ new Map());
let r = 0, g = 0;
for (const { node: I, generator: Q, version: o, base: E, count: C } of s) {
const c = a.get(I);
if ((i || Q !== (c == null ? void 0 : c.generator) || o !== (c == null ? void 0 : c.version) || E !== (c == null ? void 0 : c.base) || C !== (c == null ? void 0 : c.count)) && Q && C > 0) {
const h = e.apply(Q);
try {
this.splats.generate({
generator: h,
base: E,
count: C,
renderer: A
});
} catch (l) {
I.generator = void 0, I.generatorError = l;
}
r += 1;
}
g = Math.max(g, E + C);
}
return this.splats.numSplats = g, this.toWorld = n, this.mapping = s, r !== 0;
}
// Check if this accumulator has exactly the same generator mapping as
// the previous one. If so, we can reuse the Gsplat sort order.
hasCorrespondence(A) {
return this.mapping.length !== A.mapping.length ? !1 : this.mapping.every(({ node: e, base: s, count: i }, n) => {
const {
node: a,
base: r,
count: g
} = A.mapping[n];
return e === a && s === r && i === g;
});
}
}
var TQ = `const float LN_SCALE_MIN = -9.0;
const float LN_SCALE_MAX = 9.0;
const float LN_RESCALE = (LN_SCALE_MAX - LN_SCALE_MIN) / 254.0;
const uint SPLAT_TEX_WIDTH_BITS = 11u;
const uint SPLAT_TEX_HEIGHT_BITS = 11u;
const uint SPLAT_TEX_DEPTH_BITS = 11u;
const uint SPLAT_TEX_LAYER_BITS = SPLAT_TEX_WIDTH_BITS + SPLAT_TEX_HEIGHT_BITS;
const uint SPLAT_TEX_WIDTH = 1u << SPLAT_TEX_WIDTH_BITS;
const uint SPLAT_TEX_HEIGHT = 1u << SPLAT_TEX_HEIGHT_BITS;
const uint SPLAT_TEX_DEPTH = 1u << SPLAT_TEX_DEPTH_BITS;
const uint SPLAT_TEX_WIDTH_MASK = SPLAT_TEX_WIDTH - 1u;
const uint SPLAT_TEX_HEIGHT_MASK = SPLAT_TEX_HEIGHT - 1u;
const uint SPLAT_TEX_DEPTH_MASK = SPLAT_TEX_DEPTH - 1u;
const uint F16_INF = 0x7c00u;
const float PI = 3.1415926535897932384626433832795;
const float INFINITY = 1.0 / 0.0;
const float NEG_INFINITY = -INFINITY;
const float MAX_PIXEL_RADIUS = 512.0;
const float MIN_ALPHA = 0.01;
const float MAX_STDDEV = sqrt(8.0);
float sqr(float x) {
return x * x;
}
float pow4(float x) {
float x2 = x * x;
return x2 * x2;
}
float pow8(float x) {
float x4 = pow4(x);
return x4 * x4;
}
vec3 srgbToLinear(vec3 rgb) {
return pow(rgb, vec3(2.2));
}
vec3 linearToSrgb(vec3 rgb) {
return pow(rgb, vec3(1.0 / 2.2));
}
uint encodeQuatOctXy88R8(vec4 q) {
if (q.w < 0.0) {
q = -q;
}
float theta = 2.0 * acos(q.w);
float halfTheta = theta * 0.5;
float s = sin(halfTheta);
vec3 axis = (abs(s) < 1e-6) ? vec3(1.0, 0.0, 0.0) : q.xyz / s;
float sum = abs(axis.x) + abs(axis.y) + abs(axis.z);
vec2 p = vec2(axis.x, axis.y) / sum;
if (axis.z < 0.0) {
float oldPx = p.x;
p.x = (1.0 - abs(p.y)) * (p.x >= 0.0 ? 1.0 : -1.0);
p.y = (1.0 - abs(oldPx)) * (p.y >= 0.0 ? 1.0 : -1.0);
}
float u_f = p.x * 0.5 + 0.5;
float v_f = p.y * 0.5 + 0.5;
uint quantU = uint(clamp(round(u_f * 255.0), 0.0, 255.0));
uint quantV = uint(clamp(round(v_f * 255.0), 0.0, 255.0));
uint angleInt = uint(clamp(round((theta / 3.14159265359) * 255.0), 0.0, 255.0));
return (angleInt << 16u) | (quantV << 8u) | quantU;
}
vec4 decodeQuatOctXy88R8(uint encoded) {
uint quantU = encoded & uint(0xFFu);
uint quantV = (encoded >> 8u) & uint(0xFFu);
uint angleInt = encoded >> 16u;
float u_f = float(quantU) / 255.0;
float v_f = float(quantV) / 255.0;
vec2 f = vec2(u_f * 2.0 - 1.0, v_f * 2.0 - 1.0);
vec3 axis = vec3(f.xy, 1.0 - abs(f.x) - abs(f.y));
float t = max(-axis.z, 0.0);
axis.x += (axis.x >= 0.0) ? -t : t;
axis.y += (axis.y >= 0.0) ? -t : t;
axis = normalize(axis);
float theta = (float(angleInt) / 255.0) * 3.14159265359;
float halfTheta = theta * 0.5;
float s = sin(halfTheta);
float w = cos(halfTheta);
return vec4(axis * s, w);
}
uvec4 packSplat(vec3 center, vec3 scales, vec4 quaternion, vec4 rgba) {
uvec4 uRgba = uvec4(round(clamp(rgba * 255.0, 0.0, 255.0)));
uint uQuat = encodeQuatOctXy88R8(quaternion);
uvec3 uQuat3 = uvec3(uQuat & 0xffu, (uQuat >> 8u) & 0xffu, (uQuat >> 16u) & 0xffu);
uvec3 uScales = uvec3(
(scales.x == 0.0) ? 0u : uint(round(clamp((log(scales.x) - LN_SCALE_MIN) / LN_RESCALE, 0.0, 254.0))) + 1u,
(scales.y == 0.0) ? 0u : uint(round(clamp((log(scales.y) - LN_SCALE_MIN) / LN_RESCALE, 0.0, 254.0))) + 1u,
(scales.z == 0.0) ? 0u : uint(round(clamp((log(scales.z) - LN_SCALE_MIN) / LN_RESCALE, 0.0, 254.0))) + 1u
);
uint word0 = uRgba.r | (uRgba.g << 8u) | (uRgba.b << 16u) | (uRgba.a << 24u);
uint word1 = packHalf2x16(center.xy);
uint word2 = packHalf2x16(vec2(center.z, 0.0)) | (uQuat3.x << 16u) | (uQuat3.y << 24u);
uint word3 = uScales.x | (uScales.y << 8u) | (uScales.z << 16u) | (uQuat3.z << 24u);
return uvec4(word0, word1, word2, word3);
}
void unpackSplat(uvec4 packed, out vec3 center, out vec3 scales, out vec4 quaternion, out vec4 rgba) {
uint word0 = packed.x, word1 = packed.y, word2 = packed.z, word3 = packed.w;
uvec4 uRgba = uvec4(word0 & 0xffu, (word0 >> 8u) & 0xffu, (word0 >> 16u) & 0xffu, (word0 >> 24u) & 0xffu);
rgba = vec4(uRgba) / 255.0;
center = vec4(
unpackHalf2x16(word1),
unpackHalf2x16(word2 & 0xffffu)
).xyz;
uvec3 uScales = uvec3(word3 & 0xffu, (word3 >> 8u) & 0xffu, (word3 >> 16u) & 0xffu);
scales = vec3(
(uScales.x == 0u) ? 0.0 : exp(LN_SCALE_MIN + float(uScales.x - 1u) * LN_RESCALE),
(uScales.y == 0u) ? 0.0 : exp(LN_SCALE_MIN + float(uScales.y - 1u) * LN_RESCALE),
(uScales.z == 0u) ? 0.0 : exp(LN_SCALE_MIN + float(uScales.z - 1u) * LN_RESCALE)
);
uint uQuat = ((word2 >> 16u) & 0xFFFFu) | ((word3 >> 8u) & 0xFF0000u);
quaternion = decodeQuatOctXy88R8(uQuat);
}
vec3 quatVec(vec4 q, vec3 v) {
vec3 t = 2.0 * cross(q.xyz, v);
return v + q.w * t + cross(q.xyz, t);
}
vec4 quatQuat(vec4 q1, vec4 q2) {
return vec4(
q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y,
q1.w * q2.y - q1.x * q2.z + q1.y * q2.w + q1.z * q2.x,
q1.w * q2.z + q1.x * q2.y - q1.y * q2.x + q1.z * q2.w,
q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z
);
}
mat3 scaleQuaternionToMatrix(vec3 s, vec4 q) {
return mat3(
s.x * (1.0 - 2.0 * (q.y * q.y + q.z * q.z)),
s.x * (2.0 * (q.x * q.y + q.w * q.z)),
s.x * (2.0 * (q.x * q.z - q.w * q.y)),
s.y * (2.0 * (q.x * q.y - q.w * q.z)),
s.y * (1.0 - 2.0 * (q.x * q.x + q.z * q.z)),
s.y * (2.0 * (q.y * q.z + q.w * q.x)),
s.z * (2.0 * (q.x * q.z + q.w * q.y)),
s.z * (2.0 * (q.y * q.z - q.w * q.x)),
s.z * (1.0 - 2.0 * (q.x * q.x + q.y * q.y))
);
}
vec4 slerp(vec4 q1, vec4 q2, float t) {
float cosHalfTheta = dot(q1, q2);
if (abs(cosHalfTheta) >= 0.999) {
return q1;
}
if (cosHalfTheta < 0.0) {
q2 = -q2;
cosHalfTheta = -cosHalfTheta;
}
float halfTheta = acos(cosHalfTheta);
float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta);
float ratioA = sin((1.0 - t) * halfTheta) / sinHalfTheta;
float ratioB = sin(t * halfTheta) / sinHalfTheta;
return q1 * ratioA + q2 * ratioB;
}
ivec3 splatTexCoord(int index) {
uint x = uint(index) & SPLAT_TEX_WIDTH_MASK;
uint y = (uint(index) >> SPLAT_TEX_WIDTH_BITS) & SPLAT_TEX_HEIGHT_MASK;
uint z = uint(index) >> SPLAT_TEX_LAYER_BITS;
return ivec3(x, y, z);
}`, HQ = `precision highp float;
precision highp int;
#include <splatDefines>
uniform bool encodeLinear;
uniform float maxStdDev;
uniform bool disableFalloff;
uniform float falloff;
out vec4 fragColor;
in vec4 vRgba;
in vec2 vSplatUv;
in vec3 vNdc;
void main() {
float z = dot(vSplatUv, vSplatUv);
if (z > (maxStdDev * maxStdDev)) {
discard;
}
float alpha = vRgba.a;
alpha *= mix(1.0, exp(-0.5 * z), falloff);
if (alpha < MIN_ALPHA) {
discard;
}
vec3 rgb = vRgba.rgb;
if (encodeLinear) {
rgb = srgbToLinear(rgb);
}
fragColor = vec4(rgb, alpha);
}`, KQ = `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 time;
uniform float deltaTime;
uniform bool debugFlag;
uniform bool enable2DGS;
uniform float blurAmount;
uniform float preBlurAmount;
uniform float clipXY;
uniform usampler2DArray packedSplats;
void main() {
gl_Position = vec4(0.0, 0.0, 2.0, 1.0);
if (uint(gl_InstanceID) >= numSplats) {
return;
}
if (splatIndex == 0xffffffffu) {
return;
}
ivec3 texCoord = ivec3(
splatIndex & SPLAT_TEX_WIDTH_MASK,
(splatIndex >> SPLAT_TEX_WIDTH_BITS) & SPLAT_TEX_HEIGHT_MASK,
splatIndex >> SPLAT_TEX_LAYER_BITS
);
uvec4 packed = texelFetch(packedSplats, texCoord, 0);
vec3 center, scales;
vec4 quaternion, rgba;
unpackSplat(packed, center, scales, quaternion, rgba);
if (rgba.a < MIN_ALPHA) {
return;
}
bvec3 zeroScales = equal(scales, vec3(0.0));
if (all(zeroScales)) {
return;
}
vec3 viewCenter = quatVec(renderToViewQuat, center) + renderToViewPos;
if (viewCenter.z >= 0.0) {
return;
}
vec4 clipCenter = projectionMatrix * vec4(viewCenter, 1.0);
if (abs(clipCenter.z) >= clipCenter.w) {
return;
}
float clip = clipXY * clipCenter.w;
if (abs(clipCenter.x) > clip || abs(clipCenter.y) > clip) {
return;
}
vec4 viewQuaternion = quatQuat(renderToViewQuat, quaternion);
if (enable2DGS && any(zeroScales)) {
vRgba = rgba;
vSplatUv = position.xy * maxStdDev;
vec3 offset;
if (zeroScales.z) {
offset = vec3(vSplatUv.xy * scales.xy, 0.0);
} else if (zeroScales.y) {
offset = vec3(vSplatUv.x * scales.x, 0.0, vSplatUv.y * scales.z);
} else {
offset = vec3(0.0, vSplatUv.xy * scales.yz);
}
vec3 viewPos = viewCenter + quatVec(viewQuaternion, offset);
gl_Position = projectionMatrix * vec4(viewPos, 1.0);
vNdc = gl_Position.xyz / gl_Position.w;
return;
}
vec3 ndcCenter = clipCenter.xyz / clipCenter.w;
mat3 RS = scaleQuaternionToMatrix(scales, viewQuaternion);
mat3 cov3D = RS * transpose(RS);
vec2 focal = 0.5 * renderSize * 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 detOrig = a * d - b * b;
a += blurAmount;
d += blurAmount;
float det = a * d - b * b;
float blurAdjust = sqrt(max(0.0, detOrig / det));
rgba.a *= blurAdjust;
if (rgba.a < MIN_ALPHA) {
return;
}
float eigenAvg = 0.5 * (a + d);
float eigenDelta = sqrt(max(0.0, eigenAvg * eigenAvg - det));
float eigen1 = eigenAvg + eigenDelta;
float eigen2 = eigenAvg - eigenDelta;
vec2 eigenVec1 = normalize(vec2((abs(b) < 0.001) ? 1.0 : b, eigen1 - a));
vec2 eigenVec2 = vec2(eigenVec1.y, -eigenVec1.x);
float scale1 = position.x * min(MAX_PIXEL_RADIUS, maxStdDev * sqrt(eigen1));
float scale2 = position.y * min(MAX_PIXEL_RADIUS, maxStdDev * sqrt(eigen2));
vec2 pixelOffset = eigenVec1 * scale1 + eigenVec2 * scale2;
vec2 ndcOffset = (2.0 / renderSize) * 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 pe = null;
function qQ() {
return pe || (B.ShaderChunk.splatDefines = TQ, pe = {
splatVertex: KQ,
splatFragment: HQ
}), pe;
}
const $e = 5;
let ke = !1, Ue = !1, pr;
const Dr = B.Scene.prototype.add;
B.Scene.prototype.add = function(t) {
return ke = ke || t instanceof At, Ue = Ue || t instanceof se, Dr.call(this, t), this;
};
const zQ = B.Scene.prototype.onBeforeRender;
B.Scene.prototype.onBeforeRender = function(t) {
if (ke) {
if (!Ue) {
const A = pr || new se({ renderer: t });
this.add(A);
}
B.Scene.prototype.onBeforeRender = zQ, B.Scene.prototype.add = Dr;
}
};
const dA = class dA extends B.Mesh {
constructor(A) {
const e = dA.makeUniforms(), s = qQ(), i = new B.ShaderMaterial({
glslVersion: B.GLSL3,
vertexShader: s.splatVertex,
fragmentShader: s.splatFragment,
uniforms: e,
transparent: !0,
blending: B.NormalBlending,
depthTest: !0,
depthWrite: !1,
side: B.DoubleSide
});
super(je, i), this.autoViewpoints = [], this.rotateToAccumulator = new Lt({ value: new B.Quaternion() }), this.translateToAccumulator = new lt({ value: new B.Vector3() }), this.lastFrame = -1, this.lastUpdateTime = null, this.defaultCameras = [], this.pendingUpdate = null, this.envViewpoint = null, this.frustumCulled = !1, this.renderer = A.renderer, this.material = i, this.uniforms = e;
const n = RA(
{ gsplat: sA },
{ gsplat: sA },
({ gsplat: a }) => {
if (!a)
throw new Error("gsplat not defined");
return a = ve(a, {
rotate: this.rotateToAccumulator,
translate: this.translateToAccumulator
}), { gsplat: a };
}
);
this.modifier = new yQ(n), this.autoUpdate = A.autoUpdate ?? !0, this.preUpdate = A.preUpdate ?? !1, this.originDistance = A.originDistance ?? 1, this.maxStdDev = A.maxStdDev ?? Math.sqrt(8), this.enable2DGS = A.enable2DGS ?? !0, this.preBlurAmount = A.preBlurAmount ?? 0, this.blurAmount = A.blurAmount ?? 0.3, this.falloff = A.falloff ?? 1, this.clipXY = A.clipXY ?? 1.4, this.active = new ye(), this.accumulatorCount = 1, this.freeAccumulators = [];
for (let a = 0; a < 1; ++a)
this.freeAccumulators.push(new ye()), this.accumulatorCount += 1;
this.defaultView = new ee({
...A.view,
autoUpdate: !0,
forge: this
}), this.viewpoint = this.defaultView, this.prepareViewpoint(this.viewpoint), this.clock = A.clock ? hi(A.clock) : new B.Clock(), pr = this;
}
static makeUniforms() {
return {
// Size of render viewport in pixels
renderSize: { value: new B.Vector2() },
// Total number of Gsplats in packedSplats to render
numSplats: { value: 0 },
// SplatAccumulator to view transformation quaternion
renderToViewQuat: { value: new B.Quaternion() },
// SplatAccumulator to view transformation translation
renderToViewPos: { value: new B.Vector3() },
// Maximum distance (in stddevs) from Gsplat center to render
maxStdDev: { value: 1 },
// Enable interpreting 0-thickness Gsplats as 2DGS
enable2DGS: { value: !1 },
// Add to projected 2D splat covariance diagonal (thickens and brightens)
preBlurAmount: { value: 0 },
// Add to 2D splat covariance diagonal and adjust opacity (anti-aliasing)
blurAmount: { value: 0.3 },
// 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 },
// Gsplat collection to render
packedSplats: { type: "t", value: TA.getEmpty() },
// Time in seconds for time-based effects
time: { value: 0 },
// Delta time in seconds since last frame
deltaTime: { value: 0 },
// Whether to encode Gsplat with linear RGB (for environment mapping)
encodeLinear: { value: !1 },
// Debug flag that alternates each frame
debugFlag: { value: !1 }
};
}
canAllocAccumulator() {
return this.freeAccumulators.length > 0 || this.accumulatorCount < $e;
}
maybeAllocAccumulator() {
let A = this.freeAccumulators.pop();
if (A === void 0) {
if (this.accumulatorCount >= $e)
return null;
A = new ye(), this.accumulatorCount += 1;
}
return A.refCount = 1, A;
}
releaseAccumulator(A) {
A.refCount -= 1, A.refCount === 0 && this.freeAccumulators.push(A);
}
newViewpoint(A) {
return new ee({ ...A, forge: this });
}
onBeforeRender(A, e, s) {
var E, C;
const i = this.time ?? this.clock.getElapsedTime(), n = i - (this.viewpoint.lastTime ?? i);
this.viewpoint.lastTime = i;
const a = A.info.render.frame, r = a !== this.lastFrame;
this.lastFrame = a;
const g = this.viewpoint;
if (g === this.defaultView) {
if (r)
if (!A.xr.isPresenting)
this.defaultView.viewToWorld = s.matrixWorld.clone(), this.defaultCameras = [this.defaultView.viewToWorld];
else {
const c = A.xr.getCamera().cameras;
this.defaultCameras = [
c[0].matrixWorld,
c[1].matrixWorld
], this.defaultView.viewToWorld = _Q(this.defaultCameras) ?? new B.Matrix4();
}
this.autoUpdate && this.update({ scene: e, viewToWorld: this.defaultView.viewToWorld });
}
if (r && (this.uniforms.time.value = i, this.uniforms.deltaTime.value = n, this.uniforms.debugFlag.value = performance.now() / 1e3 % 2 < 1), g.target)
this.uniforms.renderSize.value.set(
g.target.width,
g.target.height
);
else {
const c = A.getSize(this.uniforms.renderSize.value);
if (c.x === 1 && c.y === 1) {
const h = (E = A.xr.getSession()) == null ? void 0 : E.renderState.baseLayer;
h && (c.x = h.framebufferWidth, c.y = h.framebufferHeight);
}
}
this.uniforms.encodeLinear.value = g.encodeLinear, this.uniforms.maxStdDev.value = this.maxStdDev, this.uniforms.enable2DGS.value = this.enable2DGS, this.uniforms.preBlurAmount.value = this.preBlurAmount, this.uniforms.blurAmount.value = this.blurAmount, this.uniforms.falloff.value = this.falloff, this.uniforms.clipXY.value = this.clipXY;
const I = ((C = g.display) == null ? void 0 : C.accumulator.toWorld) ?? new B.Matrix4(), Q = s.matrixWorld.clone().invert();
I.clone().premultiply(Q).decompose(
this.uniforms.renderToViewPos.value,
this.uniforms.renderToViewQuat.value,
new B.Vector3()
);
}
// Update the uniforms for the given viewpoint.
// Note that the client expects to be able to call render() at any point
// to update the canvas, so we must switch the viewpoint back to
// defaultView when we're finished.
prepareViewpoint(A) {
if (this.viewpoint = A ?? this.viewpoint, this.viewpoint.display) {
const { accumulator: e, geometry: s } = this.viewpoint.display;
this.uniforms.numSplats.value = e.splats.numSplats, this.uniforms.packedSplats.value = e.splats.getTexture(), this.geometry = s;
} else
this.uniforms.numSplats.value = 0, this.uniforms.packedSplats.value = TA.getEmpty(), this.geometry = je;
}
// If forge.autoUpdate is false then you must manually call
// forge.update({ scene }) to have the scene Gsplats be re-generated.
update({
scene: A,
viewToWorld: e
}) {
const s = this.matrixWorld.clone();
this.preUpdate ? this.updateInternal({ scene: A, originToWorld: s, viewToWorld: e }) : (this.pendingUpdate = {
scene: A,
originToWorld: s
}, setTimeout(() => {
if (this.pendingUpdate) {
const { scene: i, originToWorld: n } = this.pendingUpdate;
this.pendingUpdate = null, this.updateInternal({ scene: i, originToWorld: n, viewToWorld: e });
}
}, 1));
}
updateInternal({
scene: A,
originToWorld: e,
viewToWorld: s
}) {
var E;
if (!this.canAllocAccumulator())
return !1;
e || (e = this.active.toWorld), s = s ?? e.clone();
const i = this.time ?? this.clock.getElapsedTime(), n = i - (this.lastUpdateTime ?? i);
this.lastUpdateTime = i;
const a = this.active.mapping.reduce((C, c) => (C.set(c.node, c), C), /* @__PURE__ */ new Map()), { generators: r, globalEdits: g } = this.compileScene(A);
for (const C of r)
(E = C.frameUpdate) == null || E.call(C, {
object: C,
time: i,
deltaTime: n,
viewToWorld: s,
globalEdits: g
});
for (const C of r) {
const c = a.get(C), h = C.generator ? C.numSplats : 0;
(C.generator !== (c == null ? void 0 : c.generator) || h !== (c == null ? void 0 : c.count)) && C.updateVersion();
}
const Q = !Xt({
matrix1: e,
matrix2: this.active.toWorld,
maxDistance: this.originDistance
}) || r.length !== a.size || r.some((C) => {
var c;
return C.version !== ((c = a.get(C)) == null ? void 0 : c.version);
});
let o = null;
if (Q) {
if (o = this.maybeAllocAccumulator(), !o)
throw new Error("Unreachable");
const C = !Xt({
matrix1: e,
matrix2: this.active.toWorld,
maxDistance: 1e-5,
minCoorient: 0.99999
}), h = r.map((y, m) => {
const F = a.get(y);
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.
[y.version - F.version, F.base, y]
) : [Number.POSITIVE_INFINITY, y.version, y];
}).sort((y, m) => y[0] !== m[0] ? y[0] - m[0] : y[1] - m[1]).map(([y, m, F]) => F), l = h.map((y) => y.numSplats), { maxSplats: u, mapping: w } = o.splats.generateMapping(l), d = h.map((y, m) => {
const { base: F, count: D } = w[m];
return {
node: y,
generator: y.generator,
version: y.version,
base: F,
count: D
};
});
e.clone().invert().decompose(
this.translateToAccumulator.value,
this.rotateToAccumulator.value,
new B.Vector3()
), o.ensureGenerate(u), o.generateSplats({
renderer: this.renderer,
modifier: this.modifier,
generators: d,
forceUpdate: C,
originToWorld: e
}), o.splatsVersion = this.active.splatsVersion + 1;
const p = o.hasCorrespondence(this.active);
o.mappingVersion = this.active.mappingVersion + (p ? 0 : 1), this.releaseAccumulator(this.active), this.active = o, this.prepareViewpoint();
}
return setTimeout(() => {
for (const C of this.autoViewpoints)
C.autoPoll({ accumulator: o ?? void 0 });
}, 1), !0;
}
compileScene(A) {
const e = [];
A.traverse((i) => {
i instanceof ge && e.push(i);
});
const s = /* @__PURE__ */ new Set();
return A.traverseVisible((i) => {
if (i instanceof jt) {
let n = i.parent;
for (; n != null && !(n instanceof At); )
n = n.parent;
n == null && s.add(i);
}
}), { generators: e, globalEdits: Array.from(s) };
}
// Renders out the scene to an environment map that can be used for
// Image-based lighting or similar applications. First optionally updates Gsplats,
// sorts them with respect to the provided worldCenter, renders 6 cube faces,
// then pre-filters them using THREE.PMREMGenerator and returns a THREE.Texture
// that can assigned directly to a THREE.MeshStandardMaterial.envMap property.
async renderEnvMap({
renderer: A,
scene: e,
worldCenter: s,
size: i = 256,
near: n = 0.1,
far: a = 1e3,
hideObjects: r = [],
update: g = !1
}) {
var C, c;
if (this.envViewpoint || (this.envViewpoint = this.newViewpoint({ sort360: !0 })), !dA.cubeRender || dA.cubeRender.target.width !== i || dA.cubeRender.near !== n || dA.cubeRender.far !== a) {
dA.cubeRender && dA.cubeRender.target.dispose();
const h = new B.WebGLCubeRenderTarget(i, {
format: B.RGBAFormat,
generateMipmaps: !0,
minFilter: B.LinearMipMapLinearFilter
}), l = new B.CubeCamera(n, a, h);
dA.cubeRender = { target: h, camera: l, near: n, far: a };
}
dA.pmrem || (dA.pmrem = new B.PMREMGenerator(A ?? this.renderer));
const I = new B.Matrix4().setPosition(s);
await ((C = this.envViewpoint) == null ? void 0 : C.prepare({ scene: e, viewToWorld: I, update: g }));
const { target: Q, camera: o } = dA.cubeRender;
o.position.copy(s);
const E = /* @__PURE__ */ new Map();
for (const h of r)
E.set(h, h.visible), h.visible = !1;
this.prepareViewpoint(this.envViewpoint), o.update(A ?? this.renderer, e), this.prepareViewpoint(this.defaultView);
for (const [h, l] of E.entries())
h.visible = l;
return (c = dA.pmrem) == null ? void 0 : c.fromCubemap(Q.texture).texture;
}
// Utility function to recursively set the envMap property for any
// THREE.MeshStandardMaterial within the subtree of root.
recurseSetEnvMap(A, e) {
A.traverse((s) => {
if (s instanceof B.Mesh)
if (Array.isArray(s.material))
for (const i of s.material)
i instanceof B.MeshStandardMaterial && (i.envMap = e);
else
s.material instanceof B.MeshStandardMaterial && (s.material.envMap = e);
});
}
// Utility function that helps extract the Gsplat RGBA values from a
// SplatGenerator, including the result of any real-time RGBA SDF edits applied
// to a SplatMesh. This effectively "bakes" any computed RGBA values, which can
// now be used as a pipeline input via SplatMesh.splatRgba to inject these
// baked values into the Gsplat data.
getRgba({
generator: A,
rgba: e
}) {
const s = this.active.mapping.find(({ node: i }) => i === A);
if (!s)
throw new Error("Generator not found");
return e = e ?? new Fe(), e.fromPackedSplats({
packedSplats: this.active.splats,
base: s.base,
count: s.count,
renderer: this.renderer
}), e;
}
// Utility function that builds on getRgba({ generator }) and additionally
// reads back the RGBA values to the CPU in a Uint8Array with packed RGBA
// in that byte order.
async readRgba({
generator: A,
rgba: e
}) {
return e = this.getRgba({ generator: A, rgba: e }), e.read();
}
};
dA.cubeRender = null, dA.pmrem = null;
let se = dA;
const je = new Ne(new Uint32Array(1), 0);
RA(
{ packedSplats: vt, index: "int" },
{ gsplat: sA },
({ packedSplats: t, index: A }) => {
if (!t || !A)
throw new Error("Invalid input");
return { gsplat: Nt(t, A) };
}
);
function _Q(t) {
if (t.length === 0)
return null;
const A = new B.Vector3(), e = new B.Quaternion(), s = new B.Vector3(), i = [], n = [];
for (const a of t)
a.decompose(A, e, s), i.push(A), n.push(e);
return new B.Matrix4().compose(
ui(i),
di(n),
new B.Vector3(1, 1, 1)
);
}
function VQ(t, A, e) {
const s = Math.floor(t.length / 32);
if (s * 32 !== t.length)
throw new Error("Invalid .splat file size");
const i = new Float32Array(t.buffer);
for (let n = 0; n < s; ++n) {
const a = n * 32, r = n * 8, g = i[r + 0], I = i[r + 1], Q = i[r + 2], o = i[r + 3], E = i[r + 4], C = i[r + 5], c = t[a + 24] / 255, h = t[a + 25] / 255, l = t[a + 26] / 255, u = t[a + 27] / 255, w = (t[a + 28] - 128) / 128, d = (t[a + 29] - 128) / 128, p = (t[a + 30] - 128) / 128, y = (t[a + 31] - 128) / 128;
e(
n,
g,
I,
Q,
o,
E,
C,
d,
p,
y,
w,
u,
c,
h,
l
);
}
}
const As = {
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
}
}, PQ = {
0: 0,
1: 9,
2: 24,
3: 45
};
function ZQ(t, A, e, s) {
var C;
let a = 0;
const r = new DataView(t.buffer, a, 4096);
a += 4096;
const g = r.getUint8(0), I = r.getUint8(1);
if (g !== 0 || I < 1)
throw new Error(
`Unsupported .ksplat version: ${g}.${I}`
);
const Q = r.getUint32(4, !0);
r.getUint32(16, !0);
const o = r.getUint16(20, !0);
if (o < 0 || o > 2)
throw new Error(`Invalid .ksplat compression level: ${o}`);
r.getFloat32(36, !0), r.getFloat32(40, !0);
let E = 4096 + Q * 1024;
for (let c = 0; c < Q; ++c) {
const h = new DataView(t.buffer, a, 1024);
a += 1024;
const l = h.getUint32(0, !0), u = h.getUint32(4, !0), w = h.getUint32(8, !0), d = h.getUint32(12, !0), p = h.getFloat32(16, !0), y = h.getUint16(20, !0), m = (h.getUint32(24, !0) || ((C = As[o]) == null ? void 0 : C.scaleRange)) ?? 1, D = h.getUint32(36, !0) * 4, f = y * d + D, U = h.getUint16(40, !0), S = PQ[U], {
bytesPerCenter: M,
bytesPerScale: b,
bytesPerRotation: N,
bytesPerColor: R,
bytesPerSphericalHarmonicsComponent: G,
scaleOffsetBytes: L,
rotationOffsetBytes: T,
colorOffsetBytes: H,
sphericalHarmonicsOffsetBytes: iA
} = As[o], P = M + b + N + R + S * G, AA = P * u, j = AA + f, X = U >= 1 ? new Float32Array(3 * 3) : void 0, Z = U >= 2 ? new Float32Array(5 * 3) : void 0, _ = U >= 3 ? new Float32Array(7 * 3) : void 0, v = p / 2 / m, wA = E + D, gA = E + f, J = new DataView(
t.buffer,
gA,
AA
), QA = new Float32Array(
t.buffer,
wA,
d * 3
);
for (let EA = 0; EA < l; ++EA) {
const Y = EA * P, MA = Math.floor(EA / w), pA = o === 0 ? J.getFloat32(Y + 0, !0) : (J.getUint16(Y + 0, !0) - m) * v + QA[3 * MA + 0], GA = o === 0 ? J.getFloat32(Y + 4, !0) : (J.getUint16(Y + 2, !0) - m) * v + QA[3 * MA + 1], bA = o === 0 ? J.getFloat32(Y + 8, !0) : (J.getUint16(Y + 4, !0) - m) * v + QA[3 * MA + 2], vA = o === 0 ? J.getFloat32(Y + L + 0, !0) : DA(J.getUint16(Y + L + 0, !0)), uA = o === 0 ? J.getFloat32(Y + L + 4, !0) : DA(J.getUint16(Y + L + 2, !0)), KA = o === 0 ? J.getFloat32(Y + L + 8, !0) : DA(J.getUint16(Y + L + 4, !0)), oe = o === 0 ? J.getFloat32(Y + T + 0, !0) : DA(
J.getUint16(Y + T + 0, !0)
), Ie = o === 0 ? J.getFloat32(Y + T + 4, !0) : DA(
J.getUint16(Y + T + 2, !0)
), Be = o === 0 ? J.getFloat32(Y + T + 8, !0) : DA(
J.getUint16(Y + T + 4, !0)
), Qe = o === 0 ? J.getFloat32(Y + T + 12, !0) : DA(
J.getUint16(Y + T + 6, !0)
), Ee = J.getUint8(Y + H + 0) / 255, Ce = J.getUint8(Y + H + 1) / 255, ce = J.getUint8(Y + H + 2) / 255, he = J.getUint8(Y + H + 3) / 255;
e(
EA,
pA,
GA,
bA,
vA,
uA,
KA,
Ie,
Be,
Qe,
oe,
he,
Ee,
Ce,
ce
), U >= 1 && X && (s == null || s(EA, X, Z, _));
}
E += j;
}
}
class OQ {
constructor({ fileBytes: A }) {
this.fileBytes = A instanceof ArrayBuffer ? new Uint8Array(A) : A, this.reader = new fi({ fileBytes: this.fileBytes });
const e = new DataView(this.reader.read(16).buffer);
if (e.getUint32(0, !0) !== 1347635022)
throw new Error("Invalid SPZ file");
if (this.version = e.getUint32(4, !0), this.version < 1 || this.version > 2)
throw new Error(`Unsupported SPZ version: ${this.version}`);
this.numSplats = e.getUint32(8, !0), this.shDegree = e.getUint8(12), this.fractionalBits = e.getUint8(13), this.flags = e.getUint8(14), this.flagAntiAlias = (this.flags & 1) !== 0, this.reserved = e.getUint8(15), this.parsed = !1;
}
parseSplats(A, e, s, i, n, a) {
if (this.parsed)
throw new Error("SPZ file already parsed");
if (this.parsed = !0, this.version === 1) {
const r = this.reader.read(this.numSplats * 3 * 2), g = new Uint16Array(r.buffer);
for (let I = 0; I < this.numSplats; I++) {
const Q = I * 3, o = DA(g[Q]), E = DA(g[Q + 1]), C = DA(g[Q + 2]);
A == null || A(I, o, E, C);
}
} else if (this.version === 2) {
const r = 1 << this.fractionalBits, g = this.reader.read(this.numSplats * 3 * 3);
for (let I = 0; I < this.numSplats; I++) {
const Q = I * 9, o = ((g[Q + 2] << 24 | g[Q + 1] << 16 | g[Q] << 8) >> 8) / r, E = ((g[Q + 5] << 24 | g[Q + 4] << 16 | g[Q + 3] << 8) >> 8) / r, C = ((g[Q + 8] << 24 | g[Q + 7] << 16 | g[Q + 6] << 8) >> 8) / r;
A == null || A(I, o, E, C);
}
} else
throw new Error("Unreachable");
{
const r = this.reader.read(this.numSplats);
for (let g = 0; g < this.numSplats; g++)
e == null || e(g, r[g] / 255);
}
{
const r = this.reader.read(this.numSplats * 3), g = mr / 0.15;
for (let I = 0; I < this.numSplats; I++) {
const Q = I * 3, o = (r[Q] / 255 - 0.5) * g + 0.5, E = (r[Q + 1] / 255 - 0.5) * g + 0.5, C = (r[Q + 2] / 255 - 0.5) * g + 0.5;
s == null || s(I, o, E, C);
}
}
{
const r = this.reader.read(this.numSplats * 3);
for (let g = 0; g < this.numSplats; g++) {
const I = g * 3, Q = Math.exp(r[I] / 16 - 10), o = Math.exp(r[I + 1] / 16 - 10), E = Math.exp(r[I + 2] / 16 - 10);
i == null || i(g, Q, o, E);
}
}
{
const r = this.reader.read(this.numSplats * 3);
for (let g = 0; g < this.numSplats; g++) {
const I = g * 3, Q = r[I] / 127.5 - 1, o = r[I + 1] / 127.5 - 1, E = r[I + 2] / 127.5 - 1, C = Math.sqrt(
Math.max(0, 1 - Q * Q - o * o - E * E)
);
n == null || n(g, Q, o, E, C);
}
}
if (a && this.shDegree >= 1) {
const r = new Float32Array(9), g = this.shDegree >= 2 ? new Float32Array(5 * 3) : void 0, I = this.shDegree >= 3 ? new Float32Array(7 * 3) : void 0, Q = this.reader.read(
this.numSplats * fr[this.shDegree] * 3
);
let o = 0;
for (let E = 0; E < this.numSplats; E++) {
for (let C = 0; C < 9; ++C)
r[C] = (Q[o + C] - 128) / 128;
if (o += 9, g) {
for (let C = 0; C < 15; ++C)
g[C] = (Q[o + C] - 128) / 128;
o += 15;
}
if (I) {
for (let C = 0; C < 21; ++C)
I[C] = (Q[o + C] - 128) / 128;
o += 21;
}
a == null || a(E, r, g, I);
}
}
}
}
const fr = { 1: 3, 2: 8, 3: 15 }, mr = 0.28209479177387814, WQ = 1347635022, XQ = 2, $Q = 1;
class ZA {
constructor({
numSplats: A,
shDegree: e,
fractionalBits: s = 12,
flagAntiAlias: i = !0
}) {
this.clippedCount = 0;
const n = 19 + (e >= 1 ? 9 : 0) + (e >= 2 ? 15 : 0) + (e >= 3 ? 21 : 0), a = 16 + A * n;
this.buffer = new ArrayBuffer(a), this.view = new DataView(this.buffer), this.view.setUint32(0, WQ, !0), this.view.setUint32(4, XQ, !0), this.view.setUint32(8, A, !0), this.view.setUint8(12, e), this.view.setUint8(13, s), this.view.setUint8(14, i ? $Q : 0), this.view.setUint8(15, 0), this.numSplats = A, this.shDegree = e, this.fractionalBits = s, this.fraction = 1 << s, this.flagAntiAlias = i;
}
setCenter(A, e, s, i) {
const n = Math.round(e * this.fraction), a = Math.max(-8388607, Math.min(8388607, n)), r = Math.round(s * this.fraction), g = Math.max(-8388607, Math.min(8388607, r)), I = Math.round(i * this.fraction), Q = Math.max(-8388607, Math.min(8388607, I));
(n !== a || r !== g || I !== Q) && (this.clippedCount += 1);
const C = 16 + A * 9;
this.view.setUint8(C, a & 255), this.view.setUint8(C + 1, a >> 8 & 255), this.view.setUint8(C + 2, a >> 16 & 255), this.view.setUint8(C + 3, g & 255), this.view.setUint8(C + 4, g >> 8 & 255), this.view.setUint8(C + 5, g >> 16 & 255), this.view.setUint8(C + 6, Q & 255), this.view.setUint8(C + 7, Q >> 8 & 255), this.view.setUint8(C + 8, Q >> 16 & 255);
}
setAlpha(A, e) {
const s = 16 + this.numSplats * 9 + A;
this.view.setUint8(
s,
Math.max(0, Math.min(255, Math.round(e * 255)))
);
}
static scaleRgb(A) {
const e = ((A - 0.5) / (mr / 0.15) + 0.5) * 255;
return Math.max(0, Math.min(255, Math.round(e)));
}
setRgb(A, e, s, i) {
const n = 16 + this.numSplats * 10 + A * 3;
this.view.setUint8(n, ZA.scaleRgb(e)), this.view.setUint8(n + 1, ZA.scaleRgb(s)), this.view.setUint8(n + 2, ZA.scaleRgb(i));
}
setScale(A, e, s, i) {
const n = 16 + this.numSplats * 13 + A * 3;
this.view.setUint8(
n,
Math.max(0, Math.min(255, Math.round((Math.log(e) + 10) * 16)))
), this.view.setUint8(
n + 1,
Math.max(0, Math.min(255, Math.round((Math.log(s) + 10) * 16)))
), this.view.setUint8(
n + 2,
Math.max(0, Math.min(255, Math.round((Math.log(i) + 10) * 16)))
);
}
setQuat(A, e, s, i, n) {
const a = 16 + this.numSplats * 16 + A * 3, r = n < 0;
this.view.setUint8(
a,
Math.max(
0,
Math.min(255, Math.round(((r ? -e : e) + 1) * 127.5))
)
), this.view.setUint8(
a + 1,
Math.max(
0,
Math.min(255, Math.round(((r ? -s : s) + 1) * 127.5))
)
), this.view.setUint8(
a + 2,
Math.max(
0,
Math.min(255, Math.round(((r ? -i : i) + 1) * 127.5))
)
);
}
static quantizeSh(A, e) {
const s = Math.round(A * 128) + 128, i = 1 << 8 - e, n = Math.floor((s + i / 2) / i) * i;
return Math.max(0, Math.min(255, n));
}
setSh(A, e, s, i) {
const n = fr[this.shDegree] || 0, a = 16 + this.numSplats * 19 + A * n * 3;
for (let r = 0; r < 9; ++r)
this.view.setUint8(a + r, ZA.quantizeSh(e[r], 5));
if (s) {
const r = a + 9;
for (let g = 0; g < 15; ++g)
this.view.setUint8(r + g, ZA.quantizeSh(s[g], 4));
if (i) {
const g = r + 15;
for (let I = 0; I < 21; ++I)
this.view.setUint8(g + I, ZA.quantizeSh(i[I], 4));
}
}
}
async finalize() {
const A = new Uint8Array(this.buffer), s = new ReadableStream({
async start(a) {
a.enqueue(A), a.close();
}
}).pipeThrough(new CompressionStream("gzip")), n = await new Response(s).arrayBuffer();
return console.log(
"Compressed",
A.length,
"bytes to",
n.byteLength,
"bytes"
), new Uint8Array(n);
}
}
async function UE(t) {
var Q, o, E;
const A = new bQ(), {
inputs: e,
clipXyz: s,
maxSh: i,
fractionalBits: n = 12,
opacityThreshold: a
} = t;
for (const C of e) {
let c = function(D) {
return D.multiplyScalar(d), D.applyQuaternion(p), D.add(y), D;
}, h = function(D) {
return D.multiplyScalar(d), D;
}, l = function(D) {
return D.premultiply(p), D;
}, u = function(D) {
return !m || m.containsPoint(D);
}, w = function(D) {
return a !== void 0 ? D >= a : !0;
};
const d = ((Q = C.transform) == null ? void 0 : Q.scale) ?? 1, p = new B.Quaternion().fromArray(
((o = C.transform) == null ? void 0 : o.quaternion) ?? [0, 0, 0, 1]
), y = new B.Vector3().fromArray(
((E = C.transform) == null ? void 0 : E.translate) ?? [0, 0, 0]
), m = s ? new B.Box3(
new B.Vector3().fromArray(s.min),
new B.Vector3().fromArray(s.max)
) : void 0;
let F = C.fileType;
switch (F || (F = dr(C.fileBytes), !F && C.pathOrUrl && (F = wr(C.pathOrUrl))), F) {
case ft.PLY: {
const D = new Ae({ fileBytes: C.fileBytes });
await D.parseHeader();
let f = null;
D.parseSplats(
(U, S, M, b, N, R, G, L, T, H, iA, P, AA, j, X) => {
const Z = c(new B.Vector3(S, M, b));
if (u(Z) && w(P)) {
f = A.pushSplat(), A.setCenter(f, Z.x, Z.y, Z.z);
const _ = h(
new B.Vector3(N, R, G)
);
A.setScale(f, _.x, _.y, _.z);
const v = l(
new B.Quaternion(L, T, H, iA)
);
A.setQuaternion(
f,
v.x,
v.y,
v.z,
v.w
), A.setOpacity(f, P), A.setColor(f, AA, j, X);
} else
f = null;
},
(U, S, M, b) => {
S && f !== null && A.setSh1(f, S), M && f !== null && A.setSh2(f, M), b && f !== null && A.setSh3(f, b);
}
);
break;
}
case ft.SPZ: {
const D = new OQ({ fileBytes: C.fileBytes }), f = new Int32Array(D.numSplats);
f.fill(-1);
const U = new Float32Array(D.numSplats * 3), S = new B.Vector3();
D.parseSplats(
(M, b, N, R) => {
const G = c(new B.Vector3(b, N, R));
U[M * 3] = G.x, U[M * 3 + 1] = G.y, U[M * 3 + 2] = G.z;
},
(M, b) => {
S.fromArray(U, M * 3), u(S) && w(b) && (f[M] = A.pushSplat(), A.setCenter(f[M], S.x, S.y, S.z), A.setOpacity(f[M], b));
},
(M, b, N, R) => {
f[M] >= 0 && A.setColor(f[M], b, N, R);
},
(M, b, N, R) => {
if (f[M] >= 0) {
const G = h(
new B.Vector3(b, N, R)
);
A.setScale(f[M], G.x, G.y, G.z);
}
},
(M, b, N, R, G) => {
if (f[M] >= 0) {
const L = l(
new B.Quaternion(b, N, R, G)
);
A.setQuaternion(
f[M],
L.x,
L.y,
L.z,
L.w
);
}
},
(M, b, N, R) => {
f[M] >= 0 && (A.setSh1(f[M], b), N && A.setSh2(f[M], N), R && A.setSh3(f[M], R));
}
);
break;
}
case ft.SPLAT:
VQ(
C.fileBytes,
(D) => {
},
(D, f, U, S, M, b, N, R, G, L, T, H, iA, P, AA) => {
const j = c(new B.Vector3(f, U, S));
if (u(j) && w(H)) {
const X = A.pushSplat();
A.setCenter(X, j.x, j.y, j.z);
const Z = h(
new B.Vector3(M, b, N)
);
A.setScale(X, Z.x, Z.y, Z.z);
const _ = l(
new B.Quaternion(R, G, L, T)
);
A.setQuaternion(
X,
_.x,
_.y,
_.z,
_.w
), A.setOpacity(X, H), A.setColor(X, iA, P, AA);
}
}
);
break;
case ft.KSPLAT: {
let D = null;
ZQ(
C.fileBytes,
(f) => {
},
(f, U, S, M, b, N, R, G, L, T, H, iA, P, AA, j) => {
const X = c(new B.Vector3(U, S, M));
if (u(X) && w(iA)) {
D = A.pushSplat(), A.setCenter(D, X.x, X.y, X.z);
const Z = h(
new B.Vector3(b, N, R)
);
A.setScale(D, Z.x, Z.y, Z.z);
const _ = l(
new B.Quaternion(G, L, T, H)
);
A.setQuaternion(
D,
_.x,
_.y,
_.z,
_.w
), A.setOpacity(D, iA), A.setColor(D, P, AA, j);
} else
D = null;
},
(f, U, S, M) => {
D !== null && (A.setSh1(D, U), S && A.setSh2(D, S), M && A.setSh3(D, M));
}
);
break;
}
default:
throw new Error(`transcodeSpz not implemented for ${F}`);
}
}
const r = Math.min(
i ?? 3,
A.sh3 ? 3 : A.sh2 ? 2 : A.sh1 ? 1 : 0
), g = new ZA({
numSplats: A.numSplats,
shDegree: r,
fractionalBits: n,
flagAntiAlias: !0
});
for (let C = 0; C < A.numSplats; ++C) {
const c = C * 3, h = C * 4;
g.setCenter(
C,
A.centers[c],
A.centers[c + 1],
A.centers[c + 2]
), g.setScale(
C,
A.scales[c],
A.scales[c + 1],
A.scales[c + 2]
), g.setQuat(
C,
A.quaternions[h],
A.quaternions[h + 1],
A.quaternions[h + 2],
A.quaternions[h + 3]
), g.setAlpha(C, A.opacities[C]), g.setRgb(
C,
A.colors[c],
A.colors[c + 1],
A.colors[c + 2]
), A.sh1 && r >= 1 && g.setSh(
C,
A.sh1.slice(C * 9, (C + 1) * 9),
r >= 2 && A.sh2 ? A.sh2.slice(C * 15, (C + 1) * 15) : void 0,
r >= 3 && A.sh3 ? A.sh3.slice(C * 21, (C + 1) * 21) : void 0
);
}
return { fileBytes: await g.finalize(), clippedCount: g.clippedCount };
}
class RE {
constructor(A) {
this.mesh = A.mesh, this.numSplats = A.numSplats ?? this.mesh.numSplats;
const { width: e, height: s, depth: i, maxSplats: n } = yA(this.numSplats);
this.skinData = new Uint16Array(n * 4), this.skinTexture = new B.DataArrayTexture(
this.skinData,
e,
s,
i
), this.skinTexture.format = B.RGBAIntegerFormat, this.skinTexture.type = B.UnsignedShortType, this.skinTexture.internalFormat = "RGBA16UI", this.skinTexture.needsUpdate = !0, this.numBones = A.numBones ?? 256, this.boneData = new Float32Array(this.numBones * 16), this.boneTexture = new B.DataTexture(
this.boneData,
4,
this.numBones,
B.RGBAFormat,
B.FloatType
), this.boneTexture.internalFormat = "RGBA32F", this.boneTexture.needsUpdate = !0, this.uniform = new k({
key: "skinning",
type: Mr,
globals: () => [xr],
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 AE(A, this.uniform);
}
// Set the "rest" pose for a bone with position and quaternion orientation.
setRestQuatPos(A, e, s) {
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] = s.x, this.boneData[i + 5] = s.y, this.boneData[i + 6] = s.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, s) {
const i = A * 16, n = new B.Quaternion(
this.boneData[i + 0],
this.boneData[i + 1],
this.boneData[i + 2],
this.boneData[i + 3]
), a = new B.Vector3(
this.boneData[i + 4],
this.boneData[i + 5],
this.boneData[i + 6]
), r = n.clone().invert(), g = s.clone().sub(a);
g.applyQuaternion(r), r.multiply(e);
const I = new B.Quaternion(
g.x,
g.y,
g.z,
0
).multiply(n);
this.boneData[i + 8] = r.x, this.boneData[i + 9] = r.y, this.boneData[i + 10] = r.z, this.boneData[i + 11] = r.w, this.boneData[i + 12] = 0.5 * I.x, this.boneData[i + 13] = 0.5 * I.y, this.boneData[i + 14] = 0.5 * I.z, this.boneData[i + 15] = 0.5 * I.w;
}
// Set up to 4 bone indices and weights for a Gsplat. For fewer than 4 bones,
// you can set the remaining weights to 0 (and index=0).
setSplatBones(A, e, s) {
const i = A * 4;
this.skinData[i + 0] = Math.min(255, Math.max(0, Math.round(s.x * 255))) + (e.x << 8), this.skinData[i + 1] = Math.min(255, Math.max(0, Math.round(s.y * 255))) + (e.y << 8), this.skinData[i + 2] = Math.min(255, Math.max(0, Math.round(s.z * 255))) + (e.z << 8), this.skinData[i + 3] = Math.min(255, Math.max(0, Math.round(s.w * 255))) + (e.w << 8);
}
// Call this to indicate that the bones have changed and the Gsplats need to be
// re-generated with updated skinning.
updateBones() {
this.boneTexture.needsUpdate = !0, this.mesh.needsUpdate = !0;
}
}
const Mr = { type: "GsplatSkinning" }, xr = BA(`
struct GsplatSkinning {
int numSplats;
int numBones;
usampler2DArray skinTexture;
sampler2D boneTexture;
};
`), jQ = BA(`
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 AE(t, A) {
return new V({
inTypes: { gsplat: sA, skinning: Mr },
outTypes: { gsplat: sA },
globals: () => [xr, jQ],
inputs: { gsplat: t, skinning: A },
statements: ({ inputs: s, outputs: i }) => {
const { skinning: n } = s, { gsplat: a } = i;
return NA(`
${a} = ${s.gsplat};
if (isGsplatActive(${a}.flags)) {
applyGsplatSkinning(
${n}.numSplats, ${n}.numBones,
${n}.skinTexture, ${n}.boneTexture,
${a}.index, ${a}.center, ${a}.quaternion
);
}
`);
}
}).outputs.gsplat;
}
function GE({
// PackedSplats object to add splats to
splats: t,
// min and max box extents of the grid
extents: A,
// step size along each grid axis
stepSize: e = 1,
// spherical radius of each Gsplat
pointRadius: s = 0.01,
// relative size of the "shadow copy" of each Gsplat placed behind it
pointShadowScale: i = 2,
// Gsplat opacity
opacity: n = 1,
// Gsplat color (THREE.Color) or function to set color for position:
// ((THREE.Color, THREE.Vector3) => void) (default: RGB-modulated grid)
color: a
}) {
const g = new B.Vector3(), I = new B.Vector3(), Q = new B.Quaternion(0, 0, 0, 1);
a == null && (a = (E, C) => E.set(
0.55 + 0.45 * Math.cos(C.x * 1),
0.55 + 0.45 * Math.cos(C.y * 1),
0.55 + 0.45 * Math.cos(C.z * 1)
));
const o = new B.Color();
for (let E = A.min.z; E < A.max.z + 1e-6; E += e)
for (let C = A.min.y; C < A.max.y + 1e-6; C += e)
for (let c = A.min.x; c < A.max.x + 1e-6; c += e) {
g.set(c, C, E);
for (let h = 0; h < 2; ++h)
I.setScalar(s * (h ? 1 : i)), h ? typeof a == "function" ? a(o, g) : o.copy(a) : o.setScalar(0), t.pushSplat(g, I, Q, n, o);
}
}
function bE({
// PackedSplats object to add splats to
splats: t,
// scale (Gsplat scale along axis)
scale: A = 0.25,
// radius of the axes (Gsplat scale orthogonal to axis)
axisRadius: e = 75e-4,
// relative size of the "shadow copy" of each Gsplat placed behind it
axisShadowScale: s = 2,
// origins of the axes (default single axis at origin)
origins: i = [new B.Vector3()]
}) {
const n = new B.Vector3(), a = new B.Vector3(), r = new B.Quaternion(0, 0, 0, 1), g = new B.Color(), I = 1;
for (const Q of i)
for (let o = 0; o < 3; ++o) {
n.set(
Q.x + (o === 0 ? A : 0),
Q.y + (o === 1 ? A : 0),
Q.z + (o === 2 ? A : 0)
);
for (let E = 0; E < 2; ++E)
a.set(
(o === 0 ? A : e) * (E ? 1 : s),
(o === 1 ? A : e) * (E ? 1 : s),
(o === 2 ? A : e) * (E ? 1 : s)
), g.setRGB(
E === 0 ? 0 : o === 0 ? 1 : 0,
E === 0 ? 0 : o === 1 ? 1 : 0,
E === 0 ? 0 : o === 2 ? 1 : 0
), t.pushSplat(n, a, r, I, g);
}
}
function vE({
// PackedSplats object to add splats to
splats: t,
// center of the sphere (default: origin)
origin: A = new B.Vector3(),
// radius of the sphere
radius: e = 1,
// maximum depth of recursion for subdividing the sphere
// Warning: Gsplat count grows exponentially with depth
maxDepth: s = 3,
// filter function to apply to each point, for example to select
// points in a certain direction or other function ((THREE.Vector3) => boolean)
// (default: null)
filter: i = null,
// radius of each oriented Gsplat
pointRadius: n = 0.02,
// flatness of each oriented Gsplat
pointThickness: a = 1e-3,
// color of each Gsplat (THREE.Color) or function to set color for point:
// ((THREE.Color, THREE.Vector3) => void) (default: white)
color: r = new B.Color(1, 1, 1)
}) {
const g = {};
function I(h) {
if (i && !i(h))
return;
const l = `${h.x},${h.y},${h.z}`;
g[l] || (g[l] = h);
}
function Q(h, l, u, w) {
if (I(l), I(u), I(w), h >= s)
return;
const d = new B.Vector3().addVectors(l, u).normalize(), p = new B.Vector3().addVectors(u, w).normalize(), y = new B.Vector3().addVectors(w, l).normalize();
Q(h + 1, l, d, y), Q(h + 1, d, u, p), Q(h + 1, y, p, w), Q(h + 1, d, p, y);
}
for (const h of [-1, 1])
for (const l of [-1, 1])
for (const u of [-1, 1]) {
const w = new B.Vector3(h, 0, 0), d = new B.Vector3(0, l, 0), p = new B.Vector3(0, 0, u);
Q(0, w, d, p);
}
const o = Object.values(g), E = new B.Vector3(n, n, a), C = new B.Quaternion(), c = typeof r == "function" ? new B.Color() : r;
for (const h of o)
C.setFromUnitVectors(new B.Vector3(0, 0, -1), h), typeof r == "function" && r(c, h), h.multiplyScalar(e), h.add(A), t.pushSplat(h, E, C, 1, c);
}
function LE({
// text string to display
text: t,
// browser font to render text with (default: "Arial")
font: A,
// font size in pixels/Gsplats (default: 32)
fontSize: e,
// SplatMesh.recolor tint assuming white Gsplats (default: white)
color: s,
// Individual Gsplat color (default: white)
rgb: i,
// Gsplat radius (default: 0.8 covers 1-unit spacing well)
dotRadius: n,
// text alignment: "left", "center", "right", "start", "end" (default: "start")
textAlign: a,
// line spacing multiplier, lines delimited by "\n" (default: 1.0)
lineHeight: r,
// Coordinate scale in object-space (default: 1.0)
objectScale: g
}) {
A = A ?? "Arial", e = e ?? 32, s = s ?? new B.Color(1, 1, 1), n = n ?? 0.8, a = a ?? "start", r = r ?? 1, g = g ?? 1;
const I = t.split(`
`), Q = document.createElement("canvas"), o = Q.getContext("2d");
if (!o)
throw new Error("Failed to create canvas context");
o.font = `${e}px ${A}`, o.textAlign = a;
const E = o.measureText(""), C = E.fontBoundingBoxAscent + E.fontBoundingBoxDescent;
let c = Number.POSITIVE_INFINITY, h = Number.NEGATIVE_INFINITY, l = Number.POSITIVE_INFINITY, u = Number.NEGATIVE_INFINITY;
for (let N = 0; N < I.length; ++N) {
const R = o.measureText(I[N]), G = C * r * N;
c = Math.min(c, -R.actualBoundingBoxLeft), h = Math.max(h, R.actualBoundingBoxRight), l = Math.min(l, G - R.actualBoundingBoxAscent), u = Math.max(u, G + R.actualBoundingBoxDescent);
}
const w = Math.floor(c), d = Math.floor(l), p = Math.ceil(h) - w, y = Math.ceil(u) - d;
Q.width = p, Q.height = y, o.font = `${e}px ${A}`, o.textAlign = a, o.textBaseline = "alphabetic", o.fillStyle = "#FFFFFF";
for (let N = 0; N < I.length; ++N) {
const R = C * r * N - d;
o.fillText(I[N], -w, R);
}
const m = o.getImageData(0, 0, p, y), F = new Uint8Array(m.data.buffer), D = new TA(), f = new B.Vector3(), U = new B.Vector3().setScalar(n * g), S = new B.Quaternion(0, 0, 0, 1);
i = i ?? new B.Color(1, 1, 1);
let M = 0;
for (let N = 0; N < y; ++N)
for (let R = 0; R < p; ++R) {
const G = F[M + 3];
if (G > 0) {
const L = G / 255;
f.set(R - 0.5 * (p - 1), 0.5 * (y - 1) - N, 0), f.multiplyScalar(g), D.pushSplat(f, U, S, L, i);
}
M += 4;
}
const b = new At({ packedSplats: D });
return b.recolor = s, b;
}
function JE({
// URL of the image to convert to splats (example: `url: "./image.png"`)
url: t,
// Radius of each Gsplat, default covers 1-unit spacing well (default: 0.8)
dotRadius: A,
// Subsampling factor for the image. Higher values reduce resolution,
// for example 2 will halve the width and height by averaging (default: 1)
subXY: e,
// Optional callback function to modify each Gsplat before it's added.
// Return null to skip adding the Gsplat, or a number to set the opacity
// and add the Gsplat with parameter values in the objects center, rgba etc. were
// passed into the forEachSplat callback. Ending the callback in `return opacity;`
// will retain the original opacity.
// ((width: number, height: number, index: number, center: THREE.Vector3, scales: THREE.Vector3, quaternion: THREE.Quaternion, opacity: number, color: THREE.Color) => number | null)
forEachSplat: s
}) {
return A = A ?? 0.8, e = Math.max(1, Math.floor(e ?? 1)), new At({
constructSplats: async (i) => new Promise((n, a) => {
const r = new Image();
r.crossOrigin = "anonymous", r.onerror = a, r.onload = () => {
const { width: g, height: I } = r, Q = document.createElement("canvas");
Q.width = g, Q.height = I;
const o = Q.getContext("2d");
if (!o) {
a(new Error("Failed to create canvas context"));
return;
}
o.imageSmoothingEnabled = !0, o.imageSmoothingQuality = "high";
const E = Math.round(g / e), C = Math.round(I / e);
o.drawImage(r, 0, 0, E, C);
try {
const c = o.getImageData(0, 0, E, C), h = new Uint8Array(c.data.buffer), l = new B.Vector3(), u = new B.Vector3().setScalar(A), w = new B.Quaternion(0, 0, 0, 1), d = new B.Color();
let p = 0;
for (let y = 0; y < C; ++y)
for (let m = 0; m < E; ++m) {
const F = p * 4, D = h[F + 3];
if (D > 0) {
let f = D / 255;
d.set(
h[F + 0] / 255,
h[F + 1] / 255,
h[F + 2] / 255
), l.set(
m - 0.5 * (E - 1),
0.5 * (C - 1) - y,
0
), u.setScalar(A), w.set(0, 0, 0, 1);
let U = !0;
if (s) {
const S = s(
E,
C,
p,
l,
u,
w,
f,
d
);
f = S ?? f, U = S !== null;
}
U && i.pushSplat(l, u, w, f, d);
}
p += 1;
}
n();
} catch (c) {
a(c);
}
}, r.src = t;
})
});
}
function tE({
box: t,
cells: A,
dotScale: e,
color: s,
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 n = A.x * A.y * A.z, a = tA("int", A.x), r = tA("int", A.y);
tA("int", A.z);
const g = LA(0), I = new ge({
numSplats: n,
generator: RA(
{ index: "int" },
{ gsplat: sA },
({ index: o }) => {
if (!o)
throw new Error("index is undefined");
const E = Me(o, a), C = Pt(o, a), c = Me(C, r), h = Pt(C, r), l = YA({
vectorType: "ivec3",
x: E,
y: c,
z: h
}), u = Mn(g), w = YA({ vectorType: "ivec2", x: o, y: u }), d = Fa(w), p = tA("vec3", t.min), y = tA("vec3", t.max), m = Ut(y, p), F = Pt(fA(at(l), d), tA("vec3", A));
let D, f, U;
s ? (D = tA("float", s.r), f = tA("float", s.g), U = tA("float", s.b)) : { r: D, g: f, b: U } = St(F).outputs;
const S = YA({
vectorType: "vec4",
r: D,
g: f,
b: U,
a: tA("float", i)
}), M = fA(p, CA(m, F)), b = at(tA("float", e)), N = tA("vec4", new B.Quaternion(0, 0, 0, 1));
let R = ht({
flags: Ot("uint", "GSPLAT_FLAG_ACTIVE"),
index: o,
center: M,
scales: b,
quaternion: N,
rgba: S
});
return R = Q.applyGsplat(R), { gsplat: R };
},
{
globals: () => [mA]
}
),
update: ({ time: o }) => {
g.value = o, Q.update(I), I.updateVersion();
}
}), Q = new Et();
return I;
}
const eE = {
box: new B.Box3(
new B.Vector3(-1, -1, -1),
new B.Vector3(1, 1, 1)
),
density: 100,
fallDirection: new B.Vector3(-1, -3, 1).normalize(),
fallVelocity: 0.02,
wanderScale: 0.04,
wanderVariance: 2,
color1: new B.Color(1, 1, 1),
color2: new B.Color(0.5, 0.5, 1),
minScale: 1e-3,
maxScale: 5e-3,
anisoScale: new B.Vector3(1, 1, 1)
}, sE = {
box: new B.Box3(
new B.Vector3(-2, -1, -2),
new B.Vector3(2, 5, 2)
),
density: 10,
fallDirection: new B.Vector3(0, -1, 0),
fallVelocity: 2,
wanderScale: 0.1,
wanderVariance: 1,
color1: new B.Color(1, 1, 1),
color2: new B.Color(0.25, 0.25, 0.5),
minScale: 5e-3,
maxScale: 0.01,
anisoScale: new B.Vector3(0.1, 1, 0.1)
};
function iE({
// min and max box extents of the snowBox
box: t,
// minimum y-coordinate to clamp particle position, which can be used to
// fake hitting a ground plane and lingering there for a bit
minY: A,
// number of Gsplats to generate (default: calculated from box and density)
numSplats: e,
// density of Gsplats per unit volume (default: 100)
density: s,
// The xyz anisotropic scale of the Gsplat, which can be used for example
// to elongate rain particles (default: (1, 1, 1))
anisoScale: i,
// Minimum Gsplat particle scale (default: 0.001)
minScale: n,
// Maximum Gsplat particle scale (default: 0.005)
maxScale: a,
// The average direction of fall (default: (0, -1, 0))
fallDirection: r,
// The average speed of the fall (multiplied with fallDirection) (default: 0.02)
fallVelocity: g,
// The world scale of wandering overlay motion (default: 0.01)
wanderScale: I,
// Controls how uniformly the particles wander in sync, more variance mean
// more randomness in the motion (default: 2)
wanderVariance: Q,
// Color 1 of the two colors interpolated between (default: (1, 1, 1))
color1: o,
// Color 2 of the two colors interpolated between (default: (0.5, 0.5, 1))
color2: E,
// The base opacity of the Gsplats (default: 1)
opacity: C,
// Optional callback function to call each frame.
onFrame: c
}) {
t = t ?? new B.Box3(new B.Vector3(-1, -1, -1), new B.Vector3(1, 1, 1));
const h = (t.max.x - t.min.x) * (t.max.y - t.min.y) * (t.max.z - t.min.z);
s = s ?? 100, e = e ?? Math.max(1, Math.min(1e6, Math.round(h * s)));
const l = LA(n ?? 1e-3), u = LA(a ?? 5e-3), w = PA(
((i == null ? void 0 : i.clone()) ?? new B.Vector3(1, 1, 1)).normalize()
), d = PA(
(r ?? new B.Vector3(0, -1, 0)).normalize()
), p = LA(g ?? 0.02), y = LA(I ?? 0.01), m = LA(Q ?? 2), F = PA(o ?? new B.Color(1, 1, 1)), D = PA(E ?? new B.Color(0.5, 0.5, 1)), f = LA(C ?? 1), U = LA(0), S = PA(new B.Vector3(0, 0, 0)), M = PA(t.min), b = PA(t.max), N = LA(A ?? Number.NEGATIVE_INFINITY), R = Ut(b, M), G = new ge({
numSplats: e,
generator: RA(
{ index: "int" },
{ gsplat: sA },
({ index: T }) => {
if (!T)
throw new Error("index not defined");
const H = xe(T), iA = St(H).outputs.w;
let P = at(H), AA = Zt(CA(iA, tA("float", 100)));
AA = Se(CA(Ot("float", "PI"), AA)), AA = fA(l, CA(AA, Ut(u, l)));
const j = CA(AA, w), X = Zt(CA(iA, tA("float", 10))), Z = Zt(iA), _ = Fi(F, D, Z), v = CA(_, X), wA = xe(
YA({
vectorType: "ivec2",
x: T,
y: tA("int", 6837)
})
);
let gA = at(wA), J = CA(St(wA).outputs.w, m);
J = fA(U, J), P = fA(P, S);
const QA = xi(
P,
tA("vec3", new B.Vector3(1, 1, 1))
);
P = fA(M, CA(R, QA));
const EA = tA("vec4", new B.Quaternion(0, 0, 0, 1));
gA = Se(fA(at(J), gA)), gA = CA(gA, y);
let Y = fA(P, gA), MA = St(Y).outputs.y;
MA = Si(N, MA), Y = YA({ vector: Y, y: MA });
let pA = ht({
flags: Ot("uint", "GSPLAT_FLAG_ACTIVE"),
index: T,
center: Y,
scales: j,
quaternion: EA,
rgb: v,
opacity: f
});
return pA = L.applyGsplat(pA), { gsplat: pA };
},
{
globals: () => [mA]
}
),
update: ({ object: T, time: H, deltaTime: iA }) => {
U.value = H, L.update(G);
const P = d.value.clone().multiplyScalar(p.value * iA);
S.value.add(P), T.visible = f.value > 0, c == null || c({ object: T, time: H, deltaTime: iA }), G.updateVersion();
}
}), L = new Et();
return {
snow: G,
min: M,
max: b,
minY: N,
color1: F,
color2: D,
opacity: f,
fallVelocity: p,
wanderVariance: m,
wanderScale: y,
fallDirection: d,
minScale: l,
maxScale: u,
anisoScale: w
};
}
const YE = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
DEFAULT_RAIN: sE,
DEFAULT_SNOW: eE,
snowBox: iE,
staticBox: tE
}, Symbol.toStringTag, { value: "Module" })), Ft = class Ft {
static createButton(A, e = {}) {
const s = navigator.xr;
if (!s)
return null;
const i = s, n = document.createElement("button");
A.xr.enabled = !0, A.xr.setReferenceSpaceType("local");
function a() {
let o = null;
async function E(h) {
console.log("onSessionStarted"), h.addEventListener("end", C), await A.xr.setSession(h), n.textContent = "EXIT VR", o = h;
}
function C() {
console.log("onSessionEnded"), o == null || o.removeEventListener("end", C), n.textContent = "ENTER VR", o = null;
}
n.style.display = "", n.style.cursor = "pointer", n.style.left = "calc(50% - 100px)", n.style.width = "200px", n.style.height = "100px", n.textContent = "ENTER VR";
const c = {
...e,
optionalFeatures: [
// "local-floor",
// "bounded-floor",
// "layers",
...e.optionalFeatures || []
]
};
n.onmouseenter = () => {
n.style.opacity = "1.0";
}, n.onmouseleave = () => {
n.style.opacity = "0.5";
}, n.onclick = () => {
o === null ? (console.log("requesting session"), i.requestSession("immersive-vr", c).then(
E
)) : (console.log("ending session"), o.end());
};
}
function r() {
n.style.display = "none", n.style.cursor = "auto", n.style.left = "calc(50% - 75px)", n.style.width = "150px", n.onmouseenter = null, n.onmouseleave = null, n.onclick = null;
}
function g() {
r(), n.textContent = "VR NOT SUPPORTED";
}
function I(o) {
r(), console.warn(
"Exception when trying to call xr.isSessionSupported",
o
), n.textContent = "VR NOT ALLOWED";
}
function Q(o) {
o.style.position = "absolute", o.style.bottom = "20px", o.style.padding = "12px 6px", o.style.border = "1px solid #fff", o.style.borderRadius = "4px", o.style.background = "rgba(0,0,0,0.1)", o.style.color = "#fff", o.style.font = "normal 13px sans-serif", o.style.textAlign = "center", o.style.opacity = "0.5", o.style.outline = "none", o.style.zIndex = "999";
}
return n.id = "VRButton", n.style.display = "none", Q(n), i.isSessionSupported("immersive-vr").then((o) => {
o ? a() : g(), o && Ft.xrSessionIsGranted && n.click();
}).catch(I), n;
}
static registerSessionGrantedListener() {
const A = navigator.xr;
if (!A)
return null;
const e = A;
/WebXRViewer\//i.test(navigator.userAgent) || e.addEventListener("sessiongranted", () => {
Ft.xrSessionIsGranted = !0;
});
}
};
Ft.xrSessionIsGranted = !1;
let Re = Ft;
Re.registerSessionGrantedListener();
const nE = 0.5, aE = 0.5, rE = 0;
var qe = /* @__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))(qe || {});
const Sr = Object.keys(qe), TE = Sr.length, HE = {
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
}, zt = {
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
}, gE = [
["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"]
], oE = [
[8, 10, 8, 6],
[8, 19, 14, 8, 6],
[8, 19, 14, 8, 6],
[8, 19, 14, 8, 6],
[8, 19, 14, 8, 6]
], KE = ["t3", "i4", "m4", "r4", "p4"], qE = ["i4", "m4", "r4", "p4"];
var Fr = /* @__PURE__ */ ((t) => (t.left = "left", t.right = "right", t))(Fr || {});
const Ge = Object.keys(Fr);
class zE {
constructor() {
this.hands = {}, this.last = {}, this.values = {}, this.tests = {}, this.lastTests = {}, this.updated = !1;
}
update({ xr: A, xrFrame: e }) {
const s = A.getSession();
if (!s)
return;
const i = A.getReferenceSpace();
if (i && e.getJointPose) {
this.last = this.hands, this.lastTests = this.tests, this.hands = {}, this.values = {}, this.tests = {};
for (const n of s.inputSources) {
if (!n.hand)
continue;
const a = n.handedness;
this.hands[a] = {};
for (const r of Sr) {
const g = n.hand.get(qe[r]);
if (g) {
const I = e.getJointPose(g, i);
if (I) {
const { position: Q, orientation: o } = I.transform;
this.hands[a][r] = {
position: new UA(Q.x, Q.y, Q.z),
quaternion: new ze(
o.x,
o.y,
o.z,
o.w
),
radius: I.radius || 1e-3
};
}
}
}
}
for (const n of Ge)
for (const { key: a, value: r } of [
{ key: `${n}AllTips`, value: this.allTipsTouching(n) },
{
key: `${n}IndexThumb`,
value: this.touching(n, "i4", n, "t3")
},
{
key: `${n}MiddleThumb`,
value: this.touching(n, "m4", n, "t3")
},
{
key: `${n}RingThumb`,
value: this.touching(n, "r4", n, "t3")
},
{
key: `${n}PinkyThumb`,
value: this.touching(n, "p4", n, "t3")
},
{ key: `${n}TriTips`, value: this.triTipsTouching(n) }
])
this.values[a] = r, this.tests[a] = r === 1 ? !0 : r === 0 ? !1 : this.lastTests[a] ?? !1;
}
}
makeGhostMesh() {
const A = new UA(), e = new UA(0.01, 0.01, 0.01), s = new ze(0, 0, 0, 1), i = new _e(1, 1, 1), n = Math.PI * 3, a = new _e(1, 1, 1);
let r = 1;
const g = new At({
onFrame: () => {
let I = 0;
for (const Q of Ge) {
const o = this.values[`${Q}MiddleThumb`], E = this.hands[Q];
for (const [C, c] of gE.entries())
for (let h = 1; h < c.length; ++h) {
const l = oE[C][h - 1] * 2, u = h + 1 === c.length, w = E == null ? void 0 : E[c[h - 1]], d = E == null ? void 0 : E[c[h]];
for (let p = 0; p < l; ++p) {
const y = (p + 0.5) / l;
if (r = 0, w && d) {
A.copy(w.position).lerp(d.position, y), s.copy(w.quaternion).slerp(d.quaternion, y);
const m = zt[c[h - 1]], F = zt[c[h]];
let D = (1 - y) * m + y * F;
u && y > 0.8 && (D *= Math.sqrt(1 - ((y - 0.8) / 0.2) ** 2)), e.set(0.65 * D, 0.5 * D, 3e-3), i.set(
0.55 + 0.45 * Math.sin(A.x * n),
0.55 + 0.45 * Math.sin(A.y * n),
0.55 + 0.45 * Math.sin(A.z * n)
), Q === "right" && i.set(1 - i.r, 1 - i.g, 1 - i.b), i.lerp(a, o), r = 0.75;
}
g.packedSplats.setSplat(
I,
A,
e,
s,
r,
i
), I += 1;
}
}
}
g.packedSplats.numSplats = I, g.packedSplats.needsUpdate = !0, g.numSplats = I;
}
});
return g;
}
distance(A, e, s, i, n = !1) {
const a = n ? this.last[A] : this.hands[A], r = n ? this.last[s] : this.hands[s], g = a == null ? void 0 : a[e], I = r == null ? void 0 : r[i];
return !g || !I ? Number.POSITIVE_INFINITY : g.position.distanceTo(I.position);
}
separation(A, e, s, i, n = !1) {
const a = this.distance(A, e, s, i, n);
return a === Number.POSITIVE_INFINITY ? Number.POSITIVE_INFINITY : a - zt[e] - zt[i];
}
touching(A, e, s, i, n = !1) {
const a = this.separation(A, e, s, i, n);
return a === Number.POSITIVE_INFINITY ? Number.POSITIVE_INFINITY : 1 - Math.max(0, Math.min(1, a / 0.01 - rE));
}
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 _E {
constructor({
xrHands: A,
control: e,
moveInertia: s,
rotateInertia: i
}) {
this.lastGrip = {}, this.lastPivot = new UA(), this.rotateVelocity = 0, this.velocity = new UA(), this.xrHands = A, this.control = e, this.moveInertia = s ?? nE, this.rotateInertia = i ?? aE;
}
update(A) {
var n, a, r, g, I;
const e = {};
for (const Q of Ge) {
const o = this.xrHands.hands[Q];
o && this.xrHands.tests[`${Q}MiddleThumb`] && (e[Q] = new UA().add(((n = o.t3) == null ? void 0 : n.position) ?? new UA()).add(((a = o.i4) == null ? void 0 : a.position) ?? new UA()).add(((r = o.m4) == null ? void 0 : r.position) ?? new UA()).add(((g = o.r4) == null ? void 0 : g.position) ?? new UA()).add(((I = o.p4) == null ? void 0 : I.position) ?? new UA()).multiplyScalar(1 / 5));
}
if (e.left && e.right && this.lastGrip.left && this.lastGrip.right) {
const Q = e.left.clone().add(e.right).multiplyScalar(0.5), o = this.lastGrip.left.clone().add(this.lastGrip.right).multiplyScalar(0.5);
this.lastPivot = Q;
const E = Q.clone().applyMatrix4(this.control.matrix);
E.sub(o.clone().applyMatrix4(this.control.matrix)), E.multiplyScalar(1 / A), this.velocity.lerp(E, 1 - Math.exp(-20 * A));
const C = Math.atan2(e.left.z - Q.z, e.left.x - Q.x), c = Math.atan2(
this.lastGrip.left.z - o.z,
this.lastGrip.left.x - o.x
);
let h = C - c;
h > Math.PI ? h -= Math.PI * 2 : h < -Math.PI && (h += Math.PI * 2);
const l = h / 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 Q = e.left.clone().applyMatrix4(this.control.matrix);
Q.sub(this.lastGrip.left.clone().applyMatrix4(this.control.matrix)), Q.multiplyScalar(1 / A), this.velocity.lerp(Q, 1 - Math.exp(-20 * A));
} else if (e.right && this.lastGrip.right) {
const Q = e.right.clone().applyMatrix4(this.control.matrix);
Q.sub(
this.lastGrip.right.clone().applyMatrix4(this.control.matrix)
), Q.multiplyScalar(1 / A), this.velocity.lerp(Q, 1 - Math.exp(-20 * A));
} else
this.velocity.multiplyScalar(Math.exp(-A / this.moveInertia));
const s = this.lastPivot.clone().negate(), i = new le().makeTranslation(s).premultiply(new le().makeRotationY(this.rotateVelocity * A)).premultiply(new le().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 IE = 1, BE = 2, QE = 2e-3, EE = 6e-3, CE = 15e-4, cE = 0.15, hE = 0.15, lE = 0.1, uE = 2, dE = 200, wE = 400, yE = 50, pE = {
KeyW: new B.Vector3(0, 0, -1),
KeyS: new B.Vector3(0, 0, 1),
KeyA: new B.Vector3(-1, 0, 0),
KeyD: new B.Vector3(1, 0, 0),
KeyR: new B.Vector3(0, 1, 0),
KeyF: new B.Vector3(0, -1, 0)
}, DE = {
ArrowUp: new B.Vector3(0, 0, -1),
ArrowDown: new B.Vector3(0, 0, 1),
ArrowLeft: new B.Vector3(-1, 0, 0),
ArrowRight: new B.Vector3(1, 0, 0),
PageUp: new B.Vector3(0, 1, 0),
PageDown: new B.Vector3(0, -1, 0)
}, fE = {
KeyQ: new B.Vector3(0, 0, 1),
KeyE: new B.Vector3(0, 0, -1)
}, mE = {
Home: new B.Vector3(0, -1, 0),
End: new B.Vector3(0, 1, 0),
Insert: new B.Vector3(-1, 0, 0),
Delete: new B.Vector3(1, 0, 0)
};
class VE {
constructor({ canvas: A }) {
this.lastTime = 0, this.fpsMovement = new ME({}), this.pointerControls = new xE({ canvas: A });
}
update(A) {
const e = performance.now(), s = (e - (this.lastTime || e)) / 1e3;
this.lastTime = e, this.fpsMovement.update(s, A), this.pointerControls.update(s, A);
}
}
class ME {
constructor({
moveSpeed: A,
rollSpeed: e,
stickThreshold: s,
rotateSpeed: i,
keycodeMoveMapping: n,
keycodeRotateMapping: a,
gamepadMapping: r,
capsMultiplier: g,
shiftMultiplier: I,
ctrlMultiplier: Q,
xr: o
} = {}) {
this.enable = !0, this.moveSpeed = A ?? IE, this.rollSpeed = e ?? BE, this.stickThreshold = s ?? lE, this.rotateSpeed = i ?? uE, this.keycodeMoveMapping = n ?? {
...pE,
...DE
}, this.keycodeRotateMapping = a ?? {
...fE,
...mE
}, this.gamepadMapping = r ?? {
4: "rollLeft",
5: "rollRight",
6: "ctrl",
7: "shift"
}, this.capsMultiplier = g ?? 10, this.shiftMultiplier = I ?? 5, this.ctrlMultiplier = Q ?? 1 / 5, this.xr = o, this.keydown = {}, this.keycode = {}, document.addEventListener("keydown", (E) => {
this.keydown[E.key] = !0, this.keycode[E.code] = !0;
}), document.addEventListener("keyup", (E) => {
this.keydown[E.key] = !1, this.keycode[E.code] = !1;
});
}
// 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 Q, o;
if (!this.enable)
return;
const s = [new B.Vector2(), new B.Vector2()], i = navigator.getGamepads()[0];
i && (s[0].set(i.axes[0], i.axes[1]), s[1].set(i.axes[2], i.axes[3]));
const n = (i == null ? void 0 : i.buttons.map((E) => E.pressed)) || [], a = Array.from(((o = (Q = this.xr) == null ? void 0 : Q.getSession()) == null ? void 0 : o.inputSources) ?? []);
for (const E of a) {
const C = E.gamepad;
if (C)
switch (E.handedness) {
case "none": {
s[0].x += C.axes[0], s[0].y += C.axes[1], s[1].x += C.axes[2], s[1].y += C.axes[3];
break;
}
case "left": {
s[0].x += C.axes[2], s[0].y += C.axes[3];
break;
}
case "right": {
s[1].x += C.axes[2], s[1].y += C.axes[3];
break;
}
}
}
for (const E of s)
E.x = Math.abs(E.x) >= this.stickThreshold ? E.x : 0, E.y = Math.abs(E.y) >= this.stickThreshold ? E.y : 0;
const r = new B.Vector3(
s[1].x,
s[1].y,
0
).multiplyScalar(this.rotateSpeed);
for (const [E, C] of Object.entries(this.keycodeRotateMapping))
this.keycode[E] && r.add(C);
for (const E in this.gamepadMapping)
if (n[Number.parseInt(E)])
switch (this.gamepadMapping[E]) {
case "rollLeft":
r.z += 1;
break;
case "rollRight":
r.z -= 1;
break;
}
if (r.multiply(
new B.Vector3(this.rotateSpeed, this.rotateSpeed, this.rollSpeed)
), r.manhattanLength() > 0) {
r.multiplyScalar(A);
const E = new B.Euler().setFromQuaternion(
e.quaternion,
"YXZ"
);
E.y -= r.x, E.x = Math.max(
-Math.PI / 2,
Math.min(Math.PI / 2, E.x - r.y)
), E.z = Math.max(-Math.PI, Math.min(Math.PI, E.z + r.z)), e.quaternion.setFromEuler(E);
}
const g = new B.Vector3(s[0].x, 0, s[0].y);
for (const [E, C] of Object.entries(this.keycodeMoveMapping))
this.keycode[E] && g.add(C);
let I = 1;
this.keydown.CapsLock && (I *= this.capsMultiplier), (this.keycode.ShiftLeft || this.keycode.ShiftRight) && (I *= this.shiftMultiplier), (this.keycode.ControlLeft || this.keycode.ControlRight) && (I *= this.ctrlMultiplier);
for (const E in this.gamepadMapping)
if (n[Number.parseInt(E)])
switch (this.gamepadMapping[E]) {
case "shift":
I *= this.shiftMultiplier;
break;
case "ctrl":
I *= this.ctrlMultiplier;
break;
}
g.applyQuaternion(e.quaternion), e.position.add(
g.multiplyScalar(this.moveSpeed * I * A)
);
}
}
class xE {
constructor({
// The HTML canvas element to attach pointer events to
canvas: A,
// Speed of rotation (default DEFAULT_ROTATE_SPEED)
rotateSpeed: e,
// Speed of sliding when dragging with right/middle mouse button or two fingers
// (default DEFAULT_SLIDE_SPEED)
slideSpeed: s,
// Speed of movement when using mouse scroll wheel (default DEFAULT_SCROLL_SPEED)
scrollSpeed: i,
// Swap the direction of rotation and sliding (default: false)
swapRotateSlide: n,
// Reverse the direction of rotation (default: false)
reverseRotate: a,
// Reverse the direction of sliding (default: false)
reverseSlide: r,
// Reverse the direction of swipe gestures (default: false)
reverseSwipe: g,
// Reverse the direction of scroll wheel movement (default: false)
reverseScroll: I,
// Inertia factor for movement (default: DEFAULT_MOVE_INERTIA)
moveInertia: Q,
// Inertia factor for rotation (default: DEFAULT_ROTATE_INERTIA)
rotateInertia: o,
// Callback for double press events (default: () => {})
doublePress: E
}) {
this.enable = !0, this.canvas = A, this.rotateSpeed = e ?? QE, this.slideSpeed = s ?? EE, this.scrollSpeed = i ?? CE, this.swapRotateSlide = n ?? !1, this.reverseRotate = a ?? !1, this.reverseSlide = r ?? !1, this.reverseSwipe = g ?? !1, this.reverseScroll = I ?? !1, this.moveInertia = Q ?? hE, this.rotateInertia = o ?? cE, this.doublePress = E ?? (() => {
}), this.doublePressLimitMs = wE, this.doublePressDistance = yE, this.lastUp = null, this.rotating = null, this.sliding = null, this.dualPress = !1, this.scroll = new B.Vector3(), this.rotateVelocity = new B.Vector3(), this.moveVelocity = new B.Vector3(), A.addEventListener("pointerdown", (c) => {
const h = this.getPointerPosition(c), l = h.clone(), u = h.clone(), w = !this.swapRotateSlide && !this.rotating && (c.pointerType !== "mouse" || c.button === 0) || this.swapRotateSlide && this.sliding && !this.rotating && (c.pointerType !== "mouse" || c.button === 1), { pointerId: d, timeStamp: p } = c;
if (w)
this.rotating = { initial: l, last: u, position: h, pointerId: d, timeStamp: p }, A.setPointerCapture(c.pointerId), this.dualPress = !1;
else if (!this.sliding) {
const y = c.pointerType === "mouse" ? c.button : void 0;
this.sliding = {
initial: l,
last: u,
position: h,
pointerId: d,
button: y,
timeStamp: p
}, A.setPointerCapture(c.pointerId), this.dualPress = this.rotating != null && p - this.rotating.timeStamp < dE;
}
});
const C = (c) => {
var u, w;
((u = this.rotating) == null ? void 0 : u.pointerId) === c.pointerId ? (this.rotating = null, A.releasePointerCapture(c.pointerId), this.dualPress && this.sliding && (A.releasePointerCapture(this.sliding.pointerId), this.sliding = null)) : ((w = this.sliding) == null ? void 0 : w.pointerId) === c.pointerId && (this.sliding = null, A.releasePointerCapture(c.pointerId), this.dualPress && this.rotating && (A.releasePointerCapture(this.rotating.pointerId), this.rotating = null));
const h = this.getPointerPosition(c), l = this.lastUp;
if (this.lastUp = { position: h, time: c.timeStamp }, l && l.position.distanceTo(h) < this.doublePressDistance) {
const p = c.timeStamp - l.time;
p < this.doublePressLimitMs && (this.lastUp = null, this.doublePress({ position: h, intervalMs: p }));
}
};
document.addEventListener("pointerup", C), document.addEventListener("pointercancel", C), document.addEventListener("pointermove", (c) => {
var h, l;
((h = this.rotating) == null ? void 0 : h.pointerId) === c.pointerId ? this.rotating.position = this.getPointerPosition(c) : ((l = this.sliding) == null ? void 0 : l.pointerId) === c.pointerId && (this.sliding.position = this.getPointerPosition(c));
}), A.addEventListener("contextmenu", (c) => {
c.preventDefault();
}), A.addEventListener("wheel", (c) => {
this.scroll.add(
new B.Vector3(c.deltaX, c.deltaY, c.deltaZ)
), c.preventDefault();
});
}
getPointerPosition(A) {
const e = this.canvas.getBoundingClientRect();
return new B.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)
], n = i[0].dot(i[1]);
if (n >= 0.2) {
const a = i[0].clone().add(i[1]), r = new B.Vector3(a.x, -a.y, 0);
r.multiplyScalar(this.slideSpeed * (this.reverseSwipe ? 1 : -1)), r.applyQuaternion(e.quaternion), e.position.add(r), this.moveVelocity = r.clone().multiplyScalar(1 / A);
} else if (n <= -0.2) {
const a = this.sliding.last.clone().sub(this.rotating.last), r = a.length();
a.multiplyScalar(1 / r).normalize();
const g = new B.Vector2(-a.y, a.x), I = [i[0].dot(a), i[1].dot(a)], Q = [i[0].dot(g), i[1].dot(g)], o = this.rotating.last.clone().add(this.sliding.last).multiplyScalar(0.5);
let E = new B.Vector3();
if (e instanceof B.Camera) {
const w = new B.Vector2(
o.x / this.canvas.clientWidth * 2 - 1,
-(o.y / this.canvas.clientHeight) * 2 + 1
), d = new B.Raycaster();
d.setFromCamera(w, e), E = d.ray.direction;
}
const C = I[1] - I[0], c = E.multiplyScalar(C * this.slideSpeed);
e.position.add(c), this.moveVelocity = c.clone().multiplyScalar(1 / A);
const h = [
Math.atan(Q[0] / (-0.5 * r)),
Math.atan(Q[1] / (0.5 * r))
], l = 0.5 * (h[0] + h[1]), u = new B.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 B.Vector3();
if (this.rotating && !this.dualPress) {
const a = this.rotating.position.clone().sub(this.rotating.last);
this.rotating.last.copy(this.rotating.position), i.set(a.x, a.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 n = new B.Euler().setFromQuaternion(
e.quaternion,
"YXZ"
);
if (n.y -= i.x, n.x = Math.max(
-Math.PI / 2,
Math.min(Math.PI / 2, n.x - i.y)
), n.z *= Math.exp(-0 * A), e.quaternion.setFromEuler(n), this.sliding && !this.dualPress) {
const a = this.sliding.position.clone().sub(this.sliding.last);
this.sliding.last.copy(this.sliding.position);
const r = this.sliding.button !== 2 ? new B.Vector3(a.x, 0, a.y) : new B.Vector3(a.x, -a.y, 0);
r.multiplyScalar(this.slideSpeed * (this.reverseSlide ? -1 : 1)), r.applyQuaternion(e.quaternion), e.position.add(r), this.moveVelocity = r.clone().multiplyScalar(1 / A);
} else
this.moveVelocity.multiplyScalar(
Math.exp(-A / this.moveInertia)
), e.position.addScaledVector(this.moveVelocity, A);
}
const s = this.scroll.multiplyScalar(this.scrollSpeed);
s.set(s.x, s.z, s.y), this.reverseScroll && s.multiplyScalar(-1), s.applyQuaternion(e.quaternion), e.position.add(s), this.scroll.set(0, 0, 0);
}
}
export {
qE as FINGER_TIPS,
VE as ForgeControls,
se as ForgeRenderer,
ee as ForgeViewpoint,
ME as FpsMovement,
Ge as HANDS,
Fr as Hand,
_E as HandMovement,
Sr as JOINT_IDS,
HE as JOINT_INDEX,
zt as JOINT_RADIUS,
gE as JOINT_SEGMENTS,
oE as JOINT_SEGMENT_STEPS,
KE as JOINT_TIPS,
qe as JointEnum,
TE as NUM_JOINTS,
TA as PackedSplats,
Ae as PlyReader,
xE as PointerControls,
$t as Readback,
to as Sint8ToFloat,
ye as SplatAccumulator,
jt as SplatEdit,
hQ as SplatEditRgbaBlendMode,
uQ as SplatEditSdf,
CQ as SplatEditSdfType,
dQ as SplatEdits,
ft as SplatFileType,
ge as SplatGenerator,
kE as SplatLoader,
At as SplatMesh,
yQ as SplatModifier,
RE as SplatSkinning,
Et as SplatTransformer,
OQ as SpzReader,
ZA as SpzWriter,
Ao as Uint8ToFloat,
Re as VRButton,
zE as XrHands,
bE as constructAxes,
GE as constructGrid,
vE as constructSpherePoints,
NE as dyno,
yo as flipPixels,
Vt as floatToSint8,
qA as floatToUint8,
DA as fromHalf,
YE as generators,
dr as getSplatFileType,
JE as imageSplats,
uo as isAndroid,
lo as isMobile,
wo as isOculus,
po as pixelsToPngUrl,
fe as setPackedSplat,
LE as textSplats,
nt as toHalf,
UE as transcodeSpz,
me as unpackSplat,
yr as unpackSplats,
FE as utils
};