three-live 1.2.2 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +1 -1
  2. package/dist/index.d.ts +2 -1
  3. package/dist/three-author-engine.js +57 -39
  4. package/dist/three-author.cjs +52 -34
  5. package/dist/three-author.d.ts +2 -1
  6. package/dist/three-author.js +52 -34
  7. package/dist/three-convert.cjs +55 -37
  8. package/dist/three-convert.d.ts +2 -1
  9. package/dist/three-convert.js +55 -37
  10. package/dist/three-live-animation.cjs +7 -7
  11. package/dist/three-live-animation.d.ts +2 -1
  12. package/dist/three-live-animation.js +7 -7
  13. package/dist/three-live-animation.min.js +7 -7
  14. package/dist/three-live-cad.cjs +2 -2
  15. package/dist/three-live-cad.d.ts +2 -1
  16. package/dist/three-live-cad.js +2 -2
  17. package/dist/three-live-cad.min.js +2 -2
  18. package/dist/three-live-element.cjs +24 -6
  19. package/dist/three-live-element.d.ts +2 -1
  20. package/dist/three-live-element.js +24 -6
  21. package/dist/three-live-full.cjs +81 -63
  22. package/dist/three-live-full.js +81 -63
  23. package/dist/three-live-full.min.js +81 -63
  24. package/dist/three-live-studio.cjs +18 -18
  25. package/dist/three-live-studio.d.ts +2 -1
  26. package/dist/three-live-studio.js +18 -18
  27. package/dist/three-live-studio.min.js +18 -18
  28. package/dist/three-live-viewer.cjs +24 -6
  29. package/dist/three-live-viewer.d.ts +2 -1
  30. package/dist/three-live-viewer.js +24 -6
  31. package/dist/three-live-viewer.min.js +24 -6
  32. package/dist/three-live.cjs +55 -37
  33. package/dist/three-live.js +55 -37
  34. package/dist/three-live.min.js +55 -37
  35. package/dist/three-view.cjs +24 -6
  36. package/dist/three-view.d.ts +2 -1
  37. package/dist/three-view.js +24 -6
  38. package/dist/three-xr.cjs +49 -31
  39. package/dist/three-xr.d.ts +2 -1
  40. package/dist/three-xr.js +49 -31
  41. package/package.json +1 -1
package/dist/three-xr.js CHANGED
@@ -14,16 +14,31 @@
14
14
  * See the License for the specific language governing permissions and
15
15
  * limitations under the License.
16
16
  */
17
- function Z(){let n=new Float32Array(16);return n[0]=1,n[5]=1,n[10]=1,n[15]=1,n}function De(n,e,t,r,i){let s=1/Math.tan(e/2);n.fill(0),n[0]=s/t,n[5]=s,n[11]=-1;let a=1/(r-i);return n[10]=(i+r)*a,n[14]=2*i*r*a,n}function Pe(n,e,t,r){let[i,s,a]=e,[u,l,c]=r,[o,h,g]=t,R=i-o,f=s-h,m=a-g,p=Math.hypot(R,f,m);p<=1e-5?(R=0,f=0,m=1):(R/=p,f/=p,m/=p);let L=l*m-c*f,F=c*R-u*m,A=u*f-l*R;p=Math.hypot(L,F,A),p<=1e-5?(L=0,F=0,A=0):(L/=p,F/=p,A/=p);let I=f*A-m*F,x=m*L-R*A,v=R*F-f*L;return p=Math.hypot(I,x,v),p<=1e-5?(I=0,x=0,v=0):(I/=p,x/=p,v/=p),n[0]=L,n[1]=I,n[2]=R,n[3]=0,n[4]=F,n[5]=x,n[6]=f,n[7]=0,n[8]=A,n[9]=v,n[10]=m,n[11]=0,n[12]=-(L*i+F*s+A*a),n[13]=-(I*i+x*s+v*a),n[14]=-(R*i+f*s+m*a),n[15]=1,n}function te(n,e,t){let r=e[0],i=e[1],s=e[2],a=e[3],u=e[4],l=e[5],c=e[6],o=e[7],h=e[8],g=e[9],R=e[10],f=e[11],m=e[12],p=e[13],L=e[14],F=e[15],A=t[0],I=t[1],x=t[2],v=t[3];return n[0]=A*r+I*u+x*h+v*m,n[1]=A*i+I*l+x*g+v*p,n[2]=A*s+I*c+x*R+v*L,n[3]=A*a+I*o+x*f+v*F,A=t[4],I=t[5],x=t[6],v=t[7],n[4]=A*r+I*u+x*h+v*m,n[5]=A*i+I*l+x*g+v*p,n[6]=A*s+I*c+x*R+v*L,n[7]=A*a+I*o+x*f+v*F,A=t[8],I=t[9],x=t[10],v=t[11],n[8]=A*r+I*u+x*h+v*m,n[9]=A*i+I*l+x*g+v*p,n[10]=A*s+I*c+x*R+v*L,n[11]=A*a+I*o+x*f+v*F,A=t[12],I=t[13],x=t[14],v=t[15],n[12]=A*r+I*u+x*h+v*m,n[13]=A*i+I*l+x*g+v*p,n[14]=A*s+I*c+x*R+v*L,n[15]=A*a+I*o+x*f+v*F,n}function we(n,e,t,r){let i=e[0],s=e[1],a=e[2],u=e[3],l=i+i,c=s+s,o=a+a,h=i*l,g=i*c,R=i*o,f=s*c,m=s*o,p=a*o,L=u*l,F=u*c,A=u*o,I=r[0],x=r[1],v=r[2];return n[0]=(1-(f+p))*I,n[1]=(g+A)*I,n[2]=(R-F)*I,n[3]=0,n[4]=(g-A)*x,n[5]=(1-(h+p))*x,n[6]=(m+L)*x,n[7]=0,n[8]=(R+F)*v,n[9]=(m-L)*v,n[10]=(1-(h+f))*v,n[11]=0,n[12]=t[0],n[13]=t[1],n[14]=t[2],n[15]=1,n}function de(n,e){let t=e[0],r=e[1],i=e[2],s=e[4],a=e[5],u=e[6],l=e[8],c=e[9],o=e[10],h=o*a-u*c,g=-o*s+u*l,R=c*s-a*l,f=t*h+r*g+i*R;return f&&(f=1/f,n[0]=h*f,n[1]=g*f,n[2]=R*f,n[3]=(-o*r+i*c)*f,n[4]=(o*t-i*l)*f,n[5]=(-c*t+r*l)*f,n[6]=(u*r-i*a)*f,n[7]=(-u*t+i*s)*f,n[8]=(a*t-r*s)*f),n}function We(n,e){let t=e[0],r=e[1],i=e[2],s=e[3],a=e[4],u=e[5],l=e[6],c=e[7],o=e[8],h=e[9],g=e[10],R=e[11],f=e[12],m=e[13],p=e[14],L=e[15],F=t*u-r*a,A=t*l-i*a,I=t*c-s*a,x=r*l-i*u,v=r*c-s*u,E=i*c-s*l,b=o*m-h*f,S=o*p-g*f,w=o*L-R*f,D=h*p-g*m,M=h*L-R*m,d=g*L-R*p,C=F*d-A*M+I*D+x*w-v*S+E*b;return C?(C=1/C,n[0]=(u*d-l*M+c*D)*C,n[1]=(i*M-r*d-s*D)*C,n[2]=(m*E-p*v+L*x)*C,n[3]=(g*v-h*E-R*x)*C,n[4]=(l*w-a*d-c*S)*C,n[5]=(t*d-i*w+s*S)*C,n[6]=(p*I-f*E-L*A)*C,n[7]=(o*E-g*I+R*A)*C,n[8]=(a*M-u*w+c*b)*C,n[9]=(r*w-t*M-s*b)*C,n[10]=(f*v-m*I+L*F)*C,n[11]=(h*I-o*v-R*F)*C,n[12]=(u*S-a*D-l*b)*C,n[13]=(t*D-r*S+i*b)*C,n[14]=(m*A-f*x-p*F)*C,n[15]=(o*x-h*A+g*F)*C,n):null}function Ue(n,e,t,r,i){let s=i[0]*e+i[4]*t+i[8]*r+i[12],a=i[1]*e+i[5]*t+i[9]*r+i[13],u=i[2]*e+i[6]*t+i[10]*r+i[14],l=i[3]*e+i[7]*t+i[11]*r+i[15],c=l!==0?1/l:1;n[0]=s*c,n[1]=a*c,n[2]=u*c}function $e(n,e,t,r,i,s,a,u,l,c,o,h,g,R,f,m,p=0){let L=c-a,F=o-u,A=h-l,I=g-a,x=R-u,v=f-l,E=i*v-s*x,b=s*I-r*v,S=r*x-i*I,w=L*E+F*b+A*S;if(w>-1e-7&&w<1e-7)return!1;let D=1/w,M=n-a,d=e-u,C=t-l,_=D*(M*E+d*b+C*S);if(_<-p||_>1+p)return!1;let T=d*A-C*F,O=C*L-M*A,U=M*F-d*L,$=D*(r*T+i*O+s*U);if($<-p||_+$>1+p)return!1;let B=D*(I*T+x*O+v*U);if(B>1e-4&&B<m.distance){m.distance=B,m.point=[n+r*B,e+i*B,t+s*B];let H=F*v-A*x,G=A*I-L*v,X=L*x-F*I,q=Math.hypot(H,G,X)||1;return m.normal=[H/q,G/q,X/q],!0}return!1}function Le(n,e){let t=Array.isArray(n?.nodes)?n.nodes.length:0,r=[];for(let o=0;o<t;o++)r.push(Z());if(t===0)return r;let i=new Set;for(let o of n.nodes)if(Array.isArray(o.children))for(let h of o.children)i.add(h);let s=new Set,a=128,u=(o,h,g=0)=>{if(g>a||o<0||o>=t||s.has(o))return;s.add(o);let R=n.nodes[o];if(!R)return;let f=Z();if(e&&e[o])f.set(e[o]);else if(R.matrix&&R.matrix.length===16)f.set(R.matrix);else{let p=R.translation||[0,0,0],L=R.rotation||[0,0,0,1],F=R.scale||[1,1,1];we(f,L,p,F)}let m=r[o];if(h?te(m,h,f):m.set(f),Array.isArray(R.children))for(let p of R.children)typeof p=="number"&&u(p,m,g+1)},l=[],c=n.scenes&&n.scenes[n.scene!==void 0?n.scene:0];if(c&&Array.isArray(c.nodes))l.push(...c.nodes);else for(let o=0;o<t;o++)i.has(o)||l.push(o);for(let o of l)u(o,null);for(let o=0;o<t;o++)!i.has(o)&&!l.includes(o)&&u(o,null);return r}var Fe="__THREE_LIVE_REGISTRY__";function ge(){let n=typeof globalThis<"u"?globalThis:{};if(!n[Fe]){let e={plugins:[],decoders:new Map};try{Object.defineProperty(n,Fe,{value:e,writable:!1,configurable:!1,enumerable:!1})}catch{n[Fe]=e}}return n[Fe]}var ne=ge().plugins;function qe(n){let e=ge().plugins;e.some(t=>t.name===n.name)||e.push(n),n.onRegister?.()}function Ke(){return ge().plugins}function xt(n){return new TextDecoder().decode(n)}var Qe=ge().decoders;function vt(n,e){Qe.set(n.toLowerCase(),e)}function Me(n){return Qe.get(n.toLowerCase())}function Je(n){let e=ArrayBuffer.isView(n)?n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength):n,t=new DataView(e);if(e.byteLength<12)throw new Error(`Invalid GLB buffer size: ${e.byteLength} bytes`);let r=t.getUint32(0,!0);if(r!==1179937895){let g=t.getUint8(0);throw g===123||g===32||g===10||g===13?new Error("[three-live] Multi-file JSON .gltf is not supported for performance reasons. Please pack your asset into a single binary .glb file."):new Error(`Invalid GLB magic: 0x${r.toString(16)}`)}let i=t.getUint32(4,!0);if(i!==2)throw new Error(`Unsupported GLB version: ${i}`);let s=t.getUint32(8,!0),a=12,u=null,l=null;for(;a+8<=s&&a+8<=e.byteLength;){let g=t.getUint32(a,!0),R=t.getUint32(a+4,!0),f=a+8;if(f+g>e.byteLength)throw new Error(`Truncated GLB chunk: required ${f+g} bytes, buffer has ${e.byteLength}`);if(R===1313821514){let m=new Uint8Array(e,f,g),p=xt(m);u=JSON.parse(p,(L,F)=>L==="__proto__"||L==="constructor"||L==="prototype"?void 0:F)}else R===5130562&&(l=e.slice(f,f+g));a=f+g}if(!u)throw new Error("Missing JSON chunk in GLB");let c=u.extensionsRequired||[];if(c.includes("KHR_draco_mesh_compression")&&!Me("draco"))throw new Error("Model requires KHR_draco_mesh_compression. Register a decoder via ThreeLiveElement.registerDecoder('draco', decoder).");if(c.includes("EXT_meshopt_compression")&&!Me("meshopt"))throw new Error("Model requires EXT_meshopt_compression. Register a decoder via ThreeLiveElement.registerDecoder('meshopt', decoder).");if(c.includes("KHR_texture_basisu")&&!Me("ktx2"))throw new Error("Model requires KHR_texture_basisu. Register a decoder via ThreeLiveElement.registerDecoder('ktx2', decoder).");let o=l||new ArrayBuffer(0),h={gltf:u,bin:o,animations:[]};for(let g of ne)g.onParseGLB?.(h);return h}function Mt(n,e,t){return e%4===0?new Float32Array(n,e,t):new Float32Array(n.slice(e,e+t*4))}function Tt(n){return typeof n=="object"&&n!==null&&"gltf"in n&&typeof n.gltf=="object"&&n.gltf!==null&&"bin"in n&&(n.bin instanceof ArrayBuffer||ArrayBuffer.isView(n.bin))}function Re(n){if(Tt(n))return n;if(n instanceof ArrayBuffer||ArrayBuffer.isView(n))return Je(n);throw new TypeError("Invalid 3D model input: expected GLBData ({ gltf, bin }) or binary GLB (ArrayBuffer / ArrayBufferView).")}var et=`#version 300 es
17
+ function re(){let n=new Float32Array(16);return n[0]=1,n[5]=1,n[10]=1,n[15]=1,n}function ve(n,e,t,r,i){let s=1/Math.tan(e/2);n.fill(0),n[0]=s/t,n[5]=s,n[11]=-1;let a=1/(r-i);return n[10]=(i+r)*a,n[14]=2*i*r*a,n}function Me(n,e,t,r){let[i,s,a]=e,[c,o,l]=r,[u,d,f]=t,T=i-u,p=s-d,h=a-f,b=Math.hypot(T,p,h);b<=1e-5?(T=0,p=0,h=1):(T/=b,p/=b,h/=b);let R=o*h-l*p,A=l*T-c*h,v=c*p-o*T;b=Math.hypot(R,A,v),b<=1e-5?(R=0,A=0,v=0):(R/=b,A/=b,v/=b);let D=p*v-h*A,g=h*R-T*v,P=T*A-p*R;return b=Math.hypot(D,g,P),b<=1e-5?(D=0,g=0,P=0):(D/=b,g/=b,P/=b),n[0]=R,n[1]=D,n[2]=T,n[3]=0,n[4]=A,n[5]=g,n[6]=p,n[7]=0,n[8]=v,n[9]=P,n[10]=h,n[11]=0,n[12]=-(R*i+A*s+v*a),n[13]=-(D*i+g*s+P*a),n[14]=-(T*i+p*s+h*a),n[15]=1,n}function se(n,e,t){let r=e[0],i=e[1],s=e[2],a=e[3],c=e[4],o=e[5],l=e[6],u=e[7],d=e[8],f=e[9],T=e[10],p=e[11],h=e[12],b=e[13],R=e[14],A=e[15],v=t[0],D=t[1],g=t[2],P=t[3];return n[0]=v*r+D*c+g*d+P*h,n[1]=v*i+D*o+g*f+P*b,n[2]=v*s+D*l+g*T+P*R,n[3]=v*a+D*u+g*p+P*A,v=t[4],D=t[5],g=t[6],P=t[7],n[4]=v*r+D*c+g*d+P*h,n[5]=v*i+D*o+g*f+P*b,n[6]=v*s+D*l+g*T+P*R,n[7]=v*a+D*u+g*p+P*A,v=t[8],D=t[9],g=t[10],P=t[11],n[8]=v*r+D*c+g*d+P*h,n[9]=v*i+D*o+g*f+P*b,n[10]=v*s+D*l+g*T+P*R,n[11]=v*a+D*u+g*p+P*A,v=t[12],D=t[13],g=t[14],P=t[15],n[12]=v*r+D*c+g*d+P*h,n[13]=v*i+D*o+g*f+P*b,n[14]=v*s+D*l+g*T+P*R,n[15]=v*a+D*u+g*p+P*A,n}function ye(n,e,t,r){let i=e[0],s=e[1],a=e[2],c=e[3],o=i+i,l=s+s,u=a+a,d=i*o,f=i*l,T=i*u,p=s*l,h=s*u,b=a*u,R=c*o,A=c*l,v=c*u,D=r[0],g=r[1],P=r[2];return n[0]=(1-(p+b))*D,n[1]=(f+v)*D,n[2]=(T-A)*D,n[3]=0,n[4]=(f-v)*g,n[5]=(1-(d+b))*g,n[6]=(h+R)*g,n[7]=0,n[8]=(T+A)*P,n[9]=(h-R)*P,n[10]=(1-(d+p))*P,n[11]=0,n[12]=t[0],n[13]=t[1],n[14]=t[2],n[15]=1,n}function me(n,e){let t=e[0],r=e[1],i=e[2],s=e[4],a=e[5],c=e[6],o=e[8],l=e[9],u=e[10],d=u*a-c*l,f=-u*s+c*o,T=l*s-a*o,p=t*d+r*f+i*T;return p&&(p=1/p,n[0]=d*p,n[1]=f*p,n[2]=T*p,n[3]=(-u*r+i*l)*p,n[4]=(u*t-i*o)*p,n[5]=(-l*t+r*o)*p,n[6]=(c*r-i*a)*p,n[7]=(-c*t+i*s)*p,n[8]=(a*t-r*s)*p),n}function Ge(n,e){let t=e[0],r=e[1],i=e[2],s=e[3],a=e[4],c=e[5],o=e[6],l=e[7],u=e[8],d=e[9],f=e[10],T=e[11],p=e[12],h=e[13],b=e[14],R=e[15],A=t*c-r*a,v=t*o-i*a,D=t*l-s*a,g=r*o-i*c,P=r*l-s*c,E=i*l-s*o,y=u*h-d*p,F=u*b-f*p,L=u*R-T*p,C=d*b-f*h,m=d*R-T*h,w=f*R-T*b,S=A*w-v*m+D*C+g*L-P*F+E*y;return S?(S=1/S,n[0]=(c*w-o*m+l*C)*S,n[1]=(i*m-r*w-s*C)*S,n[2]=(h*E-b*P+R*g)*S,n[3]=(f*P-d*E-T*g)*S,n[4]=(o*L-a*w-l*F)*S,n[5]=(t*w-i*L+s*F)*S,n[6]=(b*D-p*E-R*v)*S,n[7]=(u*E-f*D+T*v)*S,n[8]=(a*m-c*L+l*y)*S,n[9]=(r*L-t*m-s*y)*S,n[10]=(p*P-h*D+R*A)*S,n[11]=(d*D-u*P-T*A)*S,n[12]=(c*F-a*C-o*y)*S,n[13]=(t*C-r*F+i*y)*S,n[14]=(h*v-p*g-b*A)*S,n[15]=(u*g-d*v+f*A)*S,n):null}function Pe(n,e,t,r,i){let s=i[0]*e+i[4]*t+i[8]*r+i[12],a=i[1]*e+i[5]*t+i[9]*r+i[13],c=i[2]*e+i[6]*t+i[10]*r+i[14],o=i[3]*e+i[7]*t+i[11]*r+i[15],l=o!==0?1/o:1;n[0]=s*l,n[1]=a*l,n[2]=c*l}function ze(n,e,t,r,i,s,a,c,o,l,u,d,f,T,p,h,b=0){let R=l-a,A=u-c,v=d-o,D=f-a,g=T-c,P=p-o,E=i*P-s*g,y=s*D-r*P,F=r*g-i*D,L=R*E+A*y+v*F;if(L>-1e-7&&L<1e-7)return!1;let C=1/L,m=n-a,w=e-c,S=t-o,M=C*(m*E+w*y+S*F);if(M<-b||M>1+b)return!1;let k=w*v-S*A,_=S*R-m*v,K=m*A-w*R,U=C*(r*k+i*_+s*K);if(U<-b||M+U>1+b)return!1;let O=C*(D*k+g*_+P*K);if(O>1e-4&&O<h.distance){h.distance=O,h.point=[n+r*O,e+i*O,t+s*O];let B=A*P-v*g,q=v*D-R*P,Y=R*g-A*D,W=Math.hypot(B,q,Y)||1;return h.normal=[B/W,q/W,Y/W],!0}return!1}function Te(n,e){let t=Array.isArray(n?.nodes)?n.nodes.length:0,r=[];for(let u=0;u<t;u++)r.push(re());if(t===0)return r;let i=new Set;for(let u of n.nodes)if(Array.isArray(u.children))for(let d of u.children)i.add(d);let s=new Set,a=128,c=(u,d,f=0)=>{if(f>a||u<0||u>=t||s.has(u))return;s.add(u);let T=n.nodes[u];if(!T)return;let p=re();if(e&&e[u])p.set(e[u]);else if(T.matrix&&T.matrix.length===16)p.set(T.matrix);else{let b=T.translation||[0,0,0],R=T.rotation||[0,0,0,1],A=T.scale||[1,1,1];ye(p,R,b,A)}let h=r[u];if(d?se(h,d,p):h.set(p),Array.isArray(T.children))for(let b of T.children)typeof b=="number"&&c(b,h,f+1)},o=[],l=n.scenes&&n.scenes[n.scene!==void 0?n.scene:0];if(l&&Array.isArray(l.nodes))o.push(...l.nodes);else for(let u=0;u<t;u++)i.has(u)||o.push(u);for(let u of o)c(u,null);for(let u=0;u<t;u++)!i.has(u)&&!o.includes(u)&&c(u,null);return r}var Ae="__THREE_LIVE_REGISTRY__";function he(){let n=typeof globalThis<"u"?globalThis:{};if(!n[Ae]){let e={plugins:[],decoders:new Map};try{Object.defineProperty(n,Ae,{value:e,writable:!1,configurable:!1,enumerable:!1})}catch{n[Ae]=e}}return n[Ae]}var ae=he().plugins;function He(n){let e=he().plugins;e.some(t=>t.name===n.name)||e.push(n),n.onRegister?.()}function We(){return he().plugins}var gt={5120:1,5121:1,5122:2,5123:2,5125:4,5126:4};function De(n,e,t,r){if(!t||t.bufferView===void 0)return null;let i=n.bufferViews?.[t.bufferView];if(!i)return null;let s=Number(t.count??0);if(!Number.isInteger(s)||s<=0)return null;let a=t.componentType??5126,c=gt[a];if(!c)throw new RangeError(`glTF accessor has unsupported componentType ${a}`);let o=c*r,l=i.byteStride&&i.byteStride>0?i.byteStride:o,u=(i.byteOffset||0)+(t.byteOffset||0);if(!Number.isInteger(u)||u<0||l<o||u+(s-1)*l+o>e.byteLength)throw new RangeError(`glTF accessor reads past the end of the binary buffer (${e.byteLength} bytes)`);if(a===5126&&l===o&&u%4===0)return new Float32Array(e,u,s*r);let d=new DataView(e),f=t.normalized===!0,T=new Float32Array(s*r);for(let p=0;p<s;p++){let h=u+p*l;for(let b=0;b<r;b++){let R=h+b*c,A;switch(a){case 5126:A=d.getFloat32(R,!0);break;case 5120:A=d.getInt8(R),f&&(A=Math.max(A/127,-1));break;case 5121:A=d.getUint8(R),f&&(A/=255);break;case 5122:A=d.getInt16(R,!0),f&&(A=Math.max(A/32767,-1));break;case 5123:A=d.getUint16(R,!0),f&&(A/=65535);break;default:A=d.getUint32(R,!0),f&&(A/=4294967295)}T[p*r+b]=A}}return T}function Xe(n,e){let t=Number(e.offset?.[0]??0)||0,r=Number(e.offset?.[1]??0)||0,i=Number(e.scale?.[0]??1),s=Number(e.scale?.[1]??1),a=Number(e.rotation??0)||0,c=Math.cos(a),o=Math.sin(a),l=(Number.isFinite(i)?i:1)*c,u=(Number.isFinite(i)?i:1)*o,d=-(Number.isFinite(s)?s:1)*o,f=(Number.isFinite(s)?s:1)*c;for(let T=0;T+1<n.length;T+=2){let p=n[T],h=n[T+1];n[T]=l*p+u*h+t,n[T+1]=d*p+f*h+r}}var Ke=["neutral","reinhard","none","aces","agx"];function Ie(n){let e=String(n??"").trim().toLowerCase();return Ke.includes(e)?e:"neutral"}function xt(n){return Ke.indexOf(Ie(n))}function vt(n){return new TextDecoder().decode(n)}var Ze=he().decoders;function Mt(n,e){Ze.set(n.toLowerCase(),e)}function pe(n){return Ze.get(n.toLowerCase())}function je(n){let e=ArrayBuffer.isView(n)?n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength):n,t=new DataView(e);if(e.byteLength<12)throw new Error(`Invalid GLB buffer size: ${e.byteLength} bytes`);let r=t.getUint32(0,!0);if(r!==1179937895){let f=t.getUint8(0);throw f===123||f===32||f===10||f===13?new Error("[three-live] Multi-file JSON .gltf is not supported for performance reasons. Please pack your asset into a single binary .glb file."):new Error(`Invalid GLB magic: 0x${r.toString(16)}`)}let i=t.getUint32(4,!0);if(i!==2)throw new Error(`Unsupported GLB version: ${i}`);let s=t.getUint32(8,!0),a=12,c=null,o=null;for(;a+8<=s&&a+8<=e.byteLength;){let f=t.getUint32(a,!0),T=t.getUint32(a+4,!0),p=a+8;if(p+f>e.byteLength)throw new Error(`Truncated GLB chunk: required ${p+f} bytes, buffer has ${e.byteLength}`);if(T===1313821514){let h=new Uint8Array(e,p,f),b=vt(h);c=JSON.parse(b,(R,A)=>R==="__proto__"||R==="constructor"||R==="prototype"?void 0:A)}else T===5130562&&(o=e.slice(p,p+f));a=p+f}if(!c)throw new Error("Missing JSON chunk in GLB");let l=c.extensionsRequired||[];if(l.includes("KHR_draco_mesh_compression")&&!pe("draco"))throw new Error("Model requires KHR_draco_mesh_compression. Register a decoder via ThreeLiveElement.registerDecoder('draco', decoder).");for(let f of["EXT_meshopt_compression","KHR_meshopt_compression"])if(l.includes(f)&&!pe("meshopt"))throw new Error(`Model requires ${f}. Register a decoder via ThreeLiveElement.registerDecoder('meshopt', decoder).`);if(l.includes("KHR_texture_basisu")&&!pe("ktx2"))throw new Error("Model requires KHR_texture_basisu. Register a decoder via ThreeLiveElement.registerDecoder('ktx2', decoder).");let u=o||new ArrayBuffer(0),d={gltf:c,bin:u,animations:[]};for(let f of ae)f.onParseGLB?.(d);return d}function Tt(n){return typeof n=="object"&&n!==null&&"gltf"in n&&typeof n.gltf=="object"&&n.gltf!==null&&"bin"in n&&(n.bin instanceof ArrayBuffer||ArrayBuffer.isView(n.bin))}function xe(n){if(Tt(n))return n;if(n instanceof ArrayBuffer||ArrayBuffer.isView(n))return je(n);throw new TypeError("Invalid 3D model input: expected GLBData ({ gltf, bin }) or binary GLB (ArrayBuffer / ArrayBufferView).")}var Qe=`#version 300 es
18
18
  layout(location=0) in vec3 aPosition;
19
19
  layout(location=1) in vec3 aNormal;
20
20
  layout(location=2) in vec2 aUV;
21
21
  uniform mat4 uMVP,uModel;
22
22
  uniform mat3 uNormalMatrix;
23
23
  uniform vec4 uUvTransform;
24
+ layout(location=8) in vec4 aInst0;
25
+ layout(location=9) in vec4 aInst1;
26
+ layout(location=10) in vec4 aInst2;
27
+ layout(location=11) in vec4 aInst3;
28
+ layout(location=12) in vec4 aInstColor;
29
+ uniform int uInstanced;
30
+ uniform mat4 uViewProj;
31
+ out vec4 vInstTint;
32
+ mat4 xrModel(){return uInstanced==1?uModel*mat4(aInst0,aInst1,aInst2,aInst3):uModel;}
33
+ mat4 xrMVP(){return uInstanced==1?uViewProj*xrModel():uMVP;}
34
+ mat3 xrNormalMatrix(){return uInstanced==1?transpose(inverse(mat3(xrModel()))):uNormalMatrix;}
35
+ #define uModel xrModel()
36
+ #define uMVP xrMVP()
37
+ #define uNormalMatrix xrNormalMatrix()
24
38
  out vec3 vNormal,vWorldPos;
25
39
  out vec2 vUV;
