three-live 1.2.4 → 1.3.0

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 +22 -0
  3. package/dist/three-author-engine.js +28 -26
  4. package/dist/three-author.cjs +29 -27
  5. package/dist/three-author.d.ts +22 -0
  6. package/dist/three-author.js +29 -27
  7. package/dist/three-convert.cjs +21 -19
  8. package/dist/three-convert.d.ts +22 -0
  9. package/dist/three-convert.js +21 -19
  10. package/dist/three-live-animation.cjs +4 -4
  11. package/dist/three-live-animation.d.ts +22 -0
  12. package/dist/three-live-animation.js +4 -4
  13. package/dist/three-live-animation.min.js +4 -4
  14. package/dist/three-live-cad.cjs +2 -2
  15. package/dist/three-live-cad.d.ts +22 -0
  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 +5 -3
  19. package/dist/three-live-element.d.ts +22 -0
  20. package/dist/three-live-element.js +5 -3
  21. package/dist/three-live-full.cjs +48 -46
  22. package/dist/three-live-full.js +47 -45
  23. package/dist/three-live-full.min.js +48 -46
  24. package/dist/three-live-studio.cjs +10 -10
  25. package/dist/three-live-studio.d.ts +22 -0
  26. package/dist/three-live-studio.js +10 -10
  27. package/dist/three-live-studio.min.js +10 -10
  28. package/dist/three-live-viewer.cjs +5 -3
  29. package/dist/three-live-viewer.d.ts +22 -0
  30. package/dist/three-live-viewer.js +5 -3
  31. package/dist/three-live-viewer.min.js +5 -3
  32. package/dist/three-live.cjs +23 -21
  33. package/dist/three-live.js +25 -23
  34. package/dist/three-live.min.js +23 -21
  35. package/dist/three-view.cjs +8 -6
  36. package/dist/three-view.d.ts +22 -0
  37. package/dist/three-view.js +8 -6
  38. package/dist/three-xr.cjs +24 -22
  39. package/dist/three-xr.d.ts +22 -0
  40. package/dist/three-xr.js +24 -22
  41. package/package.json +1 -1
@@ -14,8 +14,9 @@
14
14
  * See the License for the specific language governing permissions and
15
15
  * limitations under the License.
16
16
  */
