mirror of
https://github.com/storytold/spark.git
synced 2026-10-09 00:09:53 +00:00
1237 lines
406 KiB
JavaScript
1237 lines
406 KiB
JavaScript
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const sA=require("three");var Ne=typeof document<"u"?document.currentScript:null;function No(t){const A=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const e in t)if(e!=="default"){const s=Object.getOwnPropertyDescriptor(t,e);Object.defineProperty(A,e,s.get?s:{enumerable:!0,get:()=>t[e]})}}return A.default=t,Object.freeze(A)}const h=No(sA),Uo=new sA.OrthographicCamera(-1,1,1,-1,0,1);class Go extends sA.BufferGeometry{constructor(){super(),this.setAttribute("position",new sA.Float32BufferAttribute([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new sA.Float32BufferAttribute([0,2,0,0,2,0],2))}}const Ro=new Go;class Ss{constructor(A){this._mesh=new sA.Mesh(Ro,A)}dispose(){this._mesh.geometry.dispose()}render(A){A.render(this._mesh,Uo)}get material(){return this._mesh.material}set material(A){this._mesh.material=A}}var IA=Uint8Array,xt=Uint16Array,Yo=Int32Array,Ms=new IA([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Ds=new IA([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),_o=new IA([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),vs=function(t,A){for(var e=new xt(31),s=0;s<31;++s)e[s]=A+=1<<t[s-1];for(var n=new Yo(e[30]),s=1;s<30;++s)for(var i=e[s];i<e[s+1];++i)n[i]=i-e[s]<<5|s;return{b:e,r:n}},bs=vs(Ms,2),Ts=bs.b,Jo=bs.r;Ts[28]=258,Jo[258]=28;var Lo=vs(Ds,0),Ho=Lo.b,Le=new xt(32768);for(var nA=0;nA<32768;++nA){var tt=(nA&43690)>>1|(nA&21845)<<1;tt=(tt&52428)>>2|(tt&13107)<<2,tt=(tt&61680)>>4|(tt&3855)<<4,Le[nA]=((tt&65280)>>8|(tt&255)<<8)>>1}var zt=function(t,A,e){for(var s=t.length,n=0,i=new xt(A);n<s;++n)t[n]&&++i[t[n]-1];var r=new xt(A);for(n=1;n<A;++n)r[n]=r[n-1]+i[n-1]<<1;var a;if(e){a=new xt(1<<A);var o=15-A;for(n=0;n<s;++n)if(t[n])for(var g=n<<4|t[n],l=A-t[n],c=r[t[n]-1]++<<l,u=c|(1<<l)-1;c<=u;++c)a[Le[c]>>o]=g}else for(a=new xt(s),n=0;n<s;++n)t[n]&&(a[n]=Le[r[t[n]-1]++]>>15-t[n]);return a},te=new IA(288);for(var nA=0;nA<144;++nA)te[nA]=8;for(var nA=144;nA<256;++nA)te[nA]=9;for(var nA=256;nA<280;++nA)te[nA]=7;for(var nA=280;nA<288;++nA)te[nA]=8;var Fs=new IA(32);for(var nA=0;nA<32;++nA)Fs[nA]=5;var zo=zt(te,9,1),qo=zt(Fs,5,1),Ue=function(t){for(var A=t[0],e=1;e<t.length;++e)t[e]>A&&(A=t[e]);return A},JA=function(t,A,e){var s=A/8|0;return(t[s]|t[s+1]<<8)>>(A&7)&e},Ge=function(t,A){var e=A/8|0;return(t[e]|t[e+1]<<8|t[e+2]<<16)>>(A&7)},ks=function(t){return(t+7)/8|0},vt=function(t,A,e){return(A==null||A<0)&&(A=0),(e==null||e>t.length)&&(e=t.length),new IA(t.subarray(A,e))},Ko=["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"],mA=function(t,A,e){var s=new Error(A||Ko[t]);if(s.code=t,Error.captureStackTrace&&Error.captureStackTrace(s,mA),!e)throw s;return s},Ns=function(t,A,e,s){var n=t.length,i=s?s.length:0;if(!n||A.f&&!A.l)return e||new IA(0);var r=!e,a=r||A.i!=2,o=A.i;r&&(e=new IA(n*3));var g=function(wA){var SA=e.length;if(wA>SA){var CA=new IA(Math.max(SA*2,wA));CA.set(e),e=CA}},l=A.f||0,c=A.p||0,u=A.b||0,I=A.l,E=A.d,B=A.m,C=A.n,Q=n*8;do{if(!I){l=JA(t,c,1);var f=JA(t,c+1,3);if(c+=3,f)if(f==1)I=zo,E=qo,B=9,C=5;else if(f==2){var M=JA(t,c,31)+257,x=JA(t,c+10,15)+4,w=M+JA(t,c+5,31)+1;c+=14;for(var m=new IA(w),k=new IA(19),D=0;D<x;++D)k[_o[D]]=JA(t,c+D*3,7);c+=x*3;for(var S=Ue(k),U=(1<<S)-1,T=zt(k,S,1),D=0;D<w;){var b=T[JA(t,c,U)];c+=b&15;var p=b>>4;if(p<16)m[D++]=p;else{var N=0,R=0;for(p==16?(R=3+JA(t,c,3),c+=2,N=m[D-1]):p==17?(R=3+JA(t,c,7),c+=3):p==18&&(R=11+JA(t,c,127),c+=7);R--;)m[D++]=N}}var Z=m.subarray(0,M),J=m.subarray(M);B=Ue(Z),C=Ue(J),I=zt(Z,B,1),E=zt(J,C,1)}else mA(1);else{var p=ks(c)+4,d=t[p-4]|t[p-3]<<8,y=p+d;if(y>n){o&&mA(0);break}a&&g(u+d),e.set(t.subarray(p,y),u),A.b=u+=d,A.p=c=y*8,A.f=l;continue}if(c>Q){o&&mA(0);break}}a&&g(u+131072);for(var eA=(1<<B)-1,q=(1<<C)-1,X=c;;X=c){var N=I[Ge(t,c)&eA],L=N>>4;if(c+=N&15,c>Q){o&&mA(0);break}if(N||mA(2),L<256)e[u++]=L;else if(L==256){X=c,I=null;break}else{var j=L-254;if(L>264){var D=L-257,V=Ms[D];j=JA(t,c,(1<<V)-1)+Ts[D],c+=V}var W=E[Ge(t,c)&q],G=W>>4;W||mA(3),c+=W&15;var J=Ho[G];if(G>3){var V=Ds[G];J+=Ge(t,c)&(1<<V)-1,c+=V}if(c>Q){o&&mA(0);break}a&&g(u+131072);var dA=u+j;if(u<J){var lA=i-J,yA=Math.min(J,dA);for(lA+u<0&&mA(3);u<yA;++u)e[u]=s[lA+u]}for(;u<dA;++u)e[u]=e[u-J]}}A.l=I,A.p=X,A.b=u,A.f=l,I&&(l=1,A.m=B,A.d=E,A.n=C)}while(!l);return u!=e.length&&r?vt(e,0,u):e.subarray(0,u)},$o=new IA(0),KA=function(t,A){return t[A]|t[A+1]<<8},LA=function(t,A){return(t[A]|t[A+1]<<8|t[A+2]<<16|t[A+3]<<24)>>>0},Re=function(t,A){return LA(t,A)+LA(t,A+4)*4294967296},Po=function(t){(t[0]!=31||t[1]!=139||t[2]!=8)&&mA(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)},Ye=function(){function t(A,e){typeof A=="function"&&(e=A,A={}),this.ondata=e;var s=A&&A.dictionary&&A.dictionary.subarray(-32768);this.s={i:0,b:s?s.length:0},this.o=new IA(32768),this.p=new IA(0),s&&this.o.set(s)}return t.prototype.e=function(A){if(this.ondata||mA(5),this.d&&mA(4),!this.p.length)this.p=A;else if(A.length){var e=new IA(this.p.length+A.length);e.set(this.p),e.set(A,this.p.length),this.p=e}},t.prototype.c=function(A){this.s.i=+(this.d=A||!1);var e=this.s.b,s=Ns(this.p,this.s,this.o);this.ondata(vt(s,e,this.s.b),this.d),this.o=vt(s,this.s.b-32768),this.s.b=this.o.length,this.p=vt(this.p,this.s.p/8|0),this.s.p&=7},t.prototype.push=function(A,e){this.e(A),this.c(e)},t}();function Vo(t,A){return Ns(t,{i:2},A&&A.out,A&&A.dictionary)}var Oo=function(){function t(A,e){this.v=1,this.r=0,Ye.call(this,A,e)}return t.prototype.push=function(A,e){if(Ye.prototype.e.call(this,A),this.r+=A.length,this.v){var s=this.p.subarray(this.v-1),n=s.length>3?Po(s):4;if(n>s.length){if(!e)return}else this.v>1&&this.onmember&&this.onmember(this.r-s.length);this.p=s.subarray(n),this.v=0}Ye.prototype.c.call(this,e),this.s.f&&!this.s.l&&!e&&(this.v=ks(this.s.p)+9,this.s={i:0},this.o=new IA(0),this.push(new IA(0),e))},t}(),He=typeof TextDecoder<"u"&&new TextDecoder,Zo=0;try{He.decode($o,{stream:!0}),Zo=1}catch{}var Xo=function(t){for(var A="",e=0;;){var s=t[e++],n=(s>127)+(s>223)+(s>239);if(e+n>t.length)return{s:A,r:vt(t,e-1)};n?n==3?(s=((s&15)<<18|(t[e++]&63)<<12|(t[e++]&63)<<6|t[e++]&63)-65536,A+=String.fromCharCode(55296|s>>10,56320|s&1023)):n&1?A+=String.fromCharCode((s&31)<<6|t[e++]&63):A+=String.fromCharCode((s&15)<<12|(t[e++]&63)<<6|t[e++]&63):A+=String.fromCharCode(s)}};function jo(t,A){if(A){for(var e="",s=0;s<t.length;s+=16384)e+=String.fromCharCode.apply(null,t.subarray(s,s+16384));return e}else{if(He)return He.decode(t);var n=Xo(t),i=n.s,e=n.r;return e.length&&mA(8),i}}var Wo=function(t,A){return A+30+KA(t,A+26)+KA(t,A+28)},Ac=function(t,A,e){var s=KA(t,A+28),n=jo(t.subarray(A+46,A+46+s),!(KA(t,A+8)&2048)),i=A+46+s,r=LA(t,A+20),a=e&&r==4294967295?tc(t,i):[r,LA(t,A+24),LA(t,A+42)],o=a[0],g=a[1],l=a[2];return[KA(t,A+10),o,g,n,i+KA(t,A+30)+KA(t,A+32),l]},tc=function(t,A){for(;KA(t,A)!=1;A+=4+KA(t,A+2));return[Re(t,A+12),Re(t,A+4),Re(t,A+20)]};function ec(t,A){for(var e={},s=t.length-22;LA(t,s)!=101010256;--s)(!s||t.length-s>65558)&&mA(13);var n=KA(t,s+8);if(!n)return{};var i=LA(t,s+16),r=i==4294967295||n==65535;if(r){var a=LA(t,s-12);r=LA(t,a)==101075792,r&&(n=LA(t,a+32),i=LA(t,a+48))}for(var o=A&&A.filter,g=0;g<n;++g){var l=Ac(t,i,r),c=l[0],u=l[1],I=l[2],E=l[3],B=l[4],C=l[5],Q=Wo(t,C);i=B,(!o||o({name:E,size:u,originalSize:I,compression:c}))&&(c?c==8?e[E]=Vo(t.subarray(Q,Q+u),{out:new IA(I)}):mA(14,"unknown compression type "+c):e[E]=vt(t,Q,Q+u))}return e}let XA;const Us=typeof TextDecoder<"u"?new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}):{decode:()=>{throw Error("TextDecoder not available")}};typeof TextDecoder<"u"&&Us.decode();let Jt=null;function sc(){return(Jt===null||Jt.byteLength===0)&&(Jt=new Uint8Array(XA.memory.buffer)),Jt}function nc(t,A){return t=t>>>0,Us.decode(sc().subarray(t,t+A))}function ic(t,A,e,s,n,i,r,a,o,g,l,c,u){return XA.raycast_splats(t,A,e,s,n,i,r,a,o,g,l,c,u)}async function rc(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 ac(){const t={};return t.wbg={},t.wbg.__wbg_buffer_609cc3eee51ed158=function(A){return A.buffer},t.wbg.__wbg_length_3b4f022188ae8db6=function(A){return A.length},t.wbg.__wbg_length_6ca527665d89694d=function(A){return A.length},t.wbg.__wbg_length_8cfd2c6409af88ad=function(A){return A.length},t.wbg.__wbg_new_9fee97a409b32b68=function(A){return new Uint16Array(A)},t.wbg.__wbg_new_e3b321dcfef89fc7=function(A){return new Uint32Array(A)},t.wbg.__wbg_newwithbyteoffsetandlength_e6b7e69acd4c7354=function(A,e,s){return new Float32Array(A,e>>>0,s>>>0)},t.wbg.__wbg_newwithbyteoffsetandlength_f1dead44d1fc7212=function(A,e,s){return new Uint32Array(A,e>>>0,s>>>0)},t.wbg.__wbg_newwithlength_5a5efe313cfd59f1=function(A){return new Float32Array(A>>>0)},t.wbg.__wbg_set_10bad9bee0e9c58b=function(A,e,s){A.set(e,s>>>0)},t.wbg.__wbg_set_d23661d19148b229=function(A,e,s){A.set(e,s>>>0)},t.wbg.__wbg_set_f4f1f0daa30696fc=function(A,e,s){A.set(e,s>>>0)},t.wbg.__wbg_subarray_3aaeec89bb2544f0=function(A,e,s){return A.subarray(e>>>0,s>>>0)},t.wbg.__wbg_subarray_769e1e0f81bb259b=function(A,e,s){return A.subarray(e>>>0,s>>>0)},t.wbg.__wbindgen_init_externref_table=function(){const A=XA.__wbindgen_export_0,e=A.grow(4);A.set(0,void 0),A.set(e+0,void 0),A.set(e+1,null),A.set(e+2,!0),A.set(e+3,!1)},t.wbg.__wbindgen_memory=function(){return XA.memory},t.wbg.__wbindgen_throw=function(A,e){throw new Error(nc(A,e))},t}function oc(t,A){return XA=t.exports,Gs.__wbindgen_wasm_module=A,Jt=null,XA.__wbindgen_start(),XA}async function Gs(t){if(XA!==void 0)return XA;typeof t<"u"&&(Object.getPrototypeOf(t)===Object.prototype?{module_or_path:t}=t:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),typeof t>"u"&&(t=new URL("data:application/wasm;base64,AGFzbQEAAAABzAEeYAJ/fwF/YAJ/fwBgA39/fwF/YAN/f38AYAF/AX9gAX8AYANvf38Bb2AFf39/f38Bf2AFf39/f38AYAFvAW9gA29vfwBgAW8Bf2AAAGAEf39/fwBgAX0BfWAAAX9gBH9/f38Bf2ADf29vAX9gAX8Bb2AAAW9gBn9/f39/fwBgDX19fX19fX19f29/fX0Bb2AGf39/f39/AX9gBX9/fn9/AGAEf35/fwBgBX9/fH9/AGAEf3x/fwBgBX9/fX9/AGAEf31/fwBgAn19AX0C8gQRA3diZx1fX3diZ19idWZmZXJfNjA5Y2MzZWVlNTFlZDE1OAAJA3diZxpfX3diZ19uZXdfOWZlZTk3YTQwOWIzMmI2OAAJA3diZxpfX3diZ19zZXRfZjRmMWYwZGFhMzA2OTZmYwAKA3diZx1fX3diZ19sZW5ndGhfOGNmZDJjNjQwOWFmODhhZAALA3diZzFfX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9mMWRlYWQ0NGQxZmM3MjEyAAYDd2JnGl9fd2JnX25ld19lM2IzMjFkY2ZlZjg5ZmM3AAkDd2JnGl9fd2JnX3NldF9kMjM2NjFkMTkxNDhiMjI5AAoDd2JnHV9fd2JnX2xlbmd0aF82Y2E1Mjc2NjVkODk2OTRkAAsDd2JnMV9fd2JnX25ld3dpdGhieXRlb2Zmc2V0YW5kbGVuZ3RoX2U2YjdlNjlhY2Q0YzczNTQABgN3YmcaX193Ymdfc2V0XzEwYmFkOWJlZTBlOWM1OGIACgN3YmcdX193YmdfbGVuZ3RoXzNiNGYwMjIxODhhZThkYjYACwN3YmcfX193Ymdfc3ViYXJyYXlfNzY5ZTFlMGY4MWJiMjU5YgAGA3diZx9fX3diZ19zdWJhcnJheV8zYWFlZWM4OWJiMjU0NGYwAAYDd2JnJF9fd2JnX25ld3dpdGhsZW5ndGhfNWE1ZWZlMzEzY2ZkNTlmMQASA3diZxBfX3diaW5kZ2VuX3Rocm93AAEDd2JnEV9fd2JpbmRnZW5fbWVtb3J5ABMDd2JnH19fd2JpbmRnZW5faW5pdF9leHRlcm5yZWZfdGFibGUADANjYgQABQcCAwUCDgEBDwEDAQAAAAgMAQMDAQEIBRQBAw0AAQMDAgIAAQEHAxUBAQMWCBcZBxsF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IA8gICAOlJIgGZUiDSANlJJDAACAP14NAQsgBiAOX0UgByAOYEVyDQAgKigCCCIlICooAgBGBEAgKkGQh8AAECgLICogJUEBajYCCCAqKAIEICVBAnRqIA44AgALIAogLEECdGohCiAnICxrIicNAAsLIClBEGokACAmKAIUIgpBhAFPBEAgChArCyAtIicgK0kNAAsMAQsDQCAmICZBBGogJ0ECdCAnQYCABCArICdrIgogCkGAgARPGyIKaiItQQJ0EF82AhQgCkECdCInIC5LDQQgJkEUaiAIICcQMyAmIAI4AiAgJiABOAIcICYgADgCGCAmIAU4AiwgJiAEOAIoICYgAzgCJCAIIQojAEEQayIpJAAgJwRAICZBCGohKiAmQSRqIiUqAgAiGyAblCAlKgIEIhwgHJSSICUqAggiESARlJIhFCAMIAuTQwAAfkOVIQ8gJkEYaiIlKgIIISIgJSoCBCEjICUqAgAhJANAICdBBCAnQQRJIiUbISwCQCAKLQADs0MAAH9DlUPNzMw9XQ0AIClBBGogCiAsEBYCfQJAICVFBEAgKSoCDCEQICkqAgghDiApKgIEIQ1DAAAAACETQwAAAAAhEiAKKAIMIihB/wFxBEAgCyAPIChBAWtB/wFxs5SSEHIhEgsgKEEIdiIlQf8BcQRAIAsgDyAlQQFrQf8BcbOUkhByIRMLICIgEJMhFyAjIA6TIRggJCANkyEQIChBEHYiJUH/AXENAUMAAAAADAILQQMgLEHAh8AAEDIACyALIA8gJUEBa0H/AXGzlJIQcgshDSAbIBCUIBwgGJSSIBEgF5SSIg4gDpQgFCAQIBCUIBggGJSSIBcgF5SSIBIgE5IgDZJDAABAQJUiDSANlJOUkyINQwAAAABdDQAgDowgDZGTIBSVIg0gBmBFIAcgDWBFcg0AICooAggiJSAqKAIARgRAICpBgIfAABAoCyAqICVBAWo2AgggKigCBCAlQQJ0aiANOAIACyAKICxBAnRqIQogJyAsayInDQALCyApQRBqJAAgJigCFCIKQYQBTwRAIAoQKwsgLSInICtJDQALC0GYlcAAKAIAQQFqISUgJigCECEnC0GYlcAAICU2AgAgJxANIQkQHCIIIAkmASAmIAg2AiQgJigCDCEKICYoAhAhKyMAQSBrIiUkACAmQSRqKAIAIgglARAKIScgJSArNgIEICUgJzYCAAJAICcgK0YEQBBWIi0QUiInJQEgCiArEAghCRAcIgogCSYBIC1BhAFPBEAgLRArCyAnQYQBTwRAICcQKwsgCCUBIAolAUEAEAkgCkGEAU8EQCAKECsLICVBIGokAAwBCyAlQQA2AgggJSAlQQRqICVBCGoQOgALICYoAggiCARAICYoAgwgCEECdBBeCyAmKAIEIghBhAFPBEAgCBArCyAmKAIkICZBMGokAAwCCxBvAAsgJyAuQeCGwAAQYQALIgglASAIECsLJwAgACABIAAoAgRBAXFyQQJyNgIEIAAgAWoiACAAKAIEQQFyNgIEC/oBAgJ/AX4jAEEQayICJAAgAkEBOwEMIAIgATYCCCACIAA2AgQjAEEQayIBJAAgAkEEaiIAKQIAIQQgASAANgIMIAEgBDcCBCMAQRBrIgAkACABQQRqIgEoAgAiAigCDCEDAkACQAJAAkAgAigCBA4CAAECCyADDQFBASECQQAhAwwCCyADDQAgAigCACICKAIEIQMgAigCACECDAELIABBgICAgHg2AgAgACABNgIMIABB1I3AACABKAIEIAEoAggiAC0ACCAALQAJECoACyAAIAM2AgQgACACNgIAIABBuI3AACABKAIEIAEoAggiAC0ACCAALQAJECoACyMAIAIgAigCBEF+cTYCBCAAIAFBAXI2AgQgACABaiABNgIACyQAIABFBEBB8InAAEEyEGIACyAAIAIgAyAEIAUgASgCEBEHAAsiACAARQRAQfCJwABBMhBiAAsgACACIAMgBCABKAIQEQ0ACyIAIABFBEBB8InAAEEyEGIACyAAIAIgAyAEIAEoAhARGAALIgAgAEUEQEHwicAAQTIQYgALIAAgAiADIAQgASgCEBEaAAsiACAARQRAQfCJwABBMhBiAAsgACACIAMgBCABKAIQERAACyIAIABFBEBB8InAAEEyEGIACyAAIAIgAyAEIAEoAhARHAALJQEBfyAAKAIAIgFBgICAgHhyQYCAgIB4RwRAIAAoAgQgARBeCwseACAAIAFBA3I2AgQgACABaiIAIAAoAgRBAXI2AgQLIAAgAEUEQEHwicAAQTIQYgALIAAgAiADIAEoAhARAwALHgAgAEUEQEHwicAAQTIQYgALIAAgAiABKAIQEQAAC9QQAQ1/EBwiByAB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QS9qrUKAgICA0ASENwMgIAAgAEEgajYCECAAQQhqQeiFwAAQPQALCAAgACUBEAMLCAAgACUBEAcLBgAgABAZCwuZFAMAQYCAwAALyQ5zcGFyay1pbnRlcm5hbC1ycy9zcmMvcmF5Y2FzdC5ycwBzcGFyay1pbnRlcm5hbC1ycy9zcmMvc29ydC5ycwBsaWJyYXJ5L2FsbG9jL3NyYy9mbXQucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLTAuMi4xMDAvc3JjL2NvbnZlcnQvc2xpY2VzLnJzAC9ydXN0Yy8xMTU5ZTc4YzQ3NDdiMDJlZjk5NmU1NTA4MmI3MDRjMDliOTcwNTg4L2xpYnJhcnkvc3RkL3NyYy90aHJlYWQvbG9jYWwucnMAbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzAC9ydXN0Yy8xMTU5ZTc4YzQ3NDdiMDJlZjk5NmU1NTA4MmI3MDRjMDliOTcwNTg4L2xpYnJhcnkvYWxsb2Mvc3JjL3NsaWNlLnJzAC9ydXN0Yy8xMTU5ZTc4YzQ3NDdiMDJlZjk5NmU1NTA4MmI3MDRjMDliOTcwNTg4L2xpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMvbW9kLnJzAC9ydXN0L2RlcHMvZGxtYWxsb2MtMC4yLjEwL3NyYy9kbG1hbGxvYy5ycwBsaWJyYXJ5L3N0ZC9zcmMvYWxsb2MucnMAc3BhcmstaW50ZXJuYWwtcnMvc3JjL2xpYi5ycwAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9qcy1zeXMtMC4zLjc3L3NyYy9saWIucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvb25jZV9jZWxsLTEuMjEuMy9zcmMvbGliLnJzAADFABAATwAAAC8CAAAmAAAAMQEQAEoAAAC9AQAAHQAAABECEAAcAAAAEQAAAD0AAAARAhAAHAAAAB0AAAAzAAAAEQIQABwAAAAoAAAALQAAAAEAAAAAAAAAEQIQABwAAAA6AAAAMwAAABECEAAcAAAARQAAAC0AAAARAhAAHAAAAF4AAAAoAAAAfAEQAFAAAAAuAgAAEQAAAAAAEAAgAAAAKgAAABcAAAAAABAAIAAAAHgAAAAXAAAAAAAQACAAAAB+AAAAHAAAAAAAEAAgAAAAgAAAABwAAAAAABAAIAAAAIUAAAAgAAAAIQAQAB0AAAAbAAAAHQAAAEV4cGVjdGVkICBhY3RpdmUgc3BsYXRzIGJ1dCBnb3Qg4AMQAAkAAADpAxAAFwAAACEAEAAdAAAAMwAAAB0AAAAhABAAHQAAADMAAAAVAAAAIQAQAB0AAAAkAAAAFAAAACEAEAAdAAAAdAAAABkAAAAhABAAHQAAAKcAAAATAAAAIQAQAB0AAACfAAAAEwAAACEAEAAdAAAAogAAAB0AAAAhABAAHQAAAKIAAAARAAAAIQAQAB0AAACQAAAAIAAAACEAEAAdAAAAkAAAABQAAAAhABAAHQAAAHwAAAAYAAAAIQAQAB0AAAB9AAAAGAAAAC4CEABaAAAA+xgAAAEAAABYABAAbAAAACQBAAAOAAAAY2xvc3VyZSBpbnZva2VkIHJlY3Vyc2l2ZWx5IG9yIGFmdGVyIGJlaW5nIGRyb3BwZWRMYXp5IGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWQiBRAAKgAAAIkCEABdAAAACAMAABkAAAByZWVudHJhbnQgaW5pdAAAZAUQAA4AAACJAhAAXQAAAHoCAAANAAAAbV3L1ixQ62N4QaZXcRuLuQkGZoEB87lUoggvQ4JXdDJ8ARAAUAAAAC4CAAARAAAAEQAAAAwAAAAEAAAAEgAAABMAAAAUAAAAYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPj0gc2l6ZSArIG1pbl9vdmVyaGVhZAAAzQEQACoAAACxBAAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplIDw9IHNpemUgKyBtYXhfb3ZlcmhlYWQAAM0BEAAqAAAAtwQAAA0AAABtZW1vcnkgYWxsb2NhdGlvbiBvZiAgYnl0ZXMgZmFpbGVkAABUBhAAFQAAAGkGEAANAAAA+AEQABgAAABkAQAACQAAABEAAAAMAAAABAAAABUAAAAAAAAACAAAAAQAAAAWAAAAAAAAAAgAAAAEAAAAFwAAABgAAAAZAAAAGgAAABsAAAAQAAAABAAAABwAAAAdAAAAHgAAAB8AAABFcnJvcgAAACAAAAAMAAAABAAAACEAAAAiAAAAIwAAAGNhcGFjaXR5IG92ZXJmbG93AAAAEAcQABEAAACsARAAIAAAAC4CAAARAAAAFQEQABsAAADoAQAAFwBB1I7AAAu0BQEAAAAkAAAAYSBmb3JtYXR0aW5nIHRyYWl0IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yIHdoZW4gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGRpZCBub3QAAD8AEAAYAAAAigIAAA4AAAABAAAAAAAAAFJlZkNlbGwgYWxyZWFkeSBib3Jyb3dlZGluZGV4IG91dCBvZiBib3VuZHM6IHRoZSBsZW4gaXMgIGJ1dCB0aGUgaW5kZXggaXMgAADkBxAAIAAAAAQIEAASAAAAAAAAAAQAAAAEAAAAKQAAAD09IT1tYXRjaGVzYXNzZXJ0aW9uIGBsZWZ0ICByaWdodGAgZmFpbGVkCiAgbGVmdDogCiByaWdodDogAEMIEAAQAAAAUwgQABcAAABqCBAACQAAACByaWdodGAgZmFpbGVkOiAKICBsZWZ0OiAAAABDCBAAEAAAAIwIEAAQAAAAnAgQAAkAAABqCBAACQAAADogAAABAAAAAAAAAMgIEAACAAAAMHgwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OSBvdXQgb2YgcmFuZ2UgZm9yIHNsaWNlIG9mIGxlbmd0aCByYW5nZSBlbmQgaW5kZXggyAkQABAAAACmCRAAIgAAADgIEAA6CBAAPAgQAAIAAAACAAAABwAAAAAAAD8AAAC/AEGglMAACwEPAHwJcHJvZHVjZXJzAghsYW5ndWFnZQEEUnVzdAAMcHJvY2Vzc2VkLWJ5AwVydXN0Yx0xLjkwLjAgKDExNTllNzhjNCAyMDI1LTA5LTE0KQZ3YWxydXMGMC4yMy4zDHdhc20tYmluZGdlbhMwLjIuMTAwICgyNDA1ZWMyYjQpAGsPdGFyZ2V0X2ZlYXR1cmVzBisPbXV0YWJsZS1nbG9iYWxzKxNub250cmFwcGluZy1mcHRvaW50KwtidWxrLW1lbW9yeSsIc2lnbi1leHQrD3JlZmVyZW5jZS10eXBlcysKbXVsdGl2YWx1ZQ==",typeof document>"u"?require("url").pathToFileURL(__filename).href:Ne&&Ne.tagName.toUpperCase()==="SCRIPT"&&Ne.src||new URL("spark.cjs.min.js",document.baseURI).href));const A=ac();(typeof t=="string"||typeof Request=="function"&&t instanceof Request||typeof URL=="function"&&t instanceof URL)&&(t=fetch(t));const{instance:e,module:s}=await rc(await t,A);return oc(e,s)}const kA=-12,NA=9,cc=Math.exp(kA),gc=Math.exp(NA),Rs=-30,Bt=Math.exp(Rs),Xe=11,je=11,Ys=11,lc=Xe+je,O=1<<Xe,$A=1<<je,_s=1<<Ys,We=1,uc=O-1,hc=$A-1,Ic=_s-1,Bc=!0,Cc=!0,Ec=Object.freeze(Object.defineProperty({__proto__:null,LN_SCALE_MAX:NA,LN_SCALE_MIN:kA,LN_SCALE_ZERO:Rs,SCALE_MAX:gc,SCALE_MIN:cc,SCALE_ZERO:Bt,SPLAT_TEX_DEPTH:_s,SPLAT_TEX_DEPTH_BITS:Ys,SPLAT_TEX_DEPTH_MASK:Ic,SPLAT_TEX_HEIGHT:$A,SPLAT_TEX_HEIGHT_BITS:je,SPLAT_TEX_HEIGHT_MASK:hc,SPLAT_TEX_LAYER_BITS:lc,SPLAT_TEX_MIN_HEIGHT:We,SPLAT_TEX_WIDTH:O,SPLAT_TEX_WIDTH_BITS:Xe,SPLAT_TEX_WIDTH_MASK:uc,USE_COMPILED_PARSER_FUNCTION:Cc,WASM_SPLAT_SORT:Bc},Symbol.toStringTag,{value:"Module"}));function dt(t){return t==="bool"||t==="bvec2"||t==="bvec3"||t==="bvec4"}function yt(t){return t==="int"||t==="uint"||t==="float"}function QA(t){return t==="int"||t==="ivec2"||t==="ivec3"||t==="ivec4"}function pA(t){return t==="uint"||t==="uvec2"||t==="uvec3"||t==="uvec4"}function ee(t){return t==="float"||t==="vec2"||t==="vec3"||t==="vec4"}function Js(t){return t==="mat2"||t==="mat2x2"||t==="mat2x3"||t==="mat2x4"||t==="mat3"||t==="mat3x2"||t==="mat3x3"||t==="mat3x4"||t==="mat4"||t==="mat4x2"||t==="mat4x3"||t==="mat4x4"}function ot(t){return ee(t)||Js(t)}function Nt(t){return t==="vec2"||t==="ivec2"||t==="uvec2"}function Ut(t){return t==="vec3"||t==="ivec3"||t==="uvec3"}function se(t){return t==="vec4"||t==="ivec4"||t==="uvec4"}function Qc(t){return Nt(t)||Ut(t)||se(t)}function gt(t){return t==="mat2"||t==="mat2x2"}function lt(t){return t==="mat3"||t==="mat3x3"}function ut(t){return t==="mat4"||t==="mat4x4"}function Ls(t){switch(t){case"vec2":return"float";case"vec3":return"float";case"vec4":return"float";case"ivec2":return"int";case"ivec3":return"int";case"ivec4":return"int";case"uvec2":return"uint";case"uvec3":return"uint";case"uvec4":return"uint";default:throw new Error(`Invalid vector type: ${t}`)}}function Hs(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 pc(t){if(yt(t))return"float";if(Nt(t))return"vec2";if(Ut(t))return"vec3";if(se(t))return"vec4";throw new Error(`Invalid vector type: ${t}`)}function zs(t){if(yt(t))return"uint";if(Nt(t))return"uvec2";if(Ut(t))return"uvec3";if(se(t))return"uvec4";throw new Error(`Invalid vector type: ${t}`)}function fc(t){if(yt(t))return"int";if(Nt(t))return"ivec2";if(Ut(t))return"ivec3";if(se(t))return"ivec4";throw new Error(`Invalid vector type: ${t}`)}function qs(t){if(typeof t=="string")return t;if(typeof t=="object"&&t.type)return t.type;throw new Error(`Invalid DynoType: ${String(t)}`)}function aA(t){return Math.trunc(t).toString()}function oA(t){return`${Math.max(0,Math.trunc(t)).toString()}u`}function z(t){return t===Number.POSITIVE_INFINITY?"INFINITY":t===Number.NEGATIVE_INFINITY?"-INFINITY":Number.isInteger(t)?t.toFixed(1):t.toString()}function $(t){return t instanceof it?t.type:t.dynoOut().type}class it{constructor(A){this.__isDynoValue=!0,this.type=A}}class K extends it{constructor(A,e){super(A.outTypes[e]),this.dyno=A,this.key=e}}class bt extends it{constructor(A,e){super(A),this.literal=e}getLiteral(){return this.literal}}function Ie(t,A){return new bt(t,A)}class Ks extends bt{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 oA(e);case"int":return aA(e);case"float":return z(e);case"bvec2":{const s=e;return`bvec2(${s[0]}, ${s[1]})`}case"uvec2":{if(e instanceof h.Vector2)return`uvec2(${oA(e.x)}, ${oA(e.y)})`;const s=e;return`uvec2(${oA(s[0])}, ${oA(s[1])})`}case"ivec2":{if(e instanceof h.Vector2)return`ivec2(${aA(e.x)}, ${aA(e.y)})`;const s=e;return`ivec2(${aA(s[0])}, ${aA(s[1])})`}case"vec2":{if(e instanceof h.Vector2)return`vec2(${z(e.x)}, ${z(e.y)})`;const s=e;return`vec2(${z(s[0])}, ${z(s[1])})`}case"bvec3":{const s=e;return`bvec3(${s[0]}, ${s[1]}, ${s[2]})`}case"uvec3":{if(e instanceof h.Vector3)return`uvec3(${oA(e.x)}, ${oA(e.y)}, ${oA(e.z)})`;const s=e;return`uvec3(${oA(s[0])}, ${oA(s[1])}, ${oA(s[2])})`}case"ivec3":{if(e instanceof h.Vector3)return`ivec3(${aA(e.x)}, ${aA(e.y)}, ${aA(e.z)})`;const s=e;return`ivec3(${aA(s[0])}, ${aA(s[1])}, ${aA(s[2])})`}case"vec3":{if(e instanceof h.Vector3)return`vec3(${z(e.x)}, ${z(e.y)}, ${z(e.z)})`;const s=e;return`vec3(${z(s[0])}, ${z(s[1])}, ${z(s[2])})`}case"bvec4":{const s=e;return`bvec4(${s[0]}, ${s[1]}, ${s[2]}, ${s[3]})`}case"uvec4":{if(e instanceof h.Vector4)return`uvec4(${oA(e.x)}, ${oA(e.y)}, ${oA(e.z)}, ${oA(e.w)})`;const s=e;return`uvec4(${oA(s[0])}, ${oA(s[1])}, ${oA(s[2])}, ${oA(s[3])})`}case"ivec4":{if(e instanceof h.Vector4)return`ivec4(${aA(e.x)}, ${aA(e.y)}, ${aA(e.z)}, ${aA(e.w)})`;const s=e;return`ivec4(${aA(s[0])}, ${aA(s[1])}, ${aA(s[2])}, ${aA(s[3])})`}case"vec4":{if(e instanceof h.Vector4)return`vec4(${z(e.x)}, ${z(e.y)}, ${z(e.z)}, ${z(e.w)})`;if(e instanceof h.Quaternion)return`vec4(${z(e.x)}, ${z(e.y)}, ${z(e.z)}, ${z(e.w)})`;const s=e;return`vec4(${z(s[0])}, ${z(s[1])}, ${z(s[2])}, ${z(s[3])})`}case"mat2":case"mat2x2":{const s=e,n=s instanceof h.Matrix2?s.elements:e,i=new Array(4).fill(0).map((r,a)=>z(n[a]));return`${A}(${i.join(", ")})`}case"mat2x3":{const s=e,n=new Array(6).fill(0).map((i,r)=>z(s[r]));return`${A}(${n.join(", ")})`}case"mat2x4":{const s=e,n=new Array(8).fill(0).map((i,r)=>z(s[r]));return`${A}(${n.join(", ")})`}case"mat3":case"mat3x3":{const s=e,n=s instanceof h.Matrix3?s.elements:e,i=new Array(9).fill(0).map((r,a)=>z(n[a]));return`${A}(${i.join(", ")})`}case"mat3x2":{const s=e,n=new Array(6).fill(0).map((i,r)=>z(s[r]));return`${A}(${n.join(", ")})`}case"mat3x4":{const s=e,n=new Array(12).fill(0).map((i,r)=>z(s[r]));return`${A}(${n.join(", ")})`}case"mat4":case"mat4x4":{const s=e,n=s instanceof h.Matrix4?s.elements:e,i=new Array(16).fill(0).map((r,a)=>z(n[a]));return`${A}(${i.join(", ")})`}case"mat4x2":{const s=e,n=new Array(8).fill(0).map((i,r)=>z(s[r]));return`${A}(${n.join(", ")})`}case"mat4x3":{const s=e,n=new Array(12).fill(0).map((i,r)=>z(s[r]));return`${A}(${n.join(", ")})`}default:throw new Error(`Type not implemented: ${String(A)}`)}}}function _(t,A){return new Ks(t,A)}function Lt(t){const A=String(t);if(dt(t))return`${A}(false)`;if(ot(t))return`${A}(0.0)`;if(QA(t))return`${A}(0)`;if(pA(t))return`${A}(0u)`;throw new Error(`Type not implemented: ${A}`)}function dc(t){const A=String(t);if(dt(t))return`${A}(true)`;if(ot(t))return`${A}(1.0)`;if(QA(t))return`${A}(1)`;if(pA(t))return`${A}(1u)`;throw new Error(`Type not implemented: ${A}`)}function yc(t){const A=String(t);if(dt(t))return`${A}(true)`;if(ot(t))return`${A}(-1.0)`;if(QA(t))return`${A}(-1)`;if(pA(t))return`${A}(0xFFFFFFFFu)`;throw new Error(`Type not implemented: ${A}`)}const Es=" ";class $s{constructor({indent:A}={}){this.globals=new Set,this.statements=[],this.uniforms={},this.declares=new Set,this.updaters=[],this.sequence=0,this.indent=Es,this.indent=A??Es}nextSequence(){return this.sequence++}}class P{constructor({inTypes:A,outTypes:e,inputs:s,update:n,globals:i,statements:r,generate:a}){this.inTypes=A??{},this.outTypes=e??{},this.inputs=s??{},this.update=n,this.globals=i,this.statements=r,this.generate=a??(({inputs:o,outputs:g,compile:l})=>{var c,u;return{globals:(c=this.globals)==null?void 0:c.call(this,{inputs:o,outputs:g,compile:l}),statements:(u=this.statements)==null?void 0:u.call(this,{inputs:o,outputs:g,compile:l})}})}get outputs(){const A={};for(const e in this.outTypes)A[e]=new K(this,e);return A}apply(A){return Object.assign(this.inputs,A),this.outputs}compile({inputs:A,outputs:e,compile:s}){const n=[`// ${this.constructor.name}(${Object.values(A).join(", ")}) => (${Object.values(e).join(", ")})`],i=[];for(const g in e){const l=e[g];l&&!s.declares.has(l)&&(s.declares.add(l),i.push(g))}const{globals:r,statements:a,uniforms:o}=this.generate({inputs:A,outputs:e,compile:s});for(const g of r??[])s.globals.add(g);for(const g in o)s.uniforms[g]=o[g];this.update&&s.updaters.push(this.update);for(const g of i){const l=e[g];l&&(s.uniforms[l]||n.push(`${As(l,this.outTypes[g])};`))}return a!=null&&a.length&&(n.push("{"),n.push(...a.map(g=>s.indent+g)),n.push("}")),n}}class VA extends P{constructor({inTypes:A,outTypes:e,inputs:s,update:n,globals:i,construct:r}){super({inTypes:A,outTypes:e,inputs:s,update:n,globals:i,generate:a=>this.generateBlock(a)}),this.construct=r}generateBlock({inputs:A,outputs:e,compile:s}){var E,B;const n={},i={};for(const C in A)A[C]!=null&&(n[C]=new bt(this.inTypes[C],A[C]));for(const C in e)e[C]!=null&&(i[C]=new it(this.outTypes[C]));const r={roots:[]},a=this.construct(n,i,r);for(const C of((E=this.globals)==null?void 0:E.call(this,{inputs:A,outputs:e,compile:s}))??[])s.globals.add(C);const o=[],g=new Map;function l(C,Q,f){let p=g.get(C);if(!p){p={sequence:s.nextSequence(),outNames:new Map,newOuts:new Set},g.set(C,p);for(const d in C.inputs){let y=C.inputs[d];for(;y;){if(y instanceof it){y instanceof K&&l(y.dyno,y.key);break}y=y.dynoOut()}}o.push(C)}Q&&(f||p.newOuts.add(Q),p.outNames.set(Q,f??`${Q}_${p.sequence}`))}for(const C of r.roots)l(C);for(const C in i){let Q=(a==null?void 0:a[C])??i[C];for(;Q;){if(Q instanceof it){Q instanceof K&&l(Q.dyno,Q.key,e[C]);break}Q=Q.dynoOut()}i[C]=Q}const c=[];for(const C of o){const Q={},f={};for(const y in C.inputs){let M=C.inputs[y];for(;M;){if(M instanceof it){if(M instanceof bt)Q[y]=M.getLiteral();else if(M instanceof K){const x=(B=g.get(M.dyno))==null?void 0:B.outNames.get(M.key);if(!x)throw new Error(`Source not found for ${M.dyno.constructor.name}.${M.key}`);Q[y]=x}break}M=M.dynoOut()}}const p=g.get(C)??{outNames:new Map};for(const[y,M]of p.outNames.entries())f[y]=M;const d=C.compile({inputs:Q,outputs:f,compile:s});c.push(d)}const u=[];for(const C in e)i[C]instanceof bt&&u.push(`${e[C]} = ${i[C].getLiteral()};`);return u.length>0&&c.push(u),{statements:c.flatMap((C,Q)=>Q===0?C:["",...C])}}}function TA(t,A,e,{update:s,globals:n}={}){return new VA({inTypes:t,outTypes:A,construct:e,update:s,globals:n})}function ne({inTypes:t,outTypes:A,inputs:e,update:s,globals:n,statements:i,generate:r}){return new P({inTypes:t,outTypes:A,inputs:e,update:s,globals:n,statements:i,generate:r})}function As(t,A,e){const s=typeof A=="string"?A:A.type;if(!s)throw new Error(`Invalid DynoType: ${String(A)}`);return`${s} ${t}${e!=null?`[${e}]`:""}`}function YA(t){var i;let A=!1;const e=t.split(`
|
|
`).map(r=>{const a=r.trimEnd();return A?a:a.length>0?(A=!0,a):null}).filter(r=>r!=null);for(;e.length>0&&e[e.length-1].length===0;)e.pop();if(e.length===0)return[];const s=(i=e[0].match(/^\s*/))==null?void 0:i[0];if(!s)return e;const n=new RegExp(`^${s}`);return e.map(r=>r.replace(n,""))}function BA(t){return YA(t).join(`
|
|
`)}class v extends P{constructor({a:A,outKey:e,outTypeFunc:s}){const n={a:$(A)},i=s($(A)),r={[e]:i};super({inTypes:n,outTypes:r,inputs:{a:A}}),this.outKey=e}dynoOut(){return new K(this,this.outKey)}}class tA extends P{constructor({a:A,b:e,outKey:s,outTypeFunc:n}){const i={a:$(A),b:$(e)},r=n($(A),$(e)),a={[s]:r};super({inTypes:i,outTypes:a,inputs:{a:A,b:e}}),this.outKey=s}dynoOut(){return new K(this,this.outKey)}}class wt extends P{constructor({a:A,b:e,c:s,outKey:n,outTypeFunc:i}){const r={a:$(A),b:$(e),c:$(s)},a=i($(A),$(e),$(s)),o={[n]:a};super({inTypes:r,outTypes:o,inputs:{a:A,b:e,c:s}}),this.outKey=n}dynoOut(){return new K(this,this.outKey)}}const AA={type:"Gsplat"},ie={type:"PackedSplats"},wc=t=>new Vs({packedSplats:t}),Tt=(t,A)=>new Zs({packedSplats:t,index:A}),Ps=(t,A,e,s)=>new Xs({packedSplats:t,index:A,base:e,count:s}),Ct=t=>new js({gsplat:t}),rt=({gsplat:t,flags:A,index:e,center:s,scales:n,quaternion:i,rgba:r,rgb:a,opacity:o,x:g,y:l,z:c,r:u,g:I,b:E})=>new Ws({gsplat:t,flags:A,index:e,center:s,scales:n,quaternion:i,rgba:r,rgb:a,opacity:o,x:g,y:l,z:c,r:u,g:I,b:E}),ze=t=>new tn({gsplat:t}),ts=(t,{scale:A,rotate:e,translate:s,recolor:n})=>new en({gsplat:t,scale:A,rotate:e,translate:s,recolor:n}),FA=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;
|
|
}
|
|
`),me=BA(`
|
|
struct PackedSplats {
|
|
usampler2DArray texture;
|
|
int numSplats;
|
|
vec4 rgbMinMaxLnScaleMinMax;
|
|
};
|
|
`);class Vs extends v{constructor({packedSplats:A}){super({a:A,outKey:"numSplats",outTypeFunc:()=>"int"}),this.statements=({inputs:e,outputs:s})=>[`${s.numSplats} = ${e.a}.numSplats;`]}}const Os=BA(`
|
|
bool readPackedSplat(usampler2DArray texture, int numSplats, vec4 rgbMinMaxLnScaleMinMax, int index, out Gsplat gsplat) {
|
|
if ((index >= 0) && (index < numSplats)) {
|
|
uvec4 packed = texelFetch(texture, splatTexCoord(index), 0);
|
|
unpackSplatEncoding(packed, gsplat.center, gsplat.scales, gsplat.quaternion, gsplat.rgba, rgbMinMaxLnScaleMinMax);
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
`);class Zs extends P{constructor({packedSplats:A,index:e}){super({inTypes:{packedSplats:ie,index:"int"},outTypes:{gsplat:AA},inputs:{packedSplats:A,index:e},globals:()=>[FA,me,Os],statements:({inputs:s,outputs:n})=>{const{gsplat:i}=n;if(!i)return[];const{packedSplats:r,index:a}=s;let o;return r&&a?o=YA(`
|
|
if (readPackedSplat(${r}.texture, ${r}.numSplats, ${r}.rgbMinMaxLnScaleMinMax, ${a}, ${i})) {
|
|
bool zeroSize = all(equal(${i}.scales, vec3(0.0, 0.0, 0.0)));
|
|
${i}.flags = zeroSize ? 0u : GSPLAT_FLAG_ACTIVE;
|
|
} else {
|
|
${i}.flags = 0u;
|
|
}
|
|
`):o=[`${i}.flags = 0u;`],o.push(`${i}.index = ${a??"0"};`),o}})}dynoOut(){return new K(this,"gsplat")}}class Xs extends P{constructor({packedSplats:A,index:e,base:s,count:n}){super({inTypes:{packedSplats:ie,index:"int",base:"int",count:"int"},outTypes:{gsplat:AA},inputs:{packedSplats:A,index:e,base:s,count:n},globals:()=>[FA,me,Os],statements:({inputs:i,outputs:r})=>{const{gsplat:a}=r;if(!a)return[];const{packedSplats:o,index:g,base:l,count:c}=i;let u;return o&&g&&l&&c?u=YA(`
|
|
${a}.flags = 0u;
|
|
if ((${g} >= ${l}) && (${g} < (${l} + ${c}))) {
|
|
if (readPackedSplat(${o}.texture, ${o}.numSplats, ${o}.rgbMinMaxLnScaleMinMax, ${g}, ${a})) {
|
|
bool zeroSize = all(equal(${a}.scales, vec3(0.0, 0.0, 0.0)));
|
|
${a}.flags = zeroSize ? 0u : GSPLAT_FLAG_ACTIVE;
|
|
}
|
|
}
|
|
`):u=[`${a}.flags = 0u;`],u.push(`${a}.index = ${g??"0"};`),u}})}dynoOut(){return new K(this,"gsplat")}}class js extends P{constructor({gsplat:A}){super({inTypes:{gsplat:AA},outTypes:{flags:"uint",active:"bool",index:"int",center:"vec3",scales:"vec3",quaternion:"vec4",rgba:"vec4",rgb:"vec3",opacity:"float",x:"float",y:"float",z:"float",r:"float",g:"float",b:"float"},inputs:{gsplat:A},globals:()=>[FA],statements:({inputs:e,outputs:s})=>{const{gsplat:n}=e,{flags:i,active:r,index:a,center:o,scales:g,quaternion:l,rgba:c,rgb:u,opacity:I,x:E,y:B,z:C,r:Q,g:f,b:p}=s;return[i?`${i} = ${n?`${n}.flags`:"0u"};`:null,r?`${r} = isGsplatActive(${n?`${n}.flags`:"0u"});`:null,a?`${a} = ${n?`${n}.index`:"0"};`:null,o?`${o} = ${n?`${n}.center`:"vec3(0.0, 0.0, 0.0)"};`:null,g?`${g} = ${n?`${n}.scales`:"vec3(0.0, 0.0, 0.0)"};`:null,l?`${l} = ${n?`${n}.quaternion`:"vec4(0.0, 0.0, 0.0, 1.0)"};`:null,c?`${c} = ${n?`${n}.rgba`:"vec4(0.0, 0.0, 0.0, 0.0)"};`:null,u?`${u} = ${n?`${n}.rgba.rgb`:"vec3(0.0, 0.0, 0.0)"};`:null,I?`${I} = ${n?`${n}.rgba.a`:"0.0"};`:null,E?`${E} = ${n?`${n}.center.x`:"0.0"};`:null,B?`${B} = ${n?`${n}.center.y`:"0.0"};`:null,C?`${C} = ${n?`${n}.center.z`:"0.0"};`:null,Q?`${Q} = ${n?`${n}.rgba.r`:"0.0"};`:null,f?`${f} = ${n?`${n}.rgba.g`:"0.0"};`:null,p?`${p} = ${n?`${n}.rgba.b`:"0.0"};`:null].filter(Boolean)}})}}class Ws extends P{constructor({gsplat:A,flags:e,index:s,center:n,scales:i,quaternion:r,rgba:a,rgb:o,opacity:g,x:l,y:c,z:u,r:I,g:E,b:B}){super({inTypes:{gsplat:AA,flags:"uint",index:"int",center:"vec3",scales:"vec3",quaternion:"vec4",rgba:"vec4",rgb:"vec3",opacity:"float",x:"float",y:"float",z:"float",r:"float",g:"float",b:"float"},outTypes:{gsplat:AA},inputs:{gsplat:A,flags:e,index:s,center:n,scales:i,quaternion:r,rgba:a,rgb:o,opacity:g,x:l,y:c,z:u,r:I,g:E,b:B},globals:()=>[FA],statements:({inputs:C,outputs:Q})=>{const{gsplat:f}=Q;if(!f)return[];const{gsplat:p,flags:d,index:y,center:M,scales:x,quaternion:w,rgba:m,rgb:k,opacity:D,x:S,y:U,z:T,r:b,g:N,b:R}=C;return[`${f}.flags = ${d??(p?`${p}.flags`:"0u")};`,`${f}.index = ${y??(p?`${p}.index`:"0")};`,`${f}.center = ${M??(p?`${p}.center`:"vec3(0.0, 0.0, 0.0)")};`,`${f}.scales = ${x??(p?`${p}.scales`:"vec3(0.0, 0.0, 0.0)")};`,`${f}.quaternion = ${w??(p?`${p}.quaternion`:"vec4(0.0, 0.0, 0.0, 1.0)")};`,`${f}.rgba = ${m??(p?`${p}.rgba`:"vec4(0.0, 0.0, 0.0, 0.0)")};`,k?`${f}.rgba.rgb = ${k};`:null,D?`${f}.rgba.a = ${D};`:null,S?`${f}.center.x = ${S};`:null,U?`${f}.center.y = ${U};`:null,T?`${f}.center.z = ${T};`:null,b?`${f}.rgba.r = ${b};`:null,N?`${f}.rgba.g = ${N};`:null,R?`${f}.rgba.b = ${R};`:null].filter(Boolean)}})}dynoOut(){return new K(this,"gsplat")}}const An=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 tn extends v{constructor({gsplat:A}){super({a:A,outKey:"normal",outTypeFunc:()=>"vec3"}),this.globals=()=>[FA,An],this.statements=({inputs:e,outputs:s})=>[`${s.normal} = gsplatNormal(${e.a}.scales, ${e.a}.quaternion);`]}}class en extends P{constructor({gsplat:A,scale:e,rotate:s,translate:n,recolor:i}){super({inTypes:{gsplat:AA,scale:"float",rotate:"vec4",translate:"vec3",recolor:"vec4"},outTypes:{gsplat:AA},inputs:{gsplat:A,scale:e,rotate:s,translate:n,recolor:i},globals:()=>[FA],statements:({inputs:r,outputs:a,compile:o})=>{const{gsplat:g}=a;if(!g||!r.gsplat)return[];const{scale:l,rotate:c,translate:u,recolor:I}=r,E=o.indent;return[`${g} = ${r.gsplat};`,`if (isGsplatActive(${g}.flags)) {`,l?`${E}${g}.center *= ${l};`:null,c?`${E}${g}.center = quatVec(${c}, ${g}.center);`:null,u?`${E}${g}.center += ${u};`:null,l?`${E}${g}.scales *= ${l};`:null,c?`${E}${g}.quaternion = quatQuat(${c}, ${g}.quaternion);`:null,I?`${E}${g}.rgba *= ${I};`:null,"}"].filter(Boolean)}})}dynoOut(){return new K(this,"gsplat")}}const sn=(t,A)=>new nn({gsplat:t,rgbMinMaxLnScaleMinMax:A}),mc=t=>new es({rgba8:t});class nn extends P{constructor({gsplat:A,rgbMinMaxLnScaleMinMax:e}){super({inTypes:{gsplat:AA,rgbMinMaxLnScaleMinMax:"vec4"},inputs:{gsplat:A,rgbMinMaxLnScaleMinMax:e},globals:()=>[FA],statements:({inputs:s,outputs:n})=>{const{output:i}=n;if(!i)return[];const{gsplat:r,rgbMinMaxLnScaleMinMax:a}=s;return r?YA(`
|
|
if (isGsplatActive(${r}.flags)) {
|
|
${i} = packSplatEncoding(${r}.center, ${r}.scales, ${r}.quaternion, ${r}.rgba, ${a});
|
|
} else {
|
|
${i} = uvec4(0u, 0u, 0u, 0u);
|
|
}
|
|
`):[`${i} = uvec4(0u, 0u, 0u, 0u);`]}})}dynoOut(){return new K(this,"output")}}class es extends P{constructor({rgba8:A}){super({inTypes:{rgba8:"vec4"},inputs:{rgba8:A},statements:({inputs:e,outputs:s})=>[`target = ${e.rgba8??"vec4(0.0, 0.0, 0.0, 0.0)"};`]})}dynoOut(){return new K(this,"rgba8")}}const xc=(t,A,e)=>new F({key:t,type:A,value:e}),Sc=(t=!1,A)=>new Be({key:A,value:t}),Mc=(t=0,A)=>new rn({key:A,value:t}),Dc=(t=0,A)=>new Ot({key:A,value:t}),qA=(t=0,A)=>new Et({key:A,value:t}),vc=(t,A)=>new an({key:A,value:t}),bc=(t,A)=>new on({key:A,value:t}),Tc=(t,A)=>new cn({key:A,value:t}),Fc=(t,A)=>new qt({key:A,value:t}),kc=(t,A)=>new gn({key:A,value:t}),Nc=(t,A)=>new ln({key:A,value:t}),Uc=(t,A)=>new un({key:A,value:t}),et=(t,A)=>new Ft({key:A,value:t}),Gc=(t,A)=>new hn({key:A,value:t}),Rc=(t,A)=>new In({key:A,value:t}),Yc=(t,A)=>new Bn({key:A,value:t}),_c=(t,A)=>new Gt({key:A,value:t}),Jc=(t,A)=>new Cn({key:A,value:t}),Lc=(t,A)=>new En({key:A,value:t}),Hc=(t,A)=>new Qn({key:A,value:t}),zc=(t,A)=>new pn({key:A,value:t}),qc=(t,A)=>new fn({key:A,value:t}),Kc=(t,A)=>new dn({key:A,value:t}),$c=(t,A)=>new yn({key:A,value:t}),Pc=(t,A)=>new wn({key:A,value:t}),Vc=(t,A)=>new mn({key:A,value:t}),Oc=(t,A)=>new xn({key:A,value:t}),Zc=(t,A)=>new Sn({key:A,value:t}),Xc=(t,A)=>new Mn({key:A,value:t}),jc=(t,A)=>new Dn({key:A,value:t}),Wc=(t,A)=>new vn({key:A,value:t}),Ag=(t,A)=>new bn({key:A,value:t}),tg=(t,A)=>new Kt({key:A,value:t}),eg=(t,A)=>new Tn({key:t,value:A}),sg=(t,A)=>new Fn({key:A,value:t}),ng=(t,A)=>new kn({key:A,value:t}),ig=(t,A)=>new Nn({key:A,value:t}),rg=(t,A)=>new Un({key:A,value:t}),ag=(t,A)=>new Gn({key:A,value:t}),og=(t,A)=>new Rn({key:A,value:t}),cg=(t,A)=>new Yn({key:A,value:t}),gg=(t,A)=>new _n({key:A,value:t}),lg=(t,A)=>new Jn({key:A,value:t}),ug=(t,A)=>new Ln({key:A,value:t});class F extends P{constructor({key:A,type:e,count:s,value:n,update:i,globals:r}){A=A??"value",super({outTypes:{[A]:e},update:()=>{if(i){const a=i(this.value);a!==void 0&&(this.value=a)}this.uniform.value=this.value},generate:({inputs:a,outputs:o})=>{const g=(r==null?void 0:r({inputs:a,outputs:o}))??[],l={},c=o[A];return c&&(g.push(`uniform ${As(c,e,s)};`),l[c]=this.uniform),{globals:g,uniforms:l}}}),this.type=e,this.count=s,this.value=n,this.uniform={value:n},this.outKey=A}dynoOut(){return new K(this,this.outKey)}}class Be extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"bool",value:e,update:s})}}class rn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"uint",value:e,update:s})}}class Ot extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"int",value:e,update:s})}}class Et extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"float",value:e,update:s})}}class an extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"bvec2",value:e,update:s})}}class on extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"uvec2",value:e,update:s})}}class cn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"ivec2",value:e,update:s})}}class qt extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"vec2",value:e,update:s})}}class gn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"bvec3",value:e,update:s})}}class ln extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"uvec3",value:e,update:s})}}class un extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"ivec3",value:e,update:s})}}class Ft extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"vec3",value:e,update:s})}}class hn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"bvec4",value:e,update:s})}}class In extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"uvec4",value:e,update:s})}}class Bn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"ivec4",value:e,update:s})}}class Gt extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"vec4",value:e,update:s})}}class Cn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"mat2",value:e,update:s})}}class En extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"mat2x2",value:e,update:s})}}class Qn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"mat2x3",value:e,update:s})}}class pn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"mat2x4",value:e,update:s})}}class fn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"mat3",value:e,update:s})}}class dn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"mat3x2",value:e,update:s})}}class yn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"mat3x3",value:e,update:s})}}class wn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"mat3x4",value:e,update:s})}}class mn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"mat4",value:e,update:s})}}class xn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"mat4x2",value:e,update:s})}}class Sn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"mat4x3",value:e,update:s})}}class Mn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"mat4x4",value:e,update:s})}}class Dn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"usampler2D",value:e,update:s})}}class vn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"isampler2D",value:e,update:s})}}class bn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"sampler2D",value:e,update:s})}}class Kt extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"usampler2DArray",value:e,update:s})}}class Tn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"isampler2DArray",value:e,update:s})}}class Fn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"sampler2DArray",value:e,update:s})}}class kn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"usampler3D",value:e,update:s})}}class Nn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"isampler3D",value:e,update:s})}}class Un extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"sampler3D",value:e,update:s})}}class Gn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"usamplerCube",value:e,update:s})}}class Rn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"isamplerCube",value:e,update:s})}}class Yn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"samplerCube",value:e,update:s})}}class _n extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"sampler2DShadow",value:e,update:s})}}class Jn extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"sampler2DArrayShadow",value:e,update:s})}}class Ln extends F{constructor({key:A,value:e,update:s}){super({key:A,type:"samplerCubeShadow",value:e,update:s})}}const re=new Float32Array(1),xe=new Uint32Array(re.buffer),ss="Float16Array"in globalThis,$t=ss?new globalThis.Float16Array(1):null,Hn=new Uint16Array($t==null?void 0:$t.buffer);function zn(t){const A=Math.sqrt(t.reduce((e,s)=>e+s*s,0));return t.map(e=>e/A)}function hg(t){return re[0]=t,xe[0]}function Ig(t){return xe[0]=t,re[0]}const at=ss?Bg:Cg,fA=ss?Eg:Qg;function Bg(t){return $t[0]=t,Hn[0]}function Cg(t){re[0]=t;const A=xe[0],e=A>>31&1,s=A>>23&255,n=A&8388607,i=e<<15;if(s===255)return n!==0?i|32767:i|31744;const r=s-127+15;if(r>=31)return i|31744;if(r<=0){if(r<-10)return i;const o=(n|8388608)>>1-r+13;return i|o}const a=n>>13;return i|r<<10|a}function Eg(t){return Hn[0]=t,$t[0]}function Qg(t){const A=t>>15&1,e=t>>10&31,s=t&1023;let n;if(e===0)if(s===0)n=A<<31;else{let i=s,r=-14;for(;(i&1024)===0;)i<<=1,r--;i&=1023;const a=r+127,o=i<<13;n=A<<31|a<<23|o}else if(e===31)s===0?n=A<<31|2139095040:n=A<<31|2143289344;else{const i=e-15+127,r=s<<13;n=A<<31|i<<23|r}return xe[0]=n,re[0]}function bA(t){return Math.max(0,Math.min(255,Math.round(t*255)))}function Pt(t){return Math.max(-127,Math.min(127,Math.round(t*127)))}function qn(t){return t/255}function Kn(t){return t/127}class pg{constructor({asyncFetch:A,maxItems:e=5}){this.asyncFetch=A,this.maxItems=e,this.items=[]}async getFetch(A){const e=this.items.findIndex(n=>n.key===A);if(e>=0){const n=this.items.splice(e,1)[0];return this.items.push(n),n.data}const s=await this.asyncFetch(A);for(this.items.push({key:A,data:s});this.items.length>this.maxItems;)this.items.shift();return s}}function fg(t,A){const e=Object.entries(t).map(([s,n])=>[s,A(n,s)]);return Object.fromEntries(e)}function dg(t,A){const e=Object.entries(t).map(([s,n])=>[s,A(n,s)]).filter(([s,n])=>n!==void 0);return Object.fromEntries(e)}function $n(t){const A=[],e=new Set;function s(n){n&&typeof n=="object"&&!e.has(n)&&(e.add(n),n instanceof ArrayBuffer?A.push(n):ArrayBuffer.isView(n)?A.push(n.buffer):Array.isArray(n)?n.forEach(s):Object.values(n).forEach(s))}return s(t),A}function yg(t,A){return new Array(t).fill(null).map((e,s)=>A(s))}class Pn{constructor({allocate:A,dispose:e,valid:s}){this.items=[],this.allocate=A,this.dispose=e,this.valid=s}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 Ce(t,A,e,s,n,i,r,a,o,g,l,c,u,I,E,B,C){const Q=(C==null?void 0:C.rgbMin)??0,p=((C==null?void 0:C.rgbMax)??1)-Q,d=bA((I-Q)/p),y=bA((E-Q)/p),M=bA((B-Q)/p),x=bA(u),w=ns(Vn.set(o,g,l,c)),m=w&255,k=w>>>8&255,D=w>>>16&255,S=(C==null?void 0:C.lnScaleMin)??kA,T=254/(((C==null?void 0:C.lnScaleMax)??NA)-S),b=i<Bt?0:Math.min(255,Math.max(1,Math.round((Math.log(i)-S)*T)+1)),N=r<Bt?0:Math.min(255,Math.max(1,Math.round((Math.log(r)-S)*T)+1)),R=a<Bt?0:Math.min(255,Math.max(1,Math.round((Math.log(a)-S)*T)+1)),Z=at(e),J=at(s),eA=at(n),q=A*4;t[q]=d|y<<8|M<<16|x<<24,t[q+1]=Z|J<<16,t[q+2]=eA|m<<16|k<<24,t[q+3]=b|N<<8|R<<16|D<<24}function wg(t,A,e,s,n){const i=at(e),r=at(s),a=at(n),o=A*4;t[o+1]=i|r<<16,t[o+2]=a|t[o+2]&4294901760}function mg(t,A,e,s,n,i){const r=(i==null?void 0:i.lnScaleMin)??kA,o=254/(((i==null?void 0:i.lnScaleMax)??NA)-r),g=e<Bt?0:Math.min(255,Math.max(1,Math.round((Math.log(e)-r)*o)+1)),l=s<Bt?0:Math.min(255,Math.max(1,Math.round((Math.log(s)-r)*o)+1)),c=n<Bt?0:Math.min(255,Math.max(1,Math.round((Math.log(n)-r)*o)+1)),u=A*4;t[u+3]=g|l<<8|c<<16|t[u+3]&4278190080}const Vn=new h.Quaternion;function xg(t,A,e,s,n,i){const r=ns(Vn.set(e,s,n,i)),a=r&255,o=r>>>8&255,g=r>>>16&255,l=A*4;t[l+2]=t[l+2]&65535|a<<16|o<<24,t[l+3]=t[l+3]&16777215|g<<24}function Sg(t,A,e,s,n,i,r){const a=(r==null?void 0:r.rgbMin)??0,g=((r==null?void 0:r.rgbMax)??1)-a,l=bA((e-a)/g),c=bA((s-a)/g),u=bA((n-a)/g),I=bA(i),E=A*4;t[E]=l|c<<8|u<<16|I<<24}function Mg(t,A,e,s,n,i){const r=(i==null?void 0:i.rgbMin)??0,o=((i==null?void 0:i.rgbMax)??1)-r,g=bA((e-r)/o),l=bA((s-r)/o),c=bA((n-r)/o),u=A*4;t[u]=g|l<<8|c<<16|t[u]&4278190080}function Dg(t,A,e){const s=bA(e),n=A*4;t[n]=t[n]&16777215|s<<24}const vg=new h.Vector3,bg=new h.Vector3,Tg=new h.Quaternion,Fg=new h.Color,kg={center:vg,scales:bg,quaternion:Tg,color:Fg,opacity:0};function Ee(t,A,e){const s=kg,n=A*4,i=t[n],r=t[n+1],a=t[n+2],o=t[n+3],g=(e==null?void 0:e.rgbMin)??0,c=((e==null?void 0:e.rgbMax)??1)-g;s.color.set(g+(i&255)/255*c,g+(i>>>8&255)/255*c,g+(i>>>16&255)/255*c),s.opacity=(i>>>24&255)/255,s.center.set(fA(r&65535),fA(r>>>16&65535),fA(a&65535));const u=(e==null?void 0:e.lnScaleMin)??kA,E=(((e==null?void 0:e.lnScaleMax)??NA)-u)/254,B=o&255;s.scales.x=B===0?0:Math.exp(u+(B-1)*E);const C=o>>>8&255;s.scales.y=C===0?0:Math.exp(u+(C-1)*E);const Q=o>>>16&255;s.scales.z=Q===0?0:Math.exp(u+(Q-1)*E);const f=a>>>16&65535|o>>>8&16711680;return ri(f,s.quaternion),s}function xA(t){const A=O,e=Math.max(We,Math.min($A,Math.ceil(t/A))),s=Math.ceil(t/(A*e)),n=A*e*s;return{width:A,height:e,depth:s,maxSplats:n}}function Ng(t){const A=O,e=Math.max(We,Math.min($A,Math.ceil(t/A))),s=Math.ceil(t/(A*e));return A*e*s}function On(){return navigator.maxTouchPoints>0?!0:/Mobi|Android|iPhone|iPad|iPod|Opera Mini|IEMobile/.test(navigator.userAgent)}function Zn(){return/Android/.test(navigator.userAgent)}function Xn(){return/Oculus/.test(navigator.userAgent)}function jn(t,A,e){const s=new Uint8Array(A*4);for(let n=0;n<e/2;n++){const i=n*A*4,r=(e-1-n)*A*4;s.set(t.subarray(i,i+A*4)),t.set(t.subarray(r,r+A*4),i),t.set(s,r)}return t}function Wn(t,A,e){const s=document.createElement("canvas");s.width=A,s.height=e;const n=s.getContext("2d");if(!n)throw new Error("Can't get 2d context");const i=n.createImageData(A,e);return i.data.set(t),n.putImageData(i,0,0),s.toDataURL("image/png")}function Ai(t){const A=new h.Clock(t.autoStart);return A.startTime=t.startTime,A.oldTime=t.oldTime,A.elapsedTime=t.elapsedTime,A.running=t.running,A}function Ug(t){return Object.fromEntries(Object.entries(t).filter(([A,e])=>e!==void 0))}const ti=BA(`
|
|
precision highp float;
|
|
|
|
in vec3 position;
|
|
|
|
void main() {
|
|
gl_Position = vec4(position.xy, 0.0, 1.0);
|
|
}
|
|
`);function ei(t){const A=new h.Vector3;for(const e of t)A.add(e);return A.divideScalar(t.length)}function si(t){if(t.length===0)return new h.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 ni(t,A){const e=new h.Vector3(0,0,0).applyMatrix4(t),s=new h.Vector3(0,0,0).applyMatrix4(A),n=new h.Vector3(0,0,-1).applyMatrix4(t).sub(e).normalize(),i=new h.Vector3(0,0,-1).applyMatrix4(A).sub(s).normalize(),r=e.distanceTo(s),a=n.dot(i);return{distance:r,coincidence:a}}function Gg({matrix1:t,matrix2:A,maxDistance:e}){const s=new h.Vector3(0,0,0).applyMatrix4(t),n=new h.Vector3(0,0,0).applyMatrix4(A);return s.distanceTo(n)<=e}function Rg({matrix1:t,matrix2:A,maxDistance:e,minCoincidence:s}){const{distance:n,coincidence:i}=ni(t,A);return n<=e&&(s==null||i>=s)}function ii(t,A){const[e,s]=[new h.Vector3,new h.Quaternion],[n,i]=[new h.Vector3,new h.Quaternion];t.decompose(e,s,new h.Vector3),A.decompose(n,i,new h.Vector3);const r=e.distanceTo(n),a=Math.abs(s.dot(i));return{distance:r,coorient:a}}function Qe({matrix1:t,matrix2:A,maxDistance:e,minCoorient:s}){const{distance:n,coorient:i}=ii(t,A);return n<=e&&(s==null||i>=s)}function Yg(t,A=.001){return Math.abs(t)<A?0:Math.sign(t)}function _g(t){const A=t.w<0,e=Pt(A?-t.x:t.x),s=Pt(A?-t.y:t.y),n=Pt(A?-t.z:t.z),i=e&255,r=s&255,a=n&255;return i|r<<8|a<<16}function Jg(t,A){const e=t<<24>>24,s=t<<16>>24,n=t<<8>>24;A.set(e/127,s/127,n/127,0);const i=A.x*A.x+A.y*A.y+A.z*A.z;return A.w=Math.sqrt(Math.max(0,1-i)),A}const Lg=new h.Quaternion,qe=new h.Vector3;function ns(t){const A=Lg.copy(t).normalize();A.w<0&&A.set(-A.x,-A.y,-A.z,-A.w);const e=2*Math.acos(A.w),s=Math.sqrt(A.x*A.x+A.y*A.y+A.z*A.z),n=s<1e-6?qe.set(1,0,0):qe.set(A.x,A.y,A.z).divideScalar(s),i=Math.abs(n.x)+Math.abs(n.y)+Math.abs(n.z);let r=n.x/i,a=n.y/i;if(n.z<0){const I=r;r=(1-Math.abs(a))*(r>=0?1:-1),a=(1-Math.abs(I))*(a>=0?1:-1)}const o=r*.5+.5,g=a*.5+.5,l=Math.round(o*255),c=Math.round(g*255);return Math.round(e*(255/Math.PI))<<16|c<<8|l}function ri(t,A){const e=t&255,s=t>>>8&255,n=t>>>16&255,i=e/255,r=s/255;let a=(i-.5)*2,o=(r-.5)*2;const g=1-(Math.abs(a)+Math.abs(o)),l=Math.max(-g,0);a+=a>=0?-l:l,o+=o>=0?-l:l;const c=qe.set(a,o,g).normalize(),I=n/255*Math.PI*.5,E=Math.sin(I),B=Math.cos(I);return A.set(c.x*E,c.y*E,c.z*E,B),A}function Hg(t){const A=t.clone().normalize(),e=2*(A.w*A.x+A.y*A.z),s=1-2*(A.x*A.x+A.y*A.y),n=Math.atan2(e,s),i=2*(A.w*A.y-A.z*A.x),r=Math.abs(i)>=1?Math.sign(i)*(Math.PI/2):Math.asin(i),a=2*(A.w*A.z+A.x*A.y),o=1-2*(A.y*A.y+A.z*A.z),g=Math.atan2(a,o),l=(n+Math.PI)/(2*Math.PI),c=(r+Math.PI)/(2*Math.PI),u=(g+Math.PI)/(2*Math.PI),I=Math.round(l*255),E=Math.round(c*255);return Math.round(u*255)<<16|E<<8|I}function zg(t,A){const e=t&255,s=t>>>8&255,n=t>>>16&255,i=e/255,r=s/255,a=n/255,o=i*(2*Math.PI)-Math.PI,g=r*(2*Math.PI)-Math.PI,l=a*(2*Math.PI)-Math.PI,c=Math.cos(o*.5),u=Math.sin(o*.5),I=Math.cos(g*.5),E=Math.sin(g*.5),B=Math.cos(l*.5),C=Math.sin(l*.5);return A.w=c*I*B+u*E*C,A.x=u*I*B-c*E*C,A.y=c*E*B+u*I*C,A.z=c*I*C-u*E*B,A.normalize(),A}function oe(t,A,e,s){const n=Math.max(-127,Math.min(127,t*127)),i=Math.max(-127,Math.min(127,A*127)),r=Math.max(-127,Math.min(127,e*127)),a=Math.max(-127,Math.min(127,s*127));return n&255|(i&255)<<8|(r&255)<<16|(a&255)<<24}function qg(t,A,e,s){const n=(s==null?void 0:s.sh1Min)??-1,i=(s==null?void 0:s.sh1Max)??1,r=.5*(n+i),a=126/(i-n),o=A*2;for(let g=0;g<9;++g){const l=(e[g]-r)*a,c=Math.round(Math.max(-63,Math.min(63,l)))&127,u=g*7,I=u+7,E=Math.floor(u/32),B=u-E*32,C=c<<B&4294967295;if(t[o+E]|=C,I>E*32+32){const Q=c>>>32-B&4294967295;t[o+E+1]|=Q}}}function Kg(t,A,e,s){const n=(s==null?void 0:s.sh2Min)??-1,i=(s==null?void 0:s.sh2Max)??1,r=.5*(n+i),a=2/(i-n);t[A*4+0]=oe((e[0]-r)*a,(e[1]-r)*a,(e[2]-r)*a,(e[3]-r)*a),t[A*4+1]=oe((e[4]-r)*a,(e[5]-r)*a,(e[6]-r)*a,(e[7]-r)*a),t[A*4+2]=oe((e[8]-r)*a,(e[9]-r)*a,(e[10]-r)*a,(e[11]-r)*a),t[A*4+3]=oe((e[12]-r)*a,(e[13]-r)*a,(e[14]-r)*a,0)}function $g(t,A,e,s){const n=(s==null?void 0:s.sh3Min)??-1,i=(s==null?void 0:s.sh3Max)??1,r=.5*(n+i),a=62/(i-n),o=A*4;for(let g=0;g<21;++g){const l=(e[g]-r)*a,c=Math.round(Math.max(-31,Math.min(31,l)))&63,u=g*6,I=u+6,E=Math.floor(u/32),B=u-E*32,C=c<<B&4294967295;if(t[o+E]|=C,I>E*32+32){const Q=c>>>32-B&4294967295;t[o+E+1]|=Q}}}function ai(t,A){const e=[];let s=0,n=null;const i=new Oo((o,g)=>{if(e.push(o),s+=o.length,g||s>=A){const l=new Uint8Array(s);let c=0;for(const u of e)l.set(u,c),c+=u.length;n=l.slice(0,A)}}),r=1024;let a=0;for(;n==null&&a<t.length;){const o=t.slice(a,a+r);i.push(o,!1),a+=r}if(n==null&&(i.push(new Uint8Array,!0),n==null))throw new Error("Failed to decompress partial gzip");return n}class oi{constructor({fileBytes:A,chunkBytes:e=64*1024}){this.fileBytes=A,this.chunkBytes=e,this.chunks=[],this.totalBytes=0;const s=new DecompressionStream("gzip"),n=new Blob([A]).stream().pipeThrough(s);this.reader=n.getReader()}async read(A){for(;this.totalBytes<A;){const{value:i,done:r}=await this.reader.read();if(r)break;this.chunks.push(i),this.totalBytes+=i.length}if(this.totalBytes<A)throw new Error(`Unexpected EOF: needed ${A}, got ${this.totalBytes}`);const e=new Uint8Array(this.totalBytes);let s=0;for(const i of this.chunks)e.set(i,s),s+=i.length;const n=e.subarray(0,A);return this.chunks=[e.subarray(A)],this.totalBytes-=A,n}}const Pg=Object.freeze(Object.defineProperty({__proto__:null,DataCache:pg,FreeList:Pn,GunzipReader:oi,IDENT_VERTEX_SHADER:ti,Sint8ToFloat:Kn,Uint8ToFloat:qn,averagePositions:ei,averageQuaternions:si,cloneClock:Ai,coinciDist:ni,computeMaxSplats:Ng,coorientDist:ii,decodeQuatEulerXyz888:zg,decodeQuatOctXy88R8:ri,decodeQuatXyz888:Jg,decompressPartialGzip:ai,encodeQuatEulerXyz888:Hg,encodeQuatOctXy88R8:ns,encodeQuatXyz888:_g,encodeSh1Rgb:qg,encodeSh2Rgb:Kg,encodeSh3Rgb:$g,epsilonSign:Yg,flipPixels:jn,floatBitsToUint:hg,floatToSint8:Pt,floatToUint8:bA,fromHalf:fA,getArrayBuffers:$n,getTextureSize:xA,isAndroid:Zn,isMobile:On,isOculus:Xn,mapFilterObject:dg,mapObject:fg,newArray:yg,normalize:zn,omitUndefined:Ug,pixelsToPngUrl:Wn,setPackedSplat:Ce,setPackedSplatCenter:wg,setPackedSplatOpacity:Dg,setPackedSplatQuat:xg,setPackedSplatRgb:Mg,setPackedSplatRgba:Sg,setPackedSplatScales:mg,toHalf:at,uintBitsToFloat:Ig,unpackSplat:Ee,withinCoinciDist:Rg,withinCoorientDist:Qe,withinDist:Gg},Symbol.toStringTag,{value:"Module"}));class is{constructor({graph:A,inputs:e,outputs:s,template:n}){this.graph=A,this.template=n,this.inputs=e??{},this.outputs=s??{};const i=new $s({indent:this.template.indent});for(const a in this.outputs)this.outputs[a]&&i.declares.add(this.outputs[a]);const r=A.compile({inputs:this.inputs,outputs:this.outputs,compile:i});this.shader=n.generate({globals:i.globals,statements:r}),this.uniforms=i.uniforms,this.updaters=i.updaters}prepareMaterial(){return Vg(this)}update(){for(const A of this.updaters)A()}}class rs{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 Qs=new Map;function Vg(t){let A=Qs.get(t);return A||(A=new h.RawShaderMaterial({glslVersion:h.GLSL3,vertexShader:ti,fragmentShader:t.shader,uniforms:t.uniforms}),Qs.set(t,A),A)}function as(t,A,e="add"){const s=()=>{throw new Error(`Invalid ${e} types: ${t}, ${A}`)};if(t===A)return t;if(t==="int"){if(QA(A))return A;s()}if(A==="int"){if(QA(t))return t;s()}if(t==="uint"){if(pA(A))return A;s()}if(A==="uint"){if(pA(t))return t;s()}if(t==="float"){if(ot(A))return A;s()}if(A==="float"){if(ot(t))return t;s()}throw new Error(`Invalid ${e} types: ${t}, ${A}`)}function Og(t,A){return as(t,A,"sub")}function Zg(t,A){const e=()=>{throw new Error(`Invalid mul types: ${t}, ${A}`)},s=n=>n;if(t==="int"){if(QA(A))return s(A);e()}if(A==="int"){if(QA(t))return s(t);e()}if(t==="uint"){if(pA(A))return s(A);e()}if(A==="uint"){if(pA(t))return s(t);e()}if(t==="float"){if(ot(A))return s(A);e()}if(A==="float"){if(ot(t))return s(t);e()}if(QA(t)||pA(t)||QA(A)||pA(A)){if(t===A)return s(t);e()}if(t==="vec2"){if(A==="vec2"||gt(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"||lt(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"||ut(A))return s("vec4");e()}if(A==="vec2"){if(gt(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(lt(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(ut(t))return s("vec4");e()}if(gt(t)){if(gt(A))return s("mat2");if(A==="mat3x2")return s("mat3x2");if(A==="mat4x2")return s("mat4x2");e()}if(t==="mat2x3"){if(gt(A))return s("mat2x3");if(A==="mat3x2")return s("mat3");if(A==="mat4x2")return s("mat4x3");e()}if(t==="mat2x4"){if(gt(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(lt(A))return s("mat3x2");if(A==="mat4x3")return s("mat4x2");e()}if(lt(t)){if(A==="mat2x3")return s("mat2x3");if(lt(A))return s("mat3");if(A==="mat4x3")return s("mat4x3");e()}if(t==="mat3x4"){if(A==="mat2x3")return s("mat2x4");if(lt(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(ut(A))return s("mat4x2");e()}if(t==="mat4x3"){if(A==="mat2x4")return s("mat2x3");if(A==="mat3x4")return s("mat3");if(ut(A))return s("mat4x3");e()}if(ut(t)){if(A==="mat2x4")return s("mat2x4");if(A==="mat3x4")return s("mat3x4");if(ut(A))return s("mat4");e()}throw new Error(`Invalid mul types: ${t}, ${A}`)}function Xg(t,A){return as(t,A,"div")}function jg(t,A){if(t===A)return t;if(t==="int"){if(QA(A))return A}else if(A==="int"){if(QA(t))return t}else if(t==="uint"){if(pA(A))return A}else if(A==="uint"&&pA(t))return t;throw new Error(`Invalid imod types: ${t}, ${A}`)}function Wg(t,A){if(t===A||A==="float")return t;throw new Error(`Invalid mod types: ${t}, ${A}`)}function Al(t){return t}function tl(t){return t}function el(t){return t}function sl(t){return t}function nl(t){return t}function il(t){return t}function rl(t){return t}function al(t){return t}function ol(t){return t}function cl(t){return t}function gl(t){return t}function ll(t){return t}function ul(t){return t}function hl(t){return t}function Il(t){return t}function Bl(t){return t}function ci(t,A,e="min"){if(t===A)return t;if(A==="float"){if(ee(t))return t}else if(A==="int"){if(QA(t))return t}else if(A==="uint"&&pA(t))return t;throw new Error(`Invalid ${e} types: ${t}, ${A}`)}function Cl(t,A){return ci(t,A,"max")}function El(t,A,e){if(A==="float"){if(ee(t))return t}else if(A==="int"){if(QA(t))return t}else if(A==="uint"&&pA(t))return t;throw new Error(`Invalid clamp types: ${t}, ${A}`)}function Ql(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 pl(t,A){if(t===A||A==="float")return A;throw new Error(`Invalid step types: ${t}, ${A}`)}function fl(t,A,e){if(t===A&&(t===e||t==="float"))return e;throw new Error(`Invalid smoothstep types: ${t}, ${A}, ${e}`)}function gi(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 dl(t){return gi(t,"isInf")}const EA=(t,A)=>new Ii({a:t,b:A}),ft=(t,A)=>new Bi({a:t,b:A}),rA=(t,A)=>new Ci({a:t,b:A}),le=(t,A)=>new Ei({a:t,b:A}),Ke=(t,A)=>new Qi({a:t,b:A}),li=(t,A)=>new pi({a:t,b:A}),yl=t=>new fi({a:t}).outputs,os=t=>new di({a:t}),wl=t=>new yi({a:t}),ml=t=>new wi({a:t}),xl=t=>new mi({a:t}),Sl=t=>new xi({a:t}),Ml=t=>new Si({a:t}),Dl=t=>new Mi({a:t}),ue=t=>new Di({a:t}),vl=(t,A)=>new vi({a:t,b:A}),bl=t=>new bi({a:t}),Tl=t=>new Ti({a:t}),Fl=t=>new Fi({a:t}),kl=t=>new ki({a:t}),Nl=t=>new Ni({a:t}),Ul=t=>new Ui({a:t}),Gl=t=>new Gi({a:t}),Rl=(t,A)=>new Ri({a:t,b:A}),ui=(t,A)=>new Yi({a:t,b:A}),Yl=(t,A,e)=>new _i({a:t,min:A,max:e}),hi=(t,A,e)=>new Ji({a:t,b:A,t:e}),_l=(t,A)=>new Li({edge:t,x:A}),Jl=(t,A,e)=>new Hi({edge0:t,edge1:A,x:e}),Ll=t=>new zi({a:t}),Hl=t=>new qi({a:t});class Ii extends tA{constructor({a:A,b:e}){super({a:A,b:e,outKey:"sum",outTypeFunc:as}),this.statements=({inputs:s,outputs:n})=>[`${n.sum} = ${s.a} + ${s.b};`]}}class Bi extends tA{constructor({a:A,b:e}){super({a:A,b:e,outKey:"difference",outTypeFunc:Og}),this.statements=({inputs:s,outputs:n})=>[`${n.difference} = ${s.a} - ${s.b};`]}}class Ci extends tA{constructor({a:A,b:e}){super({a:A,b:e,outKey:"product",outTypeFunc:Zg}),this.statements=({inputs:s,outputs:n})=>[`${n.product} = ${s.a} * ${s.b};`]}}class Ei extends tA{constructor({a:A,b:e}){super({a:A,b:e,outKey:"quotient",outTypeFunc:Xg}),this.statements=({inputs:s,outputs:n})=>[`${n.quotient} = ${s.a} / ${s.b};`]}}class Qi extends tA{constructor({a:A,b:e}){super({a:A,b:e,outKey:"remainder",outTypeFunc:jg}),this.statements=({inputs:s,outputs:n})=>[`${n.remainder} = ${s.a} % ${s.b};`]}}class pi extends tA{constructor({a:A,b:e}){super({a:A,b:e,outKey:"remainder",outTypeFunc:Wg}),this.statements=({inputs:s,outputs:n})=>[`${n.remainder} = mod(${s.a}, ${s.b});`]}}class fi extends P{constructor({a:A}){const e={a:$(A)},s=e.a,n={fract:s,integer:s};super({inTypes:e,outTypes:n,inputs:{a:A}}),this.statements=({inputs:i,outputs:r})=>[`${r.fract} = modf(${i.a}, ${r.integer});`]}}class di extends v{constructor({a:A}){super({a:A,outKey:"neg",outTypeFunc:Al}),this.statements=({inputs:e,outputs:s})=>[`${s.neg} = -${e.a};`]}}class yi extends v{constructor({a:A}){super({a:A,outKey:"abs",outTypeFunc:tl}),this.statements=({inputs:e,outputs:s})=>[`${s.abs} = abs(${e.a});`]}}class wi extends v{constructor({a:A}){super({a:A,outKey:"sign",outTypeFunc:el}),this.statements=({inputs:e,outputs:s})=>[`${s.sign} = sign(${e.a});`]}}class mi extends v{constructor({a:A}){super({a:A,outKey:"floor",outTypeFunc:sl}),this.statements=({inputs:e,outputs:s})=>[`${s.floor} = floor(${e.a});`]}}class xi extends v{constructor({a:A}){super({a:A,outKey:"ceil",outTypeFunc:nl}),this.statements=({inputs:e,outputs:s})=>[`${s.ceil} = ceil(${e.a});`]}}class Si extends v{constructor({a:A}){super({a:A,outKey:"trunc",outTypeFunc:il}),this.statements=({inputs:e,outputs:s})=>[`${s.trunc} = trunc(${e.a});`]}}class Mi extends v{constructor({a:A}){super({a:A,outKey:"round",outTypeFunc:rl}),this.statements=({inputs:e,outputs:s})=>[`${s.round} = round(${e.a});`]}}class Di extends v{constructor({a:A}){super({a:A,outKey:"fract",outTypeFunc:al}),this.statements=({inputs:e,outputs:s})=>[`${s.fract} = fract(${e.a});`]}}class vi extends tA{constructor({a:A,b:e}){super({a:A,b:e,outKey:"power",outTypeFunc:ol}),this.statements=({inputs:s,outputs:n})=>[`${n.power} = pow(${s.a}, ${s.b});`]}}class bi extends v{constructor({a:A}){super({a:A,outKey:"exp",outTypeFunc:cl}),this.statements=({inputs:e,outputs:s})=>[`${s.exp} = exp(${e.a});`]}}class Ti extends v{constructor({a:A}){super({a:A,outKey:"exp2",outTypeFunc:gl}),this.statements=({inputs:e,outputs:s})=>[`${s.exp2} = exp2(${e.a});`]}}class Fi extends v{constructor({a:A}){super({a:A,outKey:"log",outTypeFunc:ll}),this.statements=({inputs:e,outputs:s})=>[`${s.log} = log(${e.a});`]}}class ki extends v{constructor({a:A}){super({a:A,outKey:"log2",outTypeFunc:ul}),this.statements=({inputs:e,outputs:s})=>[`${s.log2} = log2(${e.a});`]}}class Ni extends v{constructor({a:A}){super({a:A,outKey:"sqr",outTypeFunc:hl}),this.statements=({inputs:e,outputs:s})=>[`${s.sqr} = ${e.a} * ${e.a};`]}}class Ui extends v{constructor({a:A}){super({a:A,outKey:"sqrt",outTypeFunc:Il}),this.statements=({inputs:e,outputs:s})=>[`${s.sqrt} = sqrt(${e.a});`]}}class Gi extends v{constructor({a:A}){super({a:A,outKey:"inversesqrt",outTypeFunc:Bl}),this.statements=({inputs:e,outputs:s})=>[`${s.inversesqrt} = inversesqrt(${e.a});`]}}class Ri extends tA{constructor({a:A,b:e}){super({a:A,b:e,outKey:"min",outTypeFunc:ci}),this.statements=({inputs:s,outputs:n})=>[`${n.min} = min(${s.a}, ${s.b});`]}}class Yi extends tA{constructor({a:A,b:e}){super({a:A,b:e,outKey:"max",outTypeFunc:Cl}),this.statements=({inputs:s,outputs:n})=>[`${n.max} = max(${s.a}, ${s.b});`]}}class _i extends wt{constructor({a:A,min:e,max:s}){super({a:A,b:e,c:s,outKey:"clamp",outTypeFunc:El}),this.statements=({inputs:n,outputs:i})=>{const{a:r,b:a,c:o}=n;return[`${i.clamp} = clamp(${r}, ${a}, ${o});`]}}}class Ji extends wt{constructor({a:A,b:e,t:s}){super({a:A,b:e,c:s,outKey:"mix",outTypeFunc:Ql}),this.statements=({inputs:n,outputs:i})=>{const{a:r,b:a,c:o}=n;return[`${i.mix} = mix(${r}, ${a}, ${o});`]}}}class Li extends tA{constructor({edge:A,x:e}){super({a:A,b:e,outKey:"step",outTypeFunc:pl}),this.statements=({inputs:s,outputs:n})=>{const{a:i,b:r}=s;return[`${n.step} = step(${i}, ${r});`]}}}class Hi extends wt{constructor({edge0:A,edge1:e,x:s}){super({a:A,b:e,c:s,outKey:"smoothstep",outTypeFunc:fl}),this.statements=({inputs:n,outputs:i})=>{const{a:r,b:a,c:o}=n;return[`${i.smoothstep} = smoothstep(${r}, ${a}, ${o});`]}}}class zi extends v{constructor({a:A}){super({a:A,outKey:"isNan",outTypeFunc:gi}),this.statements=({inputs:e,outputs:s})=>[`${s.isNan} = isNan(${e.a});`]}}class qi extends v{constructor({a:A}){super({a:A,outKey:"isInf",outTypeFunc:dl}),this.statements=({inputs:e,outputs:s})=>[`${s.isInf} = isInf(${e.a});`]}}const zl=(t,A)=>new $i({a:t,b:A}),ql=(t,A)=>new Pi({a:t,b:A}),Kl=(t,A)=>new Vi({a:t,b:A}),$l=t=>new Oi({a:t}),Pl=(t,A)=>new Zi({a:t,b:A}),Vl=(t,A)=>new Xi({a:t,b:A}),Ol=(t,A)=>new ji({a:t,b:A}),Ki=(t,A)=>new Wi({a:t,b:A}),Zl=(t,A)=>new Ar({a:t,b:A}),Xl=(t,A)=>new tr({a:t,b:A}),jl=t=>new er({a:t}),Wl=t=>new sr({a:t}),cs=(t,A,e)=>new nr({cond:t,t:A,f:e}),Au=t=>new rr({a:t});class $i extends tA{constructor({a:A,b:e}){super({a:A,b:e,outTypeFunc:(s,n)=>s,outKey:"and"}),this.statements=({inputs:s,outputs:n})=>this.outTypes.and==="bool"?[`${n.and} = ${s.a} && ${s.b};`]:[`${n.and} = ${s.a} & ${s.b};`]}}class Pi extends tA{constructor({a:A,b:e}){super({a:A,b:e,outTypeFunc:(s,n)=>s,outKey:"or"}),this.statements=({inputs:s,outputs:n})=>this.outTypes.or==="bool"?[`${n.or} = ${s.a} || ${s.b};`]:[`${n.or} = ${s.a} | ${s.b};`]}}class Vi extends tA{constructor({a:A,b:e}){super({a:A,b:e,outTypeFunc:(s,n)=>s,outKey:"xor"}),this.statements=({inputs:s,outputs:n})=>this.outTypes.xor==="bool"?[`${n.xor} = ${s.a} ^^ ${s.b};`]:[`${n.xor} = ${s.a} ^ ${s.b};`]}}class Oi extends v{constructor({a:A}){super({a:A,outTypeFunc:e=>e,outKey:"not"}),this.statements=({inputs:e,outputs:s})=>this.outTypes.not==="bool"?[`${s.not} = !${e.a};`]:[`${s.not} = not(${e.a});`]}}class Zi extends tA{constructor({a:A,b:e}){super({a:A,b:e,outTypeFunc:(s,n)=>Se(s,"lessThan"),outKey:"lessThan"}),this.statements=({inputs:s,outputs:n})=>this.outTypes.lessThan==="bool"?[`${n.lessThan} = ${s.a} < ${s.b};`]:[`${n.lessThan} = lessThan(${s.a}, ${s.b});`]}}class Xi extends tA{constructor({a:A,b:e}){super({a:A,b:e,outTypeFunc:(s,n)=>Se(s,"lessThanEqual"),outKey:"lessThanEqual"}),this.statements=({inputs:s,outputs:n})=>this.outTypes.lessThanEqual==="bool"?[`${n.lessThanEqual} = ${s.a} <= ${s.b};`]:[`${n.lessThanEqual} = lessThanEqual(${s.a}, ${s.b});`]}}class ji extends tA{constructor({a:A,b:e}){super({a:A,b:e,outTypeFunc:(s,n)=>Se(s,"greaterThan"),outKey:"greaterThan"}),this.statements=({inputs:s,outputs:n})=>this.outTypes.greaterThan==="bool"?[`${n.greaterThan} = ${s.a} > ${s.b};`]:[`${n.greaterThan} = greaterThan(${s.a}, ${s.b});`]}}class Wi extends tA{constructor({a:A,b:e}){super({a:A,b:e,outTypeFunc:(s,n)=>Se(s,"greaterThanEqual"),outKey:"greaterThanEqual"}),this.statements=({inputs:s,outputs:n})=>this.outTypes.greaterThanEqual==="bool"?[`${n.greaterThanEqual} = ${s.a} >= ${s.b};`]:[`${n.greaterThanEqual} = greaterThanEqual(${s.a}, ${s.b});`]}}class Ar extends tA{constructor({a:A,b:e}){super({a:A,b:e,outTypeFunc:ir,outKey:"equal"}),this.statements=({inputs:s,outputs:n})=>this.outTypes.equal==="bool"?[`${n.equal} = ${s.a} == ${s.b};`]:[`${n.equal} = equal(${s.a}, ${s.b});`]}}class tr extends tA{constructor({a:A,b:e}){super({a:A,b:e,outTypeFunc:tu,outKey:"notEqual"}),this.statements=({inputs:s,outputs:n})=>this.outTypes.notEqual==="bool"?[`${n.notEqual} = ${s.a} != ${s.b};`]:[`${n.notEqual} = notEqual(${s.a}, ${s.b});`]}}class er extends v{constructor({a:A}){super({a:A,outTypeFunc:e=>"bool",outKey:"any"}),this.statements=({inputs:e,outputs:s})=>[`${s.any} = any(${e.a});`]}}class sr extends v{constructor({a:A}){super({a:A,outTypeFunc:e=>"bool",outKey:"all"}),this.statements=({inputs:e,outputs:s})=>[`${s.all} = all(${e.a});`]}}class nr extends wt{constructor({cond:A,t:e,f:s}){super({a:A,b:e,c:s,outKey:"select",outTypeFunc:(n,i,r)=>i}),this.statements=({inputs:n,outputs:i})=>{const{a:r,b:a,c:o}=n;return[`${i.select} = (${r}) ? (${a}) : (${o});`]}}}function Se(t,A){if(yt(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 ir(t,A="equal"){if(yt(t))return"bool";if(dt(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 tu(t){return ir(t,"notEqual")}function eu(t){if(dt(t))return"bool";if(QA(t))return"int";if(pA(t))return"uint";throw new Error(`Invalid compXor type: ${t}`)}class rr extends v{constructor({a:A}){const e=eu($(A));super({a:A,outTypeFunc:s=>e,outKey:"compXor"}),this.statements=({inputs:s,outputs:n})=>{if(yt(this.outTypes.compXor))return[`${n.compXor} = ${s.a};`];const r=(Nt(e)?["x","y"]:Ut(e)?["x","y","z"]:["x","y","z","w"]).map(o=>`${s.a}.${o}`),a=dt(e)?"^^":"^";return[`${n.compXor} = ${r.join(` ${a} `)};`]}}}const su=t=>new hr({value:t}),nu=t=>new Ir({value:t}),iu=t=>new Br({value:t}),ar=t=>new Cr({value:t}),ru=t=>new Er({value:t}),au=t=>new Qr({value:t}),ou=t=>new pr({value:t}),cu=t=>new fr({value:t}),gu=t=>new dr({value:t}),lu=t=>new yr({value:t}),uu=t=>new wr({value:t}),hu=t=>new mr({value:t}),Iu=t=>new xr({value:t}),or=t=>new Sr({value:t}),Qt=t=>new Mr({value:t}),cr=t=>new Dr({value:t}),Bu=t=>new vr({value:t}),Cu=t=>new br({value:t}),Eu=t=>new Tr({value:t}),gr=t=>new Fr({value:t}),lr=t=>new kr({value:t}),Qu=t=>new Nr({value:t}),pu=t=>new Ur({value:t}),fu=t=>new Gr({value:t}),du=t=>new Rr({value:t}),yu=t=>new Yr({value:t}),wu=t=>new _r({value:t}),ur=t=>new Jr({value:t}),mu=t=>new Lr({value:t}),$e=t=>new Hr({value:t});class gA extends v{constructor({value:A,outType:e,outKey:s}){super({a:A,outTypeFunc:()=>e,outKey:s}),this.statements=({inputs:n,outputs:i})=>[`${i[s]} = ${qs(e)}(${n.a});`]}}class hr extends gA{constructor({value:A}){super({value:A,outType:"bool",outKey:"bool"})}}class Ir extends gA{constructor({value:A}){super({value:A,outType:"int",outKey:"int"})}}class Br extends gA{constructor({value:A}){super({value:A,outType:"uint",outKey:"uint"})}}class Cr extends gA{constructor({value:A}){super({value:A,outType:"float",outKey:"float"})}}class Er extends gA{constructor({value:A}){super({value:A,outType:"bvec2",outKey:"bvec2"})}}class Qr extends gA{constructor({value:A}){super({value:A,outType:"bvec3",outKey:"bvec3"})}}class pr extends gA{constructor({value:A}){super({value:A,outType:"bvec4",outKey:"bvec4"})}}class fr extends gA{constructor({value:A}){super({value:A,outType:"ivec2",outKey:"ivec2"})}}class dr extends gA{constructor({value:A}){super({value:A,outType:"ivec3",outKey:"ivec3"})}}class yr extends gA{constructor({value:A}){super({value:A,outType:"ivec4",outKey:"ivec4"})}}class wr extends gA{constructor({value:A}){super({value:A,outType:"uvec2",outKey:"uvec2"})}}class mr extends gA{constructor({value:A}){super({value:A,outType:"uvec3",outKey:"uvec3"})}}class xr extends gA{constructor({value:A}){super({value:A,outType:"uvec4",outKey:"uvec4"})}}class Sr extends gA{constructor({value:A}){super({value:A,outType:"vec2",outKey:"vec2"})}}class Mr extends gA{constructor({value:A}){super({value:A,outType:"vec3",outKey:"vec3"})}}class Dr extends gA{constructor({value:A}){super({value:A,outType:"vec4",outKey:"vec4"})}}class vr extends gA{constructor({value:A}){super({value:A,outType:"mat2",outKey:"mat2"})}}class br extends gA{constructor({value:A}){super({value:A,outType:"mat3",outKey:"mat3"})}}class Tr extends gA{constructor({value:A}){super({value:A,outType:"mat4",outKey:"mat4"})}}class Fr extends v{constructor({value:A}){super({a:A,outKey:"int",outTypeFunc:()=>"int"}),this.statements=({inputs:e,outputs:s})=>[`${s.int} = floatBitsToInt(${e.a});`]}}class kr extends v{constructor({value:A}){super({a:A,outKey:"uint",outTypeFunc:()=>"uint"}),this.statements=({inputs:e,outputs:s})=>[`${s.uint} = floatBitsToUint(${e.a});`]}}class Nr extends v{constructor({value:A}){super({a:A,outKey:"float",outTypeFunc:()=>"float"}),this.statements=({inputs:e,outputs:s})=>[`${s.float} = intBitsToFloat(${e.a});`]}}class Ur extends v{constructor({value:A}){super({a:A,outKey:"float",outTypeFunc:()=>"float"}),this.statements=({inputs:e,outputs:s})=>[`${s.float} = uintBitsToFloat(${e.a});`]}}class Gr extends v{constructor({value:A}){super({a:A,outKey:"uint",outTypeFunc:()=>"uint"}),this.statements=({inputs:e,outputs:s})=>[`${s.uint} = packSnorm2x16(${e.a});`]}}class Rr extends v{constructor({value:A}){super({a:A,outKey:"vec2",outTypeFunc:()=>"vec2"}),this.statements=({inputs:e,outputs:s})=>[`${s.vec2} = unpackSnorm2x16(${e.a});`]}}class Yr extends v{constructor({value:A}){super({a:A,outKey:"uint",outTypeFunc:()=>"uint"}),this.statements=({inputs:e,outputs:s})=>[`${s.uint} = packUnorm2x16(${e.a});`]}}class _r extends v{constructor({value:A}){super({a:A,outKey:"vec2",outTypeFunc:()=>"vec2"}),this.statements=({inputs:e,outputs:s})=>[`${s.vec2} = unpackUnorm2x16(${e.a});`]}}class Jr extends v{constructor({value:A}){super({a:A,outKey:"uint",outTypeFunc:()=>"uint"}),this.statements=({inputs:e,outputs:s})=>[`${s.uint} = packHalf2x16(${e.a});`]}}class Lr extends v{constructor({value:A}){super({a:A,outKey:"vec2",outTypeFunc:()=>"vec2"}),this.statements=({inputs:e,outputs:s})=>[`${s.vec2} = unpackHalf2x16(${e.a});`]}}class Hr extends v{constructor({value:A}){super({a:A,outKey:"rgba8",outTypeFunc:()=>"vec4"}),this.statements=({inputs:e,outputs:s})=>[`uvec4 uRgba = uvec4(${e.a} & 0xffu, (${e.a} >> 8u) & 0xffu, (${e.a} >> 16u) & 0xffu, (${e.a} >> 24u) & 0xffu);`,`${s.rgba8} = vec4(uRgba) / 255.0;`]}}const xu=t=>new $r({a:t}),Su=(t,A)=>new Pr({a:t,b:A}),zr=(t,A)=>new Vr({a:t,b:A}),Mu=(t,A)=>new Or({a:t,b:A}),qr=t=>new Zr({a:t}),Du=(t,A,e)=>new Wr({a:t,b:A,c:e}),vu=(t,A)=>new Aa({incident:t,normal:A}),bu=(t,A,e)=>new ta({incident:t,normal:A,eta:e}),pt=t=>new aa({vector:t}),PA=({vector:t,vectorType:A,x:e,y:s,z:n,w:i,r,g:a,b:o,a:g})=>new oa({vector:t,vectorType:A,x:e,y:s,z:n,w:i,r,g:a,b:o,a:g}),Tu=t=>new Xr({a:t}),Kr=(t,A)=>new jr({a:t,b:A}),Fu=(t,A)=>new ca({vector:t,select:A}),ku=(t,A)=>new ea({a:t,b:A}),Nu=(t,A)=>new sa({a:t,b:A}),Uu=t=>new na({a:t}),Gu=t=>new ia({a:t}),Ru=t=>new ra({a:t});class $r extends v{constructor({a:A}){super({a:A,outTypeFunc:e=>"float",outKey:"length"}),this.statements=({inputs:e,outputs:s})=>[`${s.length} = length(${e.a});`]}}class Pr extends tA{constructor({a:A,b:e}){super({a:A,b:e,outKey:"distance",outTypeFunc:(s,n)=>"float"}),this.statements=({inputs:s,outputs:n})=>[`${n.distance} = distance(${s.a}, ${s.b});`]}}class Vr extends tA{constructor({a:A,b:e}){super({a:A,b:e,outKey:"dot",outTypeFunc:(s,n)=>"float"}),this.statements=({inputs:s,outputs:n})=>[`${n.dot} = dot(${s.a}, ${s.b});`]}}class Or extends tA{constructor({a:A,b:e}){super({a:A,b:e,outKey:"cross",outTypeFunc:(s,n)=>"vec3"}),this.statements=({inputs:s,outputs:n})=>[`${n.cross} = cross(${s.a}, ${s.b});`]}}class Zr extends v{constructor({a:A}){super({a:A,outTypeFunc:e=>e,outKey:"normalize"}),this.statements=({inputs:e,outputs:s})=>[`${s.normalize} = normalize(${e.a});`]}}function Yu(t){if(t==="vec3")return"vec2";if(t==="vec4")return"vec3";throw new Error("Invalid type")}class Xr extends v{constructor({a:A}){super({a:A,outTypeFunc:e=>Yu(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 _u(t){if(t==="float")return"vec2";if(t==="vec2")return"vec3";if(t==="vec3")return"vec4";throw new Error("Invalid type")}class jr extends tA{constructor({a:A,b:e}){const s=$(A),n=_u(s);super({a:A,b:e,outKey:"extend",outTypeFunc:()=>n}),this.statements=({inputs:i,outputs:r})=>[`${r.extend} = ${n}(${i.a}, ${i.b});`]}}class Wr extends wt{constructor({a:A,b:e,c:s}){super({a:A,b:e,c:s,outKey:"forward",outTypeFunc:(n,i,r)=>n}),this.statements=({inputs:n,outputs:i})=>[`${i.forward} = faceforward(${n.a}, ${n.b}, ${n.c});`]}}class Aa extends tA{constructor({incident:A,normal:e}){super({a:A,b:e,outKey:"reflection",outTypeFunc:(s,n)=>s}),this.statements=({inputs:s,outputs:n})=>[`${n.reflection} = reflect(${s.a}, ${s.b});`]}}class ta extends wt{constructor({incident:A,normal:e,eta:s}){super({a:A,b:e,c:s,outKey:"refraction",outTypeFunc:(n,i,r)=>n}),this.statements=({inputs:n,outputs:i})=>[`${i.refraction} = refract(${n.a}, ${n.b}, ${n.c});`]}}class ea extends tA{constructor({a:A,b:e}){super({a:A,b:e,outKey:"product",outTypeFunc:(s,n)=>s}),this.statements=({inputs:s,outputs:n})=>[`${n.product} = matrixCompMult(${A}, ${e});`]}}function Ju(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 sa extends tA{constructor({a:A,b:e}){super({a:A,b:e,outKey:"outer",outTypeFunc:Ju}),this.statements=({inputs:s,outputs:n})=>[`${n.outer} = outerProduct(${s.a}, ${s.b});`]}}function Lu(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 na extends v{constructor({a:A}){super({a:A,outKey:"transpose",outTypeFunc:Lu}),this.statements=({inputs:e,outputs:s})=>[`${s.transpose} = transpose(${e.a});`]}}class ia extends v{constructor({a:A}){super({a:A,outKey:"det",outTypeFunc:e=>"float"}),this.statements=({inputs:e,outputs:s})=>[`${s.det} = determinant(${e.a});`]}}class ra extends v{constructor({a:A}){super({a:A,outKey:"inverse",outTypeFunc:e=>e}),this.statements=({inputs:e,outputs:s})=>[`${s.inverse} = inverse(${A});`]}}function Hu(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 aa extends P{constructor({vector:A}){const s={vector:$(A)},n=Hu(s.vector);super({inTypes:s,outTypes:n,inputs:{vector:A}}),this.statements=({inputs:i,outputs:r})=>{const{x:a,y:o,z:g,w:l,r:c,g:u,b:I,a:E}=r,{vector:B}=i;return[a?`${a} = ${B}.x;`:null,o?`${o} = ${B}.y;`:null,g?`${g} = ${B}.z;`:null,l?`${l} = ${B}.w;`:null,c?`${c} = ${B}.r;`:null,u?`${u} = ${B}.g;`:null,I?`${I} = ${B}.b;`:null,E?`${E} = ${B}.a;`:null].filter(Boolean)}}}class oa extends P{constructor({vector:A,vectorType:e,x:s,y:n,z:i,w:r,r:a,g:o,b:g,a:l}){if(!A&&!e)throw new Error("Either vector or vectorType must be provided");const c=e??$(A),u=Ls(c),I=Hs(c),E={vector:c,x:u,y:u,r:u,g:u},B={vector:A,x:s,y:n,r:a,g:o};I>=3&&(Object.assign(E,{z:u,b:u}),Object.assign(B,{z:i,b:g})),I>=4&&(Object.assign(E,{w:u,a:u}),Object.assign(B,{w:r,a:l})),super({inTypes:E,outTypes:{vector:c},inputs:B}),this.statements=({inputs:C,outputs:Q})=>{const{vector:f}=Q,{vector:p,x:d,y,z:M,w:x,r:w,g:m,b:k,a:D}=C,S=[`${f}.x = ${d??w??(p?`${p}.x`:Lt(u))};`,`${f}.y = ${y??m??(p?`${p}.y`:Lt(u))};`];return I>=3&&S.push(`${f}.z = ${M??k??(p?`${p}.z`:Lt(u))};`),I>=4&&S.push(`${f}.w = ${x??D??(p?`${p}.w`:Lt(u))};`),S}}dynoOut(){return new K(this,"vector")}}function zu(t,A){let e=null;if(ee(t)?e=A.length===1?"float":A.length===2?"vec2":A.length===3?"vec3":A.length===4?"vec4":null:QA(t)?e=A.length===1?"int":A.length===2?"ivec2":A.length===3?"ivec3":A.length===4?"ivec4":null:pA(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 ca extends v{constructor({vector:A,select:e}){super({a:A,outKey:"swizzle",outTypeFunc:s=>zu(s,e)}),this.statements=({inputs:s,outputs:n})=>[`${n.swizzle} = ${s.a}.${e};`]}}const qu=(t,A,e)=>new Ca({index:t,from:A,to:e}),Ku=t=>new Rt({value:t}),$u=t=>new GA({state:t}),Pu=t=>new RA({state:t}),ga=t=>new Ea({value:t}),la=t=>new Qa({value:t}),ua=t=>new pa({value:t}),ha=t=>new fa({value:t}),Vu=t=>new da({value:t}),Ou=t=>new ya({value:t}),Ia=t=>new wa({value:t}),Pe=t=>new ma({value:t}),Ba=(t,A,e)=>new xa({z:t,zNear:A,zFar:e}).outputs.depth;class Ca extends P{constructor({from:A,to:e,index:s}){super({inTypes:{from:"int",to:"int",index:"int"},outTypes:{index:"int"},inputs:{from:A,to:e,index:s},statements:({inputs:n,outputs:i})=>[`${i.index} = ${n.index} - ${n.from} + ${n.to};`]})}dynoOut(){return new K(this,"index")}}class GA extends P{constructor({state:A}){const e=$(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:n})=>{const i=e==="uint"?`${s.state}`:e==="int"?`uint(${s.state})`:`floatBitsToUint(${s.state})`;return[`${n.state} = pcg_next(${i});`]}})}dynoOut(){return new K(this,"state")}}class RA extends P{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 K(this,"hash")}}class Rt extends P{constructor({value:A}){const e=$(A),s=zs(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:n,outputs:i})=>{const r=pA(e)?`${n.value}`:QA(e)?`${s}(${n.value})`:`floatBitsToUint(${n.value})`;return[`${s} bits = ${r};`,`${i.state} = pcg_mix(bits);`]}})}dynoOut(){return new K(this,"state")}}class Ea extends VA{constructor({value:A}){super({inTypes:{value:$(A)},outTypes:{hash:"uint"},inputs:{value:A},construct:({value:e})=>{if(!e)throw new Error("value is required");let s=new Rt({value:e}).outputs.state;return s=new GA({state:s}).outputs.state,new RA({state:s}).outputs}})}dynoOut(){return new K(this,"hash")}}class Qa extends VA{constructor({value:A}){super({inTypes:{value:$(A)},outTypes:{hash:"uvec2"},inputs:{value:A},construct:({value:e})=>{if(!e)throw new Error("value is required");let s=new Rt({value:e}).outputs.state;s=new GA({state:s}).outputs.state;const n=new RA({state:s}).outputs.hash;s=new GA({state:s}).outputs.state;const i=new RA({state:s}).outputs.hash;return{hash:PA({vectorType:"uvec2",x:n,y:i})}}})}dynoOut(){return new K(this,"hash")}}class pa extends VA{constructor({value:A}){super({inTypes:{value:$(A)},outTypes:{hash:"uvec3"},inputs:{value:A},construct:({value:e})=>{if(!e)throw new Error("value is required");let s=new Rt({value:e}).outputs.state;s=new GA({state:s}).outputs.state;const n=new RA({state:s}).outputs.hash;s=new GA({state:s}).outputs.state;const i=new RA({state:s}).outputs.hash;s=new GA({state:s}).outputs.state;const r=new RA({state:s}).outputs.hash;return{hash:PA({vectorType:"uvec3",x:n,y:i,z:r})}}})}dynoOut(){return new K(this,"hash")}}class fa extends VA{constructor({value:A}){super({inTypes:{value:$(A)},outTypes:{hash:"uvec4"},inputs:{value:A},construct:({value:e})=>{if(!e)throw new Error("value is required");let s=new Rt({value:e}).outputs.state;s=new GA({state:s}).outputs.state;const n=new RA({state:s}).outputs.hash;s=new GA({state:s}).outputs.state;const i=new RA({state:s}).outputs.hash;s=new GA({state:s}).outputs.state;const r=new RA({state:s}).outputs.hash;s=new GA({state:s}).outputs.state;const a=new RA({state:s}).outputs.hash;return{hash:PA({vectorType:"uvec4",x:n,y:i,z:r,w:a})}}})}dynoOut(){return new K(this,"hash")}}class da extends VA{constructor({value:A}){super({inTypes:{value:$(A)},outTypes:{hash:"float"},inputs:{value:A},construct:({value:e})=>{if(!e)throw new Error("value is required");const s=ga(e);return{hash:rA(ar(s),_("float",1/2**32))}}})}dynoOut(){return new K(this,"hash")}}class ya extends VA{constructor({value:A}){super({inTypes:{value:$(A)},outTypes:{hash:"vec2"},inputs:{value:A},construct:({value:e})=>{if(!e)throw new Error("value is required");const s=la(e);return{hash:rA(or(s),_("float",1/2**32))}}})}dynoOut(){return new K(this,"hash")}}class wa extends VA{constructor({value:A}){super({inTypes:{value:$(A)},outTypes:{hash:"vec3"},inputs:{value:A},construct:({value:e})=>{if(!e)throw new Error("value is required");const s=ua(e);return{hash:rA(Qt(s),_("float",1/2**32))}}})}dynoOut(){return new K(this,"hash")}}class ma extends VA{constructor({value:A}){super({inTypes:{value:$(A)},outTypes:{hash:"vec4"},inputs:{value:A},construct:({value:e})=>{if(!e)throw new Error("value is required");const s=ha(e);return{hash:rA(cr(s),_("float",1/2**32))}}})}dynoOut(){return new K(this,"hash")}}class xa extends P{constructor({z:A,zNear:e,zFar:s}){super({inTypes:{z:"float",zNear:"float",zFar:"float"},outTypes:{depth:"float"},inputs:{z:A,zNear:e,zFar:s},statements:({inputs:n,outputs:i})=>[`float clamped = clamp(${n.z}, ${n.zNear}, ${n.zFar});`,`${i.depth} = (log2(clamped + 1.0) - log2(${n.zNear} + 1.0)) / (log2(${n.zFar} + 1.0) - log2(${n.zNear} + 1.0));`]})}dynoOut(){return new K(this,"depth")}}const Sa=(t,{scale:A,scales:e,rotate:s,translate:n})=>new Da({position:t,scale:A,scales:e,rotate:s,translate:n}).outputs.position,Ma=(t,{scale:A,scales:e,rotate:s})=>new va({dir:t,scale:A,scales:e,rotate:s}).outputs.dir,Zu=(t,{rotate:A})=>new ba({quaternion:t,rotate:A}).outputs.quaternion;class Da extends P{constructor({position:A,scale:e,scales:s,rotate:n,translate:i}){super({inTypes:{position:"vec3",scale:"float",scales:"vec3",rotate:"vec4",translate:"vec3"},outTypes:{position:"vec3"},inputs:{position:A,scale:e,scales:s,rotate:n,translate:i},statements:({inputs:r,outputs:a})=>{const{position:o}=a;if(!o)return[];const{scale:g,scales:l,rotate:c,translate:u}=r;return[`${o} = ${r.position??"vec3(0.0, 0.0, 0.0)"};`,g?`${o} *= ${g};`:null,l?`${o} *= ${l};`:null,c?`${o} = quatVec(${c}, ${o});`:null,u?`${o} += ${u};`:null].filter(Boolean)}})}}class va extends P{constructor({dir:A,scale:e,scales:s,rotate:n}){super({inTypes:{dir:"vec3",scale:"float",scales:"vec3",rotate:"vec4"},outTypes:{dir:"vec3"},inputs:{dir:A,scale:e,scales:s,rotate:n},statements:({inputs:i,outputs:r})=>{const{dir:a}=r;if(!a)return[];const{scale:o,scales:g,rotate:l}=i;return[`${a} = ${i.dir??"vec3(0.0, 0.0, 0.0)"};`,o?`${a} *= ${o};`:null,g?`${a} *= ${g};`:null,l?`${a} = quatVec(${l}, ${a});`:null].filter(Boolean)}})}}class ba extends P{constructor({quaternion:A,rotate:e}){super({inTypes:{quaternion:"vec4",rotate:"vec4"},outTypes:{quaternion:"vec4"},inputs:{quaternion:A,rotate:e},statements:({inputs:s,outputs:n})=>{const{quaternion:i}=n;return i?[`${i} = ${s.quaternion??"vec4(0.0, 0.0, 0.0, 1.0)"};`,e?`${i} = quatQuat(${s.rotate}, ${i});`:null].filter(Boolean):[]}})}}const Xu=()=>{throw new Error("Not implemented")},ju=()=>{throw new Error("Not implemented")},Wu=()=>{throw new Error("Not implemented")},Ah=()=>{throw new Error("Not implemented")},th=()=>{throw new Error("Not implemented")},eh=()=>{throw new Error("Not implemented")},sh=(t,A)=>new Ta({texture:t,lod:A}),nh=(t,A,e)=>new Fa({texture:t,coord:A,bias:e}),ih=(t,A,e)=>new ka({texture:t,coord:A,lod:e});class Ta extends P{constructor({texture:A,lod:e}){const s=$(A);super({inTypes:{texture:s,lod:"int"},outTypes:{size:Na(s)},inputs:{texture:A,lod:e},statements:({inputs:n,outputs:i})=>[`${i.size} = textureSize(${n.texture}, ${n.lod??"0"});`]})}dynoOut(){return new K(this,"size")}}class Fa extends P{constructor({texture:A,coord:e,bias:s}){const n=$(A);super({inTypes:{texture:n,coord:rh(n),bias:"float"},outTypes:{sample:Ua(n)},inputs:{texture:A,coord:e,bias:s},statements:({inputs:i,outputs:r})=>[`${r.sample} = texture(${i.texture}, ${i.coord}${i.bias?`, ${i.bias}`:""});`]})}dynoOut(){return new K(this,"sample")}}class ka extends P{constructor({texture:A,coord:e,lod:s}){const n=$(A);super({inTypes:{texture:n,coord:Na(n),lod:"int"},outTypes:{texel:Ua(n)},inputs:{texture:A,coord:e,lod:s},statements:({inputs:i,outputs:r})=>[`${r.texel} = texelFetch(${i.texture}, ${i.coord}, ${i.lod??"0"});`]})}dynoOut(){return new K(this,"texel")}}function Na(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 rh(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 Ua(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 ah=t=>new Ga({degrees:t}),oh=t=>new Ra({radians:t}),Ve=t=>new Ya({radians:t}),ch=t=>new _a({radians:t}),gh=t=>new Ja({radians:t}),lh=t=>new La({sin:t}),uh=t=>new Ha({cos:t}),hh=t=>new za({tan:t}),Ih=(t,A)=>new qa({y:t,x:A}),Bh=t=>new Ka({x:t}),Ch=t=>new $a({x:t}),Eh=t=>new Pa({x:t}),Qh=t=>new Va({x:t}),ph=t=>new Oa({x:t}),fh=t=>new Za({x:t});class Ga extends v{constructor({degrees:A}){super({a:A,outTypeFunc:e=>e,outKey:"radians"}),this.statements=({inputs:e,outputs:s})=>[`${s.radians} = radians(${e.a});`]}}class Ra extends v{constructor({radians:A}){super({a:A,outTypeFunc:e=>e,outKey:"degrees"}),this.statements=({inputs:e,outputs:s})=>[`${s.degrees} = degrees(${e.a});`]}}class Ya extends v{constructor({radians:A}){super({a:A,outTypeFunc:e=>e,outKey:"sin"}),this.statements=({inputs:e,outputs:s})=>[`${s.sin} = sin(${e.a});`]}}class _a extends v{constructor({radians:A}){super({a:A,outTypeFunc:e=>e,outKey:"cos"}),this.statements=({inputs:e,outputs:s})=>[`${s.cos} = cos(${e.a});`]}}class Ja extends v{constructor({radians:A}){super({a:A,outTypeFunc:e=>e,outKey:"tan"}),this.statements=({inputs:e,outputs:s})=>[`${s.tan} = tan(${e.a});`]}}class La extends v{constructor({sin:A}){super({a:A,outTypeFunc:e=>e,outKey:"asin"}),this.statements=({inputs:e,outputs:s})=>[`${s.asin} = asin(${e.a});`]}}class Ha extends v{constructor({cos:A}){super({a:A,outTypeFunc:e=>e,outKey:"acos"}),this.statements=({inputs:e,outputs:s})=>[`${s.acos} = acos(${e.a});`]}}class za extends v{constructor({tan:A}){super({a:A,outTypeFunc:e=>e,outKey:"atan"}),this.statements=({inputs:e,outputs:s})=>[`${s.atan} = atan(${e.a});`]}}class qa extends tA{constructor({y:A,x:e}){super({a:A,b:e,outTypeFunc:(s,n)=>s,outKey:"atan2"}),this.statements=({inputs:s,outputs:n})=>[`${n.atan2} = atan2(${s.a}, ${s.b});`]}}class Ka extends v{constructor({x:A}){super({a:A,outTypeFunc:e=>e,outKey:"sinh"}),this.statements=({inputs:e,outputs:s})=>[`${s.sinh} = sinh(${e.a});`]}}class $a extends v{constructor({x:A}){super({a:A,outTypeFunc:e=>e,outKey:"cosh"}),this.statements=({inputs:e,outputs:s})=>[`${s.cosh} = cosh(${e.a});`]}}class Pa extends v{constructor({x:A}){super({a:A,outTypeFunc:e=>e,outKey:"tanh"}),this.statements=({inputs:e,outputs:s})=>[`${s.tanh} = tanh(${e.a});`]}}class Va extends v{constructor({x:A}){super({a:A,outTypeFunc:e=>e,outKey:"asinh"}),this.statements=({inputs:e,outputs:s})=>[`${s.asinh} = asinh(${e.a});`]}}class Oa extends v{constructor({x:A}){super({a:A,outTypeFunc:e=>e,outKey:"acosh"}),this.statements=({inputs:e,outputs:s})=>[`${s.acosh} = acosh(${e.a});`]}}class Za extends v{constructor({x:A}){super({a:A,outTypeFunc:e=>e,outKey:"atanh"}),this.statements=({inputs:e,outputs:s})=>[`${s.atanh} = atanh(${e.a});`]}}const dh=Object.freeze(Object.defineProperty({__proto__:null,Abs:yi,Acos:Ha,Acosh:Oa,Add:Ii,All:sr,And:$i,Any:er,Asin:La,Asinh:Va,Atan:za,Atan2:qa,Atanh:Za,BVec2:Er,BVec3:Qr,BVec4:pr,BinaryOp:tA,Bool:hr,Ceil:xi,Clamp:_i,Combine:oa,CombineGsplat:Ws,CompMult:ea,CompXor:rr,Compilation:$s,Cos:_a,Cosh:$a,Cross:Or,Degrees:Ra,Determinant:ia,Distance:Pr,Div:Ei,Dot:Vr,Dyno:P,DynoBlock:VA,DynoBool:Be,DynoBvec2:an,DynoBvec3:gn,DynoBvec4:hn,DynoConst:Ks,DynoFloat:Et,DynoInt:Ot,DynoIsampler2D:vn,DynoIsampler2DArray:Tn,DynoIsampler3D:Nn,DynoIsamplerCube:Rn,DynoIvec2:cn,DynoIvec3:un,DynoIvec4:Bn,DynoLiteral:bt,DynoMat2:Cn,DynoMat2x2:En,DynoMat2x3:Qn,DynoMat2x4:pn,DynoMat3:fn,DynoMat3x2:dn,DynoMat3x3:yn,DynoMat3x4:wn,DynoMat4:mn,DynoMat4x2:xn,DynoMat4x3:Sn,DynoMat4x4:Mn,DynoOutput:K,DynoProgram:is,DynoProgramTemplate:rs,DynoRemapIndex:Ca,DynoSampler2D:bn,DynoSampler2DArray:Fn,DynoSampler2DArrayShadow:Jn,DynoSampler2DShadow:_n,DynoSampler3D:Un,DynoSamplerCube:Yn,DynoSamplerCubeShadow:Ln,DynoUint:rn,DynoUniform:F,DynoUsampler2D:Dn,DynoUsampler2DArray:Kt,DynoUsampler3D:kn,DynoUsamplerCube:Gn,DynoUvec2:on,DynoUvec3:ln,DynoUvec4:In,DynoValue:it,DynoVec2:qt,DynoVec3:Ft,DynoVec4:Gt,Equal:Ar,Exp:bi,Exp2:Ti,ExtendVec:jr,FaceForward:Wr,Float:Cr,FloatBitsToInt:Fr,FloatBitsToUint:kr,Floor:mi,Fract:Di,GreaterThan:ji,GreaterThanEqual:Wi,Gsplat:AA,GsplatNormal:tn,Hash:Ea,Hash2:Qa,Hash3:pa,Hash4:fa,HashFloat:da,HashVec2:ya,HashVec3:wa,HashVec4:ma,IMod:Qi,IVec2:fr,IVec3:dr,IVec4:yr,Int:Ir,IntBitsToFloat:Nr,Inverse:ra,InverseSqrt:Gi,IsInf:qi,IsNan:zi,Length:$r,LessThan:Zi,LessThanEqual:Xi,Log:Fi,Log2:ki,Mat2:vr,Mat3:br,Mat4:Tr,Max:Yi,Min:Ri,Mix:Ji,Mod:pi,Modf:fi,Mul:Ci,Neg:di,Normalize:Zr,NormalizedDepth:xa,Not:Oi,NotEqual:tr,NumPackedSplats:Vs,Or:Pi,Outer:sa,OutputPackedSplat:nn,OutputRgba8:es,PackHalf2x16:Jr,PackSnorm2x16:Gr,PackUnorm2x16:Yr,PcgHash:RA,PcgMix:Rt,PcgNext:GA,Pow:vi,ProjectH:Xr,Radians:Ga,ReadPackedSplat:Zs,ReadPackedSplatRange:Xs,ReflectVec:Aa,RefractVec:ta,Round:Mi,Select:nr,Sign:wi,SimpleCast:gA,Sin:Ya,Sinh:Ka,Smoothstep:Hi,Split:aa,SplitGsplat:js,Sqr:Ni,Sqrt:Ui,Step:Li,Sub:Bi,Swizzle:ca,TPackedSplats:ie,Tan:Ja,Tanh:Pa,TexelFetch:ka,Texture:Fa,TextureSize:Ta,TransformDir:va,TransformGsplat:en,TransformPosition:Da,TransformQuaternion:ba,Transpose:na,TrinaryOp:wt,Trunc:Si,UVec2:wr,UVec3:mr,UVec4:xr,Uint:Br,UintBitsToFloat:Ur,UintToRgba8:Hr,UnaryOp:v,UnpackHalf2x16:Lr,UnpackSnorm2x16:Rr,UnpackUnorm2x16:_r,Vec2:Sr,Vec3:Mr,Vec4:Dr,Xor:Vi,abs:wl,acos:uh,acosh:ph,add:EA,all:Wl,and:zl,any:jl,arrayIndex:th,arrayLength:eh,asin:lh,asinh:Qh,atan:hh,atan2:Ih,atanh:fh,bool:su,bvec2:ru,bvec3:au,bvec4:ou,ceil:Sl,clamp:Yl,combine:PA,combineGsplat:rt,comment:Ah,compMult:ku,compXor:Au,cos:ch,cosh:Ch,cross:Mu,defineGsplat:FA,defineGsplatNormal:An,definePackedSplats:me,degrees:oh,determinant:Gu,distance:Su,div:le,dot:zr,dyno:ne,dynoBlock:TA,dynoBool:Sc,dynoBvec2:vc,dynoBvec3:kc,dynoBvec4:Gc,dynoConst:_,dynoDeclare:As,dynoFloat:qA,dynoFor:Wu,dynoIf:Xu,dynoInt:Dc,dynoIsampler2D:Wc,dynoIsampler2DArray:eg,dynoIsampler3D:ig,dynoIsamplerCube:og,dynoIvec2:Tc,dynoIvec3:Uc,dynoIvec4:Yc,dynoLiteral:Ie,dynoMat2:Jc,dynoMat2x2:Lc,dynoMat2x3:Hc,dynoMat2x4:zc,dynoMat3:qc,dynoMat3x2:Kc,dynoMat3x3:$c,dynoMat3x4:Pc,dynoMat4:Vc,dynoMat4x2:Oc,dynoMat4x3:Zc,dynoMat4x4:Xc,dynoSampler2D:Ag,dynoSampler2DArray:sg,dynoSampler2DArrayShadow:lg,dynoSampler2DShadow:gg,dynoSampler3D:rg,dynoSamplerCube:cg,dynoSamplerCubeShadow:ug,dynoSwitch:ju,dynoUint:Mc,dynoUsampler2D:jc,dynoUsampler2DArray:tg,dynoUsampler3D:ng,dynoUsamplerCube:ag,dynoUvec2:bc,dynoUvec3:Nc,dynoUvec4:Rc,dynoVec2:Fc,dynoVec3:et,dynoVec4:_c,equal:Zl,exp:bl,exp2:Tl,extendVec:Kr,faceforward:Du,float:ar,floatBitsToInt:gr,floatBitsToUint:lr,floor:xl,fract:ue,greaterThan:Ol,greaterThanEqual:Ki,gsplatNormal:ze,hash:ga,hash2:la,hash3:ua,hash4:ha,hashFloat:Vu,hashVec2:Ou,hashVec3:Ia,hashVec4:Pe,imod:Ke,int:nu,intBitsToFloat:Qu,inverse:Ru,inversesqrt:Gl,isAllFloatType:ot,isBoolType:dt,isFloatType:ee,isInf:Hl,isIntType:QA,isMat2:gt,isMat3:lt,isMat4:ut,isMatFloatType:Js,isNan:Ll,isScalarType:yt,isUintType:pA,isVector2Type:Nt,isVector3Type:Ut,isVector4Type:se,isVectorType:Qc,ivec2:cu,ivec3:gu,ivec4:lu,length:xu,lessThan:Pl,lessThanEqual:Vl,literalNegOne:yc,literalOne:dc,literalZero:Lt,log:Fl,log2:kl,mat2:Bu,mat3:Cu,mat4:Eu,max:ui,min:Rl,mix:hi,mod:li,modf:yl,mul:rA,neg:os,normalize:qr,normalizedDepth:Ba,not:$l,notEqual:Xl,numPackedSplats:wc,numberAsFloat:z,numberAsInt:aA,numberAsUint:oA,or:ql,outer:Nu,outputPackedSplat:sn,outputRgba8:mc,packHalf2x16:ur,packSnorm2x16:fu,packUnorm2x16:yu,pcgHash:Pu,pcgMix:Ku,pcgNext:$u,pow:vl,projectH:Tu,radians:ah,readPackedSplat:Tt,readPackedSplatRange:Ps,reflectVec:vu,refractVec:bu,remapIndex:qu,round:Dl,sameSizeIvec:fc,sameSizeUvec:zs,sameSizeVec:pc,select:cs,sign:ml,sin:Ve,sinh:Bh,smoothstep:Jl,split:pt,splitGsplat:Ct,sqr:Nl,sqrt:Ul,step:_l,sub:ft,swizzle:Fu,tan:gh,tanh:Eh,texelFetch:ih,texture:nh,textureSize:sh,transformDir:Ma,transformGsplat:ts,transformPos:Sa,transformQuat:Zu,transpose:Uu,trunc:Ml,typeLiteral:qs,uint:iu,uintBitsToFloat:pu,uintToRgba8:$e,uniform:xc,unindent:BA,unindentLines:YA,unpackHalf2x16:mu,unpackSnorm2x16:du,unpackUnorm2x16:wu,uvec2:uu,uvec3:hu,uvec4:Iu,valType:$,vec2:or,vec3:Qt,vec4:cr,vectorDim:Hs,vectorElementType:Ls,xor:Kl},Symbol.toStringTag,{value:"Module"}));var yh=`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 UA=class UA{constructor({renderer:A}={}){this.renderer=A,this.capacity=0,this.count=0}dispose(){this.target&&(this.target.dispose(),this.target=void 0)}ensureBuffer(A,e){const n=Math.ceil(Math.max(1,A)/O)*O*4;if(e.byteLength>=n)return e;const i=new ArrayBuffer(n);if(e instanceof ArrayBuffer)return i;const r=e.constructor;return new r(i)}ensureCapacity(A){const{width:e,height:s,depth:n,maxSplats:i}=xA(A);(!this.target||i>this.capacity)&&(this.dispose(),this.capacity=i,this.target=new h.WebGLArrayRenderTarget(e,s,n,{depthBuffer:!1,stencilBuffer:!1,generateMipmaps:!1,magFilter:h.NearestFilter,minFilter:h.NearestFilter}),this.target.texture.format=h.RGBAFormat,this.target.texture.type=h.UnsignedByteType,this.target.texture.internalFormat="RGBA8",this.target.scissorTest=!0)}prepareProgramMaterial(A){let e=UA.readbackProgram.get(A);if(!e){const n=TA({index:"int"},{rgba8:"vec4"},({index:i})=>(A.inputs.index=i,{rgba8:new es({rgba8:A.outputs.rgba8})}));UA.programTemplate||(UA.programTemplate=new rs(yh)),e=new is({graph:n,inputs:{index:"index"},outputs:{rgba8:"target"},template:UA.programTemplate}),Object.assign(e.uniforms,{targetLayer:{value:0},targetBase:{value:0},targetCount:{value:0}}),UA.readbackProgram.set(A,e)}const s=e.prepareMaterial();return UA.fullScreenQuad.material=s,{program:e,material:s}}saveRenderState(A){return{xrEnabled:A.xr.enabled,autoClear:A.autoClear}}resetRenderState(A,e){A.setRenderTarget(null),A.xr.enabled=e.xrEnabled,A.autoClear=e.autoClear}process({count:A,material:e}){const s=this.renderer;if(!s)throw new Error("No renderer");if(!this.target)throw new Error("No target");const n=O*$A;e.uniforms.targetBase.value=0,e.uniforms.targetCount.value=A;let i=0;for(;i<A;){const r=Math.floor(i/n),a=r*n,o=Math.min($A,Math.ceil((A-a)/O));e.uniforms.targetLayer.value=r,this.target.scissor.set(0,0,O,o),s.setRenderTarget(this.target,r),s.xr.enabled=!1,s.autoClear=!1,UA.fullScreenQuad.render(s),i+=O*o}this.count=A}async read({readback:A}){const e=this.renderer;if(!e)throw new Error("No renderer");if(!this.target)throw new Error("No target");const s=Math.ceil(this.count/O)*O;if(A.byteLength<s*4)throw new Error(`Readback buffer too small: ${A.byteLength} < ${s*4}`);const n=new Uint8Array(A instanceof ArrayBuffer?A:A.buffer),i=O*$A;let r=0;const a=[];for(;r<this.count;){const o=Math.floor(r/i),g=o*i,l=Math.min($A,Math.ceil((this.count-g)/O));e.setRenderTarget(this.target,o);const c=O*l*4,u=n.subarray(g*4,g*4+c),I=e==null?void 0:e.readRenderTargetPixelsAsync(this.target,0,0,O,l,u);a.push(I),r+=O*l}return Promise.all(a).then(()=>A)}render({reader:A,count:e,renderer:s}){if(this.renderer=s||this.renderer,!this.renderer)throw new Error("No renderer");this.ensureCapacity(e);const{program:n,material:i}=this.prepareProgramMaterial(A);n.update();const r=this.saveRenderState(this.renderer);this.process({count:e,material:i}),this.resetRenderState(this.renderer,r)}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}async renderReadback({reader:A,count:e,renderer:s,readback:n}){if(this.renderer=s||this.renderer,!this.renderer)throw new Error("No renderer");this.ensureCapacity(e);const{program:i,material:r}=this.prepareProgramMaterial(A);i.update();const a=this.saveRenderState(this.renderer);this.process({count:e,material:r});const o=this.read({readback:n});return this.resetRenderState(this.renderer,a),o}getTexture(){var A;return(A=this.target)==null?void 0:A.texture}};UA.programTemplate=null,UA.readbackProgram=new Map,UA.fullScreenQuad=new Ss(new h.RawShaderMaterial({visible:!1}));let Zt=UA;const hA=class hA{constructor(A={}){this.capacity=0,this.count=0,this.array=null,this.readback=null,this.source=null,this.needsUpdate=!0,this.dyno=new F({key:"rgbaArray",type:Xa,globals:()=>[ja],value:{texture:hA.getEmpty(),count:0},update:e=>{var s;return e.texture=((s=this.readback)==null?void 0:s.getTexture())??this.source??hA.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)}dispose(){this.readback&&(this.readback.dispose(),this.readback=null),this.source&&(this.source.dispose(),this.source=null)}ensureCapacity(A){var e;if(!this.array||A>(((e=this.array)==null?void 0:e.length)??0)/4){this.capacity=xA(A).maxSplats;const s=new Uint8Array(this.capacity*4);this.array&&s.set(this.array),this.array=s}return this.array}getTexture(){var e;let A=(e=this.readback)==null?void 0:e.getTexture();return(this.source||this.array)&&(A=this.maybeUpdateSource()),A??hA.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: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}=xA(this.capacity);this.source=new h.DataArrayTexture(this.array,A,e,s),this.source.format=h.RGBAFormat,this.source.type=h.UnsignedByteType,this.source.internalFormat="RGBA8",this.source.needsUpdate=!0}this.source.needsUpdate=!0}return this.source}render({reader:A,count:e,renderer:s}){this.readback||(this.readback=new Zt({renderer:s})),this.readback.render({reader:A,count:e,renderer:s}),this.capacity=this.readback.capacity,this.count=this.readback.count}fromPackedSplats({packedSplats:A,base:e,count:s,renderer:n}){const{dynoSplats:i,dynoBase:r,dynoCount:a,reader:o}=hA.makeDynos();return i.packedSplats=A,r.value=e,a.value=s,this.render({reader:o,count:s,renderer:n}),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(!hA.emptySource){const A=new Uint8Array(4);hA.emptySource=new h.DataArrayTexture(A,1,1,1),hA.emptySource.format=h.RGBAFormat,hA.emptySource.type=h.UnsignedByteType,hA.emptySource.internalFormat="RGBA8",hA.emptySource.needsUpdate=!0}return hA.emptySource}static makeDynos(){if(!hA.dynos){const A=new Is,e=new Ot({value:0}),s=new Ot({value:0}),n=TA({index:"int"},{rgba8:"vec4"},({index:i})=>{if(!i)throw new Error("index is undefined");i=EA(i,e);const r=Ps(A,i,e,s);return{rgba8:Ct(r).outputs.rgba}});hA.dynos={dynoSplats:A,dynoBase:e,dynoCount:s,reader:n}}return hA.dynos}};hA.emptySource=null,hA.dynos=null;let pe=hA;const Xa={type:"RgbaArray"},ja=BA(`
|
|
struct RgbaArray {
|
|
sampler2DArray texture;
|
|
int count;
|
|
};
|
|
`);function wh(t,A){return new P({inTypes:{rgba:Xa,index:"int"},outTypes:{rgba:"vec4"},inputs:{rgba:t,index:A},globals:()=>[ja],statements:({inputs:s,outputs:n})=>YA(`
|
|
if ((index >= 0) && (index < ${s.rgba}.count)) {
|
|
${n.rgba} = texelFetch(${s.rgba}.texture, splatTexCoord(index), 0);
|
|
} else {
|
|
${n.rgba} = vec4(0.0, 0.0, 0.0, 0.0);
|
|
}
|
|
`)}).outputs.rgba}var Wa=(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))(Wa||{});function mh(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 Ao=(t=>(t.MULTIPLY="multiply",t.SET_RGB="set_rgb",t.ADD_RGBA="add_rgba",t))(Ao||{});function xh(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 to extends h.Object3D{constructor(A={}){super();const{type:e,invert:s,opacity:n,color:i,displace:r,radius:a}=A;this.type=e??"sphere",this.invert=s??!1,this.opacity=n??1,this.color=i??new h.Color(1,1,1),this.displace=r??new h.Vector3(0,0,0),this.radius=a??0}}const we=class we extends h.Object3D{constructor(A={}){const{name:e,rgbaBlendMode:s="multiply",sdfSmooth:n=0,softEdge:i=0,invert:r=!1,sdfs:a=null}=A;super(),this.rgbaBlendMode=s,this.sdfSmooth=n,this.softEdge=i,this.invert=r,this.sdfs=a,this.ordering=we.nextOrdering++,this.name=e??`Edit ${this.ordering}`}addSdf(A){this.sdfs==null&&(this.sdfs=[]),this.sdfs.includes(A)||this.sdfs.push(A)}removeSdf(A){this.sdfs!=null&&(this.sdfs=this.sdfs.filter(e=>e!==A))}};we.nextOrdering=1;let Xt=we;class eo{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 F({key:"sdfArray",type:so,globals:()=>[no],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 Ot({value:0}),this.dynoEdits=this.newEdits(this.editData,this.maxEdits)}newSdfTexture(A,e){const s=new h.DataTexture(A,8,e,h.RGBAIntegerFormat,h.UnsignedIntType);return s.internalFormat="RGBA32UI",s.needsUpdate=!0,s}newEdits(A,e){return new F({key:"edits",type:"uvec4",count:e,globals:()=>[io],value:A})}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){mt[0]=e;const s=this.editFloatData[A]!==mt[0];return s&&(this.editFloatData[A]=mt[0]),s}encodeEdit(A,{sdfFirst:e,sdfCount:s,invert:n,rgbaBlendMode:i,softEdge:r,sdfSmooth:a}){const o=A*4;let g=!1;return g=this.updateEditData(o+0,i|(n?256:0))||g,g=this.updateEditData(o+1,e|s<<16)||g,g=this.updateEditFloatData(o+2,r)||g,g=this.updateEditFloatData(o+3,a)||g,g}updateSdfData(A,e){const s=this.sdfData[A]!==e;return this.sdfData[A]=e,s}updateSdfFloatData(A,e){mt[0]=e;const s=this.sdfFloatData[A]!==mt[0];return s&&(this.sdfFloatData[A]=mt[0]),s}encodeSdf(A,{sdfType:e,invert:s,center:n,quaternion:i,scale:r,sizes:a},o){const g=A*32,l=e|(s?256:0);let c=!1;c=this.updateSdfFloatData(g+0,(n==null?void 0:n.x)??0)||c,c=this.updateSdfFloatData(g+1,(n==null?void 0:n.y)??0)||c,c=this.updateSdfFloatData(g+2,(n==null?void 0:n.z)??0)||c,c=this.updateSdfData(g+3,l)||c,c=this.updateSdfFloatData(g+4,(i==null?void 0:i.x)??0)||c,c=this.updateSdfFloatData(g+5,(i==null?void 0:i.y)??0)||c,c=this.updateSdfFloatData(g+6,(i==null?void 0:i.z)??0)||c,c=this.updateSdfFloatData(g+7,(i==null?void 0:i.w)??0)||c,c=this.updateSdfFloatData(g+8,(r==null?void 0:r.x)??0)||c,c=this.updateSdfFloatData(g+9,(r==null?void 0:r.y)??0)||c,c=this.updateSdfFloatData(g+10,(r==null?void 0:r.z)??0)||c,c=this.updateSdfData(g+11,0)||c,c=this.updateSdfFloatData(g+12,(a==null?void 0:a.x)??0)||c,c=this.updateSdfFloatData(g+13,(a==null?void 0:a.y)??0)||c,c=this.updateSdfFloatData(g+14,(a==null?void 0:a.z)??0)||c,c=this.updateSdfFloatData(g+15,(a==null?void 0:a.w)??0)||c;const u=Math.min(4,o.length);for(let I=0;I<u;++I){const E=g+16+I*4;c=this.updateSdfFloatData(E+0,o[I].x)||c,c=this.updateSdfFloatData(E+1,o[I].y)||c,c=this.updateSdfFloatData(E+2,o[I].z)||c,c=this.updateSdfFloatData(E+3,o[I].w)||c}return c}update(A){const e=A.reduce((c,{sdfs:u})=>c+u.length,0),s=this.ensureCapacity({maxEdits:A.length,maxSdfs:e}),n=[new h.Vector4,new h.Vector4],i=new h.Vector3,r=new h.Quaternion,a=new h.Vector3,o=new h.Vector4;let g=0,l=s;A.length!==this.dynoNumEdits.value&&(this.dynoNumEdits.value=A.length,this.numEdits=A.length,l=!0);for(const[c,{edit:u,sdfs:I}]of A.entries()){l=this.encodeEdit(c,{sdfFirst:g,sdfCount:I.length,invert:u.invert,rgbaBlendMode:xh(u.rgbaBlendMode),softEdge:u.softEdge,sdfSmooth:u.sdfSmooth})||l;let E=!1;for(const B of I)o.set(B.scale.x,B.scale.y,B.scale.z,B.radius),B.scale.setScalar(1),B.updateMatrixWorld(),B.matrixWorld.clone().invert().decompose(i,r,a),B.scale.set(o.x,o.y,o.z),B.updateMatrixWorld(),n[0].set(B.color.r,B.color.g,B.color.b,B.opacity),n[1].set(B.displace.x,B.displace.y,B.displace.z,1),E=this.encodeSdf(g,{sdfType:mh(B.type),invert:B.invert,center:i,quaternion:r,scale:a,sizes:o},n)||E,g+=1;this.numSdfs=g,E&&(this.sdfTexture.needsUpdate=!0),l||(l=E)}return{updated:l,dynoUpdated:s}}modify(A){return Sh(A,this.dynoSdfArray,this.dynoNumEdits,this.dynoEdits)}}const so={type:"SdfArray"},no=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);
|
|
}
|
|
`),io=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 Sh(t,A,e,s){return new P({inTypes:{gsplat:AA,sdfArray:so,numEdits:"int",rgbaDisplaceEdits:"uvec4"},outTypes:{gsplat:AA},globals:()=>[no,io],inputs:{gsplat:t,sdfArray:A,numEdits:e,rgbaDisplaceEdits:s},statements:({inputs:i,outputs:r})=>{const{sdfArray:a,numEdits:o,rgbaDisplaceEdits:g}=i,{gsplat:l}=r;return YA(`
|
|
${l} = ${i.gsplat};
|
|
if (isGsplatActive(${l}.flags)) {
|
|
for (int editIndex = 0; editIndex < ${o}; ++editIndex) {
|
|
applyPackedRgbaDisplaceEdit(
|
|
${g}[editIndex], ${a}.sdfTexture, ${a}.numSdfs,
|
|
${l}.center, ${l}.rgba
|
|
);
|
|
}
|
|
}
|
|
`)}}).outputs.gsplat}const mt=new Float32Array(1);class ro{constructor(A){this.modifier=A,this.cache=new Map}apply(A){let e=this.cache.get(A);return e||(e=TA({index:"int"},{gsplat:AA},({index:s})=>{const{gsplat:n}=A.apply({index:s});return this.modifier.apply({gsplat:n})}),this.cache.set(A,e)),e}}class It{constructor(){this.scale=new Et({value:Number.NEGATIVE_INFINITY}),this.rotate=new Gt({value:new h.Quaternion(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY)}),this.translate=new Ft({value:new h.Vector3(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 Ma(A,{rotate:this.rotate})}applyGsplat(A){return ts(A,{scale:this.scale,rotate:this.rotate,translate:this.translate})}updateFromMatrix(A){const e=new h.Vector3,s=new h.Quaternion,n=new h.Vector3;A.decompose(n,s,e);const i=(e.x+e.y+e.z)/3;let r=!1;return i!==this.scale.value&&(this.scale.value=i,r=!0),n.equals(this.translate.value)||(this.translate.value.copy(n),r=!0),s.equals(this.rotate.value)||(this.rotate.value.copy(s),r=!0),r}update(A){return A.updateMatrixWorld(),this.updateFromMatrix(A.matrixWorld)}}class kt extends h.Object3D{constructor({numSplats:A,generator:e,construct:s,update:n}){if(super(),this.numSplats=A??0,this.generator=e,this.frameUpdate=n,this.version=0,s){const i=s(this);Object.assign(this,i)}}updateVersion(){this.version+=1}set needsUpdate(A){A&&this.updateVersion()}}const st=class st extends kt{constructor(A={}){const e=new It,s=new It,n=new It,i=new It,r=new Gt({value:new h.Vector4(Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY)}),a=new Et({value:0}),o=new Et({value:0}),g={transform:e,viewToWorld:s,worldToView:n,viewToObject:i,recolor:r,time:a,deltaTime:o};if(super({update:({time:l,deltaTime:c,viewToWorld:u,globalEdits:I})=>this.update({time:l,deltaTime:c,viewToWorld:u,globalEdits:I})}),this.isInitialized=!1,this.recolor=new h.Color(1,1,1),this.opacity=1,this.enableViewToObject=!1,this.enableViewToWorld=!1,this.enableWorldToView=!1,this.skinning=null,this.edits=null,this.rgbaDisplaceEdits=null,this.splatRgba=null,this.maxSh=3,this.packedSplats=A.packedSplats??new zA,this.packedSplats.splatEncoding=A.splatEncoding??{...Me},this.numSplats=this.packedSplats.numSplats,this.editable=A.editable??!0,this.onFrame=A.onFrame,this.context=g,this.objectModifier=A.objectModifier,this.worldModifier=A.worldModifier,this.updateGenerator(),A.url||A.fileBytes||A.constructSplats||A.packedSplats&&!A.packedSplats.isInitialized)this.initialized=this.asyncInitialize(A).then(async()=>{if(this.updateGenerator(),this.isInitialized=!0,A.onLoad){const l=A.onLoad(this);l instanceof Promise&&await l}return this});else if(this.isInitialized=!0,this.initialized=Promise.resolve(this),A.onLoad){const l=A.onLoad(this);l instanceof Promise&&(this.initialized=l.then(()=>this))}this.add(Uh())}async asyncInitialize(A){const{url:e,fileBytes:s,fileType:n,fileName:i,maxSplats:r,constructSplats:a,splatEncoding:o}=A;if(e||s||a){const g={url:e,fileBytes:s,fileType:n,fileName:i,maxSplats:r,construct:a,splatEncoding:o};this.packedSplats.reinitialize(g)}this.packedSplats&&(await this.packedSplats.initialized,this.numSplats=this.packedSplats.numSplats,this.updateGenerator())}static async staticInitialize(){await Gs(),st.isStaticInitialized=!0}pushSplat(A,e,s,n,i){this.packedSplats.pushSplat(A,e,s,n,i)}forEachSplat(A){this.packedSplats.forEachSplat(A)}dispose(){this.packedSplats.dispose()}getBoundingBox(A=!0){if(!this.initialized)throw new Error("Cannot get bounding box before SplatMesh is initialized");const e=new h.Vector3(Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY),s=new h.Vector3(Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY),n=new h.Vector3,i=[-1,1];return this.packedSplats.forEachSplat((a,o,g,l,c,u)=>{if(A)e.min(o),s.max(o);else for(const I of i)for(const E of i)for(const B of i)n.set(I*g.x,E*g.y,B*g.z),n.applyQuaternion(l),n.add(o),e.min(n),s.max(n)}),new h.Box3(e,s)}constructGenerator(A){const{transform:e,viewToObject:s,recolor:n}=A,i=TA({index:"int"},{gsplat:AA},({index:r})=>{if(!r)throw new Error("index is undefined");let a=Tt(this.packedSplats.dyno,r);if(this.maxSh>=1){const{sh1Texture:g,sh2Texture:l,sh3Texture:c}=this.ensureShTextures();if(g){let u=function(p,d){const{x:y,y:M}=pt(d).outputs,x=rA(EA(y,M),_("float",.5)),w=rA(ft(M,y),_("float",.5));return EA(x,rA(p,w))};const I=s.translate,{center:E}=Ct(a).outputs,B=qr(ft(E,I)),C=bh(a,g,B);let Q=u(C,this.packedSplats.dynoSh1MinMax);if(this.maxSh>=2&&l){const p=Th(a,l,B);Q=EA(Q,u(p,this.packedSplats.dynoSh2MinMax))}if(this.maxSh>=3&&c){const p=Fh(a,c,B);Q=EA(Q,u(p,this.packedSplats.dynoSh3MinMax))}let{rgba:f}=Ct(a).outputs;f=EA(f,Kr(Q,_("float",0))),a=rt({gsplat:a,rgba:f})}}if(this.splatRgba){const g=wh(this.splatRgba.dyno,r);a=rt({gsplat:a,rgba:g})}this.skinning&&(a=this.skinning.modify(a)),this.objectModifier&&(a=this.objectModifier.apply({gsplat:a}).gsplat),a=e.applyGsplat(a);const o=rA(n,Ct(a).outputs.rgba);return a=rt({gsplat:a,rgba:o}),this.rgbaDisplaceEdits&&(a=this.rgbaDisplaceEdits.modify(a)),this.worldModifier&&(a=this.worldModifier.apply({gsplat:a}).gsplat),{gsplat:a}});this.generator=i}updateGenerator(){this.constructGenerator(this.context)}update({time:A,viewToWorld:e,deltaTime:s,globalEdits:n}){var C;this.numSplats=this.packedSplats.numSplats,this.context.time.value=A,this.context.deltaTime.value=s,st.dynoTime.value=A;const{transform:i,viewToObject:r,recolor:a}=this.context;let o=i.update(this);this.context.viewToWorld.updateFromMatrix(e)&&this.enableViewToWorld&&(o=!0);const g=e.clone().invert();this.context.worldToView.updateFromMatrix(g)&&this.enableWorldToView&&(o=!0);const u=new h.Matrix4().compose(i.translate.value,i.rotate.value,new h.Vector3().setScalar(i.scale.value)).invert().multiply(e);r.updateFromMatrix(u)&&(this.enableViewToObject||this.packedSplats.extra.sh1)&&(o=!0);const I=new h.Vector4(this.recolor.r,this.recolor.g,this.recolor.b,this.opacity);I.equals(a.value)||(a.value.copy(I),o=!0);const E=this.editable?(this.edits??[]).concat(n):[];this.editable&&!this.edits&&this.traverseVisible(Q=>{Q instanceof Xt&&E.push(Q)}),E.sort((Q,f)=>Q.ordering-f.ordering);const B=E.map(Q=>{if(Q.sdfs!=null)return{edit:Q,sdfs:Q.sdfs};const f=[];return Q.traverseVisible(p=>{p instanceof to&&f.push(p)}),{edit:Q,sdfs:f}});if(B.length>0&&!this.rgbaDisplaceEdits){const Q=B.length,f=B.reduce((p,d)=>p+d.sdfs.length,0);this.rgbaDisplaceEdits=new eo({maxEdits:Q,maxSdfs:f}),this.updateGenerator()}if(this.rgbaDisplaceEdits){const Q=this.rgbaDisplaceEdits.update(B);o||(o=Q.updated),Q.dynoUpdated&&this.updateGenerator()}o&&this.updateVersion(),(C=this.onFrame)==null||C.call(this,{mesh:this,time:A,deltaTime:s})}raycast(A,e){var I,E;if(!this.packedSplats.packedArray||!this.packedSplats.numSplats)return;const{near:s,far:n,ray:i}=A,r=this.matrixWorld.clone().invert(),a=new h.Matrix3().setFromMatrix4(r),o=i.origin.clone().applyMatrix4(r),g=i.direction.clone().applyMatrix3(a),l=new h.Vector3;r.decompose(new h.Vector3,new h.Quaternion,l),(l.x*l.y*l.z)**(1/3);const u=ic(o.x,o.y,o.z,g.x,g.y,g.z,s,n,this.packedSplats.numSplats,this.packedSplats.packedArray,!0,((I=this.packedSplats.splatEncoding)==null?void 0:I.lnScaleMin)??kA,((E=this.packedSplats.splatEncoding)==null?void 0:E.lnScaleMax)??NA);for(const B of u){const C=i.direction.clone().multiplyScalar(B).add(i.origin);e.push({distance:B,point:C,object:this})}}ensureShTextures(){if(!this.packedSplats.extra.sh1)return{};let A=this.packedSplats.extra.sh1Texture;if(!A){let n=this.packedSplats.extra.sh1;const{width:i,height:r,depth:a,maxSplats:o}=xA(n.length/2);if(n.length<o*2){const l=new Uint32Array(o*2);l.set(n),this.packedSplats.extra.sh1=l,n=l}const g=new h.DataArrayTexture(n,i,r,a);g.format=h.RGIntegerFormat,g.type=h.UnsignedIntType,g.internalFormat="RG32UI",g.needsUpdate=!0,A=new Kt({value:g,key:"sh1"}),this.packedSplats.extra.sh1Texture=A}if(!this.packedSplats.extra.sh2)return{sh1Texture:A};let e=this.packedSplats.extra.sh2Texture;if(!e){let n=this.packedSplats.extra.sh2;const{width:i,height:r,depth:a,maxSplats:o}=xA(n.length/4);if(n.length<o*4){const l=new Uint32Array(o*4);l.set(n),this.packedSplats.extra.sh2=l,n=l}const g=new h.DataArrayTexture(n,i,r,a);g.format=h.RGBAIntegerFormat,g.type=h.UnsignedIntType,g.internalFormat="RGBA32UI",g.needsUpdate=!0,e=new Kt({value:g,key:"sh2"}),this.packedSplats.extra.sh2Texture=e}if(!this.packedSplats.extra.sh3)return{sh1Texture:A,sh2Texture:e};let s=this.packedSplats.extra.sh3Texture;if(!s){let n=this.packedSplats.extra.sh3;const{width:i,height:r,depth:a,maxSplats:o}=xA(n.length/4);if(n.length<o*4){const l=new Uint32Array(o*4);l.set(n),this.packedSplats.extra.sh3=l,n=l}const g=new h.DataArrayTexture(n,i,r,a);g.format=h.RGBAIntegerFormat,g.type=h.UnsignedIntType,g.internalFormat="RGBA32UI",g.needsUpdate=!0,s=new Kt({value:g,key:"sh3"}),this.packedSplats.extra.sh3Texture=s}return{sh1Texture:A,sh2Texture:e,sh3Texture:s}}};st.staticInitialized=st.staticInitialize(),st.isStaticInitialized=!1,st.dynoTime=new Et({value:0});let ct=st;const Mh=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);
|
|
}
|
|
`),Dh=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));
|
|
}
|
|
`),vh=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 bh(t,A,e){return ne({inTypes:{gsplat:AA,sh1:"usampler2DArray",viewDir:"vec3"},outTypes:{rgb:"vec3"},inputs:{gsplat:t,sh1:A,viewDir:e},globals:()=>[FA,Mh],statements:({inputs:s,outputs:n})=>YA(`
|
|
if (isGsplatActive(${s.gsplat}.flags)) {
|
|
${n.rgb} = evaluateSH1(${s.gsplat}, ${s.sh1}, ${s.viewDir});
|
|
} else {
|
|
${n.rgb} = vec3(0.0);
|
|
}
|
|
`)}).outputs.rgb}function Th(t,A,e){return ne({inTypes:{gsplat:AA,sh2:"usampler2DArray",viewDir:"vec3"},outTypes:{rgb:"vec3"},inputs:{gsplat:t,sh2:A,viewDir:e},globals:()=>[FA,Dh],statements:({inputs:s,outputs:n})=>YA(`
|
|
if (isGsplatActive(${s.gsplat}.flags)) {
|
|
${n.rgb} = evaluateSH2(${s.gsplat}, ${s.sh2}, ${s.viewDir});
|
|
} else {
|
|
${n.rgb} = vec3(0.0);
|
|
}
|
|
`)}).outputs.rgb}function Fh(t,A,e){return ne({inTypes:{gsplat:AA,sh3:"usampler2DArray",viewDir:"vec3"},outTypes:{rgb:"vec3"},inputs:{gsplat:t,sh3:A,viewDir:e},globals:()=>[FA,vh],statements:({inputs:s,outputs:n})=>YA(`
|
|
if (isGsplatActive(${s.gsplat}.flags)) {
|
|
${n.rgb} = evaluateSH3(${s.gsplat}, ${s.sh3}, ${s.viewDir});
|
|
} else {
|
|
${n.rgb} = vec3(0.0);
|
|
}
|
|
`)}).outputs.rgb}const kh=new h.BufferGeometry,Nh=new h.ShaderMaterial;function Uh(){const t=new h.Mesh(kh,Nh);return t.frustumCulled=!1,t.onBeforeRender=function(A,e){if(!e.isScene){this.removeFromParent();return}let s=!1;e.traverse(n=>{n instanceof Ae&&(s=!0)}),s||e.add(new Ae({renderer:A})),this.removeFromParent()},t}const ps=["char","uchar","short","ushort","int","uint","float","double"],Dt=class Dt{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 e=new ReadableStream({start:r=>{r.enqueue(this.fileBytes.slice(0,65536)),r.close()}}).pipeThrough(new TextDecoderStream).getReader();this.header="";const s=`end_header
|
|
`;for(;;){const{value:r,done:a}=await e.read();if(a)throw new Error("Failed to read header");this.header+=r;const o=this.header.indexOf(s);if(o>=0){this.header=this.header.slice(0,o+s.length);break}}const n=new TextEncoder().encode(this.header).length;this.data=new DataView(this.fileBytes.buffer,n),this.elements={};let i=null;this.comments=[],this.header.trim().split(`
|
|
`).forEach((r,a)=>{const o=r.trim();if(a===0){if(o!=="ply")throw new Error("Invalid PLY header");return}if(o.length===0)return;const g=o.split(" ");switch(g[0]){case"format":if(g[1]==="binary_little_endian")this.littleEndian=!0;else if(g[1]==="binary_big_endian")this.littleEndian=!1;else throw new Error(`Unsupported PLY format: ${g[1]}`);if(g[2]!=="1.0")throw new Error(`Unsupported PLY version: ${g[2]}`);break;case"end_header":break;case"comment":this.comments.push(o.slice(8));break;case"element":{const l=g[1];i={name:l,count:Number.parseInt(g[2]),properties:{}},this.elements[l]=i;break}case"property":if(i==null)throw new Error("Property must be inside an element");g[1]==="list"?i.properties[g[4]]={isList:!0,type:g[3],countType:g[2]}:i.properties[g[2]]={isList:!1,type:g[1]};break}}),this.elements.vertex&&(this.numSplats=this.elements.vertex.count)}parseData(A){let e=0;const s=this.data;if(s==null)throw new Error("No data to parse");for(const n in this.elements){const i=this.elements[n],{count:r,properties:a}=i,o=Yh(a),g=_h(a,this.littleEndian),l=A(i)??(()=>{});for(let c=0;c<r;c++)e=g(s,e,o),l(c,o)}}parseSplats(A,e){if(this.elements.vertex==null)throw new Error("No vertex element found");let s=!1;const n=[];let i=0,r=[],a=[],o=[],g,l,c;function u(){const Q=Rh[i];r=new Array(3).fill(null).flatMap((f,p)=>[0,1,2].map((d,y)=>p+y*Q/3)),a=new Array(5).fill(null).flatMap((f,p)=>[0,1,2].map((d,y)=>3+p+y*Q/3)),o=new Array(7).fill(null).flatMap((f,p)=>[0,1,2].map((d,y)=>8+p+y*Q/3)),g=i>=1?new Float32Array(3*3):void 0,l=i>=2?new Float32Array(5*3):void 0,c=i>=3?new Float32Array(7*3):void 0}function I(Q,f){if(!g)throw new Error("Missing sh1");const p=f.f_rest;for(let d=0;d<r.length;d++)g[d]=p[r[d]]*8/255-4;if(l)for(let d=0;d<a.length;d++)l[d]=p[a[d]]*8/255-4;if(c)for(let d=0;d<o.length;d++)c[d]=p[o[d]]*8/255-4;e==null||e(Q,g,l,c)}function E(Q){const{min_x:f,min_y:p,min_z:d,max_x:y,max_y:M,max_z:x,min_scale_x:w,min_scale_y:m,min_scale_z:k,max_scale_x:D,max_scale_y:S,max_scale_z:U}=Q.properties;if(!f||!p||!d||!y||!M||!x||!w||!m||!k||!D||!S||!U)throw new Error("Missing PLY chunk properties");return s=!0,(T,b)=>{const{min_x:N,min_y:R,min_z:Z,max_x:J,max_y:eA,max_z:q,min_scale_x:X,min_scale_y:L,min_scale_z:j,max_scale_x:V,max_scale_y:W,max_scale_z:G,min_r:dA,min_g:lA,min_b:yA,max_r:wA,max_g:SA,max_b:CA}=b;n.push({min_x:N,min_y:R,min_z:Z,max_x:J,max_y:eA,max_z:q,min_scale_x:X,min_scale_y:L,min_scale_z:j,max_scale_x:V,max_scale_y:W,max_scale_z:G,min_r:dA,min_g:lA,min_b:yA,max_r:wA,max_g:SA,max_b:CA})}}function B(Q){if(e&&Q.name==="sh")return i=Oe(Q.properties),u(),I;if(Q.name!=="vertex")return null;const{packed_position:f,packed_rotation:p,packed_scale:d,packed_color:y}=Q.properties;if(!f||!p||!d||!y)throw new Error("Missing PLY properties: packed_position, packed_rotation, packed_scale, packed_color");const M=Math.sqrt(2);return(x,w)=>{const m=n[x>>>8];if(m==null)throw new Error("Missing PLY chunk");const{min_x:k,min_y:D,min_z:S,max_x:U,max_y:T,max_z:b,min_scale_x:N,min_scale_y:R,min_scale_z:Z,max_scale_x:J,max_scale_y:eA,max_scale_z:q,min_r:X,min_g:L,min_b:j,max_r:V,max_g:W,max_b:G}=m,{packed_position:dA,packed_rotation:lA,packed_scale:yA,packed_color:wA}=w,SA=(dA>>>21&2047)/2047*(U-k)+k,CA=(dA>>>11&1023)/1023*(T-D)+D,_A=(dA&2047)/2047*(b-S)+S,MA=((lA>>>20&1023)/1023-.5)*M,jA=((lA>>>10&1023)/1023-.5)*M,WA=((lA&1023)/1023-.5)*M,Y=Math.sqrt(Math.max(0,1-MA*MA-jA*jA-WA*WA)),DA=lA>>>30,uA=DA===0?MA:DA===1?Y:jA,Yt=DA<=1?jA:DA===2?Y:WA,ae=DA<=2?WA:Y,vA=DA===0?Y:MA,H=Math.exp((yA>>>21&2047)/2047*(J-N)+N),OA=Math.exp((yA>>>11&1023)/1023*(eA-R)+R),ve=Math.exp((yA&2047)/2047*(q-Z)+Z),be=(wA>>>24&255)/255*((V??1)-(X??0))+(X??0),Te=(wA>>>16&255)/255*((W??1)-(L??0))+(L??0),Fe=(wA>>>8&255)/255*((G??1)-(j??0))+(j??0),ke=(wA&255)/255;A(x,SA,CA,_A,H,OA,ve,uA,Yt,ae,vA,ke,be,Te,Fe)}}const C=Q=>{if(Q.name==="chunk")return E(Q);if(s)return B(Q);if(Q.name!=="vertex")return null;const{x:f,y:p,z:d,scale_0:y,scale_1:M,scale_2:x,rot_0:w,rot_1:m,rot_2:k,rot_3:D,opacity:S,f_dc_0:U,f_dc_1:T,f_dc_2:b,red:N,green:R,blue:Z,alpha:J}=Q.properties;if(!f||!p||!d)throw new Error("Missing PLY properties: x, y, z");const eA=y&&M&&x,q=w&&m&&k&&D,X=J!=null?ge[J.type]:1,L=N!=null?ge[N.type]:1,j=R!=null?ge[R.type]:1,V=Z!=null?ge[Z.type]:1;return i=Oe(Q.properties),u(),(W,G)=>{const dA=eA?Math.exp(G.scale_0):Dt.defaultPointScale,lA=eA?Math.exp(G.scale_1):Dt.defaultPointScale,yA=eA?Math.exp(G.scale_2):Dt.defaultPointScale,wA=q?G.rot_1:0,SA=q?G.rot_2:0,CA=q?G.rot_3:0,_A=q?G.rot_0:1,MA=S!=null?1/(1+Math.exp(-G.opacity)):J!=null?G.alpha/X:1,jA=U!=null?G.f_dc_0*ce+.5:N!=null?G.red/L:1,WA=T!=null?G.f_dc_1*ce+.5:R!=null?G.green/j:1,Y=b!=null?G.f_dc_2*ce+.5:Z!=null?G.blue/V:1;if(A(W,G.x,G.y,G.z,dA,lA,yA,wA,SA,CA,_A,MA,jA,WA,Y),e&&g){const DA=G.f_rest;if(g)for(let uA=0;uA<r.length;uA++)g[uA]=DA[r[uA]];if(l)for(let uA=0;uA<a.length;uA++)l[uA]=DA[a[uA]];if(c)for(let uA=0;uA<o.length;uA++)c[uA]=DA[o[uA]];e(W,g,l,c)}}};this.parseData(C)}injectRgba(A){let e=0;const s=this.data;if(s==null)throw new Error("No parsed data");if(A.length!==this.numSplats*4)throw new Error("Invalid RGBA array length");for(const n in this.elements){const i=this.elements[n],{count:r,properties:a}=i,o=[];let g=0;const l=n==="vertex";if(l){for(const c of["opacity","f_dc_0","f_dc_1","f_dc_2"])if(!a[c]||a[c].type!=="float")throw new Error(`Can't injectRgba due to property: ${c}`)}for(const[c,u]of Object.entries(a))if(u.isList)o.push(()=>{const I=St[u.countType](s,e,this.littleEndian);e+=HA[u.countType],e+=I*HA[u.type]});else{if(l)if(c==="f_dc_0"||c==="f_dc_1"||c==="f_dc_2"){const I=Number.parseInt(c.slice(5));o.push(()=>{const E=(A[g+I]/255-.5)/ce;fs[u.type](s,e,this.littleEndian,E)})}else c==="opacity"&&o.push(()=>{const I=Math.max(-100,Math.min(100,-Math.log(1/(A[g+3]/255)-1)));fs[u.type](s,e,this.littleEndian,I)});o.push(()=>{e+=HA[u.type]})}for(let c=0;c<r;c++){for(const u of o)u();l&&(g+=4)}}}};Dt.defaultPointScale=.001;let jt=Dt;const ce=.28209479177387814,St={char:(t,A,e)=>t.getInt8(A),uchar:(t,A,e)=>t.getUint8(A),short:(t,A,e)=>t.getInt16(A,e),ushort:(t,A,e)=>t.getUint16(A,e),int:(t,A,e)=>t.getInt32(A,e),uint:(t,A,e)=>t.getUint32(A,e),float:(t,A,e)=>t.getFloat32(A,e),double:(t,A,e)=>t.getFloat64(A,e)},fs={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)}},HA={char:1,uchar:1,short:2,ushort:2,int:4,uint:4,float:4,double:8},ge={char:127,uchar:255,short:32767,ushort:65535,int:2147483647,uint:4294967295,float:1,double:1},Gh={0:0,9:1,24:2,45:3},Rh={0:0,1:9,2:24,3:45},gs=/^f_rest_([0-9]{1,2})$/;function Yh(t){const A={};for(const[e,s]of Object.entries(t))gs.test(e)?A.f_rest=new Array(Oe(t)):A[e]=s.isList?[]:0;return A}function _h(t,A){return Hh(t)?zh(t,A):qh(t,A)}const Jh=(()=>{try{new Function("return 42;")}catch{return!1}return!0})(),Lh=/^[a-zA-Z0-9_]+$/;function Hh(t){if(!Jh)return!1;for(const[A,e]of Object.entries(t))if(!Lh.test(A)||e.isList&&!ps.includes(e.countType)||!ps.includes(e.type))return!1;return!0}function zh(t,A){const e=["let list;"];for(const[n,i]of Object.entries(t)){const r=n.match(gs);if(r){const a=+r[1];e.push(`
|
|
item.f_rest[${a}] = PARSE_FIELD['${i.type}'](data, offset, ${A});
|
|
offset += ${HA[i.type]};
|
|
`)}else i.isList?e.push(`
|
|
list = item['${n}'];
|
|
list.length = PARSE_FIELD['${i.countType}'](data, offset, ${A});
|
|
offset += ${HA[i.countType]};
|
|
for (let i = 0; i < list.length; i++) {
|
|
list[i] = PARSE_FIELD['${i.type}'](data, offset, ${A});
|
|
offset += ${HA[i.type]};
|
|
}
|
|
`):e.push(`
|
|
item['${n}'] = PARSE_FIELD['${i.type}'](data, offset, ${A});
|
|
offset += ${HA[i.type]};
|
|
`)}e.push("return offset;");const s=new Function("data","offset","item","PARSE_FIELD",e.join(`
|
|
`));return(n,i,r)=>s(n,i,r,St)}function qh(t,A){const e=[];for(const[s,n]of Object.entries(t)){const i=s.match(gs);if(i){const r=+i[1];e.push((a,o,g)=>(g.f_rest[r]=St[n.type](a,o,A),o+HA[n.type]))}else n.isList?e.push((r,a,o)=>{const g=o[s];g.length=St[n.countType](r,a,A);let l=a+HA[n.countType];for(let c=0;c<g.length;c++)g[c]=St[n.type](r,l,A),l+=HA[n.type];return l}):e.push((r,a,o)=>(o[s]=St[n.type](r,a,A),a+HA[n.type]))}return(s,n,i)=>{let r=n;for(let a=0;a<e.length;a++)r=e[a](s,r,i);return r}}function Oe(t){let A=0;for(;t[`f_rest_${A}`];)A+=1;const e=Gh[A];if(e==null)throw new Error(`Unsupported number of SH coefficients: ${A}`);return e}const ao='(function(){"use strict";let xA;const re=typeof TextDecoder<"u"?new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}):{decode:()=>{throw Error("TextDecoder not available")}};typeof TextDecoder<"u"&&re.decode();let OA=null;function is(){return(OA===null||OA.byteLength===0)&&(OA=new Uint8Array(xA.memory.buffer)),OA}function ns(s,A){return s=s>>>0,re.decode(is().subarray(s,s+A))}function rs(s,A,t){return xA.sort_splats(s,A,t)>>>0}function gs(s,A,t){return xA.sort32_splats(s,A,t)>>>0}async function as(s,A){if(typeof Response=="function"&&s instanceof Response){if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(s,A)}catch(e){if(s.headers.get("Content-Type")!="application/wasm")console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n",e);else throw e}const t=await s.arrayBuffer();return await WebAssembly.instantiate(t,A)}else{const t=await WebAssembly.instantiate(s,A);return t instanceof WebAssembly.Instance?{instance:t,module:s}:t}}function os(){const s={};return s.wbg={},s.wbg.__wbg_buffer_609cc3eee51ed158=function(A){return A.buffer},s.wbg.__wbg_length_3b4f022188ae8db6=function(A){return A.length},s.wbg.__wbg_length_6ca527665d89694d=function(A){return A.length},s.wbg.__wbg_length_8cfd2c6409af88ad=function(A){return A.length},s.wbg.__wbg_new_9fee97a409b32b68=function(A){return new Uint16Array(A)},s.wbg.__wbg_new_e3b321dcfef89fc7=function(A){return new Uint32Array(A)},s.wbg.__wbg_newwithbyteoffsetandlength_e6b7e69acd4c7354=function(A,t,e){return new Float32Array(A,t>>>0,e>>>0)},s.wbg.__wbg_newwithbyteoffsetandlength_f1dead44d1fc7212=function(A,t,e){return new Uint32Array(A,t>>>0,e>>>0)},s.wbg.__wbg_newwithlength_5a5efe313cfd59f1=function(A){return new Float32Array(A>>>0)},s.wbg.__wbg_set_10bad9bee0e9c58b=function(A,t,e){A.set(t,e>>>0)},s.wbg.__wbg_set_d23661d19148b229=function(A,t,e){A.set(t,e>>>0)},s.wbg.__wbg_set_f4f1f0daa30696fc=function(A,t,e){A.set(t,e>>>0)},s.wbg.__wbg_subarray_3aaeec89bb2544f0=function(A,t,e){return A.subarray(t>>>0,e>>>0)},s.wbg.__wbg_subarray_769e1e0f81bb259b=function(A,t,e){return A.subarray(t>>>0,e>>>0)},s.wbg.__wbindgen_init_externref_table=function(){const A=xA.__wbindgen_export_0,t=A.grow(4);A.set(0,void 0),A.set(t+0,void 0),A.set(t+1,null),A.set(t+2,!0),A.set(t+3,!1)},s.wbg.__wbindgen_memory=function(){return xA.memory},s.wbg.__wbindgen_throw=function(A,t){throw new Error(ns(A,t))},s}function Is(s,A){return xA=s.exports,ge.__wbindgen_wasm_module=A,OA=null,xA.__wbindgen_start(),xA}async function ge(s){if(xA!==void 0)return xA;typeof s<"u"&&(Object.getPrototypeOf(s)===Object.prototype?{module_or_path:s}=s:console.warn("using deprecated parameters for the initialization function; pass a single object instead")),typeof s>"u"&&(s=new URL("data:application/wasm;base64,AGFzbQEAAAABzAEeYAJ/fwF/YAJ/fwBgA39/fwF/YAN/f38AYAF/AX9gAX8AYANvf38Bb2AFf39/f38Bf2AFf39/f38AYAFvAW9gA29vfwBgAW8Bf2AAAGAEf39/fwBgAX0BfWAAAX9gBH9/f38Bf2ADf29vAX9gAX8Bb2AAAW9gBn9/f39/fwBgDX19fX19fX19f29/fX0Bb2AGf39/f39/AX9gBX9/fn9/AGAEf35/fwBgBX9/fH9/AGAEf3x/fwBgBX9/fX9/AGAEf31/fwBgAn19AX0C8gQRA3diZx1fX3diZ19idWZmZXJfNjA5Y2MzZWVlNTFlZDE1OAAJA3diZxpfX3diZ19uZXdfOWZlZTk3YTQwOWIzMmI2OAAJA3diZxpfX3diZ19zZXRfZjRmMWYwZGFhMzA2OTZmYwAKA3diZx1fX3diZ19sZW5ndGhfOGNmZDJjNjQwOWFmODhhZAALA3diZzFfX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9mMWRlYWQ0NGQxZmM3MjEyAAYDd2JnGl9fd2JnX25ld19lM2IzMjFkY2ZlZjg5ZmM3AAkDd2JnGl9fd2JnX3NldF9kMjM2NjFkMTkxNDhiMjI5AAoDd2JnHV9fd2JnX2xlbmd0aF82Y2E1Mjc2NjVkODk2OTRkAAsDd2JnMV9fd2JnX25ld3dpdGhieXRlb2Zmc2V0YW5kbGVuZ3RoX2U2YjdlNjlhY2Q0YzczNTQABgN3YmcaX193Ymdfc2V0XzEwYmFkOWJlZTBlOWM1OGIACgN3YmcdX193YmdfbGVuZ3RoXzNiNGYwMjIxODhhZThkYjYACwN3YmcfX193Ymdfc3ViYXJyYXlfNzY5ZTFlMGY4MWJiMjU5YgAGA3diZx9fX3diZ19zdWJhcnJheV8zYWFlZWM4OWJiMjU0NGYwAAYDd2JnJF9fd2JnX25ld3dpdGhsZW5ndGhfNWE1ZWZlMzEzY2ZkNTlmMQASA3diZxBfX3diaW5kZ2VuX3Rocm93AAEDd2JnEV9fd2JpbmRnZW5fbWVtb3J5ABMDd2JnH19fd2JpbmRnZW5faW5pdF9leHRlcm5yZWZfdGFibGUADANjYgQABQcCAwUCDgEBDwEDAQAAAAgMAQMDAQEIBRQBAw0AAQMDAgIAAQEHAxUBAQMWCBcZBxsF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IA8gICAOlJIgGZUiDSANlJJDAACAP14NAQsgBiAOX0UgByAOYEVyDQAgKigCCCIlICooAgBGBEAgKkGQh8AAECgLICogJUEBajYCCCAqKAIEICVBAnRqIA44AgALIAogLEECdGohCiAnICxrIicNAAsLIClBEGokACAmKAIUIgpBhAFPBEAgChArCyAtIicgK0kNAAsMAQsDQCAmICZBBGogJ0ECdCAnQYCABCArICdrIgogCkGAgARPGyIKaiItQQJ0EF82AhQgCkECdCInIC5LDQQgJkEUaiAIICcQMyAmIAI4AiAgJiABOAIcICYgADgCGCAmIAU4AiwgJiAEOAIoICYgAzgCJCAIIQojAEEQayIpJAAgJwRAICZBCGohKiAmQSRqIiUqAgAiGyAblCAlKgIEIhwgHJSSICUqAggiESARlJIhFCAMIAuTQwAAfkOVIQ8gJkEYaiIlKgIIISIgJSoCBCEjICUqAgAhJANAICdBBCAnQQRJIiUbISwCQCAKLQADs0MAAH9DlUPNzMw9XQ0AIClBBGogCiAsEBYCfQJAICVFBEAgKSoCDCEQICkqAgghDiApKgIEIQ1DAAAAACETQwAAAAAhEiAKKAIMIihB/wFxBEAgCyAPIChBAWtB/wFxs5SSEHIhEgsgKEEIdiIlQf8BcQRAIAsgDyAlQQFrQf8BcbOUkhByIRMLICIgEJMhFyAjIA6TIRggJCANkyEQIChBEHYiJUH/AXENAUMAAAAADAILQQMgLEHAh8AAEDIACyALIA8gJUEBa0H/AXGzlJIQcgshDSAbIBCUIBwgGJSSIBEgF5SSIg4gDpQgFCAQIBCUIBggGJSSIBcgF5SSIBIgE5IgDZJDAABAQJUiDSANlJOUkyINQwAAAABdDQAgDowgDZGTIBSVIg0gBmBFIAcgDWBFcg0AICooAggiJSAqKAIARgRAICpBgIfAABAoCyAqICVBAWo2AgggKigCBCAlQQJ0aiANOAIACyAKICxBAnRqIQogJyAsayInDQALCyApQRBqJAAgJigCFCIKQYQBTwRAIAoQKwsgLSInICtJDQALC0GYlcAAKAIAQQFqISUgJigCECEnC0GYlcAAICU2AgAgJxANIQkQHCIIIAkmASAmIAg2AiQgJigCDCEKICYoAhAhKyMAQSBrIiUkACAmQSRqKAIAIgglARAKIScgJSArNgIEICUgJzYCAAJAICcgK0YEQBBWIi0QUiInJQEgCiArEAghCRAcIgogCSYBIC1BhAFPBEAgLRArCyAnQYQBTwRAICcQKwsgCCUBIAolAUEAEAkgCkGEAU8EQCAKECsLICVBIGokAAwBCyAlQQA2AgggJSAlQQRqICVBCGoQOgALICYoAggiCARAICYoAgwgCEECdBBeCyAmKAIEIghBhAFPBEAgCBArCyAmKAIkICZBMGokAAwCCxBvAAsgJyAuQeCGwAAQYQALIgglASAIECsLJwAgACABIAAoAgRBAXFyQQJyNgIEIAAgAWoiACAAKAIEQQFyNgIEC/oBAgJ/AX4jAEEQayICJAAgAkEBOwEMIAIgATYCCCACIAA2AgQjAEEQayIBJAAgAkEEaiIAKQIAIQQgASAANgIMIAEgBDcCBCMAQRBrIgAkACABQQRqIgEoAgAiAigCDCEDAkACQAJAAkAgAigCBA4CAAECCyADDQFBASECQQAhAwwCCyADDQAgAigCACICKAIEIQMgAigCACECDAELIABBgICAgHg2AgAgACABNgIMIABB1I3AACABKAIEIAEoAggiAC0ACCAALQAJECoACyAAIAM2AgQgACACNgIAIABBuI3AACABKAIEIAEoAggiAC0ACCAALQAJECoACyMAIAIgAigCBEF+cTYCBCAAIAFBAXI2AgQgACABaiABNgIACyQAIABFBEBB8InAAEEyEGIACyAAIAIgAyAEIAUgASgCEBEHAAsiACAARQRAQfCJwABBMhBiAAsgACACIAMgBCABKAIQEQ0ACyIAIABFBEBB8InAAEEyEGIACyAAIAIgAyAEIAEoAhARGAALIgAgAEUEQEHwicAAQTIQYgALIAAgAiADIAQgASgCEBEaAAsiACAARQRAQfCJwABBMhBiAAsgACACIAMgBCABKAIQERAACyIAIABFBEBB8InAAEEyEGIACyAAIAIgAyAEIAEoAhARHAALJQEBfyAAKAIAIgFBgICAgHhyQYCAgIB4RwRAIAAoAgQgARBeCwseACAAIAFBA3I2AgQgACABaiIAIAAoAgRBAXI2AgQLIAAgAEUEQEHwicAAQTIQYgALIAAgAiADIAEoAhARAwALHgAgAEUEQEHwicAAQTIQYgALIAAgAiABKAIQEQAAC9QQAQ1/EBwiByAB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QS9qrUKAgICA0ASENwMgIAAgAEEgajYCECAAQQhqQeiFwAAQPQALCAAgACUBEAMLCAAgACUBEAcLBgAgABAZCwuZFAMAQYCAwAALyQ5zcGFyay1pbnRlcm5hbC1ycy9zcmMvcmF5Y2FzdC5ycwBzcGFyay1pbnRlcm5hbC1ycy9zcmMvc29ydC5ycwBsaWJyYXJ5L2FsbG9jL3NyYy9mbXQucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLTAuMi4xMDAvc3JjL2NvbnZlcnQvc2xpY2VzLnJzAC9ydXN0Yy8xMTU5ZTc4YzQ3NDdiMDJlZjk5NmU1NTA4MmI3MDRjMDliOTcwNTg4L2xpYnJhcnkvc3RkL3NyYy90aHJlYWQvbG9jYWwucnMAbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzAC9ydXN0Yy8xMTU5ZTc4YzQ3NDdiMDJlZjk5NmU1NTA4MmI3MDRjMDliOTcwNTg4L2xpYnJhcnkvYWxsb2Mvc3JjL3NsaWNlLnJzAC9ydXN0Yy8xMTU5ZTc4YzQ3NDdiMDJlZjk5NmU1NTA4MmI3MDRjMDliOTcwNTg4L2xpYnJhcnkvYWxsb2Mvc3JjL3Jhd192ZWMvbW9kLnJzAC9ydXN0L2RlcHMvZGxtYWxsb2MtMC4yLjEwL3NyYy9kbG1hbGxvYy5ycwBsaWJyYXJ5L3N0ZC9zcmMvYWxsb2MucnMAc3BhcmstaW50ZXJuYWwtcnMvc3JjL2xpYi5ycwAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9qcy1zeXMtMC4zLjc3L3NyYy9saWIucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvb25jZV9jZWxsLTEuMjEuMy9zcmMvbGliLnJzAADFABAATwAAAC8CAAAmAAAAMQEQAEoAAAC9AQAAHQAAABECEAAcAAAAEQAAAD0AAAARAhAAHAAAAB0AAAAzAAAAEQIQABwAAAAoAAAALQAAAAEAAAAAAAAAEQIQABwAAAA6AAAAMwAAABECEAAcAAAARQAAAC0AAAARAhAAHAAAAF4AAAAoAAAAfAEQAFAAAAAuAgAAEQAAAAAAEAAgAAAAKgAAABcAAAAAABAAIAAAAHgAAAAXAAAAAAAQACAAAAB+AAAAHAAAAAAAEAAgAAAAgAAAABwAAAAAABAAIAAAAIUAAAAgAAAAIQAQAB0AAAAbAAAAHQAAAEV4cGVjdGVkICBhY3RpdmUgc3BsYXRzIGJ1dCBnb3Qg4AMQAAkAAADpAxAAFwAAACEAEAAdAAAAMwAAAB0AAAAhABAAHQAAADMAAAAVAAAAIQAQAB0AAAAkAAAAFAAAACEAEAAdAAAAdAAAABkAAAAhABAAHQAAAKcAAAATAAAAIQAQAB0AAACfAAAAEwAAACEAEAAdAAAAogAAAB0AAAAhABAAHQAAAKIAAAARAAAAIQAQAB0AAACQAAAAIAAAACEAEAAdAAAAkAAAABQAAAAhABAAHQAAAHwAAAAYAAAAIQAQAB0AAAB9AAAAGAAAAC4CEABaAAAA+xgAAAEAAABYABAAbAAAACQBAAAOAAAAY2xvc3VyZSBpbnZva2VkIHJlY3Vyc2l2ZWx5IG9yIGFmdGVyIGJlaW5nIGRyb3BwZWRMYXp5IGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWQiBRAAKgAAAIkCEABdAAAACAMAABkAAAByZWVudHJhbnQgaW5pdAAAZAUQAA4AAACJAhAAXQAAAHoCAAANAAAAbV3L1ixQ62N4QaZXcRuLuQkGZoEB87lUoggvQ4JXdDJ8ARAAUAAAAC4CAAARAAAAEQAAAAwAAAAEAAAAEgAAABMAAAAUAAAAYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPj0gc2l6ZSArIG1pbl9vdmVyaGVhZAAAzQEQACoAAACxBAAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplIDw9IHNpemUgKyBtYXhfb3ZlcmhlYWQAAM0BEAAqAAAAtwQAAA0AAABtZW1vcnkgYWxsb2NhdGlvbiBvZiAgYnl0ZXMgZmFpbGVkAABUBhAAFQAAAGkGEAANAAAA+AEQABgAAABkAQAACQAAABEAAAAMAAAABAAAABUAAAAAAAAACAAAAAQAAAAWAAAAAAAAAAgAAAAEAAAAFwAAABgAAAAZAAAAGgAAABsAAAAQAAAABAAAABwAAAAdAAAAHgAAAB8AAABFcnJvcgAAACAAAAAMAAAABAAAACEAAAAiAAAAIwAAAGNhcGFjaXR5IG92ZXJmbG93AAAAEAcQABEAAACsARAAIAAAAC4CAAARAAAAFQEQABsAAADoAQAAFwBB1I7AAAu0BQEAAAAkAAAAYSBmb3JtYXR0aW5nIHRyYWl0IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yIHdoZW4gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGRpZCBub3QAAD8AEAAYAAAAigIAAA4AAAABAAAAAAAAAFJlZkNlbGwgYWxyZWFkeSBib3Jyb3dlZGluZGV4IG91dCBvZiBib3VuZHM6IHRoZSBsZW4gaXMgIGJ1dCB0aGUgaW5kZXggaXMgAADkBxAAIAAAAAQIEAASAAAAAAAAAAQAAAAEAAAAKQAAAD09IT1tYXRjaGVzYXNzZXJ0aW9uIGBsZWZ0ICByaWdodGAgZmFpbGVkCiAgbGVmdDogCiByaWdodDogAEMIEAAQAAAAUwgQABcAAABqCBAACQAAACByaWdodGAgZmFpbGVkOiAKICBsZWZ0OiAAAABDCBAAEAAAAIwIEAAQAAAAnAgQAAkAAABqCBAACQAAADogAAABAAAAAAAAAMgIEAACAAAAMHgwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OSBvdXQgb2YgcmFuZ2UgZm9yIHNsaWNlIG9mIGxlbmd0aCByYW5nZSBlbmQgaW5kZXggyAkQABAAAACmCRAAIgAAADgIEAA6CBAAPAgQAAIAAAACAAAABwAAAAAAAD8AAAC/AEGglMAACwEPAHwJcHJvZHVjZXJzAghsYW5ndWFnZQEEUnVzdAAMcHJvY2Vzc2VkLWJ5AwVydXN0Yx0xLjkwLjAgKDExNTllNzhjNCAyMDI1LTA5LTE0KQZ3YWxydXMGMC4yMy4zDHdhc20tYmluZGdlbhMwLjIuMTAwICgyNDA1ZWMyYjQpAGsPdGFyZ2V0X2ZlYXR1cmVzBisPbXV0YWJsZS1nbG9iYWxzKxNub250cmFwcGluZy1mcHRvaW50KwtidWxrLW1lbW9yeSsIc2lnbi1leHQrD3JlZmVyZW5jZS10eXBlcysKbXVsdGl2YWx1ZQ==",self.location.href));const A=os();(typeof s=="string"||typeof Request=="function"&&s instanceof Request||typeof URL=="function"&&s instanceof URL)&&(s=fetch(s));const{instance:t,module:e}=await as(await s,A);return Is(t,e)}var ae={},Bs=function(s,A,t,e,i){var n=new Worker(ae[A]||(ae[A]=URL.createObjectURL(new Blob([s+\';addEventListener("error",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})\'],{type:"text/javascript"}))));return n.onmessage=function(r){var g=r.data,a=g.$e$;if(a){var o=new Error(a[0]);o.code=a[1],o.stack=a[2],i(o,null)}else i(null,g)},n.postMessage(t,e),n},V=Uint8Array,JA=Uint16Array,oe=Int32Array,Ft=new V([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),dt=new V([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Ie=new V([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Be=function(s,A){for(var t=new JA(31),e=0;e<31;++e)t[e]=A+=1<<s[e-1];for(var i=new oe(t[30]),e=1;e<30;++e)for(var n=t[e];n<t[e+1];++n)i[n]=n-t[e]<<5|e;return{b:t,r:i}},Ce=Be(Ft,2),Nt=Ce.b,Cs=Ce.r;Nt[28]=258,Cs[258]=28;for(var hs=Be(dt,0),he=hs.b,at=new JA(32768),X=0;X<32768;++X){var dA=(X&43690)>>1|(X&21845)<<1;dA=(dA&52428)>>2|(dA&13107)<<2,dA=(dA&61680)>>4|(dA&3855)<<4,at[X]=((dA&65280)>>8|(dA&255)<<8)>>1}for(var TA=function(s,A,t){for(var e=s.length,i=0,n=new JA(A);i<e;++i)s[i]&&++n[s[i]-1];var r=new JA(A);for(i=1;i<A;++i)r[i]=r[i-1]+n[i-1]<<1;var g;if(t){g=new JA(1<<A);var a=15-A;for(i=0;i<e;++i)if(s[i])for(var o=i<<4|s[i],I=A-s[i],B=r[s[i]-1]++<<I,h=B|(1<<I)-1;B<=h;++B)g[at[B]>>a]=o}else for(g=new JA(e),i=0;i<e;++i)s[i]&&(g[i]=at[r[s[i]-1]++]>>15-s[i]);return g},$A=new V(288),X=0;X<144;++X)$A[X]=8;for(var X=144;X<256;++X)$A[X]=9;for(var X=256;X<280;++X)$A[X]=7;for(var X=280;X<288;++X)$A[X]=8;for(var Qe=new V(32),X=0;X<32;++X)Qe[X]=5;var ce=TA($A,9,1),Ee=TA(Qe,5,1),ot=function(s){for(var A=s[0],t=1;t<s.length;++t)s[t]>A&&(A=s[t]);return A},hA=function(s,A,t){var e=A/8|0;return(s[e]|s[e+1]<<8)>>(A&7)&t},It=function(s,A){var t=A/8|0;return(s[t]|s[t+1]<<8|s[t+2]<<16)>>(A&7)},Ut=function(s){return(s+7)/8|0},NA=function(s,A,t){return(A==null||A<0)&&(A=0),(t==null||t>s.length)&&(t=s.length),new V(s.subarray(A,t))},le=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],j=function(s,A,t){var e=new Error(A||le[s]);if(e.code=s,Error.captureStackTrace&&Error.captureStackTrace(e,j),!t)throw e;return e},Gt=function(s,A,t,e){var i=s.length,n=e?e.length:0;if(!i||A.f&&!A.l)return t||new V(0);var r=!t,g=r||A.i!=2,a=A.i;r&&(t=new V(i*3));var o=function(gA){var IA=t.length;if(gA>IA){var BA=new V(Math.max(IA*2,gA));BA.set(t),t=BA}},I=A.f||0,B=A.p||0,h=A.b||0,C=A.l,Q=A.d,u=A.m,l=A.n,c=i*8;do{if(!C){I=hA(s,B,1);var y=hA(s,B+1,3);if(B+=3,y)if(y==1)C=ce,Q=Ee,u=9,l=5;else if(y==2){var d=hA(s,B,31)+257,H=hA(s,B+10,15)+4,m=d+hA(s,B+5,31)+1;B+=14;for(var w=new V(m),G=new V(19),M=0;M<H;++M)G[Ie[M]]=hA(s,B+M*3,7);B+=H*3;for(var x=ot(G),F=(1<<x)-1,D=TA(G,x,1),M=0;M<m;){var S=D[hA(s,B,F)];B+=S&15;var E=S>>4;if(E<16)w[M++]=E;else{var k=0,T=0;for(E==16?(T=3+hA(s,B,3),B+=2,k=w[M-1]):E==17?(T=3+hA(s,B,7),B+=3):E==18&&(T=11+hA(s,B,127),B+=7);T--;)w[M++]=k}}var q=w.subarray(0,d),v=w.subarray(d);u=ot(q),l=ot(v),C=TA(q,u,1),Q=TA(v,l,1)}else j(1);else{var E=Ut(B)+4,f=s[E-4]|s[E-3]<<8,p=E+f;if(p>i){a&&j(0);break}g&&o(h+f),t.set(s.subarray(E,p),h),A.b=h+=f,A.p=B=p*8,A.f=I;continue}if(B>c){a&&j(0);break}}g&&o(h+131072);for(var W=(1<<u)-1,Z=(1<<l)-1,P=B;;P=B){var k=C[It(s,B)&W],z=k>>4;if(B+=k&15,B>c){a&&j(0);break}if(k||j(2),z<256)t[h++]=z;else if(z==256){P=B,C=null;break}else{var K=z-254;if(z>264){var M=z-257,b=Ft[M];K=hA(s,B,(1<<b)-1)+Nt[M],B+=b}var _=Q[It(s,B)&Z],N=_>>4;_||j(3),B+=_&15;var v=he[N];if(N>3){var b=dt[N];v+=It(s,B)&(1<<b)-1,B+=b}if(B>c){a&&j(0);break}g&&o(h+131072);var sA=h+K;if(h<v){var iA=n-v,oA=Math.min(v,sA);for(iA+h<0&&j(3);h<oA;++h)t[h]=e[iA+h]}for(;h<sA;++h)t[h]=t[h-v]}}A.l=C,A.p=P,A.b=h,A.f=I,C&&(I=1,A.m=u,A.d=Q,A.n=l)}while(!I);return h!=t.length&&r?NA(t,0,h):t.subarray(0,h)},Qs=new V(0),cs=function(s,A){var t={};for(var e in s)t[e]=s[e];for(var e in A)t[e]=A[e];return t},ue=function(s,A,t){for(var e=s(),i=s.toString(),n=i.slice(i.indexOf("[")+1,i.lastIndexOf("]")).replace(/\\s+/g,"").split(","),r=0;r<e.length;++r){var g=e[r],a=n[r];if(typeof g=="function"){A+=";"+a+"=";var o=g.toString();if(g.prototype)if(o.indexOf("[native code]")!=-1){var I=o.indexOf(" ",8)+1;A+=o.slice(I,o.indexOf("(",I))}else{A+=o;for(var B in g.prototype)A+=";"+a+".prototype."+B+"="+g.prototype[B].toString()}else A+=o}else t[a]=g}return A},Bt=[],Es=function(s){var A=[];for(var t in s)s[t].buffer&&A.push((s[t]=new s[t].constructor(s[t])).buffer);return A},ls=function(s,A,t,e){if(!Bt[t]){for(var i="",n={},r=s.length-1,g=0;g<r;++g)i=ue(s[g],i,n);Bt[t]={c:ue(s[r],i,n),e:n}}var a=cs({},Bt[t].e);return Bs(Bt[t].c+";onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage="+A.toString()+"}",t,a,Es(a),e)},us=function(){return[V,JA,oe,Ft,dt,Ie,Nt,he,ce,Ee,at,le,TA,ot,hA,It,Ut,NA,j,Gt,Ct,fe,ye]},fe=function(s){return postMessage(s,[s.buffer])},ye=function(s){return s&&{out:s.size&&new V(s.size),dictionary:s.dictionary}},fs=function(s,A,t,e,i,n){var r=ls(t,e,i,function(g,a){r.terminate(),n(g,a)});return r.postMessage([s,A],A.consume?[s.buffer]:[]),function(){r.terminate()}},uA=function(s,A){return s[A]|s[A+1]<<8},tA=function(s,A){return(s[A]|s[A+1]<<8|s[A+2]<<16|s[A+3]<<24)>>>0},kt=function(s,A){return tA(s,A)+tA(s,A+4)*4294967296},ys=function(s){(s[0]!=31||s[1]!=139||s[2]!=8)&&j(6,"invalid gzip data");var A=s[3],t=10;A&4&&(t+=(s[10]|s[11]<<8)+2);for(var e=(A>>3&1)+(A>>4&1);e>0;e-=!s[t++]);return t+(A&2)},Yt=function(){function s(A,t){typeof A=="function"&&(t=A,A={}),this.ondata=t;var e=A&&A.dictionary&&A.dictionary.subarray(-32768);this.s={i:0,b:e?e.length:0},this.o=new V(32768),this.p=new V(0),e&&this.o.set(e)}return s.prototype.e=function(A){if(this.ondata||j(5),this.d&&j(4),!this.p.length)this.p=A;else if(A.length){var t=new V(this.p.length+A.length);t.set(this.p),t.set(A,this.p.length),this.p=t}},s.prototype.c=function(A){this.s.i=+(this.d=A||!1);var t=this.s.b,e=Gt(this.p,this.s,this.o);this.ondata(NA(e,t,this.s.b),this.d),this.o=NA(e,this.s.b-32768),this.s.b=this.o.length,this.p=NA(this.p,this.s.p/8|0),this.s.p&=7},s.prototype.push=function(A,t){this.e(A),this.c(t)},s}();function ws(s,A,t){return t||(t=A,A={}),typeof t!="function"&&j(7),fs(s,A,[us],function(e){return fe(Ct(e.data[0],ye(e.data[1])))},1,t)}function Ct(s,A){return Gt(s,{i:2},A&&A.out,A&&A.dictionary)}var ms=function(){function s(A,t){this.v=1,this.r=0,Yt.call(this,A,t)}return s.prototype.push=function(A,t){if(Yt.prototype.e.call(this,A),this.r+=A.length,this.v){var e=this.p.subarray(this.v-1),i=e.length>3?ys(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}Yt.prototype.c.call(this,t),this.s.f&&!this.s.l&&!t&&(this.v=Ut(this.s.p)+9,this.s={i:0},this.o=new V(0),this.push(new V(0),t))},s}(),Rt=typeof TextDecoder<"u"&&new TextDecoder;try{Rt.decode(Qs,{stream:!0})}catch{}var ps=function(s){for(var A="",t=0;;){var e=s[t++],i=(e>127)+(e>223)+(e>239);if(t+i>s.length)return{s:A,r:NA(s,t-1)};i?i==3?(e=((e&15)<<18|(s[t++]&63)<<12|(s[t++]&63)<<6|s[t++]&63)-65536,A+=String.fromCharCode(55296|e>>10,56320|e&1023)):i&1?A+=String.fromCharCode((e&31)<<6|s[t++]&63):A+=String.fromCharCode((e&15)<<12|(s[t++]&63)<<6|s[t++]&63):A+=String.fromCharCode(e)}};function xs(s,A){if(A){for(var t="",e=0;e<s.length;e+=16384)t+=String.fromCharCode.apply(null,s.subarray(e,e+16384));return t}else{if(Rt)return Rt.decode(s);var i=ps(s),n=i.s,t=i.r;return t.length&&j(8),n}}var we=function(s,A){return A+30+uA(s,A+26)+uA(s,A+28)},me=function(s,A,t){var e=uA(s,A+28),i=xs(s.subarray(A+46,A+46+e),!(uA(s,A+8)&2048)),n=A+46+e,r=tA(s,A+20),g=t&&r==4294967295?Ms(s,n):[r,tA(s,A+24),tA(s,A+42)],a=g[0],o=g[1],I=g[2];return[uA(s,A+10),a,o,i,n+uA(s,A+30)+uA(s,A+32),I]},Ms=function(s,A){for(;uA(s,A)!=1;A+=4+uA(s,A+2));return[kt(s,A+12),kt(s,A+4),kt(s,A+20)]},pe=typeof queueMicrotask=="function"?queueMicrotask:typeof setTimeout=="function"?setTimeout:function(s){s()};function Ss(s,A,t){t||(t=A,A={}),typeof t!="function"&&j(7);var e=[],i=function(){for(var l=0;l<e.length;++l)e[l]()},n={},r=function(l,c){pe(function(){t(l,c)})};pe(function(){r=t});for(var g=s.length-22;tA(s,g)!=101010256;--g)if(!g||s.length-g>65558)return r(j(13,0,1),null),i;var a=uA(s,g+8);if(a){var o=a,I=tA(s,g+16),B=I==4294967295||o==65535;if(B){var h=tA(s,g-12);B=tA(s,h)==101075792,B&&(o=a=tA(s,h+32),I=tA(s,h+48))}for(var C=A&&A.filter,Q=function(l){var c=me(s,I,B),y=c[0],E=c[1],f=c[2],p=c[3],d=c[4],H=c[5],m=we(s,H);I=d;var w=function(M,x){M?(i(),r(M,null)):(x&&(n[p]=x),--a||r(null,n))};if(!C||C({name:p,size:E,originalSize:f,compression:y}))if(!y)w(null,NA(s,m,m+E));else if(y==8){var G=s.subarray(m,m+E);if(f<524288||E>.8*f)try{w(null,Ct(G,{out:new V(f)}))}catch(M){w(M,null)}else e.push(ws(G,{size:f},w))}else w(j(14,"unknown compression type "+y,1),null);else w(null,null)},u=0;u<o;++u)Q(u)}else r(null,{});return i}function Ds(s,A){for(var t={},e=s.length-22;tA(s,e)!=101010256;--e)(!e||s.length-e>65558)&&j(13);var i=uA(s,e+8);if(!i)return{};var n=tA(s,e+16),r=n==4294967295||i==65535;if(r){var g=tA(s,e-12);r=tA(s,g)==101075792,r&&(i=tA(s,g+32),n=tA(s,g+48))}for(var a=A&&A.filter,o=0;o<i;++o){var I=me(s,n,r),B=I[0],h=I[1],C=I[2],Q=I[3],u=I[4],l=I[5],c=we(s,l);n=u,(!a||a({name:Q,size:h,originalSize:C,compression:B}))&&(B?B==8?t[Q]=Ct(s.subarray(c,c+h),{out:new V(C)}):j(14,"unknown compression type "+B):t[Q]=NA(s,c,c+h))}return t}/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */const xe="178",Fs="",fA="srgb",Me="srgb-linear",Se="linear",_t="srgb";function aA(s,A,t){return Math.max(A,Math.min(t,s))}function ds(s,A){return(s%A+A)%A}function bt(s,A,t){return(1-t)*s+t*A}class UA{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,n,r,g){let a=e[i+0],o=e[i+1],I=e[i+2],B=e[i+3];const h=n[r+0],C=n[r+1],Q=n[r+2],u=n[r+3];if(g===0){A[t+0]=a,A[t+1]=o,A[t+2]=I,A[t+3]=B;return}if(g===1){A[t+0]=h,A[t+1]=C,A[t+2]=Q,A[t+3]=u;return}if(B!==u||a!==h||o!==C||I!==Q){let l=1-g;const c=a*h+o*C+I*Q+B*u,y=c>=0?1:-1,E=1-c*c;if(E>Number.EPSILON){const p=Math.sqrt(E),d=Math.atan2(p,c*y);l=Math.sin(l*d)/p,g=Math.sin(g*d)/p}const f=g*y;if(a=a*l+h*f,o=o*l+C*f,I=I*l+Q*f,B=B*l+u*f,l===1-g){const p=1/Math.sqrt(a*a+o*o+I*I+B*B);a*=p,o*=p,I*=p,B*=p}}A[t]=a,A[t+1]=o,A[t+2]=I,A[t+3]=B}static multiplyQuaternionsFlat(A,t,e,i,n,r){const g=e[i],a=e[i+1],o=e[i+2],I=e[i+3],B=n[r],h=n[r+1],C=n[r+2],Q=n[r+3];return A[t]=g*Q+I*B+a*C-o*h,A[t+1]=a*Q+I*h+o*B-g*C,A[t+2]=o*Q+I*C+g*h-a*B,A[t+3]=I*Q-g*B-a*h-o*C,A}get x(){return this._x}set x(A){this._x=A,this._onChangeCallback()}get y(){return this._y}set y(A){this._y=A,this._onChangeCallback()}get z(){return this._z}set z(A){this._z=A,this._onChangeCallback()}get w(){return this._w}set w(A){this._w=A,this._onChangeCallback()}set(A,t,e,i){return this._x=A,this._y=t,this._z=e,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(A){return this._x=A.x,this._y=A.y,this._z=A.z,this._w=A.w,this._onChangeCallback(),this}setFromEuler(A,t=!0){const e=A._x,i=A._y,n=A._z,r=A._order,g=Math.cos,a=Math.sin,o=g(e/2),I=g(i/2),B=g(n/2),h=a(e/2),C=a(i/2),Q=a(n/2);switch(r){case"XYZ":this._x=h*I*B+o*C*Q,this._y=o*C*B-h*I*Q,this._z=o*I*Q+h*C*B,this._w=o*I*B-h*C*Q;break;case"YXZ":this._x=h*I*B+o*C*Q,this._y=o*C*B-h*I*Q,this._z=o*I*Q-h*C*B,this._w=o*I*B+h*C*Q;break;case"ZXY":this._x=h*I*B-o*C*Q,this._y=o*C*B+h*I*Q,this._z=o*I*Q+h*C*B,this._w=o*I*B-h*C*Q;break;case"ZYX":this._x=h*I*B-o*C*Q,this._y=o*C*B+h*I*Q,this._z=o*I*Q-h*C*B,this._w=o*I*B+h*C*Q;break;case"YZX":this._x=h*I*B+o*C*Q,this._y=o*C*B+h*I*Q,this._z=o*I*Q-h*C*B,this._w=o*I*B-h*C*Q;break;case"XZY":this._x=h*I*B-o*C*Q,this._y=o*C*B-h*I*Q,this._z=o*I*Q+h*C*B,this._w=o*I*B+h*C*Q;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+r)}return t===!0&&this._onChangeCallback(),this}setFromAxisAngle(A,t){const e=t/2,i=Math.sin(e);return this._x=A.x*i,this._y=A.y*i,this._z=A.z*i,this._w=Math.cos(e),this._onChangeCallback(),this}setFromRotationMatrix(A){const t=A.elements,e=t[0],i=t[4],n=t[8],r=t[1],g=t[5],a=t[9],o=t[2],I=t[6],B=t[10],h=e+g+B;if(h>0){const C=.5/Math.sqrt(h+1);this._w=.25/C,this._x=(I-a)*C,this._y=(n-o)*C,this._z=(r-i)*C}else if(e>g&&e>B){const C=2*Math.sqrt(1+e-g-B);this._w=(I-a)/C,this._x=.25*C,this._y=(i+r)/C,this._z=(n+o)/C}else if(g>B){const C=2*Math.sqrt(1+g-e-B);this._w=(n-o)/C,this._x=(i+r)/C,this._y=.25*C,this._z=(a+I)/C}else{const C=2*Math.sqrt(1+B-e-g);this._w=(r-i)/C,this._x=(n+o)/C,this._y=(a+I)/C,this._z=.25*C}return this._onChangeCallback(),this}setFromUnitVectors(A,t){let e=A.dot(t)+1;return e<1e-8?(e=0,Math.abs(A.x)>Math.abs(A.z)?(this._x=-A.y,this._y=A.x,this._z=0,this._w=e):(this._x=0,this._y=-A.z,this._z=A.y,this._w=e)):(this._x=A.y*t.z-A.z*t.y,this._y=A.z*t.x-A.x*t.z,this._z=A.x*t.y-A.y*t.x,this._w=e),this.normalize()}angleTo(A){return 2*Math.acos(Math.abs(aA(this.dot(A),-1,1)))}rotateTowards(A,t){const e=this.angleTo(A);if(e===0)return this;const i=Math.min(1,t/e);return this.slerp(A,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(A){return this._x*A._x+this._y*A._y+this._z*A._z+this._w*A._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let A=this.length();return A===0?(this._x=0,this._y=0,this._z=0,this._w=1):(A=1/A,this._x=this._x*A,this._y=this._y*A,this._z=this._z*A,this._w=this._w*A),this._onChangeCallback(),this}multiply(A){return this.multiplyQuaternions(this,A)}premultiply(A){return this.multiplyQuaternions(A,this)}multiplyQuaternions(A,t){const e=A._x,i=A._y,n=A._z,r=A._w,g=t._x,a=t._y,o=t._z,I=t._w;return this._x=e*I+r*g+i*o-n*a,this._y=i*I+r*a+n*g-e*o,this._z=n*I+r*o+e*a-i*g,this._w=r*I-e*g-i*a-n*o,this._onChangeCallback(),this}slerp(A,t){if(t===0)return this;if(t===1)return this.copy(A);const e=this._x,i=this._y,n=this._z,r=this._w;let g=r*A._w+e*A._x+i*A._y+n*A._z;if(g<0?(this._w=-A._w,this._x=-A._x,this._y=-A._y,this._z=-A._z,g=-g):this.copy(A),g>=1)return this._w=r,this._x=e,this._y=i,this._z=n,this;const a=1-g*g;if(a<=Number.EPSILON){const C=1-t;return this._w=C*r+t*this._w,this._x=C*e+t*this._x,this._y=C*i+t*this._y,this._z=C*n+t*this._z,this.normalize(),this}const o=Math.sqrt(a),I=Math.atan2(o,g),B=Math.sin((1-t)*I)/o,h=Math.sin(t*I)/o;return this._w=r*B+this._w*h,this._x=e*B+this._x*h,this._y=i*B+this._y*h,this._z=n*B+this._z*h,this._onChangeCallback(),this}slerpQuaternions(A,t,e){return this.copy(A).slerp(t,e)}random(){const A=2*Math.PI*Math.random(),t=2*Math.PI*Math.random(),e=Math.random(),i=Math.sqrt(1-e),n=Math.sqrt(e);return this.set(i*Math.sin(A),i*Math.cos(A),n*Math.sin(t),n*Math.cos(t))}equals(A){return A._x===this._x&&A._y===this._y&&A._z===this._z&&A._w===this._w}fromArray(A,t=0){return this._x=A[t],this._y=A[t+1],this._z=A[t+2],this._w=A[t+3],this._onChangeCallback(),this}toArray(A=[],t=0){return A[t]=this._x,A[t+1]=this._y,A[t+2]=this._z,A[t+3]=this._w,A}fromBufferAttribute(A,t){return this._x=A.getX(t),this._y=A.getY(t),this._z=A.getZ(t),this._w=A.getW(t),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(A){return this._onChangeCallback=A,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class 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(De.setFromEuler(A))}applyAxisAngle(A,t){return this.applyQuaternion(De.setFromAxisAngle(A,t))}applyMatrix3(A){const t=this.x,e=this.y,i=this.z,n=A.elements;return this.x=n[0]*t+n[3]*e+n[6]*i,this.y=n[1]*t+n[4]*e+n[7]*i,this.z=n[2]*t+n[5]*e+n[8]*i,this}applyNormalMatrix(A){return this.applyMatrix3(A).normalize()}applyMatrix4(A){const t=this.x,e=this.y,i=this.z,n=A.elements,r=1/(n[3]*t+n[7]*e+n[11]*i+n[15]);return this.x=(n[0]*t+n[4]*e+n[8]*i+n[12])*r,this.y=(n[1]*t+n[5]*e+n[9]*i+n[13])*r,this.z=(n[2]*t+n[6]*e+n[10]*i+n[14])*r,this}applyQuaternion(A){const t=this.x,e=this.y,i=this.z,n=A.x,r=A.y,g=A.z,a=A.w,o=2*(r*i-g*e),I=2*(g*t-n*i),B=2*(n*e-r*t);return this.x=t+a*o+r*B-g*I,this.y=e+a*I+g*o-n*B,this.z=i+a*B+n*I-r*o,this}project(A){return this.applyMatrix4(A.matrixWorldInverse).applyMatrix4(A.projectionMatrix)}unproject(A){return this.applyMatrix4(A.projectionMatrixInverse).applyMatrix4(A.matrixWorld)}transformDirection(A){const t=this.x,e=this.y,i=this.z,n=A.elements;return this.x=n[0]*t+n[4]*e+n[8]*i,this.y=n[1]*t+n[5]*e+n[9]*i,this.z=n[2]*t+n[6]*e+n[10]*i,this.normalize()}divide(A){return this.x/=A.x,this.y/=A.y,this.z/=A.z,this}divideScalar(A){return this.multiplyScalar(1/A)}min(A){return this.x=Math.min(this.x,A.x),this.y=Math.min(this.y,A.y),this.z=Math.min(this.z,A.z),this}max(A){return this.x=Math.max(this.x,A.x),this.y=Math.max(this.y,A.y),this.z=Math.max(this.z,A.z),this}clamp(A,t){return this.x=aA(this.x,A.x,t.x),this.y=aA(this.y,A.y,t.y),this.z=aA(this.z,A.z,t.z),this}clampScalar(A,t){return this.x=aA(this.x,A,t),this.y=aA(this.y,A,t),this.z=aA(this.z,A,t),this}clampLength(A,t){const e=this.length();return this.divideScalar(e||1).multiplyScalar(aA(e,A,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(A){return this.x*A.x+this.y*A.y+this.z*A.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(A){return this.normalize().multiplyScalar(A)}lerp(A,t){return this.x+=(A.x-this.x)*t,this.y+=(A.y-this.y)*t,this.z+=(A.z-this.z)*t,this}lerpVectors(A,t,e){return this.x=A.x+(t.x-A.x)*e,this.y=A.y+(t.y-A.y)*e,this.z=A.z+(t.z-A.z)*e,this}cross(A){return this.crossVectors(this,A)}crossVectors(A,t){const e=A.x,i=A.y,n=A.z,r=t.x,g=t.y,a=t.z;return this.x=i*a-n*g,this.y=n*r-e*a,this.z=e*g-i*r,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 Jt.copy(this).projectOnVector(A),this.sub(Jt)}reflect(A){return this.sub(Jt.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(aA(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 Jt=new U,De=new UA;class At{constructor(A,t,e,i,n,r,g,a,o){At.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],A!==void 0&&this.set(A,t,e,i,n,r,g,a,o)}set(A,t,e,i,n,r,g,a,o){const I=this.elements;return I[0]=A,I[1]=i,I[2]=g,I[3]=t,I[4]=n,I[5]=a,I[6]=e,I[7]=r,I[8]=o,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(A){const t=this.elements,e=A.elements;return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8],this}extractBasis(A,t,e){return A.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),e.setFromMatrix3Column(this,2),this}setFromMatrix4(A){const t=A.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(A){return this.multiplyMatrices(this,A)}premultiply(A){return this.multiplyMatrices(A,this)}multiplyMatrices(A,t){const e=A.elements,i=t.elements,n=this.elements,r=e[0],g=e[3],a=e[6],o=e[1],I=e[4],B=e[7],h=e[2],C=e[5],Q=e[8],u=i[0],l=i[3],c=i[6],y=i[1],E=i[4],f=i[7],p=i[2],d=i[5],H=i[8];return n[0]=r*u+g*y+a*p,n[3]=r*l+g*E+a*d,n[6]=r*c+g*f+a*H,n[1]=o*u+I*y+B*p,n[4]=o*l+I*E+B*d,n[7]=o*c+I*f+B*H,n[2]=h*u+C*y+Q*p,n[5]=h*l+C*E+Q*d,n[8]=h*c+C*f+Q*H,this}multiplyScalar(A){const t=this.elements;return t[0]*=A,t[3]*=A,t[6]*=A,t[1]*=A,t[4]*=A,t[7]*=A,t[2]*=A,t[5]*=A,t[8]*=A,this}determinant(){const A=this.elements,t=A[0],e=A[1],i=A[2],n=A[3],r=A[4],g=A[5],a=A[6],o=A[7],I=A[8];return t*r*I-t*g*o-e*n*I+e*g*a+i*n*o-i*r*a}invert(){const A=this.elements,t=A[0],e=A[1],i=A[2],n=A[3],r=A[4],g=A[5],a=A[6],o=A[7],I=A[8],B=I*r-g*o,h=g*a-I*n,C=o*n-r*a,Q=t*B+e*h+i*C;if(Q===0)return this.set(0,0,0,0,0,0,0,0,0);const u=1/Q;return A[0]=B*u,A[1]=(i*o-I*e)*u,A[2]=(g*e-i*r)*u,A[3]=h*u,A[4]=(I*t-i*a)*u,A[5]=(i*n-g*t)*u,A[6]=C*u,A[7]=(e*a-o*t)*u,A[8]=(r*t-e*n)*u,this}transpose(){let A;const t=this.elements;return A=t[1],t[1]=t[3],t[3]=A,A=t[2],t[2]=t[6],t[6]=A,A=t[5],t[5]=t[7],t[7]=A,this}getNormalMatrix(A){return this.setFromMatrix4(A).invert().transpose()}transposeIntoArray(A){const t=this.elements;return A[0]=t[0],A[1]=t[3],A[2]=t[6],A[3]=t[1],A[4]=t[4],A[5]=t[7],A[6]=t[2],A[7]=t[5],A[8]=t[8],this}setUvTransform(A,t,e,i,n,r,g){const a=Math.cos(n),o=Math.sin(n);return this.set(e*a,e*o,-e*(a*r+o*g)+r+A,-i*o,i*a,-i*(-o*r+a*g)+g+t,0,0,1),this}scale(A,t){return this.premultiply(Ht.makeScale(A,t)),this}rotate(A){return this.premultiply(Ht.makeRotation(-A)),this}translate(A,t){return this.premultiply(Ht.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 Ht=new At,Fe={};function de(s){s in Fe||(Fe[s]=!0,console.warn(s))}const Ne=new At().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),Ue=new At().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function Ns(){const s={enabled:!0,workingColorSpace:Me,spaces:{},convert:function(i,n,r){return this.enabled===!1||n===r||!n||!r||(this.spaces[n].transfer===_t&&(i.r=vA(i.r),i.g=vA(i.g),i.b=vA(i.b)),this.spaces[n].primaries!==this.spaces[r].primaries&&(i.applyMatrix3(this.spaces[n].toXYZ),i.applyMatrix3(this.spaces[r].fromXYZ)),this.spaces[r].transfer===_t&&(i.r=KA(i.r),i.g=KA(i.g),i.b=KA(i.b))),i},workingToColorSpace:function(i,n){return this.convert(i,this.workingColorSpace,n)},colorSpaceToWorking:function(i,n){return this.convert(i,n,this.workingColorSpace)},getPrimaries:function(i){return this.spaces[i].primaries},getTransfer:function(i){return i===Fs?Se:this.spaces[i].transfer},getLuminanceCoefficients:function(i,n=this.workingColorSpace){return i.fromArray(this.spaces[n].luminanceCoefficients)},define:function(i){Object.assign(this.spaces,i)},_getMatrix:function(i,n,r){return i.copy(this.spaces[n].toXYZ).multiply(this.spaces[r].fromXYZ)},_getDrawingBufferColorSpace:function(i){return this.spaces[i].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(i=this.workingColorSpace){return this.spaces[i].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(i,n){return de("THREE.ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),s.workingToColorSpace(i,n)},toWorkingColorSpace:function(i,n){return de("THREE.ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),s.colorSpaceToWorking(i,n)}},A=[.64,.33,.3,.6,.15,.06],t=[.2126,.7152,.0722],e=[.3127,.329];return s.define({[Me]:{primaries:A,whitePoint:e,transfer:Se,toXYZ:Ne,fromXYZ:Ue,luminanceCoefficients:t,workingColorSpaceConfig:{unpackColorSpace:fA},outputColorSpaceConfig:{drawingBufferColorSpace:fA}},[fA]:{primaries:A,whitePoint:e,transfer:_t,toXYZ:Ne,fromXYZ:Ue,luminanceCoefficients:t,outputColorSpaceConfig:{drawingBufferColorSpace:fA}}}),s}const yA=Ns();function vA(s){return s<.04045?s*.0773993808:Math.pow(s*.9478672986+.0521327014,2.4)}function KA(s){return s<.0031308?s*12.92:1.055*Math.pow(s,.41666)-.055}class Ge{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(wA.fromArray(A,t));return this}setFromBufferAttribute(A){this.makeEmpty();for(let t=0,e=A.count;t<e;t++)this.expandByPoint(wA.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=wA.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 n=e.getAttribute("position");if(t===!0&&n!==void 0&&A.isInstancedMesh!==!0)for(let r=0,g=n.count;r<g;r++)A.isMesh===!0?A.getVertexPosition(r,wA):wA.fromBufferAttribute(n,r),wA.applyMatrix4(A.matrixWorld),this.expandByPoint(wA);else A.boundingBox!==void 0?(A.boundingBox===null&&A.computeBoundingBox(),ht.copy(A.boundingBox)):(e.boundingBox===null&&e.computeBoundingBox(),ht.copy(e.boundingBox)),ht.applyMatrix4(A.matrixWorld),this.union(ht)}const i=A.children;for(let n=0,r=i.length;n<r;n++)this.expandByObject(i[n],t);return this}containsPoint(A){return A.x>=this.min.x&&A.x<=this.max.x&&A.y>=this.min.y&&A.y<=this.max.y&&A.z>=this.min.z&&A.z<=this.max.z}containsBox(A){return this.min.x<=A.min.x&&A.max.x<=this.max.x&&this.min.y<=A.min.y&&A.max.y<=this.max.y&&this.min.z<=A.min.z&&A.max.z<=this.max.z}getParameter(A,t){return t.set((A.x-this.min.x)/(this.max.x-this.min.x),(A.y-this.min.y)/(this.max.y-this.min.y),(A.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(A){return A.max.x>=this.min.x&&A.min.x<=this.max.x&&A.max.y>=this.min.y&&A.min.y<=this.max.y&&A.max.z>=this.min.z&&A.min.z<=this.max.z}intersectsSphere(A){return this.clampPoint(A.center,wA),wA.distanceToSquared(A.center)<=A.radius*A.radius}intersectsPlane(A){let t,e;return A.normal.x>0?(t=A.normal.x*this.min.x,e=A.normal.x*this.max.x):(t=A.normal.x*this.max.x,e=A.normal.x*this.min.x),A.normal.y>0?(t+=A.normal.y*this.min.y,e+=A.normal.y*this.max.y):(t+=A.normal.y*this.max.y,e+=A.normal.y*this.min.y),A.normal.z>0?(t+=A.normal.z*this.min.z,e+=A.normal.z*this.max.z):(t+=A.normal.z*this.max.z,e+=A.normal.z*this.min.z),t<=-A.constant&&e>=-A.constant}intersectsTriangle(A){if(this.isEmpty())return!1;this.getCenter(tt),Qt.subVectors(this.max,tt),qA.subVectors(A.a,tt),ZA.subVectors(A.b,tt),XA.subVectors(A.c,tt),GA.subVectors(ZA,qA),kA.subVectors(XA,ZA),HA.subVectors(qA,XA);let t=[0,-GA.z,GA.y,0,-kA.z,kA.y,0,-HA.z,HA.y,GA.z,0,-GA.x,kA.z,0,-kA.x,HA.z,0,-HA.x,-GA.y,GA.x,0,-kA.y,kA.x,0,-HA.y,HA.x,0];return!zt(t,qA,ZA,XA,Qt)||(t=[1,0,0,0,1,0,0,0,1],!zt(t,qA,ZA,XA,Qt))?!1:(ct.crossVectors(GA,kA),t=[ct.x,ct.y,ct.z],zt(t,qA,ZA,XA,Qt))}clampPoint(A,t){return t.copy(A).clamp(this.min,this.max)}distanceToPoint(A){return this.clampPoint(A,wA).distanceTo(A)}getBoundingSphere(A){return this.isEmpty()?A.makeEmpty():(this.getCenter(A.center),A.radius=this.getSize(wA).length()*.5),A}intersect(A){return this.min.max(A.min),this.max.min(A.max),this.isEmpty()&&this.makeEmpty(),this}union(A){return this.min.min(A.min),this.max.max(A.max),this}applyMatrix4(A){return this.isEmpty()?this:(DA[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(A),DA[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(A),DA[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(A),DA[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(A),DA[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(A),DA[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(A),DA[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(A),DA[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(A),this.setFromPoints(DA),this)}translate(A){return this.min.add(A),this.max.add(A),this}equals(A){return A.min.equals(this.min)&&A.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(A){return this.min.fromArray(A.min),this.max.fromArray(A.max),this}}const DA=[new U,new U,new U,new U,new U,new U,new U,new U],wA=new U,ht=new Ge,qA=new U,ZA=new U,XA=new U,GA=new U,kA=new U,HA=new U,tt=new U,Qt=new U,ct=new U,zA=new U;function zt(s,A,t,e,i){for(let n=0,r=s.length-3;n<=r;n+=3){zA.fromArray(s,n);const g=i.x*Math.abs(zA.x)+i.y*Math.abs(zA.y)+i.z*Math.abs(zA.z),a=A.dot(zA),o=t.dot(zA),I=e.dot(zA);if(Math.max(-Math.max(a,o,I),Math.min(a,o,I))>g)return!1}return!0}const ke={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},YA={h:0,s:0,l:0},Et={h:0,s:0,l:0};function Lt(s,A,t){return t<0&&(t+=1),t>1&&(t-=1),t<1/6?s+(A-s)*6*t:t<1/2?A:t<2/3?s+(A-s)*6*(2/3-t):s}class Tt{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=fA){return A=Math.floor(A),this.r=(A>>16&255)/255,this.g=(A>>8&255)/255,this.b=(A&255)/255,yA.colorSpaceToWorking(this,t),this}setRGB(A,t,e,i=yA.workingColorSpace){return this.r=A,this.g=t,this.b=e,yA.colorSpaceToWorking(this,i),this}setHSL(A,t,e,i=yA.workingColorSpace){if(A=ds(A,1),t=aA(t,0,1),e=aA(e,0,1),t===0)this.r=this.g=this.b=e;else{const n=e<=.5?e*(1+t):e+t-e*t,r=2*e-n;this.r=Lt(r,n,A+1/3),this.g=Lt(r,n,A),this.b=Lt(r,n,A-1/3)}return yA.colorSpaceToWorking(this,i),this}setStyle(A,t=fA){function e(n){n!==void 0&&parseFloat(n)<1&&console.warn("THREE.Color: Alpha component of "+A+" will be ignored.")}let i;if(i=/^(\\w+)\\(([^\\)]*)\\)/.exec(A)){let n;const r=i[1],g=i[2];switch(r){case"rgb":case"rgba":if(n=/^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(g))return e(n[4]),this.setRGB(Math.min(255,parseInt(n[1],10))/255,Math.min(255,parseInt(n[2],10))/255,Math.min(255,parseInt(n[3],10))/255,t);if(n=/^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(g))return e(n[4]),this.setRGB(Math.min(100,parseInt(n[1],10))/100,Math.min(100,parseInt(n[2],10))/100,Math.min(100,parseInt(n[3],10))/100,t);break;case"hsl":case"hsla":if(n=/^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(g))return e(n[4]),this.setHSL(parseFloat(n[1])/360,parseFloat(n[2])/100,parseFloat(n[3])/100,t);break;default:console.warn("THREE.Color: Unknown color model "+A)}}else if(i=/^\\#([A-Fa-f\\d]+)$/.exec(A)){const n=i[1],r=n.length;if(r===3)return this.setRGB(parseInt(n.charAt(0),16)/15,parseInt(n.charAt(1),16)/15,parseInt(n.charAt(2),16)/15,t);if(r===6)return this.setHex(parseInt(n,16),t);console.warn("THREE.Color: Invalid hex color "+A)}else if(A&&A.length>0)return this.setColorName(A,t);return this}setColorName(A,t=fA){const e=ke[A.toLowerCase()];return e!==void 0?this.setHex(e,t):console.warn("THREE.Color: Unknown color "+A),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(A){return this.r=A.r,this.g=A.g,this.b=A.b,this}copySRGBToLinear(A){return this.r=vA(A.r),this.g=vA(A.g),this.b=vA(A.b),this}copyLinearToSRGB(A){return this.r=KA(A.r),this.g=KA(A.g),this.b=KA(A.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(A=fA){return yA.workingToColorSpace(eA.copy(this),A),Math.round(aA(eA.r*255,0,255))*65536+Math.round(aA(eA.g*255,0,255))*256+Math.round(aA(eA.b*255,0,255))}getHexString(A=fA){return("000000"+this.getHex(A).toString(16)).slice(-6)}getHSL(A,t=yA.workingColorSpace){yA.workingToColorSpace(eA.copy(this),t);const e=eA.r,i=eA.g,n=eA.b,r=Math.max(e,i,n),g=Math.min(e,i,n);let a,o;const I=(g+r)/2;if(g===r)a=0,o=0;else{const B=r-g;switch(o=I<=.5?B/(r+g):B/(2-r-g),r){case e:a=(i-n)/B+(i<n?6:0);break;case i:a=(n-e)/B+2;break;case n:a=(e-i)/B+4;break}a/=6}return A.h=a,A.s=o,A.l=I,A}getRGB(A,t=yA.workingColorSpace){return yA.workingToColorSpace(eA.copy(this),t),A.r=eA.r,A.g=eA.g,A.b=eA.b,A}getStyle(A=fA){yA.workingToColorSpace(eA.copy(this),A);const t=eA.r,e=eA.g,i=eA.b;return A!==fA?`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(YA),this.setHSL(YA.h+A,YA.s+t,YA.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(YA),A.getHSL(Et);const e=bt(YA.h,Et.h,t),i=bt(YA.s,Et.s,t),n=bt(YA.l,Et.l,t);return this.setHSL(e,i,n),this}setFromVector3(A){return this.r=A.x,this.g=A.y,this.b=A.z,this}applyMatrix3(A){const t=this.r,e=this.g,i=this.b,n=A.elements;return this.r=n[0]*t+n[3]*e+n[6]*i,this.g=n[1]*t+n[4]*e+n[7]*i,this.b=n[2]*t+n[5]*e+n[8]*i,this}equals(A){return A.r===this.r&&A.g===this.g&&A.b===this.b}fromArray(A,t=0){return this.r=A[t],this.g=A[t+1],this.b=A[t+2],this}toArray(A=[],t=0){return A[t]=this.r,A[t+1]=this.g,A[t+2]=this.b,A}fromBufferAttribute(A,t){return this.r=A.getX(t),this.g=A.getY(t),this.b=A.getZ(t),this}toJSON(){return this.getHex()}*[Symbol.iterator](){yield this.r,yield this.g,yield this.b}}const eA=new Tt;Tt.NAMES=ke,typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:xe}})),typeof window<"u"&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=xe);const Ye=-12,Re=9,PA=Math.exp(-30),Us=11,Gs=11,_e=1<<Us,be=1<<Gs,Je=1;function ks(s){var n;let A=!1;const t=s.split(`\n`).map(r=>{const g=r.trimEnd();return A?g:g.length>0?(A=!0,g):null}).filter(r=>r!=null);for(;t.length>0&&t[t.length-1].length===0;)t.pop();if(t.length===0)return[];const e=(n=t[0].match(/^\\s*/))==null?void 0:n[0];if(!e)return t;const i=new RegExp(`^${e}`);return t.map(r=>r.replace(i,""))}function Ys(s){return ks(s).join(`\n`)}const vt=new Float32Array(1),He=new Uint32Array(vt.buffer),Kt="Float16Array"in globalThis,et=Kt?new globalThis.Float16Array(1):null,ze=new Uint16Array(et==null?void 0:et.buffer);function Rs(s){const A=Math.sqrt(s.reduce((t,e)=>t+e*e,0));return s.map(t=>t/A)}const WA=Kt?_s:bs,$=Kt?Js:Hs;function _s(s){return et[0]=s,ze[0]}function bs(s){vt[0]=s;const A=He[0],t=A>>31&1,e=A>>23&255,i=A&8388607,n=t<<15;if(e===255)return i!==0?n|32767:n|31744;const r=e-127+15;if(r>=31)return n|31744;if(r<=0){if(r<-10)return n;const a=(i|8388608)>>1-r+13;return n|a}const g=i>>13;return n|r<<10|g}function Js(s){return ze[0]=s,et[0]}function Hs(s){const A=s>>15&1,t=s>>10&31,e=s&1023;let i;if(t===0)if(e===0)i=A<<31;else{let n=e,r=-14;for(;(n&1024)===0;)n<<=1,r--;n&=1023;const g=r+127,a=n<<13;i=A<<31|g<<23|a}else if(t===31)e===0?i=A<<31|2139095040:i=A<<31|2143289344;else{const n=t-15+127,r=e<<13;i=A<<31|n<<23|r}return He[0]=i,vt[0]}function QA(s){return Math.max(0,Math.min(255,Math.round(s*255)))}function zs(s){const A=[],t=new Set;function e(i){i&&typeof i=="object"&&!t.has(i)&&(t.add(i),i instanceof ArrayBuffer?A.push(i):ArrayBuffer.isView(i)?A.push(i.buffer):Array.isArray(i)?i.forEach(e):Object.values(i).forEach(e))}return e(s),A}function qt(s,A,t,e,i,n,r,g,a,o,I,B,h,C,Q,u,l){const c=(l==null?void 0:l.rgbMin)??0,E=((l==null?void 0:l.rgbMax)??1)-c,f=QA((C-c)/E),p=QA((Q-c)/E),d=QA((u-c)/E),H=QA(h),m=Ze(ve.set(a,o,I,B)),w=m&255,G=m>>>8&255,M=m>>>16&255,x=(l==null?void 0:l.lnScaleMin)??Ye,D=254/(((l==null?void 0:l.lnScaleMax)??Re)-x),S=n<PA?0:Math.min(255,Math.max(1,Math.round((Math.log(n)-x)*D)+1)),k=r<PA?0:Math.min(255,Math.max(1,Math.round((Math.log(r)-x)*D)+1)),T=g<PA?0:Math.min(255,Math.max(1,Math.round((Math.log(g)-x)*D)+1)),q=WA(t),v=WA(e),W=WA(i),Z=A*4;s[Z]=f|p<<8|d<<16|H<<24,s[Z+1]=q|v<<16,s[Z+2]=W|w<<16|G<<24,s[Z+3]=S|k<<8|T<<16|M<<24}function Le(s,A,t,e,i){const n=WA(t),r=WA(e),g=WA(i),a=A*4;s[a+1]=n|r<<16,s[a+2]=g|s[a+2]&4294901760}function Te(s,A,t,e,i,n){const r=(n==null?void 0:n.lnScaleMin)??Ye,a=254/(((n==null?void 0:n.lnScaleMax)??Re)-r),o=t<PA?0:Math.min(255,Math.max(1,Math.round((Math.log(t)-r)*a)+1)),I=e<PA?0:Math.min(255,Math.max(1,Math.round((Math.log(e)-r)*a)+1)),B=i<PA?0:Math.min(255,Math.max(1,Math.round((Math.log(i)-r)*a)+1)),h=A*4;s[h+3]=o|I<<8|B<<16|s[h+3]&4278190080}const ve=new UA;function Ke(s,A,t,e,i,n){const r=Ze(ve.set(t,e,i,n)),g=r&255,a=r>>>8&255,o=r>>>16&255,I=A*4;s[I+2]=s[I+2]&65535|g<<16|a<<24,s[I+3]=s[I+3]&16777215|o<<24}function Ls(s,A,t,e,i,n,r){const g=(r==null?void 0:r.rgbMin)??0,o=((r==null?void 0:r.rgbMax)??1)-g,I=QA((t-g)/o),B=QA((e-g)/o),h=QA((i-g)/o),C=QA(n),Q=A*4;s[Q]=I|B<<8|h<<16|C<<24}function Ts(s,A,t,e,i,n){const r=(n==null?void 0:n.rgbMin)??0,a=((n==null?void 0:n.rgbMax)??1)-r,o=QA((t-r)/a),I=QA((e-r)/a),B=QA((i-r)/a),h=A*4;s[h]=o|I<<8|B<<16|s[h]&4278190080}function vs(s,A,t){const e=QA(t),i=A*4;s[i]=s[i]&16777215|e<<24}new U,new U,new Tt;function Ks(s){const A=_e,t=Math.max(Je,Math.min(be,Math.ceil(s/A))),e=Math.ceil(s/(A*t)),i=A*t*e;return{width:A,height:t,depth:e,maxSplats:i}}function lt(s){const A=_e,t=Math.max(Je,Math.min(be,Math.ceil(s/A))),e=Math.ceil(s/(A*t));return A*t*e}Ys(`\n precision highp float;\n\n in vec3 position;\n\n void main() {\n gl_Position = vec4(position.xy, 0.0, 1.0);\n }\n`);const qs=new UA,qe=new U;function Ze(s){const A=qs.copy(s).normalize();A.w<0&&A.set(-A.x,-A.y,-A.z,-A.w);const t=2*Math.acos(A.w),e=Math.sqrt(A.x*A.x+A.y*A.y+A.z*A.z),i=e<1e-6?qe.set(1,0,0):qe.set(A.x,A.y,A.z).divideScalar(e),n=Math.abs(i.x)+Math.abs(i.y)+Math.abs(i.z);let r=i.x/n,g=i.y/n;if(i.z<0){const C=r;r=(1-Math.abs(g))*(r>=0?1:-1),g=(1-Math.abs(C))*(g>=0?1:-1)}const a=r*.5+.5,o=g*.5+.5,I=Math.round(a*255),B=Math.round(o*255);return Math.round(t*(255/Math.PI))<<16|B<<8|I}function ut(s,A,t,e){const i=Math.max(-127,Math.min(127,s*127)),n=Math.max(-127,Math.min(127,A*127)),r=Math.max(-127,Math.min(127,t*127)),g=Math.max(-127,Math.min(127,e*127));return i&255|(n&255)<<8|(r&255)<<16|(g&255)<<24}function ft(s,A,t,e){const i=(e==null?void 0:e.sh1Min)??-1,n=(e==null?void 0:e.sh1Max)??1,r=.5*(i+n),g=126/(n-i),a=A*2;for(let o=0;o<9;++o){const I=(t[o]-r)*g,B=Math.round(Math.max(-63,Math.min(63,I)))&127,h=o*7,C=h+7,Q=Math.floor(h/32),u=h-Q*32,l=B<<u&4294967295;if(s[a+Q]|=l,C>Q*32+32){const c=B>>>32-u&4294967295;s[a+Q+1]|=c}}}function yt(s,A,t,e){const i=(e==null?void 0:e.sh2Min)??-1,n=(e==null?void 0:e.sh2Max)??1,r=.5*(i+n),g=2/(n-i);s[A*4+0]=ut((t[0]-r)*g,(t[1]-r)*g,(t[2]-r)*g,(t[3]-r)*g),s[A*4+1]=ut((t[4]-r)*g,(t[5]-r)*g,(t[6]-r)*g,(t[7]-r)*g),s[A*4+2]=ut((t[8]-r)*g,(t[9]-r)*g,(t[10]-r)*g,(t[11]-r)*g),s[A*4+3]=ut((t[12]-r)*g,(t[13]-r)*g,(t[14]-r)*g,0)}function wt(s,A,t,e){const i=(e==null?void 0:e.sh3Min)??-1,n=(e==null?void 0:e.sh3Max)??1,r=.5*(i+n),g=62/(n-i),a=A*4;for(let o=0;o<21;++o){const I=(t[o]-r)*g,B=Math.round(Math.max(-31,Math.min(31,I)))&63,h=o*6,C=h+6,Q=Math.floor(h/32),u=h-Q*32,l=B<<u&4294967295;if(s[a+Q]|=l,C>Q*32+32){const c=B>>>32-u&4294967295;s[a+Q+1]|=c}}}function Zs(s,A){const t=[];let e=0,i=null;const n=new ms((a,o)=>{if(t.push(a),e+=a.length,o||e>=A){const I=new Uint8Array(e);let B=0;for(const h of t)I.set(h,B),B+=h.length;i=I.slice(0,A)}}),r=1024;let g=0;for(;i==null&&g<s.length;){const a=s.slice(g,g+r);n.push(a,!1),g+=r}if(i==null&&(n.push(new Uint8Array,!0),i==null))throw new Error("Failed to decompress partial gzip");return i}class Xs{constructor({fileBytes:A,chunkBytes:t=64*1024}){this.fileBytes=A,this.chunkBytes=t,this.chunks=[],this.totalBytes=0;const e=new DecompressionStream("gzip"),i=new Blob([A]).stream().pipeThrough(e);this.reader=i.getReader()}async read(A){for(;this.totalBytes<A;){const{value:n,done:r}=await this.reader.read();if(r)break;this.chunks.push(n),this.totalBytes+=n.length}if(this.totalBytes<A)throw new Error(`Unexpected EOF: needed ${A}, got ${this.totalBytes}`);const t=new Uint8Array(this.totalBytes);let e=0;for(const n of this.chunks)t.set(n,e),e+=n.length;const i=t.subarray(0,A);return this.chunks=[t.subarray(A)],this.totalBytes-=A,i}}function Xe(s,A,t){const e=Math.floor(s.length/32);if(e*32!==s.length)throw new Error("Invalid .splat file size");A(e);const i=new Float32Array(s.buffer);for(let n=0;n<e;++n){const r=n*32,g=n*8,a=i[g+0],o=i[g+1],I=i[g+2],B=i[g+3],h=i[g+4],C=i[g+5],Q=s[r+24]/255,u=s[r+25]/255,l=s[r+26]/255,c=s[r+27]/255,y=(s[r+28]-128)/128,E=(s[r+29]-128)/128,f=(s[r+30]-128)/128,p=(s[r+31]-128)/128;t(n,a,o,I,B,h,C,E,f,p,y,c,Q,u,l)}}function Ps(s,A){let t=0,e=0,i=new Uint32Array(0);return Xe(s,n=>{t=n,e=lt(t),i=new Uint32Array(e*4)},(n,r,g,a,o,I,B,h,C,Q,u,l,c,y,E)=>{qt(i,n,r,g,a,o,I,B,h,C,Q,u,l,c,y,E,A)}),{packedArray:i,numSplats:t}}const mt={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}},Pe={0:0,1:9,2:24,3:45};function Ws(s,A,t,e){var u;let r=0;const g=new DataView(s.buffer,r,4096);r+=4096;const a=g.getUint8(0),o=g.getUint8(1);if(a!==0||o<1)throw new Error(`Unsupported .ksplat version: ${a}.${o}`);const I=g.getUint32(4,!0);g.getUint32(16,!0);const B=g.getUint16(20,!0);if(B<0||B>2)throw new Error(`Invalid .ksplat compression level: ${B}`);const h=g.getFloat32(36,!0)||-1.5,C=g.getFloat32(40,!0)||1.5;let Q=4096+I*1024;for(let l=0;l<I;++l){let c=function(rA,R){if(B===0)return Y.getFloat32(rA+b+R*4,!0);if(B===1)return $(Y.getUint16(rA+b+R*2,!0));const lA=Y.getUint8(rA+b+R)/255;return h+lA*(C-h)};const y=new DataView(s.buffer,r,1024);r+=1024;const E=y.getUint32(0,!0),f=y.getUint32(4,!0),p=y.getUint32(8,!0),d=y.getUint32(12,!0),H=y.getFloat32(16,!0),m=y.getUint16(20,!0),w=(y.getUint32(24,!0)||((u=mt[B])==null?void 0:u.scaleRange))??1,G=y.getUint32(32,!0),M=G*p,x=y.getUint32(36,!0),F=x*4,D=m*d+F,S=y.getUint16(40,!0),k=Pe[S],{bytesPerCenter:T,bytesPerScale:q,bytesPerRotation:v,bytesPerColor:W,bytesPerSphericalHarmonicsComponent:Z,scaleOffsetBytes:P,rotationOffsetBytes:z,colorOffsetBytes:K,sphericalHarmonicsOffsetBytes:b}=mt[B],_=T+q+v+W+k*Z,N=_*f,sA=N+D,iA=[0,3,6,1,4,7,2,5,8],oA=[9,14,19,10,15,20,11,16,21,12,17,22,13,18,23],gA=[24,31,38,25,32,39,26,33,40,27,34,41,28,35,42,29,36,43,30,37,44],IA=S>=1?new Float32Array(3*3):void 0,BA=S>=2?new Float32Array(5*3):void 0,FA=S>=3?new Float32Array(7*3):void 0,CA=H/2/w,cA=Q+F,EA=Q+D,Y=new DataView(s.buffer,EA,N),nA=new Float32Array(s.buffer,cA,d*3),O=new Uint32Array(s.buffer,Q,x);let L=G,_A=M;for(let rA=0;rA<E;++rA){const R=rA*_;let lA;if(rA<M)lA=Math.floor(rA/p);else{const SA=O[L-G];rA>=_A+SA&&(L+=1,_A+=SA),lA=L}const AA=B===0?Y.getFloat32(R+0,!0):(Y.getUint16(R+0,!0)-w)*CA+nA[3*lA+0],J=B===0?Y.getFloat32(R+4,!0):(Y.getUint16(R+2,!0)-w)*CA+nA[3*lA+1],pA=B===0?Y.getFloat32(R+8,!0):(Y.getUint16(R+4,!0)-w)*CA+nA[3*lA+2],nt=B===0?Y.getFloat32(R+P+0,!0):$(Y.getUint16(R+P+0,!0)),rt=B===0?Y.getFloat32(R+P+4,!0):$(Y.getUint16(R+P+2,!0)),jt=B===0?Y.getFloat32(R+P+8,!0):$(Y.getUint16(R+P+4,!0)),Ot=B===0?Y.getFloat32(R+z+0,!0):$(Y.getUint16(R+z+0,!0)),$t=B===0?Y.getFloat32(R+z+4,!0):$(Y.getUint16(R+z+2,!0)),Ae=B===0?Y.getFloat32(R+z+8,!0):$(Y.getUint16(R+z+4,!0)),te=B===0?Y.getFloat32(R+z+12,!0):$(Y.getUint16(R+z+6,!0)),ee=Y.getUint8(R+K+0)/255,se=Y.getUint8(R+K+1)/255,ie=Y.getUint8(R+K+2)/255,ne=Y.getUint8(R+K+3)/255;if(t(rA,AA,J,pA,nt,rt,jt,$t,Ae,te,Ot,ne,ee,se,ie),S>=1&&IA){for(const[SA,LA]of iA.entries())IA[SA]=c(R,LA);if(BA)for(const[SA,LA]of oA.entries())BA[SA]=c(R,LA);if(FA)for(const[SA,LA]of gA.entries())FA[SA]=c(R,LA);e==null||e(rA,IA,BA,FA)}}Q+=sA}}function Vs(s,A){var y;let i=0;const n=new DataView(s.buffer,i,4096);i+=4096;const r=n.getUint8(0),g=n.getUint8(1);if(r!==0||g<1)throw new Error(`Unsupported .ksplat version: ${r}.${g}`);const a=n.getUint32(4,!0),o=n.getUint32(16,!0),I=n.getUint16(20,!0);if(I<0||I>2)throw new Error(`Invalid .ksplat compression level: ${I}`);const B=n.getFloat32(36,!0)||-1.5,h=n.getFloat32(40,!0)||1.5,C=o,Q=lt(C),u=new Uint32Array(Q*4),l={};let c=4096+a*1024;for(let E=0;E<a;++E){let f=function(AA,J){if(I===0)return L.getFloat32(AA+sA+J*4,!0);if(I===1)return $(L.getUint16(AA+sA+J*2,!0));const pA=L.getUint8(AA+sA+J)/255;return B+pA*(h-B)};const p=new DataView(s.buffer,i,1024);i+=1024;const d=p.getUint32(0,!0),H=p.getUint32(4,!0),m=p.getUint32(8,!0),w=p.getUint32(12,!0),G=p.getFloat32(16,!0),M=p.getUint16(20,!0),x=(p.getUint32(24,!0)||((y=mt[I])==null?void 0:y.scaleRange))??1,F=p.getUint32(32,!0),D=F*m,S=p.getUint32(36,!0),k=S*4,T=M*w+k,q=p.getUint16(40,!0),v=Pe[q],{bytesPerCenter:W,bytesPerScale:Z,bytesPerRotation:P,bytesPerColor:z,bytesPerSphericalHarmonicsComponent:K,scaleOffsetBytes:b,rotationOffsetBytes:_,colorOffsetBytes:N,sphericalHarmonicsOffsetBytes:sA}=mt[I],iA=W+Z+P+z+v*K,oA=iA*H,gA=oA+T,IA=[0,3,6,1,4,7,2,5,8],BA=[9,14,19,10,15,20,11,16,21,12,17,22,13,18,23],FA=[24,31,38,25,32,39,26,33,40,27,34,41,28,35,42,29,36,43,30,37,44],CA=q>=1?new Float32Array(3*3):void 0,cA=q>=2?new Float32Array(5*3):void 0,EA=q>=3?new Float32Array(7*3):void 0,Y=G/2/x,nA=c+k,O=c+T,L=new DataView(s.buffer,O,oA),_A=new Float32Array(s.buffer,nA,w*3),rA=new Uint32Array(s.buffer,c,S);let R=F,lA=D;for(let AA=0;AA<d;++AA){const J=AA*iA;let pA;if(AA<D)pA=Math.floor(AA/m);else{const bA=rA[R-F];AA>=lA+bA&&(R+=1,lA+=bA),pA=R}const nt=I===0?L.getFloat32(J+0,!0):(L.getUint16(J+0,!0)-x)*Y+_A[3*pA+0],rt=I===0?L.getFloat32(J+4,!0):(L.getUint16(J+2,!0)-x)*Y+_A[3*pA+1],jt=I===0?L.getFloat32(J+8,!0):(L.getUint16(J+4,!0)-x)*Y+_A[3*pA+2],Ot=I===0?L.getFloat32(J+b+0,!0):$(L.getUint16(J+b+0,!0)),$t=I===0?L.getFloat32(J+b+4,!0):$(L.getUint16(J+b+2,!0)),Ae=I===0?L.getFloat32(J+b+8,!0):$(L.getUint16(J+b+4,!0)),te=I===0?L.getFloat32(J+_+0,!0):$(L.getUint16(J+_+0,!0)),ee=I===0?L.getFloat32(J+_+4,!0):$(L.getUint16(J+_+2,!0)),se=I===0?L.getFloat32(J+_+8,!0):$(L.getUint16(J+_+4,!0)),ie=I===0?L.getFloat32(J+_+12,!0):$(L.getUint16(J+_+6,!0)),ne=L.getUint8(J+N+0)/255,SA=L.getUint8(J+N+1)/255,LA=L.getUint8(J+N+2)/255,yi=L.getUint8(J+N+3)/255;if(qt(u,AA,nt,rt,jt,Ot,$t,Ae,ee,se,ie,te,yi,ne,SA,LA,A),q>=1){if(CA){l.sh1||(l.sh1=new Uint32Array(C*2));for(const[bA,gt]of IA.entries())CA[bA]=f(J,gt);ft(l.sh1,AA,CA,A)}if(cA){l.sh2||(l.sh2=new Uint32Array(C*4));for(const[bA,gt]of BA.entries())cA[bA]=f(J,gt);yt(l.sh2,AA,cA,A)}if(EA){l.sh3||(l.sh3=new Uint32Array(C*4));for(const[bA,gt]of FA.entries())EA[bA]=f(J,gt);wt(l.sh3,AA,EA,A)}}}c+=gA}return{packedArray:u,numSplats:C,extra:l}}const We=["char","uchar","short","ushort","int","uint","float","double"],jA=class jA{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:r=>{r.enqueue(this.fileBytes.slice(0,65536)),r.close()}}).pipeThrough(new TextDecoderStream).getReader();this.header="";const e=`end_header\n`;for(;;){const{value:r,done:g}=await t.read();if(g)throw new Error("Failed to read header");this.header+=r;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 n=null;this.comments=[],this.header.trim().split(`\n`).forEach((r,g)=>{const a=r.trim();if(g===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 I=o[1];n={name:I,count:Number.parseInt(o[2]),properties:{}},this.elements[I]=n;break}case"property":if(n==null)throw new Error("Property must be inside an element");o[1]==="list"?n.properties[o[4]]={isList:!0,type:o[3],countType:o[2]}:n.properties[o[2]]={isList:!1,type:o[1]};break}}),this.elements.vertex&&(this.numSplats=this.elements.vertex.count)}parseData(A){let t=0;const e=this.data;if(e==null)throw new Error("No data to parse");for(const i in this.elements){const n=this.elements[i],{count:r,properties:g}=n,a=$s(g),o=Ai(g,this.littleEndian),I=A(n)??(()=>{});for(let B=0;B<r;B++)t=o(e,t,a),I(B,a)}}parseSplats(A,t){if(this.elements.vertex==null)throw new Error("No vertex element found");let e=!1;const i=[];let n=0,r=[],g=[],a=[],o,I,B;function h(){const c=Os[n];r=new Array(3).fill(null).flatMap((y,E)=>[0,1,2].map((f,p)=>E+p*c/3)),g=new Array(5).fill(null).flatMap((y,E)=>[0,1,2].map((f,p)=>3+E+p*c/3)),a=new Array(7).fill(null).flatMap((y,E)=>[0,1,2].map((f,p)=>8+E+p*c/3)),o=n>=1?new Float32Array(3*3):void 0,I=n>=2?new Float32Array(5*3):void 0,B=n>=3?new Float32Array(7*3):void 0}function C(c,y){if(!o)throw new Error("Missing sh1");const E=y.f_rest;for(let f=0;f<r.length;f++)o[f]=E[r[f]]*8/255-4;if(I)for(let f=0;f<g.length;f++)I[f]=E[g[f]]*8/255-4;if(B)for(let f=0;f<a.length;f++)B[f]=E[a[f]]*8/255-4;t==null||t(c,o,I,B)}function Q(c){const{min_x:y,min_y:E,min_z:f,max_x:p,max_y:d,max_z:H,min_scale_x:m,min_scale_y:w,min_scale_z:G,max_scale_x:M,max_scale_y:x,max_scale_z:F}=c.properties;if(!y||!E||!f||!p||!d||!H||!m||!w||!G||!M||!x||!F)throw new Error("Missing PLY chunk properties");return e=!0,(D,S)=>{const{min_x:k,min_y:T,min_z:q,max_x:v,max_y:W,max_z:Z,min_scale_x:P,min_scale_y:z,min_scale_z:K,max_scale_x:b,max_scale_y:_,max_scale_z:N,min_r:sA,min_g:iA,min_b:oA,max_r:gA,max_g:IA,max_b:BA}=S;i.push({min_x:k,min_y:T,min_z:q,max_x:v,max_y:W,max_z:Z,min_scale_x:P,min_scale_y:z,min_scale_z:K,max_scale_x:b,max_scale_y:_,max_scale_z:N,min_r:sA,min_g:iA,min_b:oA,max_r:gA,max_g:IA,max_b:BA})}}function u(c){if(t&&c.name==="sh")return n=Xt(c.properties),h(),C;if(c.name!=="vertex")return null;const{packed_position:y,packed_rotation:E,packed_scale:f,packed_color:p}=c.properties;if(!y||!E||!f||!p)throw new Error("Missing PLY properties: packed_position, packed_rotation, packed_scale, packed_color");const d=Math.sqrt(2);return(H,m)=>{const w=i[H>>>8];if(w==null)throw new Error("Missing PLY chunk");const{min_x:G,min_y:M,min_z:x,max_x:F,max_y:D,max_z:S,min_scale_x:k,min_scale_y:T,min_scale_z:q,max_scale_x:v,max_scale_y:W,max_scale_z:Z,min_r:P,min_g:z,min_b:K,max_r:b,max_g:_,max_b:N}=w,{packed_position:sA,packed_rotation:iA,packed_scale:oA,packed_color:gA}=m,IA=(sA>>>21&2047)/2047*(F-G)+G,BA=(sA>>>11&1023)/1023*(D-M)+M,FA=(sA&2047)/2047*(S-x)+x,CA=((iA>>>20&1023)/1023-.5)*d,cA=((iA>>>10&1023)/1023-.5)*d,EA=((iA&1023)/1023-.5)*d,Y=Math.sqrt(Math.max(0,1-CA*CA-cA*cA-EA*EA)),nA=iA>>>30,O=nA===0?CA:nA===1?Y:cA,L=nA<=1?cA:nA===2?Y:EA,_A=nA<=2?EA:Y,rA=nA===0?Y:CA,R=Math.exp((oA>>>21&2047)/2047*(v-k)+k),lA=Math.exp((oA>>>11&1023)/1023*(W-T)+T),AA=Math.exp((oA&2047)/2047*(Z-q)+q),J=(gA>>>24&255)/255*((b??1)-(P??0))+(P??0),pA=(gA>>>16&255)/255*((_??1)-(z??0))+(z??0),nt=(gA>>>8&255)/255*((N??1)-(K??0))+(K??0),rt=(gA&255)/255;A(H,IA,BA,FA,R,lA,AA,O,L,_A,rA,rt,J,pA,nt)}}const l=c=>{if(c.name==="chunk")return Q(c);if(e)return u(c);if(c.name!=="vertex")return null;const{x:y,y:E,z:f,scale_0:p,scale_1:d,scale_2:H,rot_0:m,rot_1:w,rot_2:G,rot_3:M,opacity:x,f_dc_0:F,f_dc_1:D,f_dc_2:S,red:k,green:T,blue:q,alpha:v}=c.properties;if(!y||!E||!f)throw new Error("Missing PLY properties: x, y, z");const W=p&&d&&H,Z=m&&w&&G&&M,P=v!=null?Mt[v.type]:1,z=k!=null?Mt[k.type]:1,K=T!=null?Mt[T.type]:1,b=q!=null?Mt[q.type]:1;return n=Xt(c.properties),h(),(_,N)=>{const sA=W?Math.exp(N.scale_0):jA.defaultPointScale,iA=W?Math.exp(N.scale_1):jA.defaultPointScale,oA=W?Math.exp(N.scale_2):jA.defaultPointScale,gA=Z?N.rot_1:0,IA=Z?N.rot_2:0,BA=Z?N.rot_3:0,FA=Z?N.rot_0:1,CA=x!=null?1/(1+Math.exp(-N.opacity)):v!=null?N.alpha/P:1,cA=F!=null?N.f_dc_0*xt+.5:k!=null?N.red/z:1,EA=D!=null?N.f_dc_1*xt+.5:T!=null?N.green/K:1,Y=S!=null?N.f_dc_2*xt+.5:q!=null?N.blue/b:1;if(A(_,N.x,N.y,N.z,sA,iA,oA,gA,IA,BA,FA,CA,cA,EA,Y),t&&o){const nA=N.f_rest;if(o)for(let O=0;O<r.length;O++)o[O]=nA[r[O]];if(I)for(let O=0;O<g.length;O++)I[O]=nA[g[O]];if(B)for(let O=0;O<a.length;O++)B[O]=nA[a[O]];t(_,o,I,B)}}};this.parseData(l)}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 n=this.elements[i],{count:r,properties:g}=n,a=[];let o=0;const I=i==="vertex";if(I){for(const B of["opacity","f_dc_0","f_dc_1","f_dc_2"])if(!g[B]||g[B].type!=="float")throw new Error(`Can\'t injectRgba due to property: ${B}`)}for(const[B,h]of Object.entries(g))if(h.isList)a.push(()=>{const C=VA[h.countType](e,t,this.littleEndian);t+=mA[h.countType],t+=C*mA[h.type]});else{if(I)if(B==="f_dc_0"||B==="f_dc_1"||B==="f_dc_2"){const C=Number.parseInt(B.slice(5));a.push(()=>{const Q=(A[o+C]/255-.5)/xt;Ve[h.type](e,t,this.littleEndian,Q)})}else B==="opacity"&&a.push(()=>{const C=Math.max(-100,Math.min(100,-Math.log(1/(A[o+3]/255)-1)));Ve[h.type](e,t,this.littleEndian,C)});a.push(()=>{t+=mA[h.type]})}for(let B=0;B<r;B++){for(const h of a)h();I&&(o+=4)}}}};jA.defaultPointScale=.001;let pt=jA;const xt=.28209479177387814,VA={char:(s,A,t)=>s.getInt8(A),uchar:(s,A,t)=>s.getUint8(A),short:(s,A,t)=>s.getInt16(A,t),ushort:(s,A,t)=>s.getUint16(A,t),int:(s,A,t)=>s.getInt32(A,t),uint:(s,A,t)=>s.getUint32(A,t),float:(s,A,t)=>s.getFloat32(A,t),double:(s,A,t)=>s.getFloat64(A,t)},Ve={char:(s,A,t,e)=>{s.setInt8(A,e)},uchar:(s,A,t,e)=>{s.setUint8(A,e)},short:(s,A,t,e)=>{s.setInt16(A,e,t)},ushort:(s,A,t,e)=>{s.setUint16(A,e,t)},int:(s,A,t,e)=>{s.setInt32(A,e,t)},uint:(s,A,t,e)=>{s.setUint32(A,e,t)},float:(s,A,t,e)=>{s.setFloat32(A,e,t)},double:(s,A,t,e)=>{s.setFloat64(A,e,t)}},mA={char:1,uchar:1,short:2,ushort:2,int:4,uint:4,float:4,double:8},Mt={char:127,uchar:255,short:32767,ushort:65535,int:2147483647,uint:4294967295,float:1,double:1},js={0:0,9:1,24:2,45:3},Os={0:0,1:9,2:24,3:45},Zt=/^f_rest_([0-9]{1,2})$/;function $s(s){const A={};for(const[t,e]of Object.entries(s))Zt.test(t)?A.f_rest=new Array(Xt(s)):A[t]=e.isList?[]:0;return A}function Ai(s,A){return si(s)?ii(s,A):ni(s,A)}const ti=(()=>{try{new Function("return 42;")}catch{return!1}return!0})(),ei=/^[a-zA-Z0-9_]+$/;function si(s){if(!ti)return!1;for(const[A,t]of Object.entries(s))if(!ei.test(A)||t.isList&&!We.includes(t.countType)||!We.includes(t.type))return!1;return!0}function ii(s,A){const t=["let list;"];for(const[i,n]of Object.entries(s)){const r=i.match(Zt);if(r){const g=+r[1];t.push(`\n item.f_rest[${g}] = PARSE_FIELD[\'${n.type}\'](data, offset, ${A});\n offset += ${mA[n.type]};\n `)}else n.isList?t.push(`\n list = item[\'${i}\'];\n list.length = PARSE_FIELD[\'${n.countType}\'](data, offset, ${A});\n offset += ${mA[n.countType]};\n for (let i = 0; i < list.length; i++) {\n list[i] = PARSE_FIELD[\'${n.type}\'](data, offset, ${A});\n offset += ${mA[n.type]};\n }\n `):t.push(`\n item[\'${i}\'] = PARSE_FIELD[\'${n.type}\'](data, offset, ${A});\n offset += ${mA[n.type]};\n `)}t.push("return offset;");const e=new Function("data","offset","item","PARSE_FIELD",t.join(`\n`));return(i,n,r)=>e(i,n,r,VA)}function ni(s,A){const t=[];for(const[e,i]of Object.entries(s)){const n=e.match(Zt);if(n){const r=+n[1];t.push((g,a,o)=>(o.f_rest[r]=VA[i.type](g,a,A),a+mA[i.type]))}else i.isList?t.push((r,g,a)=>{const o=a[e];o.length=VA[i.countType](r,g,A);let I=g+mA[i.countType];for(let B=0;B<o.length;B++)o[B]=VA[i.type](r,I,A),I+=mA[i.type];return I}):t.push((r,g,a)=>(a[e]=VA[i.type](r,g,A),g+mA[i.type]))}return(e,i,n)=>{let r=i;for(let g=0;g<t.length;g++)r=t[g](e,r,n);return r}}function Xt(s){let A=0;for(;s[`f_rest_${A}`];)A+=1;const t=js[A];if(t==null)throw new Error(`Unsupported number of SH coefficients: ${A}`);return t}var st=(s=>(s.PLY="ply",s.SPZ="spz",s.SPLAT="splat",s.KSPLAT="ksplat",s.PCSOGS="pcsogs",s.PCSOGSZIP="pcsogszip",s))(st||{});function ri(s){const A=new DataView(s.buffer);if((A.getUint32(0,!0)&16777215)===7957616)return"ply";if((A.getUint32(0,!0)&16777215)===559903){const t=Zs(s,4);return new DataView(t.buffer).getUint32(0,!0)===1347635022?"spz":void 0}if(A.getUint32(0,!0)===67324752)return je(s)?"pcsogszip":void 0}function gi(s){const A=s.split(/[?#]/,1)[0],t=Math.max(A.lastIndexOf("/"),A.lastIndexOf("\\\\")),e=A.slice(t+1),i=e.lastIndexOf(".");return i<=0||i===e.length-1?"":e.slice(i+1).toLowerCase()}function ai(s){const A=gi(s);if(A==="ply")return"ply";if(A==="spz")return"spz";if(A==="splat")return"splat";if(A==="ksplat")return"ksplat";if(A==="sog")return"pcsogszip"}function oi(s){try{let A;if(typeof s=="string")A=s;else{const i=s instanceof ArrayBuffer?new Uint8Array(s):s;if(i.length>65536)return;A=new TextDecoder().decode(i)}const t=JSON.parse(A);if(!t||typeof t!="object"||Array.isArray(t))return;const e=t.version===2;for(const i of["means","scales","quats","sh0"]){if(!t[i]||typeof t[i]!="object"||Array.isArray(t[i]))return;if(e){if(!t[i].files||(i==="scales"||i==="sh0")&&!t[i].codebook||i==="means"&&(!t[i].mins||!t[i].maxs))return}else if(!t[i].shape||!t[i].files||i!=="quats"&&(!t[i].mins||!t[i].maxs))return}return t}catch{return}}function je(s){try{const A=s instanceof ArrayBuffer?new Uint8Array(s):s;let t=null;const e=Ds(A,{filter:({name:n})=>n.split(/[\\\\/]/).pop()==="meta.json"?(t=n,!0):!1});if(!t)return;const i=oi(e[t]);return i?{name:t,json:i}:void 0}catch{return}}class Ii{constructor({maxSplats:A=1}={}){this.numSplats=0,this.maxSplats=Ks(A).maxSplats,this.centers=new Float32Array(this.maxSplats*3),this.scales=new Float32Array(this.maxSplats*3),this.quaternions=new Float32Array(this.maxSplats*4),this.opacities=new Float32Array(this.maxSplats),this.colors=new Float32Array(this.maxSplats*3)}pushSplat(){const A=this.numSplats;return this.ensureIndex(A),this.numSplats+=1,A}unpushSplat(A){if(A===this.numSplats-1)this.numSplats-=1;else throw new Error("Cannot unpush splat from non-last position")}ensureCapacity(A){if(A>this.maxSplats){const t=Math.max(A,this.maxSplats*2),e=new Float32Array(t*3),i=new Float32Array(t*3),n=new Float32Array(t*4),r=new Float32Array(t),g=new Float32Array(t*3);if(e.set(this.centers),i.set(this.scales),n.set(this.quaternions),r.set(this.opacities),g.set(this.colors),this.centers=e,this.scales=i,this.quaternions=n,this.opacities=r,this.colors=g,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,n){this.quaternions[A*4]=t,this.quaternions[A*4+1]=e,this.quaternions[A*4+2]=i,this.quaternions[A*4+3]=n}setOpacity(A,t){this.opacities[A]=t}setColor(A,t,e,i){this.colors[A*3]=t,this.colors[A*3+1]=e,this.colors[A*3+2]=i}setSh1(A,t){this.sh1||(this.sh1=new Float32Array(this.maxSplats*9));for(let e=0;e<9;++e)this.sh1[A*9+e]=t[e]}setSh2(A,t){this.sh2||(this.sh2=new Float32Array(this.maxSplats*15));for(let e=0;e<15;++e)this.sh2[A*15+e]=t[e]}setSh3(A,t){this.sh3||(this.sh3=new Float32Array(this.maxSplats*21));for(let e=0;e<21;++e)this.sh3[A*21+e]=t[e]}}async function Oe(s,A,t){const e="version"in s;if(!e&&s.quats.encoding!=="quaternion_packed")throw new Error("Unsupported quaternion encoding");const i=e?s.count:s.means.shape[0],n=lt(i),r=new Uint32Array(n*4),g={},a=Promise.all([it(A[s.means.files[0]]),it(A[s.means.files[1]])]).then(C=>{for(let Q=0;Q<i;++Q){const u=Q*4,l=(C[0][u+0]+(C[1][u+0]<<8))/65535,c=(C[0][u+1]+(C[1][u+1]<<8))/65535,y=(C[0][u+2]+(C[1][u+2]<<8))/65535;let E=s.means.mins[0]+(s.means.maxs[0]-s.means.mins[0])*l,f=s.means.mins[1]+(s.means.maxs[1]-s.means.mins[1])*c,p=s.means.mins[2]+(s.means.maxs[2]-s.means.mins[2])*y;E=Math.sign(E)*(Math.exp(Math.abs(E))-1),f=Math.sign(f)*(Math.exp(Math.abs(f))-1),p=Math.sign(p)*(Math.exp(Math.abs(p))-1),Le(r,Q,E,f,p)}}),o=it(A[s.scales.files[0]]).then(C=>{let Q,u,l;e?Q=u=l=s.scales.codebook.map(c=>Math.exp(c)):(Q=new Array(256).fill(0).map((c,y)=>s.scales.mins[0]+(s.scales.maxs[0]-s.scales.mins[0])*(y/255)).map(c=>Math.exp(c)),u=new Array(256).fill(0).map((c,y)=>s.scales.mins[1]+(s.scales.maxs[1]-s.scales.mins[1])*(y/255)).map(c=>Math.exp(c)),l=new Array(256).fill(0).map((c,y)=>s.scales.mins[2]+(s.scales.maxs[2]-s.scales.mins[2])*(y/255)).map(c=>Math.exp(c)));for(let c=0;c<i;++c){const y=c*4;Te(r,c,Q[C[y+0]],u[C[y+1]],l[C[y+2]],t)}}),I=it(A[s.quats.files[0]]).then(C=>{const Q=Math.sqrt(2),u=new Array(256).fill(0).map((l,c)=>(c/255-.5)*Q);for(let l=0;l<i;++l){const c=l*4,y=u[C[c+0]],E=u[C[c+1]],f=u[C[c+2]],p=Math.sqrt(Math.max(0,1-y*y-E*E-f*f)),d=C[c+3]-252,H=d===0?y:d===1?p:E,m=d<=1?E:d===2?p:f,w=d<=2?f:p;Ke(r,l,H,m,w,d===0?p:y)}}),B=it(A[s.sh0.files[0]]).then(C=>{const Q=.28209479177387814;let u,l,c,y;e?(u=l=c=s.sh0.codebook.map(E=>Q*E+.5),y=new Array(256).fill(0).map((E,f)=>f/255)):(u=new Array(256).fill(0).map((E,f)=>s.sh0.mins[0]+(s.sh0.maxs[0]-s.sh0.mins[0])*(f/255)).map(E=>Q*E+.5),l=new Array(256).fill(0).map((E,f)=>s.sh0.mins[1]+(s.sh0.maxs[1]-s.sh0.mins[1])*(f/255)).map(E=>Q*E+.5),c=new Array(256).fill(0).map((E,f)=>s.sh0.mins[2]+(s.sh0.maxs[2]-s.sh0.mins[2])*(f/255)).map(E=>Q*E+.5),y=new Array(256).fill(0).map((E,f)=>s.sh0.mins[3]+(s.sh0.maxs[3]-s.sh0.mins[3])*(f/255)).map(E=>1/(1+Math.exp(-E))));for(let E=0;E<i;++E){const f=E*4;Ls(r,E,u[C[f+0]],l[C[f+1]],c[C[f+2]],y[C[f+3]],t)}}),h=[a,o,I,B];if(s.shN){const C=e?s.shN.bands>=3:s.shN.shape[1]>=45,Q=e?s.shN.bands>=2:s.shN.shape[1]>=24,u=e?s.shN.bands>=1:s.shN.shape[1]>=9;u&&(g.sh1=new Uint32Array(i*2)),Q&&(g.sh2=new Uint32Array(i*4)),C&&(g.sh3=new Uint32Array(i*4));const l=new Float32Array(9),c=new Float32Array(15),y=new Float32Array(21),E=s.shN,f=Promise.all([Pt(A[s.shN.files[0]]),Pt(A[s.shN.files[1]])]).then(([p,d])=>{const H="codebook"in E?E.codebook:new Array(256).fill(0).map((m,w)=>E.mins+(E.maxs-E.mins)*(w/255));for(let m=0;m<i;++m){const w=m*4,G=d.rgba[w+0]+(d.rgba[w+1]<<8),M=(G&63)*15,F=(G>>>6)*p.width+M;for(let D=0;D<3;++D){if(u)for(let S=0;S<3;++S)l[S*3+D]=H[p.rgba[(F+S)*4+D]];if(Q)for(let S=0;S<5;++S)c[S*3+D]=H[p.rgba[(F+3+S)*4+D]];if(C)for(let S=0;S<7;++S)y[S*3+D]=H[p.rgba[(F+8+S)*4+D]]}u&&ft(g.sh1,m,l,t),Q&&yt(g.sh2,m,c,t),C&&wt(g.sh3,m,y,t)}});h.push(f)}return await Promise.all(h),{packedArray:r,numSplats:i,extra:g}}let St=null;async function Pt(s){if(!St&&(St=new OffscreenCanvas(1,1).getContext("webgl2"),!St))throw new Error("Failed to create WebGL2 context");const A=new Blob([s]),t=await createImageBitmap(A,{premultiplyAlpha:"none"}),e=St,i=e.createTexture();e.bindTexture(e.TEXTURE_2D,i),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);const n=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,n),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,i,0);const r=new Uint8Array(t.width*t.height*4);return e.readPixels(0,0,t.width,t.height,e.RGBA,e.UNSIGNED_BYTE,r),e.deleteTexture(i),e.deleteFramebuffer(n),{rgba:r,width:t.width,height:t.height}}async function it(s){const{rgba:A}=await Pt(s);return A}async function Bi(s,A){var h;const t=je(s);if(!t)throw new Error("Invalid PC SOGS zip file");const{name:e,json:i}=t,n=e.lastIndexOf("/"),r=e.lastIndexOf("\\\\"),g=e.slice(0,Math.max(n,r)+1),a=new Map,o=[...i.means.files,...i.scales.files,...i.quats.files,...i.sh0.files,...((h=i.shN)==null?void 0:h.files)??[]];for(const C of o)a.set(g+C,C);const I=await new Promise((C,Q)=>{Ss(s,{filter:({name:u})=>a.has(u)},(u,l)=>{u?Q(u):C(l)})}),B={};for(const[C,Q]of a.entries())B[Q]=I[C];return await Oe(i,B,A)}class $e{constructor({fileBytes:A}){this.version=-1,this.numSplats=0,this.shDegree=0,this.fractionalBits=0,this.flags=0,this.flagAntiAlias=!1,this.reserved=0,this.headerParsed=!1,this.parsed=!1,this.fileBytes=A instanceof ArrayBuffer?new Uint8Array(A):A,this.reader=new Xs({fileBytes:this.fileBytes})}async parseHeader(){if(this.headerParsed)throw new Error("SPZ file header already parsed");const A=new DataView((await this.reader.read(16)).buffer);if(A.getUint32(0,!0)!==1347635022)throw new Error("Invalid SPZ file");if(this.version=A.getUint32(4,!0),this.version<1||this.version>3)throw new Error(`Unsupported SPZ version: ${this.version}`);this.numSplats=A.getUint32(8,!0),this.shDegree=A.getUint8(12),this.fractionalBits=A.getUint8(13),this.flags=A.getUint8(14),this.flagAntiAlias=(this.flags&1)!==0,this.reserved=A.getUint8(15),this.headerParsed=!0,this.parsed=!1}async parseSplats(A,t,e,i,n,r){if(!this.headerParsed)throw new Error("SPZ file header must be parsed first");if(this.parsed)throw new Error("SPZ file already parsed");if(this.parsed=!0,this.version===1){const g=await this.reader.read(this.numSplats*3*2),a=new Uint16Array(g.buffer);for(let o=0;o<this.numSplats;o++){const I=o*3,B=$(a[I]),h=$(a[I+1]),C=$(a[I+2]);A==null||A(o,B,h,C)}}else if(this.version===2||this.version===3){const g=1<<this.fractionalBits,a=await this.reader.read(this.numSplats*3*3);for(let o=0;o<this.numSplats;o++){const I=o*9,B=((a[I+2]<<24|a[I+1]<<16|a[I]<<8)>>8)/g,h=((a[I+5]<<24|a[I+4]<<16|a[I+3]<<8)>>8)/g,C=((a[I+8]<<24|a[I+7]<<16|a[I+6]<<8)>>8)/g;A==null||A(o,B,h,C)}}else throw new Error("Unreachable");{const g=await this.reader.read(this.numSplats);for(let a=0;a<this.numSplats;a++)t==null||t(a,g[a]/255)}{const g=await this.reader.read(this.numSplats*3),a=ts/.15;for(let o=0;o<this.numSplats;o++){const I=o*3,B=(g[I]/255-.5)*a+.5,h=(g[I+1]/255-.5)*a+.5,C=(g[I+2]/255-.5)*a+.5;e==null||e(o,B,h,C)}}{const g=await this.reader.read(this.numSplats*3);for(let a=0;a<this.numSplats;a++){const o=a*3,I=Math.exp(g[o]/16-10),B=Math.exp(g[o+1]/16-10),h=Math.exp(g[o+2]/16-10);i==null||i(a,I,B,h)}}if(this.version===3){const g=1/Math.sqrt(2),a=await this.reader.read(this.numSplats*4);for(let o=0;o<this.numSplats;o++){const I=o*4,B=[0,0,0,0],h=[a[I],a[I+1],a[I+2],a[I+3]],C=h[0]+(h[1]<<8)+(h[2]<<16)+(h[3]<<24),Q=511,u=C>>>30;let l=C,c=0;for(let E=3;E>=0;--E)if(E!==u){const f=l&Q,p=l>>>9&1;l=l>>>10,B[E]=g*(f/Q),B[E]=p===0?B[E]:-B[E],c+=B[E]*B[E]}const y=1-c;B[u]=Math.sqrt(Math.max(y,0)),n==null||n(o,B[0],B[1],B[2],B[3])}}else{const g=await this.reader.read(this.numSplats*3);for(let a=0;a<this.numSplats;a++){const o=a*3,I=g[o]/127.5-1,B=g[o+1]/127.5-1,h=g[o+2]/127.5-1,C=Math.sqrt(Math.max(0,1-I*I-B*B-h*h));n==null||n(a,I,B,h,C)}}if(r&&this.shDegree>=1){const g=new Float32Array(9),a=this.shDegree>=2?new Float32Array(5*3):void 0,o=this.shDegree>=3?new Float32Array(7*3):void 0,I=await this.reader.read(this.numSplats*As[this.shDegree]*3);let B=0;for(let h=0;h<this.numSplats;h++){for(let C=0;C<9;++C)g[C]=(I[B+C]-128)/128;if(B+=9,a){for(let C=0;C<15;++C)a[C]=(I[B+C]-128)/128;B+=15}if(o){for(let C=0;C<21;++C)o[C]=(I[B+C]-128)/128;B+=21}r==null||r(h,g,a,o)}}}}const As={1:3,2:8,3:15},ts=.28209479177387814,Ci=1347635022,hi=3,Qi=1;class RA{constructor({numSplats:A,shDegree:t,fractionalBits:e=12,flagAntiAlias:i=!0}){this.clippedCount=0;const n=20+(t>=1?9:0)+(t>=2?15:0)+(t>=3?21:0),r=16+A*n;this.buffer=new ArrayBuffer(r),this.view=new DataView(this.buffer),this.view.setUint32(0,Ci,!0),this.view.setUint32(4,hi,!0),this.view.setUint32(8,A,!0),this.view.setUint8(12,t),this.view.setUint8(13,e),this.view.setUint8(14,i?Qi: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 n=Math.round(t*this.fraction),r=Math.max(-8388607,Math.min(8388607,n)),g=Math.round(e*this.fraction),a=Math.max(-8388607,Math.min(8388607,g)),o=Math.round(i*this.fraction),I=Math.max(-8388607,Math.min(8388607,o));(n!==r||g!==a||o!==I)&&(this.clippedCount+=1);const C=16+A*9;this.view.setUint8(C,r&255),this.view.setUint8(C+1,r>>8&255),this.view.setUint8(C+2,r>>16&255),this.view.setUint8(C+3,a&255),this.view.setUint8(C+4,a>>8&255),this.view.setUint8(C+5,a>>16&255),this.view.setUint8(C+6,I&255),this.view.setUint8(C+7,I>>8&255),this.view.setUint8(C+8,I>>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)/(ts/.15)+.5)*255;return Math.max(0,Math.min(255,Math.round(t)))}setRgb(A,t,e,i){const n=16+this.numSplats*10+A*3;this.view.setUint8(n,RA.scaleRgb(t)),this.view.setUint8(n+1,RA.scaleRgb(e)),this.view.setUint8(n+2,RA.scaleRgb(i))}setScale(A,t,e,i){const n=16+this.numSplats*13+A*3;this.view.setUint8(n,Math.max(0,Math.min(255,Math.round((Math.log(t)+10)*16)))),this.view.setUint8(n+1,Math.max(0,Math.min(255,Math.round((Math.log(e)+10)*16)))),this.view.setUint8(n+2,Math.max(0,Math.min(255,Math.round((Math.log(i)+10)*16))))}setQuat(A,...t){const e=16+this.numSplats*16+A*4,i=Rs(t);let n=0;for(let a=1;a<4;++a)Math.abs(i[a])>Math.abs(i[n])&&(n=a);const r=i[n]<0?1:0;let g=n;for(let a=0;a<4;++a)if(a!==n){const o=(i[a]<0?1:0)^r,I=Math.floor(511*(Math.abs(i[a])/Math.SQRT1_2)+.5);g=g<<10|o<<9|I}this.view.setUint8(e,g&255),this.view.setUint8(e+1,g>>8&255),this.view.setUint8(e+2,g>>16&255),this.view.setUint8(e+3,g>>>24&255)}static quantizeSh(A,t){const e=Math.round(A*128)+128,i=1<<8-t,n=Math.floor((e+i/2)/i)*i;return Math.max(0,Math.min(255,n))}setSh(A,t,e,i){const n=As[this.shDegree]||0,r=16+this.numSplats*20+A*n*3;for(let g=0;g<9;++g)this.view.setUint8(r+g,RA.quantizeSh(t[g],5));if(e){const g=r+9;for(let a=0;a<15;++a)this.view.setUint8(g+a,RA.quantizeSh(e[a],4));if(i){const a=g+15;for(let o=0;o<21;++o)this.view.setUint8(a+o,RA.quantizeSh(i[o],4))}}}async finalize(){const A=new Uint8Array(this.buffer),e=new ReadableStream({async start(r){r.enqueue(A),r.close()}}).pipeThrough(new CompressionStream("gzip")),n=await new Response(e).arrayBuffer();return console.log("Compressed",A.length,"bytes to",n.byteLength,"bytes"),new Uint8Array(n)}}async function ci(s){var I,B,h;const A=new Ii,{inputs:t,clipXyz:e,maxSh:i,fractionalBits:n=12,opacityThreshold:r}=s;for(const C of t){let Q=function(m){return m.multiplyScalar(E),m.applyQuaternion(f),m.add(p),m},u=function(m){return m.multiplyScalar(E),m},l=function(m){return m.premultiply(f),m},c=function(m){return!d||d.containsPoint(m)},y=function(m){return r!==void 0?m>=r:!0};const E=((I=C.transform)==null?void 0:I.scale)??1,f=new UA().fromArray(((B=C.transform)==null?void 0:B.quaternion)??[0,0,0,1]),p=new U().fromArray(((h=C.transform)==null?void 0:h.translate)??[0,0,0]),d=e?new Ge(new U().fromArray(e.min),new U().fromArray(e.max)):void 0;let H=C.fileType;switch(H||(H=ri(C.fileBytes),!H&&C.pathOrUrl&&(H=ai(C.pathOrUrl))),H){case st.PLY:{const m=new pt({fileBytes:C.fileBytes});await m.parseHeader();let w=null;m.parseSplats((G,M,x,F,D,S,k,T,q,v,W,Z,P,z,K)=>{const b=Q(new U(M,x,F));if(c(b)&&y(Z)){w=A.pushSplat(),A.setCenter(w,b.x,b.y,b.z);const _=u(new U(D,S,k));A.setScale(w,_.x,_.y,_.z);const N=l(new UA(T,q,v,W));A.setQuaternion(w,N.x,N.y,N.z,N.w),A.setOpacity(w,Z),A.setColor(w,P,z,K)}else w=null},(G,M,x,F)=>{M&&w!==null&&A.setSh1(w,M),x&&w!==null&&A.setSh2(w,x),F&&w!==null&&A.setSh3(w,F)});break}case st.SPZ:{const m=new $e({fileBytes:C.fileBytes});await m.parseHeader();const w=new Int32Array(m.numSplats);w.fill(-1);const G=new Float32Array(m.numSplats*3),M=new U;m.parseSplats((x,F,D,S)=>{const k=Q(new U(F,D,S));G[x*3]=k.x,G[x*3+1]=k.y,G[x*3+2]=k.z},(x,F)=>{M.fromArray(G,x*3),c(M)&&y(F)&&(w[x]=A.pushSplat(),A.setCenter(w[x],M.x,M.y,M.z),A.setOpacity(w[x],F))},(x,F,D,S)=>{w[x]>=0&&A.setColor(w[x],F,D,S)},(x,F,D,S)=>{if(w[x]>=0){const k=u(new U(F,D,S));A.setScale(w[x],k.x,k.y,k.z)}},(x,F,D,S,k)=>{if(w[x]>=0){const T=l(new UA(F,D,S,k));A.setQuaternion(w[x],T.x,T.y,T.z,T.w)}},(x,F,D,S)=>{w[x]>=0&&(A.setSh1(w[x],F),D&&A.setSh2(w[x],D),S&&A.setSh3(w[x],S))});break}case st.SPLAT:Xe(C.fileBytes,m=>{},(m,w,G,M,x,F,D,S,k,T,q,v,W,Z,P)=>{const z=Q(new U(w,G,M));if(c(z)&&y(v)){const K=A.pushSplat();A.setCenter(K,z.x,z.y,z.z);const b=u(new U(x,F,D));A.setScale(K,b.x,b.y,b.z);const _=l(new UA(S,k,T,q));A.setQuaternion(K,_.x,_.y,_.z,_.w),A.setOpacity(K,v),A.setColor(K,W,Z,P)}});break;case st.KSPLAT:{let m=null;Ws(C.fileBytes,w=>{},(w,G,M,x,F,D,S,k,T,q,v,W,Z,P,z)=>{const K=Q(new U(G,M,x));if(c(K)&&y(W)){m=A.pushSplat(),A.setCenter(m,K.x,K.y,K.z);const b=u(new U(F,D,S));A.setScale(m,b.x,b.y,b.z);const _=l(new UA(k,T,q,v));A.setQuaternion(m,_.x,_.y,_.z,_.w),A.setOpacity(m,W),A.setColor(m,Z,P,z)}else m=null},(w,G,M,x)=>{m!==null&&(A.setSh1(m,G),M&&A.setSh2(m,M),x&&A.setSh3(m,x))});break}default:throw new Error(`transcodeSpz not implemented for ${H}`)}}const g=Math.min(i??3,A.sh3?3:A.sh2?2:A.sh1?1:0),a=new RA({numSplats:A.numSplats,shDegree:g,fractionalBits:n,flagAntiAlias:!0});for(let C=0;C<A.numSplats;++C){const Q=C*3,u=C*4;a.setCenter(C,A.centers[Q],A.centers[Q+1],A.centers[Q+2]),a.setScale(C,A.scales[Q],A.scales[Q+1],A.scales[Q+2]),a.setQuat(C,A.quaternions[u],A.quaternions[u+1],A.quaternions[u+2],A.quaternions[u+3]),a.setAlpha(C,A.opacities[C]),a.setRgb(C,A.colors[Q],A.colors[Q+1],A.colors[Q+2]),A.sh1&&g>=1&&a.setSh(C,A.sh1.slice(C*9,(C+1)*9),g>=2&&A.sh2?A.sh2.slice(C*15,(C+1)*15):void 0,g>=3&&A.sh3?A.sh3.slice(C*21,(C+1)*21):void 0)}return{fileBytes:await a.finalize(),clippedCount:a.clippedCount}}async function es(s){const{name:A,args:t,id:e}=s.data;let i,n;try{switch(A){case"unpackPly":{const{packedArray:r,fileBytes:g,splatEncoding:a}=t,o=await Ei({packedArray:r,fileBytes:g,splatEncoding:a});i={id:e,numSplats:o.numSplats,packedArray:o.packedArray,extra:o.extra};break}case"decodeSpz":{const{fileBytes:r,splatEncoding:g}=t,a=await li(r,g);i={id:e,numSplats:a.numSplats,packedArray:a.packedArray,extra:a.extra};break}case"decodeAntiSplat":{const{fileBytes:r,splatEncoding:g}=t,a=Ps(r,g);i={id:e,numSplats:a.numSplats,packedArray:a.packedArray};break}case"decodeKsplat":{const{fileBytes:r,splatEncoding:g}=t,a=Vs(r,g);i={id:e,numSplats:a.numSplats,packedArray:a.packedArray,extra:a.extra};break}case"decodePcSogs":{const{fileBytes:r,extraFiles:g,splatEncoding:a}=t,o=JSON.parse(new TextDecoder().decode(r)),I=await Oe(o,g,a);i={id:e,numSplats:I.numSplats,packedArray:I.packedArray,extra:I.extra};break}case"decodePcSogsZip":{const{fileBytes:r,splatEncoding:g}=t,a=await Bi(r,g);i={id:e,numSplats:a.numSplats,packedArray:a.packedArray,extra:a.extra};break}case"sortSplats":{const{totalSplats:r,readback:g,ordering:a}=t;i={id:e,readback:g,...ui({totalSplats:r,readback:g,ordering:a})};break}case"sortDoubleSplats":{const{numSplats:r,readback:g,ordering:a}=t;i={id:e,readback:g,ordering:a,activeSplats:rs(r,g,a)};break}case"sort32Splats":{const{numSplats:r,readback:g,ordering:a}=t;i={id:e,readback:g,ordering:a,activeSplats:gs(r,g,a)};break}case"transcodeSpz":{const r=t,g=await ci(r);i={id:e,fileBytes:g,input:r};break}default:throw new Error(`Unknown name: ${A}`)}}catch(r){n=r,console.error(n)}self.postMessage({id:e,result:i,error:n},{transfer:zs(i)})}async function Ei({packedArray:s,fileBytes:A,splatEncoding:t}){const e=new pt({fileBytes:A});await e.parseHeader();const i=e.numSplats,n={};return e.parseSplats((r,g,a,o,I,B,h,C,Q,u,l,c,y,E,f)=>{qt(s,r,g,a,o,I,B,h,C,Q,u,l,c,y,E,f,t)},(r,g,a,o)=>{g&&(n.sh1||(n.sh1=new Uint32Array(i*2)),ft(n.sh1,r,g,t)),a&&(n.sh2||(n.sh2=new Uint32Array(i*4)),yt(n.sh2,r,a,t)),o&&(n.sh3||(n.sh3=new Uint32Array(i*4)),wt(n.sh3,r,o,t))}),{packedArray:s,numSplats:i,extra:n}}async function li(s,A){const t=new $e({fileBytes:s});await t.parseHeader();const e=t.numSplats,i=lt(e),n=new Uint32Array(i*4),r={};return await t.parseSplats((g,a,o,I)=>{Le(n,g,a,o,I)},(g,a)=>{vs(n,g,a)},(g,a,o,I)=>{Ts(n,g,a,o,I,A)},(g,a,o,I)=>{Te(n,g,a,o,I,A)},(g,a,o,I,B)=>{Ke(n,g,a,o,I,B)},(g,a,o,I)=>{a&&(r.sh1||(r.sh1=new Uint32Array(e*2)),ft(r.sh1,g,a,A)),o&&(r.sh2||(r.sh2=new Uint32Array(e*4)),yt(r.sh2,g,o,A)),I&&(r.sh3||(r.sh3=new Uint32Array(e*4)),wt(r.sh3,g,I,A))}),{packedArray:n,numSplats:e,extra:r}}const Wt=31744,Dt=Wt+1;let MA=null;function ui({totalSplats:s,readback:A,ordering:t}){MA||(MA=new Uint32Array(Dt)),MA.fill(0);const e=A.map(a=>new Uint32Array(a.buffer)),i=e[0].length,n=Math.ceil(s/i);let r=0;for(let a=0;a<n;++a){const o=e[a],I=Math.min(o.length,s-r);for(let B=0;B<I;++B){const h=o[B]&32767;h<Wt&&(MA[h]+=1)}r+=I}let g=0;for(let a=0;a<Dt;++a){const o=g+MA[a];MA[a]=g,g=o}r=0;for(let a=0;a<n;++a){const o=e[a],I=Math.min(o.length,s-r);for(let B=0;B<I;++B){const h=o[B]&32767;h<Wt&&(t[MA[h]]=r+B,MA[h]+=1)}r+=I}if(MA[Dt-1]!==g)throw new Error(`Expected ${g} active splats but got ${MA[Dt-1]}`);return{activeSplats:g,ordering:t}}const Vt=[];function ss(s){Vt.push(s)}async function fi(){self.addEventListener("message",ss),await ge(),self.removeEventListener("message",ss),self.addEventListener("message",es);for(const s of Vt)es(s);Vt.length=0}fi().catch(console.error)})();\n//# sourceMappingURL=worker-kZ_XVxCe.js.map\n',ds=typeof self<"u"&&self.Blob&&new Blob([ao],{type:"text/javascript;charset=utf-8"});function Kh(t){let A;try{if(A=ds&&(self.URL||self.webkitURL).createObjectURL(ds),!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(ao),{name:t==null?void 0:t.name})}finally{A&&(self.URL||self.webkitURL).revokeObjectURL(A)}}class $h{constructor(){this.messages={},this.messageIdNext=0,this.worker=new Kh,this.worker.onmessage=A=>this.onMessage(A)}makeMessageId(){return++this.messageIdNext}makeMessagePromiseId(){const A=this.makeMessageId(),e=new Promise((s,n)=>{this.messages[A]={resolve:s,reject:n}});return{id:A,promise:e}}onMessage(A){const{id:e,result:s,error:n}=A.data,i=this.messages[e];i&&(delete this.messages[e],n?i.reject(n):i.resolve(s))}async call(A,e){const{id:s,promise:n}=this.makeMessagePromiseId();return this.worker.postMessage({name:A,args:e,id:s},{transfer:$n(e)}),n}}let oo=4,fe=0;const co=[],go=[];async function Ph(){const t=co.shift();if(t)return t;if(fe<oo){const A=new $h;return fe+=1,A}return new Promise(A=>{go.push(A)})}function Vh(t){if(fe>oo){fe-=1;return}const A=go.shift();if(A){A(t);return}co.push(t)}async function ht(t){const A=await Ph();try{return await t(A)}finally{Vh(A)}}class lo extends sA.Loader{constructor(A){super(A),this.fileLoader=new sA.FileLoader(A)}load(A,e,s,n){const i=this.manager.resolveURL((this.path??"")+(A??"")),r=new Headers(this.requestHeader),a=this.withCredentials?"include":"same-origin",o=new Request(i,{headers:r,credentials:a});let g=this.fileType;this.manager.itemStart(i),ys(o,s).then(async l=>{var C;const c=[new ProgressEvent("progress",{lengthComputable:!0,loaded:l.byteLength,total:l.byteLength})];function u(){if(s){const Q=c.every(d=>d.lengthComputable||d.loaded===0&&d.total===0),f=c.reduce((d,y)=>d+y.loaded,0),p=c.reduce((d,y)=>d+y.total,0);s(new ProgressEvent("progress",{lengthComputable:Q,loaded:f,total:p}))}}const I={},E=[],B=us(l);if(g==="pcsogs"&&B===void 0)throw new Error("Invalid PC SOGS file");if(B!==void 0){g="pcsogs";for(const Q of["means","scales","quats","sh0","shN"]){const f=B[Q];if(f)for(const p of f.files){const d=new URL(p,i).toString(),y=c.length;c.push(new ProgressEvent("progress")),this.manager.itemStart(d);const M=new Request(d,{headers:r,credentials:a}),x=ys(M,w=>{c[y]=w,u()}).then(w=>{I[p]=w}).catch(w=>{throw this.manager.itemError(d),w}).finally(()=>{this.manager.itemEnd(d)});E.push(x)}}}if(await Promise.all(E),e){const Q=((C=this.packedSplats)==null?void 0:C.splatEncoding)??Me,f=await hs({input:l,extraFiles:I,fileType:g,pathOrUrl:i,splatEncoding:Q});this.packedSplats?(this.packedSplats.initialize(f),e(this.packedSplats)):e(new zA(f))}}).catch(l=>{this.manager.itemError(i),n==null||n(l)}).finally(()=>{this.manager.itemEnd(i)})}async loadAsync(A,e){return new Promise((s,n)=>{this.load(A,i=>{s(i)},e,n)})}parse(A){return new ct({packedSplats:A})}}async function ys(t,A){const e=await fetch(t);if(!e.ok)throw new Error(`${e.status} "${e.statusText}" fetching URL: ${t.url}`);if(!e.body)throw new Error(`Response body is null for URL: ${t.url}`);const s=e.body.getReader(),n=Number.parseInt(e.headers.get("Content-Length")||"0"),i=Number.isNaN(n)?0:n;let r=0;const a=[];for(;;){const{done:l,value:c}=await s.read();if(l)break;a.push(c),r+=c.length,A&&A(new ProgressEvent("progress",{lengthComputable:i!==0,loaded:r,total:i}))}const o=new Uint8Array(r);let g=0;for(const l of a)o.set(l,g),g+=l.length;return o.buffer}var Mt=(t=>(t.PLY="ply",t.SPZ="spz",t.SPLAT="splat",t.KSPLAT="ksplat",t.PCSOGS="pcsogs",t.PCSOGSZIP="pcsogszip",t))(Mt||{});function ls(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=ai(t,4);return new DataView(e.buffer).getUint32(0,!0)===1347635022?"spz":void 0}if(A.getUint32(0,!0)===67324752)return Xh(t)?"pcsogszip":void 0}function Oh(t){const A=t.split(/[?#]/,1)[0],e=Math.max(A.lastIndexOf("/"),A.lastIndexOf("\\")),s=A.slice(e+1),n=s.lastIndexOf(".");return n<=0||n===s.length-1?"":s.slice(n+1).toLowerCase()}function uo(t){const A=Oh(t);if(A==="ply")return"ply";if(A==="spz")return"spz";if(A==="splat")return"splat";if(A==="ksplat")return"ksplat";if(A==="sog")return"pcsogszip"}function Zh(t){return us(t)!==void 0}function us(t){try{let A;if(typeof t=="string")A=t;else{const n=t instanceof ArrayBuffer?new Uint8Array(t):t;if(n.length>65536)return;A=new TextDecoder().decode(n)}const e=JSON.parse(A);if(!e||typeof e!="object"||Array.isArray(e))return;const s=e.version===2;for(const n of["means","scales","quats","sh0"]){if(!e[n]||typeof e[n]!="object"||Array.isArray(e[n]))return;if(s){if(!e[n].files||(n==="scales"||n==="sh0")&&!e[n].codebook||n==="means"&&(!e[n].mins||!e[n].maxs))return}else if(!e[n].shape||!e[n].files||n!=="quats"&&(!e[n].mins||!e[n].maxs))return}return e}catch{return}}function Xh(t){try{const A=t instanceof ArrayBuffer?new Uint8Array(t):t;let e=null;const s=ec(A,{filter:({name:i})=>i.split(/[\\/]/).pop()==="meta.json"?(e=i,!0):!1});if(!e)return;const n=us(s[e]);return n?{name:e,json:n}:void 0}catch{return}}async function hs({input:t,extraFiles:A,fileType:e,pathOrUrl:s,splatEncoding:n}){const i=t instanceof ArrayBuffer?new Uint8Array(t):t;let r=e;switch(e||(r=ls(i),!r&&s&&(r=uo(s))),r){case"ply":{const a=new jt({fileBytes:i});await a.parseHeader();const o=a.numSplats,g=xA(o).maxSplats,l={fileBytes:i,packedArray:new Uint32Array(g*4),splatEncoding:n};return await ht(async c=>{const{packedArray:u,numSplats:I,extra:E}=await c.call("unpackPly",l);return{packedArray:u,numSplats:I,extra:E}})}case"spz":return await ht(async a=>{const{packedArray:o,numSplats:g,extra:l}=await a.call("decodeSpz",{fileBytes:i,splatEncoding:n});return{packedArray:o,numSplats:g,extra:l}});case"splat":return await ht(async a=>{const{packedArray:o,numSplats:g}=await a.call("decodeAntiSplat",{fileBytes:i,splatEncoding:n});return{packedArray:o,numSplats:g}});case"ksplat":return await ht(async a=>{const{packedArray:o,numSplats:g,extra:l}=await a.call("decodeKsplat",{fileBytes:i,splatEncoding:n});return{packedArray:o,numSplats:g,extra:l}});case"pcsogs":return await ht(async a=>{const{packedArray:o,numSplats:g,extra:l}=await a.call("decodePcSogs",{fileBytes:i,extraFiles:A,splatEncoding:n});return{packedArray:o,numSplats:g,extra:l}});case"pcsogszip":return await ht(async a=>{const{packedArray:o,numSplats:g,extra:l}=await a.call("decodePcSogsZip",{fileBytes:i,splatEncoding:n});return{packedArray:o,numSplats:g,extra:l}});default:throw new Error(`Unknown splat file type: ${r}`)}}class jh{constructor({maxSplats:A=1}={}){this.numSplats=0,this.maxSplats=xA(A).maxSplats,this.centers=new Float32Array(this.maxSplats*3),this.scales=new Float32Array(this.maxSplats*3),this.quaternions=new Float32Array(this.maxSplats*4),this.opacities=new Float32Array(this.maxSplats),this.colors=new Float32Array(this.maxSplats*3)}pushSplat(){const A=this.numSplats;return this.ensureIndex(A),this.numSplats+=1,A}unpushSplat(A){if(A===this.numSplats-1)this.numSplats-=1;else throw new Error("Cannot unpush splat from non-last position")}ensureCapacity(A){if(A>this.maxSplats){const e=Math.max(A,this.maxSplats*2),s=new Float32Array(e*3),n=new Float32Array(e*3),i=new Float32Array(e*4),r=new Float32Array(e),a=new Float32Array(e*3);if(s.set(this.centers),n.set(this.scales),i.set(this.quaternions),r.set(this.opacities),a.set(this.colors),this.centers=s,this.scales=n,this.quaternions=i,this.opacities=r,this.colors=a,this.sh1){const o=new Float32Array(e*9);o.set(this.sh1),this.sh1=o}if(this.sh2){const o=new Float32Array(e*15);o.set(this.sh2),this.sh2=o}if(this.sh3){const o=new Float32Array(e*21);o.set(this.sh3),this.sh3=o}this.maxSplats=e}}ensureIndex(A){this.ensureCapacity(A+1)}setCenter(A,e,s,n){this.centers[A*3]=e,this.centers[A*3+1]=s,this.centers[A*3+2]=n}setScale(A,e,s,n){this.scales[A*3]=e,this.scales[A*3+1]=s,this.scales[A*3+2]=n}setQuaternion(A,e,s,n,i){this.quaternions[A*4]=e,this.quaternions[A*4+1]=s,this.quaternions[A*4+2]=n,this.quaternions[A*4+3]=i}setOpacity(A,e){this.opacities[A]=e}setColor(A,e,s,n){this.colors[A*3]=e,this.colors[A*3+1]=s,this.colors[A*3+2]=n}setSh1(A,e){this.sh1||(this.sh1=new Float32Array(this.maxSplats*9));for(let s=0;s<9;++s)this.sh1[A*9+s]=e[s]}setSh2(A,e){this.sh2||(this.sh2=new Float32Array(this.maxSplats*15));for(let s=0;s<15;++s)this.sh2[A*15+s]=e[s]}setSh3(A,e){this.sh3||(this.sh3=new Float32Array(this.maxSplats*21));for(let s=0;s<21;++s)this.sh3[A*21+s]=e[s]}}var Wh=`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 Me={rgbMin:0,rgbMax:1,lnScaleMin:kA,lnScaleMax:NA,sh1Min:-1,sh1Max:1,sh2Min:-1,sh2Max:1,sh3Min:-1,sh3Max:1},iA=class iA{constructor(A={}){this.maxSplats=0,this.numSplats=0,this.packedArray=null,this.isInitialized=!1,this.target=null,this.source=null,this.needsUpdate=!0,this.extra={},this.dyno=new Is({packedSplats:this}),this.dynoRgbMinMaxLnScaleMinMax=new Gt({key:"rgbMinMaxLnScaleMinMax",value:new h.Vector4(0,1,kA,NA),update:e=>{var s,n,i,r;return e.set(((s=this.splatEncoding)==null?void 0:s.rgbMin)??0,((n=this.splatEncoding)==null?void 0:n.rgbMax)??1,((i=this.splatEncoding)==null?void 0:i.lnScaleMin)??kA,((r=this.splatEncoding)==null?void 0:r.lnScaleMax)??NA),e}}),this.dynoSh1MinMax=new qt({key:"sh1MinMax",value:new h.Vector2(-1,1),update:e=>{var s,n;return e.set(((s=this.splatEncoding)==null?void 0:s.sh1Min)??-1,((n=this.splatEncoding)==null?void 0:n.sh1Max)??1),e}}),this.dynoSh2MinMax=new qt({key:"sh2MinMax",value:new h.Vector2(-1,1),update:e=>{var s,n;return e.set(((s=this.splatEncoding)==null?void 0:s.sh2Min)??-1,((n=this.splatEncoding)==null?void 0:n.sh2Max)??1),e}}),this.dynoSh3MinMax=new qt({key:"sh3MinMax",value:new h.Vector2(-1,1),update:e=>{var s,n;return e.set(((s=this.splatEncoding)==null?void 0:s.sh3Min)??-1,((n=this.splatEncoding)==null?void 0:n.sh3Max)??1),e}}),this.initialized=Promise.resolve(this),this.reinitialize(A)}reinitialize(A){this.isInitialized=!1,this.extra={},this.splatEncoding=A.splatEncoding,A.url||A.fileBytes||A.construct?this.initialized=this.asyncInitialize(A).then(()=>(this.isInitialized=!0,this)):(this.initialize(A),this.isInitialized=!0,this.initialized=Promise.resolve(this))}initialize(A){A.packedArray?(this.packedArray=A.packedArray,this.maxSplats=Math.floor(this.packedArray.length/4),this.maxSplats=Math.floor(this.maxSplats/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){const{url:e,fileBytes:s,construct:n}=A;if(e){const i=new lo;i.packedSplats=this,await i.loadAsync(e)}else if(s){const i=await hs({input:s,fileType:A.fileType,pathOrUrl:A.fileName??e,splatEncoding:A.splatEncoding??Me});this.initialize(i)}if(n){const i=n(this);i instanceof Promise&&await i}}dispose(){this.target&&(this.target.dispose(),this.target=null),this.source&&(this.source.dispose(),this.source=null)}ensureSplats(A){const e=A<=this.maxSplats?this.maxSplats:Math.max(A,2*this.maxSplats),s=this.packedArray?this.packedArray.length/4:0;if(!this.packedArray||e>s){this.maxSplats=xA(e).maxSplats;const n=new Uint32Array(this.maxSplats*4);this.packedArray&&n.set(this.packedArray),this.packedArray=n}return this.packedArray}ensureSplatsSh(A,e){let s,n;if(A===0)return this.ensureSplats(e);if(A===1)s=2,n="sh1";else if(A===2)s=4,n="sh2";else if(A===3)s=4,n="sh3";else throw new Error(`Invalid level: ${A}`);let i=this.extra[n]?this.extra[n].length/s:0;const r=e<=i?i:Math.max(e,2*i);if(!this.extra[n]||r>i){i=xA(r).maxSplats;const a=new Uint32Array(i*s);this.extra[n]&&a.set(this.extra[n]),this.extra[n]=a}return this.extra[n]}getSplat(A){if(!this.packedArray||A>=this.numSplats)throw new Error("Invalid index");return Ee(this.packedArray,A,this.splatEncoding)}setSplat(A,e,s,n,i,r){const a=this.ensureSplats(A+1);Ce(a,A,e.x,e.y,e.z,s.x,s.y,s.z,n.x,n.y,n.z,n.w,i,r.r,r.g,r.b),this.numSplats=Math.max(this.numSplats,A+1)}pushSplat(A,e,s,n,i){const r=this.ensureSplats(this.numSplats+1);Ce(r,this.numSplats,A.x,A.y,A.z,e.x,e.y,e.z,s.x,s.y,s.z,s.w,n,i.r,i.g,i.b),++this.numSplats}forEachSplat(A){if(!(!this.packedArray||!this.numSplats))for(let e=0;e<this.numSplats;++e){const s=Ee(this.packedArray,e,this.splatEncoding);A(e,s.center,s.scales,s.quaternion,s.opacity,s.color)}}ensureGenerate(A){if(this.target&&(A??1)<=this.maxSplats)return!1;this.dispose();const e=xA(A??1),{width:s,height:n,depth:i}=e;return this.maxSplats=e.maxSplats,this.target=new h.WebGLArrayRenderTarget(s,n,i,{depthBuffer:!1,stencilBuffer:!1,generateMipmaps:!1,magFilter:h.NearestFilter,minFilter:h.NearestFilter}),this.target.texture.format=h.RGBAIntegerFormat,this.target.texture.type=h.UnsignedIntType,this.target.texture.internalFormat="RGBA32UI",this.target.scissorTest=!0,!0}generateMapping(A){let e=0;const s=A.map(n=>{const i=e,r=Math.ceil(n/O)*O;return e+=r,{base:i,count:n}});return{maxSplats:e,mapping:s}}getTexture(){return this.target?this.target.texture:this.source||this.packedArray?this.maybeUpdateSource():iA.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: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}=xA(this.maxSplats);this.source=new h.DataArrayTexture(this.packedArray,A,e,s),this.source.format=h.RGBAIntegerFormat,this.source.type=h.UnsignedIntType,this.source.internalFormat="RGBA32UI",this.source.needsUpdate=!0}this.source.needsUpdate=!0}return this.source}static getEmpty(){if(!iA.emptySource){const{width:A,height:e,depth:s,maxSplats:n}=xA(1),i=new Uint32Array(n*4);iA.emptySource=new h.DataArrayTexture(i,A,e,s),iA.emptySource.format=h.RGBAIntegerFormat,iA.emptySource.type=h.UnsignedIntType,iA.emptySource.internalFormat="RGBA32UI",iA.emptySource.needsUpdate=!0}return iA.emptySource}prepareProgramMaterial(A){let e=iA.generatorProgram.get(A);if(!e){const n=TA({index:"int"},{output:"uvec4"},({index:i})=>{A.inputs.index=i;const r=A.outputs.gsplat;return{output:sn(r,this.dynoRgbMinMaxLnScaleMinMax)}});iA.programTemplate||(iA.programTemplate=new rs(Wh)),e=new is({graph:n,inputs:{index:"index"},outputs:{output:"target"},template:iA.programTemplate}),Object.assign(e.uniforms,{targetLayer:{value:0},targetBase:{value:0},targetCount:{value:0}}),iA.generatorProgram.set(A,e)}const s=e.prepareMaterial();return iA.fullScreenQuad.material=s,{program:e,material:s}}saveRenderState(A){return{xrEnabled:A.xr.enabled,autoClear:A.autoClear}}resetRenderState(A,e){A.setRenderTarget(null),A.xr.enabled=e.xrEnabled,A.autoClear=e.autoClear}generate({generator:A,base:e,count:s,renderer:n}){if(!this.target)throw new Error("Target must be initialized with ensureSplats");if(e+s>this.maxSplats)throw new Error("Base + count exceeds maxSplats");const{program:i,material:r}=this.prepareProgramMaterial(A);i.update();const a=this.saveRenderState(n),o=Math.ceil((e+s)/O)*O,g=O*$A;for(r.uniforms.targetBase.value=e,r.uniforms.targetCount.value=s;e<o;){const l=Math.floor(e/g);r.uniforms.targetLayer.value=l;const c=l*g,u=Math.floor((e-c)/O),I=Math.min($A,Math.ceil((o-c)/O));this.target.scissor.set(0,u,O,I-u),n.setRenderTarget(this.target,l),n.xr.enabled=!1,n.autoClear=!1,iA.fullScreenQuad.render(n),e+=O*(I-u)}return this.resetRenderState(n,a),{nextBase:o}}};iA.emptySource=null,iA.programTemplate=null,iA.generatorProgram=new Map,iA.fullScreenQuad=new Ss(new h.RawShaderMaterial({visible:!1}));let zA=iA;class Is extends F{constructor({packedSplats:A}={}){super({key:"packedSplats",type:ie,globals:()=>[me],value:{texture:zA.getEmpty(),numSplats:0,rgbMinMaxLnScaleMinMax:new h.Vector4(0,1,kA,NA)},update:e=>{var s,n,i,r,a,o,g,l,c,u;return e.texture=((s=this.packedSplats)==null?void 0:s.getTexture())??zA.getEmpty(),e.numSplats=((n=this.packedSplats)==null?void 0:n.numSplats)??0,e.rgbMinMaxLnScaleMinMax.set(((r=(i=this.packedSplats)==null?void 0:i.splatEncoding)==null?void 0:r.rgbMin)??0,((o=(a=this.packedSplats)==null?void 0:a.splatEncoding)==null?void 0:o.rgbMax)??1,((l=(g=this.packedSplats)==null?void 0:g.splatEncoding)==null?void 0:l.lnScaleMin)??kA,((u=(c=this.packedSplats)==null?void 0:c.splatEncoding)==null?void 0:u.lnScaleMax)??NA),e}}),this.packedSplats=A}}class Ze extends h.InstancedBufferGeometry{constructor(A,e){super(),this.ordering=A,this.setAttribute("position",new h.BufferAttribute(AI,3)),this.setIndex(new h.BufferAttribute(tI,1)),this._maxInstanceCount=A.length,this.instanceCount=e,this.attribute=new h.InstancedBufferAttribute(A,1,!1,1),this.attribute.setUsage(h.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 AI=new Float32Array([-1,-1,0,1,-1,0,1,1,0,-1,1,0]),tI=new Uint16Array([0,1,2,0,2,3]),nt=class nt{constructor(A){if(this.lastTime=null,this.encodeLinear=!1,this.superXY=1,this.display=null,this.sorting=null,this.pending=null,this.sortingCheck=!1,this.readback16=new Uint16Array(0),this.readback32=new Uint32Array(0),this.spark=A.spark,this.camera=A.camera,this.viewToWorld=A.viewToWorld??new h.Matrix4,A.target){const{width:e,height:s,doubleBuffer:n}=A.target,i=Math.max(1,Math.min(4,A.target.superXY??1));if(this.superXY=i,e*i>8192||s*i>8192)throw new Error("Target size too large");this.target=new h.WebGLRenderTarget(e*i,s*i,{format:h.RGBAFormat,type:h.UnsignedByteType,colorSpace:h.SRGBColorSpace}),n&&(this.back=new h.WebGLRenderTarget(e*i,s*i,{format:h.RGBAFormat,type:h.UnsignedByteType,colorSpace:h.SRGBColorSpace})),this.encodeLinear=!0}this.onTextureUpdated=A.onTextureUpdated,this.sortRadial=A.sortRadial??!0,this.sortDistance=A.sortDistance,this.sortCoorient=A.sortCoorient,this.depthBias=A.depthBias,this.sort360=A.sort360,this.sort32=A.sort32,this.stochastic=A.stochastic??!1,this.orderingFreelist=new Pn({allocate:e=>new Uint32Array(e),valid:(e,s)=>e.length===s}),this.autoUpdate=!1,this.setAutoUpdate(A.autoUpdate??!1)}dispose(){var A;this.setAutoUpdate(!1),this.target&&(this.target.dispose(),this.target=void 0),this.back&&(this.back.dispose(),this.back=void 0),this.display&&(this.spark.releaseAccumulator(this.display.accumulator),this.display.geometry.dispose(),this.display=null),(A=this.pending)!=null&&A.accumulator&&(this.spark.releaseAccumulator(this.pending.accumulator),this.pending=null)}setAutoUpdate(A){!this.autoUpdate&&A?this.spark.autoViewpoints.push(this):this.autoUpdate&&!A&&(this.spark.autoViewpoints=this.spark.autoViewpoints.filter(e=>e!==this)),this.autoUpdate=A}async prepare({scene:A,camera:e,viewToWorld:s,update:n,forceOrigin:i}){for(s?this.viewToWorld=s:(this.camera=e??this.camera,this.camera&&(this.camera.updateMatrixWorld(),this.viewToWorld=this.camera.matrixWorld.clone()));n??!0;){const a=i?this.viewToWorld:this.spark.matrixWorld;if(this.spark.updateInternal({scene:A,originToWorld:a}))break;await new Promise(g=>setTimeout(g,10))}const r=this.spark.active;r.refCount+=1,await this.sortUpdate({accumulator:r,viewToWorld:this.viewToWorld}),this.spark.releaseAccumulator(r)}renderTarget({scene:A,camera:e}){var n;const s=this.back??this.target;if(!s)throw new Error("Must initialize SparkViewpoint with target");if(e=e??this.camera,!e)throw new Error("Must provide camera");if(e instanceof h.PerspectiveCamera){const i=new h.PerspectiveCamera().copy(e,!1);i.aspect=s.width/s.height,i.updateProjectionMatrix(),e=i}this.viewToWorld=e.matrixWorld.clone();try{this.spark.renderer.setRenderTarget(s),this.spark.prepareViewpoint(this),this.spark.renderer.render(A,e)}finally{this.spark.prepareViewpoint(this.spark.defaultView),this.spark.renderer.setRenderTarget(null)}s!==this.target&&([this.target,this.back]=[this.back,this.target]),(n=this.onTextureUpdated)==null||n.call(this,s.texture)}async readTarget(){if(!this.target)throw new Error("Must initialize SparkViewpoint with target");const{width:A,height:e}=this.target,s=A*e*4;(!this.superPixels||this.superPixels.length<s)&&(this.superPixels=new Uint8Array(s)),await this.spark.renderer.readRenderTargetPixelsAsync(this.target,0,0,A,e,this.superPixels);const{superXY:n}=this;if(n===1)return this.superPixels;const i=A/n,r=e/n,a=i*r*4;(!this.pixels||this.pixels.length<a)&&(this.pixels=new Uint8Array(a));const{superPixels:o,pixels:g}=this,l=n*n;for(let c=0;c<r;c++){const u=c*i;for(let I=0;I<i;I++){const E=I*n;let B=0,C=0,Q=0,f=0;for(let d=0;d<n;d++){const y=(c*n+d)*this.target.width;for(let M=0;M<n;M++){const x=(y+E+M)*4;B+=o[x],C+=o[x+1],Q+=o[x+2],f+=o[x+3]}}const p=(u+I)*4;g[p]=B/l,g[p+1]=C/l,g[p+2]=Q/l,g[p+3]=f/l}}return g}async prepareRenderPixels({scene:A,camera:e,viewToWorld:s,update:n,forceOrigin:i}){return await this.prepare({scene:A,camera:e,viewToWorld:s,update:n,forceOrigin:i}),this.renderTarget({scene:A,camera:e}),this.readTarget()}autoPoll({accumulator:A}){var i,r,a;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:o}=this.display.accumulator;A.mappingVersion===o&&(A.refCount+=1,this.spark.releaseAccumulator(this.display.accumulator),this.display.accumulator=A,this.display.viewToWorld.copy(this.viewToWorld),s=!0,this.spark.viewpoint===this&&this.spark.prepareViewpoint(this))}const n=((i=this.sorting)==null?void 0:i.viewToWorld)??((r=this.display)==null?void 0:r.viewToWorld);n&&!Qe({matrix1:this.viewToWorld,matrix2:n,maxDistance:this.sortDistance??.01,minCoorient:this.sortCoorient??this.sortRadial?.99:.999})&&(e=!0),e&&(A&&(A.refCount+=1),(a=this.pending)!=null&&a.accumulator&&this.spark.releaseAccumulator(this.pending.accumulator),this.pending={accumulator:A,viewToWorld:this.viewToWorld,displayed:s},this.driveSort())}async driveSort(){var A;for(;;){if(this.sorting||!this.pending)return;const{viewToWorld:e,displayed:s}=this.pending;let n=this.pending.accumulator;if(n||(n=((A=this.display)==null?void 0:A.accumulator)??this.spark.active,n.refCount+=1),this.pending=null,!n)throw new Error("No accumulator to sort");this.sorting={viewToWorld:e},await this.sortUpdate({accumulator:n,viewToWorld:e,displayed:s}),this.sorting=null,this.spark.releaseAccumulator(n)}}async sortUpdate({accumulator:A,viewToWorld:e,displayed:s=!1}){if(this.sortingCheck)throw new Error("Only one sort at a time");this.sortingCheck=!0,A=A??this.spark.active;const{numSplats:n,maxSplats:i}=A.splats;let r=0,a=this.orderingFreelist.alloc(i);if(this.stochastic){r=n;for(let o=0;o<n;++o)a[o]=o}else if(n>0){const{reader:o,doubleSortReader:g,sort32Reader:l,dynoSortRadial:c,dynoOrigin:u,dynoDirection:I,dynoDepthBias:E,dynoSort360:B,dynoSplats:C}=nt.makeSorter(),Q=this.sort32??!1;let f;if(Q)this.readback32=o.ensureBuffer(i,this.readback32),f=this.readback32;else{const w=Math.ceil(i/2);this.readback16=o.ensureBuffer(w,this.readback16),f=this.readback16}const p=A.toWorld.clone().invert(),d=e.clone().premultiply(p);c.value=this.sort360?!0:this.sortRadial,u.value.set(0,0,0).applyMatrix4(d),I.value.set(0,0,-1).applyMatrix4(d).sub(u.value).normalize(),E.value=this.depthBias??1,B.value=this.sort360??!1,C.packedSplats=A.splats;const y=Q?l:g,M=Q?n:Math.ceil(n/2);await o.renderReadback({renderer:this.spark.renderer,reader:y,count:M,readback:f});const x=await ht(async w=>{const m=Q?"sort32Splats":"sortDoubleSplats";return w.call(m,{maxSplats:i,numSplats:n,readback:f,ordering:a})});Q?this.readback32=x.readback:this.readback16=x.readback,a=x.ordering,r=x.activeSplats}this.updateDisplay({accumulator:A,viewToWorld:e,ordering:a,activeSplats:r,displayed:s}),this.sortingCheck=!1}updateDisplay({accumulator:A,viewToWorld:e,ordering:s,activeSplats:n,displayed:i=!1}){if(!this.display)A.refCount+=1,this.display={accumulator:A,viewToWorld:e,geometry:new Ze(s,n)};else{!i&&A!==this.display.accumulator&&(A.refCount+=1,this.spark.releaseAccumulator(this.display.accumulator),this.display.accumulator=A),this.display.viewToWorld=e;const r=this.display.geometry.ordering;r.length===s.length?this.display.geometry.update(s,n):(this.display.geometry.dispose(),this.display.geometry=new Ze(s,n)),this.orderingFreelist.free(r)}this.spark.viewpoint===this&&this.spark.prepareViewpoint(this)}static makeSorter(){if(!nt.dynos){const A=new Be({value:!0}),e=new Ft({value:new h.Vector3}),s=new Ft({value:new h.Vector3}),n=new Et({value:1}),i=new Be({value:!1}),r=new Is,a=new Zt,o=TA({index:"int"},{rgba8:"vec4"},({index:l})=>{if(!l)throw new Error("No index");const c={sortRadial:A,sortOrigin:e,sortDirection:s,sortDepthBias:n,sort360:i},u=rA(l,_("int",2)),I=Tt(r,u),E=_e({gsplat:I,...c}),B=Tt(r,EA(u,_("int",1))),C=_e({gsplat:B,...c}),Q=PA({vectorType:"vec2",x:E,y:C});return{rgba8:$e(ur(Q))}}),g=TA({index:"int"},{rgba8:"vec4"},({index:l})=>{if(!l)throw new Error("No index");const c={sortRadial:A,sortOrigin:e,sortDirection:s,sortDepthBias:n,sort360:i},u=Tt(r,l),I=_e({gsplat:u,...c});return{rgba8:$e(lr(I))}});nt.dynos={dynoSortRadial:A,dynoOrigin:e,dynoDirection:s,dynoDepthBias:n,dynoSort360:i,dynoSplats:r,reader:a,doubleSortReader:o,sort32Reader:g}}return nt.dynos}};nt.EMPTY_TEXTURE=new h.Texture,nt.dynos=null;let Wt=nt;const eI=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 _e({gsplat:t,sortRadial:A,sortOrigin:e,sortDirection:s,sortDepthBias:n,sort360:i}){return ne({inTypes:{gsplat:AA,sortRadial:"bool",sortOrigin:"vec3",sortDirection:"vec3",sortDepthBias:"float",sort360:"bool"},outTypes:{metric:"float"},globals:()=>[FA,eI],inputs:{gsplat:t,sortRadial:A,sortOrigin:e,sortDirection:s,sortDepthBias:n,sort360:i},statements:({inputs:r,outputs:a})=>{const{gsplat:o,sortRadial:g,sortOrigin:l,sortDirection:c,sortDepthBias:u,sort360:I}=r;return YA(`
|
|
${a.metric} = computeSort(${o}, ${g}, ${l}, ${c}, ${u}, ${I});
|
|
`)}}).outputs.metric}class he{constructor(){this.splats=new zA,this.toWorld=new h.Matrix4,this.mapping=[],this.refCount=0,this.splatsVersion=-1,this.mappingVersion=-1}ensureGenerate(A){this.splats.ensureGenerate(A)&&(this.mapping=[])}generateSplats({renderer:A,modifier:e,generators:s,forceUpdate:n,originToWorld:i}){const r=this.mapping.reduce((g,l)=>(g.set(l.node,l),g),new Map);let a=0,o=0;for(const{node:g,generator:l,version:c,base:u,count:I}of s){const E=r.get(g);if((n||l!==(E==null?void 0:E.generator)||c!==(E==null?void 0:E.version)||u!==(E==null?void 0:E.base)||I!==(E==null?void 0:E.count))&&l&&I>0){const B=e.apply(l);try{this.splats.generate({generator:B,base:u,count:I,renderer:A})}catch(C){g.generator=void 0,g.generatorError=C}a+=1}o=Math.max(o,u+I)}return this.splats.numSplats=o,this.toWorld.copy(i),this.mapping=s,a!==0}hasCorrespondence(A){return this.mapping.length!==A.mapping.length?!1:this.mapping.every(({node:e,base:s,count:n},i)=>{const{node:r,base:a,count:o}=A.mapping[i];return e===r&&s===a&&n===o})}}var sI=`const float LN_SCALE_MIN = -12.0;
|
|
const float LN_SCALE_MAX = 9.0;
|
|
|
|
const uint SPLAT_TEX_WIDTH_BITS = 11u;
|
|
const uint SPLAT_TEX_HEIGHT_BITS = 11u;
|
|
const uint SPLAT_TEX_DEPTH_BITS = 11u;
|
|
const uint SPLAT_TEX_LAYER_BITS = SPLAT_TEX_WIDTH_BITS + SPLAT_TEX_HEIGHT_BITS;
|
|
|
|
const uint SPLAT_TEX_WIDTH = 1u << SPLAT_TEX_WIDTH_BITS;
|
|
const uint SPLAT_TEX_HEIGHT = 1u << SPLAT_TEX_HEIGHT_BITS;
|
|
const uint SPLAT_TEX_DEPTH = 1u << SPLAT_TEX_DEPTH_BITS;
|
|
|
|
const uint SPLAT_TEX_WIDTH_MASK = SPLAT_TEX_WIDTH - 1u;
|
|
const uint SPLAT_TEX_HEIGHT_MASK = SPLAT_TEX_HEIGHT - 1u;
|
|
const uint SPLAT_TEX_DEPTH_MASK = SPLAT_TEX_DEPTH - 1u;
|
|
|
|
const uint F16_INF = 0x7c00u;
|
|
const float PI = 3.1415926535897932384626433832795;
|
|
|
|
const float INFINITY = 1.0 / 0.0;
|
|
const float NEG_INFINITY = -INFINITY;
|
|
|
|
float sqr(float x) {
|
|
return x * x;
|
|
}
|
|
|
|
float pow4(float x) {
|
|
float x2 = x * x;
|
|
return x2 * x2;
|
|
}
|
|
|
|
float pow8(float x) {
|
|
float x4 = pow4(x);
|
|
return x4 * x4;
|
|
}
|
|
|
|
vec3 srgbToLinear(vec3 rgb) {
|
|
return pow(rgb, vec3(2.2));
|
|
}
|
|
|
|
vec3 linearToSrgb(vec3 rgb) {
|
|
return pow(rgb, vec3(1.0 / 2.2));
|
|
}
|
|
|
|
uint encodeQuatOctXy88R8(vec4 q) {
|
|
|
|
if (q.w < 0.0) {
|
|
q = -q;
|
|
}
|
|
|
|
float theta = 2.0 * acos(q.w);
|
|
float halfTheta = theta * 0.5;
|
|
float s = sin(halfTheta);
|
|
|
|
vec3 axis = (abs(s) < 1e-6) ? vec3(1.0, 0.0, 0.0) : q.xyz / s;
|
|
|
|
|
|
|
|
float sum = abs(axis.x) + abs(axis.y) + abs(axis.z);
|
|
vec2 p = vec2(axis.x, axis.y) / sum;
|
|
|
|
if (axis.z < 0.0) {
|
|
float oldPx = p.x;
|
|
p.x = (1.0 - abs(p.y)) * (p.x >= 0.0 ? 1.0 : -1.0);
|
|
p.y = (1.0 - abs(oldPx)) * (p.y >= 0.0 ? 1.0 : -1.0);
|
|
}
|
|
|
|
float u_f = p.x * 0.5 + 0.5;
|
|
float v_f = p.y * 0.5 + 0.5;
|
|
|
|
uint quantU = uint(clamp(round(u_f * 255.0), 0.0, 255.0));
|
|
uint quantV = uint(clamp(round(v_f * 255.0), 0.0, 255.0));
|
|
|
|
|
|
|
|
uint angleInt = uint(clamp(round((theta / 3.14159265359) * 255.0), 0.0, 255.0));
|
|
|
|
|
|
return (angleInt << 16u) | (quantV << 8u) | quantU;
|
|
}
|
|
|
|
vec4 decodeQuatOctXy88R8(uint encoded) {
|
|
|
|
uint quantU = encoded & uint(0xFFu);
|
|
uint quantV = (encoded >> 8u) & uint(0xFFu);
|
|
uint angleInt = encoded >> 16u;
|
|
|
|
|
|
float u_f = float(quantU) / 255.0;
|
|
float v_f = float(quantV) / 255.0;
|
|
vec2 f = vec2(u_f * 2.0 - 1.0, v_f * 2.0 - 1.0);
|
|
|
|
vec3 axis = vec3(f.xy, 1.0 - abs(f.x) - abs(f.y));
|
|
float t = max(-axis.z, 0.0);
|
|
axis.x += (axis.x >= 0.0) ? -t : t;
|
|
axis.y += (axis.y >= 0.0) ? -t : t;
|
|
axis = normalize(axis);
|
|
|
|
|
|
float theta = (float(angleInt) / 255.0) * 3.14159265359;
|
|
float halfTheta = theta * 0.5;
|
|
float s = sin(halfTheta);
|
|
float w = cos(halfTheta);
|
|
|
|
return vec4(axis * s, w);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uvec4 packSplatEncoding(
|
|
vec3 center, vec3 scales, vec4 quaternion, vec4 rgba, vec4 rgbMinMaxLnScaleMinMax
|
|
) {
|
|
float rgbMin = rgbMinMaxLnScaleMinMax.x;
|
|
float rgbMax = rgbMinMaxLnScaleMinMax.y;
|
|
vec3 encRgb = (rgba.rgb - vec3(rgbMin)) / (rgbMax - rgbMin);
|
|
uvec4 uRgba = uvec4(round(clamp(vec4(encRgb, rgba.a) * 255.0, 0.0, 255.0)));
|
|
|
|
uint uQuat = encodeQuatOctXy88R8(quaternion);
|
|
|
|
|
|
uvec3 uQuat3 = uvec3(uQuat & 0xffu, (uQuat >> 8u) & 0xffu, (uQuat >> 16u) & 0xffu);
|
|
|
|
|
|
float lnScaleMin = rgbMinMaxLnScaleMinMax.z;
|
|
float lnScaleMax = rgbMinMaxLnScaleMinMax.w;
|
|
float lnScaleScale = 254.0 / (lnScaleMax - lnScaleMin);
|
|
uvec3 uScales = uvec3(
|
|
(scales.x == 0.0) ? 0u : uint(round(clamp((log(scales.x) - lnScaleMin) * lnScaleScale, 0.0, 254.0))) + 1u,
|
|
(scales.y == 0.0) ? 0u : uint(round(clamp((log(scales.y) - lnScaleMin) * lnScaleScale, 0.0, 254.0))) + 1u,
|
|
(scales.z == 0.0) ? 0u : uint(round(clamp((log(scales.z) - lnScaleMin) * lnScaleScale, 0.0, 254.0))) + 1u
|
|
);
|
|
|
|
|
|
uint word0 = uRgba.r | (uRgba.g << 8u) | (uRgba.b << 16u) | (uRgba.a << 24u);
|
|
uint word1 = packHalf2x16(center.xy);
|
|
uint word2 = packHalf2x16(vec2(center.z, 0.0)) | (uQuat3.x << 16u) | (uQuat3.y << 24u);
|
|
uint word3 = uScales.x | (uScales.y << 8u) | (uScales.z << 16u) | (uQuat3.z << 24u);
|
|
return uvec4(word0, word1, word2, word3);
|
|
}
|
|
|
|
uvec4 packSplat(vec3 center, vec3 scales, vec4 quaternion, vec4 rgba) {
|
|
return packSplatEncoding(center, scales, quaternion, rgba, vec4(0.0, 1.0, LN_SCALE_MIN, LN_SCALE_MAX));
|
|
}
|
|
|
|
void unpackSplatEncoding(uvec4 packed, out vec3 center, out vec3 scales, out vec4 quaternion, out vec4 rgba, vec4 rgbMinMaxLnScaleMinMax) {
|
|
uint word0 = packed.x, word1 = packed.y, word2 = packed.z, word3 = packed.w;
|
|
|
|
uvec4 uRgba = uvec4(word0 & 0xffu, (word0 >> 8u) & 0xffu, (word0 >> 16u) & 0xffu, (word0 >> 24u) & 0xffu);
|
|
float rgbMin = rgbMinMaxLnScaleMinMax.x;
|
|
float rgbMax = rgbMinMaxLnScaleMinMax.y;
|
|
rgba = (vec4(uRgba) / 255.0);
|
|
rgba.rgb = rgba.rgb * (rgbMax - rgbMin) + rgbMin;
|
|
|
|
center = vec4(
|
|
unpackHalf2x16(word1),
|
|
unpackHalf2x16(word2 & 0xffffu)
|
|
).xyz;
|
|
|
|
uvec3 uScales = uvec3(word3 & 0xffu, (word3 >> 8u) & 0xffu, (word3 >> 16u) & 0xffu);
|
|
float lnScaleMin = rgbMinMaxLnScaleMinMax.z;
|
|
float lnScaleMax = rgbMinMaxLnScaleMinMax.w;
|
|
float lnScaleScale = (lnScaleMax - lnScaleMin) / 254.0;
|
|
scales = vec3(
|
|
(uScales.x == 0u) ? 0.0 : exp(lnScaleMin + float(uScales.x - 1u) * lnScaleScale),
|
|
(uScales.y == 0u) ? 0.0 : exp(lnScaleMin + float(uScales.y - 1u) * lnScaleScale),
|
|
(uScales.z == 0u) ? 0.0 : exp(lnScaleMin + float(uScales.z - 1u) * lnScaleScale)
|
|
);
|
|
|
|
uint uQuat = ((word2 >> 16u) & 0xFFFFu) | ((word3 >> 8u) & 0xFF0000u);
|
|
quaternion = decodeQuatOctXy88R8(uQuat);
|
|
|
|
|
|
}
|
|
|
|
void unpackSplat(uvec4 packed, out vec3 center, out vec3 scales, out vec4 quaternion, out vec4 rgba) {
|
|
unpackSplatEncoding(packed, center, scales, quaternion, rgba, vec4(0.0, 1.0, LN_SCALE_MIN, LN_SCALE_MAX));
|
|
}
|
|
|
|
vec3 quatVec(vec4 q, vec3 v) {
|
|
|
|
vec3 t = 2.0 * cross(q.xyz, v);
|
|
return v + q.w * t + cross(q.xyz, t);
|
|
}
|
|
|
|
vec4 quatQuat(vec4 q1, vec4 q2) {
|
|
return vec4(
|
|
q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y,
|
|
q1.w * q2.y - q1.x * q2.z + q1.y * q2.w + q1.z * q2.x,
|
|
q1.w * q2.z + q1.x * q2.y - q1.y * q2.x + q1.z * q2.w,
|
|
q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z
|
|
);
|
|
}
|
|
|
|
mat3 scaleQuaternionToMatrix(vec3 s, vec4 q) {
|
|
|
|
return mat3(
|
|
s.x * (1.0 - 2.0 * (q.y * q.y + q.z * q.z)),
|
|
s.x * (2.0 * (q.x * q.y + q.w * q.z)),
|
|
s.x * (2.0 * (q.x * q.z - q.w * q.y)),
|
|
s.y * (2.0 * (q.x * q.y - q.w * q.z)),
|
|
s.y * (1.0 - 2.0 * (q.x * q.x + q.z * q.z)),
|
|
s.y * (2.0 * (q.y * q.z + q.w * q.x)),
|
|
s.z * (2.0 * (q.x * q.z + q.w * q.y)),
|
|
s.z * (2.0 * (q.y * q.z - q.w * q.x)),
|
|
s.z * (1.0 - 2.0 * (q.x * q.x + q.y * q.y))
|
|
);
|
|
}
|
|
|
|
vec4 slerp(vec4 q1, vec4 q2, float t) {
|
|
|
|
float cosHalfTheta = dot(q1, q2);
|
|
|
|
|
|
if (abs(cosHalfTheta) >= 0.999) {
|
|
return q1;
|
|
}
|
|
|
|
|
|
|
|
if (cosHalfTheta < 0.0) {
|
|
q2 = -q2;
|
|
cosHalfTheta = -cosHalfTheta;
|
|
}
|
|
|
|
|
|
float halfTheta = acos(cosHalfTheta);
|
|
float sinHalfTheta = sqrt(1.0 - cosHalfTheta * cosHalfTheta);
|
|
|
|
|
|
float ratioA = sin((1.0 - t) * halfTheta) / sinHalfTheta;
|
|
float ratioB = sin(t * halfTheta) / sinHalfTheta;
|
|
|
|
|
|
return q1 * ratioA + q2 * ratioB;
|
|
}
|
|
|
|
ivec3 splatTexCoord(int index) {
|
|
uint x = uint(index) & SPLAT_TEX_WIDTH_MASK;
|
|
uint y = (uint(index) >> SPLAT_TEX_WIDTH_BITS) & SPLAT_TEX_HEIGHT_MASK;
|
|
uint z = uint(index) >> SPLAT_TEX_LAYER_BITS;
|
|
return ivec3(x, y, z);
|
|
}`,nI=`precision highp float;
|
|
precision highp int;
|
|
|
|
#include <splatDefines>
|
|
#include <logdepthbuf_pars_fragment>
|
|
|
|
uniform float near;
|
|
uniform float far;
|
|
uniform bool encodeLinear;
|
|
uniform float time;
|
|
uniform bool debugFlag;
|
|
uniform float maxStdDev;
|
|
uniform float minAlpha;
|
|
uniform bool stochastic;
|
|
uniform bool disableFalloff;
|
|
uniform float falloff;
|
|
|
|
uniform bool splatTexEnable;
|
|
uniform sampler3D splatTexture;
|
|
uniform mat2 splatTexMul;
|
|
uniform vec2 splatTexAdd;
|
|
uniform float splatTexNear;
|
|
uniform float splatTexFar;
|
|
uniform float splatTexMid;
|
|
|
|
out vec4 fragColor;
|
|
|
|
in vec4 vRgba;
|
|
in vec2 vSplatUv;
|
|
in vec3 vNdc;
|
|
flat in uint vSplatIndex;
|
|
|
|
void main() {
|
|
vec4 rgba = vRgba;
|
|
|
|
float z = dot(vSplatUv, vSplatUv);
|
|
if (!splatTexEnable) {
|
|
if (z > (maxStdDev * maxStdDev)) {
|
|
discard;
|
|
}
|
|
} else {
|
|
vec2 uv = splatTexMul * vSplatUv + splatTexAdd;
|
|
float ndcZ = vNdc.z;
|
|
float depth = (2.0 * near * far) / (far + near - ndcZ * (far - near));
|
|
float clampedFar = max(splatTexFar, splatTexNear);
|
|
float clampedDepth = clamp(depth, splatTexNear, clampedFar);
|
|
float logDepth = log2(clampedDepth + 1.0);
|
|
float logNear = log2(splatTexNear + 1.0);
|
|
float logFar = log2(clampedFar + 1.0);
|
|
|
|
float texZ;
|
|
if (splatTexMid > 0.0) {
|
|
float clampedMid = clamp(splatTexMid, splatTexNear, clampedFar);
|
|
float logMid = log2(clampedMid + 1.0);
|
|
texZ = (clampedDepth <= clampedMid) ?
|
|
(0.5 * ((logDepth - logNear) / (logMid - logNear))) :
|
|
(0.5 * ((logDepth - logMid) / (logFar - logMid)) + 0.5);
|
|
} else {
|
|
texZ = (logDepth - logNear) / (logFar - logNear);
|
|
}
|
|
|
|
vec4 modulate = texture(splatTexture, vec3(uv, 1.0 - texZ));
|
|
rgba *= modulate;
|
|
}
|
|
|
|
rgba.a *= mix(1.0, exp(-0.5 * z), falloff);
|
|
|
|
if (rgba.a < minAlpha) {
|
|
discard;
|
|
}
|
|
if (encodeLinear) {
|
|
rgba.rgb = srgbToLinear(rgba.rgb);
|
|
}
|
|
|
|
if (stochastic) {
|
|
const bool STEADY = false;
|
|
uint uTime = STEADY ? 0u : floatBitsToUint(time);
|
|
uvec2 coord = uvec2(gl_FragCoord.xy);
|
|
uint state = uTime + 0x9e3779b9u * coord.x + 0x85ebca6bu * coord.y + 0xc2b2ae35u * uint(vSplatIndex);
|
|
state = state * 747796405u + 2891336453u;
|
|
uint hash = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;
|
|
hash = (hash >> 22u) ^ hash;
|
|
float rand = float(hash) / 4294967296.0;
|
|
if (rand < rgba.a) {
|
|
fragColor = vec4(rgba.rgb, 1.0);
|
|
} else {
|
|
discard;
|
|
}
|
|
} else {
|
|
#ifdef PREMULTIPLIED_ALPHA
|
|
fragColor = vec4(rgba.rgb * rgba.a, rgba.a);
|
|
#else
|
|
fragColor = rgba;
|
|
#endif
|
|
}
|
|
#include <logdepthbuf_fragment>
|
|
}`,iI=`precision highp float;
|
|
precision highp int;
|
|
precision highp usampler2DArray;
|
|
|
|
#include <splatDefines>
|
|
#include <logdepthbuf_pars_vertex>
|
|
|
|
attribute uint splatIndex;
|
|
|
|
out vec4 vRgba;
|
|
out vec2 vSplatUv;
|
|
out vec3 vNdc;
|
|
flat out uint vSplatIndex;
|
|
|
|
uniform vec2 renderSize;
|
|
uniform uint numSplats;
|
|
uniform vec4 renderToViewQuat;
|
|
uniform vec3 renderToViewPos;
|
|
uniform float maxStdDev;
|
|
uniform float minPixelRadius;
|
|
uniform float maxPixelRadius;
|
|
uniform float time;
|
|
uniform float deltaTime;
|
|
uniform bool debugFlag;
|
|
uniform float minAlpha;
|
|
uniform bool stochastic;
|
|
uniform bool enable2DGS;
|
|
uniform float blurAmount;
|
|
uniform float preBlurAmount;
|
|
uniform float focalDistance;
|
|
uniform float apertureAngle;
|
|
uniform float clipXY;
|
|
uniform float focalAdjustment;
|
|
|
|
uniform usampler2DArray packedSplats;
|
|
uniform vec4 rgbMinMaxLnScaleMinMax;
|
|
|
|
#ifdef USE_LOGDEPTHBUF
|
|
bool isPerspectiveMatrix( mat4 m ) {
|
|
return m[ 2 ][ 3 ] == - 1.0;
|
|
}
|
|
#endif
|
|
|
|
void main() {
|
|
|
|
gl_Position = vec4(0.0, 0.0, 2.0, 1.0);
|
|
|
|
if (uint(gl_InstanceID) >= numSplats) {
|
|
return;
|
|
}
|
|
|
|
ivec3 texCoord;
|
|
if (stochastic) {
|
|
texCoord = ivec3(
|
|
uint(gl_InstanceID) & SPLAT_TEX_WIDTH_MASK,
|
|
(uint(gl_InstanceID) >> SPLAT_TEX_WIDTH_BITS) & SPLAT_TEX_HEIGHT_MASK,
|
|
(uint(gl_InstanceID) >> SPLAT_TEX_LAYER_BITS)
|
|
);
|
|
} else {
|
|
if (splatIndex == 0xffffffffu) {
|
|
|
|
return;
|
|
}
|
|
texCoord = ivec3(
|
|
splatIndex & SPLAT_TEX_WIDTH_MASK,
|
|
(splatIndex >> SPLAT_TEX_WIDTH_BITS) & SPLAT_TEX_HEIGHT_MASK,
|
|
splatIndex >> SPLAT_TEX_LAYER_BITS
|
|
);
|
|
}
|
|
uvec4 packed = texelFetch(packedSplats, texCoord, 0);
|
|
|
|
vec3 center, scales;
|
|
vec4 quaternion, rgba;
|
|
unpackSplatEncoding(packed, center, scales, quaternion, rgba, rgbMinMaxLnScaleMinMax);
|
|
|
|
if (rgba.a < minAlpha) {
|
|
return;
|
|
}
|
|
bvec3 zeroScales = equal(scales, vec3(0.0));
|
|
if (all(zeroScales)) {
|
|
return;
|
|
}
|
|
|
|
|
|
vec3 viewCenter = quatVec(renderToViewQuat, center) + renderToViewPos;
|
|
|
|
|
|
if (viewCenter.z >= 0.0) {
|
|
return;
|
|
}
|
|
|
|
|
|
vec4 clipCenter = projectionMatrix * vec4(viewCenter, 1.0);
|
|
|
|
|
|
if (abs(clipCenter.z) >= clipCenter.w) {
|
|
return;
|
|
}
|
|
|
|
|
|
float clip = clipXY * clipCenter.w;
|
|
if (abs(clipCenter.x) > clip || abs(clipCenter.y) > clip) {
|
|
return;
|
|
}
|
|
|
|
|
|
vSplatIndex = splatIndex;
|
|
|
|
|
|
vec4 viewQuaternion = quatQuat(renderToViewQuat, quaternion);
|
|
|
|
if (enable2DGS && any(zeroScales)) {
|
|
vRgba = rgba;
|
|
vSplatUv = position.xy * maxStdDev;
|
|
|
|
vec3 offset;
|
|
if (zeroScales.z) {
|
|
offset = vec3(vSplatUv.xy * scales.xy, 0.0);
|
|
} else if (zeroScales.y) {
|
|
offset = vec3(vSplatUv.x * scales.x, 0.0, vSplatUv.y * scales.z);
|
|
} else {
|
|
offset = vec3(0.0, vSplatUv.xy * scales.yz);
|
|
}
|
|
|
|
vec3 viewPos = viewCenter + quatVec(viewQuaternion, offset);
|
|
gl_Position = projectionMatrix * vec4(viewPos, 1.0);
|
|
vNdc = gl_Position.xyz / gl_Position.w;
|
|
return;
|
|
}
|
|
|
|
|
|
vec3 ndcCenter = clipCenter.xyz / clipCenter.w;
|
|
|
|
|
|
mat3 RS = scaleQuaternionToMatrix(scales, viewQuaternion);
|
|
mat3 cov3D = RS * transpose(RS);
|
|
|
|
|
|
vec2 scaledRenderSize = renderSize * focalAdjustment;
|
|
vec2 focal = 0.5 * scaledRenderSize * vec2(projectionMatrix[0][0], projectionMatrix[1][1]);
|
|
|
|
mat3 J;
|
|
if(isOrthographic) {
|
|
J = mat3(
|
|
focal.x, 0.0, 0.0,
|
|
0.0, focal.y, 0.0,
|
|
0.0, 0.0, 0.0
|
|
);
|
|
} else {
|
|
float invZ = 1.0 / viewCenter.z;
|
|
vec2 J1 = focal * invZ;
|
|
vec2 J2 = -(J1 * viewCenter.xy) * invZ;
|
|
J = mat3(
|
|
J1.x, 0.0, J2.x,
|
|
0.0, J1.y, J2.y,
|
|
0.0, 0.0, 0.0
|
|
);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mat3 cov2D = transpose(J) * cov3D * J;
|
|
float a = cov2D[0][0];
|
|
float d = cov2D[1][1];
|
|
float b = cov2D[0][1];
|
|
|
|
|
|
a += preBlurAmount;
|
|
d += preBlurAmount;
|
|
|
|
float fullBlurAmount = blurAmount;
|
|
if ((focalDistance > 0.0) && (apertureAngle > 0.0)) {
|
|
float focusRadius = maxPixelRadius;
|
|
if (viewCenter.z < 0.0) {
|
|
float focusBlur = abs((-viewCenter.z - focalDistance) / viewCenter.z);
|
|
float apertureRadius = focal.x * tan(0.5 * apertureAngle);
|
|
focusRadius = focusBlur * apertureRadius;
|
|
}
|
|
fullBlurAmount = clamp(sqr(focusRadius), blurAmount, sqr(maxPixelRadius));
|
|
}
|
|
|
|
|
|
float detOrig = a * d - b * b;
|
|
a += fullBlurAmount;
|
|
d += fullBlurAmount;
|
|
float det = a * d - b * b;
|
|
|
|
|
|
float blurAdjust = sqrt(max(0.0, detOrig / det));
|
|
rgba.a *= blurAdjust;
|
|
if (rgba.a < minAlpha) {
|
|
return;
|
|
}
|
|
|
|
|
|
float eigenAvg = 0.5 * (a + d);
|
|
float eigenDelta = sqrt(max(0.0, eigenAvg * eigenAvg - det));
|
|
float eigen1 = eigenAvg + eigenDelta;
|
|
float eigen2 = eigenAvg - eigenDelta;
|
|
|
|
vec2 eigenVec1 = normalize(vec2((abs(b) < 0.001) ? 1.0 : b, eigen1 - a));
|
|
vec2 eigenVec2 = vec2(eigenVec1.y, -eigenVec1.x);
|
|
|
|
float scale1 = min(maxPixelRadius, maxStdDev * sqrt(eigen1));
|
|
float scale2 = min(maxPixelRadius, maxStdDev * sqrt(eigen2));
|
|
if (scale1 < minPixelRadius && scale2 < minPixelRadius) {
|
|
return;
|
|
}
|
|
|
|
|
|
vec2 pixelOffset = position.x * eigenVec1 * scale1 + position.y * eigenVec2 * scale2;
|
|
vec2 ndcOffset = (2.0 / scaledRenderSize) * pixelOffset;
|
|
vec3 ndc = vec3(ndcCenter.xy + ndcOffset, ndcCenter.z);
|
|
|
|
vRgba = rgba;
|
|
vSplatUv = position.xy * maxStdDev;
|
|
vNdc = ndc;
|
|
gl_Position = vec4(ndc.xy * clipCenter.w, clipCenter.zw);
|
|
#include <logdepthbuf_vertex>
|
|
}`;let Je=null;function rI(){return Je||(h.ShaderChunk.splatDefines=sI,Je={splatVertex:iI,splatFragment:nI}),Je}const ws=5,cA=class cA extends h.Mesh{constructor(A){const e=cA.makeUniforms(),s=rI(),n=A.premultipliedAlpha??!0,i=new h.ShaderMaterial({glslVersion:h.GLSL3,vertexShader:s.splatVertex,fragmentShader:s.splatFragment,uniforms:e,premultipliedAlpha:n,transparent:!0,depthTest:!0,depthWrite:!1,side:h.DoubleSide});super(ms,i),this.splatTexture=null,this.autoViewpoints=[],this.rotateToAccumulator=new Gt({value:new h.Quaternion}),this.translateToAccumulator=new Ft({value:new h.Vector3}),this.lastFrame=-1,this.lastUpdateTime=null,this.defaultCameras=[],this.lastStochastic=null,this.pendingUpdate={scene:null,originToWorld:new h.Matrix4,timeoutId:-1},this.envViewpoint=null,this.frustumCulled=!1,this.renderer=A.renderer,this.material=i,this.uniforms=e;const r=TA({gsplat:AA},{gsplat:AA},({gsplat:a})=>{if(!a)throw new Error("gsplat not defined");return a=ts(a,{rotate:this.rotateToAccumulator,translate:this.translateToAccumulator}),{gsplat:a}});this.modifier=new ro(r),this.premultipliedAlpha=n,this.autoUpdate=A.autoUpdate??!0,this.preUpdate=A.preUpdate??!1,this.needsUpdate=!1,this.originDistance=A.originDistance??1,this.maxStdDev=A.maxStdDev??Math.sqrt(8),this.minPixelRadius=A.minPixelRadius??0,this.maxPixelRadius=A.maxPixelRadius??512,this.minAlpha=A.minAlpha??.5*(1/255),this.enable2DGS=A.enable2DGS??!1,this.preBlurAmount=A.preBlurAmount??0,this.blurAmount=A.blurAmount??.3,this.focalDistance=A.focalDistance??0,this.apertureAngle=A.apertureAngle??0,this.falloff=A.falloff??1,this.clipXY=A.clipXY??1.4,this.focalAdjustment=A.focalAdjustment??1,this.splatEncoding=A.splatEncoding??{...Me},this.active=new he,this.active.refCount=1,this.accumulatorCount=1,this.freeAccumulators=[];for(let a=0;a<1;++a)this.freeAccumulators.push(new he),this.accumulatorCount+=1;this.defaultView=new Wt({...A.view,autoUpdate:!0,spark:this}),this.viewpoint=this.defaultView,this.prepareViewpoint(this.viewpoint),this.clock=A.clock?Ai(A.clock):new h.Clock}static makeUniforms(){return{renderSize:{value:new h.Vector2},near:{value:.1},far:{value:1e3},numSplats:{value:0},renderToViewQuat:{value:new h.Quaternion},renderToViewPos:{value:new h.Vector3},maxStdDev:{value:1},minPixelRadius:{value:0},maxPixelRadius:{value:512},minAlpha:{value:.00196078431372549},stochastic:{value:!1},enable2DGS:{value:!1},preBlurAmount:{value:0},blurAmount:{value:.3},focalDistance:{value:0},apertureAngle:{value:0},falloff:{value:1},clipXY:{value:1.4},focalAdjustment:{value:1},splatTexEnable:{value:!1},splatTexture:{type:"t",value:cA.EMPTY_SPLAT_TEXTURE},splatTexMul:{value:new h.Matrix2},splatTexAdd:{value:new h.Vector2},splatTexNear:{value:.1},splatTexFar:{value:1e3},splatTexMid:{value:0},packedSplats:{type:"t",value:zA.getEmpty()},rgbMinMaxLnScaleMinMax:{value:new h.Vector4},time:{value:0},deltaTime:{value:0},encodeLinear:{value:!1},debugFlag:{value:!1}}}canAllocAccumulator(){return this.freeAccumulators.length>0||this.accumulatorCount<ws}maybeAllocAccumulator(){let A=this.freeAccumulators.pop();if(A===void 0){if(this.accumulatorCount>=ws)return null;A=new he,this.accumulatorCount+=1}return A.refCount=1,A}releaseAccumulator(A){A.refCount-=1,A.refCount===0&&this.freeAccumulators.push(A)}newViewpoint(A){return new Wt({...A,spark:this})}onBeforeRender(A,e,s){var I,E;const n=this.time??this.clock.getElapsedTime(),i=n-(this.viewpoint.lastTime??n);this.viewpoint.lastTime=n;const r=A.info.render.frame,a=r!==this.lastFrame;this.lastFrame=r;const o=this.viewpoint;if(o===this.defaultView){if(a)if(!A.xr.isPresenting)this.defaultView.viewToWorld=s.matrixWorld.clone(),this.defaultCameras=[this.defaultView.viewToWorld];else{const B=A.xr.getCamera().cameras;this.defaultCameras=B.map(C=>C.matrixWorld),this.defaultView.viewToWorld=aI(this.defaultCameras)??new h.Matrix4}this.autoUpdate&&this.update({scene:e,viewToWorld:this.defaultView.viewToWorld})}if(a&&(this.material.premultipliedAlpha!==this.premultipliedAlpha&&(this.material.premultipliedAlpha=this.premultipliedAlpha,this.material.needsUpdate=!0),this.uniforms.time.value=n,this.uniforms.deltaTime.value=i,this.uniforms.debugFlag.value=performance.now()/1e3%2<1,o.display&&o.stochastic&&(this.geometry.instanceCount=this.uniforms.numSplats.value)),o.target)this.uniforms.renderSize.value.set(o.target.width,o.target.height);else{const B=A.getDrawingBufferSize(this.uniforms.renderSize.value);if(B.x===1&&B.y===1){const C=(I=A.xr.getSession())==null?void 0:I.renderState.baseLayer;C&&(B.x=C.framebufferWidth,B.y=C.framebufferHeight)}}const g=s;if(this.uniforms.near.value=g.near,this.uniforms.far.value=g.far,this.uniforms.encodeLinear.value=o.encodeLinear,this.uniforms.maxStdDev.value=this.maxStdDev,this.uniforms.minPixelRadius.value=this.minPixelRadius,this.uniforms.maxPixelRadius.value=this.maxPixelRadius,this.uniforms.minAlpha.value=this.minAlpha,this.uniforms.stochastic.value=o.stochastic,this.uniforms.enable2DGS.value=this.enable2DGS,this.uniforms.preBlurAmount.value=this.preBlurAmount,this.uniforms.blurAmount.value=this.blurAmount,this.uniforms.focalDistance.value=this.focalDistance,this.uniforms.apertureAngle.value=this.apertureAngle,this.uniforms.falloff.value=this.falloff,this.uniforms.clipXY.value=this.clipXY,this.uniforms.focalAdjustment.value=this.focalAdjustment,this.lastStochastic!==!o.stochastic&&(this.lastStochastic=!o.stochastic,this.material.transparent=!o.stochastic,this.material.depthWrite=o.stochastic,this.material.needsUpdate=!0),this.splatTexture){const{enable:B,texture:C,multiply:Q,add:f,near:p,far:d,mid:y}=this.splatTexture;B&&C?(this.uniforms.splatTexEnable.value=!0,this.uniforms.splatTexture.value=C,Q?this.uniforms.splatTexMul.value.fromArray(Q.elements):this.uniforms.splatTexMul.value.set(.5/this.maxStdDev,0,0,.5/this.maxStdDev),this.uniforms.splatTexAdd.value.set((f==null?void 0:f.x)??.5,(f==null?void 0:f.y)??.5),this.uniforms.splatTexNear.value=p??this.uniforms.near.value,this.uniforms.splatTexFar.value=d??this.uniforms.far.value,this.uniforms.splatTexMid.value=y??0):(this.uniforms.splatTexEnable.value=!1,this.uniforms.splatTexture.value=cA.EMPTY_SPLAT_TEXTURE)}else this.uniforms.splatTexEnable.value=!1,this.uniforms.splatTexture.value=cA.EMPTY_SPLAT_TEXTURE;const l=((E=o.display)==null?void 0:E.accumulator.toWorld)??new h.Matrix4,c=s.matrixWorld.clone().invert();l.clone().premultiply(c).decompose(this.uniforms.renderToViewPos.value,this.uniforms.renderToViewQuat.value,new h.Vector3)}prepareViewpoint(A){var e,s,n,i;if(this.viewpoint=A??this.viewpoint,this.viewpoint.display){const{accumulator:r,geometry:a}=this.viewpoint.display;this.uniforms.numSplats.value=r.splats.numSplats,this.uniforms.packedSplats.value=r.splats.getTexture(),this.uniforms.rgbMinMaxLnScaleMinMax.value.set(((e=r.splats.splatEncoding)==null?void 0:e.rgbMin)??0,((s=r.splats.splatEncoding)==null?void 0:s.rgbMax)??1,((n=r.splats.splatEncoding)==null?void 0:n.lnScaleMin)??kA,((i=r.splats.splatEncoding)==null?void 0:i.lnScaleMax)??NA),this.geometry=a,this.material.transparent=!this.viewpoint.stochastic,this.material.depthWrite=this.viewpoint.stochastic,this.material.needsUpdate=!0}else this.uniforms.numSplats.value=0,this.uniforms.packedSplats.value=zA.getEmpty(),this.geometry=ms}update({scene:A,viewToWorld:e}){const s=this.matrixWorld;this.preUpdate?this.updateInternal({scene:A,originToWorld:s.clone(),viewToWorld:e}):(this.pendingUpdate.scene=A,this.pendingUpdate.originToWorld.copy(s),this.pendingUpdate.timeoutId===-1&&(this.pendingUpdate.timeoutId=setTimeout(()=>{const{scene:n,originToWorld:i}=this.pendingUpdate;this.pendingUpdate.scene=null,this.pendingUpdate.timeoutId=-1,this.updateInternal({scene:n,originToWorld:i,viewToWorld:e})&&this.renderer.getContext().flush()},1)))}updateInternal({scene:A,originToWorld:e,viewToWorld:s}){var E;if(!this.canAllocAccumulator())return!1;e||(e=this.active.toWorld),s=s??e.clone();const n=this.time??this.clock.getElapsedTime(),i=n-(this.lastUpdateTime??n);this.lastUpdateTime=n;const r=this.active.mapping.reduce((B,C)=>(B.set(C.node,C),B),new Map),{generators:a,visibleGenerators:o,globalEdits:g}=this.compileScene(A);for(const B of a)(E=B.frameUpdate)==null||E.call(B,{object:B,time:n,deltaTime:i,viewToWorld:s,globalEdits:g});const l=new Set(o.map(B=>B.uuid));for(const B of a){const C=r.get(B),f=B.generator&&l.has(B.uuid)?B.numSplats:0;(this.needsUpdate||B.generator!==(C==null?void 0:C.generator)||f!==(C==null?void 0:C.count))&&B.updateVersion()}const c=!Qe({matrix1:e,matrix2:this.active.toWorld,maxDistance:this.originDistance}),u=this.needsUpdate||c||a.length!==r.size||a.some(B=>{var C;return B.version!==((C=r.get(B))==null?void 0:C.version)});this.needsUpdate=!1;let I=null;if(u){if(I=this.maybeAllocAccumulator(),!I)throw new Error("Unreachable");const B=!Qe({matrix1:e,matrix2:I.toWorld,maxDistance:1e-5,minCoorient:.99999}),Q=o.map((x,w)=>{const m=r.get(x);return m?[x.version-m.version,m.base,x]:[Number.POSITIVE_INFINITY,x.version,x]}).sort((x,w)=>x[0]!==w[0]?x[0]-w[0]:x[1]-w[1]).map(([x,w,m])=>m),f=Q.map(x=>x.numSplats),{maxSplats:p,mapping:d}=I.splats.generateMapping(f),y=Q.map((x,w)=>{const{base:m,count:k}=d[w];return{node:x,generator:x.generator,version:x.version,base:m,count:k}});e.clone().invert().decompose(this.translateToAccumulator.value,this.rotateToAccumulator.value,new h.Vector3),I.ensureGenerate(p),I.splats.splatEncoding={...this.splatEncoding},I.generateSplats({renderer:this.renderer,modifier:this.modifier,generators:y,forceUpdate:B,originToWorld:e}),I.splatsVersion=this.active.splatsVersion+1;const M=I.hasCorrespondence(this.active);I.mappingVersion=this.active.mappingVersion+(M?0:1),this.releaseAccumulator(this.active),this.active=I,this.prepareViewpoint()}return setTimeout(()=>{for(const B of this.autoViewpoints)B.autoPoll({accumulator:I??void 0})},1),!0}compileScene(A){const e=[];A.traverse(i=>{i instanceof kt&&e.push(i)});const s=[];A.traverseVisible(i=>{i instanceof kt&&s.push(i)});const n=new Set;return A.traverseVisible(i=>{if(i instanceof Xt){let r=i.parent;for(;r!=null&&!(r instanceof ct);)r=r.parent;r==null&&n.add(i)}}),{generators:e,visibleGenerators:s,globalEdits:Array.from(n)}}async renderEnvMap({renderer:A,scene:e,worldCenter:s,size:n=256,near:i=.1,far:r=1e3,hideObjects:a=[],update:o=!1}){var I,E;if(this.envViewpoint||(this.envViewpoint=this.newViewpoint({sort360:!0})),!cA.cubeRender||cA.cubeRender.target.width!==n||cA.cubeRender.near!==i||cA.cubeRender.far!==r){cA.cubeRender&&cA.cubeRender.target.dispose();const B=new h.WebGLCubeRenderTarget(n,{format:h.RGBAFormat,generateMipmaps:!0,minFilter:h.LinearMipMapLinearFilter}),C=new h.CubeCamera(i,r,B);cA.cubeRender={target:B,camera:C,near:i,far:r}}cA.pmrem||(cA.pmrem=new h.PMREMGenerator(A??this.renderer));const g=new h.Matrix4().setPosition(s);await((I=this.envViewpoint)==null?void 0:I.prepare({scene:e,viewToWorld:g,update:o}));const{target:l,camera:c}=cA.cubeRender;c.position.copy(s);const u=new Map;for(const B of a)u.set(B,B.visible),B.visible=!1;this.prepareViewpoint(this.envViewpoint),c.update(A??this.renderer,e),this.prepareViewpoint(this.defaultView);for(const[B,C]of u.entries())B.visible=C;return(E=cA.pmrem)==null?void 0:E.fromCubemap(l.texture).texture}recurseSetEnvMap(A,e){A.traverse(s=>{if(s instanceof h.Mesh)if(Array.isArray(s.material))for(const n of s.material)n instanceof h.MeshStandardMaterial&&(n.envMap=e);else s.material instanceof h.MeshStandardMaterial&&(s.material.envMap=e)})}getRgba({generator:A,rgba:e}){const s=this.active.mapping.find(({node:n})=>n===A);if(!s)throw new Error("Generator not found");return e=e??new pe,e.fromPackedSplats({packedSplats:this.active.splats,base:s.base,count:s.count,renderer:this.renderer}),e}async readRgba({generator:A,rgba:e}){return e=this.getRgba({generator:A,rgba:e}),e.read()}};cA.cubeRender=null,cA.pmrem=null,cA.EMPTY_SPLAT_TEXTURE=new h.Data3DTexture;let Ae=cA;const ms=new Ze(new Uint32Array(1),0);TA({packedSplats:ie,index:"int"},{gsplat:AA},({packedSplats:t,index:A})=>{if(!t||!A)throw new Error("Invalid input");return{gsplat:Tt(t,A)}});function aI(t){if(t.length===0)return null;const A=new h.Vector3,e=new h.Quaternion,s=new h.Vector3,n=[],i=[];for(const r of t)r.decompose(A,e,s),n.push(A),i.push(e);return new h.Matrix4().compose(ei(n),si(i),new h.Vector3(1,1,1))}function oI(t,A,e){const s=Math.floor(t.length/32);if(s*32!==t.length)throw new Error("Invalid .splat file size");const n=new Float32Array(t.buffer);for(let i=0;i<s;++i){const r=i*32,a=i*8,o=n[a+0],g=n[a+1],l=n[a+2],c=n[a+3],u=n[a+4],I=n[a+5],E=t[r+24]/255,B=t[r+25]/255,C=t[r+26]/255,Q=t[r+27]/255,f=(t[r+28]-128)/128,p=(t[r+29]-128)/128,d=(t[r+30]-128)/128,y=(t[r+31]-128)/128;e(i,o,g,l,c,u,I,p,d,y,f,Q,E,B,C)}}const xs={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}},cI={0:0,1:9,2:24,3:45};function gI(t,A,e,s){var B;let r=0;const a=new DataView(t.buffer,r,4096);r+=4096;const o=a.getUint8(0),g=a.getUint8(1);if(o!==0||g<1)throw new Error(`Unsupported .ksplat version: ${o}.${g}`);const l=a.getUint32(4,!0);a.getUint32(16,!0);const c=a.getUint16(20,!0);if(c<0||c>2)throw new Error(`Invalid .ksplat compression level: ${c}`);const u=a.getFloat32(36,!0)||-1.5,I=a.getFloat32(40,!0)||1.5;let E=4096+l*1024;for(let C=0;C<l;++C){let Q=function(vA,H){if(c===0)return Y.getFloat32(vA+V+H*4,!0);if(c===1)return fA(Y.getUint16(vA+V+H*2,!0));const OA=Y.getUint8(vA+V+H)/255;return u+OA*(I-u)};const f=new DataView(t.buffer,r,1024);r+=1024;const p=f.getUint32(0,!0),d=f.getUint32(4,!0),y=f.getUint32(8,!0),M=f.getUint32(12,!0),x=f.getFloat32(16,!0),w=f.getUint16(20,!0),m=(f.getUint32(24,!0)||((B=xs[c])==null?void 0:B.scaleRange))??1,k=f.getUint32(32,!0),D=k*y,S=f.getUint32(36,!0),U=S*4,T=w*M+U,b=f.getUint16(40,!0),N=cI[b],{bytesPerCenter:R,bytesPerScale:Z,bytesPerRotation:J,bytesPerColor:eA,bytesPerSphericalHarmonicsComponent:q,scaleOffsetBytes:X,rotationOffsetBytes:L,colorOffsetBytes:j,sphericalHarmonicsOffsetBytes:V}=xs[c],W=R+Z+J+eA+N*q,G=W*d,dA=G+T,lA=[0,3,6,1,4,7,2,5,8],yA=[9,14,19,10,15,20,11,16,21,12,17,22,13,18,23],wA=[24,31,38,25,32,39,26,33,40,27,34,41,28,35,42,29,36,43,30,37,44],SA=b>=1?new Float32Array(3*3):void 0,CA=b>=2?new Float32Array(5*3):void 0,_A=b>=3?new Float32Array(7*3):void 0,MA=x/2/m,jA=E+U,WA=E+T,Y=new DataView(t.buffer,WA,G),DA=new Float32Array(t.buffer,jA,M*3),uA=new Uint32Array(t.buffer,E,S);let Yt=k,ae=D;for(let vA=0;vA<p;++vA){const H=vA*W;let OA;if(vA<D)OA=Math.floor(vA/y);else{const At=uA[Yt-k];vA>=ae+At&&(Yt+=1,ae+=At),OA=Yt}const ve=c===0?Y.getFloat32(H+0,!0):(Y.getUint16(H+0,!0)-m)*MA+DA[3*OA+0],be=c===0?Y.getFloat32(H+4,!0):(Y.getUint16(H+2,!0)-m)*MA+DA[3*OA+1],Te=c===0?Y.getFloat32(H+8,!0):(Y.getUint16(H+4,!0)-m)*MA+DA[3*OA+2],Fe=c===0?Y.getFloat32(H+X+0,!0):fA(Y.getUint16(H+X+0,!0)),ke=c===0?Y.getFloat32(H+X+4,!0):fA(Y.getUint16(H+X+2,!0)),xo=c===0?Y.getFloat32(H+X+8,!0):fA(Y.getUint16(H+X+4,!0)),So=c===0?Y.getFloat32(H+L+0,!0):fA(Y.getUint16(H+L+0,!0)),Mo=c===0?Y.getFloat32(H+L+4,!0):fA(Y.getUint16(H+L+2,!0)),Do=c===0?Y.getFloat32(H+L+8,!0):fA(Y.getUint16(H+L+4,!0)),vo=c===0?Y.getFloat32(H+L+12,!0):fA(Y.getUint16(H+L+6,!0)),bo=Y.getUint8(H+j+0)/255,To=Y.getUint8(H+j+1)/255,Fo=Y.getUint8(H+j+2)/255,ko=Y.getUint8(H+j+3)/255;if(e(vA,ve,be,Te,Fe,ke,xo,Mo,Do,vo,So,ko,bo,To,Fo),b>=1&&SA){for(const[At,_t]of lA.entries())SA[At]=Q(H,_t);if(CA)for(const[At,_t]of yA.entries())CA[At]=Q(H,_t);if(_A)for(const[At,_t]of wA.entries())_A[At]=Q(H,_t);s==null||s(vA,SA,CA,_A)}}E+=dA}}class ho{constructor({fileBytes:A}){this.version=-1,this.numSplats=0,this.shDegree=0,this.fractionalBits=0,this.flags=0,this.flagAntiAlias=!1,this.reserved=0,this.headerParsed=!1,this.parsed=!1,this.fileBytes=A instanceof ArrayBuffer?new Uint8Array(A):A,this.reader=new oi({fileBytes:this.fileBytes})}async parseHeader(){if(this.headerParsed)throw new Error("SPZ file header already parsed");const A=new DataView((await this.reader.read(16)).buffer);if(A.getUint32(0,!0)!==1347635022)throw new Error("Invalid SPZ file");if(this.version=A.getUint32(4,!0),this.version<1||this.version>3)throw new Error(`Unsupported SPZ version: ${this.version}`);this.numSplats=A.getUint32(8,!0),this.shDegree=A.getUint8(12),this.fractionalBits=A.getUint8(13),this.flags=A.getUint8(14),this.flagAntiAlias=(this.flags&1)!==0,this.reserved=A.getUint8(15),this.headerParsed=!0,this.parsed=!1}async parseSplats(A,e,s,n,i,r){if(!this.headerParsed)throw new Error("SPZ file header must be parsed first");if(this.parsed)throw new Error("SPZ file already parsed");if(this.parsed=!0,this.version===1){const a=await this.reader.read(this.numSplats*3*2),o=new Uint16Array(a.buffer);for(let g=0;g<this.numSplats;g++){const l=g*3,c=fA(o[l]),u=fA(o[l+1]),I=fA(o[l+2]);A==null||A(g,c,u,I)}}else if(this.version===2||this.version===3){const a=1<<this.fractionalBits,o=await this.reader.read(this.numSplats*3*3);for(let g=0;g<this.numSplats;g++){const l=g*9,c=((o[l+2]<<24|o[l+1]<<16|o[l]<<8)>>8)/a,u=((o[l+5]<<24|o[l+4]<<16|o[l+3]<<8)>>8)/a,I=((o[l+8]<<24|o[l+7]<<16|o[l+6]<<8)>>8)/a;A==null||A(g,c,u,I)}}else throw new Error("Unreachable");{const a=await this.reader.read(this.numSplats);for(let o=0;o<this.numSplats;o++)e==null||e(o,a[o]/255)}{const a=await this.reader.read(this.numSplats*3),o=Bo/.15;for(let g=0;g<this.numSplats;g++){const l=g*3,c=(a[l]/255-.5)*o+.5,u=(a[l+1]/255-.5)*o+.5,I=(a[l+2]/255-.5)*o+.5;s==null||s(g,c,u,I)}}{const a=await this.reader.read(this.numSplats*3);for(let o=0;o<this.numSplats;o++){const g=o*3,l=Math.exp(a[g]/16-10),c=Math.exp(a[g+1]/16-10),u=Math.exp(a[g+2]/16-10);n==null||n(o,l,c,u)}}if(this.version===3){const a=1/Math.sqrt(2),o=await this.reader.read(this.numSplats*4);for(let g=0;g<this.numSplats;g++){const l=g*4,c=[0,0,0,0],u=[o[l],o[l+1],o[l+2],o[l+3]],I=u[0]+(u[1]<<8)+(u[2]<<16)+(u[3]<<24),E=511,B=I>>>30;let C=I,Q=0;for(let p=3;p>=0;--p)if(p!==B){const d=C&E,y=C>>>9&1;C=C>>>10,c[p]=a*(d/E),c[p]=y===0?c[p]:-c[p],Q+=c[p]*c[p]}const f=1-Q;c[B]=Math.sqrt(Math.max(f,0)),i==null||i(g,c[0],c[1],c[2],c[3])}}else{const a=await this.reader.read(this.numSplats*3);for(let o=0;o<this.numSplats;o++){const g=o*3,l=a[g]/127.5-1,c=a[g+1]/127.5-1,u=a[g+2]/127.5-1,I=Math.sqrt(Math.max(0,1-l*l-c*c-u*u));i==null||i(o,l,c,u,I)}}if(r&&this.shDegree>=1){const a=new Float32Array(9),o=this.shDegree>=2?new Float32Array(5*3):void 0,g=this.shDegree>=3?new Float32Array(7*3):void 0,l=await this.reader.read(this.numSplats*Io[this.shDegree]*3);let c=0;for(let u=0;u<this.numSplats;u++){for(let I=0;I<9;++I)a[I]=(l[c+I]-128)/128;if(c+=9,o){for(let I=0;I<15;++I)o[I]=(l[c+I]-128)/128;c+=15}if(g){for(let I=0;I<21;++I)g[I]=(l[c+I]-128)/128;c+=21}r==null||r(u,a,o,g)}}}}const Io={1:3,2:8,3:15},Bo=.28209479177387814,lI=1347635022,uI=3,hI=1;class ZA{constructor({numSplats:A,shDegree:e,fractionalBits:s=12,flagAntiAlias:n=!0}){this.clippedCount=0;const i=20+(e>=1?9:0)+(e>=2?15:0)+(e>=3?21:0),r=16+A*i;this.buffer=new ArrayBuffer(r),this.view=new DataView(this.buffer),this.view.setUint32(0,lI,!0),this.view.setUint32(4,uI,!0),this.view.setUint32(8,A,!0),this.view.setUint8(12,e),this.view.setUint8(13,s),this.view.setUint8(14,n?hI:0),this.view.setUint8(15,0),this.numSplats=A,this.shDegree=e,this.fractionalBits=s,this.fraction=1<<s,this.flagAntiAlias=n}setCenter(A,e,s,n){const i=Math.round(e*this.fraction),r=Math.max(-8388607,Math.min(8388607,i)),a=Math.round(s*this.fraction),o=Math.max(-8388607,Math.min(8388607,a)),g=Math.round(n*this.fraction),l=Math.max(-8388607,Math.min(8388607,g));(i!==r||a!==o||g!==l)&&(this.clippedCount+=1);const I=16+A*9;this.view.setUint8(I,r&255),this.view.setUint8(I+1,r>>8&255),this.view.setUint8(I+2,r>>16&255),this.view.setUint8(I+3,o&255),this.view.setUint8(I+4,o>>8&255),this.view.setUint8(I+5,o>>16&255),this.view.setUint8(I+6,l&255),this.view.setUint8(I+7,l>>8&255),this.view.setUint8(I+8,l>>16&255)}setAlpha(A,e){const s=16+this.numSplats*9+A;this.view.setUint8(s,Math.max(0,Math.min(255,Math.round(e*255))))}static scaleRgb(A){const e=((A-.5)/(Bo/.15)+.5)*255;return Math.max(0,Math.min(255,Math.round(e)))}setRgb(A,e,s,n){const i=16+this.numSplats*10+A*3;this.view.setUint8(i,ZA.scaleRgb(e)),this.view.setUint8(i+1,ZA.scaleRgb(s)),this.view.setUint8(i+2,ZA.scaleRgb(n))}setScale(A,e,s,n){const i=16+this.numSplats*13+A*3;this.view.setUint8(i,Math.max(0,Math.min(255,Math.round((Math.log(e)+10)*16)))),this.view.setUint8(i+1,Math.max(0,Math.min(255,Math.round((Math.log(s)+10)*16)))),this.view.setUint8(i+2,Math.max(0,Math.min(255,Math.round((Math.log(n)+10)*16))))}setQuat(A,...e){const s=16+this.numSplats*16+A*4,n=zn(e);let i=0;for(let o=1;o<4;++o)Math.abs(n[o])>Math.abs(n[i])&&(i=o);const r=n[i]<0?1:0;let a=i;for(let o=0;o<4;++o)if(o!==i){const g=(n[o]<0?1:0)^r,l=Math.floor(511*(Math.abs(n[o])/Math.SQRT1_2)+.5);a=a<<10|g<<9|l}this.view.setUint8(s,a&255),this.view.setUint8(s+1,a>>8&255),this.view.setUint8(s+2,a>>16&255),this.view.setUint8(s+3,a>>>24&255)}static quantizeSh(A,e){const s=Math.round(A*128)+128,n=1<<8-e,i=Math.floor((s+n/2)/n)*n;return Math.max(0,Math.min(255,i))}setSh(A,e,s,n){const i=Io[this.shDegree]||0,r=16+this.numSplats*20+A*i*3;for(let a=0;a<9;++a)this.view.setUint8(r+a,ZA.quantizeSh(e[a],5));if(s){const a=r+9;for(let o=0;o<15;++o)this.view.setUint8(a+o,ZA.quantizeSh(s[o],4));if(n){const o=a+15;for(let g=0;g<21;++g)this.view.setUint8(o+g,ZA.quantizeSh(n[g],4))}}}async finalize(){const A=new Uint8Array(this.buffer),s=new ReadableStream({async start(r){r.enqueue(A),r.close()}}).pipeThrough(new CompressionStream("gzip")),i=await new Response(s).arrayBuffer();return console.log("Compressed",A.length,"bytes to",i.byteLength,"bytes"),new Uint8Array(i)}}async function II(t){var l,c,u;const A=new jh,{inputs:e,clipXyz:s,maxSh:n,fractionalBits:i=12,opacityThreshold:r}=t;for(const I of e){let E=function(w){return w.multiplyScalar(p),w.applyQuaternion(d),w.add(y),w},B=function(w){return w.multiplyScalar(p),w},C=function(w){return w.premultiply(d),w},Q=function(w){return!M||M.containsPoint(w)},f=function(w){return r!==void 0?w>=r:!0};const p=((l=I.transform)==null?void 0:l.scale)??1,d=new h.Quaternion().fromArray(((c=I.transform)==null?void 0:c.quaternion)??[0,0,0,1]),y=new h.Vector3().fromArray(((u=I.transform)==null?void 0:u.translate)??[0,0,0]),M=s?new h.Box3(new h.Vector3().fromArray(s.min),new h.Vector3().fromArray(s.max)):void 0;let x=I.fileType;switch(x||(x=ls(I.fileBytes),!x&&I.pathOrUrl&&(x=uo(I.pathOrUrl))),x){case Mt.PLY:{const w=new jt({fileBytes:I.fileBytes});await w.parseHeader();let m=null;w.parseSplats((k,D,S,U,T,b,N,R,Z,J,eA,q,X,L,j)=>{const V=E(new h.Vector3(D,S,U));if(Q(V)&&f(q)){m=A.pushSplat(),A.setCenter(m,V.x,V.y,V.z);const W=B(new h.Vector3(T,b,N));A.setScale(m,W.x,W.y,W.z);const G=C(new h.Quaternion(R,Z,J,eA));A.setQuaternion(m,G.x,G.y,G.z,G.w),A.setOpacity(m,q),A.setColor(m,X,L,j)}else m=null},(k,D,S,U)=>{D&&m!==null&&A.setSh1(m,D),S&&m!==null&&A.setSh2(m,S),U&&m!==null&&A.setSh3(m,U)});break}case Mt.SPZ:{const w=new ho({fileBytes:I.fileBytes});await w.parseHeader();const m=new Int32Array(w.numSplats);m.fill(-1);const k=new Float32Array(w.numSplats*3),D=new h.Vector3;w.parseSplats((S,U,T,b)=>{const N=E(new h.Vector3(U,T,b));k[S*3]=N.x,k[S*3+1]=N.y,k[S*3+2]=N.z},(S,U)=>{D.fromArray(k,S*3),Q(D)&&f(U)&&(m[S]=A.pushSplat(),A.setCenter(m[S],D.x,D.y,D.z),A.setOpacity(m[S],U))},(S,U,T,b)=>{m[S]>=0&&A.setColor(m[S],U,T,b)},(S,U,T,b)=>{if(m[S]>=0){const N=B(new h.Vector3(U,T,b));A.setScale(m[S],N.x,N.y,N.z)}},(S,U,T,b,N)=>{if(m[S]>=0){const R=C(new h.Quaternion(U,T,b,N));A.setQuaternion(m[S],R.x,R.y,R.z,R.w)}},(S,U,T,b)=>{m[S]>=0&&(A.setSh1(m[S],U),T&&A.setSh2(m[S],T),b&&A.setSh3(m[S],b))});break}case Mt.SPLAT:oI(I.fileBytes,w=>{},(w,m,k,D,S,U,T,b,N,R,Z,J,eA,q,X)=>{const L=E(new h.Vector3(m,k,D));if(Q(L)&&f(J)){const j=A.pushSplat();A.setCenter(j,L.x,L.y,L.z);const V=B(new h.Vector3(S,U,T));A.setScale(j,V.x,V.y,V.z);const W=C(new h.Quaternion(b,N,R,Z));A.setQuaternion(j,W.x,W.y,W.z,W.w),A.setOpacity(j,J),A.setColor(j,eA,q,X)}});break;case Mt.KSPLAT:{let w=null;gI(I.fileBytes,m=>{},(m,k,D,S,U,T,b,N,R,Z,J,eA,q,X,L)=>{const j=E(new h.Vector3(k,D,S));if(Q(j)&&f(eA)){w=A.pushSplat(),A.setCenter(w,j.x,j.y,j.z);const V=B(new h.Vector3(U,T,b));A.setScale(w,V.x,V.y,V.z);const W=C(new h.Quaternion(N,R,Z,J));A.setQuaternion(w,W.x,W.y,W.z,W.w),A.setOpacity(w,eA),A.setColor(w,q,X,L)}else w=null},(m,k,D,S)=>{w!==null&&(A.setSh1(w,k),D&&A.setSh2(w,D),S&&A.setSh3(w,S))});break}default:throw new Error(`transcodeSpz not implemented for ${x}`)}}const a=Math.min(n??3,A.sh3?3:A.sh2?2:A.sh1?1:0),o=new ZA({numSplats:A.numSplats,shDegree:a,fractionalBits:i,flagAntiAlias:!0});for(let I=0;I<A.numSplats;++I){const E=I*3,B=I*4;o.setCenter(I,A.centers[E],A.centers[E+1],A.centers[E+2]),o.setScale(I,A.scales[E],A.scales[E+1],A.scales[E+2]),o.setQuat(I,A.quaternions[B],A.quaternions[B+1],A.quaternions[B+2],A.quaternions[B+3]),o.setAlpha(I,A.opacities[I]),o.setRgb(I,A.colors[E],A.colors[E+1],A.colors[E+2]),A.sh1&&a>=1&&o.setSh(I,A.sh1.slice(I*9,(I+1)*9),a>=2&&A.sh2?A.sh2.slice(I*15,(I+1)*15):void 0,a>=3&&A.sh3?A.sh3.slice(I*21,(I+1)*21):void 0)}return{fileBytes:await o.finalize(),clippedCount:o.clippedCount}}class BI{constructor(A){this.mesh=A.mesh,this.numSplats=A.numSplats??this.mesh.numSplats;const{width:e,height:s,depth:n,maxSplats:i}=xA(this.numSplats);this.skinData=new Uint16Array(i*4),this.skinTexture=new h.DataArrayTexture(this.skinData,e,s,n),this.skinTexture.format=h.RGBAIntegerFormat,this.skinTexture.type=h.UnsignedShortType,this.skinTexture.internalFormat="RGBA16UI",this.skinTexture.needsUpdate=!0,this.numBones=A.numBones??256,this.boneData=new Float32Array(this.numBones*16),this.boneTexture=new h.DataTexture(this.boneData,4,this.numBones,h.RGBAFormat,h.FloatType),this.boneTexture.internalFormat="RGBA32F",this.boneTexture.needsUpdate=!0,this.uniform=new F({key:"skinning",type:Co,globals:()=>[Eo],value:{numSplats:this.numSplats,numBones:this.numBones,skinTexture:this.skinTexture,boneTexture:this.boneTexture}})}modify(A){return EI(A,this.uniform)}setRestQuatPos(A,e,s){const n=A*16;this.boneData[n+0]=e.x,this.boneData[n+1]=e.y,this.boneData[n+2]=e.z,this.boneData[n+3]=e.w,this.boneData[n+4]=s.x,this.boneData[n+5]=s.y,this.boneData[n+6]=s.z,this.boneData[n+7]=0,this.boneData[n+8]=0,this.boneData[n+9]=0,this.boneData[n+10]=0,this.boneData[n+11]=1,this.boneData[n+12]=0,this.boneData[n+13]=0,this.boneData[n+14]=0,this.boneData[n+15]=0}setBoneQuatPos(A,e,s){const n=A*16,i=new h.Quaternion(this.boneData[n+0],this.boneData[n+1],this.boneData[n+2],this.boneData[n+3]),r=new h.Vector3(this.boneData[n+4],this.boneData[n+5],this.boneData[n+6]),a=i.clone().invert(),o=s.clone().sub(r);o.applyQuaternion(a),a.multiply(e);const g=new h.Quaternion(o.x,o.y,o.z,0).multiply(i);this.boneData[n+8]=a.x,this.boneData[n+9]=a.y,this.boneData[n+10]=a.z,this.boneData[n+11]=a.w,this.boneData[n+12]=.5*g.x,this.boneData[n+13]=.5*g.y,this.boneData[n+14]=.5*g.z,this.boneData[n+15]=.5*g.w}setSplatBones(A,e,s){const n=A*4;this.skinData[n+0]=Math.min(255,Math.max(0,Math.round(s.x*255)))+(e.x<<8),this.skinData[n+1]=Math.min(255,Math.max(0,Math.round(s.y*255)))+(e.y<<8),this.skinData[n+2]=Math.min(255,Math.max(0,Math.round(s.z*255)))+(e.z<<8),this.skinData[n+3]=Math.min(255,Math.max(0,Math.round(s.w*255)))+(e.w<<8)}updateBones(){this.boneTexture.needsUpdate=!0,this.mesh.needsUpdate=!0}}const Co={type:"GsplatSkinning"},Eo=BA(`
|
|
struct GsplatSkinning {
|
|
int numSplats;
|
|
int numBones;
|
|
usampler2DArray skinTexture;
|
|
sampler2D boneTexture;
|
|
};
|
|
`),CI=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 EI(t,A){return new P({inTypes:{gsplat:AA,skinning:Co},outTypes:{gsplat:AA},globals:()=>[Eo,CI],inputs:{gsplat:t,skinning:A},statements:({inputs:s,outputs:n})=>{const{skinning:i}=s,{gsplat:r}=n;return YA(`
|
|
${r} = ${s.gsplat};
|
|
if (isGsplatActive(${r}.flags)) {
|
|
applyGsplatSkinning(
|
|
${i}.numSplats, ${i}.numBones,
|
|
${i}.skinTexture, ${i}.boneTexture,
|
|
${r}.index, ${r}.center, ${r}.quaternion
|
|
);
|
|
}
|
|
`)}}).outputs.gsplat}function QI({splats:t,extents:A,stepSize:e=1,pointRadius:s=.01,pointShadowScale:n=2,opacity:i=1,color:r}){const o=new h.Vector3,g=new h.Vector3,l=new h.Quaternion(0,0,0,1);r==null&&(r=(u,I)=>u.set(.55+.45*Math.cos(I.x*1),.55+.45*Math.cos(I.y*1),.55+.45*Math.cos(I.z*1)));const c=new h.Color;for(let u=A.min.z;u<A.max.z+1e-6;u+=e)for(let I=A.min.y;I<A.max.y+1e-6;I+=e)for(let E=A.min.x;E<A.max.x+1e-6;E+=e){o.set(E,I,u);for(let B=0;B<2;++B)g.setScalar(s*(B?1:n)),B?typeof r=="function"?r(c,o):c.copy(r):c.setScalar(0),t.pushSplat(o,g,l,i,c)}}function pI({splats:t,scale:A=.25,axisRadius:e=.0075,axisShadowScale:s=2,origins:n=[new h.Vector3]}){const i=new h.Vector3,r=new h.Vector3,a=new h.Quaternion(0,0,0,1),o=new h.Color,g=1;for(const l of n)for(let c=0;c<3;++c){i.set(l.x+(c===0?A:0),l.y+(c===1?A:0),l.z+(c===2?A:0));for(let u=0;u<2;++u)r.set((c===0?A:e)*(u?1:s),(c===1?A:e)*(u?1:s),(c===2?A:e)*(u?1:s)),o.setRGB(u===0?0:c===0?1:0,u===0?0:c===1?1:0,u===0?0:c===2?1:0),t.pushSplat(i,r,a,g,o)}}function fI({splats:t,origin:A=new h.Vector3,radius:e=1,maxDepth:s=3,filter:n=null,pointRadius:i=.02,pointThickness:r=.001,color:a=new h.Color(1,1,1)}){const o={};function g(B){if(n&&!n(B))return;const C=`${B.x},${B.y},${B.z}`;o[C]||(o[C]=B)}function l(B,C,Q,f){if(g(C),g(Q),g(f),B>=s)return;const p=new h.Vector3().addVectors(C,Q).normalize(),d=new h.Vector3().addVectors(Q,f).normalize(),y=new h.Vector3().addVectors(f,C).normalize();l(B+1,C,p,y),l(B+1,p,Q,d),l(B+1,y,d,f),l(B+1,p,d,y)}for(const B of[-1,1])for(const C of[-1,1])for(const Q of[-1,1]){const f=new h.Vector3(B,0,0),p=new h.Vector3(0,C,0),d=new h.Vector3(0,0,Q);l(0,f,p,d)}const c=Object.values(o),u=new h.Vector3(i,i,r),I=new h.Quaternion,E=typeof a=="function"?new h.Color:a;for(const B of c)I.setFromUnitVectors(new h.Vector3(0,0,-1),B),typeof a=="function"&&a(E,B),B.multiplyScalar(e),B.add(A),t.pushSplat(B,u,I,1,E)}function dI({text:t,font:A,fontSize:e,color:s,rgb:n,dotRadius:i,textAlign:r,lineHeight:a,objectScale:o}){A=A??"Arial",e=e??32,s=s??new h.Color(1,1,1),i=i??.8,r=r??"start",a=a??1,o=o??1;const g=t.split(`
|
|
`),l=document.createElement("canvas"),c=l.getContext("2d");if(!c)throw new Error("Failed to create canvas context");c.font=`${e}px ${A}`,c.textAlign=r;const u=c.measureText(""),I=u.fontBoundingBoxAscent+u.fontBoundingBoxDescent;let E=Number.POSITIVE_INFINITY,B=Number.NEGATIVE_INFINITY,C=Number.POSITIVE_INFINITY,Q=Number.NEGATIVE_INFINITY;for(let T=0;T<g.length;++T){const b=c.measureText(g[T]),N=I*a*T;E=Math.min(E,-b.actualBoundingBoxLeft),B=Math.max(B,b.actualBoundingBoxRight),C=Math.min(C,N-b.actualBoundingBoxAscent),Q=Math.max(Q,N+b.actualBoundingBoxDescent)}const f=Math.floor(E),p=Math.floor(C),d=Math.ceil(B)-f,y=Math.ceil(Q)-p;l.width=d,l.height=y,c.font=`${e}px ${A}`,c.textAlign=r,c.textBaseline="alphabetic",c.fillStyle="#FFFFFF";for(let T=0;T<g.length;++T){const b=I*a*T-p;c.fillText(g[T],-f,b)}const M=c.getImageData(0,0,d,y),x=new Uint8Array(M.data.buffer),w=new zA,m=new h.Vector3,k=new h.Vector3().setScalar(i*o),D=new h.Quaternion(0,0,0,1);n=n??new h.Color(1,1,1);let S=0;for(let T=0;T<y;++T)for(let b=0;b<d;++b){const N=x[S+3];if(N>0){const R=N/255;m.set(b-.5*(d-1),.5*(y-1)-T,0),m.multiplyScalar(o),w.pushSplat(m,k,D,R,n)}S+=4}const U=new ct({packedSplats:w});return U.recolor=s,U}function yI({url:t,dotRadius:A,subXY:e,forEachSplat:s}){return A=A??.8,e=Math.max(1,Math.floor(e??1)),new ct({constructSplats:async n=>new Promise((i,r)=>{const a=new Image;a.crossOrigin="anonymous",a.onerror=r,a.onload=()=>{const{width:o,height:g}=a,l=document.createElement("canvas");l.width=o,l.height=g;const c=l.getContext("2d");if(!c){r(new Error("Failed to create canvas context"));return}c.imageSmoothingEnabled=!0,c.imageSmoothingQuality="high";const u=Math.round(o/e),I=Math.round(g/e);c.drawImage(a,0,0,u,I);try{const E=c.getImageData(0,0,u,I),B=new Uint8Array(E.data.buffer),C=new h.Vector3,Q=new h.Vector3().setScalar(A),f=new h.Quaternion(0,0,0,1),p=new h.Color;let d=0;for(let y=0;y<I;++y)for(let M=0;M<u;++M){const x=d*4,w=B[x+3];if(w>0){let m=w/255;p.set(B[x+0]/255,B[x+1]/255,B[x+2]/255),C.set(M-.5*(u-1),.5*(I-1)-y,0),Q.setScalar(A),f.set(0,0,0,1);let k=!0;if(s){const D=s(u,I,d,C,Q,f,m,p);m=D??m,k=D!==null}k&&n.pushSplat(C,Q,f,m,p)}d+=1}i()}catch(E){r(E)}},a.src=t})})}function wI({box:t,cells:A,dotScale:e,color:s,opacity:n}){A.x=Math.max(1,Math.round(A.x)),A.y=Math.max(1,Math.round(A.y)),A.z=Math.max(1,Math.round(A.z)),n=n??1;const i=A.x*A.y*A.z,r=_("int",A.x),a=_("int",A.y);_("int",A.z);const o=qA(0),g=new kt({numSplats:i,generator:TA({index:"int"},{gsplat:AA},({index:c})=>{if(!c)throw new Error("index is undefined");const u=Ke(c,r),I=le(c,r),E=Ke(I,a),B=le(I,a),C=PA({vectorType:"ivec3",x:u,y:E,z:B}),Q=gr(o),f=PA({vectorType:"ivec2",x:c,y:Q}),p=Ia(f),d=_("vec3",t.min),y=_("vec3",t.max),M=ft(y,d),x=le(EA(Qt(C),p),_("vec3",A));let w,m,k;s?(w=_("float",s.r),m=_("float",s.g),k=_("float",s.b)):{r:w,g:m,b:k}=pt(x).outputs;const D=PA({vectorType:"vec4",r:w,g:m,b:k,a:_("float",n)}),S=EA(d,rA(M,x)),U=Qt(_("float",e)),T=_("vec4",new h.Quaternion(0,0,0,1));let b=rt({flags:Ie("uint","GSPLAT_FLAG_ACTIVE"),index:c,center:S,scales:U,quaternion:T,rgba:D});return b=l.applyGsplat(b),{gsplat:b}},{globals:()=>[FA]}),update:({time:c})=>{o.value=c,l.update(g),g.updateVersion()}}),l=new It;return g}const mI={box:new h.Box3(new h.Vector3(-1,-1,-1),new h.Vector3(1,1,1)),density:100,fallDirection:new h.Vector3(-1,-3,1).normalize(),fallVelocity:.02,wanderScale:.04,wanderVariance:2,color1:new h.Color(1,1,1),color2:new h.Color(.5,.5,1),minScale:.001,maxScale:.005,anisoScale:new h.Vector3(1,1,1)},xI={box:new h.Box3(new h.Vector3(-2,-1,-2),new h.Vector3(2,5,2)),density:10,fallDirection:new h.Vector3(0,-1,0),fallVelocity:2,wanderScale:.1,wanderVariance:1,color1:new h.Color(1,1,1),color2:new h.Color(.25,.25,.5),minScale:.005,maxScale:.01,anisoScale:new h.Vector3(.1,1,.1)};function SI({box:t,minY:A,numSplats:e,density:s,anisoScale:n,minScale:i,maxScale:r,fallDirection:a,fallVelocity:o,wanderScale:g,wanderVariance:l,color1:c,color2:u,opacity:I,onFrame:E}){t=t??new h.Box3(new h.Vector3(-1,-1,-1),new h.Vector3(1,1,1));const B=(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(B*s)));const C=qA(i??.001),Q=qA(r??.005),f=et(((n==null?void 0:n.clone())??new h.Vector3(1,1,1)).normalize()),p=et((a??new h.Vector3(0,-1,0)).normalize()),d=qA(o??.02),y=qA(g??.01),M=qA(l??2),x=et(c??new h.Color(1,1,1)),w=et(u??new h.Color(.5,.5,1)),m=qA(I??1),k=qA(0),D=et(new h.Vector3(0,0,0)),S=et(t.min),U=et(t.max),T=qA(A??Number.NEGATIVE_INFINITY),b=ft(U,S),N=new kt({numSplats:e,generator:TA({index:"int"},{gsplat:AA},({index:Z})=>{if(!Z)throw new Error("index not defined");const J=Pe(Z),eA=pt(J).outputs.w;let q=Qt(J),X=ue(rA(eA,_("float",100)));X=Ve(rA(Ie("float","PI"),X)),X=EA(C,rA(X,ft(Q,C)));const L=rA(X,f),j=ue(rA(eA,_("float",10))),V=ue(eA),W=hi(x,w,V),G=rA(W,j),dA=Pe(PA({vectorType:"ivec2",x:Z,y:_("int",6837)}));let lA=Qt(dA),yA=rA(pt(dA).outputs.w,M);yA=EA(k,yA),q=EA(q,D);const wA=li(q,_("vec3",new h.Vector3(1,1,1)));q=EA(S,rA(b,wA));const SA=_("vec4",new h.Quaternion(0,0,0,1));lA=Ve(EA(Qt(yA),lA)),lA=rA(lA,y);let CA=EA(q,lA),_A=pt(CA).outputs.y;_A=ui(T,_A),CA=PA({vector:CA,y:_A});let MA=rt({flags:Ie("uint","GSPLAT_FLAG_ACTIVE"),index:Z,center:CA,scales:L,quaternion:SA,rgb:G,opacity:m});return MA=R.applyGsplat(MA),{gsplat:MA}},{globals:()=>[FA]}),update:({object:Z,time:J,deltaTime:eA})=>{k.value=J,R.update(N);const q=p.value.clone().multiplyScalar(d.value*eA);D.value.add(q),Z.visible=m.value>0,E==null||E({object:Z,time:J,deltaTime:eA}),N.updateVersion()}}),R=new It;return{snow:N,min:S,max:U,minY:T,color1:x,color2:w,opacity:m,fallVelocity:d,wanderVariance:M,wanderScale:y,fallDirection:p,minScale:C,maxScale:Q,anisoScale:f}}const MI=Object.freeze(Object.defineProperty({__proto__:null,DEFAULT_RAIN:xI,DEFAULT_SNOW:mI,snowBox:SI,staticBox:wI},Symbol.toStringTag,{value:"Module"}));function Qo(t){return TA({gsplat:AA},{gsplat:AA},({gsplat:A})=>{if(!A)throw new Error("No gsplat input");let e=ze(A);const s=t.applyGsplat(A),n=Ct(s).outputs.center,i=ze(s),r=zr(n,i),a=Ki(r,_("float",0));e=cs(a,os(e),e);const o=EA(rA(e,_("float",.5)),_("float",.5));return A=rt({gsplat:A,rgb:o}),{gsplat:A}})}function DI(t){t.enableWorldToView=!0,t.worldModifier=Qo(t.context.worldToView),t.updateGenerator()}function po(t,A,e,s){return TA({gsplat:AA},{gsplat:AA},({gsplat:n})=>{if(!n)throw new Error("No gsplat input");let{center:i}=Ct(n).outputs;i=t.apply(i);const{z:r}=pt(i).outputs;let a=Ba(os(r),A,e);return a=cs(s,ft(_("float",1),a),a),n=rt({gsplat:n,r:a,g:a,b:a}),{gsplat:n}})}function vI(t,A,e,s){t.enableWorldToView=!0;const n=_("float",A),i=_("float",e),r=_("bool",s??!1);return t.worldModifier=po(t.context.worldToView,n,i,r),t.updateGenerator(),{minDepth:n,maxDepth:i,reverse:r}}const bI=Object.freeze(Object.defineProperty({__proto__:null,makeDepthColorModifier:po,makeNormalColorModifier:Qo,setDepthColor:vI,setWorldNormalColor:DI},Symbol.toStringTag,{value:"Module"})),Vt=class Vt{static createButton(A,e={}){const s=navigator.xr;if(!s)return null;const n=s,i=document.createElement("button");A.xr.enabled=!0,A.xr.setReferenceSpaceType("local");function r(){let c=null;async function u(B){console.log("onSessionStarted"),B.addEventListener("end",I),await A.xr.setSession(B),i.textContent="EXIT VR",c=B}function I(){console.log("onSessionEnded"),c==null||c.removeEventListener("end",I),i.textContent="ENTER VR",c=null}i.style.display="",i.style.cursor="pointer",i.style.left="calc(50% - 100px)",i.style.width="200px",i.style.height="100px",i.textContent="ENTER VR";const E={...e,optionalFeatures:[...e.optionalFeatures||[]]};i.onmouseenter=()=>{i.style.opacity="1.0"},i.onmouseleave=()=>{i.style.opacity="0.5"},i.onclick=()=>{c===null?(console.log("requesting session"),n.requestSession("immersive-vr",E).then(u)):(console.log("ending session"),c.end())}}function a(){i.style.display="none",i.style.cursor="auto",i.style.left="calc(50% - 75px)",i.style.width="150px",i.onmouseenter=null,i.onmouseleave=null,i.onclick=null}function o(){a(),i.textContent="VR NOT SUPPORTED"}function g(c){a(),console.warn("Exception when trying to call xr.isSessionSupported",c),i.textContent="VR NOT ALLOWED"}function l(c){c.style.position="absolute",c.style.bottom="20px",c.style.padding="12px 6px",c.style.border="1px solid #fff",c.style.borderRadius="4px",c.style.background="rgba(0,0,0,0.1)",c.style.color="#fff",c.style.font="normal 13px sans-serif",c.style.textAlign="center",c.style.opacity="0.5",c.style.outline="none",c.style.zIndex="999"}return i.id="VRButton",i.style.display="none",l(i),n.isSessionSupported("immersive-vr").then(c=>{c?r():o(),c&&Vt.xrSessionIsGranted&&i.click()}).catch(g),i}static registerSessionGrantedListener(){const A=navigator.xr;if(!A)return null;const e=A;/WebXRViewer\//i.test(navigator.userAgent)||e.addEventListener("sessiongranted",()=>{Vt.xrSessionIsGranted=!0})}};Vt.xrSessionIsGranted=!1;let de=Vt;de.registerSessionGrantedListener();const TI=.5,FI=.5,kI=0;var De=(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))(De||{});const Bs=Object.keys(De),NI=Bs.length,UI={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},Ht={w:.02,t0:.02,t1:.014,t2:.0115,t3:.0085,i0:.022,i1:.012,i2:.0085,i3:.0075,i4:.0065,m0:.021,m1:.012,m2:.008,m3:.0075,m4:.0065,r0:.019,r1:.011,r2:.0075,r3:.007,r4:.006,p0:.012,p1:.01,p2:.007,p3:.0065,p4:.0055},fo=[["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"]],yo=[[8,10,8,6],[8,19,14,8,6],[8,19,14,8,6],[8,19,14,8,6],[8,19,14,8,6]],GI=["t3","i4","m4","r4","p4"],RI=["i4","m4","r4","p4"];var Cs=(t=>(t.left="left",t.right="right",t))(Cs||{});const ye=Object.keys(Cs);class YI{constructor(){this.hands={},this.last={},this.values={},this.tests={},this.lastTests={},this.updated=!1}update({xr:A,xrFrame:e}){const s=A.getSession();if(!s)return;const n=A.getReferenceSpace();if(n&&e.getJointPose){this.last=this.hands,this.lastTests=this.tests,this.hands={},this.values={},this.tests={};for(const i of s.inputSources){if(!i.hand)continue;const r=i.handedness;this.hands[r]={};for(const a of Bs){const o=i.hand.get(De[a]);if(o){const g=e.getJointPose(o,n);if(g){const{position:l,orientation:c}=g.transform;this.hands[r][a]={position:new sA.Vector3(l.x,l.y,l.z),quaternion:new sA.Quaternion(c.x,c.y,c.z,c.w),radius:g.radius||.001}}}}}for(const i of ye)for(const{key:r,value:a}of[{key:`${i}AllTips`,value:this.allTipsTouching(i)},{key:`${i}IndexThumb`,value:this.touching(i,"i4",i,"t3")},{key:`${i}MiddleThumb`,value:this.touching(i,"m4",i,"t3")},{key:`${i}RingThumb`,value:this.touching(i,"r4",i,"t3")},{key:`${i}PinkyThumb`,value:this.touching(i,"p4",i,"t3")},{key:`${i}TriTips`,value:this.triTipsTouching(i)}])this.values[r]=a,this.tests[r]=a===1?!0:a===0?!1:this.lastTests[r]??!1}}makeGhostMesh(){const A=new sA.Vector3,e=new sA.Vector3(.01,.01,.01),s=new sA.Quaternion(0,0,0,1),n=new sA.Color(1,1,1),i=Math.PI*3;new sA.Color(1,1,1);let r=1;const a=new ct({onFrame:()=>{let o=0;for(const g of ye){const l=this.hands[g];for(const[c,u]of fo.entries())for(let I=1;I<u.length;++I){const E=yo[c][I-1]*2,B=I+1===u.length,C=l==null?void 0:l[u[I-1]],Q=l==null?void 0:l[u[I]];for(let f=0;f<E;++f){const p=(f+.5)/E;if(r=0,C&&Q){A.copy(C.position).lerp(Q.position,p),s.copy(C.quaternion).slerp(Q.quaternion,p);const d=Ht[u[I-1]],y=Ht[u[I]];let M=(1-p)*d+p*y;B&&p>.8&&(M*=Math.sqrt(1-((p-.8)/.2)**2)),e.set(.65*M,.5*M,.003),n.set(.55+.45*Math.sin(A.x*i),.55+.45*Math.sin(A.y*i),.55+.45*Math.sin(A.z*i)),g==="right"&&n.set(1-n.r,1-n.g,1-n.b),r=.75}a.packedSplats.setSplat(o,A,e,s,r,n),o+=1}}}a.packedSplats.numSplats=o,a.packedSplats.needsUpdate=!0,a.numSplats=o,a.updateVersion()}});return a}distance(A,e,s,n,i=!1){const r=i?this.last[A]:this.hands[A],a=i?this.last[s]:this.hands[s],o=r==null?void 0:r[e],g=a==null?void 0:a[n];return!o||!g?Number.POSITIVE_INFINITY:o.position.distanceTo(g.position)}separation(A,e,s,n,i=!1){const r=this.distance(A,e,s,n,i);return r===Number.POSITIVE_INFINITY?Number.POSITIVE_INFINITY:r-Ht[e]-Ht[n]}touching(A,e,s,n,i=!1){const r=this.separation(A,e,s,n,i);return r===Number.POSITIVE_INFINITY?Number.POSITIVE_INFINITY:1-Math.max(0,Math.min(1,r/.01-kI))}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))}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 _I{constructor({xrHands:A,control:e,moveInertia:s,rotateInertia:n}){this.lastGrip={},this.lastPivot=new sA.Vector3,this.rotateVelocity=0,this.velocity=new sA.Vector3,this.xrHands=A,this.control=e,this.moveInertia=s??TI,this.rotateInertia=n??FI}update(A){var i,r,a,o,g;const e={};for(const l of ye){const c=this.xrHands.hands[l];c&&this.xrHands.tests[`${l}MiddleThumb`]&&(e[l]=new sA.Vector3().add(((i=c.t3)==null?void 0:i.position)??new sA.Vector3).add(((r=c.i4)==null?void 0:r.position)??new sA.Vector3).add(((a=c.m4)==null?void 0:a.position)??new sA.Vector3).add(((o=c.r4)==null?void 0:o.position)??new sA.Vector3).add(((g=c.p4)==null?void 0:g.position)??new sA.Vector3).multiplyScalar(1/5))}if(e.left&&e.right&&this.lastGrip.left&&this.lastGrip.right){const l=e.left.clone().add(e.right).multiplyScalar(.5),c=this.lastGrip.left.clone().add(this.lastGrip.right).multiplyScalar(.5);this.lastPivot=l;const u=l.clone().applyMatrix4(this.control.matrix);u.sub(c.clone().applyMatrix4(this.control.matrix)),u.multiplyScalar(1/A),this.velocity.lerp(u,1-Math.exp(-20*A));const I=Math.atan2(e.left.z-l.z,e.left.x-l.x),E=Math.atan2(this.lastGrip.left.z-c.z,this.lastGrip.left.x-c.x);let B=I-E;B>Math.PI?B-=Math.PI*2:B<-Math.PI&&(B+=Math.PI*2);const C=B/A,Q=Math.exp(-20*A);this.rotateVelocity=this.rotateVelocity*Q+C*(1-Q)}else if(this.rotateVelocity*=Math.exp(-A/this.rotateInertia),e.left&&this.lastGrip.left){const l=e.left.clone().applyMatrix4(this.control.matrix);l.sub(this.lastGrip.left.clone().applyMatrix4(this.control.matrix)),l.multiplyScalar(1/A),this.velocity.lerp(l,1-Math.exp(-20*A))}else if(e.right&&this.lastGrip.right){const l=e.right.clone().applyMatrix4(this.control.matrix);l.sub(this.lastGrip.right.clone().applyMatrix4(this.control.matrix)),l.multiplyScalar(1/A),this.velocity.lerp(l,1-Math.exp(-20*A))}else this.velocity.multiplyScalar(Math.exp(-A/this.moveInertia));const s=this.lastPivot.clone().negate(),n=new sA.Matrix4().makeTranslation(s).premultiply(new sA.Matrix4().makeRotationY(this.rotateVelocity*A)).premultiply(new sA.Matrix4().makeTranslation(this.lastPivot));this.control.matrix.multiply(n),this.control.matrix.decompose(this.control.position,this.control.quaternion,this.control.scale),this.control.updateMatrixWorld(!0),this.control.position.sub(this.velocity.clone().multiplyScalar(A)),this.lastGrip=e}}const JI=1,LI=2,HI=.002,zI=.006,qI=.0015,KI=.15,$I=.15,PI=.1,VI=2,OI=1,ZI=200,XI=400,jI=50,WI={KeyW:new h.Vector3(0,0,-1),KeyS:new h.Vector3(0,0,1),KeyA:new h.Vector3(-1,0,0),KeyD:new h.Vector3(1,0,0),KeyR:new h.Vector3(0,1,0),KeyF:new h.Vector3(0,-1,0)},AB={ArrowUp:new h.Vector3(0,0,-1),ArrowDown:new h.Vector3(0,0,1),ArrowLeft:new h.Vector3(-1,0,0),ArrowRight:new h.Vector3(1,0,0),PageUp:new h.Vector3(0,1,0),PageDown:new h.Vector3(0,-1,0)},tB={KeyQ:new h.Vector3(0,0,1),KeyE:new h.Vector3(0,0,-1)},eB={Home:new h.Vector3(0,-1,0),End:new h.Vector3(0,1,0),Insert:new h.Vector3(-1,0,0),Delete:new h.Vector3(1,0,0)};class sB{constructor({canvas:A}){this.lastTime=0,this.fpsMovement=new wo({}),this.pointerControls=new mo({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 wo{constructor({moveSpeed:A,rollSpeed:e,stickThreshold:s,rotateSpeed:n,keycodeMoveMapping:i,keycodeRotateMapping:r,gamepadMapping:a,capsMultiplier:o,shiftMultiplier:g,ctrlMultiplier:l,xr:c}={}){this.enable=!0,this.moveSpeed=A??JI,this.rollSpeed=e??LI,this.stickThreshold=s??PI,this.rotateSpeed=n??VI,this.keycodeMoveMapping=i??{...WI,...AB},this.keycodeRotateMapping=r??{...tB,...eB},this.gamepadMapping=a??{4:"rollLeft",5:"rollRight",6:"ctrl",7:"shift"},this.capsMultiplier=o??10,this.shiftMultiplier=g??5,this.ctrlMultiplier=l??1/5,this.xr=c,this.keydown={},this.keycode={},document.addEventListener("keydown",u=>{this.keydown[u.key]=!0,this.keycode[u.code]=!0}),document.addEventListener("keyup",u=>{this.keydown[u.key]=!1,this.keycode[u.code]=!1}),window.addEventListener("blur",()=>{this.keydown={},this.keycode={}})}update(A,e){var l,c;if(!this.enable)return;const s=[new h.Vector2,new h.Vector2],n=navigator.getGamepads()[0];n&&(s[0].set(n.axes[0],n.axes[1]),s[1].set(n.axes[2],n.axes[3]));const i=(n==null?void 0:n.buttons.map(u=>u.pressed))||[],r=Array.from(((c=(l=this.xr)==null?void 0:l.getSession())==null?void 0:c.inputSources)??[]);for(const u of r){const I=u.gamepad;if(I)switch(u.handedness){case"none":{s[0].x+=I.axes[0],s[0].y+=I.axes[1],s[1].x+=I.axes[2],s[1].y+=I.axes[3];break}case"left":{s[0].x+=I.axes[2],s[0].y+=I.axes[3];break}case"right":{s[1].x+=I.axes[2],s[1].y+=I.axes[3];break}}}for(const u of s)u.x=Math.abs(u.x)>=this.stickThreshold?u.x:0,u.y=Math.abs(u.y)>=this.stickThreshold?u.y:0;const a=new h.Vector3(s[1].x,s[1].y,0).multiplyScalar(this.rotateSpeed);for(const[u,I]of Object.entries(this.keycodeRotateMapping))this.keycode[u]&&a.add(I);for(const u in this.gamepadMapping)if(i[Number.parseInt(u)])switch(this.gamepadMapping[u]){case"rollLeft":a.z+=1;break;case"rollRight":a.z-=1;break}if(a.multiply(new h.Vector3(this.rotateSpeed,this.rotateSpeed,this.rollSpeed)),a.manhattanLength()>0){a.multiplyScalar(A);const u=new h.Euler().setFromQuaternion(e.quaternion,"YXZ");u.y-=a.x,u.x=Math.max(-Math.PI/2,Math.min(Math.PI/2,u.x-a.y)),u.z=Math.max(-Math.PI,Math.min(Math.PI,u.z+a.z)),e.quaternion.setFromEuler(u)}const o=new h.Vector3(s[0].x,0,s[0].y);for(const[u,I]of Object.entries(this.keycodeMoveMapping))this.keycode[u]&&o.add(I);let g=1;this.keydown.CapsLock&&(g*=this.capsMultiplier),(this.keycode.ShiftLeft||this.keycode.ShiftRight)&&(g*=this.shiftMultiplier),(this.keycode.ControlLeft||this.keycode.ControlRight)&&(g*=this.ctrlMultiplier);for(const u in this.gamepadMapping)if(i[Number.parseInt(u)])switch(this.gamepadMapping[u]){case"shift":g*=this.shiftMultiplier;break;case"ctrl":g*=this.ctrlMultiplier;break}o.applyQuaternion(e.quaternion),e.position.add(o.multiplyScalar(this.moveSpeed*g*A))}}class mo{constructor({canvas:A,rotateSpeed:e,slideSpeed:s,scrollSpeed:n,swapRotateSlide:i,reverseRotate:r,reverseSlide:a,reverseSwipe:o,reverseScroll:g,moveInertia:l,rotateInertia:c,pointerRollScale:u,doublePress:I}){this.enable=!0,this.canvas=A,this.rotateSpeed=e??HI,this.slideSpeed=s??zI,this.scrollSpeed=n??qI,this.swapRotateSlide=i??!1,this.reverseRotate=r??!1,this.reverseSlide=a??!1,this.reverseSwipe=o??!1,this.reverseScroll=g??!1,this.moveInertia=l??$I,this.rotateInertia=c??KI,this.pointerRollScale=u??OI,this.doublePress=I??(()=>{}),this.doublePressLimitMs=XI,this.doublePressDistance=jI,this.lastUp=null,this.rotating=null,this.sliding=null,this.dualPress=!1,this.scroll=new h.Vector3,this.rotateVelocity=new h.Vector3,this.moveVelocity=new h.Vector3,A.addEventListener("pointerdown",B=>{const C=this.getPointerPosition(B),Q=C.clone(),f=C.clone(),p=!this.swapRotateSlide&&!this.rotating&&(B.pointerType!=="mouse"||B.button===0)||this.swapRotateSlide&&this.sliding&&!this.rotating&&(B.pointerType!=="mouse"||B.button===1),{pointerId:d,timeStamp:y}=B;if(p)this.rotating={initial:Q,last:f,position:C,pointerId:d,timeStamp:y},A.setPointerCapture(B.pointerId),this.dualPress=!1;else if(!this.sliding){const M=B.pointerType==="mouse"?B.button:void 0;this.sliding={initial:Q,last:f,position:C,pointerId:d,button:M,timeStamp:y},A.setPointerCapture(B.pointerId),this.dualPress=this.rotating!=null&&y-this.rotating.timeStamp<ZI}});const E=B=>{var f,p;((f=this.rotating)==null?void 0:f.pointerId)===B.pointerId?(this.rotating=null,A.releasePointerCapture(B.pointerId),this.dualPress&&this.sliding&&(A.releasePointerCapture(this.sliding.pointerId),this.sliding=null)):((p=this.sliding)==null?void 0:p.pointerId)===B.pointerId&&(this.sliding=null,A.releasePointerCapture(B.pointerId),this.dualPress&&this.rotating&&(A.releasePointerCapture(this.rotating.pointerId),this.rotating=null));const C=this.getPointerPosition(B),Q=this.lastUp;if(this.lastUp={position:C,time:B.timeStamp},Q&&Q.position.distanceTo(C)<this.doublePressDistance){const y=B.timeStamp-Q.time;y<this.doublePressLimitMs&&(this.lastUp=null,this.doublePress({position:C,intervalMs:y}))}};document.addEventListener("pointerup",E),document.addEventListener("pointercancel",E),document.addEventListener("pointermove",B=>{var C,Q;((C=this.rotating)==null?void 0:C.pointerId)===B.pointerId?this.rotating.position=this.getPointerPosition(B):((Q=this.sliding)==null?void 0:Q.pointerId)===B.pointerId&&(this.sliding.position=this.getPointerPosition(B))}),A.addEventListener("contextmenu",B=>{B.preventDefault()}),A.addEventListener("wheel",B=>{this.scroll.add(new h.Vector3(B.deltaX,B.deltaY,B.deltaZ)),B.preventDefault()})}getPointerPosition(A){const e=this.canvas.getBoundingClientRect();return new h.Vector2(A.clientX-e.left,A.clientY-e.top)}update(A,e){if(!this.enable)return;if(this.dualPress&&this.rotating&&this.sliding){const n=[this.rotating.position.clone().sub(this.rotating.last),this.sliding.position.clone().sub(this.sliding.last)],i=n[0].dot(n[1]);if(i>=.2){const r=n[0].clone().add(n[1]),a=new h.Vector3(r.x,-r.y,0);a.multiplyScalar(this.slideSpeed*(this.reverseSwipe?1:-1)),a.applyQuaternion(e.quaternion),e.position.add(a),this.moveVelocity=a.clone().multiplyScalar(1/A)}else if(i<=-.2){const r=this.sliding.last.clone().sub(this.rotating.last),a=r.length();r.multiplyScalar(1/a).normalize();const o=new h.Vector2(-r.y,r.x),g=[n[0].dot(r),n[1].dot(r)],l=[n[0].dot(o),n[1].dot(o)],c=this.rotating.last.clone().add(this.sliding.last).multiplyScalar(.5);let u=new h.Vector3;if(e instanceof h.Camera){const f=new h.Vector2(c.x/this.canvas.clientWidth*2-1,-(c.y/this.canvas.clientHeight)*2+1),p=new h.Raycaster;p.setFromCamera(f,e),u=p.ray.direction}const I=g[1]-g[0],E=u.multiplyScalar(I*this.slideSpeed);e.position.add(E),this.moveVelocity=E.clone().multiplyScalar(1/A);const B=[Math.atan(l[0]/(-.5*a)),Math.atan(l[1]/(.5*a))],C=.5*(B[0]+B[1])*this.pointerRollScale,Q=new h.Euler().setFromQuaternion(e.quaternion,"YXZ");Q.z=Math.max(-Math.PI,Math.min(Math.PI,Q.z+.5*C)),e.quaternion.setFromEuler(Q)}this.rotating.last.copy(this.rotating.position),this.sliding.last.copy(this.sliding.position)}else{const n=new h.Vector3;if(this.rotating&&!this.dualPress){const r=this.rotating.position.clone().sub(this.rotating.last);this.rotating.last.copy(this.rotating.position),n.set(r.x,r.y,0),n.multiplyScalar(this.rotateSpeed*(this.reverseRotate?-1:1)),this.rotateVelocity=n.clone().multiplyScalar(1/A)}else this.rotateVelocity.multiplyScalar(Math.exp(-A/this.rotateInertia)),n.addScaledVector(this.rotateVelocity,A);const i=new h.Euler().setFromQuaternion(e.quaternion,"YXZ");if(i.y-=n.x,i.x=Math.max(-Math.PI/2,Math.min(Math.PI/2,i.x-n.y)),i.z*=Math.exp(-0*A),e.quaternion.setFromEuler(i),this.sliding&&!this.dualPress){const r=this.sliding.position.clone().sub(this.sliding.last);this.sliding.last.copy(this.sliding.position);const a=this.sliding.button!==2?new h.Vector3(r.x,0,r.y):new h.Vector3(r.x,-r.y,0);a.multiplyScalar(this.slideSpeed*(this.reverseSlide?-1:1)),a.applyQuaternion(e.quaternion),e.position.add(a),this.moveVelocity=a.clone().multiplyScalar(1/A)}else this.moveVelocity.multiplyScalar(Math.exp(-A/this.moveInertia)),e.position.addScaledVector(this.moveVelocity,A)}const s=this.scroll.multiplyScalar(this.scrollSpeed);s.set(s.x,s.z,s.y),this.reverseScroll&&s.multiplyScalar(-1),s.applyQuaternion(e.quaternion),e.position.add(s),this.scroll.set(0,0,0)}}exports.FINGER_TIPS=RI;exports.FpsMovement=wo;exports.HANDS=ye;exports.Hand=Cs;exports.HandMovement=_I;exports.JOINT_IDS=Bs;exports.JOINT_INDEX=UI;exports.JOINT_RADIUS=Ht;exports.JOINT_SEGMENTS=fo;exports.JOINT_SEGMENT_STEPS=yo;exports.JOINT_TIPS=GI;exports.JointEnum=De;exports.LN_SCALE_MAX=NA;exports.LN_SCALE_MIN=kA;exports.NUM_JOINTS=NI;exports.PackedSplats=zA;exports.PlyReader=jt;exports.PointerControls=mo;exports.Readback=Zt;exports.RgbaArray=pe;exports.Sint8ToFloat=Kn;exports.SparkControls=sB;exports.SparkRenderer=Ae;exports.SparkViewpoint=Wt;exports.SplatAccumulator=he;exports.SplatEdit=Xt;exports.SplatEditRgbaBlendMode=Ao;exports.SplatEditSdf=to;exports.SplatEditSdfType=Wa;exports.SplatEdits=eo;exports.SplatFileType=Mt;exports.SplatGenerator=kt;exports.SplatLoader=lo;exports.SplatMesh=ct;exports.SplatModifier=ro;exports.SplatSkinning=BI;exports.SplatTransformer=It;exports.SpzReader=ho;exports.SpzWriter=ZA;exports.Uint8ToFloat=qn;exports.VRButton=de;exports.XrHands=YI;exports.constructAxes=pI;exports.constructGrid=QI;exports.constructSpherePoints=fI;exports.defines=Ec;exports.dyno=dh;exports.flipPixels=jn;exports.floatToSint8=Pt;exports.floatToUint8=bA;exports.fromHalf=fA;exports.generators=MI;exports.getSplatFileType=ls;exports.imageSplats=yI;exports.isAndroid=Zn;exports.isMobile=On;exports.isOculus=Xn;exports.isPcSogs=Zh;exports.modifiers=bI;exports.pixelsToPngUrl=Wn;exports.setPackedSplat=Ce;exports.textSplats=dI;exports.toHalf=at;exports.transcodeSpz=II;exports.unpackSplat=Ee;exports.unpackSplats=hs;exports.utils=Pg;
|
|
//# sourceMappingURL=spark.cjs.min.js.map
|