26
40
  void main(){
41
+ vInstTint=uInstanced==1?aInstColor:vec4(1.0);
27
42
  vec3 rawN=uNormalMatrix*aNormal;
28
43
  vNormal=length(rawN)>1e-5?normalize(rawN):vec3(0.0);
29
44
  vec4 world=uModel*vec4(aPosition,1.0);
@@ -37,7 +52,9 @@ precision highp float;
37
52
  in vec3 vNormal,vWorldPos;
38
53
  in vec2 vUV;
39
54
  uniform vec4 uBaseColor;
40
- uniform float uMetallic,uRoughness,uEmissive,uEnvIntensity;
55
+ in vec4 vInstTint;
56
+ #define uBaseColor (uBaseColor*vInstTint)
57
+ uniform float uMetallic,uRoughness,uEmissive,uEnvIntensity,uExposure;
41
58
  uniform vec2 uClearcoat;
42
59
  uniform vec3 uCameraPos,uAmbientColor;
43
60
  uniform sampler2D uBaseColorTexture,uMetallicRoughnessTexture,uNormalTexture,uOcclusionTexture,uEnvironmentMap;
@@ -218,6 +235,7 @@ if(uClearcoat.x>0.0){
218
235
  vec3 ccF=F_SchlickRoughness(vec3(0.04),uClearcoat.y,NoV)*uClearcoat.x;
219
236
  color=color*(vec3(1.0)-ccF)+getStudioRadiance(R,uClearcoat.y)*ccF*uEnvIntensity;
220
237
  }
238
+ color*=uExposure;
221
239
  color=applyToneMapping(color,uToneMapping);
222
240
  float outAlpha=base.a;
223
241
  /*XRD_O*/
@@ -229,8 +247,8 @@ void main(){gl_Position=uMVP*vec4(aPosition,1.0);}`,Rt=`#version 300 es
229
247
  precision highp float;
230
248
  uniform vec4 uColorId;
231
249
  out vec4 fragColor;
232
- void main(){fragColor=uColorId;}`;function Ye(n,e,t){let r=n.createShader(e);if(n.shaderSource(r,t),n.compileShader(r),!n.getShaderParameter(r,35713)){let i=n.getShaderInfoLog(r);throw n.deleteShader(r),new Error(`Shader compile error: ${i}`)}return r}function ke(n,e,t){let r=Ye(n,35633,e),i=Ye(n,35632,t),s=n.createProgram();if(n.attachShader(s,r),n.attachShader(s,i),n.linkProgram(s),!n.getProgramParameter(s,35714)){let a=n.getProgramInfoLog(s);throw n.deleteProgram(s),new Error(`Program link error: ${a}`)}return s}function Be(n,e,t){let r={};for(let i of t)r[i]=n.getUniformLocation(e,i);return r}var Ze=["uMVP","uModel","uNormalMatrix","uUvTransform","uBaseColor","uMetallic","uRoughness","uClearcoat","uEmissive","uCameraPos","uBaseColorTexture","uHasTexture","uMetallicRoughnessTexture","uHasMetallicRoughnessTexture","uNormalTexture","uHasNormalTexture","uNormalScale","uOcclusionTexture","uHasOcclusionTexture","uOcclusionStrength","uToneMapping","uEnvironmentMap","uHasEnvironmentMap","uAmbientColor","uNumDirLights","uDirLightDir","uDirLightColor","uNumPointLights","uPointLightPos","uPointLightColor","uEnvIntensity","uViewportSize","uSectionPlane","uSectionEnabled"];function tt(){let n=ge().xrDepthShader;return{fs:At.replace("/*XRD_U*/",n?.uniformsGLSL||"").replace("/*XRD_O*/",n?.occlusionGLSL||""),uniforms:n?[...Ze,...n.uniformNames]:Ze}}function Et(n){if(typeof n!="string")return null;let e=n.trim();if(!e||/[\x00-\x1f\x7f]/.test(e))return null;let t=e.toLowerCase();return t.startsWith("data:")?/^data:image\/(png|jpeg|jpg|webp|ktx2|avif)(;|,)/i.test(e)?e:null:t.startsWith("https://")||t.startsWith("blob:")?e:t.startsWith("//")||/^[a-z][a-z0-9+.-]*:/i.test(e)||/(^|[\\/])\.\.([\\/]|$)/.test(e)?null:e}function Ne(n,e,t,r,i,s,a){if(r===void 0||!e.accessors?.[r])return null;let u=e.accessors[r],l=e.bufferViews[u.bufferView],c=(l.byteOffset||0)+(u.byteOffset||0),o=l.byteStride&&l.byteStride>s*4?l.byteStride>>2:s,h;if(o===s)h=new Float32Array(t,c,u.count*s);else{h=new Float32Array(u.count*s);let R=new Float32Array(t,l.byteOffset||0,Math.floor(l.byteLength/4)),f=(u.byteOffset||0)>>2;for(let m=0;m<u.count;m++){let p=f+m*o;for(let L=0;L<s;L++)h[m*s+L]=R[p+L]}}let g=n.createBuffer();return a.push(g),n.bindBuffer(34962,g),n.bufferData(34962,h,35044),n.enableVertexAttribArray(i),n.vertexAttribPointer(i,s,5126,!1,0,0),h}var Ot=Object.freeze({maxMeshes:1e3,maxTextures:64,maxVertices:1e6,maxIndices:3e6}),nt=Object.freeze({maxMeshes:1/0,maxTextures:1/0,maxVertices:1/0,maxIndices:1/0});function je(n,e,t=nt,r){if(!e||!e.gltf)throw new Error("Invalid GLBData passed to buildGpuScene: missing gltf object.");let{gltf:i}=e,s=Me("meshopt");s?.decodeBufferViews&&s.decodeBufferViews(i,e);let a=e.bin,u=[],l=[],c=i.extensions?.KHR_materials_variants;if(c&&Array.isArray(c.variants))for(let D of c.variants)D&&typeof D.name=="string"&&l.push(D.name);let o=Le(i),h=[];if(Array.isArray(i.nodes))for(let D=0;D<i.nodes.length;D++){let M=i.nodes[D];M.mesh!==void 0&&i.meshes&&i.meshes[M.mesh]&&h.push({node:M,nodeIdx:D,meshIdx:M.mesh})}let g=h.length>0?h:(i.meshes||[]).map((D,M)=>({node:D,nodeIdx:-1,meshIdx:M})),R=[];if(Array.isArray(e.lights)&&e.lights.length>0)R.push(...e.lights);else if(i.extensions?.KHR_lights_punctual?.lights){let D=i.extensions.KHR_lights_punctual.lights;for(let M of D){let d=M.type==="directional"?"directional":M.type==="point"?"point":"ambient";R.push({type:d,color:M.color||[1,1,1],intensity:M.intensity!==void 0?M.intensity:1})}}if(R.length===0&&(R.push({type:"ambient",color:[1,1,1],intensity:.35}),R.push({type:"directional",color:[1,1,1],intensity:.85,direction:[.5,1,.8]})),g.length>t.maxMeshes)throw new Error(`SecurityError: GLB scene exceeds host mesh limit (${t.maxMeshes}). Found: ${g.length}`);let f=[];if(i.textures&&i.images){if(i.textures.length>t.maxTextures)throw new Error(`SecurityError: GLB scene exceeds host texture limit (${t.maxTextures}). Found: ${i.textures.length}`);for(let D=0;D<i.textures.length;D++){let M=i.textures[D],d=i.images[M.source];if(d){let C=n.createTexture();if(n.bindTexture(3553,C),n.texImage2D(3553,0,6408,1,1,0,6408,5121,new Uint8Array([255,255,255,255])),n.texParameteri(3553,10242,10497),n.texParameteri(3553,10243,10497),n.texParameteri(3553,10241,9729),n.texParameteri(3553,10240,9729),d.bufferView!==void 0){let _=i.bufferViews[d.bufferView],T=a.slice(_.byteOffset||0,(_.byteOffset||0)+_.byteLength),O=new Blob([T],{type:d.mimeType||"image/png"});typeof createImageBitmap=="function"&&createImageBitmap(O).then(U=>{n.bindTexture(3553,C),n.texImage2D(3553,0,6408,6408,5121,U),n.generateMipmap(3553),r?.()}).catch(()=>{})}else if(d.uri){let _=Et(d.uri);if(_){let T=new Image;T.crossOrigin="anonymous",T.referrerPolicy="no-referrer",T.onload=()=>{n.bindTexture(3553,C),n.texImage2D(3553,0,6408,6408,5121,T),n.generateMipmap(3553),r?.()},T.src=_}else console.warn("[Three-Live Security] Blocked unsafe glTF image URI:",d.uri)}f.push(C)}else f.push(null)}}let m=[1/0,1/0,1/0],p=[-1/0,-1/0,-1/0],L=0,F=0;for(let D=0;D<g.length;D++){let M=g[D],d=i.meshes[M.meshIdx],C=M.nodeIdx>=0?o[M.nodeIdx]:Z(),_=new Float32Array(9);de(_,C);let T={name:M.node.name||d.name||`Mesh_${M.meshIdx}`,nodeIndex:M.nodeIdx,transform:C,normalMatrix:_,primitives:[],extras:M.node.extras||d.extras},O=M.node?.extensions?.EXT_mesh_gpu_instancing;if(O&&O.attributes&&typeof O.attributes=="object"){let U=O.attributes,$=U.TRANSLATION!==void 0?i.accessors?.[U.TRANSLATION]:null,B=U.ROTATION!==void 0?i.accessors?.[U.ROTATION]:null,H=U.SCALE!==void 0?i.accessors?.[U.SCALE]:null,G=U._COLOR_0!==void 0?i.accessors?.[U._COLOR_0]:null,X=Number($?.count??B?.count??H?.count??0);if(!Number.isFinite(X)||X<0||X>1e4)throw new Error(`SecurityError: EXT_mesh_gpu_instancing exceeds maximum instance limit (10000). Found: ${X}`);if(X>0){let q=(z,K)=>{if(!z||z.bufferView===void 0||!i.bufferViews?.[z.bufferView])return null;let k=(i.bufferViews[z.bufferView].byteOffset||0)+(z.byteOffset||0);return Mt(a,k,X*K)},ee=q($,3),y=q(B,4),P=q(H,3),N=G?.type==="VEC4"?4:3,V=q(G,N),j=new Float32Array(X*16),Q=Z();for(let z=0;z<X;z++){let K=ee?[ee[z*3],ee[z*3+1],ee[z*3+2]]:[0,0,0],se=y?[y[z*4],y[z*4+1],y[z*4+2],y[z*4+3]]:[0,0,0,1],k=P?[P[z*3],P[z*3+1],P[z*3+2]]:[1,1,1];we(Q,se,K,k),j.set(Q,z*16)}if(T.instanceMatrices=j,V){let z=new Float32Array(X*3);for(let K=0;K<X;K++)z[K*3]=V[K*N],z[K*3+1]=V[K*N+1],z[K*3+2]=V[K*N+2];T.instanceColors=z}}}for(let U of d.primitives||[]){if(U.extensions?.KHR_draco_mesh_compression){let Y=Me("draco");Y&&Y.decodePrimitive(i,U,a)}let $=[],B=n.createVertexArray();n.bindVertexArray(B);let H=i.accessors[U.attributes.POSITION],G=Number(H?.count??0);if(!Number.isFinite(G)||G<0||L+G>t.maxVertices)throw new Error(`SecurityError: GLB scene exceeds host vertex limit (${t.maxVertices}).`);if(L+=G,H?.min&&H?.max){let Y=oe=>{for(let ce=0;ce<3;ce++){let pe=oe[12+ce],Ae=oe[12+ce];for(let ve=0;ve<3;ve++){let Ee=oe[ve*4+ce]*H.min[ve],Se=oe[ve*4+ce]*H.max[ve];pe+=Ee<Se?Ee:Se,Ae+=Ee>Se?Ee:Se}pe<m[ce]&&(m[ce]=pe),Ae>p[ce]&&(p[ce]=Ae)}};if(T.instanceMatrices&&T.instanceMatrices.length>=16){let oe=T.instanceMatrices.length>>4,ce=Z();for(let pe=0;pe<oe;pe++){let Ae=T.instanceMatrices.subarray(pe*16,pe*16+16);te(ce,C,Ae),Y(ce)}}else Y(C)}let X=Ne(n,i,a,U.attributes.POSITION,0,3,$);Ne(n,i,a,U.attributes.NORMAL,1,3,$),Ne(n,i,a,U.attributes.TEXCOORD_0,2,2,$);let q=0,ee=5123,y=null;if(U.indices!==void 0){let Y=i.accessors[U.indices],ce=(i.bufferViews[Y.bufferView].byteOffset||0)+(Y.byteOffset||0);if(q=Number(Y.count??0),!Number.isFinite(q)||q<0||F+q>t.maxIndices)throw new Error(`SecurityError: GLB scene exceeds host index limit (${t.maxIndices}).`);F+=q,ee=Y.componentType===5125?5125||5125:5123||5123;let pe=n.createBuffer();$.push(pe),n.bindBuffer(34963,pe),Y.componentType===5125?(y=new Uint32Array(a,ce,Y.count),n.bufferData(34963,y,35044)):(y=new Uint16Array(a,ce,Y.count),n.bufferData(34963,y,35044))}else q=H.count;let P={};for(let Y of ne)if(Y.onBuildPrimitiveVAO){let oe=Y.onBuildPrimitiveVAO(n,B,U,i,a);oe&&(P[Y.name]=oe)}n.bindVertexArray(null);let N=i.materials&&U.material!==void 0?i.materials[U.material]:null,V=tt(),j=et,Q=V.fs,z=!1;for(let Y of ne)if(Y.onResolveShader){let oe=Y.onResolveShader(U,N,j,Q);oe&&(j=oe.vs,Q=oe.fs,z=!0)}let K=z?ke(n,j,Q):null,se=K?Be(n,K,V.uniforms):null,k=N?.pbrMetallicRoughness,ae=k?.baseColorFactor||[.8,.8,.8,1],re=k?.metallicFactor??.1,le=k?.roughnessFactor??.5,me=N?.extensions?.KHR_materials_clearcoat,ie=me?me.clearcoatFactor??1:0,J=Math.max(.04,me?.clearcoatRoughnessFactor??.04),he=k?.baseColorTexture!==void 0&&f[k.baseColorTexture.index]?f[k.baseColorTexture.index]:null,ue=k?.metallicRoughnessTexture!==void 0&&f[k.metallicRoughnessTexture.index]?f[k.metallicRoughnessTexture.index]:null,fe=N?.normalTexture!==void 0&&f[N.normalTexture.index]?f[N.normalTexture.index]:null,be=N?.normalTexture?.scale??1,ye=N?.occlusionTexture!==void 0&&f[N.occlusionTexture.index]?f[N.occlusionTexture.index]:null,Te=N?.occlusionTexture?.strength??1,gt=!!(N?.extensions?.KHR_materials_transmission||P.materials?.isTransmissive),Xe=U.extensions?.KHR_materials_variants?.mappings,yt=Array.isArray(Xe)?Xe.filter(Y=>Y&&typeof Y.material=="number"&&Array.isArray(Y.variants)).map(Y=>({material:Y.material|0,variants:Y.variants.map(oe=>Number(oe)|0)})):void 0;T.primitives.push({vao:B,indexCount:q,indexType:ee,baseColor:ae,metallic:re,roughness:le,clearcoat:ie,clearcoatRoughness:J,positions:X,indices:y,texture:he,metallicRoughnessTexture:ue,normalTexture:fe,occlusionTexture:ye,normalScale:be,occlusionStrength:Te,buffers:$,materialIndex:U.material,defaultMaterialIndex:U.material,variantMappings:yt,pluginData:P,customProgram:K,customUniforms:se,isTransmissive:gt})}u.push(T)}isFinite(m[0])||(m=[-1,-1,-1]),isFinite(p[0])||(p=[1,1,1]);let A=[(m[0]+p[0])/2,(m[1]+p[1])/2,(m[2]+p[2])/2],I=p[0]-m[0],x=p[1]-m[1],v=p[2]-m[2],E=Math.max(Math.hypot(I,x,v)/2,.5),b=[m[0],m[1],m[2]],S=[p[0],p[1],p[2]],w=e.animations;if(!w){for(let D of ne)if(D.onParseGLB?.(e),e.animations){w=e.animations;break}}return w||(w=[]),{meshes:u,bounds:{center:A,radius:E,min:b,max:S},lights:R,animations:w,worldMatrices:o,gpuTextures:f,availableVariants:l}}var Ce=class{constructor(e,t,r){this.meshes=[];this.backdropMeshes=[];this.bounds={center:[0,0,0],radius:1,min:[-1,-1,-1],max:[1,1,1]};this.lights=[];this.modelRootMatrix=Z();this.clearColor=[0,0,0,0];this.envIntensity=1;this.shadowIntensity=0;this.shadowSoftness=.5;this.toneMapping="neutral";this.environmentTexture=null;this.animations=[];this.currentClip=null;this.animationTime=0;this.isPlayingAnimation=!1;this.autoplay=!1;this.animationName="";this.gpuTextures=[];this.availableVariants=[];this.activeVariantName=null;this.gltf=null;this.worldMatrices=[];this.initialNodeTransforms=[];this.projMatrix=Z();this.viewMatrix=Z();this.modelMatrix=Z();this.mvpMatrix=Z();this.normalMatrix=new Float32Array(9);this.initialTheta=.6;this.initialPhi=.35;this.initialDistance=null;this.customDistance=!1;this.distanceMode="auto";this.initialCustomTarget=null;this.customTarget=null;this.fov=Math.PI/4;this.minTheta=-1/0;this.maxTheta=1/0;this.minPhi=-Math.PI*.48;this.maxPhi=Math.PI*.48;this.minDistanceLimit=null;this.maxDistanceLimit=null;this.activePointers=new Map;this.isPanning=!1;this.targetTheta=.6;this.currTheta=.6;this.targetPhi=.35;this.currPhi=.35;this.targetDistance=3;this.currDistance=3;this.autoRotate=!1;this.autoRotateSpeed=Math.PI/6;this.autoRotateDelay=3e3;this.lastInteractionTime=-1/0;this.turntableRotation=0;this.isPointerDown=!1;this.interactive=!0;this.skyboxTexture=null;this.lastPointerX=0;this.lastPointerY=0;this.totalDragDist=0;this.selectedMeshName="";this.pickFbo=null;this.pickTexture=null;this.pickDepth=null;this.pickFboWidth=0;this.pickFboHeight=0;this.animFrameId=null;this.isVisible=!0;this.xrSessionActive=!1;this.lastTime=0;this.lastReportedTheta=-999;this.lastReportedPhi=-999;this.lastReportedZoom=-999;this.boundPointerDown=null;this.boundPointerMove=null;this.boundPointerUp=null;this.boundWheel=null;this.boundKeyDown=null;this.boundContextMenu=null;this.boundSetCamera=null;this.boundResetCamera=null;this.stereoSBS=!1;this.renderErrorReported=!1;this.xrDepthState={enabled:!1,texture:null,uvTransform:Z(),rawValueToMeters:.001,format:0};this.container=e;let i,s;if(t&&typeof t.getContext=="function"?(i=t,s=r):(s=t,i=s?.canvas),!i){let c=e.querySelector("canvas");c||(c=document.createElement("canvas"),c.style.width="100%",c.style.height="100%",c.style.display="block",c.style.touchAction="none",e.prepend(c)),i=c}this.canvas=i,this.opts=s||{},this.opts.clearColor&&(this.clearColor=this.opts.clearColor);let a=typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches;this.opts.autoRotate!==void 0?this.autoRotate=this.opts.autoRotate&&!a:a&&(this.autoRotate=!1),this.opts.autoRotateSpeed!==void 0&&(this.autoRotateSpeed=this.opts.autoRotateSpeed),this.opts.autoRotateDelay!==void 0&&(this.autoRotateDelay=Math.max(0,Number(this.opts.autoRotateDelay)||0)),this.opts.exposure!==void 0&&(this.envIntensity=Math.max(0,Number(this.opts.exposure))),this.opts.camera&&this.setInitialCamera(this.opts.camera.theta,this.opts.camera.phi,this.opts.camera.distance,this.opts.camera.zoom),this.opts.shadowIntensity!==void 0&&(this.shadowIntensity=Math.max(0,Math.min(1,Number(this.opts.shadowIntensity)||0))),this.opts.shadowSoftness!==void 0&&(this.shadowSoftness=Math.max(0,Math.min(1,Number(this.opts.shadowSoftness)||0))),this.opts.toneMapping!==void 0&&(this.toneMapping=this.opts.toneMapping),this.opts.autoplay!==void 0&&(this.autoplay=this.opts.autoplay),this.opts.animationName!==void 0&&(this.animationName=this.opts.animationName),this.opts.variantName!==void 0&&(this.activeVariantName=this.opts.variantName||null),this.opts.fieldOfView!==void 0&&(this.fov=this.opts.fieldOfView*Math.PI/180),this.opts.distanceMode!==void 0&&(this.distanceMode=this.opts.distanceMode),this.opts.cameraTarget!==void 0&&(this.setTarget(this.opts.cameraTarget[0],this.opts.cameraTarget[1],this.opts.cameraTarget[2]),this.initialCustomTarget=[...this.opts.cameraTarget]),(this.opts.minCameraOrbit||this.opts.maxCameraOrbit)&&this.setOrbitLimits({minTheta:this.opts.minCameraOrbit?.theta,maxTheta:this.opts.maxCameraOrbit?.theta,minPhi:this.opts.minCameraOrbit?.phi,maxPhi:this.opts.maxCameraOrbit?.phi,minDistance:this.opts.minCameraOrbit?.distance,maxDistance:this.opts.maxCameraOrbit?.distance});let u=i.getContext("webgl2",{antialias:!0,alpha:!0,xrCompatible:!0});if(!u)throw new Error("WebGL2 not supported");this.gl=u;let l=tt();this.renderProg=ke(u,et,l.fs),this.pickProg=ke(u,wt,Rt),this.uRender=Be(u,this.renderProg,l.uniforms),this.uPick=Be(u,this.pickProg,["uMVP","uColorId"]),this.setupPickingFbo(),this.setupEvents(),this.opts.environmentImage&&this.setEnvironmentImage(this.opts.environmentImage).catch(()=>{}),typeof requestAnimationFrame<"u"&&this.opts.autoStart!==!1&&this.start()}static registerDecoder(e,t){vt(e,t)}static getDecoder(e){return Me(e)}setupPickingFbo(){let e=this.gl;if(typeof e.createFramebuffer!="function")return;this.pickFbo=e.createFramebuffer(),this.pickTexture=e.createTexture(),this.pickDepth=e.createRenderbuffer();let t=Math.max(1,this.canvas.width),r=Math.max(1,this.canvas.height);this.pickFboWidth=t,this.pickFboHeight=r,e.bindTexture(3553,this.pickTexture),e.texImage2D(3553,0,6408,t,r,0,6408,5121,null),e.texParameteri(3553,10241,9728),e.texParameteri(3553,10240,9728),e.bindRenderbuffer(36161,this.pickDepth),e.renderbufferStorage(36161,33189,t,r),e.bindFramebuffer(36160,this.pickFbo),e.framebufferTexture2D(36160,36064,3553,this.pickTexture,0),e.framebufferRenderbuffer(36160,36096,36161,this.pickDepth),e.bindFramebuffer(36160,null)}resizePickingFbo(e,t){if(!this.pickFbo)return;let r=this.gl,i=Math.max(1,e),s=Math.max(1,t);this.pickFboWidth=i,this.pickFboHeight=s,r.bindTexture(3553,this.pickTexture),r.texImage2D(3553,0,6408,i,s,0,6408,5121,null),r.bindRenderbuffer(36161,this.pickDepth),r.renderbufferStorage(36161,33189,i,s)}loadGLBData(e,t){let{meshes:r,bounds:i,lights:s,animations:a,worldMatrices:u,gpuTextures:l,availableVariants:c}=je(this.gl,e,t,()=>this.render());if(this.disposeMeshGpuResources(),this.meshes=r,this.bounds=i,this.turntableRotation=0,this.updateTurntableMatrix(),this.lights=s,this.animations=a||[],this.worldMatrices=u||[],this.gpuTextures=l||[],this.availableVariants=c||[],this.gltf=e.gltf,this.activeVariantName&&this.applyVariantMaterial(this.activeVariantName),this.initialNodeTransforms=[],Array.isArray(e.gltf?.nodes))for(let h of e.gltf.nodes)this.initialNodeTransforms.push({t:h.translation?[h.translation[0],h.translation[1],h.translation[2]]:[0,0,0],r:h.rotation?[h.rotation[0],h.rotation[1],h.rotation[2],h.rotation[3]]:[0,0,0,1],s:h.scale?[h.scale[0],h.scale[1],h.scale[2]]:[1,1,1]});this.autoplay&&this.animations.length>0&&this.playAnimation(this.animationName||void 0);for(let h of ne)h.onLoadModel?.(this,this.gltf);this.customDistance||(this.initialDistance=this.distanceMode==="absolute"?3:i.radius*2.5,this.targetDistance=this.initialDistance,this.currDistance=this.initialDistance);let o=e.exposure??e.environmentIntensity??e.gltf?.extras?.exposure??e.gltf?.extras?.environmentIntensity??e.gltf?.asset?.extras?.exposure??e.gltf?.asset?.extras?.environmentIntensity;o!==void 0&&(this.envIntensity=Math.max(0,Number(o))),this.container&&typeof this.container.hasAttribute=="function"&&this.container.hasAttribute("poster")&&this.container.removeAttribute("poster"),this.resize(),this.update(0),this.render(),this.animFrameId===null&&typeof requestAnimationFrame<"u"&&this.opts.autoStart!==!1&&this.start()}loadGLB(e){this.loadGLBData(Je(e))}clearScene(){this.disposeMeshGpuResources(),this.lights=[],this.animations=[],this.currentClip=null,this.isPlayingAnimation=!1,this.worldMatrices=[],this.gltf=null,this.initialNodeTransforms=[],this.turntableRotation=0,this.updateTurntableMatrix(),this.gl&&this.render()}loadModel(e){this.loadGLBData(Re(e))}setBackdropGLB(e,t){if(this.disposeMeshListGpuResources(this.backdropMeshes),this.backdropMeshes=[],!e){this.update(0),this.render();return}let r=Re(e),{meshes:i}=je(this.gl,r,nt,()=>this.render());if(t)for(let s of i)s.transform[12]+=t[0],s.transform[13]+=t[1],s.transform[14]+=t[2],de(s.normalMatrix,s.transform);this.backdropMeshes=i,this.update(0),this.render()}setClearColor(e,t,r,i=1){this.clearColor=[e,t,r,i]}updateMeshTransforms(e){for(let t=0;t<this.meshes.length;t++){let r=this.meshes[t],i;e instanceof Map?i=e.get(r.name)??e.get(t):Array.isArray(e)?i=e[t]:e&&typeof e=="object"&&(Object.prototype.hasOwnProperty.call(e,r.name)?i=e[r.name]:Object.prototype.hasOwnProperty.call(e,t)&&(i=e[t])),i&&i.length===16&&(r.transform.set(i),de(r.normalMatrix,r.transform))}}bindLights(e=this.uRender){let t=this.gl,r=[.28,.28,.28],i=[],s=[],a=[],u=[];for(let l of this.lights){let c=l.color||[1,1,1],o=l.intensity!==void 0?l.intensity:1;if(l.type==="ambient")r=[c[0]*o,c[1]*o,c[2]*o];else if(l.type==="directional"&&i.length<6){let h=l.direction||[.5,1,.8];i.push(h[0],h[1],h[2]),s.push(c[0]*o,c[1]*o,c[2]*o)}else if(l.type==="point"&&a.length<6){let h=l.position||[0,0,0];a.push(h[0],h[1],h[2]),u.push(c[0]*o,c[1]*o,c[2]*o)}}i.length===0&&(i.push(.5,1,.8),s.push(1,1,1)),t.uniform3fv(e.uAmbientColor,r),t.uniform1i(e.uNumDirLights,i.length/3),i.length>0&&(t.uniform3fv(e.uDirLightDir,i),t.uniform3fv(e.uDirLightColor,s)),t.uniform1i(e.uNumPointLights,a.length/3),a.length>0&&(t.uniform3fv(e.uPointLightPos,a),t.uniform3fv(e.uPointLightColor,u)),t.uniform1f(e.uEnvIntensity,this.envIntensity)}setExposure(e){this.envIntensity=Math.max(0,Number(e))}getExposure(){return this.envIntensity}setShadow(e,t){this.shadowIntensity=Math.max(0,Math.min(1,Number(e)||0)),t!==void 0&&(this.shadowSoftness=Math.max(0,Math.min(1,Number(t)||0)))}getShadowIntensity(){return this.shadowIntensity}getShadowSoftness(){return this.shadowSoftness}setToneMapping(e){this.toneMapping=e}getToneMapping(){return this.toneMapping}async setEnvironmentImage(e){for(let t of ne)if(t.setEnvironmentImage){await t.setEnvironmentImage(this,e);return}}async setSkyboxImage(e){for(let t of ne)if(t.setSkyboxImage){await t.setSkyboxImage(this,e);return}}setInteractive(e){this.interactive=e}isInteractive(){return this.interactive}getCameraOrbit(){let e=this.currTheta,t=this.currPhi,r=this.currDistance;return{theta:e,phi:t,radius:r,toString(){return`${e.toFixed(4)}rad ${t.toFixed(4)}rad ${r.toFixed(4)}m`}}}getCameraTarget(){let e=this.customTarget||this.bounds.center;return{x:e[0],y:e[1],z:e[2],toString(){return`${e[0].toFixed(4)}m ${e[1].toFixed(4)}m ${e[2].toFixed(4)}m`}}}jumpCameraToGoal(){this.currTheta=this.targetTheta,this.currPhi=this.targetPhi,this.currDistance=this.targetDistance,this.update(0),this.render()}getModelMaterials(){let e=this.gltf?.materials?.length?this.gltf.materials:[{name:"DefaultMaterial",pbrMetallicRoughness:{}}];return e.map((t,r)=>{let i=this.meshes.flatMap(o=>o.primitives.filter(h=>h.materialIndex===r||e.length===1&&h.materialIndex===void 0)),s=i[0],a=s?[...s.baseColor]:t.pbrMetallicRoughness?.baseColorFactor||[.8,.8,.8,1],u=s?s.metallic:t.pbrMetallicRoughness?.metallicFactor??.1,l=s?s.roughness:t.pbrMetallicRoughness?.roughnessFactor??.5,c={baseColorFactor:a,metallicFactor:u,roughnessFactor:l,setBaseColorFactor:o=>{let h=[o[0],o[1],o[2],o[3]??1];c.baseColorFactor=h,t.pbrMetallicRoughness&&(t.pbrMetallicRoughness.baseColorFactor=h);for(let g of i)g.baseColor=h;this.render()},setMetallicFactor:o=>{c.metallicFactor=o,t.pbrMetallicRoughness&&(t.pbrMetallicRoughness.metallicFactor=o);for(let h of i)h.metallic=o;this.render()},setRoughnessFactor:o=>{c.roughnessFactor=o,t.pbrMetallicRoughness&&(t.pbrMetallicRoughness.roughnessFactor=o);for(let h of i)h.roughness=o;this.render()}};return{name:t.name||`Material_${r}`,pbrMetallicRoughness:c}})}playAnimation(e){if(this.animations.length!==0){if(e){let t=this.animations.find(r=>r.name===e);t&&(this.currentClip=t)}else this.currentClip||(this.currentClip=this.animations[0]);this.isPlayingAnimation=!0}}pauseAnimation(){this.isPlayingAnimation=!1}getAvailableAnimations(){return this.animations.map(e=>e.name)}getAvailableVariants(){return[...this.availableVariants]}getVariantName(){return this.activeVariantName}selectVariant(e){let t=this.applyVariantMaterial(e);return t&&this.gl&&this.render(),t}applyVariantMaterial(e){let t=e===null||e===""||e==="default",r=-1;if(t)this.activeVariantName=null;else{if(r=this.availableVariants.indexOf(e),r<0)return!1;this.activeVariantName=e}let i=this.gltf?.materials;if(!Array.isArray(i))return t;for(let s of this.meshes)for(let a of s.primitives){let u=a.defaultMaterialIndex;if(!t&&Array.isArray(a.variantMappings)){for(let h of a.variantMappings)if(Array.isArray(h.variants)&&h.variants.includes(r)){u=h.material;break}}if(u===void 0||!i[u]){a.materialIndex=void 0,a.baseColor=[.8,.8,.8,1],a.metallic=.1,a.roughness=.5,a.clearcoat=0,a.clearcoatRoughness=.04,a.texture=null,a.metallicRoughnessTexture=null,a.normalTexture=null,a.normalScale=1,a.occlusionTexture=null,a.occlusionStrength=1,a.isTransmissive=!1;continue}let l=i[u];a.materialIndex=u;let c=l.pbrMetallicRoughness;a.baseColor=c?.baseColorFactor?[c.baseColorFactor[0],c.baseColorFactor[1],c.baseColorFactor[2],c.baseColorFactor[3]??1]:[.8,.8,.8,1],a.metallic=c?.metallicFactor??.1,a.roughness=c?.roughnessFactor??.5;let o=l.extensions?.KHR_materials_clearcoat;a.clearcoat=o?o.clearcoatFactor??1:0,a.clearcoatRoughness=Math.max(.04,o?.clearcoatRoughnessFactor??.04),a.texture=c?.baseColorTexture!==void 0&&this.gpuTextures[c.baseColorTexture.index]?this.gpuTextures[c.baseColorTexture.index]:null,a.metallicRoughnessTexture=c?.metallicRoughnessTexture!==void 0&&this.gpuTextures[c.metallicRoughnessTexture.index]?this.gpuTextures[c.metallicRoughnessTexture.index]:null,a.normalTexture=l.normalTexture!==void 0&&this.gpuTextures[l.normalTexture.index]?this.gpuTextures[l.normalTexture.index]:null,a.normalScale=l.normalTexture?.scale??1,a.occlusionTexture=l.occlusionTexture!==void 0&&this.gpuTextures[l.occlusionTexture.index]?this.gpuTextures[l.occlusionTexture.index]:null,a.occlusionStrength=l.occlusionTexture?.strength??1,a.isTransmissive=!!(l.extensions?.KHR_materials_transmission||a.pluginData?.materials?.isTransmissive)}return!0}setAutoplay(e){this.autoplay=e,e?this.playAnimation(this.animationName||void 0):this.pauseAnimation()}setAnimationName(e){this.animationName=e,(this.isPlayingAnimation||this.autoplay)&&this.playAnimation(e)}evaluateAnimation(e){for(let t of ne)if(t.evaluateAnimation){t.evaluateAnimation(this,e);return}}setTarget(e,t,r){this.customTarget=[e,t,r],this.gl&&(this.meshes.length>0||this.backdropMeshes.length>0)&&(this.update(0),this.render())}getTarget(){return this.customTarget?[...this.customTarget]:null}setFieldOfView(e){let t=Math.max(10,Math.min(90,e));this.fov=t*Math.PI/180}getFieldOfView(){return this.fov*180/Math.PI}setDistanceMode(e){if(this.distanceMode=e,!this.customDistance){let t=this.clampDistance(this.distanceMode==="absolute"?3:this.bounds.radius*2.5);this.initialDistance=t,this.targetDistance=t,this.currDistance=t,this.gl&&(this.meshes.length>0||this.backdropMeshes.length>0)&&(this.update(0),this.render())}}getDistanceMode(){return this.distanceMode}setOrbitLimits(e){e.minTheta!==void 0&&(this.minTheta=e.minTheta*Math.PI/180),e.maxTheta!==void 0&&(this.maxTheta=e.maxTheta*Math.PI/180),e.minPhi!==void 0&&(this.minPhi=Math.max(-Math.PI*.48,e.minPhi*Math.PI/180)),e.maxPhi!==void 0&&(this.maxPhi=Math.min(Math.PI*.48,e.maxPhi*Math.PI/180)),e.minDistance!==void 0&&(this.minDistanceLimit=e.minDistance),e.maxDistance!==void 0&&(this.maxDistanceLimit=e.maxDistance),this.targetTheta=this.clampTheta(this.targetTheta),this.targetPhi=this.clampPhi(this.targetPhi),this.targetDistance=this.clampDistance(this.targetDistance)}getOrbitLimits(){return{minTheta:isFinite(this.minTheta)?this.minTheta*180/Math.PI:void 0,maxTheta:isFinite(this.maxTheta)?this.maxTheta*180/Math.PI:void 0,minPhi:this.minPhi*180/Math.PI,maxPhi:this.maxPhi*180/Math.PI,minDistance:this.minDistanceLimit!==null?this.minDistanceLimit:void 0,maxDistance:this.maxDistanceLimit!==null?this.maxDistanceLimit:void 0}}clampTheta(e){return Math.max(this.minTheta,Math.min(this.maxTheta,e))}clampPhi(e){return Math.max(this.minPhi,Math.min(this.maxPhi,e))}clampDistance(e){let t=this.minDistanceLimit!==null?this.minDistanceLimit:this.bounds?this.bounds.radius*.5:.1,r=this.maxDistanceLimit!==null?this.maxDistanceLimit:this.bounds?this.bounds.radius*8:100;return Math.max(t,Math.min(r,e))}setCamera(e,t,r,i){e!==void 0&&(this.targetTheta=this.clampTheta(e*Math.PI/180)),t!==void 0&&(this.targetPhi=this.clampPhi(t*Math.PI/180)),r!==void 0&&r>0&&(this.targetDistance=this.clampDistance(r)),i!==void 0&&i>0&&(this.targetDistance=this.clampDistance(this.bounds.radius*2.5/i))}setInitialCamera(e,t,r,i){if(e!==void 0&&(this.initialTheta=this.clampTheta(e*Math.PI/180),this.targetTheta=this.initialTheta,this.currTheta=this.initialTheta),t!==void 0&&(this.initialPhi=this.clampPhi(t*Math.PI/180),this.targetPhi=this.initialPhi,this.currPhi=this.initialPhi),r!==void 0&&r>0){let s=this.clampDistance(r);this.initialDistance=s,this.customDistance=!0,this.targetDistance=s,this.currDistance=s}else if(i!==void 0&&i>0){let s=this.clampDistance(this.bounds.radius*2.5/i);this.initialDistance=s,this.customDistance=!0,this.targetDistance=s,this.currDistance=s}else{this.customDistance=!1;let s=this.clampDistance(this.distanceMode==="absolute"?3:this.bounds.radius*2.5);this.initialDistance=s,this.targetDistance=s,this.currDistance=s}this.gl&&(this.meshes.length>0||this.backdropMeshes.length>0)&&(this.update(0),this.render())}resetCamera(){this.targetTheta=this.clampTheta(this.initialTheta),this.targetPhi=this.clampPhi(this.initialPhi),this.initialDistance!==null?this.targetDistance=this.clampDistance(this.initialDistance):this.targetDistance=this.clampDistance(this.bounds.radius*2.5),this.initialCustomTarget?this.customTarget=[...this.initialCustomTarget]:this.customTarget=null,this.turntableRotation=0,this.updateTurntableMatrix()}projectPointToScreen(e,t){let r=Z();te(r,this.projMatrix,this.viewMatrix);let[i,s,a]=e,u=t?t[0]:0,l=t?t[1]:0,c=t?t[2]:0,o=this.modelRootMatrix;o&&(i=o[0]*e[0]+o[4]*e[1]+o[8]*e[2]+o[12],s=o[1]*e[0]+o[5]*e[1]+o[9]*e[2]+o[13],a=o[2]*e[0]+o[6]*e[1]+o[10]*e[2]+o[14],t&&(u=o[0]*t[0]+o[4]*t[1]+o[8]*t[2],l=o[1]*t[0]+o[5]*t[1]+o[9]*t[2],c=o[2]*t[0]+o[6]*t[1]+o[10]*t[2]));let h=r[0]*i+r[4]*s+r[8]*a+r[12],g=r[1]*i+r[5]*s+r[9]*a+r[13],R=r[2]*i+r[6]*s+r[10]*a+r[14],f=r[3]*i+r[7]*s+r[11]*a+r[15];if(f<=1e-4)return{x:0,y:0,z:1,visible:!1};let m=h/f,p=g/f,L=R/f,F=this.canvas.getBoundingClientRect(),A=F.width||this.canvas.clientWidth||this.canvas.width||300,I=F.height||this.canvas.clientHeight||this.canvas.height||150,x=(m*.5+.5)*A,v=(-p*.5+.5)*I,E=m>=-1.1&&m<=1.1&&p>=-1.1&&p<=1.1&&L>=-1&&L<=1;if(E&&t){let b=this.customTarget||this.bounds.center,S=b[0]+this.currDistance*Math.cos(this.currPhi)*Math.sin(this.currTheta),w=b[1]+this.currDistance*Math.sin(this.currPhi),D=b[2]+this.currDistance*Math.cos(this.currPhi)*Math.cos(this.currTheta),M=[i-S,s-w,a-D];u*M[0]+l*M[1]+c*M[2]>.05&&(E=!1)}return{x,y:v,z:L,visible:E}}setSelectedMesh(e){this.selectedMeshName=e||""}getSelectedMesh(){return this.selectedMeshName}setupEvents(){let e=this.canvas;this.boundContextMenu=t=>{t.preventDefault()},e.addEventListener("contextmenu",this.boundContextMenu),this.boundPointerDown=t=>{this.interactive&&(this.isPointerDown=!0,this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now(),this.lastPointerX=t.clientX,this.lastPointerY=t.clientY,this.totalDragDist=0,this.activePointers.set(t.pointerId,{x:t.clientX,y:t.clientY}),this.isPanning=t.button===2||t.shiftKey||this.activePointers.size===2,e.setPointerCapture(t.pointerId))},e.addEventListener("pointerdown",this.boundPointerDown),this.boundPointerMove=t=>{if(!this.isPointerDown||!this.interactive)return;this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now();let r=this.activePointers.get(t.pointerId)||{x:this.lastPointerX,y:this.lastPointerY},i=t.clientX-r.x,s=t.clientY-r.y;if(this.activePointers.set(t.pointerId,{x:t.clientX,y:t.clientY}),this.lastPointerX=t.clientX,this.lastPointerY=t.clientY,this.totalDragDist+=Math.hypot(i,s),this.isPanning||t.button===2||t.shiftKey||this.activePointers.size===2){let a=[this.viewMatrix[0],this.viewMatrix[4],this.viewMatrix[8]],u=[this.viewMatrix[1],this.viewMatrix[5],this.viewMatrix[9]],l=this.customTarget?[...this.customTarget]:[...this.bounds.center],c=this.currDistance/Math.max(e.clientHeight||300,1)*1.5;l[0]+=(-i*a[0]+s*u[0])*c,l[1]+=(-i*a[1]+s*u[1])*c,l[2]+=(-i*a[2]+s*u[2])*c,this.customTarget=l}else this.targetTheta=this.clampTheta(this.targetTheta-i*.008),this.targetPhi=this.clampPhi(this.targetPhi+s*.008)},e.addEventListener("pointermove",this.boundPointerMove),this.boundPointerUp=t=>{this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now(),this.activePointers.delete(t.pointerId),this.activePointers.size===0?(this.isPointerDown=!1,this.isPanning=!1):this.activePointers.size===1&&(this.isPanning=!1);try{e.releasePointerCapture(t.pointerId)}catch{}if(this.totalDragDist<5&&t.button===0){let r=e.getBoundingClientRect(),i=Math.floor((t.clientX-r.left)*(e.width/Math.max(r.width,1))),s=Math.floor((t.clientY-r.top)*(e.height/Math.max(r.height,1)));this.performMeshPick(i,s,!0)}},e.addEventListener("pointerup",this.boundPointerUp),this.boundWheel=t=>{if(!this.interactive)return;t.preventDefault(),this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now();let r=Math.exp(t.deltaY*.001);this.targetDistance=this.clampDistance(this.targetDistance*r)},e.addEventListener("wheel",this.boundWheel,{passive:!1}),this.boundSetCamera=t=>{let r=t.detail||{};r.reset?this.resetCamera():this.setCamera(r.theta,r.phi,r.distance,r.zoom)},this.container.addEventListener("setCamera",this.boundSetCamera),this.boundResetCamera=()=>{this.resetCamera()},this.container.addEventListener("resetCamera",this.boundResetCamera),e.tabIndex!==void 0&&e.tabIndex<0&&(e.tabIndex=0),e.getAttribute?.("role")||e.setAttribute?.("role","region"),e.getAttribute?.("aria-label")||e.setAttribute?.("aria-label","Interactive 3D model viewport"),this.boundKeyDown=t=>{if(!this.interactive)return;let r=typeof performance<"u"?performance.now():Date.now();switch(t.key){case"ArrowLeft":this.lastInteractionTime=r,this.targetTheta=this.clampTheta(this.targetTheta-.1),t.preventDefault();break;case"ArrowRight":this.lastInteractionTime=r,this.targetTheta=this.clampTheta(this.targetTheta+.1),t.preventDefault();break;case"ArrowUp":this.lastInteractionTime=r,this.targetPhi=this.clampPhi(this.targetPhi+.08),t.preventDefault();break;case"ArrowDown":this.lastInteractionTime=r,this.targetPhi=this.clampPhi(this.targetPhi-.08),t.preventDefault();break;case"+":case"=":{this.lastInteractionTime=r,this.targetDistance=this.clampDistance(this.targetDistance*.9),t.preventDefault();break}case"-":case"_":{this.lastInteractionTime=r,this.targetDistance=this.clampDistance(this.targetDistance*1.1),t.preventDefault();break}case"Home":this.lastInteractionTime=r,this.resetCamera(),t.preventDefault();break}},e.addEventListener("keydown",this.boundKeyDown)}teardownEvents(){let e=this.canvas;this.boundContextMenu&&(e.removeEventListener("contextmenu",this.boundContextMenu),this.boundContextMenu=null),this.boundPointerDown&&(e.removeEventListener("pointerdown",this.boundPointerDown),this.boundPointerDown=null),this.boundPointerMove&&(e.removeEventListener("pointermove",this.boundPointerMove),this.boundPointerMove=null),this.boundPointerUp&&(e.removeEventListener("pointerup",this.boundPointerUp),this.boundPointerUp=null),this.boundWheel&&(e.removeEventListener("wheel",this.boundWheel),this.boundWheel=null),this.boundKeyDown&&(e.removeEventListener("keydown",this.boundKeyDown),this.boundKeyDown=null),this.boundSetCamera&&(this.container.removeEventListener("setCamera",this.boundSetCamera),this.boundSetCamera=null),this.boundResetCamera&&(this.container.removeEventListener("resetCamera",this.boundResetCamera),this.boundResetCamera=null)}raycastFromScreenPoint(e,t){let r=this.canvas,i=r.getBoundingClientRect(),s=r.width||300,a=r.height||300,u=i.width>0?Math.floor((e-i.left)*(s/i.width)):Math.floor(e),l=i.height>0?Math.floor((t-i.top)*(a/i.height)):Math.floor(t);return this.performMeshPick(u,l,!1)}performMeshPick(e,t,r=!0){if(this.meshes.length===0)return null;let i=this.gl,s=Math.max(1,this.canvas.width||300),a=Math.max(1,this.canvas.height||300);e=this.mapStereoPickX(e,s);let u=Z();te(u,this.projMatrix,this.viewMatrix);let l=[],c=Math.max(0,Math.min(s-1,e)),o=Math.max(0,Math.min(a-1,a-1-t));if(this.pickFbo&&i&&!this.xrSessionActive){(this.pickFboWidth!==s||this.pickFboHeight!==a)&&this.resizePickingFbo(s,a),i.bindFramebuffer(36160,this.pickFbo),i.viewport(0,0,s,a),i.enable(2929),i.clearColor(0,0,0,0),i.clear(16384|256),i.useProgram(this.pickProg);for(let b=0;b<this.meshes.length;b++){let S=this.meshes[b];if(S.visible===!1||S.isPluginMesh)continue;let w=b+1,D=(w&255)/255,M=(w>>8&255)/255,d=(w>>16&255)/255;i.uniform4f(this.uPick.uColorId,D,M,d,1),te(this.modelMatrix,this.modelRootMatrix,S.transform);let C=S.instanceMatrices;if(C&&C.length>=16){let _=C.length>>4,T=Z();for(let O of S.primitives){i.bindVertexArray(O.vao);for(let U=0;U<_;U++)te(T,this.modelMatrix,C.subarray(U*16,U*16+16)),te(this.mvpMatrix,u,T),i.uniformMatrix4fv(this.uPick.uMVP,!1,this.mvpMatrix),O.indices?i.drawElements(4,O.indexCount,O.indexType,0):i.drawArrays(4,0,O.indexCount)}}else{te(this.mvpMatrix,u,this.modelMatrix),i.uniformMatrix4fv(this.uPick.uMVP,!1,this.mvpMatrix);for(let _ of S.primitives)i.bindVertexArray(_.vao),_.indices?i.drawElements(4,_.indexCount,_.indexType,0):i.drawArrays(4,0,_.indexCount)}}let v=new Uint8Array(4);i.readPixels(c,o,1,1,6408,5121,v),i.bindFramebuffer(36160,null);let E=v[0]+(v[1]<<8)+(v[2]<<16);E>0&&E<=this.meshes.length&&(l=[this.meshes[E-1]])}l.length===0&&(l=this.meshes.filter(v=>v.visible!==!1));let h=null,g=1/0,R=[0,0,0],f=[0,1,0],m=this.customTarget||this.bounds.center,p=m[0]+this.currDistance*Math.cos(this.currPhi)*Math.sin(this.currTheta),L=m[1]+this.currDistance*Math.sin(this.currPhi),F=m[2]+this.currDistance*Math.cos(this.currPhi)*Math.cos(this.currTheta),A=Z();for(let v of l){te(A,this.modelRootMatrix,v.transform);let E=v.instanceMatrices,b=E&&E.length>=16?E.length>>4:1;for(let S=0;S<b;S++){E&&E.length>=16?te(this.modelMatrix,A,E.subarray(S*16,S*16+16)):this.modelMatrix.set(A),te(this.mvpMatrix,u,this.modelMatrix);let w=Z();if(!We(w,this.mvpMatrix))continue;let D=(c+.5)/s*2-1,M=(o+.5)/a*2-1,d=[0,0,0],C=[0,0,0];Ue(d,D,M,-1,w),Ue(C,D,M,1,w);let _=C[0]-d[0],T=C[1]-d[1],O=C[2]-d[2],U=Math.hypot(_,T,O)||1,$=_/U,B=T/U,H=O/U,G={distance:1/0,point:[0,0,0],normal:[0,1,0]};if((q=>{for(let ee of v.primitives){if(!ee.positions)continue;let y=ee.positions,P=ee.indices,N=Math.floor(P?P.length/3:y.length/9);for(let V=0;V<N;V++){let j=P?P[V*3]:V*3,Q=P?P[V*3+1]:V*3+1,z=P?P[V*3+2]:V*3+2;$e(d[0],d[1],d[2],$,B,H,y[j*3],y[j*3+1],y[j*3+2],y[Q*3],y[Q*3+1],y[Q*3+2],y[z*3],y[z*3+1],y[z*3+2],G,q)}}})(1e-4),isFinite(G.distance)){let q=G.point[0],ee=G.point[1],y=G.point[2],P=this.modelMatrix,N=P[0]*q+P[4]*ee+P[8]*y+P[12],V=P[1]*q+P[5]*ee+P[9]*y+P[13],j=P[2]*q+P[6]*ee+P[10]*y+P[14],Q=N-p,z=V-L,K=j-F,se=Math.hypot(Q,z,K);if(se<g){de(this.normalMatrix,this.modelMatrix);let k=this.normalMatrix,ae=G.normal[0],re=G.normal[1],le=G.normal[2],me=k[0]*ae+k[3]*re+k[6]*le,ie=k[1]*ae+k[4]*re+k[7]*le,J=k[2]*ae+k[5]*re+k[8]*le,he=Math.hypot(me,ie,J)||1;me/=he,ie/=he,J/=he,me*Q+ie*z+J*K>0&&(me=-me,ie=-ie,J=-J),h=v,g=Math.round(se*1e3)/1e3,R=[Math.round(N*1e3)/1e3,Math.round(V*1e3)/1e3,Math.round(j*1e3)/1e3],f=[Math.round(me*1e3)/1e3,Math.round(ie*1e3)/1e3,Math.round(J*1e3)/1e3]}}}}if(!h)return null;let x={meshIndex:this.meshes.indexOf(h),meshName:h.name,nodeIndex:h.nodeIndex,distance:g,hitPoint:R,normal:f,screenX:e,screenY:t};if(r){for(let v of ne)v.onMeshSelect?.(this,x);this.opts.onMeshClick&&this.opts.onMeshClick(x),typeof CustomEvent<"u"&&typeof this.container.dispatchEvent=="function"&&this.container.dispatchEvent(new CustomEvent("meshClick",{bubbles:!0,detail:x}))}return x}mapStereoPickX(e,t){if(!this.stereoSBS||this.xrSessionActive||t<2)return e;let r=Math.max(1,Math.floor(t*.5)),i=e>=r,s=i?e-r:e,a=i?Math.max(1,t-r):r,u=(s+.5)/a*2-1;return Math.floor((u*.5+1)*.5*t)}setStereoSBS(e){this.stereoSBS=!!e,this.xrSessionActive||(this.syncCameraMatrices(),this.render())}syncCameraMatrices(){let e=Math.max(1,this.canvas.width||1)/Math.max(1,this.canvas.height||1),t=this.backdropMeshes.length>0?Math.max(this.bounds.radius*20,120):Math.max(this.bounds.radius*20,10);De(this.projMatrix,this.fov,e,.1,t);let r=this.customTarget||this.bounds.center,i=r[0]+this.currDistance*Math.cos(this.currPhi)*Math.sin(this.currTheta),s=r[1]+this.currDistance*Math.sin(this.currPhi),a=r[2]+this.currDistance*Math.cos(this.currPhi)*Math.cos(this.currTheta);Pe(this.viewMatrix,[i,s,a],r,[0,1,0]),te(this.mvpMatrix,this.projMatrix,this.viewMatrix),de(this.normalMatrix,this.modelMatrix)}resize(){let e=Math.min((typeof window<"u"?window.devicePixelRatio:1)||1,2),t=this.canvas.getBoundingClientRect(),r=Math.max(1,Math.floor(t.width*e)),i=Math.max(1,Math.floor(t.height*e));this.canvas.width!==r||this.canvas.height!==i?(this.canvas.width=r,this.canvas.height=i,this.resizePickingFbo(r,i),this.xrSessionActive||this.syncCameraMatrices()):!this.xrSessionActive&&this.projMatrix[0]===0&&this.syncCameraMatrices()}getGLContext(){return this.gl}setXRSessionActive(e){let t=this.xrSessionActive;if(this.xrSessionActive=e,t&&!e){this.xrDepthState.enabled=!1;for(let r of ne)r.onXRSessionEnd?.(this);if(this.lastTime=typeof performance<"u"?performance.now():Date.now(),this.updateTurntableMatrix(),this.isVisible)try{this.resize(),this.syncCameraMatrices(),this.render()}catch(r){this.reportRenderError(r)}}}reportRenderError(e){this.renderErrorReported||(this.renderErrorReported=!0,typeof console<"u"&&console.warn("[three-live] render frame failed:",e))}stepXRUpdate(e){for(let t of ne)t.onUpdate?.(this,e)}start(){if(this.animFrameId!==null)return;this.lastTime=typeof performance<"u"?performance.now():Date.now();let e=t=>{if(this.animFrameId===null)return;let r=Math.min(Math.max((t-this.lastTime)/1e3,0),.1);if(this.lastTime=t,this.isVisible&&!this.xrSessionActive)try{this.resize(),this.update(r),this.render()}catch(i){this.reportRenderError(i)}this.animFrameId!==null&&(this.animFrameId=requestAnimationFrame(e))};this.animFrameId=requestAnimationFrame(e)}stop(){this.animFrameId!==null&&(cancelAnimationFrame(this.animFrameId),this.animFrameId=null)}setAutoRotate(e){this.autoRotate=e}getAutoRotate(){return this.autoRotate}setAutoRotateSpeed(e){this.autoRotateSpeed=e}getAutoRotateSpeed(){return this.autoRotateSpeed}setAutoRotateDelay(e){this.autoRotateDelay=Math.max(0,Number(e)||0)}getAutoRotateDelay(){return this.autoRotateDelay}resetTurntableRotation(e=0){this.turntableRotation=Number(e)||0,this.updateTurntableMatrix(),this.render()}updateTurntableMatrix(){let e=Math.cos(this.turntableRotation),t=Math.sin(this.turntableRotation),r=this.bounds.center[0],i=this.bounds.center[2],s=this.modelRootMatrix;s[0]=e,s[1]=0,s[2]=-t,s[3]=0,s[4]=0,s[5]=1,s[6]=0,s[7]=0,s[8]=t,s[9]=0,s[10]=e,s[11]=0,s[12]=r-(e*r+t*i),s[13]=0,s[14]=i-(-t*r+e*i),s[15]=1}setVisible(e){this.isVisible=e}update(e){for(let a of ne)a.onUpdate?.(this,e);let t=typeof performance<"u"?performance.now():Date.now();if(!this.isPointerDown&&this.autoRotate&&t-this.lastInteractionTime>=this.autoRotateDelay){this.turntableRotation+=this.autoRotateSpeed*e,this.updateTurntableMatrix();for(let a of ne)a.onCameraChange?.(this,this.container)}this.currTheta+=(this.targetTheta-this.currTheta)*.12,this.currPhi+=(this.targetPhi-this.currPhi)*.12,this.currDistance+=(this.targetDistance-this.currDistance)*.12,this.syncCameraMatrices();let r=Math.round((this.currTheta*180/Math.PI%360+360)%360),i=Math.round(this.currPhi*180/Math.PI),s=Math.round(this.bounds.radius*2.5/this.currDistance*100)/100;if(Math.abs(r-this.lastReportedTheta)>=1||Math.abs(i-this.lastReportedPhi)>=1||Math.abs(s-this.lastReportedZoom)>=.02){this.lastReportedTheta=r,this.lastReportedPhi=i,this.lastReportedZoom=s;let a={theta:r,phi:i,zoom:s,distance:Math.round(this.currDistance*100)/100};this.opts.onCameraChange&&this.opts.onCameraChange(a),typeof CustomEvent<"u"&&typeof this.container.dispatchEvent=="function"&&this.container.dispatchEvent(new CustomEvent("cameraChange",{bubbles:!0,detail:a}))}}renderXRView(e,t,r,i,s=!0,a=0){this.onBeforeRenderXRView&&this.onBeforeRenderXRView(e);let u=e?.transform?.inverse?.matrix||this.viewMatrix,l=e?.projectionMatrix||this.projMatrix,c=e?.transform?.position,o=c?[c.x,c.y,c.z]:[0,1.6,0];t?this.modelRootMatrix.set(t):r&&t&&this.modelRootMatrix.set(t),this.render({viewMatrix:u,projMatrix:l,eyePos:o,viewport:i,eye:e?.eye||"none",clear:a>0?!1:e?.eye!=="right",isAR:s})}render(e){if(!e&&this.stereoSBS){let I=Math.max(2,this.canvas.width||2),x=Math.max(1,this.canvas.height||1),v=Math.max(1,Math.floor(I*.5)),E=Math.max(1,I-v),b=this.backdropMeshes.length>0?Math.max(this.bounds.radius*20,120):Math.max(this.bounds.radius*20,10),S=this.customTarget||this.bounds.center,w=S[0]+this.currDistance*Math.cos(this.currPhi)*Math.sin(this.currTheta),D=S[1]+this.currDistance*Math.sin(this.currPhi),M=S[2]+this.currDistance*Math.cos(this.currPhi)*Math.cos(this.currTheta),d=Math.cos(this.currTheta),C=-Math.sin(this.currTheta),_=.032,T=Z(),O=Z(),U=[w-d*_,D,M-C*_],$=[S[0]-d*_*.25,S[1],S[2]-C*_*.25];De(T,this.fov,v/x,.1,b),Pe(O,U,$,[0,1,0]);let B=Z(),H=Z(),G=[w+d*_,D,M+C*_],X=[S[0]+d*_*.25,S[1],S[2]+C*_*.25];De(B,this.fov,E/x,.1,b),Pe(H,G,X,[0,1,0]),this.render({viewMatrix:O,projMatrix:T,eyePos:U,viewport:[0,0,v,x],eye:"left",clear:!0,isAR:!1}),this.render({viewMatrix:H,projMatrix:B,eyePos:G,viewport:[v,0,E,x],eye:"right",clear:!1,isAR:!1}),this.gl.viewport(0,0,I,x);return}let t=this.gl,r=0,i=0,s=this.canvas.width,a=this.canvas.height;e?.viewport?(r=e.viewport[0],i=e.viewport[1],s=e.viewport[2],a=e.viewport[3],t.viewport(r,i,s,a)):t.viewport(0,0,this.canvas.width,this.canvas.height),t.enable(2929),(!e||e.clear!==!1)&&(e?.isAR?t.clearColor(0,0,0,0):t.clearColor(this.clearColor[0],this.clearColor[1],this.clearColor[2],this.clearColor[3]),t.clear(16384|256));let u=Z(),l=e?.viewMatrix??this.viewMatrix;te(u,e?.projMatrix??this.projMatrix,l);let c=ge().xrDepthShader,o=this.toneMapping==="reinhard"?1:this.toneMapping==="none"?2:this.toneMapping==="aces"?3:this.toneMapping==="agx"?4:0,h=this.customTarget||this.bounds.center,g=e?e.eyePos[0]:h[0]+this.currDistance*Math.cos(this.currPhi)*Math.sin(this.currTheta),R=e?e.eyePos[1]:h[1]+this.currDistance*Math.sin(this.currPhi),f=e?e.eyePos[2]:h[2]+this.currDistance*Math.cos(this.currPhi)*Math.cos(this.currTheta);for(let I of ne)I.onBeforeDrawScene?.(this,t,u,[g,R,f],o);let m=e?.isAR?0:this.backdropMeshes.length;if(this.meshes.length===0&&m===0)return;let p=e?.eye||"none",L=!1,F=m>0?[...this.backdropMeshes,...this.meshes]:this.meshes,A=I=>{for(let x=0;x<F.length;x++){let v=F[x];if(v.visible===!1)continue;let E=this.selectedMeshName!==""&&v.name===this.selectedMeshName;x<m||v.worldSpace===!0||v.name==="__xr_reticle__"?this.modelMatrix.set(v.transform):te(this.modelMatrix,this.modelRootMatrix,v.transform),te(this.mvpMatrix,u,this.modelMatrix),de(v.normalMatrix,this.modelMatrix);let b=v.extras?.xr?.stereo||v.userData?.xr?.stereo,S=0,w=0,D=1,M=1;b==="sbs"?(D=.5,S=p==="right"?.5:0):b==="ou"&&(M=.5,w=p==="right"?.5:0);for(let d of v.primitives){let C=!!d.isTransmissive;if(!I&&C){L=!0;continue}if(I&&!C)continue;let _=d.customProgram||this.renderProg,T=d.customUniforms||this.uRender;t.useProgram(_),t.uniform1i(T.uToneMapping,o),t.uniform1f(T.uEnvIntensity,this.envIntensity),t.uniform3f(T.uCameraPos,g,R,f),t.uniform1f(T.uEmissive,E?1:0),t.uniformMatrix4fv(T.uMVP,!1,this.mvpMatrix),t.uniformMatrix4fv(T.uModel,!1,this.modelMatrix),t.uniformMatrix3fv(T.uNormalMatrix,!1,v.normalMatrix),T.uUvTransform&&t.uniform4f(T.uUvTransform,S,w,D,M),T.uViewportSize&&t.uniform2f(T.uViewportSize,Math.max(1,s),Math.max(1,a)),c?.bind(t,T,this.xrDepthState,l,[r,i,Math.max(1,s),Math.max(1,a)]),this.environmentTexture?(t.activeTexture(33988),t.bindTexture(3553,this.environmentTexture),t.uniform1i(T.uEnvironmentMap,4),t.uniform1i(T.uHasEnvironmentMap,1)):t.uniform1i(T.uHasEnvironmentMap,0),this.bindLights(T),T.uSectionEnabled&&t.uniform1i(T.uSectionEnabled,0);for(let U of ne)U.onBeforeDrawPrimitive?.(t,_,d,v,this.worldMatrices||[],this.gltf);t.uniform4fv(T.uBaseColor,d.baseColor),t.uniform1f(T.uMetallic,d.metallic),t.uniform1f(T.uRoughness,d.roughness),T.uClearcoat&&t.uniform2f(T.uClearcoat,d.clearcoat??0,d.clearcoatRoughness??.04),d.texture?(t.activeTexture(33984),t.bindTexture(3553,d.texture),t.uniform1i(T.uBaseColorTexture,0),t.uniform1i(T.uHasTexture,1)):t.uniform1i(T.uHasTexture,0),d.metallicRoughnessTexture?(t.activeTexture(33985),t.bindTexture(3553,d.metallicRoughnessTexture),t.uniform1i(T.uMetallicRoughnessTexture,1),t.uniform1i(T.uHasMetallicRoughnessTexture,1)):t.uniform1i(T.uHasMetallicRoughnessTexture,0),d.normalTexture?(t.activeTexture(33986),t.bindTexture(3553,d.normalTexture),t.uniform1i(T.uNormalTexture,2),t.uniform1i(T.uHasNormalTexture,1),t.uniform1f(T.uNormalScale,d.normalScale)):t.uniform1i(T.uHasNormalTexture,0),d.occlusionTexture?(t.activeTexture(33987),t.bindTexture(3553,d.occlusionTexture),t.uniform1i(T.uOcclusionTexture,3),t.uniform1i(T.uHasOcclusionTexture,1),t.uniform1f(T.uOcclusionStrength,d.occlusionStrength)):t.uniform1i(T.uHasOcclusionTexture,0),t.bindVertexArray(d.vao);let O=v.instanceMatrices;if(O&&O.length>=16){let U=O.length>>4,$=v.instanceColors,B=Z(),H=new Float32Array(9),G=[d.baseColor[0],d.baseColor[1],d.baseColor[2],d.baseColor[3]];for(let X=0;X<U;X++)te(B,this.modelMatrix,O.subarray(X*16,X*16+16)),te(this.mvpMatrix,u,B),de(H,B),t.uniformMatrix4fv(T.uMVP,!1,this.mvpMatrix),t.uniformMatrix4fv(T.uModel,!1,B),t.uniformMatrix3fv(T.uNormalMatrix,!1,H),$&&(G[0]=d.baseColor[0]*$[X*3],G[1]=d.baseColor[1]*$[X*3+1],G[2]=d.baseColor[2]*$[X*3+2],G[3]=d.baseColor[3],t.uniform4fv(T.uBaseColor,G)),d.indices?t.drawElements(4,d.indexCount,d.indexType,0):t.drawArrays(4,0,d.indexCount)}else d.indices?t.drawElements(4,d.indexCount,d.indexType,0):t.drawArrays(4,0,d.indexCount)}}};if(A(!1),L){for(let I of ne)I.onBeforeTransmissivePass?.(t,this);A(!0)}for(let I of ne)I.onAfterRender?.(t,this,u)}disposeMeshListGpuResources(e,t){let r=this.gl,i=new Set,s=a=>{a&&!i.has(a)&&(i.add(a),r.deleteTexture(a))};for(let a of e)for(let u of a.primitives){if(u.vao&&r.deleteVertexArray(u.vao),u.buffers)for(let l of u.buffers)r.deleteBuffer(l);s(u.texture),s(u.metallicRoughnessTexture),s(u.normalTexture),s(u.occlusionTexture),u.customProgram&&r.deleteProgram(u.customProgram)}if(t)for(let a of t)s(a)}disposeMeshGpuResources(){this.disposeMeshListGpuResources(this.meshes,this.gpuTextures),this.meshes=[],this.gpuTextures=[],this.availableVariants=[]}disposeGpuResources(){let e=this.gl;this.disposeMeshGpuResources(),this.disposeMeshListGpuResources(this.backdropMeshes),this.backdropMeshes=[];for(let t of ne)t.onDestroy?.(e,this);this.environmentTexture&&(e.deleteTexture(this.environmentTexture),this.environmentTexture=null),this.renderProg&&e.deleteProgram(this.renderProg),this.pickProg&&e.deleteProgram(this.pickProg),this.pickFbo&&e.deleteFramebuffer(this.pickFbo),this.pickTexture&&e.deleteTexture(this.pickTexture),this.pickDepth&&e.deleteRenderbuffer(this.pickDepth),this.pickFbo=null,this.pickTexture=null,this.pickDepth=null}dispose(){this.stop(),this.teardownEvents(),this.disposeGpuResources()}destroy(){this.dispose()}};Ce.registerPlugin=qe,Ce.getRegisteredPlugins=Ke;function Ge(n){return new TextEncoder().encode(n)}function St(n,e){n.updateMatrixWorld(!0);let t=[];return n.traverse(r=>{if(r.geometry){let i=r.geometry,s=i.attributes.position;if(!s||s.count===0)return;let a=s.count,u=new Float32Array(a*3),l=r.matrixWorld.elements;for(let b=0;b<a;b++){let S=s.getX(b),w=s.getY(b),D=s.getZ(b);u[b*3]=l[0]*S+l[4]*w+l[8]*D+l[12],u[b*3+1]=l[1]*S+l[5]*w+l[9]*D+l[13],u[b*3+2]=l[2]*S+l[6]*w+l[10]*D+l[14]}let c;if(i.attributes.normal){let b=i.attributes.normal;c=new Float32Array(a*3);let S=new Float32Array(9);de(S,l);for(let w=0;w<a;w++){let D=b.getX(w),M=b.getY(w),d=b.getZ(w),C=S[0]*D+S[3]*M+S[6]*d,_=S[1]*D+S[4]*M+S[7]*d,T=S[2]*D+S[5]*M+S[8]*d,O=Math.hypot(C,_,T)||1;c[w*3]=C/O,c[w*3+1]=_/O,c[w*3+2]=T/O}}let o;if(i.attributes.uv){let b=i.attributes.uv;o=new Float32Array(a*2);for(let S=0;S<a;S++)o[S*2]=b.getX(S),o[S*2+1]=b.getY(S)}let h;if(i.index)h=i.index.array;else{h=a>65535?new Uint32Array(a):new Uint16Array(a);for(let b=0;b<a;b++)h[b]=b}let g="DefaultMaterial",R=[.8,.8,.8],f=.5,m=.1,p=0,L=0,F=1.5,A=1,I=[0,0,0];if(r.material){let b=r.material;g=b.name||`Material_${t.length}`,b.color&&(R=[b.color.r,b.color.g,b.color.b]),typeof b.roughness=="number"&&(f=b.roughness),typeof b.metalness=="number"&&(m=b.metalness),typeof b.clearcoat=="number"&&(p=b.clearcoat),typeof b.clearcoatRoughness=="number"&&(L=b.clearcoatRoughness),typeof b.ior=="number"&&(F=b.ior);let S=typeof b.opacity=="number"?b.opacity:1,w=typeof b.transmission=="number"?b.transmission:0;if(A=S*(1-w),b.emissive&&(b.emissive.r>0||b.emissive.g>0||b.emissive.b>0)){let D=b.emissiveIntensity??1;I=[b.emissive.r*D,b.emissive.g*D,b.emissive.b*D]}}let x,v=e?.animateCallback||e?.animateFn||(typeof n.userData?.animate=="function"?n.userData.animate:typeof n.__animateFn=="function"?n.__animateFn:typeof globalThis.animate=="function"?globalThis.animate:void 0);if(typeof v=="function"){let b=e?.duration??4,S=e?.fps??4,w=Math.max(2,Math.round(b*S)+1),D=[],M=[],d=[],C=[],_=[r.position.x,r.position.y,r.position.z],T=[r.quaternion.x,r.quaternion.y,r.quaternion.z,r.quaternion.w],O=[r.scale.x,r.scale.y,r.scale.z],U=!1;for(let $=0;$<w;$++){let B=$/(w-1)*b;D.push(B);try{v(B)}catch{}M.push([r.position.x,r.position.y,r.position.z]),d.push([r.quaternion.x,r.quaternion.y,r.quaternion.z,r.quaternion.w]),C.push([r.scale.x,r.scale.y,r.scale.z]),(Math.abs(r.position.x-_[0])>1e-4||Math.abs(r.position.y-_[1])>1e-4||Math.abs(r.position.z-_[2])>1e-4||Math.abs(r.quaternion.x-T[0])>1e-4||Math.abs(r.quaternion.y-T[1])>1e-4||Math.abs(r.quaternion.z-T[2])>1e-4||Math.abs(r.quaternion.w-T[3])>1e-4||Math.abs(r.scale.x-O[0])>1e-4)&&(U=!0)}r.position.set(_[0],_[1],_[2]),r.quaternion.set(T[0],T[1],T[2],T[3]),r.scale.set(O[0],O[1],O[2]),U&&(x={times:D,translations:M,rotations:d,scales:C})}let E=r;if(E.isInstancedMesh&&typeof E.count=="number"&&E.count>0&&E.instanceMatrix?.array){let b=Math.min(1e3,Math.floor(E.count)),S=E.instanceMatrix.array,w=E.instanceColor?.array,D=r.name||`Mesh_${t.length}`,M=new Float32Array(16),d=new Float32Array(9);for(let C=0;C<b;C++){let _=S.subarray(C*16,(C+1)*16);te(M,l,_);let T=new Float32Array(a*3);for(let B=0;B<a;B++){let H=s.getX(B),G=s.getY(B),X=s.getZ(B);T[B*3]=M[0]*H+M[4]*G+M[8]*X+M[12],T[B*3+1]=M[1]*H+M[5]*G+M[9]*X+M[13],T[B*3+2]=M[2]*H+M[6]*G+M[10]*X+M[14]}let O;if(i.attributes.normal){let B=i.attributes.normal;O=new Float32Array(a*3),de(d,M);for(let H=0;H<a;H++){let G=B.getX(H),X=B.getY(H),q=B.getZ(H),ee=d[0]*G+d[3]*X+d[6]*q,y=d[1]*G+d[4]*X+d[7]*q,P=d[2]*G+d[5]*X+d[8]*q,N=Math.hypot(ee,y,P)||1;O[H*3]=ee/N,O[H*3+1]=y/N,O[H*3+2]=P/N}}let U=R,$=g;w&&w.length>=(C+1)*3&&(U=[R[0]*w[C*3],R[1]*w[C*3+1],R[2]*w[C*3+2]],$=`${g}_inst_${C}`),t.push({name:`${D}_${C}`,positions:T,indices:h,normals:O,uvs:o,materialName:$,color:U,roughness:f,metallic:m,clearcoat:p,clearcoatRoughness:L,ior:F,opacity:A,emissiveColor:I,xrTraits:r.userData?.xr})}return}t.push({name:r.name||`Mesh_${t.length}`,positions:u,indices:h,normals:c,uvs:o,materialName:g,color:R,roughness:f,metallic:m,clearcoat:p,clearcoatRoughness:L,ior:F,opacity:A,emissiveColor:I,xrTraits:r.userData?.xr,timeSamples:x})}}),t}function st(n){let e=[],t=n.gltf,r=ge().decoders.get("meshopt");r&&typeof r.decodeBufferViews=="function"&&r.decodeBufferViews(t,n);let i=n.bin,s=i instanceof ArrayBuffer?i:i.buffer.slice(i.byteOffset,i.byteOffset+i.byteLength),a=t.accessors||[],u=t.bufferViews||[],l=t.materials||[],c=t.meshes||[],o=t.nodes||[];function h(f){let m=a[f];if(!m)throw new Error(`Accessor ${f} not found`);let p=u[m.bufferView||0],L=(p.byteOffset||0)+(m.byteOffset||0),F=p.byteLength||0,A=s.slice(L,L+F);return{acc:m,buffer:A}}let g=new Map;if(o.length>0){let f=Le(t);for(let m=0;m<f.length;m++)g.set(m,f[m])}function R(f,m,p,L){let F=c[f];if(!F)return;let A=new Float32Array(9);de(A,m);for(let I=0;I<(F.primitives||[]).length;I++){let x=F.primitives[I],v=x.attributes?.POSITION;if(v===void 0)continue;let{acc:E,buffer:b}=h(v),S=new Float32Array(b,0,E.count*3),w=new Float32Array(S.length);for(let y=0;y<E.count;y++){let P=S[y*3],N=S[y*3+1],V=S[y*3+2];w[y*3]=m[0]*P+m[4]*N+m[8]*V+m[12],w[y*3+1]=m[1]*P+m[5]*N+m[9]*V+m[13],w[y*3+2]=m[2]*P+m[6]*N+m[10]*V+m[14]}let D,M=x.attributes?.NORMAL;if(M!==void 0){let{acc:y,buffer:P}=h(M),N=new Float32Array(P,0,y.count*3);D=new Float32Array(N.length);for(let V=0;V<y.count;V++){let j=N[V*3],Q=N[V*3+1],z=N[V*3+2],K=A[0]*j+A[3]*Q+A[6]*z,se=A[1]*j+A[4]*Q+A[7]*z,k=A[2]*j+A[5]*Q+A[8]*z,ae=Math.hypot(K,se,k)||1;D[V*3]=K/ae,D[V*3+1]=se/ae,D[V*3+2]=k/ae}}let d,C=x.attributes?.TEXCOORD_0;if(C!==void 0){let{acc:y,buffer:P}=h(C);d=new Float32Array(P,0,y.count*2)}let _;if(x.indices!==void 0){let{acc:y,buffer:P}=h(x.indices);y.componentType===5125?_=new Uint32Array(P,0,y.count):_=new Uint16Array(P,0,y.count);let N=E.count;for(let V of _)if(V>=N)throw new Error(`SecurityError: Index buffer value (${V}) out of vertex bounds [0, ${N}).`)}else{let y=E.count;_=y>65535?new Uint32Array(y):new Uint16Array(y);for(let P=0;P<y;P++)_[P]=P}let T="DefaultMaterial",O=[.8,.8,.8],U=.5,$=.1,B=0,H=0,G=1.5,X=1,q=[0,0,0];if(x.material!==void 0&&l[x.material]){let y=l[x.material];T=y.name||`Material_${x.material}`;let P=y.pbrMetallicRoughness||{},N=1;Array.isArray(P.baseColorFactor)&&(O=[P.baseColorFactor[0],P.baseColorFactor[1],P.baseColorFactor[2]],typeof P.baseColorFactor[3]=="number"&&(N=P.baseColorFactor[3])),typeof P.roughnessFactor=="number"&&(U=P.roughnessFactor),typeof P.metallicFactor=="number"&&($=P.metallicFactor),Array.isArray(y.emissiveFactor)&&y.emissiveFactor.length>=3&&(q=[y.emissiveFactor[0],y.emissiveFactor[1],y.emissiveFactor[2]]);let V=y.extensions||{};V.KHR_materials_clearcoat&&(B=V.KHR_materials_clearcoat.clearcoatFactor??0,H=V.KHR_materials_clearcoat.clearcoatRoughnessFactor??0),V.KHR_materials_ior&&typeof V.KHR_materials_ior.ior=="number"&&(G=V.KHR_materials_ior.ior);let j=V.KHR_materials_transmission?.transmissionFactor??0;X=N*(1-j)}let ee=(F.primitives||[]).length>1?`${p}_p${I}`:p;e.push({name:ee,positions:w,indices:_,normals:D,uvs:d,materialName:T,color:O,roughness:U,metallic:$,clearcoat:B,clearcoatRoughness:H,ior:G,opacity:X,emissiveColor:q,xrTraits:L?.xr||F.extras?.xr})}}if(o.length>0)for(let f=0;f<o.length;f++){let m=o[f];if(m.mesh!==void 0&&m.mesh<c.length){let p=g.get(f)||Z(),L=m.name||c[m.mesh].name||`Node_${f}`,F=m.extensions?.EXT_mesh_gpu_instancing?.attributes;if(F&&typeof F=="object"){let A=F.TRANSLATION,I=F.ROTATION,x=F.SCALE,v=A!==void 0?(()=>{let{acc:w,buffer:D}=h(A);return new Float32Array(D,0,w.count*3)})():null,E=I!==void 0?(()=>{let{acc:w,buffer:D}=h(I);return new Float32Array(D,0,w.count*4)})():null,b=x!==void 0?(()=>{let{acc:w,buffer:D}=h(x);return new Float32Array(D,0,w.count*3)})():null,S=Math.min(1e3,v?v.length/3:E?E.length/4:b?b.length/3:0);if(S>0){let w=new Float32Array(16),D=new Float32Array(16);for(let M=0;M<S;M++){let d=v?[v[M*3],v[M*3+1],v[M*3+2]]:[0,0,0],C=E?[E[M*4],E[M*4+1],E[M*4+2],E[M*4+3]]:[0,0,0,1],_=b?[b[M*3],b[M*3+1],b[M*3+2]]:[1,1,1];we(w,C,d,_),te(D,p,w),R(m.mesh,D,`${L}_${M}`,m.extras)}continue}}R(m.mesh,p,L,m.extras)}}else{let f=Z();for(let m=0;m<c.length;m++){let p=c[m].name||`Mesh_${m}`;R(m,f,p,c[m].extras)}}return e}function Ve(n,e){if(!n||typeof n!="string")return e;let t=n.replace(/[^A-Za-z0-9_]/g,"_");return/^[0-9]/.test(t)&&(t="_"+t),t||e}function rt(n){return String(n??"").replace(/[\x00-\x1f\x7f]/g,"").replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function W(n){if(!Number.isFinite(n)||Math.abs(n)<1e-7)return"0";let e=Number(n.toFixed(5)).toString();return e.indexOf(".")===-1?`${e}.0`:e}function it(n){let e=n.length/3,t=new Array(e);for(let r=0;r<e;r++)t[r]=`(${W(n[r*3])}, ${W(n[r*3+1])}, ${W(n[r*3+2])})`;return t.join(", ")}function Dt(n,e){let t=new Array(e);for(let r=0;r<e;r++)t[r]=`(${W(n[r*2])}, ${W(1-n[r*2+1])})`;return t.join(", ")}function Pt(n){return Array.from(n).join(", ")}function Oe(n){let e=new Map;for(let l of n){let c=Ve(l.materialName,"DefaultMaterial");e.has(c)||e.set(c,{color:l.color||[.8,.8,.8],roughness:l.roughness??.5,metallic:l.metallic??0,clearcoat:l.clearcoat??0,clearcoatRoughness:l.clearcoatRoughness??0,ior:l.ior??1.5,opacity:l.opacity??1,emissiveColor:l.emissiveColor||[0,0,0]})}let t=0,r=null;for(let l of n){if(l.timeSamples&&l.timeSamples.times.length>0){let c=l.timeSamples.times[l.timeSamples.times.length-1];c>t&&(t=c)}l.xrTraits?.anchor&&!r&&(r=l.xrTraits.anchor==="vertical"||l.xrTraits.anchor==="wall"?"vertical":"horizontal")}let i="";t>0&&(i=`startTimeCode = 0
233
- endTimeCode = ${W(t)}
250
+ void main(){fragColor=uColorId;}`;function $e(n,e,t){let r=n.createShader(e);if(n.shaderSource(r,t),n.compileShader(r),!n.getShaderParameter(r,35713)){let i=n.getShaderInfoLog(r);throw n.deleteShader(r),new Error(`Shader compile error: ${i}`)}return r}function _e(n,e,t){let r=$e(n,35633,e),i=$e(n,35632,t),s=n.createProgram();if(n.attachShader(s,r),n.attachShader(s,i),n.linkProgram(s),!n.getProgramParameter(s,35714)){let a=n.getProgramInfoLog(s);throw n.deleteProgram(s),new Error(`Program link error: ${a}`)}return s}function Ne(n,e,t){let r={};for(let i of t)r[i]=n.getUniformLocation(e,i);return r}var qe=["uMVP","uModel","uInstanced","uViewProj","uNormalMatrix","uUvTransform","uBaseColor","uMetallic","uRoughness","uClearcoat","uEmissive","uCameraPos","uBaseColorTexture","uHasTexture","uMetallicRoughnessTexture","uHasMetallicRoughnessTexture","uNormalTexture","uHasNormalTexture","uNormalScale","uOcclusionTexture","uHasOcclusionTexture","uOcclusionStrength","uToneMapping","uEnvironmentMap","uHasEnvironmentMap","uAmbientColor","uNumDirLights","uDirLightDir","uDirLightColor","uNumPointLights","uPointLightPos","uPointLightColor","uEnvIntensity","uExposure","uViewportSize","uSectionPlane","uSectionEnabled"];function Je(){let n=he().xrDepthShader;return{fs:At.replace("/*XRD_U*/",n?.uniformsGLSL||"").replace("/*XRD_O*/",n?.occlusionGLSL||""),uniforms:n?[...qe,...n.uniformNames]:qe}}function Et(n){if(typeof n!="string")return null;let e=n.trim();if(!e||/[\x00-\x1f\x7f]/.test(e))return null;let t=e.toLowerCase();return t.startsWith("data:")?/^data:image\/(png|jpeg|jpg|webp|ktx2|avif)(;|,)/i.test(e)?e:null:t.startsWith("https://")||t.startsWith("blob:")?e:t.startsWith("//")||/^[a-z][a-z0-9+.-]*:/i.test(e)||/(^|[\\/])\.\.([\\/]|$)/.test(e)?null:e}function Fe(n,e,t,r,i,s,a,c){if(r===void 0||!e.accessors?.[r])return null;let o=De(e,t,e.accessors[r],s);if(!o)return null;c&&(o=o.slice(),Xe(o,c));let l=n.createBuffer();return a.push(l),n.bindBuffer(34962,l),n.bufferData(34962,o,35044),n.enableVertexAttribArray(i),n.vertexAttribPointer(i,s,5126,!1,0,0),o}function Ce(n){let e=Number(n);return Number.isFinite(e)?Math.max(0,e):1}function et(n,e,t){let r=Je(),i=Qe,s=r.fs,a=!1;for(let o of ae)if(o.onResolveShader){let l=o.onResolveShader(e,t,i,s);l&&(i=l.vs,s=l.fs,a=!0)}let c=a?_e(n,i,s):null;return{program:c,uniforms:c?Ne(n,c,r.uniforms):null}}function Lt(n,e,t){let r=e.instanceMatrices;if(!r||r.length<16||typeof n.vertexAttribDivisor!="function"||typeof n.drawElementsInstanced!="function")return!1;let i=r.length>>4,s=e.instanceColors,a=new Float32Array(i*20);for(let o=0;o<i;o++)a.set(r.subarray(o*16,o*16+16),o*20),a[o*20+16]=s?s[o*3]:1,a[o*20+17]=s?s[o*3+1]:1,a[o*20+18]=s?s[o*3+2]:1,a[o*20+19]=1;let c=n.createBuffer();t.push(c),n.bindBuffer(34962,c),n.bufferData(34962,a,35044);for(let o=0;o<5;o++)n.enableVertexAttribArray(8+o),n.vertexAttribPointer(8+o,4,5126,!1,80,o*16),n.vertexAttribDivisor(8+o,1);return!0}function St(n,e){let t=n.materials?.[e?.material];if(!t)return null;let r=[t.pbrMetallicRoughness?.baseColorTexture,t.pbrMetallicRoughness?.metallicRoughnessTexture,t.normalTexture,t.occlusionTexture,t.emissiveTexture];for(let i of r){let s=i?.extensions?.KHR_texture_transform;if(s&&typeof s=="object")return s}return null}var Xt=Object.freeze({maxMeshes:1e3,maxTextures:64,maxVertices:1e6,maxIndices:3e6}),tt=Object.freeze({maxMeshes:1/0,maxTextures:1/0,maxVertices:1/0,maxIndices:1/0});function we(n,e){e.indices?n.drawElements(4,e.indexCount,e.indexType,0):n.drawArrays(4,0,e.indexCount)}function nt(n,e){let t=n?.pbrMetallicRoughness,r=t?.baseColorFactor,i=n?.extensions?.KHR_materials_clearcoat,s=a=>a!==void 0&&e[a.index]?e[a.index]:null;return{baseColor:r?[r[0],r[1],r[2],r[3]??1]:[.8,.8,.8,1],metallic:t?.metallicFactor??.1,roughness:t?.roughnessFactor??.5,clearcoat:i?i.clearcoatFactor??1:0,clearcoatRoughness:Math.max(.04,i?.clearcoatRoughnessFactor??.04),texture:s(t?.baseColorTexture),metallicRoughnessTexture:s(t?.metallicRoughnessTexture),normalTexture:s(n?.normalTexture),normalScale:n?.normalTexture?.scale??1,occlusionTexture:s(n?.occlusionTexture),occlusionStrength:n?.occlusionTexture?.strength??1,isTransmissive:(n?.extensions?.KHR_materials_transmission?.transmissionFactor??0)>0}}function rt(n,e,t){let r=new Set,i=s=>{s&&!r.has(s)&&(r.add(s),n.deleteTexture(s))};for(let s of e)for(let a of s.primitives){if(a.vao&&n.deleteVertexArray(a.vao),a.buffers)for(let o of a.buffers)n.deleteBuffer(o);i(a.texture),i(a.metallicRoughnessTexture),i(a.normalTexture),i(a.occlusionTexture);let c=new Set;a.customProgram&&c.add(a.customProgram);for(let o of a.programCache?.values()??[])o.program&&c.add(o.program);for(let o of c)n.deleteProgram(o)}if(t)for(let s of t)i(s)}function Ye(n,e,t=tt,r){let i={meshes:[],mesh:null,gpuTextures:[],vao:null,buffers:[]};try{return Pt(n,e,t,r,i)}catch(s){let a=i.mesh&&!i.meshes.includes(i.mesh)?[...i.meshes,i.mesh]:i.meshes;rt(n,a,i.gpuTextures),i.vao&&n.deleteVertexArray(i.vao);for(let c of i.buffers)n.deleteBuffer(c);throw s}}function Pt(n,e,t,r,i){if(!e||!e.gltf)throw new Error("Invalid GLBData passed to buildGpuScene: missing gltf object.");let{gltf:s}=e,a=pe("meshopt");a?.decodeBufferViews&&a.decodeBufferViews(s,e);let c=e.bin,o=[];i.meshes=o;let l=[],u=s.extensions?.KHR_materials_variants;u&&Array.isArray(u.variants)&&u.variants.forEach((m,w)=>{l.push(typeof m?.name=="string"&&m.name?m.name:`Variant_${w}`)});let d=Te(s),f=[];if(Array.isArray(s.nodes))for(let m=0;m<s.nodes.length;m++){let w=s.nodes[m];w.mesh!==void 0&&s.meshes&&s.meshes[w.mesh]&&f.push({node:w,nodeIdx:m,meshIdx:w.mesh})}let T=f.length>0?f:(s.meshes||[]).map((m,w)=>({node:m,nodeIdx:-1,meshIdx:w})),p=[];if(Array.isArray(e.lights)&&e.lights.length>0)p.push(...e.lights);else if(s.extensions?.KHR_lights_punctual?.lights){let m=s.extensions.KHR_lights_punctual.lights;for(let w of m){let S=w.type==="directional"?"directional":w.type==="point"?"point":"ambient";p.push({type:S,color:w.color||[1,1,1],intensity:w.intensity!==void 0?w.intensity:1})}}if(p.length===0&&(p.push({type:"ambient",color:[1,1,1],intensity:.35}),p.push({type:"directional",color:[1,1,1],intensity:.85,direction:[.5,1,.8]})),T.length>t.maxMeshes)throw new Error(`SecurityError: GLB scene exceeds host mesh limit (${t.maxMeshes}). Found: ${T.length}`);let h=[];if(i.gpuTextures=h,s.textures&&s.images){if(s.textures.length>t.maxTextures)throw new Error(`SecurityError: GLB scene exceeds host texture limit (${t.maxTextures}). Found: ${s.textures.length}`);for(let m=0;m<s.textures.length;m++){let w=s.textures[m],S=s.images[w.source];if(S){let M=n.createTexture();if(n.bindTexture(3553,M),n.texImage2D(3553,0,6408,1,1,0,6408,5121,new Uint8Array([255,255,255,255])),n.texParameteri(3553,10242,10497),n.texParameteri(3553,10243,10497),n.texParameteri(3553,10241,9729),n.texParameteri(3553,10240,9729),S.bufferView!==void 0){let k=s.bufferViews[S.bufferView],_=c.slice(k.byteOffset||0,(k.byteOffset||0)+k.byteLength),K=new Blob([_],{type:S.mimeType||"image/png"});typeof createImageBitmap=="function"&&createImageBitmap(K).then(U=>{n.bindTexture(3553,M),n.texImage2D(3553,0,6408,6408,5121,U),n.generateMipmap(3553),r?.()}).catch(()=>{})}else if(S.uri){let k=Et(S.uri);if(k){let _=new Image;_.crossOrigin="anonymous",_.referrerPolicy="no-referrer",_.onload=()=>{n.bindTexture(3553,M),n.texImage2D(3553,0,6408,6408,5121,_),n.generateMipmap(3553),r?.()},_.src=k}else console.warn("[Three-Live Security] Blocked unsafe glTF image URI:",S.uri)}h.push(M)}else h.push(null)}}let b=[1/0,1/0,1/0],R=[-1/0,-1/0,-1/0],A=0,v=0;for(let m=0;m<T.length;m++){let w=T[m],S=s.meshes[w.meshIdx],M=w.nodeIdx>=0?d[w.nodeIdx]:re(),k=new Float32Array(9);me(k,M);let _={name:w.node.name||S.name||`Mesh_${w.meshIdx}`,nodeIndex:w.nodeIdx,transform:M,normalMatrix:k,primitives:[],extras:w.node.extras||S.extras};i.mesh=_;let K=w.node?.extensions?.EXT_mesh_gpu_instancing;if(K&&K.attributes&&typeof K.attributes=="object"){let U=K.attributes,O=U.TRANSLATION!==void 0?s.accessors?.[U.TRANSLATION]:null,B=U.ROTATION!==void 0?s.accessors?.[U.ROTATION]:null,q=U.SCALE!==void 0?s.accessors?.[U.SCALE]:null,Y=U._COLOR_0!==void 0?s.accessors?.[U._COLOR_0]:null,W=Number(O?.count??B?.count??q?.count??0);if(!Number.isFinite(W)||W<0||W>1e4)throw new Error(`SecurityError: EXT_mesh_gpu_instancing exceeds maximum instance limit (10000). Found: ${W}`);if(W>0){let j=(H,$)=>{if(!H||H.bufferView===void 0||!s.bufferViews?.[H.bufferView])return null;let G=H.componentType??5126,te=J=>(console.warn(`[three-live] EXT_mesh_gpu_instancing: skipping accessor (${J})`),null);if(G!==5120&&G!==5121&&G!==5122&&G!==5123&&G!==5126)return te(`componentType ${G}`);if(!(Number(H.count)>=W))return te(`count ${H.count} < ${W}`);let V=null;try{V=De(s,c,{...H,count:W},$)}catch{return te("out of bounds")}return!V||!V.every(Number.isFinite)?te("non-finite value"):V},x=j(O,3),I=j(B,4),N=j(q,3),z=Y?.type==="VEC4"?4:3,ee=j(Y,z),ie=new Float32Array(W*16),oe=re();for(let H=0;H<W;H++){let $=x?[x[H*3],x[H*3+1],x[H*3+2]]:[0,0,0],G=I?[I[H*4],I[H*4+1],I[H*4+2],I[H*4+3]]:[0,0,0,1],te=N?[N[H*3],N[H*3+1],N[H*3+2]]:[1,1,1];ye(oe,G,$,te),ie.set(oe,H*16)}if(_.instanceMatrices=ie,ee){let H=new Float32Array(W*3);for(let $=0;$<W;$++)H[$*3]=ee[$*z],H[$*3+1]=ee[$*z+1],H[$*3+2]=ee[$*z+2];_.instanceColors=H}}}for(let U of S.primitives||[]){if(U.extensions?.KHR_draco_mesh_compression){let V=pe("draco");V&&V.decodePrimitive(s,U,c)}let O=[],B=n.createVertexArray();i.vao=B,i.buffers=O,n.bindVertexArray(B);let q=Lt(n,_,O),Y=s.accessors[U.attributes.POSITION],W=Number(Y?.count??0);if(!Number.isFinite(W)||W<0||A+W>t.maxVertices)throw new Error(`SecurityError: GLB scene exceeds host vertex limit (${t.maxVertices}).`);if(A+=W,Y?.min&&Y?.max){let V=J=>{for(let Q=0;Q<3;Q++){let Z=J[12+Q],ne=J[12+Q];for(let le=0;le<3;le++){let ce=J[le*4+Q]*Y.min[le],ue=J[le*4+Q]*Y.max[le];Z+=ce<ue?ce:ue,ne+=ce>ue?ce:ue}Z<b[Q]&&(b[Q]=Z),ne>R[Q]&&(R[Q]=ne)}};if(_.instanceMatrices&&_.instanceMatrices.length>=16){let J=_.instanceMatrices.length>>4,Q=re();for(let Z=0;Z<J;Z++){let ne=_.instanceMatrices.subarray(Z*16,Z*16+16);se(Q,M,ne),V(Q)}}else V(M)}let j=Fe(n,s,c,U.attributes.POSITION,0,3,O);Fe(n,s,c,U.attributes.NORMAL,1,3,O),Fe(n,s,c,U.attributes.TEXCOORD_0,2,2,O,St(s,U));let x=0,I=5123,N=null;if(U.indices!==void 0){let V=s.accessors[U.indices],Q=(s.bufferViews[V.bufferView].byteOffset||0)+(V.byteOffset||0);if(x=Number(V.count??0),!Number.isFinite(x)||x<0||v+x>t.maxIndices)throw new Error(`SecurityError: GLB scene exceeds host index limit (${t.maxIndices}).`);v+=x,I=V.componentType===5125?5125||5125:5123||5123;let Z=n.createBuffer();O.push(Z),n.bindBuffer(34963,Z),V.componentType===5125?(N=new Uint32Array(c,Q,V.count),n.bufferData(34963,N,35044)):V.componentType===5121?(N=Uint16Array.from(new Uint8Array(c,Q,V.count)),n.bufferData(34963,N,35044)):(N=Q%2===0?new Uint16Array(c,Q,V.count):new Uint16Array(c.slice(Q,Q+V.count*2)),n.bufferData(34963,N,35044))}else x=Y.count;let z={};for(let V of ae)if(V.onBuildPrimitiveVAO){let J=V.onBuildPrimitiveVAO(n,B,U,s,c);J&&(z[V.name]=J)}n.bindVertexArray(null);let ee=s.materials&&U.material!==void 0?s.materials[U.material]:null,{program:ie,uniforms:oe}=et(n,U,ee),H=nt(ee,h),$=!!(ee?.extensions?.KHR_materials_transmission||z.materials?.isTransmissive),G=U.extensions?.KHR_materials_variants?.mappings,te=Array.isArray(G)?G.filter(V=>V&&typeof V.material=="number"&&Array.isArray(V.variants)).map(V=>({material:V.material|0,variants:V.variants.map(J=>Number(J)|0)})):void 0;_.primitives.push({vao:B,instanced:q,indexCount:x,indexType:I,...H,positions:j,indices:N,buffers:O,materialIndex:U.material,defaultMaterialIndex:U.material,variantMappings:te,primitiveDef:U,programCache:new Map([[U.material??-1,{program:ie,uniforms:oe}]]),pluginData:z,customProgram:ie,customUniforms:oe,isTransmissive:$})}o.push(_)}isFinite(b[0])||(b=[-1,-1,-1]),isFinite(R[0])||(R=[1,1,1]);let D=[(b[0]+R[0])/2,(b[1]+R[1])/2,(b[2]+R[2])/2],g=R[0]-b[0],P=R[1]-b[1],E=R[2]-b[2],y=Math.max(Math.hypot(g,P,E)/2,.5),F=[b[0],b[1],b[2]],L=[R[0],R[1],R[2]],C=e.animations;if(!C){for(let m of ae)if(m.onParseGLB?.(e),e.animations){C=e.animations;break}}return C||(C=[]),{meshes:o,bounds:{center:D,radius:y,min:F,max:L},lights:p,animations:C,worldMatrices:d,gpuTextures:h,availableVariants:l}}function ge(n){let e=n.customTarget||n.bounds.center,t=n.currDistance*Math.cos(n.currPhi);return[e[0]+t*Math.sin(n.currTheta),e[1]+n.currDistance*Math.sin(n.currPhi),e[2]+t*Math.cos(n.currTheta)]}var Re=class{constructor(e,t,r){this.meshes=[];this.backdropMeshes=[];this.bounds={center:[0,0,0],radius:1,min:[-1,-1,-1],max:[1,1,1]};this.lights=[];this.modelRootMatrix=re();this.clearColor=[0,0,0,0];this.envIntensity=1;this.exposure=1;this.shadowIntensity=0;this.shadowSoftness=.5;this.toneMapping="neutral";this.environmentTexture=null;this.animations=[];this.currentClip=null;this.animationTime=0;this.isPlayingAnimation=!1;this.autoplay=!1;this.animationName="";this.gpuTextures=[];this.availableVariants=[];this.activeVariantName=null;this.gltf=null;this.worldMatrices=[];this.initialNodeTransforms=[];this.projMatrix=re();this.viewMatrix=re();this.activeViewMatrix=null;this.modelMatrix=re();this.mvpMatrix=re();this.normalMatrix=new Float32Array(9);this.initialTheta=.6;this.initialPhi=.35;this.initialDistance=null;this.customDistance=!1;this.distanceMode="auto";this.initialCustomTarget=null;this.customTarget=null;this.fov=Math.PI/4;this.minTheta=-1/0;this.maxTheta=1/0;this.minPhi=-Math.PI*.48;this.maxPhi=Math.PI*.48;this.minDistanceLimit=null;this.maxDistanceLimit=null;this.activePointers=new Map;this.isPanning=!1;this.targetTheta=.6;this.currTheta=.6;this.targetPhi=.35;this.currPhi=.35;this.targetDistance=3;this.currDistance=3;this.autoRotate=!1;this.autoRotateSpeed=Math.PI/6;this.autoRotateDelay=3e3;this.lastInteractionTime=-1/0;this.turntableRotation=0;this.isPointerDown=!1;this.interactive=!0;this.skyboxTexture=null;this.lastPointerX=0;this.lastPointerY=0;this.totalDragDist=0;this.selectedMeshName="";this.pickFbo=null;this.pickTexture=null;this.pickDepth=null;this.pickFboWidth=0;this.pickFboHeight=0;this.animFrameId=null;this.isVisible=!0;this.xrSessionActive=!1;this.lastTime=0;this.lastReportedTheta=-999;this.lastReportedPhi=-999;this.lastReportedZoom=-999;this.boundPointerDown=null;this.boundPointerMove=null;this.boundPointerUp=null;this.boundWheel=null;this.boundKeyDown=null;this.boundContextMenu=null;this.boundSetCamera=null;this.boundResetCamera=null;this.contextLost=!1;this.lastGlbData=null;this.boundContextLost=null;this.boundContextRestored=null;this.stereoSBS=!1;this.renderErrorReported=!1;this.xrDepthState={enabled:!1,texture:null,uvTransform:re(),rawValueToMeters:.001,format:0};this.container=e;let i,s;if(t&&typeof t.getContext=="function"?(i=t,s=r):(s=t,i=s?.canvas),!i){let o=e.querySelector("canvas");o||(o=document.createElement("canvas"),o.style.width="100%",o.style.height="100%",o.style.display="block",o.style.touchAction="none",e.prepend(o)),i=o}this.canvas=i,this.opts=s||{},this.opts.clearColor&&(this.clearColor=this.opts.clearColor);let a=typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches;this.opts.autoRotate!==void 0?this.autoRotate=this.opts.autoRotate&&!a:a&&(this.autoRotate=!1),this.opts.autoRotateSpeed!==void 0&&(this.autoRotateSpeed=this.opts.autoRotateSpeed),this.opts.autoRotateDelay!==void 0&&(this.autoRotateDelay=Math.max(0,Number(this.opts.autoRotateDelay)||0)),this.opts.exposure!==void 0&&(this.exposure=Ce(this.opts.exposure)),this.opts.camera&&this.setInitialCamera(this.opts.camera.theta,this.opts.camera.phi,this.opts.camera.distance,this.opts.camera.zoom),this.opts.shadowIntensity!==void 0&&(this.shadowIntensity=Math.max(0,Math.min(1,Number(this.opts.shadowIntensity)||0))),this.opts.shadowSoftness!==void 0&&(this.shadowSoftness=Math.max(0,Math.min(1,Number(this.opts.shadowSoftness)||0))),this.opts.toneMapping!==void 0&&(this.toneMapping=Ie(this.opts.toneMapping)),this.opts.autoplay!==void 0&&(this.autoplay=this.opts.autoplay),this.opts.animationName!==void 0&&(this.animationName=this.opts.animationName),this.opts.variantName!==void 0&&(this.activeVariantName=this.opts.variantName||null),this.opts.fieldOfView!==void 0&&(this.fov=this.opts.fieldOfView*Math.PI/180),this.opts.distanceMode!==void 0&&(this.distanceMode=this.opts.distanceMode),this.opts.cameraTarget!==void 0&&(this.setTarget(this.opts.cameraTarget[0],this.opts.cameraTarget[1],this.opts.cameraTarget[2]),this.initialCustomTarget=[...this.opts.cameraTarget]),(this.opts.minCameraOrbit||this.opts.maxCameraOrbit)&&this.setOrbitLimits({minTheta:this.opts.minCameraOrbit?.theta,maxTheta:this.opts.maxCameraOrbit?.theta,minPhi:this.opts.minCameraOrbit?.phi,maxPhi:this.opts.maxCameraOrbit?.phi,minDistance:this.opts.minCameraOrbit?.distance,maxDistance:this.opts.maxCameraOrbit?.distance});let c=i.getContext("webgl2",{antialias:!0,alpha:!0,xrCompatible:!0});if(!c)throw new Error("WebGL2 not supported");this.gl=c,this.initGlState(),this.setupEvents(),this.setupContextLossHandling(),this.opts.environmentImage&&this.setEnvironmentImage(this.opts.environmentImage).catch(()=>{}),typeof requestAnimationFrame<"u"&&this.opts.autoStart!==!1&&this.start()}static registerDecoder(e,t){Mt(e,t)}static getDecoder(e){return pe(e)}setupContextLossHandling(){let e=this.canvas;typeof e?.addEventListener=="function"&&(this.boundContextLost=t=>{t.preventDefault?.(),this.contextLost=!0,this.stop()},this.boundContextRestored=()=>this.restoreContext(),e.addEventListener("webglcontextlost",this.boundContextLost),e.addEventListener("webglcontextrestored",this.boundContextRestored))}initGlState(){let e=this.gl,t=Je();this.renderProg=_e(e,Qe,t.fs),this.pickProg=_e(e,wt,Rt),this.uRender=Ne(e,this.renderProg,t.uniforms),this.uPick=Ne(e,this.pickProg,["uMVP","uColorId"]),this.setupPickingFbo()}restoreContext(){let e=this.gl;this.contextLost=!1,this.initGlState();for(let t of ae)t.onContextRestored?.(e,this);this.meshes=[],this.gpuTextures=[],this.environmentTexture=null,this.lastGlbData&&this.loadGLBData(this.lastGlbData,this.lastLimits),this.opts.environmentImage&&this.setEnvironmentImage(this.opts.environmentImage).catch(()=>{}),typeof requestAnimationFrame<"u"&&this.opts.autoStart!==!1&&this.start()}setupPickingFbo(){let e=this.gl;if(typeof e.createFramebuffer!="function")return;this.pickFbo=e.createFramebuffer(),this.pickTexture=e.createTexture(),this.pickDepth=e.createRenderbuffer();let t=Math.max(1,this.canvas.width),r=Math.max(1,this.canvas.height);this.pickFboWidth=t,this.pickFboHeight=r,e.bindTexture(3553,this.pickTexture),e.texImage2D(3553,0,6408,t,r,0,6408,5121,null),e.texParameteri(3553,10241,9728),e.texParameteri(3553,10240,9728),e.bindRenderbuffer(36161,this.pickDepth),e.renderbufferStorage(36161,33189,t,r),e.bindFramebuffer(36160,this.pickFbo),e.framebufferTexture2D(36160,36064,3553,this.pickTexture,0),e.framebufferRenderbuffer(36160,36096,36161,this.pickDepth),e.bindFramebuffer(36160,null)}resizePickingFbo(e,t){if(!this.pickFbo)return;let r=this.gl,i=Math.max(1,e),s=Math.max(1,t);this.pickFboWidth=i,this.pickFboHeight=s,r.bindTexture(3553,this.pickTexture),r.texImage2D(3553,0,6408,i,s,0,6408,5121,null),r.bindRenderbuffer(36161,this.pickDepth),r.renderbufferStorage(36161,33189,i,s)}loadGLBData(e,t){this.lastGlbData=e,this.lastLimits=t;let{meshes:r,bounds:i,lights:s,animations:a,worldMatrices:c,gpuTextures:o,availableVariants:l}=Ye(this.gl,e,t,()=>this.render());if(this.disposeMeshGpuResources(),this.meshes=r,this.bounds=i,this.turntableRotation=0,this.updateTurntableMatrix(),this.lights=s,this.animations=a||[],this.worldMatrices=c||[],this.gpuTextures=o||[],this.availableVariants=l||[],this.gltf=e.gltf,this.activeVariantName&&!this.applyVariantMaterial(this.activeVariantName)&&(this.activeVariantName=null),this.initialNodeTransforms=[],Array.isArray(e.gltf?.nodes))for(let f of e.gltf.nodes)this.initialNodeTransforms.push({t:f.translation?[f.translation[0],f.translation[1],f.translation[2]]:[0,0,0],r:f.rotation?[f.rotation[0],f.rotation[1],f.rotation[2],f.rotation[3]]:[0,0,0,1],s:f.scale?[f.scale[0],f.scale[1],f.scale[2]]:[1,1,1]});this.autoplay&&this.animations.length>0&&this.playAnimation(this.animationName||void 0);for(let f of ae)f.onLoadModel?.(this,this.gltf);this.customDistance||(this.initialDistance=this.distanceMode==="absolute"?3:i.radius*2.5,this.targetDistance=this.initialDistance,this.currDistance=this.initialDistance);let u=e.exposure??e.gltf?.extras?.exposure??e.gltf?.asset?.extras?.exposure;u!==void 0&&(this.exposure=Ce(u));let d=e.environmentIntensity??e.gltf?.extras?.environmentIntensity??e.gltf?.asset?.extras?.environmentIntensity;d!==void 0&&(this.envIntensity=Math.max(0,Number(d)||0)),this.container&&typeof this.container.hasAttribute=="function"&&this.container.hasAttribute("poster")&&this.container.removeAttribute("poster"),this.resize(),this.update(0),this.render(),this.animFrameId===null&&typeof requestAnimationFrame<"u"&&this.opts.autoStart!==!1&&this.start()}loadGLB(e){this.loadGLBData(je(e))}clearScene(){this.disposeMeshGpuResources(),this.lights=[],this.animations=[],this.currentClip=null,this.isPlayingAnimation=!1,this.worldMatrices=[],this.gltf=null,this.initialNodeTransforms=[],this.turntableRotation=0,this.updateTurntableMatrix(),this.gl&&this.render()}loadModel(e){this.loadGLBData(xe(e))}setBackdropGLB(e,t){if(this.disposeMeshListGpuResources(this.backdropMeshes),this.backdropMeshes=[],!e){this.update(0),this.render();return}let r=xe(e),{meshes:i}=Ye(this.gl,r,tt,()=>this.render());if(t)for(let s of i)s.transform[12]+=t[0],s.transform[13]+=t[1],s.transform[14]+=t[2],me(s.normalMatrix,s.transform);this.backdropMeshes=i,this.update(0),this.render()}setClearColor(e,t,r,i=1){this.clearColor=[e,t,r,i]}updateMeshTransforms(e){for(let t=0;t<this.meshes.length;t++){let r=this.meshes[t],i;e instanceof Map?i=e.get(r.name)??e.get(t):Array.isArray(e)?i=e[t]:e&&typeof e=="object"&&(Object.prototype.hasOwnProperty.call(e,r.name)?i=e[r.name]:Object.prototype.hasOwnProperty.call(e,t)&&(i=e[t])),i&&i.length===16&&(r.transform.set(i),me(r.normalMatrix,r.transform))}}bindLights(e=this.uRender){let t=this.gl,r=[.28,.28,.28],i=[],s=[],a=[],c=[];for(let o of this.lights){let l=o.color||[1,1,1],u=o.intensity!==void 0?o.intensity:1;if(o.type==="ambient")r=[l[0]*u,l[1]*u,l[2]*u];else if(o.type==="directional"&&i.length<6){let d=o.direction||[.5,1,.8];i.push(d[0],d[1],d[2]),s.push(l[0]*u,l[1]*u,l[2]*u)}else if(o.type==="point"&&a.length<6){let d=o.position||[0,0,0];a.push(d[0],d[1],d[2]),c.push(l[0]*u,l[1]*u,l[2]*u)}}i.length===0&&(i.push(.5,1,.8),s.push(1,1,1)),t.uniform3fv(e.uAmbientColor,r),t.uniform1i(e.uNumDirLights,i.length/3),i.length>0&&(t.uniform3fv(e.uDirLightDir,i),t.uniform3fv(e.uDirLightColor,s)),t.uniform1i(e.uNumPointLights,a.length/3),a.length>0&&(t.uniform3fv(e.uPointLightPos,a),t.uniform3fv(e.uPointLightColor,c)),t.uniform1f(e.uEnvIntensity,this.envIntensity)}setExposure(e){this.exposure=Ce(e)}getExposure(){return this.exposure}setShadow(e,t){this.shadowIntensity=Math.max(0,Math.min(1,Number(e)||0)),t!==void 0&&(this.shadowSoftness=Math.max(0,Math.min(1,Number(t)||0)))}getShadowIntensity(){return this.shadowIntensity}getShadowSoftness(){return this.shadowSoftness}setToneMapping(e){this.toneMapping=Ie(e)}getToneMapping(){return this.toneMapping}async setEnvironmentImage(e){for(let t of ae)if(t.setEnvironmentImage){await t.setEnvironmentImage(this,e);return}}async setSkyboxImage(e){for(let t of ae)if(t.setSkyboxImage){await t.setSkyboxImage(this,e);return}}setInteractive(e){this.interactive=e}isInteractive(){return this.interactive}getCameraOrbit(){let e=this.currTheta,t=this.currPhi,r=this.currDistance;return{theta:e,phi:t,radius:r,toString(){return`${e.toFixed(4)}rad ${t.toFixed(4)}rad ${r.toFixed(4)}m`}}}getCameraTarget(){let e=this.customTarget||this.bounds.center;return{x:e[0],y:e[1],z:e[2],toString(){return`${e[0].toFixed(4)}m ${e[1].toFixed(4)}m ${e[2].toFixed(4)}m`}}}jumpCameraToGoal(){this.currTheta=this.targetTheta,this.currPhi=this.targetPhi,this.currDistance=this.targetDistance,this.update(0),this.render()}getModelMaterials(){let e=this.gltf?.materials?.length?this.gltf.materials:[{name:"DefaultMaterial",pbrMetallicRoughness:{}}];return e.map((t,r)=>{let i=this.meshes.flatMap(u=>u.primitives.filter(d=>d.materialIndex===r||e.length===1&&d.materialIndex===void 0)),s=i[0],a=s?[...s.baseColor]:t.pbrMetallicRoughness?.baseColorFactor||[.8,.8,.8,1],c=s?s.metallic:t.pbrMetallicRoughness?.metallicFactor??.1,o=s?s.roughness:t.pbrMetallicRoughness?.roughnessFactor??.5,l={baseColorFactor:a,metallicFactor:c,roughnessFactor:o,setBaseColorFactor:u=>{let d=[u[0],u[1],u[2],u[3]??1];l.baseColorFactor=d,t.pbrMetallicRoughness&&(t.pbrMetallicRoughness.baseColorFactor=d);for(let f of i)f.baseColor=d;this.render()},setMetallicFactor:u=>{l.metallicFactor=u,t.pbrMetallicRoughness&&(t.pbrMetallicRoughness.metallicFactor=u);for(let d of i)d.metallic=u;this.render()},setRoughnessFactor:u=>{l.roughnessFactor=u,t.pbrMetallicRoughness&&(t.pbrMetallicRoughness.roughnessFactor=u);for(let d of i)d.roughness=u;this.render()}};return{name:t.name||`Material_${r}`,pbrMetallicRoughness:l}})}playAnimation(e){if(this.animations.length!==0){if(e){let t=this.animations.find(r=>r.name===e);t&&(this.currentClip=t)}else this.currentClip||(this.currentClip=this.animations[0]);this.isPlayingAnimation=!0}}pauseAnimation(){this.isPlayingAnimation=!1}getAvailableAnimations(){return this.animations.map(e=>e.name)}getAvailableVariants(){return[...this.availableVariants]}getVariantName(){return this.activeVariantName}selectVariant(e){let t=this.applyVariantMaterial(e);return t&&this.gl&&this.render(),t}applyVariantMaterial(e){let t=e===null||e==="",r=-1;if(t)this.activeVariantName=null;else{if(r=this.availableVariants.indexOf(e),r<0)return!1;this.activeVariantName=e}let i=this.gltf?.materials;if(!Array.isArray(i))return t;for(let s of this.meshes)for(let a of s.primitives){let c=a.defaultMaterialIndex;if(!t&&Array.isArray(a.variantMappings)){for(let l of a.variantMappings)if(Array.isArray(l.variants)&&l.variants.includes(r)){c=l.material;break}}let o=c!==void 0?i[c]:void 0;a.materialIndex=o?c:void 0,Object.assign(a,nt(o,this.gpuTextures)),this.applyPrimitiveProgram(a,a.materialIndex,o??null)}return!0}applyPrimitiveProgram(e,t,r){if(!this.gl||!e.primitiveDef)return;e.programCache??(e.programCache=new Map);let i=t??-1,s=e.programCache.get(i);s||(s=et(this.gl,{...e.primitiveDef,material:t},r),e.programCache.set(i,s)),e.customProgram=s.program,e.customUniforms=s.uniforms,e.pluginData&&(e.pluginData.materials=e.isTransmissive?{isTransmissive:!0}:void 0)}setAutoplay(e){this.autoplay=e,e?this.playAnimation(this.animationName||void 0):this.pauseAnimation()}setAnimationName(e){this.animationName=e,(this.isPlayingAnimation||this.autoplay)&&this.playAnimation(e)}evaluateAnimation(e){for(let t of ae)if(t.evaluateAnimation){t.evaluateAnimation(this,e);return}}setTarget(e,t,r){this.customTarget=[e,t,r],this.gl&&(this.meshes.length>0||this.backdropMeshes.length>0)&&(this.update(0),this.render())}getTarget(){return this.customTarget?[...this.customTarget]:null}setFieldOfView(e){let t=Math.max(10,Math.min(90,e));this.fov=t*Math.PI/180}getFieldOfView(){return this.fov*180/Math.PI}setDistanceMode(e){if(this.distanceMode=e,!this.customDistance){let t=this.clampDistance(this.distanceMode==="absolute"?3:this.bounds.radius*2.5);this.initialDistance=t,this.targetDistance=t,this.currDistance=t,this.gl&&(this.meshes.length>0||this.backdropMeshes.length>0)&&(this.update(0),this.render())}}getDistanceMode(){return this.distanceMode}setOrbitLimits(e){e.minTheta!==void 0&&(this.minTheta=e.minTheta*Math.PI/180),e.maxTheta!==void 0&&(this.maxTheta=e.maxTheta*Math.PI/180),e.minPhi!==void 0&&(this.minPhi=Math.max(-Math.PI*.48,e.minPhi*Math.PI/180)),e.maxPhi!==void 0&&(this.maxPhi=Math.min(Math.PI*.48,e.maxPhi*Math.PI/180)),e.minDistance!==void 0&&(this.minDistanceLimit=e.minDistance),e.maxDistance!==void 0&&(this.maxDistanceLimit=e.maxDistance),this.targetTheta=this.clampTheta(this.targetTheta),this.targetPhi=this.clampPhi(this.targetPhi),this.targetDistance=this.clampDistance(this.targetDistance)}getOrbitLimits(){return{minTheta:isFinite(this.minTheta)?this.minTheta*180/Math.PI:void 0,maxTheta:isFinite(this.maxTheta)?this.maxTheta*180/Math.PI:void 0,minPhi:this.minPhi*180/Math.PI,maxPhi:this.maxPhi*180/Math.PI,minDistance:this.minDistanceLimit!==null?this.minDistanceLimit:void 0,maxDistance:this.maxDistanceLimit!==null?this.maxDistanceLimit:void 0}}clampTheta(e){return Math.max(this.minTheta,Math.min(this.maxTheta,e))}clampPhi(e){return Math.max(this.minPhi,Math.min(this.maxPhi,e))}clampDistance(e){let t=this.minDistanceLimit!==null?this.minDistanceLimit:this.bounds?this.bounds.radius*.5:.1,r=this.maxDistanceLimit!==null?this.maxDistanceLimit:this.bounds?this.bounds.radius*8:100;return Math.max(t,Math.min(r,e))}setCamera(e,t,r,i){e!==void 0&&(this.targetTheta=this.clampTheta(e*Math.PI/180)),t!==void 0&&(this.targetPhi=this.clampPhi(t*Math.PI/180)),r!==void 0&&r>0&&(this.targetDistance=this.clampDistance(r)),i!==void 0&&i>0&&(this.targetDistance=this.clampDistance(this.bounds.radius*2.5/i))}setInitialCamera(e,t,r,i){if(e!==void 0&&(this.initialTheta=this.clampTheta(e*Math.PI/180),this.targetTheta=this.initialTheta,this.currTheta=this.initialTheta),t!==void 0&&(this.initialPhi=this.clampPhi(t*Math.PI/180),this.targetPhi=this.initialPhi,this.currPhi=this.initialPhi),r!==void 0&&r>0){let s=this.clampDistance(r);this.initialDistance=s,this.customDistance=!0,this.targetDistance=s,this.currDistance=s}else if(i!==void 0&&i>0){let s=this.clampDistance(this.bounds.radius*2.5/i);this.initialDistance=s,this.customDistance=!0,this.targetDistance=s,this.currDistance=s}else{this.customDistance=!1;let s=this.clampDistance(this.distanceMode==="absolute"?3:this.bounds.radius*2.5);this.initialDistance=s,this.targetDistance=s,this.currDistance=s}this.gl&&(this.meshes.length>0||this.backdropMeshes.length>0)&&(this.update(0),this.render())}resetCamera(){this.targetTheta=this.clampTheta(this.initialTheta),this.targetPhi=this.clampPhi(this.initialPhi),this.initialDistance!==null?this.targetDistance=this.clampDistance(this.initialDistance):this.targetDistance=this.clampDistance(this.bounds.radius*2.5),this.initialCustomTarget?this.customTarget=[...this.initialCustomTarget]:this.customTarget=null,this.turntableRotation=0,this.updateTurntableMatrix()}projectPointToScreen(e,t){let r=re();se(r,this.projMatrix,this.viewMatrix);let[i,s,a]=e,c=t?t[0]:0,o=t?t[1]:0,l=t?t[2]:0,u=this.modelRootMatrix;u&&(i=u[0]*e[0]+u[4]*e[1]+u[8]*e[2]+u[12],s=u[1]*e[0]+u[5]*e[1]+u[9]*e[2]+u[13],a=u[2]*e[0]+u[6]*e[1]+u[10]*e[2]+u[14],t&&(c=u[0]*t[0]+u[4]*t[1]+u[8]*t[2],o=u[1]*t[0]+u[5]*t[1]+u[9]*t[2],l=u[2]*t[0]+u[6]*t[1]+u[10]*t[2]));let d=r[0]*i+r[4]*s+r[8]*a+r[12],f=r[1]*i+r[5]*s+r[9]*a+r[13],T=r[2]*i+r[6]*s+r[10]*a+r[14],p=r[3]*i+r[7]*s+r[11]*a+r[15];if(p<=1e-4)return{x:0,y:0,z:1,visible:!1};let h=d/p,b=f/p,R=T/p,A=this.canvas.getBoundingClientRect(),v=A.width||this.canvas.clientWidth||this.canvas.width||300,D=A.height||this.canvas.clientHeight||this.canvas.height||150,g=(h*.5+.5)*v,P=(-b*.5+.5)*D,E=h>=-1.1&&h<=1.1&&b>=-1.1&&b<=1.1&&R>=-1&&R<=1;if(E&&t){let[y,F,L]=ge(this),C=[i-y,s-F,a-L];c*C[0]+o*C[1]+l*C[2]>.05&&(E=!1)}return{x:g,y:P,z:R,visible:E}}setSelectedMesh(e){this.selectedMeshName=e||""}getSelectedMesh(){return this.selectedMeshName}setupEvents(){let e=this.canvas;this.boundContextMenu=t=>{t.preventDefault()},e.addEventListener("contextmenu",this.boundContextMenu),this.boundPointerDown=t=>{this.interactive&&(this.isPointerDown=!0,this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now(),this.lastPointerX=t.clientX,this.lastPointerY=t.clientY,this.totalDragDist=0,this.activePointers.set(t.pointerId,{x:t.clientX,y:t.clientY}),this.isPanning=t.button===2||t.shiftKey||this.activePointers.size===2,e.setPointerCapture(t.pointerId))},e.addEventListener("pointerdown",this.boundPointerDown),this.boundPointerMove=t=>{if(!this.isPointerDown||!this.interactive)return;this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now();let r=this.activePointers.get(t.pointerId)||{x:this.lastPointerX,y:this.lastPointerY},i=t.clientX-r.x,s=t.clientY-r.y;if(this.activePointers.set(t.pointerId,{x:t.clientX,y:t.clientY}),this.lastPointerX=t.clientX,this.lastPointerY=t.clientY,this.totalDragDist+=Math.hypot(i,s),this.isPanning||t.button===2||t.shiftKey||this.activePointers.size===2){let a=[this.viewMatrix[0],this.viewMatrix[4],this.viewMatrix[8]],c=[this.viewMatrix[1],this.viewMatrix[5],this.viewMatrix[9]],o=this.customTarget?[...this.customTarget]:[...this.bounds.center],l=this.currDistance/Math.max(e.clientHeight||300,1)*1.5;o[0]+=(-i*a[0]+s*c[0])*l,o[1]+=(-i*a[1]+s*c[1])*l,o[2]+=(-i*a[2]+s*c[2])*l,this.customTarget=o}else this.targetTheta=this.clampTheta(this.targetTheta-i*.008),this.targetPhi=this.clampPhi(this.targetPhi+s*.008)},e.addEventListener("pointermove",this.boundPointerMove),this.boundPointerUp=t=>{this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now(),this.activePointers.delete(t.pointerId),this.activePointers.size===0?(this.isPointerDown=!1,this.isPanning=!1):this.activePointers.size===1&&(this.isPanning=!1);try{e.releasePointerCapture(t.pointerId)}catch{}if(this.totalDragDist<5&&t.button===0){let r=e.getBoundingClientRect(),i=Math.floor((t.clientX-r.left)*(e.width/Math.max(r.width,1))),s=Math.floor((t.clientY-r.top)*(e.height/Math.max(r.height,1)));this.performMeshPick(i,s,!0)}},e.addEventListener("pointerup",this.boundPointerUp),this.boundWheel=t=>{if(!this.interactive)return;t.preventDefault(),this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now();let r=Math.exp(t.deltaY*.001);this.targetDistance=this.clampDistance(this.targetDistance*r)},e.addEventListener("wheel",this.boundWheel,{passive:!1}),this.boundSetCamera=t=>{let r=t.detail||{};r.reset?this.resetCamera():this.setCamera(r.theta,r.phi,r.distance,r.zoom)},this.container.addEventListener("setCamera",this.boundSetCamera),this.boundResetCamera=()=>{this.resetCamera()},this.container.addEventListener("resetCamera",this.boundResetCamera),e.tabIndex!==void 0&&e.tabIndex<0&&(e.tabIndex=0),e.getAttribute?.("role")||e.setAttribute?.("role","region"),e.getAttribute?.("aria-label")||e.setAttribute?.("aria-label","Interactive 3D model viewport"),this.boundKeyDown=t=>{if(!this.interactive)return;let r=typeof performance<"u"?performance.now():Date.now();switch(t.key){case"ArrowLeft":this.lastInteractionTime=r,this.targetTheta=this.clampTheta(this.targetTheta-.1),t.preventDefault();break;case"ArrowRight":this.lastInteractionTime=r,this.targetTheta=this.clampTheta(this.targetTheta+.1),t.preventDefault();break;case"ArrowUp":this.lastInteractionTime=r,this.targetPhi=this.clampPhi(this.targetPhi+.08),t.preventDefault();break;case"ArrowDown":this.lastInteractionTime=r,this.targetPhi=this.clampPhi(this.targetPhi-.08),t.preventDefault();break;case"+":case"=":{this.lastInteractionTime=r,this.targetDistance=this.clampDistance(this.targetDistance*.9),t.preventDefault();break}case"-":case"_":{this.lastInteractionTime=r,this.targetDistance=this.clampDistance(this.targetDistance*1.1),t.preventDefault();break}case"Home":this.lastInteractionTime=r,this.resetCamera(),t.preventDefault();break}},e.addEventListener("keydown",this.boundKeyDown)}teardownEvents(){let e=this.canvas;this.boundContextLost&&(e.removeEventListener("webglcontextlost",this.boundContextLost),this.boundContextLost=null),this.boundContextRestored&&(e.removeEventListener("webglcontextrestored",this.boundContextRestored),this.boundContextRestored=null),this.boundContextMenu&&(e.removeEventListener("contextmenu",this.boundContextMenu),this.boundContextMenu=null),this.boundPointerDown&&(e.removeEventListener("pointerdown",this.boundPointerDown),this.boundPointerDown=null),this.boundPointerMove&&(e.removeEventListener("pointermove",this.boundPointerMove),this.boundPointerMove=null),this.boundPointerUp&&(e.removeEventListener("pointerup",this.boundPointerUp),this.boundPointerUp=null),this.boundWheel&&(e.removeEventListener("wheel",this.boundWheel),this.boundWheel=null),this.boundKeyDown&&(e.removeEventListener("keydown",this.boundKeyDown),this.boundKeyDown=null),this.boundSetCamera&&(this.container.removeEventListener("setCamera",this.boundSetCamera),this.boundSetCamera=null),this.boundResetCamera&&(this.container.removeEventListener("resetCamera",this.boundResetCamera),this.boundResetCamera=null)}raycastFromScreenPoint(e,t){let r=this.canvas,i=r.getBoundingClientRect(),s=r.width||300,a=r.height||300,c=i.width>0?Math.floor((e-i.left)*(s/i.width)):Math.floor(e),o=i.height>0?Math.floor((t-i.top)*(a/i.height)):Math.floor(t);return this.performMeshPick(c,o,!1)}performMeshPick(e,t,r=!0){if(this.meshes.length===0)return null;let i=this.gl,s=Math.max(1,this.canvas.width||300),a=Math.max(1,this.canvas.height||300);e=this.mapStereoPickX(e,s);let c=re();se(c,this.projMatrix,this.viewMatrix);let o=[],l=Math.max(0,Math.min(s-1,e)),u=Math.max(0,Math.min(a-1,a-1-t));if(this.pickFbo&&i&&!this.xrSessionActive){(this.pickFboWidth!==s||this.pickFboHeight!==a)&&this.resizePickingFbo(s,a),i.bindFramebuffer(36160,this.pickFbo),i.viewport(0,0,s,a),i.enable(2929),i.clearColor(0,0,0,0),i.clear(16384|256),i.useProgram(this.pickProg);for(let E=0;E<this.meshes.length;E++){let y=this.meshes[E];if(y.visible===!1||y.isPluginMesh)continue;let F=E+1,L=(F&255)/255,C=(F>>8&255)/255,m=(F>>16&255)/255;i.uniform4f(this.uPick.uColorId,L,C,m,1),se(this.modelMatrix,this.modelRootMatrix,y.transform);let w=y.instanceMatrices;if(w&&w.length>=16){let S=w.length>>4,M=re();for(let k of y.primitives){i.bindVertexArray(k.vao);for(let _=0;_<S;_++)se(M,this.modelMatrix,w.subarray(_*16,_*16+16)),se(this.mvpMatrix,c,M),i.uniformMatrix4fv(this.uPick.uMVP,!1,this.mvpMatrix),we(i,k)}}else{se(this.mvpMatrix,c,this.modelMatrix),i.uniformMatrix4fv(this.uPick.uMVP,!1,this.mvpMatrix);for(let S of y.primitives)i.bindVertexArray(S.vao),we(i,S)}}let g=new Uint8Array(4);i.readPixels(l,u,1,1,6408,5121,g),i.bindFramebuffer(36160,null);let P=g[0]+(g[1]<<8)+(g[2]<<16);P>0&&P<=this.meshes.length&&(o=[this.meshes[P-1]])}o.length===0&&(o=this.meshes.filter(g=>g.visible!==!1));let d=null,f=1/0,T=[0,0,0],p=[0,1,0],[h,b,R]=ge(this),A=re();for(let g of o){se(A,this.modelRootMatrix,g.transform);let P=g.instanceMatrices,E=P&&P.length>=16?P.length>>4:1;for(let y=0;y<E;y++){P&&P.length>=16?se(this.modelMatrix,A,P.subarray(y*16,y*16+16)):this.modelMatrix.set(A),se(this.mvpMatrix,c,this.modelMatrix);let F=re();if(!Ge(F,this.mvpMatrix))continue;let L=(l+.5)/s*2-1,C=(u+.5)/a*2-1,m=[0,0,0],w=[0,0,0];Pe(m,L,C,-1,F),Pe(w,L,C,1,F);let S=w[0]-m[0],M=w[1]-m[1],k=w[2]-m[2],_=Math.hypot(S,M,k)||1,K=S/_,U=M/_,O=k/_,B={distance:1/0,point:[0,0,0],normal:[0,1,0]};if((Y=>{for(let W of g.primitives){if(!W.positions)continue;let j=W.positions,x=W.indices,I=Math.floor(x?x.length/3:j.length/9);for(let N=0;N<I;N++){let z=x?x[N*3]:N*3,ee=x?x[N*3+1]:N*3+1,ie=x?x[N*3+2]:N*3+2;ze(m[0],m[1],m[2],K,U,O,j[z*3],j[z*3+1],j[z*3+2],j[ee*3],j[ee*3+1],j[ee*3+2],j[ie*3],j[ie*3+1],j[ie*3+2],B,Y)}}})(1e-4),isFinite(B.distance)){let Y=B.point[0],W=B.point[1],j=B.point[2],x=this.modelMatrix,I=x[0]*Y+x[4]*W+x[8]*j+x[12],N=x[1]*Y+x[5]*W+x[9]*j+x[13],z=x[2]*Y+x[6]*W+x[10]*j+x[14],ee=I-h,ie=N-b,oe=z-R,H=Math.hypot(ee,ie,oe);if(H<f){me(this.normalMatrix,this.modelMatrix);let $=this.normalMatrix,G=B.normal[0],te=B.normal[1],V=B.normal[2],J=$[0]*G+$[3]*te+$[6]*V,Q=$[1]*G+$[4]*te+$[7]*V,Z=$[2]*G+$[5]*te+$[8]*V,ne=Math.hypot(J,Q,Z)||1;J/=ne,Q/=ne,Z/=ne,J*ee+Q*ie+Z*oe>0&&(J=-J,Q=-Q,Z=-Z),d=g,f=Math.round(H*1e3)/1e3,T=[Math.round(I*1e3)/1e3,Math.round(N*1e3)/1e3,Math.round(z*1e3)/1e3],p=[Math.round(J*1e3)/1e3,Math.round(Q*1e3)/1e3,Math.round(Z*1e3)/1e3]}}}}if(!d)return null;let D={meshIndex:this.meshes.indexOf(d),meshName:d.name,nodeIndex:d.nodeIndex,distance:f,hitPoint:T,normal:p,screenX:e,screenY:t};if(r){for(let g of ae)g.onMeshSelect?.(this,D);this.opts.onMeshClick&&this.opts.onMeshClick(D),typeof CustomEvent<"u"&&typeof this.container.dispatchEvent=="function"&&this.container.dispatchEvent(new CustomEvent("meshClick",{bubbles:!0,detail:D}))}return D}mapStereoPickX(e,t){if(!this.stereoSBS||this.xrSessionActive||t<2)return e;let r=Math.max(1,Math.floor(t*.5)),i=e>=r,s=i?e-r:e,a=i?Math.max(1,t-r):r,c=(s+.5)/a*2-1;return Math.floor((c*.5+1)*.5*t)}setStereoSBS(e){this.stereoSBS=!!e,this.xrSessionActive||(this.syncCameraMatrices(),this.render())}syncCameraMatrices(){let e=Math.max(1,this.canvas.width||1)/Math.max(1,this.canvas.height||1),t=this.backdropMeshes.length>0?Math.max(this.bounds.radius*20,120):Math.max(this.bounds.radius*20,10);ve(this.projMatrix,this.fov,e,.1,t);let r=this.customTarget||this.bounds.center;Me(this.viewMatrix,ge(this),r,[0,1,0]),se(this.mvpMatrix,this.projMatrix,this.viewMatrix),me(this.normalMatrix,this.modelMatrix)}resize(){let e=Math.min((typeof window<"u"?window.devicePixelRatio:1)||1,2),t=this.canvas.getBoundingClientRect(),r=Math.max(1,Math.floor(t.width*e)),i=Math.max(1,Math.floor(t.height*e));this.canvas.width!==r||this.canvas.height!==i?(this.canvas.width=r,this.canvas.height=i,this.resizePickingFbo(r,i),this.xrSessionActive||this.syncCameraMatrices()):!this.xrSessionActive&&this.projMatrix[0]===0&&this.syncCameraMatrices()}getGLContext(){return this.gl}setXRSessionActive(e){let t=this.xrSessionActive;if(this.xrSessionActive=e,t&&!e){this.xrDepthState.enabled=!1;for(let r of ae)r.onXRSessionEnd?.(this);if(this.lastTime=typeof performance<"u"?performance.now():Date.now(),this.updateTurntableMatrix(),this.isVisible)try{this.resize(),this.syncCameraMatrices(),this.render()}catch(r){this.reportRenderError(r)}}}reportRenderError(e){this.renderErrorReported||(this.renderErrorReported=!0,typeof console<"u"&&console.warn("[three-live] render frame failed:",e))}stepXRUpdate(e){for(let t of ae)t.onUpdate?.(this,e)}start(){if(this.animFrameId!==null)return;this.lastTime=typeof performance<"u"?performance.now():Date.now();let e=t=>{if(this.animFrameId===null)return;let r=Math.min(Math.max((t-this.lastTime)/1e3,0),.1);if(this.lastTime=t,this.isVisible&&!this.xrSessionActive)try{this.resize(),this.update(r),this.render()}catch(i){this.reportRenderError(i)}this.animFrameId!==null&&(this.animFrameId=requestAnimationFrame(e))};this.animFrameId=requestAnimationFrame(e)}stop(){this.animFrameId!==null&&(cancelAnimationFrame(this.animFrameId),this.animFrameId=null)}setAutoRotate(e){this.autoRotate=e}getAutoRotate(){return this.autoRotate}setAutoRotateSpeed(e){this.autoRotateSpeed=e}getAutoRotateSpeed(){return this.autoRotateSpeed}setAutoRotateDelay(e){this.autoRotateDelay=Math.max(0,Number(e)||0)}getAutoRotateDelay(){return this.autoRotateDelay}resetTurntableRotation(e=0){this.turntableRotation=Number(e)||0,this.updateTurntableMatrix(),this.render()}updateTurntableMatrix(){let e=Math.cos(this.turntableRotation),t=Math.sin(this.turntableRotation),r=this.bounds.center[0],i=this.bounds.center[2],s=this.modelRootMatrix;s[0]=e,s[1]=0,s[2]=-t,s[3]=0,s[4]=0,s[5]=1,s[6]=0,s[7]=0,s[8]=t,s[9]=0,s[10]=e,s[11]=0,s[12]=r-(e*r+t*i),s[13]=0,s[14]=i-(-t*r+e*i),s[15]=1}setVisible(e){this.isVisible=e}update(e){for(let a of ae)a.onUpdate?.(this,e);let t=typeof performance<"u"?performance.now():Date.now();if(!this.isPointerDown&&this.autoRotate&&t-this.lastInteractionTime>=this.autoRotateDelay){this.turntableRotation+=this.autoRotateSpeed*e,this.updateTurntableMatrix();for(let a of ae)a.onCameraChange?.(this,this.container)}this.currTheta+=(this.targetTheta-this.currTheta)*.12,this.currPhi+=(this.targetPhi-this.currPhi)*.12,this.currDistance+=(this.targetDistance-this.currDistance)*.12,this.syncCameraMatrices();let r=Math.round((this.currTheta*180/Math.PI%360+360)%360),i=Math.round(this.currPhi*180/Math.PI),s=Math.round(this.bounds.radius*2.5/this.currDistance*100)/100;if(Math.abs(r-this.lastReportedTheta)>=1||Math.abs(i-this.lastReportedPhi)>=1||Math.abs(s-this.lastReportedZoom)>=.02){this.lastReportedTheta=r,this.lastReportedPhi=i,this.lastReportedZoom=s;let a={theta:r,phi:i,zoom:s,distance:Math.round(this.currDistance*100)/100};this.opts.onCameraChange&&this.opts.onCameraChange(a),typeof CustomEvent<"u"&&typeof this.container.dispatchEvent=="function"&&this.container.dispatchEvent(new CustomEvent("cameraChange",{bubbles:!0,detail:a}))}}renderXRView(e,t,r,i,s=!0,a=0){this.onBeforeRenderXRView&&this.onBeforeRenderXRView(e);let c=e?.transform?.inverse?.matrix||this.viewMatrix,o=e?.projectionMatrix||this.projMatrix,l=e?.transform?.position,u=l?[l.x,l.y,l.z]:[0,1.6,0];t?this.modelRootMatrix.set(t):r&&t&&this.modelRootMatrix.set(t),this.render({viewMatrix:c,projMatrix:o,eyePos:u,viewport:i,eye:e?.eye||"none",clear:a>0?!1:e?.eye!=="right",isAR:s})}render(e){if(this.contextLost)return;if(!e&&this.stereoSBS){let v=Math.max(2,this.canvas.width||2),D=Math.max(1,this.canvas.height||1),g=Math.max(1,Math.floor(v*.5)),P=Math.max(1,v-g),E=this.backdropMeshes.length>0?Math.max(this.bounds.radius*20,120):Math.max(this.bounds.radius*20,10),y=this.customTarget||this.bounds.center,[F,L,C]=ge(this),m=Math.cos(this.currTheta),w=-Math.sin(this.currTheta),S=.032,M=re(),k=re(),_=[F-m*S,L,C-w*S],K=[y[0]-m*S*.25,y[1],y[2]-w*S*.25];ve(M,this.fov,g/D,.1,E),Me(k,_,K,[0,1,0]);let U=re(),O=re(),B=[F+m*S,L,C+w*S],q=[y[0]+m*S*.25,y[1],y[2]+w*S*.25];ve(U,this.fov,P/D,.1,E),Me(O,B,q,[0,1,0]),this.render({viewMatrix:k,projMatrix:M,eyePos:_,viewport:[0,0,g,D],eye:"left",clear:!0,isAR:!1}),this.render({viewMatrix:O,projMatrix:U,eyePos:B,viewport:[g,0,P,D],eye:"right",clear:!1,isAR:!1}),this.gl.viewport(0,0,v,D);return}let t=this.gl,r=0,i=0,s=this.canvas.width,a=this.canvas.height;e?.viewport?(r=e.viewport[0],i=e.viewport[1],s=e.viewport[2],a=e.viewport[3],t.viewport(r,i,s,a)):t.viewport(0,0,this.canvas.width,this.canvas.height),t.enable(2929),(!e||e.clear!==!1)&&(e?.isAR?t.clearColor(0,0,0,0):t.clearColor(this.clearColor[0],this.clearColor[1],this.clearColor[2],this.clearColor[3]),t.clear(16384|256));let c=re(),o=e?.viewMatrix??this.viewMatrix;this.activeViewMatrix=o,se(c,e?.projMatrix??this.projMatrix,o);let l=he().xrDepthShader,u=xt(this.toneMapping),[d,f,T]=e?e.eyePos:ge(this);for(let v of ae)v.onBeforeDrawScene?.(this,t,c,[d,f,T],u);let p=e?.isAR?0:this.backdropMeshes.length;if(this.meshes.length===0&&p===0)return;let h=e?.eye||"none",b=!1,R=p>0?[...this.backdropMeshes,...this.meshes]:this.meshes,A=v=>{for(let D=0;D<R.length;D++){let g=R[D];if(g.visible===!1)continue;let P=this.selectedMeshName!==""&&g.name===this.selectedMeshName;D<p||g.worldSpace===!0||g.name==="__xr_reticle__"?this.modelMatrix.set(g.transform):se(this.modelMatrix,this.modelRootMatrix,g.transform),se(this.mvpMatrix,c,this.modelMatrix),me(g.normalMatrix,this.modelMatrix);let E=g.extras?.xr?.stereo||g.userData?.xr?.stereo,y=0,F=0,L=1,C=1;E==="sbs"?(L=.5,y=h==="right"?.5:0):E==="ou"&&(C=.5,F=h==="right"?.5:0);for(let m of g.primitives){let w=!!m.isTransmissive;if(!v&&w){b=!0;continue}if(v&&!w)continue;let S=m.customProgram||this.renderProg,M=m.customUniforms||this.uRender;t.useProgram(S),t.uniform1i(M.uToneMapping,u),t.uniform1f(M.uEnvIntensity,this.envIntensity),M.uExposure&&t.uniform1f(M.uExposure,this.exposure),t.uniform3f(M.uCameraPos,d,f,T),t.uniform1f(M.uEmissive,P?1:0),t.uniformMatrix4fv(M.uMVP,!1,this.mvpMatrix),t.uniformMatrix4fv(M.uModel,!1,this.modelMatrix),t.uniformMatrix3fv(M.uNormalMatrix,!1,g.normalMatrix),M.uUvTransform&&t.uniform4f(M.uUvTransform,y,F,L,C),M.uViewportSize&&t.uniform2f(M.uViewportSize,Math.max(1,s),Math.max(1,a)),l?.bind(t,M,this.xrDepthState,o,[r,i,Math.max(1,s),Math.max(1,a)]),this.environmentTexture?(t.activeTexture(33988),t.bindTexture(3553,this.environmentTexture),t.uniform1i(M.uEnvironmentMap,4),t.uniform1i(M.uHasEnvironmentMap,1)):t.uniform1i(M.uHasEnvironmentMap,0),this.bindLights(M),M.uSectionEnabled&&t.uniform1i(M.uSectionEnabled,0);for(let _ of ae)_.onBeforeDrawPrimitive?.(t,S,m,g,this.worldMatrices||[],this.gltf);t.uniform4fv(M.uBaseColor,m.baseColor),t.uniform1f(M.uMetallic,m.metallic),t.uniform1f(M.uRoughness,m.roughness),M.uClearcoat&&t.uniform2f(M.uClearcoat,m.clearcoat??0,m.clearcoatRoughness??.04),m.texture?(t.activeTexture(33984),t.bindTexture(3553,m.texture),t.uniform1i(M.uBaseColorTexture,0),t.uniform1i(M.uHasTexture,1)):t.uniform1i(M.uHasTexture,0),m.metallicRoughnessTexture?(t.activeTexture(33985),t.bindTexture(3553,m.metallicRoughnessTexture),t.uniform1i(M.uMetallicRoughnessTexture,1),t.uniform1i(M.uHasMetallicRoughnessTexture,1)):t.uniform1i(M.uHasMetallicRoughnessTexture,0),m.normalTexture?(t.activeTexture(33986),t.bindTexture(3553,m.normalTexture),t.uniform1i(M.uNormalTexture,2),t.uniform1i(M.uHasNormalTexture,1),t.uniform1f(M.uNormalScale,m.normalScale)):t.uniform1i(M.uHasNormalTexture,0),m.occlusionTexture?(t.activeTexture(33987),t.bindTexture(3553,m.occlusionTexture),t.uniform1i(M.uOcclusionTexture,3),t.uniform1i(M.uHasOcclusionTexture,1),t.uniform1f(M.uOcclusionStrength,m.occlusionStrength)):t.uniform1i(M.uHasOcclusionTexture,0),t.bindVertexArray(m.vao);let k=g.instanceMatrices;if(k&&k.length>=16&&m.instanced&&M.uInstanced&&M.uViewProj){let _=k.length>>4;t.uniform1i(M.uInstanced,1),t.uniformMatrix4fv(M.uViewProj,!1,c),m.indices?t.drawElementsInstanced(4,m.indexCount,m.indexType,0,_):t.drawArraysInstanced(4,0,m.indexCount,_),t.uniform1i(M.uInstanced,0)}else if(k&&k.length>=16){let _=k.length>>4,K=g.instanceColors,U=re(),O=new Float32Array(9),B=[m.baseColor[0],m.baseColor[1],m.baseColor[2],m.baseColor[3]];for(let q=0;q<_;q++)se(U,this.modelMatrix,k.subarray(q*16,q*16+16)),se(this.mvpMatrix,c,U),me(O,U),t.uniformMatrix4fv(M.uMVP,!1,this.mvpMatrix),t.uniformMatrix4fv(M.uModel,!1,U),t.uniformMatrix3fv(M.uNormalMatrix,!1,O),K&&(B[0]=m.baseColor[0]*K[q*3],B[1]=m.baseColor[1]*K[q*3+1],B[2]=m.baseColor[2]*K[q*3+2],B[3]=m.baseColor[3],t.uniform4fv(M.uBaseColor,B)),we(t,m)}else we(t,m)}}};if(A(!1),b){for(let v of ae)v.onBeforeTransmissivePass?.(t,this);A(!0)}for(let v of ae)v.onAfterRender?.(t,this,c)}disposeMeshListGpuResources(e,t){rt(this.gl,e,t)}disposeMeshGpuResources(){this.disposeMeshListGpuResources(this.meshes,this.gpuTextures),this.meshes=[],this.gpuTextures=[],this.availableVariants=[]}disposeGpuResources(){let e=this.gl;this.disposeMeshGpuResources(),this.disposeMeshListGpuResources(this.backdropMeshes),this.backdropMeshes=[];for(let t of ae)t.onDestroy?.(e,this);this.environmentTexture&&(e.deleteTexture(this.environmentTexture),this.environmentTexture=null),this.renderProg&&e.deleteProgram(this.renderProg),this.pickProg&&e.deleteProgram(this.pickProg),this.pickFbo&&e.deleteFramebuffer(this.pickFbo),this.pickTexture&&e.deleteTexture(this.pickTexture),this.pickDepth&&e.deleteRenderbuffer(this.pickDepth),this.pickFbo=null,this.pickTexture=null,this.pickDepth=null}dispose(){this.stop(),this.teardownEvents(),this.disposeGpuResources()}destroy(){this.dispose()}};Re.registerPlugin=He,Re.getRegisteredPlugins=We;function Be(n){return new TextEncoder().encode(n)}function Dt(n,e){n.updateMatrixWorld(!0);let t=[];return n.traverse(r=>{if(r.geometry){let i=r.geometry,s=i.attributes.position;if(!s||s.count===0)return;let a=s.count,c=new Float32Array(a*3),o=r.matrixWorld.elements;for(let y=0;y<a;y++){let F=s.getX(y),L=s.getY(y),C=s.getZ(y);c[y*3]=o[0]*F+o[4]*L+o[8]*C+o[12],c[y*3+1]=o[1]*F+o[5]*L+o[9]*C+o[13],c[y*3+2]=o[2]*F+o[6]*L+o[10]*C+o[14]}let l;if(i.attributes.normal){let y=i.attributes.normal;l=new Float32Array(a*3);let F=new Float32Array(9);me(F,o);for(let L=0;L<a;L++){let C=y.getX(L),m=y.getY(L),w=y.getZ(L),S=F[0]*C+F[3]*m+F[6]*w,M=F[1]*C+F[4]*m+F[7]*w,k=F[2]*C+F[5]*m+F[8]*w,_=Math.hypot(S,M,k)||1;l[L*3]=S/_,l[L*3+1]=M/_,l[L*3+2]=k/_}}let u;if(i.attributes.uv){let y=i.attributes.uv;u=new Float32Array(a*2);for(let F=0;F<a;F++)u[F*2]=y.getX(F),u[F*2+1]=y.getY(F)}let d;if(i.index)d=i.index.array;else{d=a>65535?new Uint32Array(a):new Uint16Array(a);for(let y=0;y<a;y++)d[y]=y}let f="DefaultMaterial",T=[.8,.8,.8],p=.5,h=.1,b=0,R=0,A=1.5,v=1,D=[0,0,0];if(r.material){let y=r.material;f=y.name||`Material_${t.length}`,y.color&&(T=[y.color.r,y.color.g,y.color.b]),typeof y.roughness=="number"&&(p=y.roughness),typeof y.metalness=="number"&&(h=y.metalness),typeof y.clearcoat=="number"&&(b=y.clearcoat),typeof y.clearcoatRoughness=="number"&&(R=y.clearcoatRoughness),typeof y.ior=="number"&&(A=y.ior);let F=typeof y.opacity=="number"?y.opacity:1,L=typeof y.transmission=="number"?y.transmission:0;if(v=F*(1-L),y.emissive&&(y.emissive.r>0||y.emissive.g>0||y.emissive.b>0)){let C=y.emissiveIntensity??1;D=[y.emissive.r*C,y.emissive.g*C,y.emissive.b*C]}}let g,P=e?.animateCallback||e?.animateFn||(typeof n.userData?.animate=="function"?n.userData.animate:typeof n.__animateFn=="function"?n.__animateFn:typeof globalThis.animate=="function"?globalThis.animate:void 0);if(typeof P=="function"){let y=e?.duration??4,F=e?.fps??4,L=Math.max(2,Math.round(y*F)+1),C=[],m=[],w=[],S=[],M=[r.position.x,r.position.y,r.position.z],k=[r.quaternion.x,r.quaternion.y,r.quaternion.z,r.quaternion.w],_=[r.scale.x,r.scale.y,r.scale.z],K=!1;for(let U=0;U<L;U++){let O=U/(L-1)*y;C.push(O);try{P(O)}catch{}m.push([r.position.x,r.position.y,r.position.z]),w.push([r.quaternion.x,r.quaternion.y,r.quaternion.z,r.quaternion.w]),S.push([r.scale.x,r.scale.y,r.scale.z]),(Math.abs(r.position.x-M[0])>1e-4||Math.abs(r.position.y-M[1])>1e-4||Math.abs(r.position.z-M[2])>1e-4||Math.abs(r.quaternion.x-k[0])>1e-4||Math.abs(r.quaternion.y-k[1])>1e-4||Math.abs(r.quaternion.z-k[2])>1e-4||Math.abs(r.quaternion.w-k[3])>1e-4||Math.abs(r.scale.x-_[0])>1e-4)&&(K=!0)}r.position.set(M[0],M[1],M[2]),r.quaternion.set(k[0],k[1],k[2],k[3]),r.scale.set(_[0],_[1],_[2]),K&&(g={times:C,translations:m,rotations:w,scales:S})}let E=r;if(E.isInstancedMesh&&typeof E.count=="number"&&E.count>0&&E.instanceMatrix?.array){let y=Math.min(1e3,Math.floor(E.count)),F=E.instanceMatrix.array,L=E.instanceColor?.array,C=r.name||`Mesh_${t.length}`,m=new Float32Array(16),w=new Float32Array(9);for(let S=0;S<y;S++){let M=F.subarray(S*16,(S+1)*16);se(m,o,M);let k=new Float32Array(a*3);for(let O=0;O<a;O++){let B=s.getX(O),q=s.getY(O),Y=s.getZ(O);k[O*3]=m[0]*B+m[4]*q+m[8]*Y+m[12],k[O*3+1]=m[1]*B+m[5]*q+m[9]*Y+m[13],k[O*3+2]=m[2]*B+m[6]*q+m[10]*Y+m[14]}let _;if(i.attributes.normal){let O=i.attributes.normal;_=new Float32Array(a*3),me(w,m);for(let B=0;B<a;B++){let q=O.getX(B),Y=O.getY(B),W=O.getZ(B),j=w[0]*q+w[3]*Y+w[6]*W,x=w[1]*q+w[4]*Y+w[7]*W,I=w[2]*q+w[5]*Y+w[8]*W,N=Math.hypot(j,x,I)||1;_[B*3]=j/N,_[B*3+1]=x/N,_[B*3+2]=I/N}}let K=T,U=f;L&&L.length>=(S+1)*3&&(K=[T[0]*L[S*3],T[1]*L[S*3+1],T[2]*L[S*3+2]],U=`${f}_inst_${S}`),t.push({name:`${C}_${S}`,positions:k,indices:d,normals:_,uvs:u,materialName:U,color:K,roughness:p,metallic:h,clearcoat:b,clearcoatRoughness:R,ior:A,opacity:v,emissiveColor:D,xrTraits:r.userData?.xr})}return}t.push({name:r.name||`Mesh_${t.length}`,positions:c,indices:d,normals:l,uvs:u,materialName:f,color:T,roughness:p,metallic:h,clearcoat:b,clearcoatRoughness:R,ior:A,opacity:v,emissiveColor:D,xrTraits:r.userData?.xr,timeSamples:g})}}),t}function at(n){let e=[],t=n.gltf,r=he().decoders.get("meshopt");r&&typeof r.decodeBufferViews=="function"&&r.decodeBufferViews(t,n);let i=n.bin,s=i instanceof ArrayBuffer?i:i.buffer.slice(i.byteOffset,i.byteOffset+i.byteLength),a=t.accessors||[],c=t.bufferViews||[],o=t.materials||[],l=t.meshes||[],u=t.nodes||[];function d(p){let h=a[p];if(!h)throw new Error(`Accessor ${p} not found`);let b=c[h.bufferView||0],R=(b.byteOffset||0)+(h.byteOffset||0),A=b.byteLength||0,v=s.slice(R,R+A);return{acc:h,buffer:v}}let f=new Map;if(u.length>0){let p=Te(t);for(let h=0;h<p.length;h++)f.set(h,p[h])}function T(p,h,b,R){let A=l[p];if(!A)return;let v=new Float32Array(9);me(v,h);for(let D=0;D<(A.primitives||[]).length;D++){let g=A.primitives[D],P=g.attributes?.POSITION;if(P===void 0)continue;let{acc:E,buffer:y}=d(P),F=new Float32Array(y,0,E.count*3),L=new Float32Array(F.length);for(let x=0;x<E.count;x++){let I=F[x*3],N=F[x*3+1],z=F[x*3+2];L[x*3]=h[0]*I+h[4]*N+h[8]*z+h[12],L[x*3+1]=h[1]*I+h[5]*N+h[9]*z+h[13],L[x*3+2]=h[2]*I+h[6]*N+h[10]*z+h[14]}let C,m=g.attributes?.NORMAL;if(m!==void 0){let{acc:x,buffer:I}=d(m),N=new Float32Array(I,0,x.count*3);C=new Float32Array(N.length);for(let z=0;z<x.count;z++){let ee=N[z*3],ie=N[z*3+1],oe=N[z*3+2],H=v[0]*ee+v[3]*ie+v[6]*oe,$=v[1]*ee+v[4]*ie+v[7]*oe,G=v[2]*ee+v[5]*ie+v[8]*oe,te=Math.hypot(H,$,G)||1;C[z*3]=H/te,C[z*3+1]=$/te,C[z*3+2]=G/te}}let w,S=g.attributes?.TEXCOORD_0;if(S!==void 0){let{acc:x,buffer:I}=d(S);w=new Float32Array(I,0,x.count*2)}let M;if(g.indices!==void 0){let{acc:x,buffer:I}=d(g.indices);x.componentType===5125?M=new Uint32Array(I,0,x.count):M=new Uint16Array(I,0,x.count);let N=E.count;for(let z of M)if(z>=N)throw new Error(`SecurityError: Index buffer value (${z}) out of vertex bounds [0, ${N}).`)}else{let x=E.count;M=x>65535?new Uint32Array(x):new Uint16Array(x);for(let I=0;I<x;I++)M[I]=I}let k="DefaultMaterial",_=[.8,.8,.8],K=.5,U=.1,O=0,B=0,q=1.5,Y=1,W=[0,0,0];if(g.material!==void 0&&o[g.material]){let x=o[g.material];k=x.name||`Material_${g.material}`;let I=x.pbrMetallicRoughness||{},N=1;Array.isArray(I.baseColorFactor)&&(_=[I.baseColorFactor[0],I.baseColorFactor[1],I.baseColorFactor[2]],typeof I.baseColorFactor[3]=="number"&&(N=I.baseColorFactor[3])),typeof I.roughnessFactor=="number"&&(K=I.roughnessFactor),typeof I.metallicFactor=="number"&&(U=I.metallicFactor),Array.isArray(x.emissiveFactor)&&x.emissiveFactor.length>=3&&(W=[x.emissiveFactor[0],x.emissiveFactor[1],x.emissiveFactor[2]]);let z=x.extensions||{};z.KHR_materials_clearcoat&&(O=z.KHR_materials_clearcoat.clearcoatFactor??0,B=z.KHR_materials_clearcoat.clearcoatRoughnessFactor??0),z.KHR_materials_ior&&typeof z.KHR_materials_ior.ior=="number"&&(q=z.KHR_materials_ior.ior);let ee=z.KHR_materials_transmission?.transmissionFactor??0;Y=N*(1-ee)}let j=(A.primitives||[]).length>1?`${b}_p${D}`:b;e.push({name:j,positions:L,indices:M,normals:C,uvs:w,materialName:k,color:_,roughness:K,metallic:U,clearcoat:O,clearcoatRoughness:B,ior:q,opacity:Y,emissiveColor:W,xrTraits:R?.xr||A.extras?.xr})}}if(u.length>0)for(let p=0;p<u.length;p++){let h=u[p];if(h.mesh!==void 0&&h.mesh<l.length){let b=f.get(p)||re(),R=h.name||l[h.mesh].name||`Node_${p}`,A=h.extensions?.EXT_mesh_gpu_instancing?.attributes;if(A&&typeof A=="object"){let v=A.TRANSLATION,D=A.ROTATION,g=A.SCALE,P=v!==void 0?(()=>{let{acc:L,buffer:C}=d(v);return new Float32Array(C,0,L.count*3)})():null,E=D!==void 0?(()=>{let{acc:L,buffer:C}=d(D);return new Float32Array(C,0,L.count*4)})():null,y=g!==void 0?(()=>{let{acc:L,buffer:C}=d(g);return new Float32Array(C,0,L.count*3)})():null,F=Math.min(1e3,P?P.length/3:E?E.length/4:y?y.length/3:0);if(F>0){let L=new Float32Array(16),C=new Float32Array(16);for(let m=0;m<F;m++){let w=P?[P[m*3],P[m*3+1],P[m*3+2]]:[0,0,0],S=E?[E[m*4],E[m*4+1],E[m*4+2],E[m*4+3]]:[0,0,0,1],M=y?[y[m*3],y[m*3+1],y[m*3+2]]:[1,1,1];ye(L,S,w,M),se(C,b,L),T(h.mesh,C,`${R}_${m}`,h.extras)}continue}}T(h.mesh,b,R,h.extras)}}else{let p=re();for(let h=0;h<l.length;h++){let b=l[h].name||`Mesh_${h}`;T(h,p,b,l[h].extras)}}return e}function Ue(n,e){if(!n||typeof n!="string")return e;let t=n.replace(/[^A-Za-z0-9_]/g,"_");return/^[0-9]/.test(t)&&(t="_"+t),t||e}function it(n){return String(n??"").replace(/[\x00-\x1f\x7f]/g,"").replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function X(n){if(!Number.isFinite(n)||Math.abs(n)<1e-7)return"0";let e=Number(n.toFixed(5)).toString();return e.indexOf(".")===-1?`${e}.0`:e}function st(n){let e=n.length/3,t=new Array(e);for(let r=0;r<e;r++)t[r]=`(${X(n[r*3])}, ${X(n[r*3+1])}, ${X(n[r*3+2])})`;return t.join(", ")}function Ft(n,e){let t=new Array(e);for(let r=0;r<e;r++)t[r]=`(${X(n[r*2])}, ${X(1-n[r*2+1])})`;return t.join(", ")}function Ct(n){return Array.from(n).join(", ")}function ke(n){let e=new Map;for(let o of n){let l=Ue(o.materialName,"DefaultMaterial");e.has(l)||e.set(l,{color:o.color||[.8,.8,.8],roughness:o.roughness??.5,metallic:o.metallic??0,clearcoat:o.clearcoat??0,clearcoatRoughness:o.clearcoatRoughness??0,ior:o.ior??1.5,opacity:o.opacity??1,emissiveColor:o.emissiveColor||[0,0,0]})}let t=0,r=null;for(let o of n){if(o.timeSamples&&o.timeSamples.times.length>0){let l=o.timeSamples.times[o.timeSamples.times.length-1];l>t&&(t=l)}o.xrTraits?.anchor&&!r&&(r=o.xrTraits.anchor==="vertical"||o.xrTraits.anchor==="wall"?"vertical":"horizontal")}let i="";t>0&&(i=`startTimeCode = 0
251
+ endTimeCode = ${X(t)}
234
252
  timeCodesPerSecond = 1.0
235
253
  `);let s="";r&&(s=`uniform token preliminary:anchoring:type = "plane"
236
254
  uniform token preliminary:planeAnchoring:alignment = "${r}"
@@ -247,55 +265,55 @@ kind = "component"
247
265
  {
248
266
  ${s}def Scope "Materials"
249
267
  {
250
- `;for(let[l,c]of e.entries()){let[o,h,g]=c.color,[R,f,m]=c.emissiveColor,p="";c.clearcoat>0&&(p+=`float inputs:clearcoat = ${W(c.clearcoat)}
251
- `,p+=`float inputs:clearcoatRoughness = ${W(c.clearcoatRoughness)}
252
- `),c.ior!==1.5&&(p+=`float inputs:ior = ${W(c.ior)}
253
- `),c.opacity<1&&(p+=`float inputs:opacity = ${W(c.opacity)}
254
- `),(R>0||f>0||m>0)&&(p+=`color3f inputs:emissiveColor = (${W(R)}, ${W(f)}, ${W(m)})
255
- `),a+=`def Material "${l}"
268
+ `;for(let[o,l]of e.entries()){let[u,d,f]=l.color,[T,p,h]=l.emissiveColor,b="";l.clearcoat>0&&(b+=`float inputs:clearcoat = ${X(l.clearcoat)}
269
+ `,b+=`float inputs:clearcoatRoughness = ${X(l.clearcoatRoughness)}
270
+ `),l.ior!==1.5&&(b+=`float inputs:ior = ${X(l.ior)}
271
+ `),l.opacity<1&&(b+=`float inputs:opacity = ${X(l.opacity)}
272
+ `),(T>0||p>0||h>0)&&(b+=`color3f inputs:emissiveColor = (${X(T)}, ${X(p)}, ${X(h)})
273
+ `),a+=`def Material "${o}"
256
274
  {
257
275
  def Shader "PBRShader"
258
276
  {
259
277
  uniform token info:id = "UsdPreviewSurface"
260
- color3f inputs:diffuseColor = (${W(o)}, ${W(h)}, ${W(g)})
261
- float inputs:metallic = ${W(c.metallic)}
262
- float inputs:roughness = ${W(c.roughness)}
263
- ${p}token outputs:surface
278
+ color3f inputs:diffuseColor = (${X(u)}, ${X(d)}, ${X(f)})
279
+ float inputs:metallic = ${X(l.metallic)}
280
+ float inputs:roughness = ${X(l.roughness)}
281
+ ${b}token outputs:surface
264
282
  }
265
- token outputs:surface.connect = </Root/Materials/${l}/PBRShader.outputs:surface>
283
+ token outputs:surface.connect = </Root/Materials/${o}/PBRShader.outputs:surface>
266
284
  }
267
285
  `}a+=`}
268
286
  def Scope "Meshes"
269
287
  {
270
- `;let u=new Set;for(let l=0;l<n.length;l++){let c=n[l],o=c.positions.length/3,h=1/0,g=1/0,R=1/0,f=-1/0,m=-1/0,p=-1/0;for(let E=0;E<o;E++){let b=c.positions[E*3],S=c.positions[E*3+1],w=c.positions[E*3+2];b<h&&(h=b),b>f&&(f=b),S<g&&(g=S),S>m&&(m=S),w<R&&(R=w),w>p&&(p=w)}isFinite(h)||(h=g=R=-1,f=m=p=1);let L=Math.floor(c.indices.length/3),F=Ve(c.materialName,"DefaultMaterial"),A=Ve(c.name,`Mesh_${l}`);u.has(A)&&(A=`${A}_${l}`),u.add(A);let I=L>0?L===1?"3":"3, ".repeat(L-1)+"3":"",x=c.xrTraits,v="";if(x){let E=[];x.physics&&x.physics!=="none"&&E.push('prepend apiSchemas = ["PhysicsBodyAPI", "PhysicsCollisionAPI"]');let b=ge().xrTraitSerializer?.usdLines(x,rt)??[];if(!b.length)for(let S of["grab","billboard","follow","anchor","physics"]){let w=S==="follow"&&typeof x.follow=="object"?x.follow.mode??"head":x[S];w!==void 0&&b.push(`string ${S} = "${rt(w)}"`)}b.length>0&&E.push(`customData = {
288
+ `;let c=new Set;for(let o=0;o<n.length;o++){let l=n[o],u=l.positions.length/3,d=1/0,f=1/0,T=1/0,p=-1/0,h=-1/0,b=-1/0;for(let E=0;E<u;E++){let y=l.positions[E*3],F=l.positions[E*3+1],L=l.positions[E*3+2];y<d&&(d=y),y>p&&(p=y),F<f&&(f=F),F>h&&(h=F),L<T&&(T=L),L>b&&(b=L)}isFinite(d)||(d=f=T=-1,p=h=b=1);let R=Math.floor(l.indices.length/3),A=Ue(l.materialName,"DefaultMaterial"),v=Ue(l.name,`Mesh_${o}`);c.has(v)&&(v=`${v}_${o}`),c.add(v);let D=R>0?R===1?"3":"3, ".repeat(R-1)+"3":"",g=l.xrTraits,P="";if(g){let E=[];g.physics&&g.physics!=="none"&&E.push('prepend apiSchemas = ["PhysicsBodyAPI", "PhysicsCollisionAPI"]');let y=he().xrTraitSerializer?.usdLines(g,it)??[];if(!y.length)for(let F of["grab","billboard","follow","anchor","physics"]){let L=F==="follow"&&typeof g.follow=="object"?g.follow.mode??"head":g[F];L!==void 0&&y.push(`string ${F} = "${it(L)}"`)}y.length>0&&E.push(`customData = {
271
289
  dictionary xr = {
272
- ${b.join(`
290
+ ${y.join(`
273
291
  `)}
274
292
  }
275
- }`),E.length>0&&(v=` (
293
+ }`),E.length>0&&(P=` (
276
294
  ${E.join(`
277
295
  `)}
278
- )`)}if(a+=`def Mesh "${A}"${v}
296
+ )`)}if(a+=`def Mesh "${v}"${P}
279
297
  {
280
- `,x?.physics&&x.physics!=="none"){let E=x.physics==="static"?"true":"false";a+=`bool physics:rigidBodyEnabled = true
298
+ `,g?.physics&&g.physics!=="none"){let E=g.physics==="static"?"true":"false";a+=`bool physics:rigidBodyEnabled = true
281
299
  bool physics:kinematicEnabled = ${E}
282
300
  bool physics:collisionEnabled = true
283
- `}if(c.timeSamples&&c.timeSamples.times.length>0){let E=c.timeSamples,b=E.times.map((D,M)=>{let d=E.translations?.[M]||[0,0,0];return`${W(D)}: (${W(d[0])}, ${W(d[1])}, ${W(d[2])})`}).join(", "),S=E.times.map((D,M)=>{let d=E.rotations?.[M]||[0,0,0,1];return`${W(D)}: (${W(d[3])}, ${W(d[0])}, ${W(d[1])}, ${W(d[2])})`}).join(", "),w=E.times.map((D,M)=>{let d=E.scales?.[M]||[1,1,1];return`${W(D)}: (${W(d[0])}, ${W(d[1])}, ${W(d[2])})`}).join(", ");a+=`double3 xformOp:translate.timeSamples = { ${b} }
284
- quatf xformOp:orient.timeSamples = { ${S} }
285
- double3 xformOp:scale.timeSamples = { ${w} }
301
+ `}if(l.timeSamples&&l.timeSamples.times.length>0){let E=l.timeSamples,y=E.times.map((C,m)=>{let w=E.translations?.[m]||[0,0,0];return`${X(C)}: (${X(w[0])}, ${X(w[1])}, ${X(w[2])})`}).join(", "),F=E.times.map((C,m)=>{let w=E.rotations?.[m]||[0,0,0,1];return`${X(C)}: (${X(w[3])}, ${X(w[0])}, ${X(w[1])}, ${X(w[2])})`}).join(", "),L=E.times.map((C,m)=>{let w=E.scales?.[m]||[1,1,1];return`${X(C)}: (${X(w[0])}, ${X(w[1])}, ${X(w[2])})`}).join(", ");a+=`double3 xformOp:translate.timeSamples = { ${y} }
302
+ quatf xformOp:orient.timeSamples = { ${F} }
303
+ double3 xformOp:scale.timeSamples = { ${L} }
286
304
  uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:orient", "xformOp:scale"]
287
- `}a+=`float3[] extent = [(${W(h)}, ${W(g)}, ${W(R)}), (${W(f)}, ${W(m)}, ${W(p)})]
288
- int[] faceVertexCounts = [${I}]
289
- int[] faceVertexIndices = [${Pt(c.indices)}]
290
- point3f[] points = [${it(c.positions)}]
291
- `,c.normals&&c.normals.length===c.positions.length&&(a+=`normal3f[] normals = [${it(c.normals)}] (
305
+ `}a+=`float3[] extent = [(${X(d)}, ${X(f)}, ${X(T)}), (${X(p)}, ${X(h)}, ${X(b)})]
306
+ int[] faceVertexCounts = [${D}]
307
+ int[] faceVertexIndices = [${Ct(l.indices)}]
308
+ point3f[] points = [${st(l.positions)}]
309
+ `,l.normals&&l.normals.length===l.positions.length&&(a+=`normal3f[] normals = [${st(l.normals)}] (
292
310
  interpolation = "vertex"
293
311
  )
294
- `),c.uvs&&c.uvs.length===o*2&&(a+=`texCoord2f[] primvars:st = [${Dt(c.uvs,o)}] (
312
+ `),l.uvs&&l.uvs.length===u*2&&(a+=`texCoord2f[] primvars:st = [${Ft(l.uvs,u)}] (
295
313
  interpolation = "vertex"
296
314
  )
297
- `),a+=`rel material:binding = </Root/Materials/${F}>
315
+ `),a+=`rel material:binding = </Root/Materials/${A}>
298
316
  }
299
317
  `}return a+=`}
300
318
  }
301
- `,a}function at(n,e){if(n&&typeof n.traverse=="function"){let i=St(n,e);return Oe(i)}let t=Re(n),r=st(t);return Oe(r)}var Ie=null;function ot(n){if(!Ie){Ie=new Uint32Array(256);for(let t=0;t<256;t++){let r=t;for(let i=0;i<8;i++)r=r&1?3988292384^r>>>1:r>>>1;Ie[t]=r}}let e=4294967295;for(let t=0;t<n.length;t++)e=Ie[(e^n[t])&255]^e>>>8;return(e^4294967295)>>>0}function He(n){let e=[],t=0,r=[];for(let o of n){let h=Ge(o.filename),g=ot(o.data),R=o.data.length,f=30+h.length,m=t+f,p=0,L=m%64;L!==0&&(p=64-L);let F=new Uint8Array(f+p),A=new DataView(F.buffer);A.setUint32(0,67324752,!0),A.setUint16(4,20,!0),A.setUint16(6,0,!0),A.setUint16(8,0,!0),A.setUint16(10,0,!0),A.setUint16(12,0,!0),A.setUint32(14,g,!0),A.setUint32(18,R,!0),A.setUint32(22,R,!0),A.setUint16(26,h.length,!0),A.setUint16(28,p,!0),F.set(h,30),p>0&&F.fill(0,30+h.length),e.push({offset:t,size:R,crc:g,filenameBytes:h,entry:o}),r.push(F),r.push(o.data),t+=F.length+o.data.length}let i=t;for(let o of e){let h=new Uint8Array(46+o.filenameBytes.length),g=new DataView(h.buffer);g.setUint32(0,33639248,!0),g.setUint16(4,20,!0),g.setUint16(6,20,!0),g.setUint16(8,0,!0),g.setUint16(10,0,!0),g.setUint16(12,0,!0),g.setUint16(14,0,!0),g.setUint32(16,o.crc,!0),g.setUint32(20,o.size,!0),g.setUint32(24,o.size,!0),g.setUint16(28,o.filenameBytes.length,!0),g.setUint16(30,0,!0),g.setUint16(32,0,!0),g.setUint16(34,0,!0),g.setUint16(36,0,!0),g.setUint32(38,0,!0),g.setUint32(42,o.offset,!0),h.set(o.filenameBytes,46),r.push(h),t+=h.length}let s=t-i,a=new Uint8Array(22),u=new DataView(a.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,e.length,!0),u.setUint16(10,e.length,!0),u.setUint32(12,s,!0),u.setUint32(16,i,!0),u.setUint16(20,0,!0),r.push(a),t+=22;let l=new Uint8Array(t),c=0;for(let o of r)l.set(o,c),c+=o.length;return l}function Lt(n){let e=at(n),t=Ge(e);return He([{filename:"model.usda",data:t}])}function ct(n){let e=Re(n),t=st(e),r=Oe(t),i=Ge(r);return He([{filename:"model.usda",data:i}])}function ut(n){return n&&typeof n.toUSDZ=="function"?n.toUSDZ():n&&typeof n.traverse=="function"?Lt(n):ct(n)}function lt(n){let e=ut(n);return new Blob([e],{type:"model/vnd.usdz+zip"})}function ft(){if(typeof window>"u"||typeof navigator>"u")return!1;let n=navigator.userAgent||"";if(!(/iPad|iPhone|iPod/.test(n)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1))return!1;let t=document.createElement("a");return t.relList!==void 0&&t.relList.supports!==void 0&&t.relList.supports("ar")}function dt(){if(typeof navigator>"u")return!1;let n=navigator.userAgent||"";return/android/i.test(n)}async function pt(){if(typeof navigator>"u")return!1;let n=navigator;if(!n.xr||typeof n.xr.isSessionSupported!="function")return!1;try{return await n.xr.isSessionSupported("immersive-ar")?!0:await n.xr.isSessionSupported("immersive-vr")}catch{return!1}}async function Kt(){let n=[];return await pt()&&n.push("webxr"),ft()&&n.push("quick-look"),dt()&&n.push("scene-viewer"),n}async function Yt(){return(await bt()).bestMode}async function bt(){let[n,e,t]=await Promise.all([pt(),Promise.resolve(ft()),Promise.resolve(dt())]),r=[];e&&r.push("quick-look"),n&&r.push("webxr"),t&&r.push("scene-viewer");let i=null;return e?i="quick-look":n?i="webxr":t&&(i="scene-viewer"),{webxr:n,quickLook:e,sceneViewer:t,availableModes:r,bestMode:i}}function mt(n,e={}){if(typeof document>"u")throw new Error("launchQuickLook requires a browser DOM environment");let t,r=!1;if(typeof n=="string"){if(t=Ct(n),!t)throw new Error("[XR-Live Security] Quick Look URL is empty.")}else t=URL.createObjectURL(n),r=!0;let i=[];if(e.allowScale===!1&&i.push("allowsContentScaling=0"),e.canonicalWebPageUrl){let u=_e(e.canonicalWebPageUrl,!1);u&&i.push(`canonicalWebPageURL=${encodeURIComponent(u)}`)}e.checkoutTitle&&i.push(`checkoutTitle=${encodeURIComponent(e.checkoutTitle)}`),e.checkoutSubtitle&&i.push(`checkoutSubtitle=${encodeURIComponent(e.checkoutSubtitle)}`),e.price&&i.push(`price=${encodeURIComponent(e.price)}`),i.length>0&&(t+=`#${i.join("&")}`);let s=document.createElement("a");s.setAttribute("rel","ar"),s.setAttribute("href",t);let a=document.createElement("img");a.setAttribute("src","data:image/svg+xml;utf8,<svg/>"),a.style.display="none",s.appendChild(a),document.body.appendChild(s),s.click(),setTimeout(()=>{document.body.removeChild(s),r&&URL.revokeObjectURL(t.split("#")[0])},3e3)}function _e(n,e=!1){if(typeof n!="string")return"";let t=n.replace(/[\x00-\x1f\x7f]+/g,"").trim();if(!t)return"";if(/^[\\/]{2}/.test(t))throw new Error(`[XR-Live Security] Rejected protocol-relative URL in Scene Viewer intent: ${t.slice(0,32)}`);let r=t.toLowerCase();if(r.startsWith("https://")||r.startsWith("http://")||e&&r.startsWith("blob:")||!/^[a-z][a-z0-9+.-]*:/i.test(t))return t;throw new Error(`[XR-Live Security] Rejected unsafe URL scheme in Scene Viewer intent: ${t.slice(0,32)}`)}function Ct(n){try{return _e(n,!0)}catch{throw new Error(`[XR-Live Security] Rejected unsafe URL scheme in Quick Look launch: ${(n||"").trim().slice(0,32)}`)}}function It(n,e={}){let t=_e(n,!0),r=e.mode||"ar_preferred",i=new URLSearchParams({file:t,mode:r,resizable:e.resizable!==!1?"true":"false",enable_vertical_placement:e.enableVerticalPlacement?"true":"false"});return e.title&&i.set("title",e.title),e.link&&i.set("link",_e(e.link,!1)),`intent://arvr.google.com/scene-viewer/1.0?${i.toString()}#Intent;scheme=https;package=com.google.ar.core;action=android.intent.action.VIEW;end;`}function _t(n,e={}){if(typeof window>"u")throw new Error("launchSceneViewer requires a browser environment");let t=It(n,e);window.location.href=t}var xe=null;function Ut(n,e){let r=new Float32Array(144),i=new Float32Array(24*6),s=new Float32Array(24*4),a=new Uint16Array(24*6);for(let h=0;h<24;h++){let g=h/24*Math.PI*2,R=Math.cos(g),f=Math.sin(g),m=h*2,p=m+1,L=(h+1)%24*2;r[m*3]=R*.11,r[m*3+1]=.002,r[m*3+2]=f*.11,r[p*3]=R*.145,r[p*3+1]=.002,r[p*3+2]=f*.145,i[m*3+1]=i[p*3+1]=1,a.set([m,L,p,p,L,L+1],h*6)}let u=n.createVertexArray();n.bindVertexArray(u);let l=(h,g,R)=>{let f=n.createBuffer();return n.bindBuffer(34962,f),n.bufferData(34962,h,35044),n.enableVertexAttribArray(g),n.vertexAttribPointer(g,R,5126,!1,0,0),f},c=[l(r,0,3),l(i,1,3),l(s,2,2)],o=n.createBuffer();return c.push(o),n.bindBuffer(34963,o),n.bufferData(34963,a,35044),n.bindVertexArray(null),{name:"__xr_reticle__",nodeIndex:-1,worldSpace:!0,visible:!1,transform:new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),normalMatrix:new Float32Array([1,0,0,0,1,0,0,0,1]),primitives:[{vao:u,indexCount:a.length,indexType:5123,baseColor:e&&e.length>=3?[e[0],e[1],e[2],e[3]??.95]:[.22,.74,.97,.95],metallic:0,roughness:.2,positions:r,indices:a,texture:null,metallicRoughnessTexture:null,normalTexture:null,occlusionTexture:null,normalScale:1,occlusionStrength:1,buffers:c}]}}function ht(n,e,t,r,i){let s=Math.cos(r),a=Math.sin(r),u=Math.max(.01,i);n.fill(0),n[0]=u*s,n[2]=-u*a,n[5]=u,n[8]=u*a,n[10]=u*s,n[12]=e[0]-u*(s*t[0]+a*t[2]),n[13]=e[1]-u*t[1],n[14]=e[2]-u*(-a*t[0]+s*t[2]),n[15]=1}var ze=class{constructor(e={}){this.s=null;this.placed=!1;this.placedMat=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);this.cleanFn=null;this.opts=e}isSessionActive(){return this.s!==null}hasPlacedModel(){return this.placed}getPlacedMatrix(){return this.placedMat}async start(e,t){if(typeof navigator>"u"||!navigator.xr)throw new Error("WebXR is not supported on this browser.");xe&&xe!==this&&xe.isSessionActive()&&await xe.stop().catch(()=>{});let r=navigator.xr,i=this.opts,s=t||e?.container,a=String(s?.tagName||"").toLowerCase()==="xr-live",u=e?.bounds,l=Number(u?.radius)||1,c=Array.isArray(u?.center)?u.center:[0,0,0],o=Array.isArray(u?.min)?u.min:[-.5,-.5,-.5],h=typeof navigator<"u"&&navigator.userAgent||"",g=/Android|iPhone|iPad|iPod/i.test(h)&&!/Quest|Oculus|Pico|Vision/i.test(h),R=a?i.arScale==="fixed"?1:g?.55:1:i.arScale==="fixed"?1:l>.45?.3/l:l<.05?.12/Math.max(l,.001):1,f=a?[0,-.25,0]:[c[0]||0,i.arPlacement==="wall"?c[1]:o[1]??0,c[2]||0],m="immersive-ar";try{await r.isSessionSupported("immersive-ar")||(m="immersive-vr")}catch{m="immersive-vr"}let p=s?.querySelector?.('[slot="ar-overlay"]')||null,L=!1,F=null,A=()=>{L&&p?.parentNode&&p.parentNode.removeChild(p),p=null,F=null,L=!1};if(m==="immersive-ar"){if(p)p.addEventListener?.("beforexrselect",y=>y.preventDefault());else if(typeof document<"u"&&document.body&&typeof document.createElement=="function"){let y=document.createElement("div");y.style.cssText="position:fixed;inset:0;pointer-events:none;background:transparent!important;z-index:2147483647;font-family:system-ui,sans-serif;user-select:none";let P=document.createElement("button");P.type="button",P.textContent="\u2715 Exit AR",P.style.cssText="position:absolute;top:max(16px,env(safe-area-inset-top,16px));right:16px;pointer-events:auto;padding:8px 14px;border-radius:99px;border:1px solid rgba(255,255,255,.3);background:rgba(15,23,42,.8);color:#f8fafc;font:600 13px system-ui,sans-serif",P.addEventListener("beforexrselect",N=>N.preventDefault()),P.addEventListener("click",N=>{N.stopPropagation(),this.stop().catch(()=>{})}),F=document.createElement("div"),F.style.cssText="position:absolute;bottom:max(28px,env(safe-area-inset-bottom,28px));left:50%;transform:translateX(-50%);padding:8px 15px;border-radius:99px;border:1px solid rgba(56,189,248,.4);background:rgba(15,23,42,.82);color:#f8fafc;font:500 12.5px system-ui,sans-serif;text-align:center;max-width:88vw",F.textContent="Move phone to detect a surface \u2022 Tap to place",y.appendChild(P),y.appendChild(F),document.body.appendChild(y),p=y,L=!0}}let I=new Set(i.optionalFeatures||["local","local-floor","hit-test","light-estimation"]),x={requiredFeatures:i.requiredFeatures?[...i.requiredFeatures]:[],optionalFeatures:Array.from(I)};p&&(I.add("dom-overlay"),x.optionalFeatures=Array.from(I),x.domOverlay={root:p});for(let y of ne)y.onConfigureXRSessionInit?.(s,x);Array.isArray(x.optionalFeatures)&&x.optionalFeatures.includes("dom-overlay")&&!x.domOverlay?.root&&(x.optionalFeatures=x.optionalFeatures.filter(y=>y!=="dom-overlay"));let v=y=>{let P=String(y?.name||"");return P==="NotAllowedError"||P==="SecurityError"};try{this.s=await r.requestSession(m,x)}catch(y){if(A(),v(y))throw i.onError?.(y),y;try{this.s=await r.requestSession(m,{requiredFeatures:[],optionalFeatures:["local","hit-test"]})}catch(P){if(v(P))throw i.onError?.(P),P;try{this.s=await r.requestSession(m)}catch(N){throw i.onError?.(N),N}}}let E=this.s;xe=this,this.placed=!1;let b=null,S=null,w=null,D=null,M=null,d=[0,-.25,-1.2],C=[0,-.25,-1.2],_=new Float32Array(16),T=new Float32Array(16),O=!1,U=1,$=0,B=!1,H=null,G=null,X=0,q=null,ee=()=>{xe===this&&(xe=null),q?.(),q=null;try{S?.cancel?.()}catch{}if(S=null,w){let y=e?.meshes;if(Array.isArray(y)){let N=y.indexOf(w);N!==-1&&y.splice(N,1)}let P=e.getGLContext?.()||e?.gl;if(P)for(let N of w.primitives||[]){P.deleteVertexArray?.(N.vao);for(let V of N.buffers||[])P.deleteBuffer?.(V)}w=null}e?.setXRSessionActive?.(!1),A(),this.s=null,this.placed=!1,this.cleanFn=null};this.cleanFn=ee,E.addEventListener("end",()=>{ee(),i.onExit?.()}),E.addEventListener("select",()=>{if(!this.placed){let y=M||d;C=[y[0],y[1],y[2]],ht(this.placedMat,C,f,$,R*U),this.placed=!0,w&&(w.visible=!1),F&&(F.textContent="Placed \u2022 Drag to move \u2022 Pinch to scale"),i.onPlaced?.(this.placedMat)}});try{let y=e.getGLContext?.()||e?.gl;y&&typeof y.makeXRCompatible=="function"&&await y.makeXRCompatible();let P=typeof XRWebGLLayer<"u"?XRWebGLLayer:globalThis?.XRWebGLLayer;y&&typeof P=="function"&&typeof E.updateRenderState=="function"&&E.updateRenderState({baseLayer:new P(E,y,{alpha:!0})});try{b=await E.requestReferenceSpace("local")}catch{try{b=await E.requestReferenceSpace("local-floor")}catch{b=await E.requestReferenceSpace("viewer")}}let N=await E.requestReferenceSpace("viewer").catch(()=>b);if(typeof E.requestHitTestSource=="function"&&N&&(S=await E.requestHitTestSource({space:N}).catch(()=>null)),m==="immersive-ar"&&y&&typeof y.createVertexArray=="function"&&Array.isArray(e.meshes)&&(w=Ut(y,i.reticleColor),e.meshes.push(w)),typeof window<"u"&&typeof window.addEventListener=="function"){let j=k=>Math.hypot(k.touches[1].clientX-k.touches[0].clientX,k.touches[1].clientY-k.touches[0].clientY),Q=k=>Math.atan2(k.touches[1].clientY-k.touches[0].clientY,k.touches[1].clientX-k.touches[0].clientX),z=k=>{this.s&&(k.touches.length===1&&this.placed?B=!0:k.touches.length>=2&&(B=!1,H=j(k),G=Q(k)))},K=k=>{if(!this.s||k.touches.length<2)return;let ae=j(k),re=Q(k);if(H&&H>4&&i.arScale!=="fixed"&&(U=Math.max(.15,Math.min(6,U*(ae/H)))),G!==null){let le=re-G;le>Math.PI&&(le-=Math.PI*2),le<-Math.PI&&(le+=Math.PI*2),$-=le}H=ae,G=re},se=k=>{(!k.touches||k.touches.length===0)&&(B=!1),(!k.touches||k.touches.length<2)&&(H=null,G=null)};window.addEventListener("touchstart",z,{passive:!0}),window.addEventListener("touchmove",K,{passive:!0}),window.addEventListener("touchend",se,{passive:!0}),window.addEventListener("touchcancel",se,{passive:!0}),q=()=>{window.removeEventListener("touchstart",z),window.removeEventListener("touchmove",K),window.removeEventListener("touchend",se),window.removeEventListener("touchcancel",se)}}e.setXRSessionActive?.(!0);let V=(j,Q)=>{if(this.s!==E)return;E.requestAnimationFrame(V);let z=X>0?Math.min(Math.max((j-X)/1e3,0),.1):1/60;X=j,e?.stepXRUpdate?.(z);let K=Q.getViewerPose(b);if(!K)return;let se=K.views?.[0];if(!O&&se?.transform){let ie=se.transform.position,J=se.transform.matrix,he=ie?.x??(J?J[12]:0),ue=ie?.y??(J?J[13]:0),fe=ie?.z??(J?J[14]:0),be=J?-J[8]:0,ye=J?-J[10]:-1,Te=Math.hypot(be,ye);Te>1e-4?(be/=Te,ye/=Te):(be=0,ye=-1),d=[he+be*1.2,ue-.25,fe+ye*1.2],$=Math.atan2(-be,-ye),O=!0}if(S&&typeof Q.getHitTestResults=="function"&&(!this.placed||B)){let ie=Q.getHitTestResults(S)||[],J=!1;for(let he of ie){let ue=he.getPose(b);if(ue?.transform?.matrix){let fe=ue.transform.matrix,be=fe[5];if(i.arPlacement==="wall"&&Math.abs(be)>.35||i.arPlacement==="floor"&&Math.abs(be)<.65)continue;D||(D=new Float32Array(16)),D.set(fe),M=[fe[12],fe[13],fe[14]],this.placed&&B&&(C=[fe[12],fe[13],fe[14]]),w&&(w.visible=!this.placed||B,w.transform.set(fe)),!this.placed&&F&&(F.textContent="Surface found \u2022 Tap to place \u2022 Pinch to scale"),i.onHit?.(D),J=!0;break}}!J&&w&&(w.visible=!1)}ht(_,this.placed?C:M||d,f,$,R*U),this.placed&&this.placedMat.set(_);let k=e.xrRigMatrix;k instanceof Float32Array&&k.length===16?te(T,k,_):T.set(_),e.modelRootMatrix&&e.modelRootMatrix.set(T);for(let ie of ne)ie.onXRFrame?.(e,E,Q,b);let ae=e.getGLContext?.()||e?.gl,re=E.renderState?.baseLayer;ae&&re&&re.framebuffer!==void 0&&ae.bindFramebuffer(36160,re.framebuffer);let le=m==="immersive-ar",me=K.views||[];for(let ie=0;ie<me.length;ie++){let J=me[ie];if(typeof e.renderXRView=="function"){let he;if(re&&typeof re.getViewport=="function"){let ue=re.getViewport(J);ue&&ue.width>0&&ue.height>0&&(he=[ue.x,ue.y,ue.width,ue.height])}else re?.framebufferWidth>0&&re?.framebufferHeight>0&&(he=[0,0,re.framebufferWidth,re.framebufferHeight]);e.renderXRView(J,T,this.placed,he,le,ie)}}ae&&re&&re.framebuffer&&ae.bindFramebuffer(36160,null)};E.requestAnimationFrame(V)}catch(y){throw typeof E.end=="function"&&await E.end().catch(()=>{}),ee(),i.onError?.(y),y}}async stop(){let e=this.s;if(e)try{await e.end()}catch{}finally{this.cleanFn?.()}else this.cleanFn?.()}};async function Zt(n){let e=await bt(),t=n.preferredModes||["quick-look","webxr","scene-viewer"],r=null;for(let u of t)if(e.availableModes.includes(u)){r=u;break}if(r||(r=e.bestMode),!r)return{mode:"quick-look",success:!1,error:new Error("No augmented reality viewing mode is supported on this device.")};let i={...n.quickLookOptions,allowScale:n.arScale==="fixed"?!1:n.quickLookOptions?.allowScale},s={...n.sceneViewerOptions,resizable:n.arScale==="fixed"?!1:n.sceneViewerOptions?.resizable,enableVerticalPlacement:n.arPlacement==="wall"?!0:n.sceneViewerOptions?.enableVerticalPlacement},a={...n.webXROptions,arScale:n.arScale||n.webXROptions?.arScale,arPlacement:n.arPlacement||n.webXROptions?.arPlacement};try{if(r==="quick-look"){let u;if(n.model instanceof Blob&&n.model.type==="model/vnd.usdz+zip")u=n.model;else{if(typeof n.model=="string")return mt(n.model,i),{mode:"quick-look",success:!0};u=lt(n.model)}return mt(u,i),{mode:"quick-look",success:!0}}if(r==="scene-viewer"){let u=n.glbUrl||(typeof n.model=="string"?n.model:null);if(!u)throw new Error("Scene Viewer requires a hosted GLB URL (glbUrl option).");return _t(u,s),{mode:"scene-viewer",success:!0}}if(r==="webxr"){if(!n.view)throw new Error("WebXR AR mode requires an active ThreeView instance.");let u=new ze(a);return await u.start(n.view,n.element),{mode:"webxr",success:!0,session:u}}}catch(u){return{mode:r,success:!1,error:u}}return{mode:r,success:!1,error:new Error(`Unhandled AR mode: ${r}`)}}export{ze as WebXRSessionManager,Zt as activateAR,He as buildUSDZZip,ot as calculateCRC32,It as createSceneViewerIntent,lt as createUSDZBlob,at as generateUSDA,ut as generateUSDZ,bt as getARCapabilities,Kt as getAvailableARModes,Yt as getBestARMode,ct as glbToUSDZ,ft as isQuickLookSupported,dt as isSceneViewerSupported,pt as isWebXRSupported,mt as launchQuickLook,_t as launchSceneViewer};
319
+ `,a}function ot(n,e){if(n&&typeof n.traverse=="function"){let i=Dt(n,e);return ke(i)}let t=xe(n),r=at(t);return ke(r)}var Ee=null;function ct(n){if(!Ee){Ee=new Uint32Array(256);for(let t=0;t<256;t++){let r=t;for(let i=0;i<8;i++)r=r&1?3988292384^r>>>1:r>>>1;Ee[t]=r}}let e=4294967295;for(let t=0;t<n.length;t++)e=Ee[(e^n[t])&255]^e>>>8;return(e^4294967295)>>>0}function Ve(n){let e=[],t=0,r=[];for(let u of n){let d=Be(u.filename),f=ct(u.data),T=u.data.length,p=30+d.length,h=t+p,b=0,R=h%64;R!==0&&(b=64-R);let A=new Uint8Array(p+b),v=new DataView(A.buffer);v.setUint32(0,67324752,!0),v.setUint16(4,20,!0),v.setUint16(6,0,!0),v.setUint16(8,0,!0),v.setUint16(10,0,!0),v.setUint16(12,0,!0),v.setUint32(14,f,!0),v.setUint32(18,T,!0),v.setUint32(22,T,!0),v.setUint16(26,d.length,!0),v.setUint16(28,b,!0),A.set(d,30),b>0&&A.fill(0,30+d.length),e.push({offset:t,size:T,crc:f,filenameBytes:d,entry:u}),r.push(A),r.push(u.data),t+=A.length+u.data.length}let i=t;for(let u of e){let d=new Uint8Array(46+u.filenameBytes.length),f=new DataView(d.buffer);f.setUint32(0,33639248,!0),f.setUint16(4,20,!0),f.setUint16(6,20,!0),f.setUint16(8,0,!0),f.setUint16(10,0,!0),f.setUint16(12,0,!0),f.setUint16(14,0,!0),f.setUint32(16,u.crc,!0),f.setUint32(20,u.size,!0),f.setUint32(24,u.size,!0),f.setUint16(28,u.filenameBytes.length,!0),f.setUint16(30,0,!0),f.setUint16(32,0,!0),f.setUint16(34,0,!0),f.setUint16(36,0,!0),f.setUint32(38,0,!0),f.setUint32(42,u.offset,!0),d.set(u.filenameBytes,46),r.push(d),t+=d.length}let s=t-i,a=new Uint8Array(22),c=new DataView(a.buffer);c.setUint32(0,101010256,!0),c.setUint16(4,0,!0),c.setUint16(6,0,!0),c.setUint16(8,e.length,!0),c.setUint16(10,e.length,!0),c.setUint32(12,s,!0),c.setUint32(16,i,!0),c.setUint16(20,0,!0),r.push(a),t+=22;let o=new Uint8Array(t),l=0;for(let u of r)o.set(u,l),l+=u.length;return o}function It(n){let e=ot(n),t=Be(e);return Ve([{filename:"model.usda",data:t}])}function ut(n){let e=xe(n),t=at(e),r=ke(t),i=Be(r);return Ve([{filename:"model.usda",data:i}])}function lt(n){return n&&typeof n.toUSDZ=="function"?n.toUSDZ():n&&typeof n.traverse=="function"?It(n):ut(n)}function mt(n){let e=lt(n);return new Blob([e],{type:"model/vnd.usdz+zip"})}function dt(){if(typeof window>"u"||typeof navigator>"u")return!1;let n=navigator.userAgent||"";if(!(/iPad|iPhone|iPod/.test(n)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1))return!1;let t=document.createElement("a");return t.relList!==void 0&&t.relList.supports!==void 0&&t.relList.supports("ar")}function pt(){if(typeof navigator>"u")return!1;let n=navigator.userAgent||"";return/android/i.test(n)}async function bt(){if(typeof navigator>"u")return!1;let n=navigator;if(!n.xr||typeof n.xr.isSessionSupported!="function")return!1;try{return await n.xr.isSessionSupported("immersive-ar")?!0:await n.xr.isSessionSupported("immersive-vr")}catch{return!1}}async function Jt(){let n=[];return await bt()&&n.push("webxr"),dt()&&n.push("quick-look"),pt()&&n.push("scene-viewer"),n}async function en(){return(await yt()).bestMode}async function yt(){let[n,e,t]=await Promise.all([bt(),Promise.resolve(dt()),Promise.resolve(pt())]),r=[];e&&r.push("quick-look"),n&&r.push("webxr"),t&&r.push("scene-viewer");let i=null;return e?i="quick-look":n?i="webxr":t&&(i="scene-viewer"),{webxr:n,quickLook:e,sceneViewer:t,availableModes:r,bestMode:i}}function ht(n,e={}){if(typeof document>"u")throw new Error("launchQuickLook requires a browser DOM environment");let t,r=!1;if(typeof n=="string"){if(t=Nt(n),!t)throw new Error("[XR-Live Security] Quick Look URL is empty.")}else t=URL.createObjectURL(n),r=!0;let i=[];if(e.allowScale===!1&&i.push("allowsContentScaling=0"),e.canonicalWebPageUrl){let c=Le(e.canonicalWebPageUrl,!1);c&&i.push(`canonicalWebPageURL=${encodeURIComponent(c)}`)}e.checkoutTitle&&i.push(`checkoutTitle=${encodeURIComponent(e.checkoutTitle)}`),e.checkoutSubtitle&&i.push(`checkoutSubtitle=${encodeURIComponent(e.checkoutSubtitle)}`),e.price&&i.push(`price=${encodeURIComponent(e.price)}`),i.length>0&&(t+=`#${i.join("&")}`);let s=document.createElement("a");s.setAttribute("rel","ar"),s.setAttribute("href",t);let a=document.createElement("img");a.setAttribute("src","data:image/svg+xml;utf8,<svg/>"),a.style.display="none",s.appendChild(a),document.body.appendChild(s),s.click(),setTimeout(()=>{document.body.removeChild(s),r&&URL.revokeObjectURL(t.split("#")[0])},3e3)}function Le(n,e=!1){if(typeof n!="string")return"";let t=n.replace(/[\x00-\x1f\x7f]+/g,"").trim();if(!t)return"";if(/^[\\/]{2}/.test(t))throw new Error(`[XR-Live Security] Rejected protocol-relative URL in Scene Viewer intent: ${t.slice(0,32)}`);let r=t.toLowerCase();if(r.startsWith("https://")||r.startsWith("http://")||e&&r.startsWith("blob:")||!/^[a-z][a-z0-9+.-]*:/i.test(t))return t;throw new Error(`[XR-Live Security] Rejected unsafe URL scheme in Scene Viewer intent: ${t.slice(0,32)}`)}function Nt(n){try{return Le(n,!0)}catch{throw new Error(`[XR-Live Security] Rejected unsafe URL scheme in Quick Look launch: ${(n||"").trim().slice(0,32)}`)}}function Ut(n,e={}){let t=Le(n,!0),r=e.mode||"ar_preferred",i=new URLSearchParams({file:t,mode:r,resizable:e.resizable!==!1?"true":"false",enable_vertical_placement:e.enableVerticalPlacement?"true":"false"});return e.title&&i.set("title",e.title),e.link&&i.set("link",Le(e.link,!1)),`intent://arvr.google.com/scene-viewer/1.0?${i.toString()}#Intent;scheme=https;package=com.google.ar.core;action=android.intent.action.VIEW;end;`}function kt(n,e={}){if(typeof window>"u")throw new Error("launchSceneViewer requires a browser environment");let t=Ut(n,e);window.location.href=t}var de=null;function Bt(n,e){let r=new Float32Array(144),i=new Float32Array(24*6),s=new Float32Array(24*4),a=new Uint16Array(24*6);for(let d=0;d<24;d++){let f=d/24*Math.PI*2,T=Math.cos(f),p=Math.sin(f),h=d*2,b=h+1,R=(d+1)%24*2;r[h*3]=T*.11,r[h*3+1]=.002,r[h*3+2]=p*.11,r[b*3]=T*.145,r[b*3+1]=.002,r[b*3+2]=p*.145,i[h*3+1]=i[b*3+1]=1,a.set([h,R,b,b,R,R+1],d*6)}let c=n.createVertexArray();n.bindVertexArray(c);let o=(d,f,T)=>{let p=n.createBuffer();return n.bindBuffer(34962,p),n.bufferData(34962,d,35044),n.enableVertexAttribArray(f),n.vertexAttribPointer(f,T,5126,!1,0,0),p},l=[o(r,0,3),o(i,1,3),o(s,2,2)],u=n.createBuffer();return l.push(u),n.bindBuffer(34963,u),n.bufferData(34963,a,35044),n.bindVertexArray(null),{name:"__xr_reticle__",nodeIndex:-1,worldSpace:!0,visible:!1,transform:new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),normalMatrix:new Float32Array([1,0,0,0,1,0,0,0,1]),primitives:[{vao:c,indexCount:a.length,indexType:5123,baseColor:e&&e.length>=3?[e[0],e[1],e[2],e[3]??.95]:[.22,.74,.97,.95],metallic:0,roughness:.2,positions:r,indices:a,texture:null,metallicRoughnessTexture:null,normalTexture:null,occlusionTexture:null,normalScale:1,occlusionStrength:1,buffers:l}]}}function ft(n,e,t,r,i){let s=Math.cos(r),a=Math.sin(r),c=Math.max(.01,i);n.fill(0),n[0]=c*s,n[2]=-c*a,n[5]=c,n[8]=c*a,n[10]=c*s,n[12]=e[0]-c*(s*t[0]+a*t[2]),n[13]=e[1]-c*t[1],n[14]=e[2]-c*(-a*t[0]+s*t[2]),n[15]=1}var Oe=class{constructor(e={}){this.s=null;this.placed=!1;this.placedMat=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);this.cleanFn=null;this.opts=e}isSessionActive(){return this.s!==null}hasPlacedModel(){return this.placed}getPlacedMatrix(){return this.placedMat}async start(e,t){if(typeof navigator>"u"||!navigator.xr)throw new Error("WebXR is not supported on this browser.");de&&de!==this&&de.isSessionActive()&&await de.stop().catch(()=>{});let r=navigator.xr,i=this.opts,s=t||e?.container,a=String(s?.tagName||"").toLowerCase()==="xr-live",c=e?.bounds,o=Number(c?.radius)||1,l=Array.isArray(c?.center)?c.center:[0,0,0],u=Array.isArray(c?.min)?c.min:[-.5,-.5,-.5],d=typeof navigator<"u"&&navigator.userAgent||"",f=/Android|iPhone|iPad|iPod/i.test(d)&&!/Quest|Oculus|Pico|Vision/i.test(d),T=a?i.arScale==="fixed"?1:f?.55:1:i.arScale==="fixed"?1:o>.45?.3/o:o<.05?.12/Math.max(o,.001):1,p=a?[0,-.25,0]:[l[0]||0,i.arPlacement==="wall"?l[1]:u[1]??0,l[2]||0],h="immersive-ar";try{await r.isSessionSupported("immersive-ar")||(h="immersive-vr")}catch{h="immersive-vr"}let b=s?.querySelector?.('[slot="ar-overlay"]')||null,R=!1,A=null,v=()=>{R&&b?.parentNode&&b.parentNode.removeChild(b),b=null,A=null,R=!1};if(h==="immersive-ar"){if(b)b.addEventListener?.("beforexrselect",x=>x.preventDefault());else if(typeof document<"u"&&document.body&&typeof document.createElement=="function"){let x=document.createElement("div");x.style.cssText="position:fixed;inset:0;pointer-events:none;background:transparent!important;z-index:2147483647;font-family:system-ui,sans-serif;user-select:none";let I=document.createElement("button");I.type="button",I.textContent="\u2715 Exit AR",I.style.cssText="position:absolute;top:max(16px,env(safe-area-inset-top,16px));right:16px;pointer-events:auto;padding:8px 14px;border-radius:99px;border:1px solid rgba(255,255,255,.3);background:rgba(15,23,42,.8);color:#f8fafc;font:600 13px system-ui,sans-serif",I.addEventListener("beforexrselect",N=>N.preventDefault()),I.addEventListener("click",N=>{N.stopPropagation(),this.stop().catch(()=>{})}),A=document.createElement("div"),A.style.cssText="position:absolute;bottom:max(28px,env(safe-area-inset-bottom,28px));left:50%;transform:translateX(-50%);padding:8px 15px;border-radius:99px;border:1px solid rgba(56,189,248,.4);background:rgba(15,23,42,.82);color:#f8fafc;font:500 12.5px system-ui,sans-serif;text-align:center;max-width:88vw",A.textContent="Move phone to detect a surface \u2022 Tap to place",x.appendChild(I),x.appendChild(A),document.body.appendChild(x),b=x,R=!0}}let D=new Set(i.optionalFeatures||["local","local-floor","hit-test","light-estimation"]),g={requiredFeatures:i.requiredFeatures?[...i.requiredFeatures]:[],optionalFeatures:Array.from(D)};b&&(D.add("dom-overlay"),g.optionalFeatures=Array.from(D),g.domOverlay={root:b});for(let x of ae)x.onConfigureXRSessionInit?.(s,g);Array.isArray(g.optionalFeatures)&&g.optionalFeatures.includes("dom-overlay")&&!g.domOverlay?.root&&(g.optionalFeatures=g.optionalFeatures.filter(x=>x!=="dom-overlay"));let P=x=>{let I=String(x?.name||"");return I==="NotAllowedError"||I==="SecurityError"};try{this.s=await r.requestSession(h,g)}catch(x){if(v(),P(x))throw i.onError?.(x),x;try{this.s=await r.requestSession(h,{requiredFeatures:[],optionalFeatures:["local","hit-test"]})}catch(I){if(P(I))throw i.onError?.(I),I;try{this.s=await r.requestSession(h)}catch(N){throw i.onError?.(N),N}}}let E=this.s;de=this,this.placed=!1;let y=null,F=null,L=null,C=null,m=null,w=[0,-.25,-1.2],S=[0,-.25,-1.2],M=new Float32Array(16),k=new Float32Array(16),_=!1,K=1,U=0,O=!1,B=null,q=null,Y=0,W=null,j=()=>{de===this&&(de=null),W?.(),W=null;try{F?.cancel?.()}catch{}if(F=null,L){let x=e?.meshes;if(Array.isArray(x)){let N=x.indexOf(L);N!==-1&&x.splice(N,1)}let I=e.getGLContext?.()||e?.gl;if(I)for(let N of L.primitives||[]){I.deleteVertexArray?.(N.vao);for(let z of N.buffers||[])I.deleteBuffer?.(z)}L=null}e?.setXRSessionActive?.(!1),v(),this.s=null,this.placed=!1,this.cleanFn=null};this.cleanFn=j,E.addEventListener("end",()=>{j(),i.onExit?.()}),E.addEventListener("select",()=>{if(!this.placed){let x=m||w;S=[x[0],x[1],x[2]],ft(this.placedMat,S,p,U,T*K),this.placed=!0,L&&(L.visible=!1),A&&(A.textContent="Placed \u2022 Drag to move \u2022 Pinch to scale"),i.onPlaced?.(this.placedMat)}});try{let x=e.getGLContext?.()||e?.gl;x&&typeof x.makeXRCompatible=="function"&&await x.makeXRCompatible();let I=typeof XRWebGLLayer<"u"?XRWebGLLayer:globalThis?.XRWebGLLayer;x&&typeof I=="function"&&typeof E.updateRenderState=="function"&&E.updateRenderState({baseLayer:new I(E,x,{alpha:!0})});try{y=await E.requestReferenceSpace("local")}catch{try{y=await E.requestReferenceSpace("local-floor")}catch{y=await E.requestReferenceSpace("viewer")}}let N=await E.requestReferenceSpace("viewer").catch(()=>y);if(typeof E.requestHitTestSource=="function"&&N&&(F=await E.requestHitTestSource({space:N}).catch(()=>null)),h==="immersive-ar"&&x&&typeof x.createVertexArray=="function"&&Array.isArray(e.meshes)&&(L=Bt(x,i.reticleColor),e.meshes.push(L)),typeof window<"u"&&typeof window.addEventListener=="function"){let ee=G=>Math.hypot(G.touches[1].clientX-G.touches[0].clientX,G.touches[1].clientY-G.touches[0].clientY),ie=G=>Math.atan2(G.touches[1].clientY-G.touches[0].clientY,G.touches[1].clientX-G.touches[0].clientX),oe=G=>{this.s&&(G.touches.length===1&&this.placed?O=!0:G.touches.length>=2&&(O=!1,B=ee(G),q=ie(G)))},H=G=>{if(!this.s||G.touches.length<2)return;let te=ee(G),V=ie(G);if(B&&B>4&&i.arScale!=="fixed"&&(K=Math.max(.15,Math.min(6,K*(te/B)))),q!==null){let J=V-q;J>Math.PI&&(J-=Math.PI*2),J<-Math.PI&&(J+=Math.PI*2),U-=J}B=te,q=V},$=G=>{(!G.touches||G.touches.length===0)&&(O=!1),(!G.touches||G.touches.length<2)&&(B=null,q=null)};window.addEventListener("touchstart",oe,{passive:!0}),window.addEventListener("touchmove",H,{passive:!0}),window.addEventListener("touchend",$,{passive:!0}),window.addEventListener("touchcancel",$,{passive:!0}),W=()=>{window.removeEventListener("touchstart",oe),window.removeEventListener("touchmove",H),window.removeEventListener("touchend",$),window.removeEventListener("touchcancel",$)}}e.setXRSessionActive?.(!0);let z=(ee,ie)=>{if(this.s!==E)return;E.requestAnimationFrame(z);let oe=Y>0?Math.min(Math.max((ee-Y)/1e3,0),.1):1/60;Y=ee,e?.stepXRUpdate?.(oe);let H=ie.getViewerPose(y);if(!H)return;let $=H.views?.[0];if(!_&&$?.transform){let Z=$.transform.position,ne=$.transform.matrix,le=Z?.x??(ne?ne[12]:0),ce=Z?.y??(ne?ne[13]:0),ue=Z?.z??(ne?ne[14]:0),fe=ne?-ne[8]:0,be=ne?-ne[10]:-1,Se=Math.hypot(fe,be);Se>1e-4?(fe/=Se,be/=Se):(fe=0,be=-1),w=[le+fe*1.2,ce-.25,ue+be*1.2],U=Math.atan2(-fe,-be),_=!0}if(F&&typeof ie.getHitTestResults=="function"&&(!this.placed||O)){let Z=ie.getHitTestResults(F)||[],ne=!1;for(let le of Z){let ce=le.getPose(y);if(ce?.transform?.matrix){let ue=ce.transform.matrix,fe=ue[5];if(i.arPlacement==="wall"&&Math.abs(fe)>.35||i.arPlacement==="floor"&&Math.abs(fe)<.65)continue;C||(C=new Float32Array(16)),C.set(ue),m=[ue[12],ue[13],ue[14]],this.placed&&O&&(S=[ue[12],ue[13],ue[14]]),L&&(L.visible=!this.placed||O,L.transform.set(ue)),!this.placed&&A&&(A.textContent="Surface found \u2022 Tap to place \u2022 Pinch to scale"),i.onHit?.(C),ne=!0;break}}!ne&&L&&(L.visible=!1)}ft(M,this.placed?S:m||w,p,U,T*K),this.placed&&this.placedMat.set(M);let G=e.xrRigMatrix;G instanceof Float32Array&&G.length===16?se(k,G,M):k.set(M),e.modelRootMatrix&&e.modelRootMatrix.set(k);for(let Z of ae)Z.onXRFrame?.(e,E,ie,y);let te=e.getGLContext?.()||e?.gl,V=E.renderState?.baseLayer;te&&V&&V.framebuffer!==void 0&&te.bindFramebuffer(36160,V.framebuffer);let J=h==="immersive-ar",Q=H.views||[];for(let Z=0;Z<Q.length;Z++){let ne=Q[Z];if(typeof e.renderXRView=="function"){let le;if(V&&typeof V.getViewport=="function"){let ce=V.getViewport(ne);ce&&ce.width>0&&ce.height>0&&(le=[ce.x,ce.y,ce.width,ce.height])}else V?.framebufferWidth>0&&V?.framebufferHeight>0&&(le=[0,0,V.framebufferWidth,V.framebufferHeight]);e.renderXRView(ne,k,this.placed,le,J,Z)}}te&&V&&V.framebuffer&&te.bindFramebuffer(36160,null)};E.requestAnimationFrame(z)}catch(x){throw typeof E.end=="function"&&await E.end().catch(()=>{}),j(),i.onError?.(x),x}}async stop(){let e=this.s;if(e)try{await e.end()}catch{}finally{this.cleanFn?.()}else this.cleanFn?.()}};async function tn(n){let e=await yt(),t=n.preferredModes||["quick-look","webxr","scene-viewer"],r=null;for(let c of t)if(e.availableModes.includes(c)){r=c;break}if(r||(r=e.bestMode),!r)return{mode:"quick-look",success:!1,error:new Error("No augmented reality viewing mode is supported on this device.")};let i={...n.quickLookOptions,allowScale:n.arScale==="fixed"?!1:n.quickLookOptions?.allowScale},s={...n.sceneViewerOptions,resizable:n.arScale==="fixed"?!1:n.sceneViewerOptions?.resizable,enableVerticalPlacement:n.arPlacement==="wall"?!0:n.sceneViewerOptions?.enableVerticalPlacement},a={...n.webXROptions,arScale:n.arScale||n.webXROptions?.arScale,arPlacement:n.arPlacement||n.webXROptions?.arPlacement};try{if(r==="quick-look"){let c;if(n.model instanceof Blob&&n.model.type==="model/vnd.usdz+zip")c=n.model;else{if(typeof n.model=="string")return ht(n.model,i),{mode:"quick-look",success:!0};c=mt(n.model)}return ht(c,i),{mode:"quick-look",success:!0}}if(r==="scene-viewer"){let c=n.glbUrl||(typeof n.model=="string"?n.model:null);if(!c)throw new Error("Scene Viewer requires a hosted GLB URL (glbUrl option).");return kt(c,s),{mode:"scene-viewer",success:!0}}if(r==="webxr"){if(!n.view)throw new Error("WebXR AR mode requires an active ThreeView instance.");let c=new Oe(a);return await c.start(n.view,n.element),{mode:"webxr",success:!0,session:c}}}catch(c){return{mode:r,success:!1,error:c}}return{mode:r,success:!1,error:new Error(`Unhandled AR mode: ${r}`)}}export{Oe as WebXRSessionManager,tn as activateAR,Ve as buildUSDZZip,ct as calculateCRC32,Ut as createSceneViewerIntent,mt as createUSDZBlob,ot as generateUSDA,lt as generateUSDZ,yt as getARCapabilities,Jt as getAvailableARModes,en as getBestARMode,ut as glbToUSDZ,dt as isQuickLookSupported,pt as isSceneViewerSupported,bt as isWebXRSupported,ht as launchQuickLook,kt as launchSceneViewer};