17
- "use strict";var ThreeLiveViewer=(()=>{var we=Object.defineProperty;var Qe=Object.getOwnPropertyDescriptor;var et=Object.getOwnPropertyNames;var tt=Object.prototype.hasOwnProperty;var it=(n,t)=>{for(var e in t)we(n,e,{get:t[e],enumerable:!0})},rt=(n,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of et(t))!tt.call(n,i)&&i!==e&&we(n,i,{get:()=>t[i],enumerable:!(r=Qe(t,i))||r.enumerable});return n};var nt=n=>rt(we({},"__esModule",{value:!0}),n);var yt={};it(yt,{ThreeLiveElement:()=>be,ThreeView:()=>te,toGLBData:()=>pe});function Re(n,t){let e=n?.trim(),r=e?Number(e):NaN;return Number.isFinite(r)?r:t}var Ie='SecurityError: Client-modified script compilation (Use Case 1) is disabled by default to satisfy strict CSP and Trusted Types requirements. Use script-src="..." or loadScriptFromSrc(url) for server-generated scripts (Use Case 2), or explicitly opt in via ThreeLiveElement.allowClientScripts = true (or the allow-client-scripts attribute).',Fe="Security Error: client-side scripts require allow-client-scripts opt-in.";var xe="__THREE_LIVE_REGISTRY__";function $(){let n=typeof globalThis<"u"?globalThis:{};if(!n[xe]){let t={plugins:[],decoders:new Map};try{Object.defineProperty(n,xe,{value:t,writable:!1,configurable:!1,enumerable:!1})}catch{n[xe]=t}}return n[xe]}var j=$().plugins;function Ne(n){let t=$().plugins;t.some(e=>e.name===n.name)||t.push(n),n.onRegister?.()}function Be(){return $().plugins}var st={5120:1,5121:1,5122:2,5123:2,5125:4,5126:4};function Ae(n,t,e,r){if(!e||e.bufferView===void 0)return null;let i=n.bufferViews?.[e.bufferView];if(!i)return null;let s=Number(e.count??0);if(!Number.isInteger(s)||s<=0)return null;let a=e.componentType??5126,l=st[a];if(!l)throw new RangeError(`glTF accessor has unsupported componentType ${a}`);let o=l*r,c=i.byteStride&&i.byteStride>0?i.byteStride:o,u=(i.byteOffset||0)+(e.byteOffset||0);if(!Number.isInteger(u)||u<0||c<o||u+(s-1)*c+o>t.byteLength)throw new RangeError(`glTF accessor reads past the end of the binary buffer (${t.byteLength} bytes)`);if(a===5126&&c===o&&u%4===0)return new Float32Array(t,u,s*r);let f=new DataView(t),m=e.normalized===!0,g=new Float32Array(s*r);for(let d=0;d<s;d++){let A=u+d*c;for(let v=0;v<r;v++){let x=A+v*l,w;switch(a){case 5126:w=f.getFloat32(x,!0);break;case 5120:w=f.getInt8(x),m&&(w=Math.max(w/127,-1));break;case 5121:w=f.getUint8(x),m&&(w/=255);break;case 5122:w=f.getInt16(x,!0),m&&(w=Math.max(w/32767,-1));break;case 5123:w=f.getUint16(x,!0),m&&(w/=65535);break;default:w=f.getUint32(x,!0),m&&(w/=4294967295)}g[d*r+v]=w}}return g}function ke(n,t){let e=Number(t.offset?.[0]??0)||0,r=Number(t.offset?.[1]??0)||0,i=Number(t.scale?.[0]??1),s=Number(t.scale?.[1]??1),a=Number(t.rotation??0)||0,l=Math.cos(a),o=Math.sin(a),c=(Number.isFinite(i)?i:1)*l,u=(Number.isFinite(i)?i:1)*o,f=-(Number.isFinite(s)?s:1)*o,m=(Number.isFinite(s)?s:1)*l;for(let g=0;g+1<n.length;g+=2){let d=n[g],A=n[g+1];n[g]=c*d+u*A+e,n[g+1]=f*d+m*A+r}}function X(){let n=new Float32Array(16);return n[0]=1,n[5]=1,n[10]=1,n[15]=1,n}function ye(n,t,e,r,i){let s=1/Math.tan(t/2);n.fill(0),n[0]=s/e,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 Te(n,t,e,r){let[i,s,a]=t,[l,o,c]=r,[u,f,m]=e,g=i-u,d=s-f,A=a-m,v=Math.hypot(g,d,A);v<=1e-5?(g=0,d=0,A=1):(g/=v,d/=v,A/=v);let x=o*A-c*d,w=c*g-l*A,y=l*d-o*g;v=Math.hypot(x,w,y),v<=1e-5?(x=0,w=0,y=0):(x/=v,w/=v,y/=v);let T=d*y-A*w,p=A*x-g*y,M=g*w-d*x;return v=Math.hypot(T,p,M),v<=1e-5?(T=0,p=0,M=0):(T/=v,p/=v,M/=v),n[0]=x,n[1]=T,n[2]=g,n[3]=0,n[4]=w,n[5]=p,n[6]=d,n[7]=0,n[8]=y,n[9]=M,n[10]=A,n[11]=0,n[12]=-(x*i+w*s+y*a),n[13]=-(T*i+p*s+M*a),n[14]=-(g*i+d*s+A*a),n[15]=1,n}function ee(n,t,e){let r=t[0],i=t[1],s=t[2],a=t[3],l=t[4],o=t[5],c=t[6],u=t[7],f=t[8],m=t[9],g=t[10],d=t[11],A=t[12],v=t[13],x=t[14],w=t[15],y=e[0],T=e[1],p=e[2],M=e[3];return n[0]=y*r+T*l+p*f+M*A,n[1]=y*i+T*o+p*m+M*v,n[2]=y*s+T*c+p*g+M*x,n[3]=y*a+T*u+p*d+M*w,y=e[4],T=e[5],p=e[6],M=e[7],n[4]=y*r+T*l+p*f+M*A,n[5]=y*i+T*o+p*m+M*v,n[6]=y*s+T*c+p*g+M*x,n[7]=y*a+T*u+p*d+M*w,y=e[8],T=e[9],p=e[10],M=e[11],n[8]=y*r+T*l+p*f+M*A,n[9]=y*i+T*o+p*m+M*v,n[10]=y*s+T*c+p*g+M*x,n[11]=y*a+T*u+p*d+M*w,y=e[12],T=e[13],p=e[14],M=e[15],n[12]=y*r+T*l+p*f+M*A,n[13]=y*i+T*o+p*m+M*v,n[14]=y*s+T*c+p*g+M*x,n[15]=y*a+T*u+p*d+M*w,n}function Ee(n,t,e,r){let i=t[0],s=t[1],a=t[2],l=t[3],o=i+i,c=s+s,u=a+a,f=i*o,m=i*c,g=i*u,d=s*c,A=s*u,v=a*u,x=l*o,w=l*c,y=l*u,T=r[0],p=r[1],M=r[2];return n[0]=(1-(d+v))*T,n[1]=(m+y)*T,n[2]=(g-w)*T,n[3]=0,n[4]=(m-y)*p,n[5]=(1-(f+v))*p,n[6]=(A+x)*p,n[7]=0,n[8]=(g+w)*M,n[9]=(A-x)*M,n[10]=(1-(f+d))*M,n[11]=0,n[12]=e[0],n[13]=e[1],n[14]=e[2],n[15]=1,n}function ce(n,t){let e=t[0],r=t[1],i=t[2],s=t[4],a=t[5],l=t[6],o=t[8],c=t[9],u=t[10],f=u*a-l*c,m=-u*s+l*o,g=c*s-a*o,d=e*f+r*m+i*g;return d&&(d=1/d,n[0]=f*d,n[1]=m*d,n[2]=g*d,n[3]=(-u*r+i*c)*d,n[4]=(u*e-i*o)*d,n[5]=(-c*e+r*o)*d,n[6]=(l*r-i*a)*d,n[7]=(-l*e+i*s)*d,n[8]=(a*e-r*s)*d),n}function _e(n,t){let e=t[0],r=t[1],i=t[2],s=t[3],a=t[4],l=t[5],o=t[6],c=t[7],u=t[8],f=t[9],m=t[10],g=t[11],d=t[12],A=t[13],v=t[14],x=t[15],w=e*l-r*a,y=e*o-i*a,T=e*c-s*a,p=r*o-i*l,M=r*c-s*l,_=i*c-s*o,D=u*A-f*d,O=u*v-m*d,V=u*x-g*d,F=f*v-m*A,h=f*x-g*A,E=m*x-g*v,R=w*E-y*h+T*F+p*V-M*O+_*D;return R?(R=1/R,n[0]=(l*E-o*h+c*F)*R,n[1]=(i*h-r*E-s*F)*R,n[2]=(A*_-v*M+x*p)*R,n[3]=(m*M-f*_-g*p)*R,n[4]=(o*V-a*E-c*O)*R,n[5]=(e*E-i*V+s*O)*R,n[6]=(v*T-d*_-x*y)*R,n[7]=(u*_-m*T+g*y)*R,n[8]=(a*h-l*V+c*D)*R,n[9]=(r*V-e*h-s*D)*R,n[10]=(d*M-A*T+x*w)*R,n[11]=(f*T-u*M-g*w)*R,n[12]=(l*O-a*F-o*D)*R,n[13]=(e*F-r*O+i*D)*R,n[14]=(A*y-d*p-v*w)*R,n[15]=(u*p-f*y+m*w)*R,n):null}function Se(n,t,e,r,i){let s=i[0]*t+i[4]*e+i[8]*r+i[12],a=i[1]*t+i[5]*e+i[9]*r+i[13],l=i[2]*t+i[6]*e+i[10]*r+i[14],o=i[3]*t+i[7]*e+i[11]*r+i[15],c=o!==0?1/o:1;n[0]=s*c,n[1]=a*c,n[2]=l*c}function Ge(n,t,e,r,i,s,a,l,o,c,u,f,m,g,d,A,v=0){let x=c-a,w=u-l,y=f-o,T=m-a,p=g-l,M=d-o,_=i*M-s*p,D=s*T-r*M,O=r*p-i*T,V=x*_+w*D+y*O;if(V>-1e-7&&V<1e-7)return!1;let F=1/V,h=n-a,E=t-l,R=e-o,b=F*(h*_+E*D+R*O);if(b<-v||b>1+v)return!1;let N=E*y-R*w,P=R*x-h*y,K=h*w-E*x,S=F*(r*N+i*P+s*K);if(S<-v||b+S>1+v)return!1;let U=F*(T*N+p*P+M*K);if(U>1e-4&&U<A.distance){A.distance=U,A.point=[n+r*U,t+i*U,e+s*U];let k=w*M-y*p,Z=y*T-x*M,J=x*p-w*T,B=Math.hypot(k,Z,J)||1;return A.normal=[k/B,Z/B,J/B],!0}return!1}function Oe(n,t){let e=Array.isArray(n?.nodes)?n.nodes.length:0,r=[];for(let u=0;u<e;u++)r.push(X());if(e===0)return r;let i=new Set;for(let u of n.nodes)if(Array.isArray(u.children))for(let f of u.children)i.add(f);let s=new Set,a=128,l=(u,f,m=0)=>{if(m>a||u<0||u>=e||s.has(u))return;s.add(u);let g=n.nodes[u];if(!g)return;let d=X();if(t&&t[u])d.set(t[u]);else if(g.matrix&&g.matrix.length===16)d.set(g.matrix);else{let v=g.translation||[0,0,0],x=g.rotation||[0,0,0,1],w=g.scale||[1,1,1];Ee(d,x,v,w)}let A=r[u];if(f?ee(A,f,d):A.set(d),Array.isArray(g.children))for(let v of g.children)typeof v=="number"&&l(v,A,m+1)},o=[],c=n.scenes&&n.scenes[n.scene!==void 0?n.scene:0];if(c&&Array.isArray(c.nodes))o.push(...c.nodes);else for(let u=0;u<e;u++)i.has(u)||o.push(u);for(let u of o)l(u,null);for(let u=0;u<e;u++)!i.has(u)&&!o.includes(u)&&l(u,null);return r}var We=["neutral","reinhard","none","aces","agx"];function de(n){let t=String(n??"").trim().toLowerCase();return We.includes(t)?t:"neutral"}function ot(n){return We.indexOf(de(n))}function at(n){return new TextDecoder().decode(n)}var Xe=$().decoders;function ut(n,t){Xe.set(n.toLowerCase(),t)}function me(n){return Xe.get(n.toLowerCase())}function ze(n){let t=ArrayBuffer.isView(n)?n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength):n,e=new DataView(t);if(t.byteLength<12)throw new Error(`Invalid GLB buffer size: ${t.byteLength} bytes`);let r=e.getUint32(0,!0);if(r!==1179937895){let m=e.getUint8(0);throw m===123||m===32||m===10||m===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=e.getUint32(4,!0);if(i!==2)throw new Error(`Unsupported GLB version: ${i}`);let s=e.getUint32(8,!0),a=12,l=null,o=null;for(;a+8<=s&&a+8<=t.byteLength;){let m=e.getUint32(a,!0),g=e.getUint32(a+4,!0),d=a+8;if(d+m>t.byteLength)throw new Error(`Truncated GLB chunk: required ${d+m} bytes, buffer has ${t.byteLength}`);if(g===1313821514){let A=new Uint8Array(t,d,m),v=at(A);l=JSON.parse(v,(x,w)=>x==="__proto__"||x==="constructor"||x==="prototype"?void 0:w)}else g===5130562&&(o=t.slice(d,d+m));a=d+m}if(!l)throw new Error("Missing JSON chunk in GLB");let c=l.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).");for(let m of["EXT_meshopt_compression","KHR_meshopt_compression"])if(c.includes(m)&&!me("meshopt"))throw new Error(`Model requires ${m}. 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 u=o||new ArrayBuffer(0),f={gltf:l,bin:u,animations:[]};for(let m of j)m.onParseGLB?.(f);return f}function lt(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 pe(n){if(lt(n))return n;if(n instanceof ArrayBuffer||ArrayBuffer.isView(n))return ze(n);throw new TypeError("Invalid 3D model input: expected GLBData ({ gltf, bin }) or binary GLB (ArrayBuffer / ArrayBufferView).")}var Ye=`#version 300 es
18
- layout(location=0) in vec3 aPosition;
17
+ "use strict";var ThreeLiveViewer=(()=>{var we=Object.defineProperty;var Qe=Object.getOwnPropertyDescriptor;var et=Object.getOwnPropertyNames;var tt=Object.prototype.hasOwnProperty;var it=(n,t)=>{for(var e in t)we(n,e,{get:t[e],enumerable:!0})},rt=(n,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of et(t))!tt.call(n,i)&&i!==e&&we(n,i,{get:()=>t[i],enumerable:!(r=Qe(t,i))||r.enumerable});return n};var nt=n=>rt(we({},"__esModule",{value:!0}),n);var yt={};it(yt,{ThreeLiveElement:()=>be,ThreeView:()=>te,toGLBData:()=>pe});function Ae(n,t){let e=n?.trim(),r=e?Number(e):NaN;return Number.isFinite(r)?r:t}var Fe='SecurityError: Client-modified script compilation (Use Case 1) is disabled by default to satisfy strict CSP and Trusted Types requirements. Use script-src="..." or loadScriptFromSrc(url) for server-generated scripts (Use Case 2), or explicitly opt in via ThreeLiveElement.allowClientScripts = true (or the allow-client-scripts attribute).',Ne="Security Error: client-side scripts require allow-client-scripts opt-in.";var xe="__THREE_LIVE_REGISTRY__";function $(){let n=typeof globalThis<"u"?globalThis:{};if(!n[xe]){let t={plugins:[],decoders:new Map};try{Object.defineProperty(n,xe,{value:t,writable:!1,configurable:!1,enumerable:!1})}catch{n[xe]=t}}return n[xe]}var Y=$().plugins;function Be(n){let t=$().plugins;t.some(e=>e.name===n.name)||t.push(n),n.onRegister?.()}function ke(){return $().plugins}function ye(n,t,e,r=!0){let i=[],s=null;try{for(let[o,l]of[[35633,t],[35632,e]]){let a=n.createShader(o);if(!a){if(r)throw new Error("Shader allocation failed");return null}if(i.push(a),n.shaderSource(a,l),n.compileShader(a),n.getShaderParameter&&!n.getShaderParameter(a,35713)){if(r)throw new Error(`Shader compile error: ${n.getShaderInfoLog(a)}`);return null}}if(s=n.createProgram(),!s){if(r)throw new Error("Program allocation failed");return null}for(let o of i)n.attachShader(s,o);if(n.linkProgram(s),n.getProgramParameter&&!n.getProgramParameter(s,35714)){let o=r?n.getProgramInfoLog(s):null;if(n.deleteProgram?.(s),s=null,r)throw new Error(`Program link error: ${o}`);return null}return s}finally{for(let o of i)s&&n.detachShader?.(s,o),n.deleteShader?.(o)}}var st={5120:1,5121:1,5122:2,5123:2,5125:4,5126:4};function Ee(n,t,e,r){if(!e||e.bufferView===void 0)return null;let i=n.bufferViews?.[e.bufferView];if(!i)return null;let s=Number(e.count??0);if(!Number.isInteger(s)||s<=0)return null;let o=e.componentType??5126,l=st[o];if(!l)throw new RangeError(`glTF accessor has unsupported componentType ${o}`);let a=l*r,c=i.byteStride&&i.byteStride>0?i.byteStride:a,u=(i.byteOffset||0)+(e.byteOffset||0);if(!Number.isInteger(u)||u<0||c<a||u+(s-1)*c+a>t.byteLength)throw new RangeError(`glTF accessor reads past the end of the binary buffer (${t.byteLength} bytes)`);if(o===5126&&c===a&&u%4===0)return new Float32Array(t,u,s*r);let d=new DataView(t),m=e.normalized===!0,x=new Float32Array(s*r);for(let g=0;g<s;g++){let b=u+g*c;for(let v=0;v<r;v++){let y=b+v*l,w;switch(o){case 5126:w=d.getFloat32(y,!0);break;case 5120:w=d.getInt8(y),m&&(w=Math.max(w/127,-1));break;case 5121:w=d.getUint8(y),m&&(w/=255);break;case 5122:w=d.getInt16(y,!0),m&&(w=Math.max(w/32767,-1));break;case 5123:w=d.getUint16(y,!0),m&&(w/=65535);break;default:w=d.getUint32(y,!0),m&&(w/=4294967295)}x[g*r+v]=w}}return x}function _e(n,t){let e=Number(t.offset?.[0]??0)||0,r=Number(t.offset?.[1]??0)||0,i=Number(t.scale?.[0]??1),s=Number(t.scale?.[1]??1),o=Number(t.rotation??0)||0,l=Math.cos(o),a=Math.sin(o),c=(Number.isFinite(i)?i:1)*l,u=(Number.isFinite(i)?i:1)*a,d=-(Number.isFinite(s)?s:1)*a,m=(Number.isFinite(s)?s:1)*l;for(let x=0;x+1<n.length;x+=2){let g=n[x],b=n[x+1];n[x]=c*g+u*b+e,n[x+1]=d*g+m*b+r}}function X(){let n=new Float32Array(16);return n[0]=1,n[5]=1,n[10]=1,n[15]=1,n}function Te(n,t,e,r,i){let s=1/Math.tan(t/2);n.fill(0),n[0]=s/e,n[5]=s,n[11]=-1;let o=1/(r-i);return n[10]=(i+r)*o,n[14]=2*i*r*o,n}function Me(n,t,e,r){let[i,s,o]=t,[l,a,c]=r,[u,d,m]=e,x=i-u,g=s-d,b=o-m,v=Math.hypot(x,g,b);v<=1e-5?(x=0,g=0,b=1):(x/=v,g/=v,b/=v);let y=a*b-c*g,w=c*x-l*b,T=l*g-a*x;v=Math.hypot(y,w,T),v<=1e-5?(y=0,w=0,T=0):(y/=v,w/=v,T/=v);let M=g*T-b*w,p=b*y-x*T,R=x*w-g*y;return v=Math.hypot(M,p,R),v<=1e-5?(M=0,p=0,R=0):(M/=v,p/=v,R/=v),n[0]=y,n[1]=M,n[2]=x,n[3]=0,n[4]=w,n[5]=p,n[6]=g,n[7]=0,n[8]=T,n[9]=R,n[10]=b,n[11]=0,n[12]=-(y*i+w*s+T*o),n[13]=-(M*i+p*s+R*o),n[14]=-(x*i+g*s+b*o),n[15]=1,n}function ee(n,t,e){let r=t[0],i=t[1],s=t[2],o=t[3],l=t[4],a=t[5],c=t[6],u=t[7],d=t[8],m=t[9],x=t[10],g=t[11],b=t[12],v=t[13],y=t[14],w=t[15],T=e[0],M=e[1],p=e[2],R=e[3];return n[0]=T*r+M*l+p*d+R*b,n[1]=T*i+M*a+p*m+R*v,n[2]=T*s+M*c+p*x+R*y,n[3]=T*o+M*u+p*g+R*w,T=e[4],M=e[5],p=e[6],R=e[7],n[4]=T*r+M*l+p*d+R*b,n[5]=T*i+M*a+p*m+R*v,n[6]=T*s+M*c+p*x+R*y,n[7]=T*o+M*u+p*g+R*w,T=e[8],M=e[9],p=e[10],R=e[11],n[8]=T*r+M*l+p*d+R*b,n[9]=T*i+M*a+p*m+R*v,n[10]=T*s+M*c+p*x+R*y,n[11]=T*o+M*u+p*g+R*w,T=e[12],M=e[13],p=e[14],R=e[15],n[12]=T*r+M*l+p*d+R*b,n[13]=T*i+M*a+p*m+R*v,n[14]=T*s+M*c+p*x+R*y,n[15]=T*o+M*u+p*g+R*w,n}function Se(n,t,e,r){let i=t[0],s=t[1],o=t[2],l=t[3],a=i+i,c=s+s,u=o+o,d=i*a,m=i*c,x=i*u,g=s*c,b=s*u,v=o*u,y=l*a,w=l*c,T=l*u,M=r[0],p=r[1],R=r[2];return n[0]=(1-(g+v))*M,n[1]=(m+T)*M,n[2]=(x-w)*M,n[3]=0,n[4]=(m-T)*p,n[5]=(1-(d+v))*p,n[6]=(b+y)*p,n[7]=0,n[8]=(x+w)*R,n[9]=(b-y)*R,n[10]=(1-(d+g))*R,n[11]=0,n[12]=e[0],n[13]=e[1],n[14]=e[2],n[15]=1,n}function ce(n,t,e=0){let r=t[0],i=t[1],s=t[2],o=t[4],l=t[5],a=t[6],c=t[8],u=t[9],d=t[10],m=d*l-a*u,x=-d*o+a*c,g=u*o-l*c,b=r*m+i*x+s*g;return!b||e>0&&(!Number.isFinite(b)||Math.abs(b)<=e)||(b=1/b,n[0]=m*b,n[1]=x*b,n[2]=g*b,n[3]=(-d*i+s*u)*b,n[4]=(d*r-s*c)*b,n[5]=(-u*r+i*c)*b,n[6]=(a*i-s*l)*b,n[7]=(-a*r+s*o)*b,n[8]=(l*r-i*o)*b),n}function Ge(n,t){let e=t[0],r=t[1],i=t[2],s=t[3],o=t[4],l=t[5],a=t[6],c=t[7],u=t[8],d=t[9],m=t[10],x=t[11],g=t[12],b=t[13],v=t[14],y=t[15],w=e*l-r*o,T=e*a-i*o,M=e*c-s*o,p=r*a-i*l,R=r*c-s*l,_=i*c-s*a,L=u*b-d*g,O=u*v-m*g,V=u*y-x*g,F=d*v-m*b,h=d*y-x*b,E=m*y-x*v,A=w*E-T*h+M*F+p*V-R*O+_*L;return A?(A=1/A,n[0]=(l*E-a*h+c*F)*A,n[1]=(i*h-r*E-s*F)*A,n[2]=(b*_-v*R+y*p)*A,n[3]=(m*R-d*_-x*p)*A,n[4]=(a*V-o*E-c*O)*A,n[5]=(e*E-i*V+s*O)*A,n[6]=(v*M-g*_-y*T)*A,n[7]=(u*_-m*M+x*T)*A,n[8]=(o*h-l*V+c*L)*A,n[9]=(r*V-e*h-s*L)*A,n[10]=(g*R-b*M+y*w)*A,n[11]=(d*M-u*R-x*w)*A,n[12]=(l*O-o*F-a*L)*A,n[13]=(e*F-r*O+i*L)*A,n[14]=(b*T-g*p-v*w)*A,n[15]=(u*p-d*T+m*w)*A,n):null}function Pe(n,t,e,r,i){let s=i[0]*t+i[4]*e+i[8]*r+i[12],o=i[1]*t+i[5]*e+i[9]*r+i[13],l=i[2]*t+i[6]*e+i[10]*r+i[14],a=i[3]*t+i[7]*e+i[11]*r+i[15],c=a!==0?1/a:1;n[0]=s*c,n[1]=o*c,n[2]=l*c}function Oe(n,t,e,r,i,s,o,l,a,c,u,d,m,x,g,b,v=0){let y=c-o,w=u-l,T=d-a,M=m-o,p=x-l,R=g-a,_=i*R-s*p,L=s*M-r*R,O=r*p-i*M,V=y*_+w*L+T*O;if(V>-1e-7&&V<1e-7)return!1;let F=1/V,h=n-o,E=t-l,A=e-a,f=F*(h*_+E*L+A*O);if(f<-v||f>1+v)return!1;let N=E*T-A*w,P=A*y-h*T,K=h*w-E*y,S=F*(r*N+i*P+s*K);if(S<-v||f+S>1+v)return!1;let U=F*(M*N+p*P+R*K);if(U>1e-4&&U<b.distance){b.distance=U,b.point=[n+r*U,t+i*U,e+s*U];let k=w*R-T*p,Z=T*M-y*R,J=y*p-w*M,B=Math.hypot(k,Z,J)||1;return b.normal=[k/B,Z/B,J/B],!0}return!1}function Ue(n,t){let e=Array.isArray(n?.nodes)?n.nodes.length:0,r=[];for(let u=0;u<e;u++)r.push(X());if(e===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,o=128,l=(u,d,m=0)=>{if(m>o||u<0||u>=e||s.has(u))return;s.add(u);let x=n.nodes[u];if(!x)return;let g=X();if(t&&t[u])g.set(t[u]);else if(x.matrix&&x.matrix.length===16)g.set(x.matrix);else{let v=x.translation||[0,0,0],y=x.rotation||[0,0,0,1],w=x.scale||[1,1,1];Se(g,y,v,w)}let b=r[u];if(d?ee(b,d,g):b.set(g),Array.isArray(x.children))for(let v of x.children)typeof v=="number"&&l(v,b,m+1)},a=[],c=n.scenes&&n.scenes[n.scene!==void 0?n.scene:0];if(c&&Array.isArray(c.nodes))a.push(...c.nodes);else for(let u=0;u<e;u++)i.has(u)||a.push(u);for(let u of a)l(u,null);for(let u=0;u<e;u++)!i.has(u)&&!a.includes(u)&&l(u,null);return r}var We=["neutral","reinhard","none","aces","agx"];function de(n){let t=String(n??"").trim().toLowerCase();return We.includes(t)?t:"neutral"}function ot(n){return We.indexOf(de(n))}function at(n){return new TextDecoder().decode(n)}var Xe=$().decoders;function ut(n,t){Xe.set(n.toLowerCase(),t)}function me(n){return Xe.get(n.toLowerCase())}function ze(n){let t=ArrayBuffer.isView(n)?n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength):n,e=new DataView(t);if(t.byteLength<12)throw new Error(`Invalid GLB buffer size: ${t.byteLength} bytes`);let r=e.getUint32(0,!0);if(r!==1179937895){let m=e.getUint8(0);throw m===123||m===32||m===10||m===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=e.getUint32(4,!0);if(i!==2)throw new Error(`Unsupported GLB version: ${i}`);let s=e.getUint32(8,!0),o=12,l=null,a=null;for(;o+8<=s&&o+8<=t.byteLength;){let m=e.getUint32(o,!0),x=e.getUint32(o+4,!0),g=o+8;if(g+m>t.byteLength)throw new Error(`Truncated GLB chunk: required ${g+m} bytes, buffer has ${t.byteLength}`);if(x===1313821514){let b=new Uint8Array(t,g,m),v=at(b);l=JSON.parse(v,(y,w)=>y==="__proto__"||y==="constructor"||y==="prototype"?void 0:w)}else x===5130562&&(a=t.slice(g,g+m));o=g+m}if(!l)throw new Error("Missing JSON chunk in GLB");let c=l.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).");for(let m of["EXT_meshopt_compression","KHR_meshopt_compression"])if(c.includes(m)&&!me("meshopt"))throw new Error(`Model requires ${m}. 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 u=a||new ArrayBuffer(0),d={gltf:l,bin:u,animations:[]};for(let m of Y)m.onParseGLB?.(d);return d}function lt(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 pe(n){if(lt(n))return n;if(n instanceof ArrayBuffer||ArrayBuffer.isView(n))return ze(n);throw new TypeError("Invalid 3D model input: expected GLBData ({ gltf, bin }) or binary GLB (ArrayBuffer / ArrayBufferView).")}var je=`#version 300 es
18
+ layout(location=0) in vec3 aPos;
19
+ layout(location=3) in vec3 aOff;
19
20
  layout(location=1) in vec3 aNormal;
20
21
  layout(location=2) in vec2 aUV;
21
22
  uniform mat4 uMVP,uModel;
@@ -38,6 +39,7 @@ mat3 xrNormalMatrix(){return uInstanced==1?transpose(inverse(mat3(xrModel()))):u
38
39
  out vec3 vNormal,vWorldPos;
39
40
  out vec2 vUV;
40
41
  void main(){
42
+ vec3 aPosition=aPos+aOff;
41
43
  vInstTint=uInstanced==1?aInstColor:vec4(1.0);
42
44
  vec3 rawN=uNormalMatrix*aNormal;
43
45
  vNormal=length(rawN)>1e-5?normalize(rawN):vec3(0.0);
@@ -247,4 +249,4 @@ void main(){gl_Position=uMVP*vec4(aPosition,1.0);}`,mt=`#version 300 es
247
249
  precision highp float;
248
250
  uniform vec4 uColorId;
249
251
  out vec4 fragColor;
250
- void main(){fragColor=uColorId;}`;function Ue(n,t,e){let r=n.createShader(t);if(n.shaderSource(r,e),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 De(n,t,e){let r=Ue(n,35633,t),i=Ue(n,35632,e),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 Le(n,t,e){let r={};for(let i of e)r[i]=n.getUniformLocation(t,i);return r}var Ve=["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=$().xrDepthShader;return{fs:ct.replace("/*XRD_U*/",n?.uniformsGLSL||"").replace("/*XRD_O*/",n?.occlusionGLSL||""),uniforms:n?[...Ve,...n.uniformNames]:Ve}}function dt(n){if(typeof n!="string")return null;let t=n.trim();if(!t||/[\x00-\x1f\x7f]/.test(t))return null;let e=t.toLowerCase();return e.startsWith("data:")?/^data:image\/(png|jpeg|jpg|webp|ktx2|avif)(;|,)/i.test(t)?t:null:e.startsWith("https://")||e.startsWith("blob:")?t:e.startsWith("//")||/^[a-z][a-z0-9+.-]*:/i.test(t)||/(^|[\\/])\.\.([\\/]|$)/.test(t)?null:t}function Pe(n,t,e,r,i,s,a,l){if(r===void 0||!t.accessors?.[r])return null;let o=Ae(t,e,t.accessors[r],s);if(!o)return null;l&&(o=o.slice(),ke(o,l));let c=n.createBuffer();return a.push(c),n.bindBuffer(34962,c),n.bufferData(34962,o,35044),n.enableVertexAttribArray(i),n.vertexAttribPointer(i,s,5126,!1,0,0),o}function Ce(n){let t=Number(n);return Number.isFinite(t)?Math.max(0,t):1}function $e(n,t,e){let r=je(),i=Ye,s=r.fs,a=!1;for(let o of j)if(o.onResolveShader){let c=o.onResolveShader(t,e,i,s);c&&(i=c.vs,s=c.fs,a=!0)}let l=a?De(n,i,s):null;return{program:l,uniforms:l?Le(n,l,r.uniforms):null}}function pt(n,t,e){let r=t.instanceMatrices;if(!r||r.length<16||typeof n.vertexAttribDivisor!="function"||typeof n.drawElementsInstanced!="function")return!1;let i=r.length>>4,s=t.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 l=n.createBuffer();e.push(l),n.bindBuffer(34962,l),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 ft(n,t){let e=n.materials?.[t?.material];if(!e)return null;let r=[e.pbrMetallicRoughness?.baseColorTexture,e.pbrMetallicRoughness?.metallicRoughnessTexture,e.normalTexture,e.occlusionTexture,e.emissiveTexture];for(let i of r){let s=i?.extensions?.KHR_texture_transform;if(s&&typeof s=="object")return s}return null}var qe=Object.freeze({maxMeshes:1e3,maxTextures:64,maxVertices:1e6,maxIndices:3e6}),Ke=Object.freeze({maxMeshes:1/0,maxTextures:1/0,maxVertices:1/0,maxIndices:1/0});function Me(n,t){t.indices?n.drawElements(4,t.indexCount,t.indexType,0):n.drawArrays(4,0,t.indexCount)}function Ze(n,t){let e=n?.pbrMetallicRoughness,r=e?.baseColorFactor,i=n?.extensions?.KHR_materials_clearcoat,s=a=>a!==void 0&&t[a.index]?t[a.index]:null;return{baseColor:r?[r[0],r[1],r[2],r[3]??1]:[.8,.8,.8,1],metallic:e?.metallicFactor??.1,roughness:e?.roughnessFactor??.5,clearcoat:i?i.clearcoatFactor??1:0,clearcoatRoughness:Math.max(.04,i?.clearcoatRoughnessFactor??.04),texture:s(e?.baseColorTexture),metallicRoughnessTexture:s(e?.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 Je(n,t,e){let r=new Set,i=s=>{s&&!r.has(s)&&(r.add(s),n.deleteTexture(s))};for(let s of t)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 l=new Set;a.customProgram&&l.add(a.customProgram);for(let o of a.programCache?.values()??[])o.program&&l.add(o.program);for(let o of l)n.deleteProgram(o)}if(e)for(let s of e)i(s)}function He(n,t,e=Ke,r){let i={meshes:[],mesh:null,gpuTextures:[],vao:null,buffers:[]};try{return bt(n,t,e,r,i)}catch(s){let a=i.mesh&&!i.meshes.includes(i.mesh)?[...i.meshes,i.mesh]:i.meshes;Je(n,a,i.gpuTextures),i.vao&&n.deleteVertexArray(i.vao);for(let l of i.buffers)n.deleteBuffer(l);throw s}}function bt(n,t,e,r,i){if(!t||!t.gltf)throw new Error("Invalid GLBData passed to buildGpuScene: missing gltf object.");let{gltf:s}=t,a=me("meshopt");a?.decodeBufferViews&&a.decodeBufferViews(s,t);let l=t.bin,o=[];i.meshes=o;let c=[],u=s.extensions?.KHR_materials_variants;u&&Array.isArray(u.variants)&&u.variants.forEach((h,E)=>{c.push(typeof h?.name=="string"&&h.name?h.name:`Variant_${E}`)});let f=Oe(s),m=[];if(Array.isArray(s.nodes))for(let h=0;h<s.nodes.length;h++){let E=s.nodes[h];E.mesh!==void 0&&s.meshes&&s.meshes[E.mesh]&&m.push({node:E,nodeIdx:h,meshIdx:E.mesh})}let g=m.length>0?m:(s.meshes||[]).map((h,E)=>({node:h,nodeIdx:-1,meshIdx:E})),d=[];if(Array.isArray(t.lights)&&t.lights.length>0)d.push(...t.lights);else if(s.extensions?.KHR_lights_punctual?.lights){let h=s.extensions.KHR_lights_punctual.lights;for(let E of h){let R=E.type==="directional"?"directional":E.type==="point"?"point":"ambient";d.push({type:R,color:E.color||[1,1,1],intensity:E.intensity!==void 0?E.intensity:1})}}if(d.length===0&&(d.push({type:"ambient",color:[1,1,1],intensity:.35}),d.push({type:"directional",color:[1,1,1],intensity:.85,direction:[.5,1,.8]})),g.length>e.maxMeshes)throw new Error(`SecurityError: GLB scene exceeds host mesh limit (${e.maxMeshes}). Found: ${g.length}`);let A=[];if(i.gpuTextures=A,s.textures&&s.images){if(s.textures.length>e.maxTextures)throw new Error(`SecurityError: GLB scene exceeds host texture limit (${e.maxTextures}). Found: ${s.textures.length}`);for(let h=0;h<s.textures.length;h++){let E=s.textures[h],R=s.images[E.source];if(R){let b=n.createTexture();if(n.bindTexture(3553,b),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),R.bufferView!==void 0){let N=s.bufferViews[R.bufferView],P=l.slice(N.byteOffset||0,(N.byteOffset||0)+N.byteLength),K=new Blob([P],{type:R.mimeType||"image/png"});typeof createImageBitmap=="function"&&createImageBitmap(K).then(S=>{n.bindTexture(3553,b),n.texImage2D(3553,0,6408,6408,5121,S),n.generateMipmap(3553),r?.()}).catch(()=>{})}else if(R.uri){let N=dt(R.uri);if(N){let P=new Image;P.crossOrigin="anonymous",P.referrerPolicy="no-referrer",P.onload=()=>{n.bindTexture(3553,b),n.texImage2D(3553,0,6408,6408,5121,P),n.generateMipmap(3553),r?.()},P.src=N}else console.warn("[Three-Live Security] Blocked unsafe glTF image URI:",R.uri)}A.push(b)}else A.push(null)}}let v=[1/0,1/0,1/0],x=[-1/0,-1/0,-1/0],w=0,y=0;for(let h=0;h<g.length;h++){let E=g[h],R=s.meshes[E.meshIdx],b=E.nodeIdx>=0?f[E.nodeIdx]:X(),N=new Float32Array(9);ce(N,b);let P={name:E.node.name||R.name||`Mesh_${E.meshIdx}`,nodeIndex:E.nodeIdx,transform:b,normalMatrix:N,primitives:[],extras:E.node.extras||R.extras};i.mesh=P;let K=E.node?.extensions?.EXT_mesh_gpu_instancing;if(K&&K.attributes&&typeof K.attributes=="object"){let S=K.attributes,U=S.TRANSLATION!==void 0?s.accessors?.[S.TRANSLATION]:null,k=S.ROTATION!==void 0?s.accessors?.[S.ROTATION]:null,Z=S.SCALE!==void 0?s.accessors?.[S.SCALE]:null,J=S._COLOR_0!==void 0?s.accessors?.[S._COLOR_0]:null,B=Number(U?.count??k?.count??Z?.count??0);if(!Number.isFinite(B)||B<0||B>1e4)throw new Error(`SecurityError: EXT_mesh_gpu_instancing exceeds maximum instance limit (10000). Found: ${B}`);if(B>0){let z=(I,W)=>{if(!I||I.bufferView===void 0||!s.bufferViews?.[I.bufferView])return null;let ne=I.componentType??5126,ae=Y=>(console.warn(`[three-live] EXT_mesh_gpu_instancing: skipping accessor (${Y})`),null);if(ne!==5120&&ne!==5121&&ne!==5122&&ne!==5123&&ne!==5126)return ae(`componentType ${ne}`);if(!(Number(I.count)>=B))return ae(`count ${I.count} < ${B}`);let C=null;try{C=Ae(s,l,{...I,count:B},W)}catch{return ae("out of bounds")}return!C||!C.every(Number.isFinite)?ae("non-finite value"):C},L=z(U,3),se=z(k,4),H=z(Z,3),ie=J?.type==="VEC4"?4:3,re=z(J,ie),oe=new Float32Array(B*16),le=X();for(let I=0;I<B;I++){let W=L?[L[I*3],L[I*3+1],L[I*3+2]]:[0,0,0],ne=se?[se[I*4],se[I*4+1],se[I*4+2],se[I*4+3]]:[0,0,0,1],ae=H?[H[I*3],H[I*3+1],H[I*3+2]]:[1,1,1];Ee(le,ne,W,ae),oe.set(le,I*16)}if(P.instanceMatrices=oe,re){let I=new Float32Array(B*3);for(let W=0;W<B;W++)I[W*3]=re[W*ie],I[W*3+1]=re[W*ie+1],I[W*3+2]=re[W*ie+2];P.instanceColors=I}}}for(let S of R.primitives||[]){if(S.extensions?.KHR_draco_mesh_compression){let C=me("draco");C&&C.decodePrimitive(s,S,l)}let U=[],k=n.createVertexArray();i.vao=k,i.buffers=U,n.bindVertexArray(k);let Z=pt(n,P,U),J=s.accessors[S.attributes.POSITION],B=Number(J?.count??0);if(!Number.isFinite(B)||B<0||w+B>e.maxVertices)throw new Error(`SecurityError: GLB scene exceeds host vertex limit (${e.maxVertices}).`);if(w+=B,J?.min&&J?.max){let C=Y=>{for(let G=0;G<3;G++){let Q=Y[12+G],ue=Y[12+G];for(let he=0;he<3;he++){let ve=Y[he*4+G]*J.min[he],ge=Y[he*4+G]*J.max[he];Q+=ve<ge?ve:ge,ue+=ve>ge?ve:ge}Q<v[G]&&(v[G]=Q),ue>x[G]&&(x[G]=ue)}};if(P.instanceMatrices&&P.instanceMatrices.length>=16){let Y=P.instanceMatrices.length>>4,G=X();for(let Q=0;Q<Y;Q++){let ue=P.instanceMatrices.subarray(Q*16,Q*16+16);ee(G,b,ue),C(G)}}else C(b)}let z=Pe(n,s,l,S.attributes.POSITION,0,3,U);Pe(n,s,l,S.attributes.NORMAL,1,3,U),Pe(n,s,l,S.attributes.TEXCOORD_0,2,2,U,ft(s,S));let L=0,se=5123,H=null;if(S.indices!==void 0){let C=s.accessors[S.indices],G=(s.bufferViews[C.bufferView].byteOffset||0)+(C.byteOffset||0);if(L=Number(C.count??0),!Number.isFinite(L)||L<0||y+L>e.maxIndices)throw new Error(`SecurityError: GLB scene exceeds host index limit (${e.maxIndices}).`);y+=L,se=C.componentType===5125?5125||5125:5123||5123;let Q=n.createBuffer();U.push(Q),n.bindBuffer(34963,Q),C.componentType===5125?(H=new Uint32Array(l,G,C.count),n.bufferData(34963,H,35044)):C.componentType===5121?(H=Uint16Array.from(new Uint8Array(l,G,C.count)),n.bufferData(34963,H,35044)):(H=G%2===0?new Uint16Array(l,G,C.count):new Uint16Array(l.slice(G,G+C.count*2)),n.bufferData(34963,H,35044))}else L=J.count;let ie={};for(let C of j)if(C.onBuildPrimitiveVAO){let Y=C.onBuildPrimitiveVAO(n,k,S,s,l);Y&&(ie[C.name]=Y)}n.bindVertexArray(null);let re=s.materials&&S.material!==void 0?s.materials[S.material]:null,{program:oe,uniforms:le}=$e(n,S,re),I=Ze(re,A),W=!!(re?.extensions?.KHR_materials_transmission||ie.materials?.isTransmissive),ne=S.extensions?.KHR_materials_variants?.mappings,ae=Array.isArray(ne)?ne.filter(C=>C&&typeof C.material=="number"&&Array.isArray(C.variants)).map(C=>({material:C.material|0,variants:C.variants.map(Y=>Number(Y)|0)})):void 0;P.primitives.push({vao:k,instanced:Z,indexCount:L,indexType:se,...I,positions:z,indices:H,buffers:U,materialIndex:S.material,defaultMaterialIndex:S.material,variantMappings:ae,primitiveDef:S,programCache:new Map([[S.material??-1,{program:oe,uniforms:le}]]),pluginData:ie,customProgram:oe,customUniforms:le,isTransmissive:W})}o.push(P)}isFinite(v[0])||(v=[-1,-1,-1]),isFinite(x[0])||(x=[1,1,1]);let T=[(v[0]+x[0])/2,(v[1]+x[1])/2,(v[2]+x[2])/2],p=x[0]-v[0],M=x[1]-v[1],_=x[2]-v[2],D=Math.max(Math.hypot(p,M,_)/2,.5),O=[v[0],v[1],v[2]],V=[x[0],x[1],x[2]],F=t.animations;if(!F){for(let h of j)if(h.onParseGLB?.(t),t.animations){F=t.animations;break}}return F||(F=[]),{meshes:o,bounds:{center:T,radius:D,min:O,max:V},lights:d,animations:F,worldMatrices:f,gpuTextures:A,availableVariants:c}}function fe(n){let t=n.customTarget||n.bounds.center,e=n.currDistance*Math.cos(n.currPhi);return[t[0]+e*Math.sin(n.currTheta),t[1]+n.currDistance*Math.sin(n.currPhi),t[2]+e*Math.cos(n.currTheta)]}var te=class{constructor(t,e,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=X();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=X();this.viewMatrix=X();this.activeViewMatrix=null;this.modelMatrix=X();this.mvpMatrix=X();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:X(),rawValueToMeters:.001,format:0};this.container=t;let i,s;if(e&&typeof e.getContext=="function"?(i=e,s=r):(s=e,i=s?.canvas),!i){let o=t.querySelector("canvas");o||(o=document.createElement("canvas"),o.style.width="100%",o.style.height="100%",o.style.display="block",o.style.touchAction="none",t.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=de(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 l=i.getContext("webgl2",{antialias:!0,alpha:!0,xrCompatible:!0});if(!l)throw new Error("WebGL2 not supported");this.gl=l,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(t,e){ut(t,e)}static getDecoder(t){return me(t)}setupContextLossHandling(){let t=this.canvas;typeof t?.addEventListener=="function"&&(this.boundContextLost=e=>{e.preventDefault?.(),this.contextLost=!0,this.stop()},this.boundContextRestored=()=>this.restoreContext(),t.addEventListener("webglcontextlost",this.boundContextLost),t.addEventListener("webglcontextrestored",this.boundContextRestored))}initGlState(){let t=this.gl,e=je();this.renderProg=De(t,Ye,e.fs),this.pickProg=De(t,ht,mt),this.uRender=Le(t,this.renderProg,e.uniforms),this.uPick=Le(t,this.pickProg,["uMVP","uColorId"]),this.setupPickingFbo()}restoreContext(){let t=this.gl;this.contextLost=!1,this.initGlState();for(let e of j)e.onContextRestored?.(t,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 t=this.gl;if(typeof t.createFramebuffer!="function")return;this.pickFbo=t.createFramebuffer(),this.pickTexture=t.createTexture(),this.pickDepth=t.createRenderbuffer();let e=Math.max(1,this.canvas.width),r=Math.max(1,this.canvas.height);this.pickFboWidth=e,this.pickFboHeight=r,t.bindTexture(3553,this.pickTexture),t.texImage2D(3553,0,6408,e,r,0,6408,5121,null),t.texParameteri(3553,10241,9728),t.texParameteri(3553,10240,9728),t.bindRenderbuffer(36161,this.pickDepth),t.renderbufferStorage(36161,33189,e,r),t.bindFramebuffer(36160,this.pickFbo),t.framebufferTexture2D(36160,36064,3553,this.pickTexture,0),t.framebufferRenderbuffer(36160,36096,36161,this.pickDepth),t.bindFramebuffer(36160,null)}resizePickingFbo(t,e){if(!this.pickFbo)return;let r=this.gl,i=Math.max(1,t),s=Math.max(1,e);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(t,e){this.lastGlbData=t,this.lastLimits=e;let{meshes:r,bounds:i,lights:s,animations:a,worldMatrices:l,gpuTextures:o,availableVariants:c}=He(this.gl,t,e,()=>this.render());if(this.disposeMeshGpuResources(),this.meshes=r,this.bounds=i,this.turntableRotation=0,this.updateTurntableMatrix(),this.lights=s,this.animations=a||[],this.worldMatrices=l||[],this.gpuTextures=o||[],this.availableVariants=c||[],this.gltf=t.gltf,this.activeVariantName&&!this.applyVariantMaterial(this.activeVariantName)&&(this.activeVariantName=null),this.initialNodeTransforms=[],Array.isArray(t.gltf?.nodes))for(let m of t.gltf.nodes)this.initialNodeTransforms.push({t:m.translation?[m.translation[0],m.translation[1],m.translation[2]]:[0,0,0],r:m.rotation?[m.rotation[0],m.rotation[1],m.rotation[2],m.rotation[3]]:[0,0,0,1],s:m.scale?[m.scale[0],m.scale[1],m.scale[2]]:[1,1,1]});this.autoplay&&this.animations.length>0&&this.playAnimation(this.animationName||void 0);for(let m of j)m.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=t.exposure??t.gltf?.extras?.exposure??t.gltf?.asset?.extras?.exposure;u!==void 0&&(this.exposure=Ce(u));let f=t.environmentIntensity??t.gltf?.extras?.environmentIntensity??t.gltf?.asset?.extras?.environmentIntensity;f!==void 0&&(this.envIntensity=Math.max(0,Number(f)||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(t){this.loadGLBData(ze(t))}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(t){this.loadGLBData(pe(t))}setBackdropGLB(t,e){if(this.disposeMeshListGpuResources(this.backdropMeshes),this.backdropMeshes=[],!t){this.update(0),this.render();return}let r=pe(t),{meshes:i}=He(this.gl,r,Ke,()=>this.render());if(e)for(let s of i)s.transform[12]+=e[0],s.transform[13]+=e[1],s.transform[14]+=e[2],ce(s.normalMatrix,s.transform);this.backdropMeshes=i,this.update(0),this.render()}setClearColor(t,e,r,i=1){this.clearColor=[t,e,r,i]}updateMeshTransforms(t){for(let e=0;e<this.meshes.length;e++){let r=this.meshes[e],i;t instanceof Map?i=t.get(r.name)??t.get(e):Array.isArray(t)?i=t[e]:t&&typeof t=="object"&&(Object.prototype.hasOwnProperty.call(t,r.name)?i=t[r.name]:Object.prototype.hasOwnProperty.call(t,e)&&(i=t[e])),i&&i.length===16&&(r.transform.set(i),ce(r.normalMatrix,r.transform))}}bindLights(t=this.uRender){let e=this.gl,r=[.28,.28,.28],i=[],s=[],a=[],l=[];for(let o of this.lights){let c=o.color||[1,1,1],u=o.intensity!==void 0?o.intensity:1;if(o.type==="ambient")r=[c[0]*u,c[1]*u,c[2]*u];else if(o.type==="directional"&&i.length<6){let f=o.direction||[.5,1,.8];i.push(f[0],f[1],f[2]),s.push(c[0]*u,c[1]*u,c[2]*u)}else if(o.type==="point"&&a.length<6){let f=o.position||[0,0,0];a.push(f[0],f[1],f[2]),l.push(c[0]*u,c[1]*u,c[2]*u)}}i.length===0&&(i.push(.5,1,.8),s.push(1,1,1)),e.uniform3fv(t.uAmbientColor,r),e.uniform1i(t.uNumDirLights,i.length/3),i.length>0&&(e.uniform3fv(t.uDirLightDir,i),e.uniform3fv(t.uDirLightColor,s)),e.uniform1i(t.uNumPointLights,a.length/3),a.length>0&&(e.uniform3fv(t.uPointLightPos,a),e.uniform3fv(t.uPointLightColor,l)),e.uniform1f(t.uEnvIntensity,this.envIntensity)}setExposure(t){this.exposure=Ce(t)}getExposure(){return this.exposure}setShadow(t,e){this.shadowIntensity=Math.max(0,Math.min(1,Number(t)||0)),e!==void 0&&(this.shadowSoftness=Math.max(0,Math.min(1,Number(e)||0)))}getShadowIntensity(){return this.shadowIntensity}getShadowSoftness(){return this.shadowSoftness}setToneMapping(t){this.toneMapping=de(t)}getToneMapping(){return this.toneMapping}async setEnvironmentImage(t){for(let e of j)if(e.setEnvironmentImage){await e.setEnvironmentImage(this,t);return}}async setSkyboxImage(t){for(let e of j)if(e.setSkyboxImage){await e.setSkyboxImage(this,t);return}}setInteractive(t){this.interactive=t}isInteractive(){return this.interactive}getCameraOrbit(){let t=this.currTheta,e=this.currPhi,r=this.currDistance;return{theta:t,phi:e,radius:r,toString(){return`${t.toFixed(4)}rad ${e.toFixed(4)}rad ${r.toFixed(4)}m`}}}getCameraTarget(){let t=this.customTarget||this.bounds.center;return{x:t[0],y:t[1],z:t[2],toString(){return`${t[0].toFixed(4)}m ${t[1].toFixed(4)}m ${t[2].toFixed(4)}m`}}}jumpCameraToGoal(){this.currTheta=this.targetTheta,this.currPhi=this.targetPhi,this.currDistance=this.targetDistance,this.update(0),this.render()}getModelMaterials(){let t=this.gltf?.materials?.length?this.gltf.materials:[{name:"DefaultMaterial",pbrMetallicRoughness:{}}];return t.map((e,r)=>{let i=this.meshes.flatMap(u=>u.primitives.filter(f=>f.materialIndex===r||t.length===1&&f.materialIndex===void 0)),s=i[0],a=s?[...s.baseColor]:e.pbrMetallicRoughness?.baseColorFactor||[.8,.8,.8,1],l=s?s.metallic:e.pbrMetallicRoughness?.metallicFactor??.1,o=s?s.roughness:e.pbrMetallicRoughness?.roughnessFactor??.5,c={baseColorFactor:a,metallicFactor:l,roughnessFactor:o,setBaseColorFactor:u=>{let f=[u[0],u[1],u[2],u[3]??1];c.baseColorFactor=f,e.pbrMetallicRoughness&&(e.pbrMetallicRoughness.baseColorFactor=f);for(let m of i)m.baseColor=f;this.render()},setMetallicFactor:u=>{c.metallicFactor=u,e.pbrMetallicRoughness&&(e.pbrMetallicRoughness.metallicFactor=u);for(let f of i)f.metallic=u;this.render()},setRoughnessFactor:u=>{c.roughnessFactor=u,e.pbrMetallicRoughness&&(e.pbrMetallicRoughness.roughnessFactor=u);for(let f of i)f.roughness=u;this.render()}};return{name:e.name||`Material_${r}`,pbrMetallicRoughness:c}})}playAnimation(t){if(this.animations.length!==0){if(t){let e=this.animations.find(r=>r.name===t);e&&(this.currentClip=e)}else this.currentClip||(this.currentClip=this.animations[0]);this.isPlayingAnimation=!0}}pauseAnimation(){this.isPlayingAnimation=!1}getAvailableAnimations(){return this.animations.map(t=>t.name)}getAvailableVariants(){return[...this.availableVariants]}getVariantName(){return this.activeVariantName}selectVariant(t){let e=this.applyVariantMaterial(t);return e&&this.gl&&this.render(),e}applyVariantMaterial(t){let e=t===null||t==="",r=-1;if(e)this.activeVariantName=null;else{if(r=this.availableVariants.indexOf(t),r<0)return!1;this.activeVariantName=t}let i=this.gltf?.materials;if(!Array.isArray(i))return e;for(let s of this.meshes)for(let a of s.primitives){let l=a.defaultMaterialIndex;if(!e&&Array.isArray(a.variantMappings)){for(let c of a.variantMappings)if(Array.isArray(c.variants)&&c.variants.includes(r)){l=c.material;break}}let o=l!==void 0?i[l]:void 0;a.materialIndex=o?l:void 0,Object.assign(a,Ze(o,this.gpuTextures)),this.applyPrimitiveProgram(a,a.materialIndex,o??null)}return!0}applyPrimitiveProgram(t,e,r){if(!this.gl||!t.primitiveDef)return;t.programCache??(t.programCache=new Map);let i=e??-1,s=t.programCache.get(i);s||(s=$e(this.gl,{...t.primitiveDef,material:e},r),t.programCache.set(i,s)),t.customProgram=s.program,t.customUniforms=s.uniforms,t.pluginData&&(t.pluginData.materials=t.isTransmissive?{isTransmissive:!0}:void 0)}setAutoplay(t){this.autoplay=t,t?this.playAnimation(this.animationName||void 0):this.pauseAnimation()}setAnimationName(t){this.animationName=t,(this.isPlayingAnimation||this.autoplay)&&this.playAnimation(t)}evaluateAnimation(t){for(let e of j)if(e.evaluateAnimation){e.evaluateAnimation(this,t);return}}setTarget(t,e,r){this.customTarget=[t,e,r],this.gl&&(this.meshes.length>0||this.backdropMeshes.length>0)&&(this.update(0),this.render())}getTarget(){return this.customTarget?[...this.customTarget]:null}setFieldOfView(t){let e=Math.max(10,Math.min(90,t));this.fov=e*Math.PI/180}getFieldOfView(){return this.fov*180/Math.PI}setDistanceMode(t){if(this.distanceMode=t,!this.customDistance){let e=this.clampDistance(this.distanceMode==="absolute"?3:this.bounds.radius*2.5);this.initialDistance=e,this.targetDistance=e,this.currDistance=e,this.gl&&(this.meshes.length>0||this.backdropMeshes.length>0)&&(this.update(0),this.render())}}getDistanceMode(){return this.distanceMode}setOrbitLimits(t){t.minTheta!==void 0&&(this.minTheta=t.minTheta*Math.PI/180),t.maxTheta!==void 0&&(this.maxTheta=t.maxTheta*Math.PI/180),t.minPhi!==void 0&&(this.minPhi=Math.max(-Math.PI*.48,t.minPhi*Math.PI/180)),t.maxPhi!==void 0&&(this.maxPhi=Math.min(Math.PI*.48,t.maxPhi*Math.PI/180)),t.minDistance!==void 0&&(this.minDistanceLimit=t.minDistance),t.maxDistance!==void 0&&(this.maxDistanceLimit=t.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(t){return Math.max(this.minTheta,Math.min(this.maxTheta,t))}clampPhi(t){return Math.max(this.minPhi,Math.min(this.maxPhi,t))}clampDistance(t){let e=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(e,Math.min(r,t))}setCamera(t,e,r,i){t!==void 0&&(this.targetTheta=this.clampTheta(t*Math.PI/180)),e!==void 0&&(this.targetPhi=this.clampPhi(e*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(t,e,r,i){if(t!==void 0&&(this.initialTheta=this.clampTheta(t*Math.PI/180),this.targetTheta=this.initialTheta,this.currTheta=this.initialTheta),e!==void 0&&(this.initialPhi=this.clampPhi(e*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(t,e){let r=X();ee(r,this.projMatrix,this.viewMatrix);let[i,s,a]=t,l=e?e[0]:0,o=e?e[1]:0,c=e?e[2]:0,u=this.modelRootMatrix;u&&(i=u[0]*t[0]+u[4]*t[1]+u[8]*t[2]+u[12],s=u[1]*t[0]+u[5]*t[1]+u[9]*t[2]+u[13],a=u[2]*t[0]+u[6]*t[1]+u[10]*t[2]+u[14],e&&(l=u[0]*e[0]+u[4]*e[1]+u[8]*e[2],o=u[1]*e[0]+u[5]*e[1]+u[9]*e[2],c=u[2]*e[0]+u[6]*e[1]+u[10]*e[2]));let f=r[0]*i+r[4]*s+r[8]*a+r[12],m=r[1]*i+r[5]*s+r[9]*a+r[13],g=r[2]*i+r[6]*s+r[10]*a+r[14],d=r[3]*i+r[7]*s+r[11]*a+r[15];if(d<=1e-4)return{x:0,y:0,z:1,visible:!1};let A=f/d,v=m/d,x=g/d,w=this.canvas.getBoundingClientRect(),y=w.width||this.canvas.clientWidth||this.canvas.width||300,T=w.height||this.canvas.clientHeight||this.canvas.height||150,p=(A*.5+.5)*y,M=(-v*.5+.5)*T,_=A>=-1.1&&A<=1.1&&v>=-1.1&&v<=1.1&&x>=-1&&x<=1;if(_&&e){let[D,O,V]=fe(this),F=[i-D,s-O,a-V];l*F[0]+o*F[1]+c*F[2]>.05&&(_=!1)}return{x:p,y:M,z:x,visible:_}}setSelectedMesh(t){this.selectedMeshName=t||""}getSelectedMesh(){return this.selectedMeshName}setupEvents(){let t=this.canvas;this.boundContextMenu=e=>{e.preventDefault()},t.addEventListener("contextmenu",this.boundContextMenu),this.boundPointerDown=e=>{this.interactive&&(this.isPointerDown=!0,this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now(),this.lastPointerX=e.clientX,this.lastPointerY=e.clientY,this.totalDragDist=0,this.activePointers.set(e.pointerId,{x:e.clientX,y:e.clientY}),this.isPanning=e.button===2||e.shiftKey||this.activePointers.size===2,t.setPointerCapture(e.pointerId))},t.addEventListener("pointerdown",this.boundPointerDown),this.boundPointerMove=e=>{if(!this.isPointerDown||!this.interactive)return;this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now();let r=this.activePointers.get(e.pointerId)||{x:this.lastPointerX,y:this.lastPointerY},i=e.clientX-r.x,s=e.clientY-r.y;if(this.activePointers.set(e.pointerId,{x:e.clientX,y:e.clientY}),this.lastPointerX=e.clientX,this.lastPointerY=e.clientY,this.totalDragDist+=Math.hypot(i,s),this.isPanning||e.button===2||e.shiftKey||this.activePointers.size===2){let a=[this.viewMatrix[0],this.viewMatrix[4],this.viewMatrix[8]],l=[this.viewMatrix[1],this.viewMatrix[5],this.viewMatrix[9]],o=this.customTarget?[...this.customTarget]:[...this.bounds.center],c=this.currDistance/Math.max(t.clientHeight||300,1)*1.5;o[0]+=(-i*a[0]+s*l[0])*c,o[1]+=(-i*a[1]+s*l[1])*c,o[2]+=(-i*a[2]+s*l[2])*c,this.customTarget=o}else this.targetTheta=this.clampTheta(this.targetTheta-i*.008),this.targetPhi=this.clampPhi(this.targetPhi+s*.008)},t.addEventListener("pointermove",this.boundPointerMove),this.boundPointerUp=e=>{this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now(),this.activePointers.delete(e.pointerId),this.activePointers.size===0?(this.isPointerDown=!1,this.isPanning=!1):this.activePointers.size===1&&(this.isPanning=!1);try{t.releasePointerCapture(e.pointerId)}catch{}if(this.totalDragDist<5&&e.button===0){let r=t.getBoundingClientRect(),i=Math.floor((e.clientX-r.left)*(t.width/Math.max(r.width,1))),s=Math.floor((e.clientY-r.top)*(t.height/Math.max(r.height,1)));this.performMeshPick(i,s,!0)}},t.addEventListener("pointerup",this.boundPointerUp),this.boundWheel=e=>{if(!this.interactive)return;e.preventDefault(),this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now();let r=Math.exp(e.deltaY*.001);this.targetDistance=this.clampDistance(this.targetDistance*r)},t.addEventListener("wheel",this.boundWheel,{passive:!1}),this.boundSetCamera=e=>{let r=e.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),t.tabIndex!==void 0&&t.tabIndex<0&&(t.tabIndex=0),t.getAttribute?.("role")||t.setAttribute?.("role","region"),t.getAttribute?.("aria-label")||t.setAttribute?.("aria-label","Interactive 3D model viewport"),this.boundKeyDown=e=>{if(!this.interactive)return;let r=typeof performance<"u"?performance.now():Date.now();switch(e.key){case"ArrowLeft":this.lastInteractionTime=r,this.targetTheta=this.clampTheta(this.targetTheta-.1),e.preventDefault();break;case"ArrowRight":this.lastInteractionTime=r,this.targetTheta=this.clampTheta(this.targetTheta+.1),e.preventDefault();break;case"ArrowUp":this.lastInteractionTime=r,this.targetPhi=this.clampPhi(this.targetPhi+.08),e.preventDefault();break;case"ArrowDown":this.lastInteractionTime=r,this.targetPhi=this.clampPhi(this.targetPhi-.08),e.preventDefault();break;case"+":case"=":{this.lastInteractionTime=r,this.targetDistance=this.clampDistance(this.targetDistance*.9),e.preventDefault();break}case"-":case"_":{this.lastInteractionTime=r,this.targetDistance=this.clampDistance(this.targetDistance*1.1),e.preventDefault();break}case"Home":this.lastInteractionTime=r,this.resetCamera(),e.preventDefault();break}},t.addEventListener("keydown",this.boundKeyDown)}teardownEvents(){let t=this.canvas;this.boundContextLost&&(t.removeEventListener("webglcontextlost",this.boundContextLost),this.boundContextLost=null),this.boundContextRestored&&(t.removeEventListener("webglcontextrestored",this.boundContextRestored),this.boundContextRestored=null),this.boundContextMenu&&(t.removeEventListener("contextmenu",this.boundContextMenu),this.boundContextMenu=null),this.boundPointerDown&&(t.removeEventListener("pointerdown",this.boundPointerDown),this.boundPointerDown=null),this.boundPointerMove&&(t.removeEventListener("pointermove",this.boundPointerMove),this.boundPointerMove=null),this.boundPointerUp&&(t.removeEventListener("pointerup",this.boundPointerUp),this.boundPointerUp=null),this.boundWheel&&(t.removeEventListener("wheel",this.boundWheel),this.boundWheel=null),this.boundKeyDown&&(t.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(t,e){let r=this.canvas,i=r.getBoundingClientRect(),s=r.width||300,a=r.height||300,l=i.width>0?Math.floor((t-i.left)*(s/i.width)):Math.floor(t),o=i.height>0?Math.floor((e-i.top)*(a/i.height)):Math.floor(e);return this.performMeshPick(l,o,!1)}performMeshPick(t,e,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);t=this.mapStereoPickX(t,s);let l=X();ee(l,this.projMatrix,this.viewMatrix);let o=[],c=Math.max(0,Math.min(s-1,t)),u=Math.max(0,Math.min(a-1,a-1-e));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 _=0;_<this.meshes.length;_++){let D=this.meshes[_];if(D.visible===!1||D.isPluginMesh)continue;let O=_+1,V=(O&255)/255,F=(O>>8&255)/255,h=(O>>16&255)/255;i.uniform4f(this.uPick.uColorId,V,F,h,1),ee(this.modelMatrix,this.modelRootMatrix,D.transform);let E=D.instanceMatrices;if(E&&E.length>=16){let R=E.length>>4,b=X();for(let N of D.primitives){i.bindVertexArray(N.vao);for(let P=0;P<R;P++)ee(b,this.modelMatrix,E.subarray(P*16,P*16+16)),ee(this.mvpMatrix,l,b),i.uniformMatrix4fv(this.uPick.uMVP,!1,this.mvpMatrix),Me(i,N)}}else{ee(this.mvpMatrix,l,this.modelMatrix),i.uniformMatrix4fv(this.uPick.uMVP,!1,this.mvpMatrix);for(let R of D.primitives)i.bindVertexArray(R.vao),Me(i,R)}}let p=new Uint8Array(4);i.readPixels(c,u,1,1,6408,5121,p),i.bindFramebuffer(36160,null);let M=p[0]+(p[1]<<8)+(p[2]<<16);M>0&&M<=this.meshes.length&&(o=[this.meshes[M-1]])}o.length===0&&(o=this.meshes.filter(p=>p.visible!==!1));let f=null,m=1/0,g=[0,0,0],d=[0,1,0],[A,v,x]=fe(this),w=X();for(let p of o){ee(w,this.modelRootMatrix,p.transform);let M=p.instanceMatrices,_=M&&M.length>=16?M.length>>4:1;for(let D=0;D<_;D++){M&&M.length>=16?ee(this.modelMatrix,w,M.subarray(D*16,D*16+16)):this.modelMatrix.set(w),ee(this.mvpMatrix,l,this.modelMatrix);let O=X();if(!_e(O,this.mvpMatrix))continue;let V=(c+.5)/s*2-1,F=(u+.5)/a*2-1,h=[0,0,0],E=[0,0,0];Se(h,V,F,-1,O),Se(E,V,F,1,O);let R=E[0]-h[0],b=E[1]-h[1],N=E[2]-h[2],P=Math.hypot(R,b,N)||1,K=R/P,S=b/P,U=N/P,k={distance:1/0,point:[0,0,0],normal:[0,1,0]};if((J=>{for(let B of p.primitives){if(!B.positions)continue;let z=B.positions,L=B.indices,se=Math.floor(L?L.length/3:z.length/9);for(let H=0;H<se;H++){let ie=L?L[H*3]:H*3,re=L?L[H*3+1]:H*3+1,oe=L?L[H*3+2]:H*3+2;Ge(h[0],h[1],h[2],K,S,U,z[ie*3],z[ie*3+1],z[ie*3+2],z[re*3],z[re*3+1],z[re*3+2],z[oe*3],z[oe*3+1],z[oe*3+2],k,J)}}})(1e-4),isFinite(k.distance)){let J=k.point[0],B=k.point[1],z=k.point[2],L=this.modelMatrix,se=L[0]*J+L[4]*B+L[8]*z+L[12],H=L[1]*J+L[5]*B+L[9]*z+L[13],ie=L[2]*J+L[6]*B+L[10]*z+L[14],re=se-A,oe=H-v,le=ie-x,I=Math.hypot(re,oe,le);if(I<m){ce(this.normalMatrix,this.modelMatrix);let W=this.normalMatrix,ne=k.normal[0],ae=k.normal[1],C=k.normal[2],Y=W[0]*ne+W[3]*ae+W[6]*C,G=W[1]*ne+W[4]*ae+W[7]*C,Q=W[2]*ne+W[5]*ae+W[8]*C,ue=Math.hypot(Y,G,Q)||1;Y/=ue,G/=ue,Q/=ue,Y*re+G*oe+Q*le>0&&(Y=-Y,G=-G,Q=-Q),f=p,m=Math.round(I*1e3)/1e3,g=[Math.round(se*1e3)/1e3,Math.round(H*1e3)/1e3,Math.round(ie*1e3)/1e3],d=[Math.round(Y*1e3)/1e3,Math.round(G*1e3)/1e3,Math.round(Q*1e3)/1e3]}}}}if(!f)return null;let T={meshIndex:this.meshes.indexOf(f),meshName:f.name,nodeIndex:f.nodeIndex,distance:m,hitPoint:g,normal:d,screenX:t,screenY:e};if(r){for(let p of j)p.onMeshSelect?.(this,T);this.opts.onMeshClick&&this.opts.onMeshClick(T),typeof CustomEvent<"u"&&typeof this.container.dispatchEvent=="function"&&this.container.dispatchEvent(new CustomEvent("meshClick",{bubbles:!0,detail:T}))}return T}mapStereoPickX(t,e){if(!this.stereoSBS||this.xrSessionActive||e<2)return t;let r=Math.max(1,Math.floor(e*.5)),i=t>=r,s=i?t-r:t,a=i?Math.max(1,e-r):r,l=(s+.5)/a*2-1;return Math.floor((l*.5+1)*.5*e)}setStereoSBS(t){this.stereoSBS=!!t,this.xrSessionActive||(this.syncCameraMatrices(),this.render())}syncCameraMatrices(){let t=Math.max(1,this.canvas.width||1)/Math.max(1,this.canvas.height||1),e=this.backdropMeshes.length>0?Math.max(this.bounds.radius*20,120):Math.max(this.bounds.radius*20,10);ye(this.projMatrix,this.fov,t,.1,e);let r=this.customTarget||this.bounds.center;Te(this.viewMatrix,fe(this),r,[0,1,0]),ee(this.mvpMatrix,this.projMatrix,this.viewMatrix),ce(this.normalMatrix,this.modelMatrix)}resize(){let t=Math.min((typeof window<"u"?window.devicePixelRatio:1)||1,2),e=this.canvas.getBoundingClientRect(),r=Math.max(1,Math.floor(e.width*t)),i=Math.max(1,Math.floor(e.height*t));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(t){let e=this.xrSessionActive;if(this.xrSessionActive=t,e&&!t){this.xrDepthState.enabled=!1;for(let r of j)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(t){this.renderErrorReported||(this.renderErrorReported=!0,typeof console<"u"&&console.warn("[three-live] render frame failed:",t))}stepXRUpdate(t){for(let e of j)e.onUpdate?.(this,t)}start(){if(this.animFrameId!==null)return;this.lastTime=typeof performance<"u"?performance.now():Date.now();let t=e=>{if(this.animFrameId===null)return;let r=Math.min(Math.max((e-this.lastTime)/1e3,0),.1);if(this.lastTime=e,this.isVisible&&!this.xrSessionActive)try{this.resize(),this.update(r),this.render()}catch(i){this.reportRenderError(i)}this.animFrameId!==null&&(this.animFrameId=requestAnimationFrame(t))};this.animFrameId=requestAnimationFrame(t)}stop(){this.animFrameId!==null&&(cancelAnimationFrame(this.animFrameId),this.animFrameId=null)}setAutoRotate(t){this.autoRotate=t}getAutoRotate(){return this.autoRotate}setAutoRotateSpeed(t){this.autoRotateSpeed=t}getAutoRotateSpeed(){return this.autoRotateSpeed}setAutoRotateDelay(t){this.autoRotateDelay=Math.max(0,Number(t)||0)}getAutoRotateDelay(){return this.autoRotateDelay}resetTurntableRotation(t=0){this.turntableRotation=Number(t)||0,this.updateTurntableMatrix(),this.render()}updateTurntableMatrix(){let t=Math.cos(this.turntableRotation),e=Math.sin(this.turntableRotation),r=this.bounds.center[0],i=this.bounds.center[2],s=this.modelRootMatrix;s[0]=t,s[1]=0,s[2]=-e,s[3]=0,s[4]=0,s[5]=1,s[6]=0,s[7]=0,s[8]=e,s[9]=0,s[10]=t,s[11]=0,s[12]=r-(t*r+e*i),s[13]=0,s[14]=i-(-e*r+t*i),s[15]=1}setVisible(t){this.isVisible=t}update(t){for(let a of j)a.onUpdate?.(this,t);let e=typeof performance<"u"?performance.now():Date.now();if(!this.isPointerDown&&this.autoRotate&&e-this.lastInteractionTime>=this.autoRotateDelay){this.turntableRotation+=this.autoRotateSpeed*t,this.updateTurntableMatrix();for(let a of j)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(t,e,r,i,s=!0,a=0){this.onBeforeRenderXRView&&this.onBeforeRenderXRView(t);let l=t?.transform?.inverse?.matrix||this.viewMatrix,o=t?.projectionMatrix||this.projMatrix,c=t?.transform?.position,u=c?[c.x,c.y,c.z]:[0,1.6,0];e?this.modelRootMatrix.set(e):r&&e&&this.modelRootMatrix.set(e),this.render({viewMatrix:l,projMatrix:o,eyePos:u,viewport:i,eye:t?.eye||"none",clear:a>0?!1:t?.eye!=="right",isAR:s})}render(t){if(this.contextLost)return;if(!t&&this.stereoSBS){let y=Math.max(2,this.canvas.width||2),T=Math.max(1,this.canvas.height||1),p=Math.max(1,Math.floor(y*.5)),M=Math.max(1,y-p),_=this.backdropMeshes.length>0?Math.max(this.bounds.radius*20,120):Math.max(this.bounds.radius*20,10),D=this.customTarget||this.bounds.center,[O,V,F]=fe(this),h=Math.cos(this.currTheta),E=-Math.sin(this.currTheta),R=.032,b=X(),N=X(),P=[O-h*R,V,F-E*R],K=[D[0]-h*R*.25,D[1],D[2]-E*R*.25];ye(b,this.fov,p/T,.1,_),Te(N,P,K,[0,1,0]);let S=X(),U=X(),k=[O+h*R,V,F+E*R],Z=[D[0]+h*R*.25,D[1],D[2]+E*R*.25];ye(S,this.fov,M/T,.1,_),Te(U,k,Z,[0,1,0]),this.render({viewMatrix:N,projMatrix:b,eyePos:P,viewport:[0,0,p,T],eye:"left",clear:!0,isAR:!1}),this.render({viewMatrix:U,projMatrix:S,eyePos:k,viewport:[p,0,M,T],eye:"right",clear:!1,isAR:!1}),this.gl.viewport(0,0,y,T);return}let e=this.gl,r=0,i=0,s=this.canvas.width,a=this.canvas.height;t?.viewport?(r=t.viewport[0],i=t.viewport[1],s=t.viewport[2],a=t.viewport[3],e.viewport(r,i,s,a)):e.viewport(0,0,this.canvas.width,this.canvas.height),e.enable(2929),(!t||t.clear!==!1)&&(t?.isAR?e.clearColor(0,0,0,0):e.clearColor(this.clearColor[0],this.clearColor[1],this.clearColor[2],this.clearColor[3]),e.clear(16384|256));let l=X(),o=t?.viewMatrix??this.viewMatrix;this.activeViewMatrix=o,ee(l,t?.projMatrix??this.projMatrix,o);let c=$().xrDepthShader,u=ot(this.toneMapping),[f,m,g]=t?t.eyePos:fe(this);for(let y of j)y.onBeforeDrawScene?.(this,e,l,[f,m,g],u);let d=t?.isAR?0:this.backdropMeshes.length;if(this.meshes.length===0&&d===0)return;let A=t?.eye||"none",v=!1,x=d>0?[...this.backdropMeshes,...this.meshes]:this.meshes,w=y=>{for(let T=0;T<x.length;T++){let p=x[T];if(p.visible===!1)continue;let M=this.selectedMeshName!==""&&p.name===this.selectedMeshName;T<d||p.worldSpace===!0||p.name==="__xr_reticle__"?this.modelMatrix.set(p.transform):ee(this.modelMatrix,this.modelRootMatrix,p.transform),ee(this.mvpMatrix,l,this.modelMatrix),ce(p.normalMatrix,this.modelMatrix);let _=p.extras?.xr?.stereo||p.userData?.xr?.stereo,D=0,O=0,V=1,F=1;_==="sbs"?(V=.5,D=A==="right"?.5:0):_==="ou"&&(F=.5,O=A==="right"?.5:0);for(let h of p.primitives){let E=!!h.isTransmissive;if(!y&&E){v=!0;continue}if(y&&!E)continue;let R=h.customProgram||this.renderProg,b=h.customUniforms||this.uRender;e.useProgram(R),e.uniform1i(b.uToneMapping,u),e.uniform1f(b.uEnvIntensity,this.envIntensity),b.uExposure&&e.uniform1f(b.uExposure,this.exposure),e.uniform3f(b.uCameraPos,f,m,g),e.uniform1f(b.uEmissive,M?1:0),e.uniformMatrix4fv(b.uMVP,!1,this.mvpMatrix),e.uniformMatrix4fv(b.uModel,!1,this.modelMatrix),e.uniformMatrix3fv(b.uNormalMatrix,!1,p.normalMatrix),b.uUvTransform&&e.uniform4f(b.uUvTransform,D,O,V,F),b.uViewportSize&&e.uniform2f(b.uViewportSize,Math.max(1,s),Math.max(1,a)),c?.bind(e,b,this.xrDepthState,o,[r,i,Math.max(1,s),Math.max(1,a)]),this.environmentTexture?(e.activeTexture(33988),e.bindTexture(3553,this.environmentTexture),e.uniform1i(b.uEnvironmentMap,4),e.uniform1i(b.uHasEnvironmentMap,1)):e.uniform1i(b.uHasEnvironmentMap,0),this.bindLights(b),b.uSectionEnabled&&e.uniform1i(b.uSectionEnabled,0);for(let P of j)P.onBeforeDrawPrimitive?.(e,R,h,p,this.worldMatrices||[],this.gltf);e.uniform4fv(b.uBaseColor,h.baseColor),e.uniform1f(b.uMetallic,h.metallic),e.uniform1f(b.uRoughness,h.roughness),b.uClearcoat&&e.uniform2f(b.uClearcoat,h.clearcoat??0,h.clearcoatRoughness??.04),h.texture?(e.activeTexture(33984),e.bindTexture(3553,h.texture),e.uniform1i(b.uBaseColorTexture,0),e.uniform1i(b.uHasTexture,1)):e.uniform1i(b.uHasTexture,0),h.metallicRoughnessTexture?(e.activeTexture(33985),e.bindTexture(3553,h.metallicRoughnessTexture),e.uniform1i(b.uMetallicRoughnessTexture,1),e.uniform1i(b.uHasMetallicRoughnessTexture,1)):e.uniform1i(b.uHasMetallicRoughnessTexture,0),h.normalTexture?(e.activeTexture(33986),e.bindTexture(3553,h.normalTexture),e.uniform1i(b.uNormalTexture,2),e.uniform1i(b.uHasNormalTexture,1),e.uniform1f(b.uNormalScale,h.normalScale)):e.uniform1i(b.uHasNormalTexture,0),h.occlusionTexture?(e.activeTexture(33987),e.bindTexture(3553,h.occlusionTexture),e.uniform1i(b.uOcclusionTexture,3),e.uniform1i(b.uHasOcclusionTexture,1),e.uniform1f(b.uOcclusionStrength,h.occlusionStrength)):e.uniform1i(b.uHasOcclusionTexture,0),e.bindVertexArray(h.vao);let N=p.instanceMatrices;if(N&&N.length>=16&&h.instanced&&b.uInstanced&&b.uViewProj){let P=N.length>>4;e.uniform1i(b.uInstanced,1),e.uniformMatrix4fv(b.uViewProj,!1,l),h.indices?e.drawElementsInstanced(4,h.indexCount,h.indexType,0,P):e.drawArraysInstanced(4,0,h.indexCount,P),e.uniform1i(b.uInstanced,0)}else if(N&&N.length>=16){let P=N.length>>4,K=p.instanceColors,S=X(),U=new Float32Array(9),k=[h.baseColor[0],h.baseColor[1],h.baseColor[2],h.baseColor[3]];for(let Z=0;Z<P;Z++)ee(S,this.modelMatrix,N.subarray(Z*16,Z*16+16)),ee(this.mvpMatrix,l,S),ce(U,S),e.uniformMatrix4fv(b.uMVP,!1,this.mvpMatrix),e.uniformMatrix4fv(b.uModel,!1,S),e.uniformMatrix3fv(b.uNormalMatrix,!1,U),K&&(k[0]=h.baseColor[0]*K[Z*3],k[1]=h.baseColor[1]*K[Z*3+1],k[2]=h.baseColor[2]*K[Z*3+2],k[3]=h.baseColor[3],e.uniform4fv(b.uBaseColor,k)),Me(e,h)}else Me(e,h)}}};if(w(!1),v){for(let y of j)y.onBeforeTransmissivePass?.(e,this);w(!0)}for(let y of j)y.onAfterRender?.(e,this,l)}disposeMeshListGpuResources(t,e){Je(this.gl,t,e)}disposeMeshGpuResources(){this.disposeMeshListGpuResources(this.meshes,this.gpuTextures),this.meshes=[],this.gpuTextures=[],this.availableVariants=[]}disposeGpuResources(){let t=this.gl;this.disposeMeshGpuResources(),this.disposeMeshListGpuResources(this.backdropMeshes),this.backdropMeshes=[];for(let e of j)e.onDestroy?.(t,this);this.environmentTexture&&(t.deleteTexture(this.environmentTexture),this.environmentTexture=null),this.renderProg&&t.deleteProgram(this.renderProg),this.pickProg&&t.deleteProgram(this.pickProg),this.pickFbo&&t.deleteFramebuffer(this.pickFbo),this.pickTexture&&t.deleteTexture(this.pickTexture),this.pickDepth&&t.deleteRenderbuffer(this.pickDepth),this.pickFbo=null,this.pickTexture=null,this.pickDepth=null}dispose(){this.stop(),this.teardownEvents(),this.disposeGpuResources()}destroy(){this.dispose()}};te.registerPlugin=Ne,te.getRegisteredPlugins=Be;var xt=typeof HTMLElement<"u"?HTMLElement:class{};typeof CustomEvent>"u"&&typeof Event<"u"&&(globalThis.CustomEvent=class extends Event{constructor(n,t){super(n,t),this.detail=t?.detail??null}});var q=class q extends xt{constructor(){super(...arguments);this.viewer=null;this.canvas=null;this.posterEl=null;this.arButton=null;this.currentModel=null;this.activeXRSession=null;this.toastTimer=null;this.currentModelLimits=void 0;this.isModelLoaded=!1;this.scriptHandle=null;this.resizeObserver=null;this.mutationObserver=null}static get arProvider(){return $().arProvider}static set arProvider(e){$().arProvider=e}static get scriptRunner(){return $().scriptRunner}static set scriptRunner(e){$().scriptRunner=e}static get sandboxEngineSrc(){return $().sandboxEngineSrc??null}static set sandboxEngineSrc(e){$().sandboxEngineSrc=e}static get sandboxIframeSrc(){return $().sandboxIframeSrc??null}static set sandboxIframeSrc(e){$().sandboxIframeSrc=e}static get allowClientScripts(){return!!$().allowClientScripts}static set allowClientScripts(e){$().allowClientScripts=e}static registerScriptRunner(e){q.scriptRunner=e}static registerDecoder(e,r){te.registerDecoder(e,r)}static getDecoder(e){return te.getDecoder(e)}static registerAR(e){typeof e=="function"?q.arProvider={activateAR:e}:q.arProvider=e,typeof document<"u"&&document.querySelectorAll("three-live").forEach(i=>{i instanceof q&&i.updateARButtonVisibility()})}static isARSupported(){return!!q.arProvider}getLoadedModel(){return this.currentModel}connectedCallback(){if(typeof document>"u")return;(!this.style.display||this.style.display==="inline")&&(this.style.display="block"),getComputedStyle(this).position==="static"&&(this.style.position="relative"),this.style.overflow="hidden",this.setupDOM(),this.initViewer(),this.setupResizeObserver();let e=this.getAttribute("src"),r=this.getAttribute("script-src");if(e)this.loadModel(e).catch(()=>{});else if(r)this.loadScriptFromSrc(r).catch(()=>{});else{let i=this.querySelector('script[type="text/three"], script[type="text/three-live"]');i&&i.textContent&&this.executeScript(i.textContent).catch(()=>{})}for(let i of te.getRegisteredPlugins())i.onElementConnected?.(this)}disconnectedCallback(){for(let e of te.getRegisteredPlugins())e.onElementDisconnected?.(this);this.scriptHandle&&(this.scriptHandle.terminate(),this.scriptHandle=null),this.mutationObserver&&(this.mutationObserver.disconnect(),this.mutationObserver=null),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.activeXRSession&&(this.activeXRSession.stop?.().catch?.(()=>{}),this.activeXRSession=null),this.toastTimer&&(clearTimeout(this.toastTimer),this.toastTimer=null),this.viewer&&(this.viewer.destroy(),this.viewer=null),this.isModelLoaded=!1}attributeChangedCallback(e,r,i){if(r!==i){switch(e){case"src":i&&this.loadModel(i).catch(()=>{});break;case"camera-target":this.applyCameraTarget(i);break;case"min-camera-orbit":case"max-camera-orbit":this.applyOrbitLimits();break;case"field-of-view":this.applyFieldOfView(i);break;case"script-src":i&&this.loadScriptFromSrc(i).catch(()=>{});break;case"sandbox":case"allow-client-scripts":case"ios-src":break;case"poster":this.updatePoster(i);break;case"camera-orbit":this.applyCameraOrbit(i);break;case"selected-mesh":this.viewer&&i!==null&&this.viewer.setSelectedMesh(i);break;case"exposure":if(this.viewer&&i!==null){let s=parseFloat(i);isNaN(s)||this.viewer.setExposure(s)}break;case"shadow-intensity":case"shadow-softness":this.viewer&&this.viewer.setShadow(this.shadowIntensity,this.shadowSoftness);break;case"tone-mapping":this.viewer?.setToneMapping(de(i));break;case"environment-image":this.viewer&&this.viewer.setEnvironmentImage(i).catch(()=>{});break;case"skybox-image":this.viewer&&this.viewer.setSkyboxImage?.(i)?.catch?.(()=>{});break;case"camera-controls":{let s=this.cameraControls;this.viewer&&this.viewer.setInteractive?.(s),this.canvas&&(this.canvas.style.touchAction=s?"none":"auto");break}case"autoplay":this.viewer&&this.viewer.setAutoplay(i!==null&&i!=="false");break;case"animation-name":this.viewer&&i!==null&&this.viewer.setAnimationName(i);break;case"variant-name":this.viewer&&this.selectVariant(i);break;case"auto-rotate":this.viewer&&this.viewer.setAutoRotate(i!==null&&i!=="false");break;case"auto-rotate-delay":this.viewer&&this.viewer.setAutoRotateDelay(this.autoRotateDelay);break;case"rotation-per-second":this.viewer&&this.viewer.setAutoRotateSpeed(this.parseRotationPerSecond(i));break;case"ar":this.updateARButtonVisibility();break}for(let s of te.getRegisteredPlugins())s.onAttributeChanged?.(this,e,r,i)}}getAttr(e){return this.getAttribute(e)}setAttr(e,r){r!==null?this.setAttribute(e,r):this.removeAttribute(e)}getBoolAttr(e){return this.hasAttribute(e)&&this.getAttribute(e)!=="false"}setBoolAttr(e,r){r?this.setAttribute(e,""):this.removeAttribute(e)}getFloatAttr(e,r){let i=this.getAttribute(e);return i!==null?parseFloat(i):r}get src(){return this.getAttr("src")}set src(e){this.setAttr("src",e)}get cameraControls(){return this.getBoolAttr("camera-controls")}set cameraControls(e){this.setBoolAttr("camera-controls",e)}get cameraOrbit(){return this.getAttr("camera-orbit")}set cameraOrbit(e){this.setAttr("camera-orbit",e)}get cameraTarget(){return this.getAttr("camera-target")}set cameraTarget(e){this.setAttr("camera-target",e)}get minCameraOrbit(){return this.getAttr("min-camera-orbit")}set minCameraOrbit(e){this.setAttr("min-camera-orbit",e)}get maxCameraOrbit(){return this.getAttr("max-camera-orbit")}set maxCameraOrbit(e){this.setAttr("max-camera-orbit",e)}get fieldOfView(){return this.getAttr("field-of-view")}set fieldOfView(e){this.setAttr("field-of-view",e)}get iosSrc(){return this.getAttr("ios-src")}set iosSrc(e){this.setAttr("ios-src",e)}get scriptSrc(){return this.getAttr("script-src")}set scriptSrc(e){this.setAttr("script-src",e)}get sandbox(){return this.getAttribute("sandbox")||($().sandboxIframeSrc?"iframe":"worker")}set sandbox(e){this.setAttribute("sandbox",e)}get allowClientScripts(){return this.getBoolAttr("allow-client-scripts")||q.allowClientScripts}set allowClientScripts(e){this.setBoolAttr("allow-client-scripts",e)}get poster(){return this.getAttr("poster")}set poster(e){this.setAttr("poster",e)}get selectedMesh(){return this.getAttr("selected-mesh")}set selectedMesh(e){this.setAttr("selected-mesh",e)}get exposure(){return this.getFloatAttr("exposure",1)}set exposure(e){this.setAttribute("exposure",String(e))}get autoRotate(){return this.getBoolAttr("auto-rotate")}set autoRotate(e){this.setBoolAttr("auto-rotate",e)}get autoRotateDelay(){return this.getFloatAttr("auto-rotate-delay",3e3)}set autoRotateDelay(e){this.setAttribute("auto-rotate-delay",String(e))}get rotationPerSecond(){return this.getAttr("rotation-per-second")||"30deg"}set rotationPerSecond(e){this.setAttr("rotation-per-second",e)}get turntableRotation(){return this.viewer?this.viewer.turntableRotation:0}get ar(){return this.hasAttribute("ar")}set ar(e){this.setBoolAttr("ar",e)}get arScale(){return this.getAttribute("ar-scale")||"auto"}set arScale(e){this.setAttribute("ar-scale",e)}get arPlacement(){return this.getAttribute("ar-placement")||"floor"}set arPlacement(e){this.setAttribute("ar-placement",e)}get canActivateAR(){return q.isARSupported()}get shadowIntensity(){return this.getFloatAttr("shadow-intensity",0)}set shadowIntensity(e){this.setAttribute("shadow-intensity",String(e))}get shadowSoftness(){return this.getFloatAttr("shadow-softness",.5)}set shadowSoftness(e){this.setAttribute("shadow-softness",String(e))}get toneMapping(){return de(this.getAttribute("tone-mapping"))}set toneMapping(e){this.setAttribute("tone-mapping",e)}get bloom(){return this.getFloatAttr("bloom",0)}set bloom(e){this.setAttribute("bloom",String(e))}get bloomThreshold(){return Re(this.getAttribute("bloom-threshold"),.62)}set bloomThreshold(e){this.setAttribute("bloom-threshold",String(e))}get bloomRadius(){return Re(this.getAttribute("bloom-radius"),.75)}set bloomRadius(e){this.setAttribute("bloom-radius",String(e))}get outlineSelected(){return this.getBoolAttr("outline-selected")}set outlineSelected(e){this.setBoolAttr("outline-selected",e)}get outlineColor(){return this.getAttr("outline-color")||"#38bdf8"}set outlineColor(e){this.setAttr("outline-color",e)}get environmentImage(){return this.getAttr("environment-image")}set environmentImage(e){this.setAttr("environment-image",e)}get skyboxImage(){return this.getAttr("skybox-image")}set skyboxImage(e){this.setAttr("skybox-image",e)}get autoplay(){return this.getBoolAttr("autoplay")}set autoplay(e){this.setBoolAttr("autoplay",e)}get animationName(){return this.getAttr("animation-name")}set animationName(e){this.setAttr("animation-name",e)}get availableAnimations(){return this.viewer?this.viewer.getAvailableAnimations():[]}get variantName(){return this.viewer?this.viewer.getVariantName():this.getAttr("variant-name")}set variantName(e){this.setAttr("variant-name",e)}get availableVariants(){return this.viewer?this.viewer.getAvailableVariants():[]}selectVariant(e){if(!this.viewer)return!1;let r=this.viewer.selectVariant(e);return r&&this.dispatchEvent(new CustomEvent("variant-applied",{bubbles:!0,composed:!0,detail:{variantName:this.viewer.getVariantName()}})),r}get model(){let e=this.viewer?this.viewer.getModelMaterials():[];return{materials:e,getMaterialByName(r){return e.find(i=>i.name===r)??null}}}play(){this.viewer&&this.viewer.playAnimation(this.animationName||void 0)}pause(){this.viewer&&this.viewer.pauseAnimation()}resetCamera(){this.viewer?.resetCamera()}resetTurntableRotation(e=0){this.viewer?.resetTurntableRotation(e)}setCamera(e,r,i,s){this.viewer&&this.viewer.setCamera(e,r,i,s)}getCameraOrbit(){return this.viewer?this.viewer.getCameraOrbit():{theta:0,phi:0,radius:3,toString(){return"0rad 0rad 3m"}}}getCameraTarget(){return this.viewer?this.viewer.getCameraTarget():{x:0,y:0,z:0,toString(){return"0m 0m 0m"}}}getFieldOfView(){return this.viewer?this.viewer.getFieldOfView():45}jumpCameraToGoal(){this.viewer?.jumpCameraToGoal()}toDataURL(e,r){return this.viewer&&this.viewer.render?.(),this.canvas?this.canvas.toDataURL(e,r):""}toBlob(e){return this.viewer&&this.viewer.render?.(),new Promise((r,i)=>{if(!this.canvas||typeof this.canvas.toBlob!="function"){i(new Error("Canvas toBlob is not supported in this environment."));return}this.canvas.toBlob(s=>{s?r(s):i(new Error("Failed to capture canvas blob."))},e?.mimeType,e?.qualityArgument)})}positionAndNormalFromPoint(e,r){if(!this.viewer)return null;let i=this.viewer.raycastFromScreenPoint(e,r);if(!i)return null;let[s,a,l]=i.hitPoint||i.point,[o,c,u]=i.normal;return{position:{x:s,y:a,z:l,toString(){return`${s}m ${a}m ${l}m`}},normal:{x:o,y:c,z:u,toString(){return`${o}m ${c}m ${u}m`}}}}async loadModel(e){return this.loadModelWithLimits(e)}async loadModelWithLimits(e,r){if(!this.viewer){this.currentModel=e,this.currentModelLimits=r;return}try{let i;if(typeof e=="string"){this.isModelLoaded=!1,this.viewer?.clearScene?.();let o=await fetch(e);if(!o.ok)throw new Error(`Failed to load 3D model from "${e}": HTTP ${o.status}`);i=await o.arrayBuffer()}else i=e;let s=pe(i);this.viewer.loadGLBData(s,r),this.currentModel=s,this.currentModelLimits=r,this.isModelLoaded=!0,this.hidePoster(),this.updateHotspots();let a=this.getAttribute("selected-mesh");a&&this.viewer.setSelectedMesh(a);let l=this.getAttribute("variant-name");l&&this.selectVariant(l),this.dispatchEvent(new CustomEvent("load",{bubbles:!0,composed:!0,detail:{model:s}}))}catch(i){throw this.dispatchEvent(new CustomEvent("error",{bubbles:!0,composed:!0,detail:{error:i}})),i}}showToast(e,r=4500){if(typeof document>"u")return;let i=this.querySelector(".three-live-toast");i||(i=document.createElement("div"),i.className="three-live-toast",i.style.cssText="position:absolute;bottom:70px;left:50%;transform:translateX(-50%) translateY(10px);z-index:10;padding:10px 16px;background-color:rgba(15,23,42,0.94);color:#f8fafc;border:1px solid rgba(56,189,248,0.45);border-radius:14px;font:500 13px/1.35 system-ui,-apple-system,sans-serif;box-shadow:0 10px 25px rgba(0,0,0,0.45);backdrop-filter:blur(12px);pointer-events:none;opacity:0;transition:opacity .25s ease,transform .25s ease;max-width:88%;text-align:center;white-space:normal;word-break:break-word",this.appendChild(i)),i.textContent=e,this.toastTimer&&(clearTimeout(this.toastTimer),this.toastTimer=null),typeof requestAnimationFrame<"u"?requestAnimationFrame(()=>{i&&(i.style.opacity="1",i.style.transform="translateX(-50%) translateY(0)")}):(i.style.opacity="1",i.style.transform="translateX(-50%) translateY(0)"),this.toastTimer=setTimeout(()=>{i&&(i.style.opacity="0",i.style.transform="translateX(-50%) translateY(10px)"),this.toastTimer=null},r)}async activateAR(){if(this.activeXRSession&&typeof this.activeXRSession.isSessionActive=="function"&&this.activeXRSession.isSessionActive()&&(await this.activeXRSession.stop().catch(()=>{}),this.activeXRSession=null),!this.currentModel){let i=new Error("No 3D model is loaded in <three-live>.");throw this.dispatchEvent(new CustomEvent("ar-status",{bubbles:!0,composed:!0,detail:{status:"failed",error:i}})),this.showToast(i.message,6e3),i}if(!q.arProvider){let i=new Error("AR module not bundled. Use the default 'three-live' bundle or call ThreeLiveElement.registerAR().");throw this.dispatchEvent(new CustomEvent("ar-status",{bubbles:!0,composed:!0,detail:{status:"failed",error:i}})),this.showToast(i.message,6e3),i}let e=this.getAttribute("ios-src"),r=(this.getAttribute("ar-modes")||"").split(/\s+/).filter(Boolean);try{this.dispatchEvent(new CustomEvent("ar-status",{bubbles:!0,composed:!0,detail:{status:"session-started"}}));let i=await q.arProvider.activateAR({model:e||this.currentModel,glbUrl:typeof this.currentModel=="string"?this.currentModel:void 0,view:this.viewer||void 0,element:this,preferredModes:r.length>0?r:void 0,arScale:this.arScale,arPlacement:this.arPlacement,webXROptions:{onExit:()=>{this.activeXRSession=null,this.dispatchEvent(new CustomEvent("ar-status",{bubbles:!0,composed:!0,detail:{status:"not-presenting"}}))},onError:s=>{this.activeXRSession=null,this.dispatchEvent(new CustomEvent("ar-status",{bubbles:!0,composed:!0,detail:{status:"failed",error:s}})),this.showToast(`AR error: ${s.message}`,6e3)}}});if(i.success)i.session&&(this.activeXRSession=i.session),i.mode==="quick-look"?this.showToast("Opening Apple AR Quick Look..."):i.mode==="scene-viewer"?this.showToast("Opening Google Scene Viewer..."):i.mode==="webxr"&&this.showToast("WebXR AR session started.");else{let s=typeof navigator<"u"&&navigator.userAgent||"",a=/Macintosh/i.test(s)&&!(typeof navigator<"u"&&navigator.maxTouchPoints>1),l=/Android|iPhone|iPad|iPod/i.test(s);if(a&&!l&&typeof document<"u"&&this.currentModel&&q.arProvider.createUSDZBlob)try{let o=this.currentModel instanceof Blob&&this.currentModel.type==="model/vnd.usdz+zip"?this.currentModel:q.arProvider.createUSDZBlob(this.currentModel),c=URL.createObjectURL(o),u=document.createElement("a");u.href=c,u.download="three_live_model.usdz",document.body.appendChild(u),u.click(),document.body.removeChild(u),setTimeout(()=>URL.revokeObjectURL(c),3e3),this.showToast("Downloaded USDZ preview for macOS Quick Look.",5e3)}catch{this.showToast(i.error?.message||"AR requires an iOS (Quick Look) or Android (WebXR / Scene Viewer) device.",6e3)}else this.showToast(i.error?.message||"AR requires an iOS (Quick Look) or Android (WebXR / Scene Viewer) device.",6e3);i.error&&this.dispatchEvent(new CustomEvent("ar-status",{bubbles:!0,composed:!0,detail:{status:"failed",error:i.error}}))}return i}catch(i){throw this.activeXRSession=null,this.dispatchEvent(new CustomEvent("ar-status",{bubbles:!0,composed:!0,detail:{status:"failed",error:i}})),this.showToast(`AR error: ${i.message||String(i)}`,6e3),i}}setupDOM(){let e=this.querySelector("canvas");e||(e=document.createElement("canvas"),e.style.width="100%",e.style.height="100%",e.style.display="block",e.style.touchAction=this.cameraControls?"none":"auto",e.style.outline="none",this.appendChild(e)),this.canvas=e;let r=this.getAttribute("poster");r&&this.updatePoster(r),this.createARButton(),typeof MutationObserver<"u"&&!this.mutationObserver&&(this.mutationObserver=new MutationObserver(()=>{this.updateARButtonVisibility()}),this.mutationObserver.observe(this,{childList:!0}))}initViewer(){if(!this.canvas)return;let e=this.autoRotate,r=this.exposure,i=this.parseOrbitLimit(this.getAttribute("min-camera-orbit")),s=this.parseOrbitLimit(this.getAttribute("max-camera-orbit")),a=this.parseCameraTarget(this.getAttribute("camera-target")),l=this.parseFieldOfView(this.getAttribute("field-of-view"));this.viewer=new te(this,this.canvas,{autoRotate:e,autoRotateDelay:this.autoRotateDelay,autoRotateSpeed:this.parseRotationPerSecond(this.getAttribute("rotation-per-second")),exposure:r,shadowIntensity:this.shadowIntensity,shadowSoftness:this.shadowSoftness,toneMapping:this.toneMapping,environmentImage:this.environmentImage,autoplay:this.autoplay,animationName:this.animationName||void 0,variantName:this.getAttribute("variant-name")||void 0,fieldOfView:l,cameraTarget:a,minCameraOrbit:i,maxCameraOrbit:s,onMeshClick:c=>{this.dispatchEvent(new CustomEvent("meshclick",{bubbles:!0,composed:!0,detail:c}))},onCameraChange:c=>{this.updateHotspots();for(let u of te.getRegisteredPlugins())u.onCameraChange?.(this.viewer,this);this.dispatchEvent(new CustomEvent("camera-change",{bubbles:!0,composed:!0,detail:c}))}}),this.viewer.setInteractive(this.cameraControls),this.skyboxImage&&this.viewer.setSkyboxImage(this.skyboxImage).catch(()=>{});let o=this.getAttribute("camera-orbit");o&&this.applyCameraOrbit(o),this.currentModel&&this.loadModelWithLimits(this.currentModel,this.currentModelLimits)}setupResizeObserver(){typeof ResizeObserver>"u"||(this.resizeObserver=new ResizeObserver(()=>{this.viewer&&(this.viewer.resize(),this.viewer.render(),this.updateHotspots())}),this.resizeObserver.observe(this))}updatePoster(e){if(!(typeof document>"u")){if(!e){this.posterEl&&(this.posterEl.remove(),this.posterEl=null);return}this.posterEl||(this.posterEl=document.createElement("img"),this.posterEl.setAttribute("alt","3D Scene Preview"),this.posterEl.style.position="absolute",this.posterEl.style.inset="0",this.posterEl.style.width="100%",this.posterEl.style.height="100%",this.posterEl.style.objectFit="cover",this.posterEl.style.transition="opacity 0.35s ease-out",this.posterEl.style.pointerEvents="none",this.posterEl.style.zIndex="1",this.appendChild(this.posterEl)),this.posterEl.src=e,this.isModelLoaded||(this.posterEl.style.opacity="1")}}hidePoster(){this.posterEl&&(this.posterEl.style.opacity="0",setTimeout(()=>{this.isModelLoaded&&this.posterEl&&(this.posterEl.remove(),this.posterEl=null)},400))}createARButton(){if(!(typeof document>"u")){if(!this.arButton){let e=document.createElement("button");e.setAttribute("type","button"),e.setAttribute("aria-label","View in Augmented Reality"),e.className="three-live-ar-button",e.setAttribute("part","default-ar-button");let r="http://www.w3.org/2000/svg";if(typeof document.createElementNS=="function"){let s=document.createElementNS(r,"svg");s.setAttribute("width","20"),s.setAttribute("height","20"),s.setAttribute("viewBox","0 0 24 24"),s.setAttribute("fill","none"),s.setAttribute("stroke","currentColor"),s.setAttribute("stroke-width","2"),s.setAttribute("stroke-linecap","round"),s.setAttribute("stroke-linejoin","round"),s.style.marginRight="6px";let a=document.createElementNS(r,"path");a.setAttribute("d","M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z");let l=document.createElementNS(r,"polyline");l.setAttribute("points","3.27 6.96 12 12.01 20.73 6.96");let o=document.createElementNS(r,"line");o.setAttribute("x1","12"),o.setAttribute("y1","22.08"),o.setAttribute("x2","12"),o.setAttribute("y2","12"),s.appendChild(a),s.appendChild(l),s.appendChild(o),e.appendChild(s)}let i=document.createElement("span");i.textContent="View in AR",e.appendChild(i),e.style.cssText="position:absolute;right:16px;bottom:16px;z-index:2;align-items:center;justify-content:center;padding:8px 16px;background-color:rgba(15,23,42,0.85);color:#fff;border:1px solid rgba(255,255,255,0.15);border-radius:9999px;font:600 13px system-ui,-apple-system,sans-serif;cursor:pointer;backdrop-filter:blur(8px);box-shadow:0 4px 12px rgba(0,0,0,0.25);transition:transform .15s ease,background-color .15s ease;display:none",e.addEventListener("mouseenter",()=>{e.style.backgroundColor="rgba(30, 41, 59, 0.95)",e.style.transform="scale(1.04)"}),e.addEventListener("mouseleave",()=>{e.style.backgroundColor="rgba(15, 23, 42, 0.85)",e.style.transform="scale(1)"}),e.addEventListener("click",s=>{s.stopPropagation(),this.activateAR()}),this.arButton=e,this.appendChild(e)}this.updateARButtonVisibility()}}updateARButtonVisibility(){let e=this.hasAttribute("ar")&&!!q.arProvider,r=typeof this.querySelector=="function"?this.querySelector('[slot="ar-button"]'):null;r?(this.arButton&&(this.arButton.style.display="none"),r.__tlARBound||(r.__tlARBound=!0,r.addEventListener("click",i=>{i.stopPropagation(),this.activateAR()})),r.dataset.tlOrigDisplay===void 0&&(r.dataset.tlOrigDisplay=r.style.display==="none"?"":r.style.display),r.style.display=e?r.dataset.tlOrigDisplay||"":"none"):this.arButton&&(this.arButton.style.display=e?"flex":"none")}applyCameraOrbit(e){if(!(!e||!this.viewer))try{let r=JSON.parse(e);this.viewer.setInitialCamera(r.theta,r.phi,r.distance,r.zoom)}catch{let r=this.parseOrbitLimit(e);(r.theta!==void 0||r.phi!==void 0)&&this.viewer.setInitialCamera(r.theta,r.phi,r.distance)}}parseOrbitLimit(e){if(!e)return{};let r=e.trim().split(/\s+/),i={};if(r.length>0&&r[0]!=="auto"){let s=this.parseFieldOfView(r[0]);s!==void 0&&(i.theta=s)}if(r.length>1&&r[1]!=="auto"){let s=this.parseFieldOfView(r[1]);s!==void 0&&(i.phi=s)}if(r.length>2&&r[2]!=="auto"){let s=parseFloat(r[2].replace(/m$/,""));isNaN(s)||(i.distance=s)}return i}applyOrbitLimits(){if(!this.viewer)return;let e=this.parseOrbitLimit(this.getAttribute("min-camera-orbit")),r=this.parseOrbitLimit(this.getAttribute("max-camera-orbit"));this.viewer.setOrbitLimits({minTheta:e.theta,maxTheta:r.theta,minPhi:e.phi,maxPhi:r.phi,minDistance:e.distance,maxDistance:r.distance})}parseCameraTarget(e){if(!e)return;let r=e.trim().split(/\s+/).map(i=>parseFloat(i.replace(/m$/,"")));return r.length>=3&&!r.some(isNaN)?[r[0],r[1],r[2]]:void 0}parseFieldOfView(e){if(!e)return;let r=e.endsWith("rad")?parseFloat(e)*180/Math.PI:parseFloat(e.replace(/deg$/,""));return isNaN(r)?void 0:r}parseRotationPerSecond(e){if(!e)return Math.PI/6;let r=e.trim(),i=parseFloat(r);return isNaN(i)?Math.PI/6:r.endsWith("rad")?i:r.endsWith("%")?i/100*Math.PI*2:i*Math.PI/180}applyCameraTarget(e){let r=this.parseCameraTarget(e);this.viewer&&r&&this.viewer.setTarget(r[0],r[1],r[2])}applyFieldOfView(e){let r=this.parseFieldOfView(e);this.viewer&&r!==void 0&&this.viewer.setFieldOfView(r)}updateHotspot(e){let r=this.querySelector(`[slot="${e.name}"]`);r&&(e.position!==void 0&&r.setAttribute("data-position",e.position),e.normal!==void 0&&r.setAttribute("data-normal",e.normal)),this.updateHotspots()}updateHotspots(){for(let e of te.getRegisteredPlugins())if(e.updateHotspotsForElement){e.updateHotspotsForElement(this,this.viewer);return}}runWithScriptRunner(e){let r=q.scriptRunner;if(!r){let i=new Error('Procedural script execution requires "three-live/full" or ThreeLiveElement.registerScriptRunner().');return this.showToast(i.message),this.dispatchEvent(new CustomEvent("error",{bubbles:!0,composed:!0,detail:{error:i}})),Promise.reject(i)}return this.scriptHandle&&(this.scriptHandle.terminate(),this.scriptHandle=null),this.isModelLoaded=!1,this.viewer?.clearScene?.(),new Promise((i,s)=>{let a=!1;e(r,{onModelReady:o=>{this.loadModelWithLimits(o,qe).then(()=>{a||(a=!0,i(o))},c=>{let u=c instanceof Error?c.message:String(c);this.showToast(u),a||(a=!0,s(c))})},onUpdateTransforms:o=>this.viewer?.updateMeshTransforms(o),onError:o=>{this.showToast(o.message),this.dispatchEvent(new CustomEvent("error",{bubbles:!0,composed:!0,detail:{error:o}})),a||(a=!0,s(o))},onToast:o=>this.showToast(o)}).then(o=>{o&&(this.scriptHandle=o)},o=>{o instanceof Error&&o.message&&this.showToast(o.message),a||(a=!0,s(o))})})}loadScriptFromSrc(e){return this.runWithScriptRunner((r,i)=>{if(typeof r.executeUrl!="function"){let s=new Error("Registered ScriptRunner does not support executeUrl() for server-generated scripts.");return i.onError?.(s),Promise.reject(s)}return r.executeUrl(e,this.sandbox,i)})}executeScript(e){if(!q.scriptRunner)return this.runWithScriptRunner(()=>Promise.resolve());if(!this.allowClientScripts){let r=new Error(Ie);return this.showToast(Fe),this.dispatchEvent(new CustomEvent("error",{bubbles:!0,composed:!0,detail:{error:r}})),Promise.reject(r)}return this.runWithScriptRunner((r,i)=>r.execute(e,this.sandbox,i,{allowClientScripts:!0}))}};q.observedAttributes=["src","ios-src","script-src","sandbox","allow-client-scripts","poster","camera-controls","camera-orbit","camera-target","min-camera-orbit","max-camera-orbit","field-of-view","selected-mesh","ar","ar-modes","ar-scale","ar-placement","exposure","shadow-intensity","shadow-softness","tone-mapping","bloom","bloom-threshold","bloom-radius","outline","outline-selected","outline-color","environment-image","skybox-image","autoplay","animation-name","variant-name","auto-rotate","auto-rotate-delay","rotation-per-second"],q.registerPlugin=te.registerPlugin,q.getRegisteredPlugins=te.getRegisteredPlugins;var be=q;typeof customElements<"u"&&!customElements.get("three-live")&&customElements.define("three-live",be);return nt(yt);})();
252
+ void main(){fragColor=uColorId;}`;function De(n,t,e){let r={};for(let i of e)r[i]=n.getUniformLocation(t,i);return r}var Ve=["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 Ye(){let n=$().xrDepthShader;return{fs:ct.replace("/*XRD_U*/",n?.uniformsGLSL||"").replace("/*XRD_O*/",n?.occlusionGLSL||""),uniforms:n?[...Ve,...n.uniformNames]:Ve}}function dt(n){if(typeof n!="string")return null;let t=n.trim();if(!t||/[\x00-\x1f\x7f]/.test(t))return null;let e=t.toLowerCase();return e.startsWith("data:")?/^data:image\/(png|jpeg|jpg|webp|ktx2|avif)(;|,)/i.test(t)?t:null:e.startsWith("https://")||e.startsWith("blob:")?t:e.startsWith("//")||/^[a-z][a-z0-9+.-]*:/i.test(t)||/(^|[\\/])\.\.([\\/]|$)/.test(t)?null:t}function Ce(n,t,e,r,i,s,o,l){if(r===void 0||!t.accessors?.[r])return null;let a=Ee(t,e,t.accessors[r],s);if(!a)return null;l&&(a=a.slice(),_e(a,l));let c=n.createBuffer();return o.push(c),n.bindBuffer(34962,c),n.bufferData(34962,a,35044),n.enableVertexAttribArray(i),n.vertexAttribPointer(i,s,5126,!1,0,0),a}function Le(n){let t=Number(n);return Number.isFinite(t)?Math.max(0,t):1}function $e(n,t,e){let r=Ye(),i=je,s=r.fs,o=!1;for(let a of Y)if(a.onResolveShader){let c=a.onResolveShader(t,e,i,s);c&&(i=c.vs,s=c.fs,o=!0)}let l=o?ye(n,i,s):null;return{program:l,uniforms:l?De(n,l,r.uniforms):null}}function pt(n,t,e){let r=t.instanceMatrices;if(!r||r.length<16||typeof n.vertexAttribDivisor!="function"||typeof n.drawElementsInstanced!="function")return!1;let i=r.length>>4,s=t.instanceColors,o=new Float32Array(i*20);for(let a=0;a<i;a++)o.set(r.subarray(a*16,a*16+16),a*20),o[a*20+16]=s?s[a*3]:1,o[a*20+17]=s?s[a*3+1]:1,o[a*20+18]=s?s[a*3+2]:1,o[a*20+19]=1;let l=n.createBuffer();e.push(l),n.bindBuffer(34962,l),n.bufferData(34962,o,35044);for(let a=0;a<5;a++)n.enableVertexAttribArray(8+a),n.vertexAttribPointer(8+a,4,5126,!1,80,a*16),n.vertexAttribDivisor(8+a,1);return!0}function ft(n,t){let e=n.materials?.[t?.material];if(!e)return null;let r=[e.pbrMetallicRoughness?.baseColorTexture,e.pbrMetallicRoughness?.metallicRoughnessTexture,e.normalTexture,e.occlusionTexture,e.emissiveTexture];for(let i of r){let s=i?.extensions?.KHR_texture_transform;if(s&&typeof s=="object")return s}return null}var qe=Object.freeze({maxMeshes:1e3,maxTextures:64,maxVertices:1e6,maxIndices:3e6}),Ke=Object.freeze({maxMeshes:1/0,maxTextures:1/0,maxVertices:1/0,maxIndices:1/0});function Re(n,t){t.indices?n.drawElements(4,t.indexCount,t.indexType,0):n.drawArrays(4,0,t.indexCount)}function Ze(n,t){let e=n?.pbrMetallicRoughness,r=e?.baseColorFactor,i=n?.extensions?.KHR_materials_clearcoat,s=o=>o!==void 0&&t[o.index]?t[o.index]:null;return{baseColor:r?[r[0],r[1],r[2],r[3]??1]:[.8,.8,.8,1],metallic:e?.metallicFactor??.1,roughness:e?.roughnessFactor??.5,clearcoat:i?i.clearcoatFactor??1:0,clearcoatRoughness:Math.max(.04,i?.clearcoatRoughnessFactor??.04),texture:s(e?.baseColorTexture),metallicRoughnessTexture:s(e?.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 Je(n,t,e){let r=new Set,i=s=>{s&&!r.has(s)&&(r.add(s),n.deleteTexture(s))};for(let s of t)for(let o of s.primitives){if(o.vao&&n.deleteVertexArray(o.vao),o.buffers)for(let a of o.buffers)n.deleteBuffer(a);i(o.texture),i(o.metallicRoughnessTexture),i(o.normalTexture),i(o.occlusionTexture);let l=new Set;o.customProgram&&l.add(o.customProgram);for(let a of o.programCache?.values()??[])a.program&&l.add(a.program);for(let a of l)n.deleteProgram(a)}if(e)for(let s of e)i(s)}function He(n,t,e=Ke,r){let i={meshes:[],mesh:null,gpuTextures:[],vao:null,buffers:[]};try{return bt(n,t,e,r,i)}catch(s){let o=i.mesh&&!i.meshes.includes(i.mesh)?[...i.meshes,i.mesh]:i.meshes;Je(n,o,i.gpuTextures),i.vao&&n.deleteVertexArray(i.vao);for(let l of i.buffers)n.deleteBuffer(l);throw s}}function bt(n,t,e,r,i){if(!t||!t.gltf)throw new Error("Invalid GLBData passed to buildGpuScene: missing gltf object.");let{gltf:s}=t,o=me("meshopt");o?.decodeBufferViews&&o.decodeBufferViews(s,t);let l=t.bin,a=[];i.meshes=a;let c=[],u=s.extensions?.KHR_materials_variants;u&&Array.isArray(u.variants)&&u.variants.forEach((h,E)=>{c.push(typeof h?.name=="string"&&h.name?h.name:`Variant_${E}`)});let d=Ue(s),m=[];if(Array.isArray(s.nodes))for(let h=0;h<s.nodes.length;h++){let E=s.nodes[h];E.mesh!==void 0&&s.meshes&&s.meshes[E.mesh]&&m.push({node:E,nodeIdx:h,meshIdx:E.mesh})}let x=m.length>0?m:(s.meshes||[]).map((h,E)=>({node:h,nodeIdx:-1,meshIdx:E})),g=[];if(Array.isArray(t.lights)&&t.lights.length>0)g.push(...t.lights);else if(s.extensions?.KHR_lights_punctual?.lights){let h=s.extensions.KHR_lights_punctual.lights;for(let E of h){let A=E.type==="directional"?"directional":E.type==="point"?"point":"ambient";g.push({type:A,color:E.color||[1,1,1],intensity:E.intensity!==void 0?E.intensity:1})}}if(g.length===0&&(g.push({type:"ambient",color:[1,1,1],intensity:.35}),g.push({type:"directional",color:[1,1,1],intensity:.85,direction:[.5,1,.8]})),x.length>e.maxMeshes)throw new Error(`SecurityError: GLB scene exceeds host mesh limit (${e.maxMeshes}). Found: ${x.length}`);let b=[];if(i.gpuTextures=b,s.textures&&s.images){if(s.textures.length>e.maxTextures)throw new Error(`SecurityError: GLB scene exceeds host texture limit (${e.maxTextures}). Found: ${s.textures.length}`);for(let h=0;h<s.textures.length;h++){let E=s.textures[h],A=s.images[E.source];if(A){let f=n.createTexture();if(n.bindTexture(3553,f),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),A.bufferView!==void 0){let N=s.bufferViews[A.bufferView],P=l.slice(N.byteOffset||0,(N.byteOffset||0)+N.byteLength),K=new Blob([P],{type:A.mimeType||"image/png"});typeof createImageBitmap=="function"&&createImageBitmap(K).then(S=>{n.bindTexture(3553,f),n.texImage2D(3553,0,6408,6408,5121,S),n.generateMipmap(3553),r?.()}).catch(()=>{})}else if(A.uri){let N=dt(A.uri);if(N){let P=new Image;P.crossOrigin="anonymous",P.referrerPolicy="no-referrer",P.onload=()=>{n.bindTexture(3553,f),n.texImage2D(3553,0,6408,6408,5121,P),n.generateMipmap(3553),r?.()},P.src=N}else console.warn("[Three-Live Security] Blocked unsafe glTF image URI:",A.uri)}b.push(f)}else b.push(null)}}let v=[1/0,1/0,1/0],y=[-1/0,-1/0,-1/0],w=0,T=0;for(let h=0;h<x.length;h++){let E=x[h],A=s.meshes[E.meshIdx],f=E.nodeIdx>=0?d[E.nodeIdx]:X(),N=new Float32Array(9);ce(N,f);let P={name:E.node.name||A.name||`Mesh_${E.meshIdx}`,nodeIndex:E.nodeIdx,transform:f,normalMatrix:N,primitives:[],extras:E.node.extras||A.extras};i.mesh=P;let K=E.node?.extensions?.EXT_mesh_gpu_instancing;if(K&&K.attributes&&typeof K.attributes=="object"){let S=K.attributes,U=S.TRANSLATION!==void 0?s.accessors?.[S.TRANSLATION]:null,k=S.ROTATION!==void 0?s.accessors?.[S.ROTATION]:null,Z=S.SCALE!==void 0?s.accessors?.[S.SCALE]:null,J=S._COLOR_0!==void 0?s.accessors?.[S._COLOR_0]:null,B=Number(U?.count??k?.count??Z?.count??0);if(!Number.isFinite(B)||B<0||B>1e4)throw new Error(`SecurityError: EXT_mesh_gpu_instancing exceeds maximum instance limit (10000). Found: ${B}`);if(B>0){let z=(I,W)=>{if(!I||I.bufferView===void 0||!s.bufferViews?.[I.bufferView])return null;let ne=I.componentType??5126,ae=j=>(console.warn(`[three-live] EXT_mesh_gpu_instancing: skipping accessor (${j})`),null);if(ne!==5120&&ne!==5121&&ne!==5122&&ne!==5123&&ne!==5126)return ae(`componentType ${ne}`);if(!(Number(I.count)>=B))return ae(`count ${I.count} < ${B}`);let C=null;try{C=Ee(s,l,{...I,count:B},W)}catch{return ae("out of bounds")}return!C||!C.every(Number.isFinite)?ae("non-finite value"):C},D=z(U,3),se=z(k,4),H=z(Z,3),ie=J?.type==="VEC4"?4:3,re=z(J,ie),oe=new Float32Array(B*16),le=X();for(let I=0;I<B;I++){let W=D?[D[I*3],D[I*3+1],D[I*3+2]]:[0,0,0],ne=se?[se[I*4],se[I*4+1],se[I*4+2],se[I*4+3]]:[0,0,0,1],ae=H?[H[I*3],H[I*3+1],H[I*3+2]]:[1,1,1];Se(le,ne,W,ae),oe.set(le,I*16)}if(P.instanceMatrices=oe,re){let I=new Float32Array(B*3);for(let W=0;W<B;W++)I[W*3]=re[W*ie],I[W*3+1]=re[W*ie+1],I[W*3+2]=re[W*ie+2];P.instanceColors=I}}}for(let S of A.primitives||[]){if(S.extensions?.KHR_draco_mesh_compression){let C=me("draco");C&&C.decodePrimitive(s,S,l)}let U=[],k=n.createVertexArray();i.vao=k,i.buffers=U,n.bindVertexArray(k);let Z=pt(n,P,U),J=s.accessors[S.attributes.POSITION],B=Number(J?.count??0);if(!Number.isFinite(B)||B<0||w+B>e.maxVertices)throw new Error(`SecurityError: GLB scene exceeds host vertex limit (${e.maxVertices}).`);if(w+=B,J?.min&&J?.max){let C=j=>{for(let G=0;G<3;G++){let Q=j[12+G],ue=j[12+G];for(let he=0;he<3;he++){let ge=j[he*4+G]*J.min[he],ve=j[he*4+G]*J.max[he];Q+=ge<ve?ge:ve,ue+=ge>ve?ge:ve}Q<v[G]&&(v[G]=Q),ue>y[G]&&(y[G]=ue)}};if(P.instanceMatrices&&P.instanceMatrices.length>=16){let j=P.instanceMatrices.length>>4,G=X();for(let Q=0;Q<j;Q++){let ue=P.instanceMatrices.subarray(Q*16,Q*16+16);ee(G,f,ue),C(G)}}else C(f)}let z=Ce(n,s,l,S.attributes.POSITION,0,3,U);Ce(n,s,l,S.attributes.NORMAL,1,3,U),Ce(n,s,l,S.attributes.TEXCOORD_0,2,2,U,ft(s,S));let D=0,se=5123,H=null;if(S.indices!==void 0){let C=s.accessors[S.indices],G=(s.bufferViews[C.bufferView].byteOffset||0)+(C.byteOffset||0);if(D=Number(C.count??0),!Number.isFinite(D)||D<0||T+D>e.maxIndices)throw new Error(`SecurityError: GLB scene exceeds host index limit (${e.maxIndices}).`);T+=D,se=C.componentType===5125?5125||5125:5123||5123;let Q=n.createBuffer();U.push(Q),n.bindBuffer(34963,Q),C.componentType===5125?(H=new Uint32Array(l,G,C.count),n.bufferData(34963,H,35044)):C.componentType===5121?(H=Uint16Array.from(new Uint8Array(l,G,C.count)),n.bufferData(34963,H,35044)):(H=G%2===0?new Uint16Array(l,G,C.count):new Uint16Array(l.slice(G,G+C.count*2)),n.bufferData(34963,H,35044))}else D=J.count;let ie={};for(let C of Y)if(C.onBuildPrimitiveVAO){let j=C.onBuildPrimitiveVAO(n,k,S,s,l);j&&(ie[C.name]=j)}n.bindVertexArray(null);let re=s.materials&&S.material!==void 0?s.materials[S.material]:null,{program:oe,uniforms:le}=$e(n,S,re),I=Ze(re,b),W=!!(re?.extensions?.KHR_materials_transmission||ie.materials?.isTransmissive),ne=S.extensions?.KHR_materials_variants?.mappings,ae=Array.isArray(ne)?ne.filter(C=>C&&typeof C.material=="number"&&Array.isArray(C.variants)).map(C=>({material:C.material|0,variants:C.variants.map(j=>Number(j)|0)})):void 0;P.primitives.push({vao:k,instanced:Z,indexCount:D,indexType:se,...I,positions:z,indices:H,buffers:U,materialIndex:S.material,defaultMaterialIndex:S.material,variantMappings:ae,primitiveDef:S,programCache:new Map([[S.material??-1,{program:oe,uniforms:le}]]),pluginData:ie,customProgram:oe,customUniforms:le,isTransmissive:W})}a.push(P)}isFinite(v[0])||(v=[-1,-1,-1]),isFinite(y[0])||(y=[1,1,1]);let M=[(v[0]+y[0])/2,(v[1]+y[1])/2,(v[2]+y[2])/2],p=y[0]-v[0],R=y[1]-v[1],_=y[2]-v[2],L=Math.max(Math.hypot(p,R,_)/2,.5),O=[v[0],v[1],v[2]],V=[y[0],y[1],y[2]],F=t.animations;if(!F){for(let h of Y)if(h.onParseGLB?.(t),t.animations){F=t.animations;break}}return F||(F=[]),{meshes:a,bounds:{center:M,radius:L,min:O,max:V},lights:g,animations:F,worldMatrices:d,gpuTextures:b,availableVariants:c}}function fe(n){let t=n.customTarget||n.bounds.center,e=n.currDistance*Math.cos(n.currPhi);return[t[0]+e*Math.sin(n.currTheta),t[1]+n.currDistance*Math.sin(n.currPhi),t[2]+e*Math.cos(n.currTheta)]}var te=class{constructor(t,e,r){this.supportsInstanceOffsets=!0;this.meshes=[];this.backdropMeshes=[];this.bounds={center:[0,0,0],radius:1,min:[-1,-1,-1],max:[1,1,1]};this.lights=[];this.modelRootMatrix=X();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=X();this.viewMatrix=X();this.activeViewMatrix=null;this.modelMatrix=X();this.mvpMatrix=X();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:X(),rawValueToMeters:.001,format:0};this.container=t;let i,s;if(e&&typeof e.getContext=="function"?(i=e,s=r):(s=e,i=s?.canvas),!i){let a=t.querySelector("canvas");a||(a=document.createElement("canvas"),a.style.width="100%",a.style.height="100%",a.style.display="block",a.style.touchAction="none",t.prepend(a)),i=a}this.canvas=i,this.opts=s||{},this.opts.clearColor&&(this.clearColor=this.opts.clearColor);let o=typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches;this.opts.autoRotate!==void 0?this.autoRotate=this.opts.autoRotate&&!o:o&&(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=Le(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=de(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 l=i.getContext("webgl2",{antialias:!0,alpha:!0,xrCompatible:!0});if(!l)throw new Error("WebGL2 not supported");this.gl=l,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(t,e){ut(t,e)}static getDecoder(t){return me(t)}setupContextLossHandling(){let t=this.canvas;typeof t?.addEventListener=="function"&&(this.boundContextLost=e=>{e.preventDefault?.(),this.contextLost=!0,this.stop()},this.boundContextRestored=()=>this.restoreContext(),t.addEventListener("webglcontextlost",this.boundContextLost),t.addEventListener("webglcontextrestored",this.boundContextRestored))}initGlState(){let t=this.gl,e=Ye();this.renderProg=ye(t,je,e.fs),this.pickProg=ye(t,ht,mt),this.uRender=De(t,this.renderProg,e.uniforms),this.uPick=De(t,this.pickProg,["uMVP","uColorId"]),this.setupPickingFbo()}restoreContext(){let t=this.gl;this.contextLost=!1,this.initGlState();for(let e of Y)e.onContextRestored?.(t,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 t=this.gl;if(typeof t.createFramebuffer!="function")return;this.pickFbo=t.createFramebuffer(),this.pickTexture=t.createTexture(),this.pickDepth=t.createRenderbuffer();let e=Math.max(1,this.canvas.width),r=Math.max(1,this.canvas.height);this.pickFboWidth=e,this.pickFboHeight=r,t.bindTexture(3553,this.pickTexture),t.texImage2D(3553,0,6408,e,r,0,6408,5121,null),t.texParameteri(3553,10241,9728),t.texParameteri(3553,10240,9728),t.bindRenderbuffer(36161,this.pickDepth),t.renderbufferStorage(36161,33189,e,r),t.bindFramebuffer(36160,this.pickFbo),t.framebufferTexture2D(36160,36064,3553,this.pickTexture,0),t.framebufferRenderbuffer(36160,36096,36161,this.pickDepth),t.bindFramebuffer(36160,null)}resizePickingFbo(t,e){if(!this.pickFbo)return;let r=this.gl,i=Math.max(1,t),s=Math.max(1,e);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(t,e){this.lastGlbData=t,this.lastLimits=e;let{meshes:r,bounds:i,lights:s,animations:o,worldMatrices:l,gpuTextures:a,availableVariants:c}=He(this.gl,t,e,()=>this.render());if(this.disposeMeshGpuResources(),this.meshes=r,this.bounds=i,this.turntableRotation=0,this.updateTurntableMatrix(),this.lights=s,this.animations=o||[],this.worldMatrices=l||[],this.gpuTextures=a||[],this.availableVariants=c||[],this.gltf=t.gltf,this.activeVariantName&&!this.applyVariantMaterial(this.activeVariantName)&&(this.activeVariantName=null),this.initialNodeTransforms=[],Array.isArray(t.gltf?.nodes))for(let m of t.gltf.nodes)this.initialNodeTransforms.push({t:m.translation?[m.translation[0],m.translation[1],m.translation[2]]:[0,0,0],r:m.rotation?[m.rotation[0],m.rotation[1],m.rotation[2],m.rotation[3]]:[0,0,0,1],s:m.scale?[m.scale[0],m.scale[1],m.scale[2]]:[1,1,1]});this.autoplay&&this.animations.length>0&&this.playAnimation(this.animationName||void 0);for(let m of Y)m.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=t.exposure??t.gltf?.extras?.exposure??t.gltf?.asset?.extras?.exposure;u!==void 0&&(this.exposure=Le(u));let d=t.environmentIntensity??t.gltf?.extras?.environmentIntensity??t.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(t){this.loadGLBData(ze(t))}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(t){this.loadGLBData(pe(t))}setBackdropGLB(t,e){if(this.disposeMeshListGpuResources(this.backdropMeshes),this.backdropMeshes=[],!t){this.update(0),this.render();return}let r=pe(t),{meshes:i}=He(this.gl,r,Ke,()=>this.render());if(e)for(let s of i)s.transform[12]+=e[0],s.transform[13]+=e[1],s.transform[14]+=e[2],ce(s.normalMatrix,s.transform);this.backdropMeshes=i,this.update(0),this.render()}setClearColor(t,e,r,i=1){this.clearColor=[t,e,r,i]}updateMeshTransforms(t){for(let e=0;e<this.meshes.length;e++){let r=this.meshes[e],i;t instanceof Map?i=t.get(r.name)??t.get(e):Array.isArray(t)?i=t[e]:t&&typeof t=="object"&&(Object.prototype.hasOwnProperty.call(t,r.name)?i=t[r.name]:Object.prototype.hasOwnProperty.call(t,e)&&(i=t[e])),i&&i.length===16&&(r.transform.set(i),ce(r.normalMatrix,r.transform))}}bindLights(t=this.uRender){let e=this.gl,r=[.28,.28,.28],i=[],s=[],o=[],l=[];for(let a of this.lights){let c=a.color||[1,1,1],u=a.intensity!==void 0?a.intensity:1;if(a.type==="ambient")r=[c[0]*u,c[1]*u,c[2]*u];else if(a.type==="directional"&&i.length<6){let d=a.direction||[.5,1,.8];i.push(d[0],d[1],d[2]),s.push(c[0]*u,c[1]*u,c[2]*u)}else if(a.type==="point"&&o.length<6){let d=a.position||[0,0,0];o.push(d[0],d[1],d[2]),l.push(c[0]*u,c[1]*u,c[2]*u)}}i.length===0&&(i.push(.5,1,.8),s.push(1,1,1)),e.uniform3fv(t.uAmbientColor,r),e.uniform1i(t.uNumDirLights,i.length/3),i.length>0&&(e.uniform3fv(t.uDirLightDir,i),e.uniform3fv(t.uDirLightColor,s)),e.uniform1i(t.uNumPointLights,o.length/3),o.length>0&&(e.uniform3fv(t.uPointLightPos,o),e.uniform3fv(t.uPointLightColor,l)),e.uniform1f(t.uEnvIntensity,this.envIntensity)}setExposure(t){this.exposure=Le(t)}getExposure(){return this.exposure}setShadow(t,e){this.shadowIntensity=Math.max(0,Math.min(1,Number(t)||0)),e!==void 0&&(this.shadowSoftness=Math.max(0,Math.min(1,Number(e)||0)))}getShadowIntensity(){return this.shadowIntensity}getShadowSoftness(){return this.shadowSoftness}setToneMapping(t){this.toneMapping=de(t)}getToneMapping(){return this.toneMapping}async setEnvironmentImage(t){for(let e of Y)if(e.setEnvironmentImage){await e.setEnvironmentImage(this,t);return}}async setSkyboxImage(t){for(let e of Y)if(e.setSkyboxImage){await e.setSkyboxImage(this,t);return}}setInteractive(t){this.interactive=t}isInteractive(){return this.interactive}getCameraOrbit(){let t=this.currTheta,e=this.currPhi,r=this.currDistance;return{theta:t,phi:e,radius:r,toString(){return`${t.toFixed(4)}rad ${e.toFixed(4)}rad ${r.toFixed(4)}m`}}}getCameraTarget(){let t=this.customTarget||this.bounds.center;return{x:t[0],y:t[1],z:t[2],toString(){return`${t[0].toFixed(4)}m ${t[1].toFixed(4)}m ${t[2].toFixed(4)}m`}}}jumpCameraToGoal(){this.currTheta=this.targetTheta,this.currPhi=this.targetPhi,this.currDistance=this.targetDistance,this.update(0),this.render()}getModelMaterials(){let t=this.gltf?.materials?.length?this.gltf.materials:[{name:"DefaultMaterial",pbrMetallicRoughness:{}}];return t.map((e,r)=>{let i=this.meshes.flatMap(u=>u.primitives.filter(d=>d.materialIndex===r||t.length===1&&d.materialIndex===void 0)),s=i[0],o=s?[...s.baseColor]:e.pbrMetallicRoughness?.baseColorFactor||[.8,.8,.8,1],l=s?s.metallic:e.pbrMetallicRoughness?.metallicFactor??.1,a=s?s.roughness:e.pbrMetallicRoughness?.roughnessFactor??.5,c={baseColorFactor:o,metallicFactor:l,roughnessFactor:a,setBaseColorFactor:u=>{let d=[u[0],u[1],u[2],u[3]??1];c.baseColorFactor=d,e.pbrMetallicRoughness&&(e.pbrMetallicRoughness.baseColorFactor=d);for(let m of i)m.baseColor=d;this.render()},setMetallicFactor:u=>{c.metallicFactor=u,e.pbrMetallicRoughness&&(e.pbrMetallicRoughness.metallicFactor=u);for(let d of i)d.metallic=u;this.render()},setRoughnessFactor:u=>{c.roughnessFactor=u,e.pbrMetallicRoughness&&(e.pbrMetallicRoughness.roughnessFactor=u);for(let d of i)d.roughness=u;this.render()}};return{name:e.name||`Material_${r}`,pbrMetallicRoughness:c}})}playAnimation(t){if(this.animations.length!==0){if(t){let e=this.animations.find(r=>r.name===t);e&&(this.currentClip=e)}else this.currentClip||(this.currentClip=this.animations[0]);this.isPlayingAnimation=!0}}pauseAnimation(){this.isPlayingAnimation=!1}getAvailableAnimations(){return this.animations.map(t=>t.name)}getAvailableVariants(){return[...this.availableVariants]}getVariantName(){return this.activeVariantName}selectVariant(t){let e=this.applyVariantMaterial(t);return e&&this.gl&&this.render(),e}applyVariantMaterial(t){let e=t===null||t==="",r=-1;if(e)this.activeVariantName=null;else{if(r=this.availableVariants.indexOf(t),r<0)return!1;this.activeVariantName=t}let i=this.gltf?.materials;if(!Array.isArray(i))return e;for(let s of this.meshes)for(let o of s.primitives){let l=o.defaultMaterialIndex;if(!e&&Array.isArray(o.variantMappings)){for(let c of o.variantMappings)if(Array.isArray(c.variants)&&c.variants.includes(r)){l=c.material;break}}let a=l!==void 0?i[l]:void 0;o.materialIndex=a?l:void 0,Object.assign(o,Ze(a,this.gpuTextures)),this.applyPrimitiveProgram(o,o.materialIndex,a??null)}return!0}applyPrimitiveProgram(t,e,r){if(!this.gl||!t.primitiveDef)return;t.programCache??(t.programCache=new Map);let i=e??-1,s=t.programCache.get(i);s||(s=$e(this.gl,{...t.primitiveDef,material:e},r),t.programCache.set(i,s)),t.customProgram=s.program,t.customUniforms=s.uniforms,t.pluginData&&(t.pluginData.materials=t.isTransmissive?{isTransmissive:!0}:void 0)}setAutoplay(t){this.autoplay=t,t?this.playAnimation(this.animationName||void 0):this.pauseAnimation()}setAnimationName(t){this.animationName=t,(this.isPlayingAnimation||this.autoplay)&&this.playAnimation(t)}evaluateAnimation(t){for(let e of Y)if(e.evaluateAnimation){e.evaluateAnimation(this,t);return}}setTarget(t,e,r){this.customTarget=[t,e,r],this.gl&&(this.meshes.length>0||this.backdropMeshes.length>0)&&(this.update(0),this.render())}getTarget(){return this.customTarget?[...this.customTarget]:null}setFieldOfView(t){let e=Math.max(10,Math.min(90,t));this.fov=e*Math.PI/180}getFieldOfView(){return this.fov*180/Math.PI}setDistanceMode(t){if(this.distanceMode=t,!this.customDistance){let e=this.clampDistance(this.distanceMode==="absolute"?3:this.bounds.radius*2.5);this.initialDistance=e,this.targetDistance=e,this.currDistance=e,this.gl&&(this.meshes.length>0||this.backdropMeshes.length>0)&&(this.update(0),this.render())}}getDistanceMode(){return this.distanceMode}setOrbitLimits(t){t.minTheta!==void 0&&(this.minTheta=t.minTheta*Math.PI/180),t.maxTheta!==void 0&&(this.maxTheta=t.maxTheta*Math.PI/180),t.minPhi!==void 0&&(this.minPhi=Math.max(-Math.PI*.48,t.minPhi*Math.PI/180)),t.maxPhi!==void 0&&(this.maxPhi=Math.min(Math.PI*.48,t.maxPhi*Math.PI/180)),t.minDistance!==void 0&&(this.minDistanceLimit=t.minDistance),t.maxDistance!==void 0&&(this.maxDistanceLimit=t.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(t){return Math.max(this.minTheta,Math.min(this.maxTheta,t))}clampPhi(t){return Math.max(this.minPhi,Math.min(this.maxPhi,t))}clampDistance(t){let e=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(e,Math.min(r,t))}setCamera(t,e,r,i){t!==void 0&&(this.targetTheta=this.clampTheta(t*Math.PI/180)),e!==void 0&&(this.targetPhi=this.clampPhi(e*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(t,e,r,i){if(t!==void 0&&(this.initialTheta=this.clampTheta(t*Math.PI/180),this.targetTheta=this.initialTheta,this.currTheta=this.initialTheta),e!==void 0&&(this.initialPhi=this.clampPhi(e*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(t,e){let r=X();ee(r,this.projMatrix,this.viewMatrix);let[i,s,o]=t,l=e?e[0]:0,a=e?e[1]:0,c=e?e[2]:0,u=this.modelRootMatrix;u&&(i=u[0]*t[0]+u[4]*t[1]+u[8]*t[2]+u[12],s=u[1]*t[0]+u[5]*t[1]+u[9]*t[2]+u[13],o=u[2]*t[0]+u[6]*t[1]+u[10]*t[2]+u[14],e&&(l=u[0]*e[0]+u[4]*e[1]+u[8]*e[2],a=u[1]*e[0]+u[5]*e[1]+u[9]*e[2],c=u[2]*e[0]+u[6]*e[1]+u[10]*e[2]));let d=r[0]*i+r[4]*s+r[8]*o+r[12],m=r[1]*i+r[5]*s+r[9]*o+r[13],x=r[2]*i+r[6]*s+r[10]*o+r[14],g=r[3]*i+r[7]*s+r[11]*o+r[15];if(g<=1e-4)return{x:0,y:0,z:1,visible:!1};let b=d/g,v=m/g,y=x/g,w=this.canvas.getBoundingClientRect(),T=w.width||this.canvas.clientWidth||this.canvas.width||300,M=w.height||this.canvas.clientHeight||this.canvas.height||150,p=(b*.5+.5)*T,R=(-v*.5+.5)*M,_=b>=-1.1&&b<=1.1&&v>=-1.1&&v<=1.1&&y>=-1&&y<=1;if(_&&e){let[L,O,V]=fe(this),F=[i-L,s-O,o-V];l*F[0]+a*F[1]+c*F[2]>.05&&(_=!1)}return{x:p,y:R,z:y,visible:_}}setSelectedMesh(t){this.selectedMeshName=t||""}getSelectedMesh(){return this.selectedMeshName}setupEvents(){let t=this.canvas;this.boundContextMenu=e=>{e.preventDefault()},t.addEventListener("contextmenu",this.boundContextMenu),this.boundPointerDown=e=>{this.interactive&&(this.isPointerDown=!0,this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now(),this.lastPointerX=e.clientX,this.lastPointerY=e.clientY,this.totalDragDist=0,this.activePointers.set(e.pointerId,{x:e.clientX,y:e.clientY}),this.isPanning=e.button===2||e.shiftKey||this.activePointers.size===2,t.setPointerCapture(e.pointerId))},t.addEventListener("pointerdown",this.boundPointerDown),this.boundPointerMove=e=>{if(!this.isPointerDown||!this.interactive)return;this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now();let r=this.activePointers.get(e.pointerId)||{x:this.lastPointerX,y:this.lastPointerY},i=e.clientX-r.x,s=e.clientY-r.y;if(this.activePointers.set(e.pointerId,{x:e.clientX,y:e.clientY}),this.lastPointerX=e.clientX,this.lastPointerY=e.clientY,this.totalDragDist+=Math.hypot(i,s),this.isPanning||e.button===2||e.shiftKey||this.activePointers.size===2){let o=[this.viewMatrix[0],this.viewMatrix[4],this.viewMatrix[8]],l=[this.viewMatrix[1],this.viewMatrix[5],this.viewMatrix[9]],a=this.customTarget?[...this.customTarget]:[...this.bounds.center],c=this.currDistance/Math.max(t.clientHeight||300,1)*1.5;a[0]+=(-i*o[0]+s*l[0])*c,a[1]+=(-i*o[1]+s*l[1])*c,a[2]+=(-i*o[2]+s*l[2])*c,this.customTarget=a}else this.targetTheta=this.clampTheta(this.targetTheta-i*.008),this.targetPhi=this.clampPhi(this.targetPhi+s*.008)},t.addEventListener("pointermove",this.boundPointerMove),this.boundPointerUp=e=>{this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now(),this.activePointers.delete(e.pointerId),this.activePointers.size===0?(this.isPointerDown=!1,this.isPanning=!1):this.activePointers.size===1&&(this.isPanning=!1);try{t.releasePointerCapture(e.pointerId)}catch{}if(this.totalDragDist<5&&e.button===0){let r=t.getBoundingClientRect(),i=Math.floor((e.clientX-r.left)*(t.width/Math.max(r.width,1))),s=Math.floor((e.clientY-r.top)*(t.height/Math.max(r.height,1)));this.performMeshPick(i,s,!0)}},t.addEventListener("pointerup",this.boundPointerUp),this.boundWheel=e=>{if(!this.interactive)return;e.preventDefault(),this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now();let r=Math.exp(e.deltaY*.001);this.targetDistance=this.clampDistance(this.targetDistance*r)},t.addEventListener("wheel",this.boundWheel,{passive:!1}),this.boundSetCamera=e=>{let r=e.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),t.tabIndex!==void 0&&t.tabIndex<0&&(t.tabIndex=0),t.getAttribute?.("role")||t.setAttribute?.("role","region"),t.getAttribute?.("aria-label")||t.setAttribute?.("aria-label","Interactive 3D model viewport"),this.boundKeyDown=e=>{if(!this.interactive)return;let r=typeof performance<"u"?performance.now():Date.now();switch(e.key){case"ArrowLeft":this.lastInteractionTime=r,this.targetTheta=this.clampTheta(this.targetTheta-.1),e.preventDefault();break;case"ArrowRight":this.lastInteractionTime=r,this.targetTheta=this.clampTheta(this.targetTheta+.1),e.preventDefault();break;case"ArrowUp":this.lastInteractionTime=r,this.targetPhi=this.clampPhi(this.targetPhi+.08),e.preventDefault();break;case"ArrowDown":this.lastInteractionTime=r,this.targetPhi=this.clampPhi(this.targetPhi-.08),e.preventDefault();break;case"+":case"=":{this.lastInteractionTime=r,this.targetDistance=this.clampDistance(this.targetDistance*.9),e.preventDefault();break}case"-":case"_":{this.lastInteractionTime=r,this.targetDistance=this.clampDistance(this.targetDistance*1.1),e.preventDefault();break}case"Home":this.lastInteractionTime=r,this.resetCamera(),e.preventDefault();break}},t.addEventListener("keydown",this.boundKeyDown)}teardownEvents(){let t=this.canvas;this.boundContextLost&&(t.removeEventListener("webglcontextlost",this.boundContextLost),this.boundContextLost=null),this.boundContextRestored&&(t.removeEventListener("webglcontextrestored",this.boundContextRestored),this.boundContextRestored=null),this.boundContextMenu&&(t.removeEventListener("contextmenu",this.boundContextMenu),this.boundContextMenu=null),this.boundPointerDown&&(t.removeEventListener("pointerdown",this.boundPointerDown),this.boundPointerDown=null),this.boundPointerMove&&(t.removeEventListener("pointermove",this.boundPointerMove),this.boundPointerMove=null),this.boundPointerUp&&(t.removeEventListener("pointerup",this.boundPointerUp),this.boundPointerUp=null),this.boundWheel&&(t.removeEventListener("wheel",this.boundWheel),this.boundWheel=null),this.boundKeyDown&&(t.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(t,e){let r=this.canvas,i=r.getBoundingClientRect(),s=r.width||300,o=r.height||300,l=i.width>0?Math.floor((t-i.left)*(s/i.width)):Math.floor(t),a=i.height>0?Math.floor((e-i.top)*(o/i.height)):Math.floor(e);return this.performMeshPick(l,a,!1)}performMeshPick(t,e,r=!0){if(this.meshes.length===0)return null;let i=this.gl,s=Math.max(1,this.canvas.width||300),o=Math.max(1,this.canvas.height||300);t=this.mapStereoPickX(t,s);let l=X();ee(l,this.projMatrix,this.viewMatrix);let a=[],c=Math.max(0,Math.min(s-1,t)),u=Math.max(0,Math.min(o-1,o-1-e));if(this.pickFbo&&i&&!this.xrSessionActive){(this.pickFboWidth!==s||this.pickFboHeight!==o)&&this.resizePickingFbo(s,o),i.bindFramebuffer(36160,this.pickFbo),i.viewport(0,0,s,o),i.enable(2929),i.clearColor(0,0,0,0),i.clear(16384|256),i.useProgram(this.pickProg);for(let _=0;_<this.meshes.length;_++){let L=this.meshes[_];if(L.visible===!1||L.isPluginMesh)continue;let O=_+1,V=(O&255)/255,F=(O>>8&255)/255,h=(O>>16&255)/255;i.uniform4f(this.uPick.uColorId,V,F,h,1),ee(this.modelMatrix,this.modelRootMatrix,L.transform);let E=L.instanceMatrices;if(E&&E.length>=16){let A=E.length>>4,f=X();for(let N of L.primitives){i.bindVertexArray(N.vao);for(let P=0;P<A;P++)ee(f,this.modelMatrix,E.subarray(P*16,P*16+16)),ee(this.mvpMatrix,l,f),i.uniformMatrix4fv(this.uPick.uMVP,!1,this.mvpMatrix),Re(i,N)}}else{ee(this.mvpMatrix,l,this.modelMatrix),i.uniformMatrix4fv(this.uPick.uMVP,!1,this.mvpMatrix);for(let A of L.primitives)i.bindVertexArray(A.vao),Re(i,A)}}let p=new Uint8Array(4);i.readPixels(c,u,1,1,6408,5121,p),i.bindFramebuffer(36160,null);let R=p[0]+(p[1]<<8)+(p[2]<<16);R>0&&R<=this.meshes.length&&(a=[this.meshes[R-1]])}a.length===0&&(a=this.meshes.filter(p=>p.visible!==!1));let d=null,m=1/0,x=[0,0,0],g=[0,1,0],[b,v,y]=fe(this),w=X();for(let p of a){ee(w,this.modelRootMatrix,p.transform);let R=p.instanceMatrices,_=R&&R.length>=16?R.length>>4:1;for(let L=0;L<_;L++){R&&R.length>=16?ee(this.modelMatrix,w,R.subarray(L*16,L*16+16)):this.modelMatrix.set(w),ee(this.mvpMatrix,l,this.modelMatrix);let O=X();if(!Ge(O,this.mvpMatrix))continue;let V=(c+.5)/s*2-1,F=(u+.5)/o*2-1,h=[0,0,0],E=[0,0,0];Pe(h,V,F,-1,O),Pe(E,V,F,1,O);let A=E[0]-h[0],f=E[1]-h[1],N=E[2]-h[2],P=Math.hypot(A,f,N)||1,K=A/P,S=f/P,U=N/P,k={distance:1/0,point:[0,0,0],normal:[0,1,0]};if((J=>{for(let B of p.primitives){if(!B.positions)continue;let z=B.positions,D=B.indices,se=Math.floor(D?D.length/3:z.length/9);for(let H=0;H<se;H++){let ie=D?D[H*3]:H*3,re=D?D[H*3+1]:H*3+1,oe=D?D[H*3+2]:H*3+2;Oe(h[0],h[1],h[2],K,S,U,z[ie*3],z[ie*3+1],z[ie*3+2],z[re*3],z[re*3+1],z[re*3+2],z[oe*3],z[oe*3+1],z[oe*3+2],k,J)}}})(1e-4),isFinite(k.distance)){let J=k.point[0],B=k.point[1],z=k.point[2],D=this.modelMatrix,se=D[0]*J+D[4]*B+D[8]*z+D[12],H=D[1]*J+D[5]*B+D[9]*z+D[13],ie=D[2]*J+D[6]*B+D[10]*z+D[14],re=se-b,oe=H-v,le=ie-y,I=Math.hypot(re,oe,le);if(I<m){ce(this.normalMatrix,this.modelMatrix);let W=this.normalMatrix,ne=k.normal[0],ae=k.normal[1],C=k.normal[2],j=W[0]*ne+W[3]*ae+W[6]*C,G=W[1]*ne+W[4]*ae+W[7]*C,Q=W[2]*ne+W[5]*ae+W[8]*C,ue=Math.hypot(j,G,Q)||1;j/=ue,G/=ue,Q/=ue,j*re+G*oe+Q*le>0&&(j=-j,G=-G,Q=-Q),d=p,m=Math.round(I*1e3)/1e3,x=[Math.round(se*1e3)/1e3,Math.round(H*1e3)/1e3,Math.round(ie*1e3)/1e3],g=[Math.round(j*1e3)/1e3,Math.round(G*1e3)/1e3,Math.round(Q*1e3)/1e3]}}}}if(!d)return null;let M={meshIndex:this.meshes.indexOf(d),meshName:d.name,nodeIndex:d.nodeIndex,distance:m,hitPoint:x,normal:g,screenX:t,screenY:e};if(r){for(let p of Y)p.onMeshSelect?.(this,M);this.opts.onMeshClick&&this.opts.onMeshClick(M),typeof CustomEvent<"u"&&typeof this.container.dispatchEvent=="function"&&this.container.dispatchEvent(new CustomEvent("meshClick",{bubbles:!0,detail:M}))}return M}mapStereoPickX(t,e){if(!this.stereoSBS||this.xrSessionActive||e<2)return t;let r=Math.max(1,Math.floor(e*.5)),i=t>=r,s=i?t-r:t,o=i?Math.max(1,e-r):r,l=(s+.5)/o*2-1;return Math.floor((l*.5+1)*.5*e)}setStereoSBS(t){this.stereoSBS=!!t,this.xrSessionActive||(this.syncCameraMatrices(),this.render())}syncCameraMatrices(){let t=Math.max(1,this.canvas.width||1)/Math.max(1,this.canvas.height||1),e=this.backdropMeshes.length>0?Math.max(this.bounds.radius*20,120):Math.max(this.bounds.radius*20,10);Te(this.projMatrix,this.fov,t,.1,e);let r=this.customTarget||this.bounds.center;Me(this.viewMatrix,fe(this),r,[0,1,0]),ee(this.mvpMatrix,this.projMatrix,this.viewMatrix),ce(this.normalMatrix,this.modelMatrix)}resize(){let t=Math.min((typeof window<"u"?window.devicePixelRatio:1)||1,2),e=this.canvas.getBoundingClientRect(),r=Math.max(1,Math.floor(e.width*t)),i=Math.max(1,Math.floor(e.height*t));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(t){let e=this.xrSessionActive;if(this.xrSessionActive=t,e&&!t){this.xrDepthState.enabled=!1;for(let r of Y)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(t){this.renderErrorReported||(this.renderErrorReported=!0,typeof console<"u"&&console.warn("[three-live] render frame failed:",t))}stepXRUpdate(t){for(let e of Y)e.onUpdate?.(this,t)}start(){if(this.animFrameId!==null)return;this.lastTime=typeof performance<"u"?performance.now():Date.now();let t=e=>{if(this.animFrameId===null)return;let r=Math.min(Math.max((e-this.lastTime)/1e3,0),.1);if(this.lastTime=e,this.isVisible&&!this.xrSessionActive)try{this.resize(),this.update(r),this.render()}catch(i){this.reportRenderError(i)}this.animFrameId!==null&&(this.animFrameId=requestAnimationFrame(t))};this.animFrameId=requestAnimationFrame(t)}stop(){this.animFrameId!==null&&(cancelAnimationFrame(this.animFrameId),this.animFrameId=null)}setAutoRotate(t){this.autoRotate=t}getAutoRotate(){return this.autoRotate}setAutoRotateSpeed(t){this.autoRotateSpeed=t}getAutoRotateSpeed(){return this.autoRotateSpeed}setAutoRotateDelay(t){this.autoRotateDelay=Math.max(0,Number(t)||0)}getAutoRotateDelay(){return this.autoRotateDelay}resetTurntableRotation(t=0){this.turntableRotation=Number(t)||0,this.updateTurntableMatrix(),this.render()}updateTurntableMatrix(){let t=Math.cos(this.turntableRotation),e=Math.sin(this.turntableRotation),r=this.bounds.center[0],i=this.bounds.center[2],s=this.modelRootMatrix;s[0]=t,s[1]=0,s[2]=-e,s[3]=0,s[4]=0,s[5]=1,s[6]=0,s[7]=0,s[8]=e,s[9]=0,s[10]=t,s[11]=0,s[12]=r-(t*r+e*i),s[13]=0,s[14]=i-(-e*r+t*i),s[15]=1}setVisible(t){this.isVisible=t}update(t){for(let o of Y)o.onUpdate?.(this,t);let e=typeof performance<"u"?performance.now():Date.now();if(!this.isPointerDown&&this.autoRotate&&e-this.lastInteractionTime>=this.autoRotateDelay){this.turntableRotation+=this.autoRotateSpeed*t,this.updateTurntableMatrix();for(let o of Y)o.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 o={theta:r,phi:i,zoom:s,distance:Math.round(this.currDistance*100)/100};this.opts.onCameraChange&&this.opts.onCameraChange(o),typeof CustomEvent<"u"&&typeof this.container.dispatchEvent=="function"&&this.container.dispatchEvent(new CustomEvent("cameraChange",{bubbles:!0,detail:o}))}}renderXRView(t,e,r,i,s=!0,o=0){this.onBeforeRenderXRView&&this.onBeforeRenderXRView(t);let l=t?.transform?.inverse?.matrix||this.viewMatrix,a=t?.projectionMatrix||this.projMatrix,c=t?.transform?.position,u=c?[c.x,c.y,c.z]:[0,1.6,0];e?this.modelRootMatrix.set(e):r&&e&&this.modelRootMatrix.set(e),this.render({viewMatrix:l,projMatrix:a,eyePos:u,viewport:i,eye:t?.eye||"none",clear:o>0?!1:t?.eye!=="right",isAR:s})}render(t){if(this.contextLost)return;if(!t&&this.stereoSBS){let T=Math.max(2,this.canvas.width||2),M=Math.max(1,this.canvas.height||1),p=Math.max(1,Math.floor(T*.5)),R=Math.max(1,T-p),_=this.backdropMeshes.length>0?Math.max(this.bounds.radius*20,120):Math.max(this.bounds.radius*20,10),L=this.customTarget||this.bounds.center,[O,V,F]=fe(this),h=Math.cos(this.currTheta),E=-Math.sin(this.currTheta),A=.032,f=X(),N=X(),P=[O-h*A,V,F-E*A],K=[L[0]-h*A*.25,L[1],L[2]-E*A*.25];Te(f,this.fov,p/M,.1,_),Me(N,P,K,[0,1,0]);let S=X(),U=X(),k=[O+h*A,V,F+E*A],Z=[L[0]+h*A*.25,L[1],L[2]+E*A*.25];Te(S,this.fov,R/M,.1,_),Me(U,k,Z,[0,1,0]),this.render({viewMatrix:N,projMatrix:f,eyePos:P,viewport:[0,0,p,M],eye:"left",clear:!0,isAR:!1}),this.render({viewMatrix:U,projMatrix:S,eyePos:k,viewport:[p,0,R,M],eye:"right",clear:!1,isAR:!1}),this.gl.viewport(0,0,T,M);return}let e=this.gl,r=0,i=0,s=this.canvas.width,o=this.canvas.height;t?.viewport?(r=t.viewport[0],i=t.viewport[1],s=t.viewport[2],o=t.viewport[3],e.viewport(r,i,s,o)):e.viewport(0,0,this.canvas.width,this.canvas.height),e.enable(2929),(!t||t.clear!==!1)&&(t?.isAR?e.clearColor(0,0,0,0):e.clearColor(this.clearColor[0],this.clearColor[1],this.clearColor[2],this.clearColor[3]),e.clear(16384|256));let l=X(),a=t?.viewMatrix??this.viewMatrix;this.activeViewMatrix=a,ee(l,t?.projMatrix??this.projMatrix,a);let c=$().xrDepthShader,u=ot(this.toneMapping),[d,m,x]=t?t.eyePos:fe(this);for(let T of Y)T.onBeforeDrawScene?.(this,e,l,[d,m,x],u);let g=t?.isAR?0:this.backdropMeshes.length;if(this.meshes.length===0&&g===0)return;let b=t?.eye||"none",v=!1,y=g>0?[...this.backdropMeshes,...this.meshes]:this.meshes,w=T=>{for(let M=0;M<y.length;M++){let p=y[M];if(p.visible===!1)continue;let R=this.selectedMeshName!==""&&p.name===this.selectedMeshName;M<g||p.worldSpace===!0||p.name==="__xr_reticle__"?this.modelMatrix.set(p.transform):ee(this.modelMatrix,this.modelRootMatrix,p.transform),ee(this.mvpMatrix,l,this.modelMatrix),ce(p.normalMatrix,this.modelMatrix);let _=p.extras?.xr?.stereo||p.userData?.xr?.stereo,L=0,O=0,V=1,F=1;_==="sbs"?(V=.5,L=b==="right"?.5:0):_==="ou"&&(F=.5,O=b==="right"?.5:0);for(let h of p.primitives){let E=!!h.isTransmissive;if(!T&&E){v=!0;continue}if(T&&!E)continue;let A=h.customProgram||this.renderProg,f=h.customUniforms||this.uRender;e.useProgram(A),e.vertexAttrib3f(3,0,0,0),f.uInstanced&&e.uniform1i(f.uInstanced,0),e.uniform1i(f.uToneMapping,u),e.uniform1f(f.uEnvIntensity,this.envIntensity),f.uExposure&&e.uniform1f(f.uExposure,this.exposure),e.uniform3f(f.uCameraPos,d,m,x),e.uniform1f(f.uEmissive,R?1:0),e.uniformMatrix4fv(f.uMVP,!1,this.mvpMatrix),e.uniformMatrix4fv(f.uModel,!1,this.modelMatrix),e.uniformMatrix3fv(f.uNormalMatrix,!1,p.normalMatrix),f.uUvTransform&&e.uniform4f(f.uUvTransform,L,O,V,F),f.uViewportSize&&e.uniform2f(f.uViewportSize,Math.max(1,s),Math.max(1,o)),c?.bind(e,f,this.xrDepthState,a,[r,i,Math.max(1,s),Math.max(1,o)]),this.environmentTexture?(e.activeTexture(33988),e.bindTexture(3553,this.environmentTexture),e.uniform1i(f.uEnvironmentMap,4),e.uniform1i(f.uHasEnvironmentMap,1)):e.uniform1i(f.uHasEnvironmentMap,0),this.bindLights(f),f.uSectionEnabled&&e.uniform1i(f.uSectionEnabled,0);for(let P of Y)P.onBeforeDrawPrimitive?.(e,A,h,p,this.worldMatrices||[],this.gltf);e.uniform4fv(f.uBaseColor,h.baseColor),e.uniform1f(f.uMetallic,h.metallic),e.uniform1f(f.uRoughness,h.roughness),f.uClearcoat&&e.uniform2f(f.uClearcoat,h.clearcoat??0,h.clearcoatRoughness??.04),h.texture?(e.activeTexture(33984),e.bindTexture(3553,h.texture),e.uniform1i(f.uBaseColorTexture,0),e.uniform1i(f.uHasTexture,1)):e.uniform1i(f.uHasTexture,0),h.metallicRoughnessTexture?(e.activeTexture(33985),e.bindTexture(3553,h.metallicRoughnessTexture),e.uniform1i(f.uMetallicRoughnessTexture,1),e.uniform1i(f.uHasMetallicRoughnessTexture,1)):e.uniform1i(f.uHasMetallicRoughnessTexture,0),h.normalTexture?(e.activeTexture(33986),e.bindTexture(3553,h.normalTexture),e.uniform1i(f.uNormalTexture,2),e.uniform1i(f.uHasNormalTexture,1),e.uniform1f(f.uNormalScale,h.normalScale)):e.uniform1i(f.uHasNormalTexture,0),h.occlusionTexture?(e.activeTexture(33987),e.bindTexture(3553,h.occlusionTexture),e.uniform1i(f.uOcclusionTexture,3),e.uniform1i(f.uHasOcclusionTexture,1),e.uniform1f(f.uOcclusionStrength,h.occlusionStrength)):e.uniform1i(f.uHasOcclusionTexture,0),e.bindVertexArray(h.vao);let N=p.instanceMatrices;if(h.instanceCount!==void 0)e.drawElementsInstanced(4,h.indexCount,h.indexType,0,h.instanceCount);else if(N&&N.length>=16&&h.instanced&&f.uInstanced&&f.uViewProj){let P=N.length>>4;e.uniform1i(f.uInstanced,1),e.uniformMatrix4fv(f.uViewProj,!1,l),h.indices?e.drawElementsInstanced(4,h.indexCount,h.indexType,0,P):e.drawArraysInstanced(4,0,h.indexCount,P),e.uniform1i(f.uInstanced,0)}else if(N&&N.length>=16){let P=N.length>>4,K=p.instanceColors,S=X(),U=new Float32Array(9),k=[h.baseColor[0],h.baseColor[1],h.baseColor[2],h.baseColor[3]];for(let Z=0;Z<P;Z++)ee(S,this.modelMatrix,N.subarray(Z*16,Z*16+16)),ee(this.mvpMatrix,l,S),ce(U,S),e.uniformMatrix4fv(f.uMVP,!1,this.mvpMatrix),e.uniformMatrix4fv(f.uModel,!1,S),e.uniformMatrix3fv(f.uNormalMatrix,!1,U),K&&(k[0]=h.baseColor[0]*K[Z*3],k[1]=h.baseColor[1]*K[Z*3+1],k[2]=h.baseColor[2]*K[Z*3+2],k[3]=h.baseColor[3],e.uniform4fv(f.uBaseColor,k)),Re(e,h)}else Re(e,h)}}};if(w(!1),v){for(let T of Y)T.onBeforeTransmissivePass?.(e,this);w(!0)}for(let T of Y)T.onAfterRender?.(e,this,l,t?.eye??"none",[r,i,s,o],t?.projMatrix??this.projMatrix)}disposeMeshListGpuResources(t,e){Je(this.gl,t,e)}disposeMeshGpuResources(){this.disposeMeshListGpuResources(this.meshes,this.gpuTextures),this.meshes=[],this.gpuTextures=[],this.availableVariants=[]}disposeGpuResources(){let t=this.gl;this.disposeMeshGpuResources(),this.disposeMeshListGpuResources(this.backdropMeshes),this.backdropMeshes=[];for(let e of Y)e.onDestroy?.(t,this);this.environmentTexture&&(t.deleteTexture(this.environmentTexture),this.environmentTexture=null),this.renderProg&&t.deleteProgram(this.renderProg),this.pickProg&&t.deleteProgram(this.pickProg),this.pickFbo&&t.deleteFramebuffer(this.pickFbo),this.pickTexture&&t.deleteTexture(this.pickTexture),this.pickDepth&&t.deleteRenderbuffer(this.pickDepth),this.pickFbo=null,this.pickTexture=null,this.pickDepth=null}dispose(){this.stop(),this.teardownEvents(),this.disposeGpuResources()}destroy(){this.dispose()}};te.registerPlugin=Be,te.getRegisteredPlugins=ke;var Ie=(n,t,e)=>({x:n,y:t,z:e,toString:()=>`${n}m ${t}m ${e}m`}),xt=typeof HTMLElement<"u"?HTMLElement:class{};typeof CustomEvent>"u"&&typeof Event<"u"&&(globalThis.CustomEvent=class extends Event{constructor(n,t){super(n,t),this.detail=t?.detail??null}});var q=class q extends xt{constructor(){super(...arguments);this.viewer=null;this.canvas=null;this.posterEl=null;this.arButton=null;this.currentModel=null;this.activeXRSession=null;this.toastTimer=null;this.currentModelLimits=void 0;this.isModelLoaded=!1;this.scriptHandle=null;this.resizeObserver=null;this.mutationObserver=null}static get arProvider(){return $().arProvider}static set arProvider(e){$().arProvider=e}static get scriptRunner(){return $().scriptRunner}static set scriptRunner(e){$().scriptRunner=e}static get sandboxEngineSrc(){return $().sandboxEngineSrc??null}static set sandboxEngineSrc(e){$().sandboxEngineSrc=e}static get sandboxIframeSrc(){return $().sandboxIframeSrc??null}static set sandboxIframeSrc(e){$().sandboxIframeSrc=e}static get allowClientScripts(){return!!$().allowClientScripts}static set allowClientScripts(e){$().allowClientScripts=e}static registerScriptRunner(e){q.scriptRunner=e}static registerDecoder(e,r){te.registerDecoder(e,r)}static getDecoder(e){return te.getDecoder(e)}static registerAR(e){typeof e=="function"?q.arProvider={activateAR:e}:q.arProvider=e,typeof document<"u"&&document.querySelectorAll("three-live").forEach(i=>{i instanceof q&&i.updateARButtonVisibility()})}static isARSupported(){return!!q.arProvider}getLoadedModel(){return this.currentModel}connectedCallback(){if(typeof document>"u")return;(!this.style.display||this.style.display==="inline")&&(this.style.display="block"),getComputedStyle(this).position==="static"&&(this.style.position="relative"),this.style.overflow="hidden",this.setupDOM(),this.initViewer(),this.setupResizeObserver();let e=this.getAttribute("src"),r=this.getAttribute("script-src");if(e)this.loadModel(e).catch(()=>{});else if(r)this.loadScriptFromSrc(r).catch(()=>{});else{let i=this.querySelector('script[type="text/three"], script[type="text/three-live"]');i&&i.textContent&&this.executeScript(i.textContent).catch(()=>{})}for(let i of te.getRegisteredPlugins())i.onElementConnected?.(this)}disconnectedCallback(){for(let e of te.getRegisteredPlugins())e.onElementDisconnected?.(this);this.scriptHandle?.terminate(),this.scriptHandle=null,this.mutationObserver?.disconnect(),this.mutationObserver=null,this.resizeObserver?.disconnect(),this.resizeObserver=null,this.activeXRSession?.stop?.().catch?.(()=>{}),this.activeXRSession=null,this.toastTimer&&clearTimeout(this.toastTimer),this.toastTimer=null,this.viewer?.destroy(),this.viewer=null,this.isModelLoaded=!1}attributeChangedCallback(e,r,i){if(r!==i){switch(e){case"src":i&&this.loadModel(i).catch(()=>{});break;case"camera-target":this.applyCameraTarget(i);break;case"min-camera-orbit":case"max-camera-orbit":this.applyOrbitLimits();break;case"field-of-view":this.applyFieldOfView(i);break;case"script-src":i&&this.loadScriptFromSrc(i).catch(()=>{});break;case"sandbox":case"allow-client-scripts":case"ios-src":break;case"poster":this.updatePoster(i);break;case"camera-orbit":this.applyCameraOrbit(i);break;case"selected-mesh":this.viewer&&i!==null&&this.viewer.setSelectedMesh(i);break;case"exposure":if(this.viewer&&i!==null){let s=parseFloat(i);isNaN(s)||this.viewer.setExposure(s)}break;case"shadow-intensity":case"shadow-softness":this.viewer&&this.viewer.setShadow(this.shadowIntensity,this.shadowSoftness);break;case"tone-mapping":this.viewer?.setToneMapping(de(i));break;case"environment-image":this.viewer&&this.viewer.setEnvironmentImage(i).catch(()=>{});break;case"skybox-image":this.viewer&&this.viewer.setSkyboxImage?.(i)?.catch?.(()=>{});break;case"camera-controls":{let s=this.cameraControls;this.viewer&&this.viewer.setInteractive?.(s),this.canvas&&(this.canvas.style.touchAction=s?"none":"auto");break}case"autoplay":this.viewer&&this.viewer.setAutoplay(i!==null&&i!=="false");break;case"animation-name":this.viewer&&i!==null&&this.viewer.setAnimationName(i);break;case"variant-name":this.viewer&&this.selectVariant(i);break;case"auto-rotate":this.viewer&&this.viewer.setAutoRotate(i!==null&&i!=="false");break;case"auto-rotate-delay":this.viewer&&this.viewer.setAutoRotateDelay(this.autoRotateDelay);break;case"rotation-per-second":this.viewer&&this.viewer.setAutoRotateSpeed(this.parseRotationPerSecond(i));break;case"ar":this.updateARButtonVisibility();break}for(let s of te.getRegisteredPlugins())s.onAttributeChanged?.(this,e,r,i)}}getAttr(e){return this.getAttribute(e)}setAttr(e,r){r!==null?this.setAttribute(e,r):this.removeAttribute(e)}getBoolAttr(e){return this.hasAttribute(e)&&this.getAttribute(e)!=="false"}setBoolAttr(e,r){r?this.setAttribute(e,""):this.removeAttribute(e)}getFloatAttr(e,r){let i=this.getAttribute(e);return i!==null?parseFloat(i):r}get src(){return this.getAttr("src")}set src(e){this.setAttr("src",e)}get cameraControls(){return this.getBoolAttr("camera-controls")}set cameraControls(e){this.setBoolAttr("camera-controls",e)}get cameraOrbit(){return this.getAttr("camera-orbit")}set cameraOrbit(e){this.setAttr("camera-orbit",e)}get cameraTarget(){return this.getAttr("camera-target")}set cameraTarget(e){this.setAttr("camera-target",e)}get minCameraOrbit(){return this.getAttr("min-camera-orbit")}set minCameraOrbit(e){this.setAttr("min-camera-orbit",e)}get maxCameraOrbit(){return this.getAttr("max-camera-orbit")}set maxCameraOrbit(e){this.setAttr("max-camera-orbit",e)}get fieldOfView(){return this.getAttr("field-of-view")}set fieldOfView(e){this.setAttr("field-of-view",e)}get iosSrc(){return this.getAttr("ios-src")}set iosSrc(e){this.setAttr("ios-src",e)}get scriptSrc(){return this.getAttr("script-src")}set scriptSrc(e){this.setAttr("script-src",e)}get sandbox(){return this.getAttribute("sandbox")||($().sandboxIframeSrc?"iframe":"worker")}set sandbox(e){this.setAttribute("sandbox",e)}get allowClientScripts(){return this.getBoolAttr("allow-client-scripts")||q.allowClientScripts}set allowClientScripts(e){this.setBoolAttr("allow-client-scripts",e)}get poster(){return this.getAttr("poster")}set poster(e){this.setAttr("poster",e)}get selectedMesh(){return this.getAttr("selected-mesh")}set selectedMesh(e){this.setAttr("selected-mesh",e)}get exposure(){return this.getFloatAttr("exposure",1)}set exposure(e){this.setAttribute("exposure",String(e))}get autoRotate(){return this.getBoolAttr("auto-rotate")}set autoRotate(e){this.setBoolAttr("auto-rotate",e)}get autoRotateDelay(){return this.getFloatAttr("auto-rotate-delay",3e3)}set autoRotateDelay(e){this.setAttribute("auto-rotate-delay",String(e))}get rotationPerSecond(){return this.getAttr("rotation-per-second")||"30deg"}set rotationPerSecond(e){this.setAttr("rotation-per-second",e)}get turntableRotation(){return this.viewer?this.viewer.turntableRotation:0}get ar(){return this.hasAttribute("ar")}set ar(e){this.setBoolAttr("ar",e)}get arScale(){return this.getAttribute("ar-scale")||"auto"}set arScale(e){this.setAttribute("ar-scale",e)}get arPlacement(){return this.getAttribute("ar-placement")||"floor"}set arPlacement(e){this.setAttribute("ar-placement",e)}get canActivateAR(){return q.isARSupported()}get shadowIntensity(){return this.getFloatAttr("shadow-intensity",0)}set shadowIntensity(e){this.setAttribute("shadow-intensity",String(e))}get shadowSoftness(){return this.getFloatAttr("shadow-softness",.5)}set shadowSoftness(e){this.setAttribute("shadow-softness",String(e))}get toneMapping(){return de(this.getAttribute("tone-mapping"))}set toneMapping(e){this.setAttribute("tone-mapping",e)}get bloom(){return this.getFloatAttr("bloom",0)}set bloom(e){this.setAttribute("bloom",String(e))}get bloomThreshold(){return Ae(this.getAttribute("bloom-threshold"),.62)}set bloomThreshold(e){this.setAttribute("bloom-threshold",String(e))}get bloomRadius(){return Ae(this.getAttribute("bloom-radius"),.75)}set bloomRadius(e){this.setAttribute("bloom-radius",String(e))}get outlineSelected(){return this.getBoolAttr("outline-selected")}set outlineSelected(e){this.setBoolAttr("outline-selected",e)}get outlineColor(){return this.getAttr("outline-color")||"#38bdf8"}set outlineColor(e){this.setAttr("outline-color",e)}get environmentImage(){return this.getAttr("environment-image")}set environmentImage(e){this.setAttr("environment-image",e)}get skyboxImage(){return this.getAttr("skybox-image")}set skyboxImage(e){this.setAttr("skybox-image",e)}get autoplay(){return this.getBoolAttr("autoplay")}set autoplay(e){this.setBoolAttr("autoplay",e)}get animationName(){return this.getAttr("animation-name")}set animationName(e){this.setAttr("animation-name",e)}get availableAnimations(){return this.viewer?this.viewer.getAvailableAnimations():[]}get variantName(){return this.viewer?this.viewer.getVariantName():this.getAttr("variant-name")}set variantName(e){this.setAttr("variant-name",e)}get availableVariants(){return this.viewer?this.viewer.getAvailableVariants():[]}fireEvent(e,r){this.dispatchEvent(new CustomEvent(e,{bubbles:!0,composed:!0,detail:r}))}setSlotVisible(e,r){let i=typeof this.querySelector=="function"?this.querySelector(`[slot="${e}"]`):null;i&&(i.hidden=!r,i.style&&(i.style.display=r?"":"none"))}emitError(e,r="script"){this.setSlotVisible("error",!0),this.fireEvent("error",{error:e}),this.fireEvent("three-error",{error:e,message:e?.message||String(e),stage:r})}selectVariant(e){if(!this.viewer)return!1;let r=this.viewer.selectVariant(e);return r&&this.fireEvent("variant-applied",{variantName:this.viewer.getVariantName()}),r}get model(){let e=this.viewer?this.viewer.getModelMaterials():[];return{materials:e,getMaterialByName(r){return e.find(i=>i.name===r)??null}}}play(){this.viewer&&this.viewer.playAnimation(this.animationName||void 0)}pause(){this.viewer&&this.viewer.pauseAnimation()}resetCamera(){this.viewer?.resetCamera()}resetTurntableRotation(e=0){this.viewer?.resetTurntableRotation(e)}setCamera(e,r,i,s){this.viewer&&this.viewer.setCamera(e,r,i,s)}getCameraOrbit(){return this.viewer?this.viewer.getCameraOrbit():{theta:0,phi:0,radius:3,toString(){return"0rad 0rad 3m"}}}getCameraTarget(){return this.viewer?this.viewer.getCameraTarget():Ie(0,0,0)}getFieldOfView(){return this.viewer?this.viewer.getFieldOfView():45}jumpCameraToGoal(){this.viewer?.jumpCameraToGoal()}toDataURL(e,r){return this.viewer?.render?.(),this.canvas?this.canvas.toDataURL(e,r):""}toBlob(e){return this.viewer?.render?.(),new Promise((r,i)=>{if(!this.canvas||typeof this.canvas.toBlob!="function"){i(new Error("Canvas toBlob is not supported in this environment."));return}this.canvas.toBlob(s=>{s?r(s):i(new Error("Failed to capture canvas blob."))},e?.mimeType,e?.qualityArgument)})}positionAndNormalFromPoint(e,r){let i=this.viewer?.raycastFromScreenPoint(e,r);if(!i)return null;let[s,o,l]=i.hitPoint||i.point,[a,c,u]=i.normal;return{position:Ie(s,o,l),normal:Ie(a,c,u)}}async loadModel(e){return this.loadModelWithLimits(e)}async loadModelWithLimits(e,r){if(!this.viewer){this.currentModel=e,this.currentModelLimits=r;return}try{let i;if(typeof e=="string"){this.isModelLoaded=!1,this.viewer?.clearScene?.();let a=await fetch(e);if(!a.ok)throw new Error(`Failed to load 3D model from "${e}": HTTP ${a.status}`);i=await a.arrayBuffer()}else i=e;let s=pe(i);this.viewer.loadGLBData(s,r),this.currentModel=s,this.currentModelLimits=r,this.isModelLoaded=!0,this.hidePoster(),this.setSlotVisible("error",!1),this.updateHotspots();let o=this.getAttribute("selected-mesh");o&&this.viewer.setSelectedMesh(o);let l=this.getAttribute("variant-name");l&&this.selectVariant(l),this.fireEvent("load",{model:s}),this.fireEvent("three-load",{model:s,source:typeof e=="string"?"src":"model"})}catch(i){throw this.emitError(i,"load"),i}}showToast(e,r=4500){if(typeof document>"u")return;let i=this.querySelector(".three-live-toast");i||(i=document.createElement("div"),i.className="three-live-toast",i.style.cssText="position:absolute;bottom:70px;left:50%;transform:translateX(-50%) translateY(10px);z-index:10;padding:10px 16px;background-color:rgba(15,23,42,0.94);color:#f8fafc;border:1px solid rgba(56,189,248,0.45);border-radius:14px;font:500 13px/1.35 system-ui,-apple-system,sans-serif;box-shadow:0 10px 25px rgba(0,0,0,0.45);backdrop-filter:blur(12px);pointer-events:none;opacity:0;transition:opacity .25s ease,transform .25s ease;max-width:88%;text-align:center;white-space:normal;word-break:break-word",this.appendChild(i)),i.textContent=e,this.toastTimer&&clearTimeout(this.toastTimer);let s=()=>{i&&(i.style.opacity="1",i.style.transform="translateX(-50%) translateY(0)")};typeof requestAnimationFrame<"u"?requestAnimationFrame(s):s(),this.toastTimer=setTimeout(()=>{i&&(i.style.opacity="0",i.style.transform="translateX(-50%) translateY(10px)"),this.toastTimer=null},r)}async activateAR(){this.activeXRSession?.isSessionActive?.()&&(await this.activeXRSession.stop().catch(()=>{}),this.activeXRSession=null);let e=(s,o=s.message)=>{throw this.fireEvent("ar-status",{status:"failed",error:s}),this.showToast(o,6e3),s};this.currentModel||e(new Error("No 3D model is loaded in <three-live>.")),q.arProvider||e(new Error("AR module not bundled. Use the default 'three-live' bundle or call ThreeLiveElement.registerAR()."));let r=this.getAttribute("ios-src"),i=(this.getAttribute("ar-modes")||"").split(/\s+/).filter(Boolean);try{this.fireEvent("ar-status",{status:"session-started"});let s=await q.arProvider.activateAR({model:r||this.currentModel,glbUrl:typeof this.currentModel=="string"?this.currentModel:void 0,view:this.viewer||void 0,element:this,preferredModes:i.length>0?i:void 0,arScale:this.arScale,arPlacement:this.arPlacement,webXROptions:{onExit:()=>{this.activeXRSession=null,this.fireEvent("ar-status",{status:"not-presenting"})},onError:o=>{this.activeXRSession=null,this.fireEvent("ar-status",{status:"failed",error:o}),this.showToast(`AR error: ${o.message}`,6e3)}}});if(s.success){s.session&&(this.activeXRSession=s.session);let o=s.mode==="quick-look"?"Opening Apple AR Quick Look...":s.mode==="scene-viewer"?"Opening Google Scene Viewer...":s.mode==="webxr"?"WebXR AR session started.":"";o&&this.showToast(o)}else{let o=typeof navigator<"u"&&navigator.userAgent||"",l=/Macintosh/i.test(o)&&!(typeof navigator<"u"&&navigator.maxTouchPoints>1),a=/Android|iPhone|iPad|iPod/i.test(o),c=s.error?.message||"AR requires an iOS (Quick Look) or Android (WebXR / Scene Viewer) device.";if(l&&!a&&typeof document<"u"&&this.currentModel&&q.arProvider.createUSDZBlob)try{let u=this.currentModel instanceof Blob&&this.currentModel.type==="model/vnd.usdz+zip"?this.currentModel:q.arProvider.createUSDZBlob(this.currentModel),d=URL.createObjectURL(u),m=document.createElement("a");m.href=d,m.download="three_live_model.usdz",document.body.appendChild(m),m.click(),document.body.removeChild(m),setTimeout(()=>URL.revokeObjectURL(d),3e3),this.showToast("Downloaded USDZ preview for macOS Quick Look.",5e3)}catch{this.showToast(c,6e3)}else this.showToast(c,6e3);s.error&&this.fireEvent("ar-status",{status:"failed",error:s.error})}return s}catch(s){return this.activeXRSession=null,e(s,`AR error: ${s.message||String(s)}`)}}setupDOM(){let e=this.querySelector("canvas");e||(e=document.createElement("canvas"),e.style.cssText=`width:100%;height:100%;display:block;touch-action:${this.cameraControls?"none":"auto"};outline:none`,this.appendChild(e)),this.canvas=e,typeof e.addEventListener=="function"&&!e.__tlCtxBound&&(e.__tlCtxBound=!0,e.addEventListener("webglcontextlost",i=>this.fireEvent("three-context-lost",{originalEvent:i})),e.addEventListener("webglcontextrestored",i=>this.fireEvent("three-context-restored",{originalEvent:i}))),this.setSlotVisible("error",!1),this.isModelLoaded||this.setSlotVisible("poster",!0);let r=this.getAttribute("poster");r&&this.updatePoster(r),this.createARButton(),typeof MutationObserver<"u"&&!this.mutationObserver&&(this.mutationObserver=new MutationObserver(()=>{this.updateARButtonVisibility()}),this.mutationObserver.observe(this,{childList:!0}))}initViewer(){if(!this.canvas)return;let e=this.autoRotate,r=this.exposure,i=this.parseOrbitLimit(this.getAttribute("min-camera-orbit")),s=this.parseOrbitLimit(this.getAttribute("max-camera-orbit")),o=this.parseCameraTarget(this.getAttribute("camera-target")),l=this.parseFieldOfView(this.getAttribute("field-of-view"));this.viewer=new te(this,this.canvas,{autoRotate:e,autoRotateDelay:this.autoRotateDelay,autoRotateSpeed:this.parseRotationPerSecond(this.getAttribute("rotation-per-second")),exposure:r,shadowIntensity:this.shadowIntensity,shadowSoftness:this.shadowSoftness,toneMapping:this.toneMapping,environmentImage:this.environmentImage,autoplay:this.autoplay,animationName:this.animationName||void 0,variantName:this.getAttribute("variant-name")||void 0,fieldOfView:l,cameraTarget:o,minCameraOrbit:i,maxCameraOrbit:s,onMeshClick:c=>{this.fireEvent("meshclick",c)},onCameraChange:c=>{this.updateHotspots();for(let u of te.getRegisteredPlugins())u.onCameraChange?.(this.viewer,this);this.fireEvent("camera-change",c)}}),this.viewer.setInteractive(this.cameraControls),this.skyboxImage&&this.viewer.setSkyboxImage(this.skyboxImage).catch(()=>{});let a=this.getAttribute("camera-orbit");a&&this.applyCameraOrbit(a),this.currentModel&&this.loadModelWithLimits(this.currentModel,this.currentModelLimits)}setupResizeObserver(){typeof ResizeObserver>"u"||(this.resizeObserver=new ResizeObserver(()=>{this.viewer&&(this.viewer.resize(),this.viewer.render(),this.updateHotspots())}),this.resizeObserver.observe(this))}updatePoster(e){if(!(typeof document>"u")){if(!e){this.posterEl&&(this.posterEl.remove(),this.posterEl=null);return}this.posterEl||(this.posterEl=document.createElement("img"),this.posterEl.setAttribute("alt","3D Scene Preview"),this.posterEl.style.cssText="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;transition:opacity .35s ease-out;pointer-events:none;z-index:1",this.appendChild(this.posterEl)),this.posterEl.src=e,this.isModelLoaded||(this.posterEl.style.opacity="1")}}hidePoster(){this.setSlotVisible("poster",!1),this.posterEl&&(this.posterEl.style.opacity="0",setTimeout(()=>{this.isModelLoaded&&this.posterEl&&(this.posterEl.remove(),this.posterEl=null)},400))}createARButton(){if(!(typeof document>"u")){if(!this.arButton){let e=document.createElement("button");e.setAttribute("type","button"),e.setAttribute("aria-label","View in Augmented Reality"),e.className="three-live-ar-button",e.setAttribute("part","default-ar-button");let r="http://www.w3.org/2000/svg";if(typeof document.createElementNS=="function"){let s=document.createElementNS(r,"svg");for(let[l,a]of[["width","20"],["height","20"],["viewBox","0 0 24 24"],["fill","none"],["stroke","currentColor"],["stroke-width","2"],["stroke-linecap","round"],["stroke-linejoin","round"]])s.setAttribute(l,a);s.style.marginRight="6px";let o=document.createElementNS(r,"path");o.setAttribute("d","M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16zM3.27 6.96 12 12.01l8.73-5.05M12 22.08V12"),s.appendChild(o),e.appendChild(s)}let i=document.createElement("span");i.textContent="View in AR",e.appendChild(i),e.style.cssText="position:absolute;right:16px;bottom:16px;z-index:2;align-items:center;justify-content:center;padding:8px 16px;background-color:rgba(15,23,42,0.85);color:#fff;border:1px solid rgba(255,255,255,0.15);border-radius:9999px;font:600 13px system-ui,-apple-system,sans-serif;cursor:pointer;backdrop-filter:blur(8px);box-shadow:0 4px 12px rgba(0,0,0,0.25);transition:transform .15s ease,background-color .15s ease;display:none",e.addEventListener("mouseenter",()=>{e.style.backgroundColor="rgba(30, 41, 59, 0.95)",e.style.transform="scale(1.04)"}),e.addEventListener("mouseleave",()=>{e.style.backgroundColor="rgba(15, 23, 42, 0.85)",e.style.transform="scale(1)"}),e.addEventListener("click",s=>{s.stopPropagation(),this.activateAR()}),this.arButton=e,this.appendChild(e)}this.updateARButtonVisibility()}}updateARButtonVisibility(){let e=this.hasAttribute("ar")&&!!q.arProvider,r=typeof this.querySelector=="function"?this.querySelector('[slot="ar-button"]'):null;r?(this.arButton&&(this.arButton.style.display="none"),r.__tlARBound||(r.__tlARBound=!0,r.addEventListener("click",i=>{i.stopPropagation(),this.activateAR()})),r.dataset.tlOrigDisplay===void 0&&(r.dataset.tlOrigDisplay=r.style.display==="none"?"":r.style.display),r.style.display=e?r.dataset.tlOrigDisplay||"":"none"):this.arButton&&(this.arButton.style.display=e?"flex":"none")}applyCameraOrbit(e){if(!(!e||!this.viewer))try{let r=JSON.parse(e);this.viewer.setInitialCamera(r.theta,r.phi,r.distance,r.zoom)}catch{let r=this.parseOrbitLimit(e);(r.theta!==void 0||r.phi!==void 0)&&this.viewer.setInitialCamera(r.theta,r.phi,r.distance)}}parseOrbitLimit(e){if(!e)return{};let[r,i,s]=e.trim().split(/\s+/),o=s&&s!=="auto"?parseFloat(s):NaN;return{theta:r&&r!=="auto"?this.parseFieldOfView(r):void 0,phi:i&&i!=="auto"?this.parseFieldOfView(i):void 0,distance:isNaN(o)?void 0:o}}applyOrbitLimits(){if(!this.viewer)return;let e=this.parseOrbitLimit(this.getAttribute("min-camera-orbit")),r=this.parseOrbitLimit(this.getAttribute("max-camera-orbit"));this.viewer.setOrbitLimits({minTheta:e.theta,maxTheta:r.theta,minPhi:e.phi,maxPhi:r.phi,minDistance:e.distance,maxDistance:r.distance})}parseCameraTarget(e){if(!e)return;let r=e.trim().split(/\s+/).map(parseFloat);return r.length>=3&&!r.some(isNaN)?[r[0],r[1],r[2]]:void 0}parseFieldOfView(e){if(!e)return;let r=parseFloat(e);return isNaN(r)?void 0:e.endsWith("rad")?r*180/Math.PI:r}parseRotationPerSecond(e){if(!e)return Math.PI/6;let r=e.trim(),i=parseFloat(r);return isNaN(i)?Math.PI/6:r.endsWith("rad")?i:r.endsWith("%")?i/100*Math.PI*2:i*Math.PI/180}applyCameraTarget(e){let r=this.parseCameraTarget(e);this.viewer&&r&&this.viewer.setTarget(r[0],r[1],r[2])}applyFieldOfView(e){let r=this.parseFieldOfView(e);this.viewer&&r!==void 0&&this.viewer.setFieldOfView(r)}updateHotspot(e){let r=this.querySelector(`[slot="${e.name}"]`);r&&(e.position!==void 0&&r.setAttribute("data-position",e.position),e.normal!==void 0&&r.setAttribute("data-normal",e.normal)),this.updateHotspots()}updateHotspots(){for(let e of te.getRegisteredPlugins())if(e.updateHotspotsForElement){e.updateHotspotsForElement(this,this.viewer);return}}runWithScriptRunner(e){let r=q.scriptRunner;if(!r){let i=new Error('Procedural script execution requires "three-live/full" or ThreeLiveElement.registerScriptRunner().');return this.showToast(i.message),this.emitError(i,"script"),Promise.reject(i)}return this.scriptHandle&&(this.scriptHandle.terminate(),this.scriptHandle=null),this.isModelLoaded=!1,this.viewer?.clearScene?.(),new Promise((i,s)=>{let o=!1;e(r,{onModelReady:a=>{this.loadModelWithLimits(a,qe).then(()=>{o||(o=!0,i(a))},c=>{let u=c instanceof Error?c.message:String(c);this.showToast(u),o||(o=!0,s(c))})},onUpdateTransforms:a=>this.viewer?.updateMeshTransforms(a),onError:a=>{this.showToast(a.message),this.emitError(a,"script"),o||(o=!0,s(a))},onToast:a=>this.showToast(a)}).then(a=>{a&&(this.scriptHandle=a)},a=>{a instanceof Error&&a.message&&this.showToast(a.message),o||(o=!0,s(a))})})}loadScriptFromSrc(e){return this.runWithScriptRunner((r,i)=>{if(typeof r.executeUrl!="function"){let s=new Error("Registered ScriptRunner does not support executeUrl() for server-generated scripts.");return i.onError?.(s),Promise.reject(s)}return r.executeUrl(e,this.sandbox,i)})}executeScript(e){if(!q.scriptRunner)return this.runWithScriptRunner(()=>Promise.resolve());if(!this.allowClientScripts){let r=new Error(Fe);return this.showToast(Ne),this.emitError(r,"security"),Promise.reject(r)}return this.runWithScriptRunner((r,i)=>r.execute(e,this.sandbox,i,{allowClientScripts:!0}))}};q.observedAttributes=["src","ios-src","script-src","sandbox","allow-client-scripts","poster","camera-controls","camera-orbit","camera-target","min-camera-orbit","max-camera-orbit","field-of-view","selected-mesh","ar","ar-modes","ar-scale","ar-placement","exposure","shadow-intensity","shadow-softness","tone-mapping","bloom","bloom-threshold","bloom-radius","outline","outline-selected","outline-color","environment-image","skybox-image","autoplay","animation-name","variant-name","auto-rotate","auto-rotate-delay","rotation-per-second"],q.registerPlugin=te.registerPlugin,q.getRegisteredPlugins=te.getRegisteredPlugins;var be=q;typeof customElements<"u"&&!customElements.get("three-live")&&customElements.define("three-live",be);return nt(yt);})();