three-live 1.2.2 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/three-author-engine.js +57 -39
- package/dist/three-author.cjs +52 -34
- package/dist/three-author.d.ts +2 -1
- package/dist/three-author.js +52 -34
- package/dist/three-convert.cjs +55 -37
- package/dist/three-convert.d.ts +2 -1
- package/dist/three-convert.js +55 -37
- package/dist/three-live-animation.cjs +7 -7
- package/dist/three-live-animation.d.ts +2 -1
- package/dist/three-live-animation.js +7 -7
- package/dist/three-live-animation.min.js +7 -7
- package/dist/three-live-cad.cjs +2 -2
- package/dist/three-live-cad.d.ts +2 -1
- package/dist/three-live-cad.js +2 -2
- package/dist/three-live-cad.min.js +2 -2
- package/dist/three-live-element.cjs +24 -6
- package/dist/three-live-element.d.ts +2 -1
- package/dist/three-live-element.js +24 -6
- package/dist/three-live-full.cjs +81 -63
- package/dist/three-live-full.js +81 -63
- package/dist/three-live-full.min.js +81 -63
- package/dist/three-live-studio.cjs +18 -18
- package/dist/three-live-studio.d.ts +2 -1
- package/dist/three-live-studio.js +18 -18
- package/dist/three-live-studio.min.js +18 -18
- package/dist/three-live-viewer.cjs +24 -6
- package/dist/three-live-viewer.d.ts +2 -1
- package/dist/three-live-viewer.js +24 -6
- package/dist/three-live-viewer.min.js +24 -6
- package/dist/three-live.cjs +55 -37
- package/dist/three-live.js +55 -37
- package/dist/three-live.min.js +55 -37
- package/dist/three-view.cjs +24 -6
- package/dist/three-view.d.ts +2 -1
- package/dist/three-view.js +24 -6
- package/dist/three-xr.cjs +49 -31
- package/dist/three-xr.d.ts +2 -1
- package/dist/three-xr.js +49 -31
- package/package.json +1 -1
package/dist/three-live-full.js
CHANGED
|
@@ -14,17 +14,32 @@
|
|
|
14
14
|
* See the License for the specific language governing permissions and
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
|
-
var os=Object.defineProperty;var ss=(t,e)=>{for(var n in e)os(t,n,{get:e[n],enumerable:!0})};var Si={};ss(Si,{AmbientLight:()=>on,BoxGeometry:()=>Jt,BufferAttribute:()=>Me,BufferGeometry:()=>Xe,Camera:()=>an,CapsuleGeometry:()=>tr,CircleGeometry:()=>rr,Clock:()=>jn,Color:()=>$e,ConeGeometry:()=>Un,CylinderGeometry:()=>yt,DirectionalLight:()=>$n,DodecahedronGeometry:()=>Jn,Euler:()=>Zt,Float32BufferAttribute:()=>Dn,Group:()=>Wn,HemisphereLight:()=>ln,IKSolver:()=>Xi,IcosahedronGeometry:()=>Zn,InstancedMesh:()=>rn,InteractivityVM:()=>dn,Light:()=>Mt,MAX_BSP_DEPTH:()=>Bi,MAX_CSG_TRIANGLES:()=>Vi,MAX_INSTANCES_PER_MESH:()=>nn,MAX_TEXT_GEOMETRY_CHARS:()=>zi,Material:()=>Qe,MathUtils:()=>ho,Matrix3:()=>Pn,Matrix4:()=>vt,Mesh:()=>wt,MeshBasicMaterial:()=>zn,MeshLambertMaterial:()=>Gn,MeshPhongMaterial:()=>Xn,MeshPhysicalMaterial:()=>Hn,MeshStandardMaterial:()=>Tt,Object3D:()=>qe,OctahedronGeometry:()=>Qn,PerspectiveCamera:()=>qn,PlaneGeometry:()=>Fn,PointLight:()=>sn,PolyhedronFallbackGeometry:()=>At,Quaternion:()=>Qt,RawShaderMaterial:()=>So,RectAreaLight:()=>Eo,RingGeometry:()=>nr,Scene:()=>cn,SceneQuotaValidator:()=>Ze,ShaderMaterial:()=>un,SphereGeometry:()=>en,SpotLight:()=>ir,THREE:()=>St,TetrahedronGeometry:()=>er,Texture:()=>tn,TextureLoader:()=>Bn,ThreeLiveElement:()=>Je,ThreeView:()=>Fe,TorusGeometry:()=>On,TorusKnotGeometry:()=>Vn,Uint16BufferAttribute:()=>kn,Uint32BufferAttribute:()=>Nn,Vector2:()=>In,Vector3:()=>Ce,Vector4:()=>Ln,WebGLRenderer:()=>Yn,activateAR:()=>mr,applyMeshoptFilter:()=>gr,authorScriptRunner:()=>Gt,buildSandboxWorkerSource:()=>Hr,cadPlugin:()=>Mr,clearAuthorWarnings:()=>Ao,computeOutlineClipOffset:()=>Jo,contactShadowPlugin:()=>fn,createUSDZBlob:()=>Vt,crossFadeTo:()=>Yr,decodeMeshoptBuffer:()=>yi,decodeMeshoptGLB:()=>bn,encodeMeshoptBuffer:()=>jo,environmentMapPlugin:()=>si,evaluateKawaseBloom:()=>Qo,evaluateToneMapping:()=>Zi,exportSceneToCanvas3D:()=>zr,exportSceneToGLB:()=>Gr,exportSceneToUSDZ:()=>bo,extractMaterialVariants:()=>wi,extractPrimitiveVariantMappings:()=>es,generateUSDZ:()=>qt,getARCapabilities:()=>lr,getAllowClientScripts:()=>xo,getAuthorWarnings:()=>Mo,getBestARMode:()=>Do,getEnvironmentSH:()=>Uo,getInteractivityVM:()=>yr,getSandboxEngineSrc:()=>Xr,getSandboxIframeSrc:()=>go,glbToUSDZ:()=>$t,hotspotPlugin:()=>ui,ikPlugin:()=>Ir,installCadExtension:()=>wn,interactivityPlugin:()=>hi,isAllowedSandboxEngineUrl:()=>gt,isQuickLookSupported:()=>ni,isSceneViewerSupported:()=>ri,isWebXRSupported:()=>ii,keyframeAnimationPlugin:()=>jr,materialsPlugin:()=>pi,meshoptDecoder:()=>xr,meshoptPlugin:()=>gi,morphPlugin:()=>Kr,noopProxy:()=>jt,parseAnimations:()=>qr,parseHexRgb:()=>vi,parseSafeGltfPointer:()=>hn,postprocessingPlugin:()=>Ti,quatFromUnitVectors:()=>Gi,registerMaterialShader:()=>Wo,sampleChannel:()=>Xt,sceneToCanvas3D:()=>Ut,sceneToGLB:()=>Wt,sceneToUSDZ:()=>Ot,selectMaterialVariant:()=>ts,sendInteractivityEvent:()=>fi,setAllowClientScripts:()=>Ls,setEnvironmentSH:()=>fr,setMorphTargetWeight:()=>Co,setSandboxEngineSrc:()=>Rs,setSandboxIframeSrc:()=>Cs,skinningPlugin:()=>Qr,solveFABRIK:()=>Cr,solveTwoBoneIK:()=>_r,threeAuthorPlugin:()=>Kt,threeMicroPlugin:()=>Bs,toGLBData:()=>ot,toTrustedWorkerScriptURL:()=>yo,validateSandboxWorkerMessage:()=>Wr,variantsPlugin:()=>Mi,warnUnsupported:()=>He,webxrPlugin:()=>Ai});function Oi(t,e,n){let r=[],i=new Map,o=[],s=[],c=[],a=new Map,u=x=>{let R=i.get(x);return R===void 0&&(R=r.length,r.push({op:x}),i.set(x,R)),R},l=x=>{let R=a.get(x);return R===void 0&&(R=c.length,c.push({id:x}),a.set(x,R)),R},m=(x,R={})=>o.push({declaration:u(x),...R})-1,f=(x,R,I)=>s.push({id:x,type:R,value:I})-1,h=x=>({node:x,socket:"value"}),b=n?.interactivity??n?.gltfExtensions?.KHR_interactivity;if(b&&typeof b=="object"){let x=Array.isArray(b.graphs)?b.graphs[b.graph??0]:b;if(x&&Array.isArray(x.nodes)){let R=Array.isArray(x.declarations)?x.declarations:[];for(let I of R)I?.op&&u(I.op);Array.isArray(x.variables)&&s.push(...x.variables);for(let I of x.events||[])I?.id&&l(I.id);for(let I of x.nodes){if(!I||typeof I!="object")continue;let P=I.op||(typeof I.declaration=="number"?R[I.declaration]?.op:"");o.push(P?{...I,declaration:u(P)}:{...I})}}}let d=(x,R,I="translation")=>I==="baseColorFactor"||I==="metallicFactor"||I==="roughnessFactor"?`/materials/${Math.max(0,R)}/pbrMetallicRoughness/${I}`:I==="emissiveFactor"||I==="alphaCutoff"?`/materials/${Math.max(0,R)}/${I}`:I==="visible"?`/nodes/${x}/extensions/KHR_node_visibility/visible`:`/nodes/${x}/${I}`,p=new Map;t.forEach((x,R)=>{typeof x?.name=="string"&&!p.has(x.name)&&p.set(x.name,R)});let E=(x,R)=>typeof x.target=="string"&&p.has(x.target)?p.get(x.target):typeof x.targetNode=="number"?x.targetNode:R,A=x=>{let R=t[x];return(typeof R?.mesh=="number"?e[R.mesh]?.primitives?.[0]?.material:0)??0};for(let x=0;x<t.length;x++){let R=t[x],I=R?.extras?.interactivity;if(!I||typeof I!="object")continue;let P=(typeof R.mesh=="number"?e[R.mesh]?.primitives?.[0]?.material:0)??0,k=S=>{let _=Array.isArray(S)?S:[S],v=[];for(let L=0;L<_.length;L++){let U=_[L];if(!U||typeof U!="object")continue;let q=U.action||"interpolate",W=typeof U.duration=="number"?U.duration:.35;if(q==="toggleTransform"){let K=U.property==="rotation"||U.property==="scale"?U.property:"translation",Y=K==="rotation"?R.rotation||[0,0,0,1]:K==="scale"?R.scale||[1,1,1]:R.translation||[0,0,0],te=`/nodes/${x}/${K}`,ie=f(`__toggle_${x}_${L}`,"bool",!1),$=m("variable/get",{configuration:{variable:ie}}),ne=m("math/not",{values:{a:h($)}}),re=m("variable/set",{configuration:{variable:ie},values:{value:h(ne)}}),O=m("pointer/interpolate",{configuration:{pointer:te},values:{value:{value:Array.isArray(U.to)?U.to:Y},duration:{value:W}}}),X=m("pointer/interpolate",{configuration:{pointer:te},values:{value:{value:Array.isArray(U.from)?U.from:Y},duration:{value:W}}});o[re].flows={out:{node:m("flow/branch",{values:{condition:h($)},flows:{true:{node:O},false:{node:X}}})}},v.push(re)}else if(q==="interpolate"){let K=U.to??U.value;if(K===void 0)continue;let Y={value:{value:K},duration:{value:W}};U.from!==void 0&&(Y.from={value:U.from}),v.push(m("pointer/interpolate",{configuration:{pointer:typeof U.pointer=="string"?U.pointer:d(E(U,x),A(E(U,x)),U.property)},values:Y}))}else if(q==="setProperty"){if(U.value===void 0)continue;v.push(m("pointer/set",{configuration:{pointer:typeof U.pointer=="string"?U.pointer:d(E(U,x),A(E(U,x)),U.property)},values:{value:{value:U.value}}}))}else if(q==="toggleVisibility"){let K=E(U,x),Y=f(`__vis_${K}_${L}`,"bool",!0),te=m("variable/get",{configuration:{variable:Y}}),ie=m("math/not",{values:{a:h(te)}}),$=m("variable/set",{configuration:{variable:Y},values:{value:h(ie)}});o[$].flows={out:{node:m("pointer/set",{configuration:{pointer:`/nodes/${K}/extensions/KHR_node_visibility/visible`},values:{value:h(te)}})}},v.push($)}else if(q==="cycleMaterialColor"&&Array.isArray(U.colors)&&U.colors.length>0){let K=typeof U.duration=="number"?U.duration:.25,Y=`/materials/${Math.max(0,P)}/pbrMetallicRoughness/baseColorFactor`,te=f(`__color_idx_${x}_${L}`,"int",0),ie=m("variable/get",{configuration:{variable:te}}),$=m("math/add",{values:{a:h(ie),b:{value:1}}}),ne=m("math/rem",{values:{a:h($),b:{value:U.colors.length}}}),re=m("variable/set",{configuration:{variable:te},values:{value:h(ne)}}),O={};for(let X=0;X<U.colors.length;X++){let M=U.colors[X],N=Array.isArray(M)&&M.length>=3?[M[0],M[1],M[2],M[3]??1]:[1,1,1,1];O[String(X)]={node:K>0?m("pointer/interpolate",{configuration:{pointer:Y},values:{value:{value:N},duration:{value:K}}}):m("pointer/set",{configuration:{pointer:Y},values:{value:{value:N}}})}}o[re].flows={out:{node:m("flow/switch",{values:{selection:h(ie)},flows:O})}},v.push(re)}else if(q==="playAnimation")v.push(m("animation/start",{configuration:{animation:U.animation??U.clip??0}}));else if(q==="stopAnimation")v.push(m("animation/stop"));else if(q==="sendEvent"){let K={};for(let[Y,te]of Object.entries(U.values||{}))K[Y]={value:te};v.push(m("event/send",{configuration:{event:l(String(U.event??U.id??"custom"))},values:K}))}}if(!v.length)return null;if(v.length===1)return v[0];let G={};return v.forEach((L,U)=>{G[String(U)]={node:L}}),m("flow/sequence",{flows:G})},D=(S,_,v)=>{let G=k(_);G!==null&&m(S,{...v?{configuration:v}:{},flows:{out:{node:G}}})};if(I.onSelect&&D("pointer/onSelect",I.onSelect,{nodeIndex:x}),I.onHoverIn&&D("pointer/onHoverIn",I.onHoverIn,{nodeIndex:x}),I.onHoverOut&&D("pointer/onHoverOut",I.onHoverOut,{nodeIndex:x}),I.onStart&&D("event/onStart",I.onStart),I.onReceive&&typeof I.onReceive=="object")for(let[S,_]of Object.entries(I.onReceive))D("event/receive",_,{event:l(S)})}return o.length?{graphs:[{declarations:r,nodes:o,variables:s,events:c}],graph:0}:null}var yn='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).',gn="Security Error: client-side scripts require allow-client-scripts opt-in.";var xn="__THREE_LIVE_REGISTRY__";function pe(){let t=typeof globalThis<"u"?globalThis:{};if(!t[xn]){let e={plugins:[],decoders:new Map};try{Object.defineProperty(t,xn,{value:e,writable:!1,configurable:!1,enumerable:!1})}catch{t[xn]=e}}return t[xn]}var Ie=pe().plugins;function vn(t){let e=pe();e.workerExtensionInstallers||(e.workerExtensionInstallers=[]),e.workerExtensionInstallers.includes(t)||e.workerExtensionInstallers.push(t)}function Pe(t){let e=pe().plugins;e.some(n=>n.name===t.name)||e.push(t),t.onRegister?.()}function Tn(){return pe().plugins}var Vi=8192,Bi=512,zi=128;function wn(t,e){if(!t||!t.BufferGeometry)return null;let n=t.Vector2,r=t.Vector3,i=t.Quaternion,o=t.Matrix4,s=t.Color,c=t.BufferAttribute,a=t.BufferGeometry,u=t.Material,l=t.MeshStandardMaterial,m=t.Mesh,f=8192,h=512,b=128;class d{constructor(g){this.currentPoint=new n(0,0),this.segments=[],Array.isArray(g)&&g.length>0&&this.fromPoints(g)}fromPoints(g){if(!g.length)return this;this.moveTo(g[0].x,g[0].y);for(let T=1;T<g.length;T++)this.lineTo(g[T].x,g[T].y);return this}moveTo(g,T){let C=Number(g)||0,B=Number(T)||0;return this.currentPoint.set(C,B),this.segments.push({type:"move",pts:[C,B]}),this}lineTo(g,T){let C=Number(g)||0,B=Number(T)||0;return this.segments.length===0&&this.segments.push({type:"move",pts:[this.currentPoint.x,this.currentPoint.y]}),this.currentPoint.set(C,B),this.segments.push({type:"line",pts:[C,B]}),this}quadraticCurveTo(g,T,C,B){let w=this.currentPoint.x,F=this.currentPoint.y,H=Number(g)||0,J=Number(T)||0,Z=Number(C)||0,ee=Number(B)||0;return this.segments.length===0&&this.segments.push({type:"move",pts:[w,F]}),this.currentPoint.set(Z,ee),this.segments.push({type:"quad",pts:[w,F,H,J,Z,ee]}),this}bezierCurveTo(g,T,C,B,w,F){let H=this.currentPoint.x,J=this.currentPoint.y,Z=Number(g)||0,ee=Number(T)||0,j=Number(C)||0,Q=Number(B)||0,se=Number(w)||0,oe=Number(F)||0;return this.segments.length===0&&this.segments.push({type:"move",pts:[H,J]}),this.currentPoint.set(se,oe),this.segments.push({type:"cubic",pts:[H,J,Z,ee,j,Q,se,oe]}),this}absarc(g,T,C,B,w,F=!1){return this.absellipse(g,T,C,C,B,w,F,0)}arc(g,T,C,B,w,F=!1){return this.absarc(this.currentPoint.x+(Number(g)||0),this.currentPoint.y+(Number(T)||0),C,B,w,F)}absellipse(g,T,C,B,w,F,H=!1,J=0){let Z=Number(g)||0,ee=Number(T)||0,j=Math.max(0,Number(C)||0),Q=Math.max(0,Number(B)||0),se=Number(w)||0,oe=Number(F)||0,ce=H?1:0,ue=Number(J)||0;this.segments.push({type:"arc",pts:[Z,ee,j,Q,se,oe,ce,ue]});let le=Math.cos(ue),de=Math.sin(ue),be=j*Math.cos(oe),he=Q*Math.sin(oe);return this.currentPoint.set(Z+be*le-he*de,ee+be*de+he*le),this}ellipse(g,T,C,B,w,F,H=!1,J=0){return this.absellipse(this.currentPoint.x+(Number(g)||0),this.currentPoint.y+(Number(T)||0),C,B,w,F,H,J)}closePath(){if(this.segments.length>0){let g=this.segments[0],T=0,C=0;if(g.type==="arc"){let B=g.pts[0],w=g.pts[1],F=g.pts[2],H=g.pts[3],J=g.pts[4],Z=g.pts[7],ee=Math.cos(Z),j=Math.sin(Z),Q=F*Math.cos(J),se=H*Math.sin(J);T=B+Q*ee-se*j,C=w+Q*j+se*ee}else T=g.pts[0],C=g.pts[1];Math.hypot(this.currentPoint.x-T,this.currentPoint.y-C)>1e-6&&this.lineTo(T,C)}return this}getPoints(g=12){let T=Math.max(1,Math.min(128,Math.floor(Number(g)||12))),C=[],B=(w,F)=>{if(C.length>0){let H=C[C.length-1];if(Math.hypot(H.x-w,H.y-F)<1e-6)return}C.push(new n(w,F))};for(let w of this.segments){let F=w.pts;if(w.type==="move"||w.type==="line")B(F[0],F[1]);else if(w.type==="quad"){let H=F[0],J=F[1],Z=F[2],ee=F[3],j=F[4],Q=F[5];B(H,J);for(let se=1;se<=T;se++){let oe=se/T,ce=1-oe;B(ce*ce*H+2*ce*oe*Z+oe*oe*j,ce*ce*J+2*ce*oe*ee+oe*oe*Q)}}else if(w.type==="cubic"){let H=F[0],J=F[1],Z=F[2],ee=F[3],j=F[4],Q=F[5],se=F[6],oe=F[7];B(H,J);for(let ce=1;ce<=T;ce++){let ue=ce/T,le=1-ue,de=le*le,be=ue*ue;B(de*le*H+3*de*ue*Z+3*le*be*j+be*ue*se,de*le*J+3*de*ue*ee+3*le*be*Q+be*ue*oe)}}else if(w.type==="arc"){let H=F[0],J=F[1],Z=F[2],ee=F[3],j=F[4],Q=F[5],se=F[6]!==0,oe=F[7],ce=Math.PI*2,ue=Q-j,le=Math.abs(ue)<1e-9;for(;ue<0;)ue+=ce;for(;ue>ce;)ue-=ce;ue<1e-9&&(ue=le?0:ce),se&&!le&&(ue=ue===ce?-ce:ue-ce);let de=Math.cos(oe),be=Math.sin(oe),he=Math.max(2,T);for(let me=0;me<=he;me++){let ge=me/he,Te=j+ge*ue,ye=Z*Math.cos(Te),ve=ee*Math.sin(Te);B(H+ye*de-ve*be,J+ye*be+ve*de)}}}if(C.length>2){let w=C[0],F=C[C.length-1];Math.hypot(w.x-F.x,w.y-F.y)<1e-6&&C.pop()}return C}getSpacedPoints(g=12){return this.getPoints(g)}}class p extends d{constructor(g){super(g),this.holes=[]}extractPoints(g=12){return{shape:this.getPoints(g),holes:this.holes.map(T=>T.getPoints(g))}}}function E(y){let g=0,T=y.length;for(let C=0,B=T-1;C<T;B=C++)g+=y[B].x*y[C].y-y[C].x*y[B].y;return g*.5}function A(y,g,T,C,B,w,F,H){let J=F-T,Z=H-C,ee=B-T,j=w-C,Q=y-T,se=g-C,oe=J*J+Z*Z,ce=J*ee+Z*j,ue=J*Q+Z*se,le=ee*ee+j*j,de=ee*Q+j*se,be=oe*le-ce*ce;if(Math.abs(be)<1e-12)return!1;let he=1/be,me=(le*ue-ce*de)*he,ge=(oe*de-ce*ue)*he;return me>=-1e-7&&ge>=-1e-7&&me+ge<=1+1e-7}function x(y,g){let T=y.slice();E(T)<0&&T.reverse();let C=T.map(F=>new n(F.x,F.y)),B=T.map((F,H)=>H),w=[];for(let F of g){if(!F||F.length<3)continue;let H=F.slice();E(H)>0&&H.reverse();let J=[],Z=-1/0,ee=0;for(let j=0;j<H.length;j++){let Q=H[j],se=C.length;C.push(new n(Q.x,Q.y)),J.push(se),Q.x>Z&&(Z=Q.x,ee=j)}w.push({pts:H,indices:J,maxX:Z,maxIdx:ee})}w.sort((F,H)=>H.maxX-F.maxX);for(let F of w){let H=F.pts[F.maxIdx].x,J=F.pts[F.maxIdx].y,Z=0,ee=1/0;for(let Q=0;Q<B.length;Q++){let se=C[B[Q]],oe=Math.hypot(se.x-H,se.y-J)+(se.x>=H?0:1e3);oe<ee&&(ee=oe,Z=Q)}let j=[];for(let Q=0;Q<=Z;Q++)j.push(B[Q]);for(let Q=0;Q<=F.indices.length;Q++){let se=F.indices[(F.maxIdx+Q)%F.indices.length];j.push(se)}for(let Q=Z;Q<B.length;Q++)j.push(B[Q]);B=j}return{merged:B.map(F=>C[F]),mergedIndices:B,allVertices:C}}function R(y,g){let T=[],C=y.slice();if(C.length<3)return T;let B=C.length*C.length+64,w=0;for(;C.length>2&&B-- >0;){let F=C.length,H=C[(w+F-1)%F],J=C[w%F],Z=C[(w+1)%F],ee=g[H],j=g[J],Q=g[Z];if((j.x-ee.x)*(Q.y-ee.y)-(j.y-ee.y)*(Q.x-ee.x)>1e-9){let oe=!0;for(let ce=0;ce<F;ce++){let ue=C[ce];if(ue===H||ue===J||ue===Z)continue;let le=g[ue];if(!(Math.hypot(le.x-ee.x,le.y-ee.y)<1e-6||Math.hypot(le.x-j.x,le.y-j.y)<1e-6||Math.hypot(le.x-Q.x,le.y-Q.y)<1e-6)&&A(le.x,le.y,ee.x,ee.y,j.x,j.y,Q.x,Q.y)){oe=!1;break}}if(oe){T.push([H,J,Z]),C.splice(w%F,1),w=0;continue}}w++,w>=F*2&&(T.push([H,J,Z]),C.splice(w%F,1),w=0)}return T}class I extends a{constructor(g=new p,T=12){super();let C=Array.isArray(g)?g:[g],B=[],w=[],F=[],H=[];for(let J of C){if(!(J instanceof d))continue;let Z=J instanceof p?J.extractPoints(T):{shape:J.getPoints(T),holes:[]};if(Z.shape.length<3)continue;let{mergedIndices:ee,allVertices:j}=x(Z.shape,Z.holes),Q=R(ee,j),se=B.length/3,oe=1/0,ce=1/0,ue=-1/0,le=-1/0;for(let he of j)he.x<oe&&(oe=he.x),he.y<ce&&(ce=he.y),he.x>ue&&(ue=he.x),he.y>le&&(le=he.y);let de=Math.max(1e-6,ue-oe),be=Math.max(1e-6,le-ce);for(let he of j)B.push(he.x,he.y,0),w.push(0,0,1),F.push((he.x-oe)/de,(he.y-ce)/be);for(let[he,me,ge]of Q)H.push(se+he,se+me,se+ge)}this.setAttribute("position",new c(new Float32Array(B),3)),this.setAttribute("normal",new c(new Float32Array(w),3)),this.setAttribute("uv",new c(new Float32Array(F),2)),this.setIndex(H)}}function P(y){let g=y.length,T=[];for(let C=0;C<g;C++){let B=y[(C+g-1)%g],w=y[C],F=y[(C+1)%g],H=w.x-B.x,J=w.y-B.y,Z=Math.hypot(H,J)||1;H/=Z,J/=Z;let ee=F.x-w.x,j=F.y-w.y,Q=Math.hypot(ee,j)||1;ee/=Q,j/=Q;let se=J,oe=-H,ce=j,ue=-ee,le=se+ce,de=oe+ue,be=Math.hypot(le,de);if(be>1e-6){le/=be,de/=be;let he=Math.max(.35,le*se+de*oe);T.push(new n(le/he,de/he))}else T.push(new n(se,oe))}return T}class k extends a{constructor(g=new p,T={}){super();let C=Array.isArray(g)?g:[g],B=Math.max(1,Math.min(64,Math.floor(Number(T.curveSegments??12)))),w=Number.isFinite(Number(T.depth??T.amount))?Number(T.depth??T.amount):1,F=Math.max(1,Math.min(32,Math.floor(Number(T.steps??1)))),H=!!(T.bevelEnabled??!1),J=H?Math.max(0,Number(T.bevelThickness??.06)):0,Z=H?Math.max(0,Number(T.bevelSize??J*.8)):0,ee=H?Number(T.bevelOffset??0):0,j=H?Math.max(1,Math.min(8,Math.floor(Number(T.bevelSegments??2)))):0,Q=[],se=[],oe=[],ce=[];for(let ue of C){if(!(ue instanceof d))continue;let le=ue instanceof p?ue.extractPoints(B):{shape:ue.getPoints(B),holes:[]};if(le.shape.length<3)continue;let de=le.shape.slice();E(de)<0&&de.reverse();let be=[];for(let fe of le.holes){if(fe.length<3)continue;let Ae=fe.slice();E(Ae)>0&&Ae.reverse(),be.push(Ae)}let{mergedIndices:he,allVertices:me}=x(de,be),ge=R(he,me),Te=[de,...be],ye=[];for(let fe of Te){let Ae=P(fe);for(let Se of Ae)ye.push(Se)}let ve=1/0,_e=1/0,Ue=-1/0,Ve=-1/0;for(let fe of me)fe.x<ve&&(ve=fe.x),fe.y<_e&&(_e=fe.y),fe.x>Ue&&(Ue=fe.x),fe.y>Ve&&(Ve=fe.y);let Ge=Math.max(1e-6,Ue-ve),je=Math.max(1e-6,Ve-_e),_t=-J,Ct=w+J,ct=Q.length/3;for(let fe=0;fe<me.length;fe++){let Ae=me[fe],Se=ye[fe]??new n(0,0),De=Ae.x+Se.x*ee,ke=Ae.y+Se.y*ee;Q.push(De,ke,_t),se.push(0,0,-1),oe.push((De-ve)/Ge,(ke-_e)/je)}for(let[fe,Ae,Se]of ge)ce.push(ct+fe,ct+Se,ct+Ae);let ut=Q.length/3;for(let fe=0;fe<me.length;fe++){let Ae=me[fe],Se=ye[fe]??new n(0,0),De=Ae.x+Se.x*ee,ke=Ae.y+Se.y*ee;Q.push(De,ke,Ct),se.push(0,0,1),oe.push((De-ve)/Ge,(ke-_e)/je)}for(let[fe,Ae,Se]of ge)ce.push(ut+fe,ut+Ae,ut+Se);let Be=[];if(H&&j>0)for(let fe=0;fe<j;fe++){let Se=fe/j*Math.PI/2;Be.push({z:-J*Math.cos(Se),expand:ee+Z*Math.sin(Se)})}for(let fe=0;fe<=F;fe++){let Ae=fe/F;Be.push({z:Ae*w,expand:ee+Z})}if(H&&j>0)for(let fe=1;fe<=j;fe++){let Se=fe/j*Math.PI/2;Be.push({z:w+J*Math.sin(Se),expand:ee+Z*Math.cos(Se)})}let Ke=0;for(let fe of Te){let Ae=fe.length;for(let Se=0;Se<Be.length-1;Se++){let De=Be[Se],ke=Be[Se+1];for(let ze=0;ze<Ae;ze++){let tt=(ze+1)%Ae,lt=fe[ze],mt=fe[tt],ft=ye[Ke+ze],ht=ye[Ke+tt],dt=lt.x+ft.x*De.expand,pt=lt.y+ft.y*De.expand,xt=mt.x+ht.x*De.expand,nt=mt.y+ht.y*De.expand,rs=mt.x+ht.x*ke.expand,is=mt.y+ht.y*ke.expand,Ei=lt.x+ft.x*ke.expand,Ri=lt.y+ft.y*ke.expand,_i=xt-dt,Ci=nt-pt,Ii=0,Li=Ei-dt,Pi=Ri-pt,Di=ke.z-De.z,It=Ci*Di-Ii*Pi,Lt=Ii*Li-_i*Di,Pt=_i*Pi-Ci*Li,wr=Math.hypot(It,Lt,Pt)||1;It/=wr,Lt/=wr,Pt/=wr;let Dt=Q.length/3;Q.push(dt,pt,De.z,xt,nt,De.z,rs,is,ke.z,Ei,Ri,ke.z),se.push(It,Lt,Pt,It,Lt,Pt,It,Lt,Pt,It,Lt,Pt);let ki=ze/Ae,Ni=(ze+1)/Ae,Fi=Se/(Be.length-1),Ui=(Se+1)/(Be.length-1);oe.push(ki,Fi,Ni,Fi,Ni,Ui,ki,Ui),ce.push(Dt,Dt+1,Dt+2,Dt,Dt+2,Dt+3)}}Ke+=Ae}}this.setAttribute("position",new c(new Float32Array(Q),3)),this.setAttribute("normal",new c(new Float32Array(se),3)),this.setAttribute("uv",new c(new Float32Array(oe),2)),this.setIndex(ce)}}function D(y){return{x:y.x,y:y.y,z:y.z,nx:y.nx,ny:y.ny,nz:y.nz,u:y.u,v:y.v}}function S(y){return{x:y.x,y:y.y,z:y.z,nx:-y.nx,ny:-y.ny,nz:-y.nz,u:y.u,v:y.v}}function _(y,g,T){let C=y.nx+(g.nx-y.nx)*T,B=y.ny+(g.ny-y.ny)*T,w=y.nz+(g.nz-y.nz)*T,F=Math.hypot(C,B,w)||1;return{x:y.x+(g.x-y.x)*T,y:y.y+(g.y-y.y)*T,z:y.z+(g.z-y.z)*T,nx:C/F,ny:B/F,nz:w/F,u:y.u+(g.u-y.u)*T,v:y.v+(g.v-y.v)*T}}function v(y){if(y.length<3)return null;let g=y[0],T=y[1],C=y[2],B=T.x-g.x,w=T.y-g.y,F=T.z-g.z,H=C.x-g.x,J=C.y-g.y,Z=C.z-g.z,ee=w*Z-F*J,j=F*H-B*Z,Q=B*J-w*H,se=Math.hypot(ee,j,Q);if(se<1e-9)return null;ee/=se,j/=se,Q/=se;let oe=ee*g.x+j*g.y+Q*g.z;return{vertices:y,nx:ee,ny:j,nz:Q,w:oe}}function G(y){y.vertices.reverse();for(let g=0;g<y.vertices.length;g++)y.vertices[g]=S(y.vertices[g]);y.nx=-y.nx,y.ny=-y.ny,y.nz=-y.nz,y.w=-y.w}let L=1e-5,U=0,q=1,W=2,K=3;function Y(y,g,T,C,B,w,F,H,J){let Z=0,ee=[];for(let j=0;j<B.vertices.length;j++){let Q=B.vertices[j],se=y*Q.x+g*Q.y+T*Q.z-C,oe=se<-L?W:se>L?q:U;Z|=oe,ee.push(oe)}switch(Z){case U:{y*B.nx+g*B.ny+T*B.nz>0?w.push(B):F.push(B);break}case q:H.push(B);break;case W:J.push(B);break;case K:{let j=[],Q=[],se=B.vertices.length;for(let oe=0;oe<se;oe++){let ce=(oe+1)%se,ue=ee[oe],le=ee[ce],de=B.vertices[oe],be=B.vertices[ce];if(ue!==W&&j.push(de),ue!==q&&Q.push(ue!==W?D(de):de),(ue|le)===K){let he=be.x-de.x,me=be.y-de.y,ge=be.z-de.z,Te=y*he+g*me+T*ge,ye=Math.abs(Te)>1e-12?(C-(y*de.x+g*de.y+T*de.z))/Te:.5,ve=_(de,be,Math.max(0,Math.min(1,ye)));j.push(ve),Q.push(D(ve))}}if(j.length>=3){let oe=v(j);oe&&H.push(oe)}if(Q.length>=3){let oe=v(Q);oe&&J.push(oe)}break}default:break}}class te{constructor(g,T=0){this.nx=0,this.ny=0,this.nz=0,this.w=0,this.hasPlane=!1,this.polygons=[],this.front=null,this.back=null,g&&g.length>0&&this.build(g,T)}invert(){for(let T=0;T<this.polygons.length;T++)G(this.polygons[T]);this.nx=-this.nx,this.ny=-this.ny,this.nz=-this.nz,this.w=-this.w,this.front&&this.front.invert(),this.back&&this.back.invert();let g=this.front;this.front=this.back,this.back=g}clipPolygons(g,T=0){if(!this.hasPlane||g.length===0||T>=h)return g.slice();let C=[],B=[];for(let w=0;w<g.length;w++)Y(this.nx,this.ny,this.nz,this.w,g[w],C,B,C,B);return this.front&&C.length>0&&(C=this.front.clipPolygons(C,T+1)),this.back?B=B.length>0?this.back.clipPolygons(B,T+1):[]:B=[],C.concat(B)}clipTo(g,T=0){this.polygons.length>0&&(this.polygons=g.clipPolygons(this.polygons,0)),T<h&&(this.front&&this.front.clipTo(g,T+1),this.back&&this.back.clipTo(g,T+1))}allPolygons(g=[]){for(let T=0;T<this.polygons.length;T++)g.push(this.polygons[T]);return this.front&&this.front.allPolygons(g),this.back&&this.back.allPolygons(g),g}build(g,T=0){if(!g.length)return;if(!this.hasPlane){let w=g[0];this.nx=w.nx,this.ny=w.ny,this.nz=w.nz,this.w=w.w,this.hasPlane=!0}if(T>=h){for(let w=0;w<g.length;w++)this.polygons.push(g[w]);return}let C=[],B=[];for(let w=0;w<g.length;w++)Y(this.nx,this.ny,this.nz,this.w,g[w],this.polygons,this.polygons,C,B);C.length>0&&(this.front||(this.front=new te),this.front.build(C,T+1)),B.length>0&&(this.back||(this.back=new te),this.back.build(B,T+1))}}function ie(y,g){let T=y.attributes.position;if(!T||T.count===0)return[];let C=y.attributes.normal,B=y.attributes.uv,w=y.index?y.index.array:null,F=Math.floor(w?w.length/3:T.count/3);if(F>f)throw new RangeError(`SecurityError: CSG input triangle count (${F}) exceeds MAX_CSG_TRIANGLES (${f})`);let H=g?g.elements:null,J=H?H[0]*(H[5]*H[10]-H[9]*H[6])-H[4]*(H[1]*H[10]-H[9]*H[2])+H[8]*(H[1]*H[6]-H[5]*H[2])<0:!1,Z=j=>{let Q=T.getX(j),se=T.getY(j),oe=T.getZ(j),ce=C?C.getX(j):0,ue=C?C.getY(j):0,le=C?C.getZ(j):1;if(H){let he=H[0]*Q+H[4]*se+H[8]*oe+H[12],me=H[1]*Q+H[5]*se+H[9]*oe+H[13],ge=H[2]*Q+H[6]*se+H[10]*oe+H[14];Q=he,se=me,oe=ge;let Te=H[0]*ce+H[4]*ue+H[8]*le,ye=H[1]*ce+H[5]*ue+H[9]*le,ve=H[2]*ce+H[6]*ue+H[10]*le,_e=Math.hypot(Te,ye,ve)||1;ce=Te/_e,ue=ye/_e,le=ve/_e}let de=B?B.getX(j):0,be=B?B.getY(j):0;return{x:Q,y:se,z:oe,nx:ce,ny:ue,nz:le,u:de,v:be}},ee=[];for(let j=0;j<F;j++){let Q=w?w[j*3]:j*3,se=w?w[j*3+1]:j*3+1,oe=w?w[j*3+2]:j*3+2,ce=v(J?[Z(Q),Z(oe),Z(se)]:[Z(Q),Z(se),Z(oe)]);ce&&ee.push(ce)}return ee}function $(y){let g=[],T=[],C=[],B=[];for(let F of y){let H=F.vertices;if(H.length<3)continue;let J=g.length/3;for(let Z of H)g.push(Z.x,Z.y,Z.z),T.push(F.nx,F.ny,F.nz),C.push(Z.u,Z.v);for(let Z=1;Z<H.length-1;Z++)B.push(J,J+Z,J+Z+1)}let w=new a;return w.setAttribute("position",new c(new Float32Array(g),3)),w.setAttribute("normal",new c(new Float32Array(T),3)),w.setAttribute("uv",new c(new Float32Array(C),2)),w.setIndex(B),w}function ne(y,g,T){if(y.length+g.length>f)throw new RangeError(`SecurityError: Combined CSG triangle count (${y.length+g.length}) exceeds MAX_CSG_TRIANGLES (${f})`);if(y.length===0)return T==="union"?g:[];if(g.length===0)return T==="intersect"?[]:y;let C=new te(y),B=new te(g);return T==="union"?(C.clipTo(B),B.clipTo(C),B.invert(),B.clipTo(C),B.invert(),C.build(B.allPolygons()),C.allPolygons()):T==="subtract"?(C.invert(),C.clipTo(B),B.clipTo(C),B.invert(),B.clipTo(C),B.invert(),C.build(B.allPolygons()),C.invert(),C.allPolygons()):(C.invert(),B.clipTo(C),B.invert(),C.clipTo(B),B.clipTo(C),C.build(B.allPolygons()),C.invert(),C.allPolygons())}function re(y,g,T,C=null,B=null){let w=ie(y,C),F=ie(g,B);return $(ne(w,F,T))}function O(y,g,T){let C=y instanceof m||!!y?.isMesh,B=g instanceof m||!!g?.isMesh,w=C?y.geometry:y,F=B?g.geometry:g,H=null;if(B)if(g.updateMatrix(),C){y.updateMatrix();let j=new o().makeScale(1/(y.scale.x||1),1/(y.scale.y||1),1/(y.scale.z||1)),Q=Math.hypot(y.quaternion.x,y.quaternion.y,y.quaternion.z,y.quaternion.w)||1,se=new o().compose(new r(0,0,0),new i(-y.quaternion.x/Q,-y.quaternion.y/Q,-y.quaternion.z/Q,y.quaternion.w/Q),new r(1,1,1)),oe=new o().makeTranslation(-y.position.x,-y.position.y,-y.position.z);H=j.multiply(se).multiply(oe).multiply(g.matrix)}else H=g.matrix;let J=re(w,F,T,null,H),Z=C?y.material:new l,ee=new m(J,Z);return C&&(ee.position.copy(y.position),ee.quaternion.copy(y.quaternion),ee.scale.copy(y.scale),ee.name=y.name),ee}let X={toGeometry:re,subtract(y,g){return O(y,g,"subtract")},union(y,g){return O(y,g,"union")},intersect(y,g){return O(y,g,"intersect")}},M={0:[[[.15,0],[.85,0],[.85,1],[.15,1],[.15,0]]],1:[[[.3,.8],[.5,1],[.5,0]],[[.2,0],[.8,0]]],2:[[[.15,.8],[.3,1],[.7,1],[.85,.8],[.85,.55],[.15,0],[.85,0]]],3:[[[.15,.85],[.3,1],[.75,1],[.85,.75],[.5,.5],[.85,.25],[.75,0],[.3,0],[.15,.15]]],4:[[[.7,0],[.7,1],[.15,.35],[.9,.35]]],5:[[[.85,1],[.2,1],[.15,.55],[.75,.55],[.85,.3],[.75,0],[.2,0]]],6:[[[.8,.9],[.5,1],[.15,.7],[.15,.15],[.5,0],[.85,.2],[.85,.45],[.5,.55],[.15,.45]]],7:[[[.15,1],[.85,1],[.35,0]]],8:[[[.2,.5],[.15,.75],[.3,1],[.7,1],[.85,.75],[.8,.5],[.2,.5],[.15,.2],[.3,0],[.7,0],[.85,.2],[.8,.5]]],9:[[[.85,.55],[.5,.45],[.15,.55],[.15,.85],[.5,1],[.85,.85],[.85,.2],[.5,0],[.2,.1]]],A:[[[.1,0],[.5,1],[.9,0]],[[.25,.35],[.75,.35]]],B:[[[.15,0],[.15,1],[.7,1],[.85,.75],[.7,.5],[.15,.5]],[[.7,.5],[.85,.25],[.7,0],[.15,0]]],C:[[[.85,.8],[.65,1],[.3,1],[.15,.75],[.15,.25],[.3,0],[.65,0],[.85,.2]]],D:[[[.15,0],[.15,1],[.65,1],[.85,.75],[.85,.25],[.65,0],[.15,0]]],E:[[[.85,1],[.15,1],[.15,0],[.85,0]],[[.15,.5],[.7,.5]]],F:[[[.85,1],[.15,1],[.15,0]],[[.15,.5],[.7,.5]]],G:[[[.85,.8],[.65,1],[.3,1],[.15,.75],[.15,.25],[.3,0],[.85,0],[.85,.45],[.55,.45]]],H:[[[.15,0],[.15,1]],[[.85,0],[.85,1]],[[.15,.5],[.85,.5]]],I:[[[.25,1],[.75,1]],[[.5,1],[.5,0]],[[.25,0],[.75,0]]],J:[[[.8,1],[.8,.25],[.6,0],[.3,0],[.15,.25]]],K:[[[.15,0],[.15,1]],[[.85,1],[.15,.45],[.85,0]]],L:[[[.15,1],[.15,0],[.85,0]]],M:[[[.1,0],[.1,1],[.5,.35],[.9,1],[.9,0]]],N:[[[.15,0],[.15,1],[.85,0],[.85,1]]],O:[[[.3,0],[.7,0],[.85,.25],[.85,.75],[.7,1],[.3,1],[.15,.75],[.15,.25],[.3,0]]],P:[[[.15,0],[.15,1],[.7,1],[.85,.75],[.7,.5],[.15,.5]]],Q:[[[.3,0],[.7,0],[.85,.25],[.85,.75],[.7,1],[.3,1],[.15,.75],[.15,.25],[.3,0]],[[.55,.3],[.9,-.05]]],R:[[[.15,0],[.15,1],[.7,1],[.85,.75],[.7,.5],[.15,.5]],[[.55,.5],[.85,0]]],S:[[[.85,.85],[.65,1],[.3,1],[.15,.75],[.85,.25],[.7,0],[.3,0],[.15,.15]]],T:[[[.1,1],[.9,1]],[[.5,1],[.5,0]]],U:[[[.15,1],[.15,.25],[.35,0],[.65,0],[.85,.25],[.85,1]]],V:[[[.1,1],[.5,0],[.9,1]]],W:[[[.05,1],[.25,0],[.5,.65],[.75,0],[.95,1]]],X:[[[.15,1],[.85,0]],[[.85,1],[.15,0]]],Y:[[[.15,1],[.5,.5],[.85,1]],[[.5,.5],[.5,0]]],Z:[[[.15,1],[.85,1],[.15,0],[.85,0]]],".":[[[.45,0],[.55,0],[.55,.12],[.45,.12],[.45,0]]],",":[[[.5,.15],[.4,-.1]]],":":[[[.45,.1],[.55,.1]],[[.45,.7],[.55,.7]]],"-":[[[.2,.5],[.8,.5]]],"+":[[[.2,.5],[.8,.5]],[[.5,.2],[.5,.8]]],"=":[[[.2,.35],[.8,.35]],[[.2,.65],[.8,.65]]],"/":[[[.2,0],[.8,1]]],"!":[[[.5,1],[.5,.28]],[[.5,.1],[.5,0]]],"?":[[[.2,.8],[.35,1],[.7,1],[.85,.75],[.5,.45],[.5,.28]],[[.5,.1],[.5,0]]],"(":[[[.65,1],[.35,.65],[.35,.35],[.65,0]]],")":[[[.35,1],[.65,.65],[.65,.35],[.35,0]]],"%":[[[.2,0],[.8,1]],[[.2,.8],[.35,.8],[.35,.95],[.2,.95],[.2,.8]],[[.65,.05],[.8,.05],[.8,.2],[.65,.2],[.65,.05]]],"#":[[[.32,0],[.32,1]],[[.68,0],[.68,1]],[[.12,.35],[.88,.35]],[[.12,.65],[.88,.65]]],$:[[[.8,.8],[.6,.92],[.3,.92],[.18,.72],[.82,.28],[.7,.08],[.4,.08],[.2,.2]],[[.5,1],[.5,0]]],_:[[[.1,0],[.9,0]]],"[":[[[.65,1],[.3,1],[.3,0],[.65,0]]],"]":[[[.35,1],[.7,1],[.7,0],[.35,0]]],"<":[[[.75,.85],[.25,.5],[.75,.15]]],">":[[[.25,.85],[.75,.5],[.25,.15]]],"*":[[[.5,.2],[.5,.8]],[[.2,.35],[.8,.65]],[[.2,.65],[.8,.35]]],"\\":[[[.2,1],[.8,0]]]};class N extends a{constructor(g="",T={}){super();let C=String(g??"").slice(0,b),B=Math.max(.005,Math.min(100,Number(T.size??.2))),w=!!(T.bevelEnabled??!1),F=w?Math.max(0,Math.min(2,Number(T.bevelThickness??B*.04))):0,H=w?Math.max(0,Math.min(2,Number(T.bevelSize??B*.03))):0,J=Math.max(.001,Math.min(20,Number(T.depth??T.height??B*.2)))+F*2,Z=B*.085+H,ee=B*.68,j=B*.82,Q=[],se=[],oe=[],ce=[],ue=(be,he,me,ge,Te,ye,ve)=>{let _e=me-be,Ue=ge-he,Ve=Math.hypot(_e,Ue),Ge=1,je=0;Ve>1e-6&&(Ge=_e/Ve,je=Ue/Ve);let _t=-je*Te,Ct=Ge*Te,ct=Ge*Te*.6,ut=je*Te*.6,Be=be-ct+_t,Ke=he-ut+Ct,fe=be-ct-_t,Ae=he-ut-Ct,Se=me+ct-_t,De=ge+ut-Ct,ke=me+ct+_t,ze=ge+ut+Ct,tt=(lt,mt,ft,ht,dt,pt,xt)=>{let nt=Q.length/3;Q.push(lt[0],lt[1],lt[2],mt[0],mt[1],mt[2],ft[0],ft[1],ft[2],ht[0],ht[1],ht[2]),se.push(dt,pt,xt,dt,pt,xt,dt,pt,xt,dt,pt,xt),oe.push(0,0,1,0,1,1,0,1),ce.push(nt,nt+1,nt+2,nt,nt+2,nt+3)};tt([Be,Ke,ve],[fe,Ae,ve],[Se,De,ve],[ke,ze,ve],0,0,1),tt([fe,Ae,ye],[Be,Ke,ye],[ke,ze,ye],[Se,De,ye],0,0,-1),tt([Be,Ke,ye],[fe,Ae,ye],[fe,Ae,ve],[Be,Ke,ve],-Ge,-je,0),tt([Se,De,ye],[ke,ze,ye],[ke,ze,ve],[Se,De,ve],Ge,je,0),tt([fe,Ae,ye],[Se,De,ye],[Se,De,ve],[fe,Ae,ve],-je,Ge,0),tt([ke,ze,ye],[Be,Ke,ye],[Be,Ke,ve],[ke,ze,ve],je,-Ge,0)},le=0,de=0;for(let be=0;be<C.length;be++){let he=C[be];if(he===`
|
|
18
|
-
`){le=0,de-=B*1.35;continue}if(he===" "){le+=j*.75;continue}let me=he.toUpperCase(),ge=he!==me&&he>="a"&&he<="z",Te=M[me]??M["?"],ye=ge?B*.76:B,ve=ge?ee*.88:ee;for(let _e of Te)for(let Ue=0;Ue<_e.length-1;Ue++){let Ve=_e[Ue],Ge=_e[Ue+1];ue(le+Ve[0]*ve,de+Ve[1]*ye,le+Ge[0]*ve,de+Ge[1]*ye,Z,-J*.5,J*.5)}le+=ge?j*.88:j}this.setAttribute("position",new c(new Float32Array(Q),3)),this.setAttribute("normal",new c(new Float32Array(se),3)),this.setAttribute("uv",new c(new Float32Array(oe),2)),this.setIndex(ce),T.center!==!1?this.center():this.computeBoundingBox()}}function z(y){if(!y)return;let g=y,T=y.userData?.xr?.text;if(T!=null&&T!==!1){let B=g.geometry?.attributes?.position;if(!B||B.count===0){let w="",F=.08,H=.015,J;if(typeof T=="string"||typeof T=="number")w=String(T);else if(typeof T=="object"){let Z=T;w=String(Z.text??Z.value??""),Z.size!==void 0&&(F=Number(Z.size)||.08),(Z.depth!==void 0||Z.height!==void 0)&&(H=Number(Z.depth??Z.height)||F*.2),(typeof Z.color=="string"||typeof Z.color=="number")&&(J=Z.color)}w.trim().length>0&&(g.geometry=new N(w,{size:F,depth:H}),g.material instanceof u?J!==void 0&&y.userData._autoTextColorApplied!==!0&&(g.material.color=new s(J),y.userData._autoTextColorApplied=!0):g.material=new l({color:J??16317180}))}}let C=y.userData?.csg;if(C&&typeof C=="object"&&y.userData._csgApplied!==!0&&g.geometry instanceof a&&g.geometry.attributes.position?.count>0){y.userData._csgApplied=!0;let B=Array.isArray(C)?C:[C];for(let w of B){if(!w||typeof w!="object")continue;let F=w,H=String(F.op??F.operation??"subtract"),J=H==="union"||H==="intersect"?H:"subtract",Z=F.target??F.mesh??F.geometry;if(Z instanceof m||Z instanceof a){let ee=J==="union"?X.union(g,Z):J==="intersect"?X.intersect(g,Z):X.subtract(g,Z);g.geometry=ee.geometry}}}}let V={Path:d,Shape:p,ShapeGeometry:I,ExtrudeGeometry:k,TextGeometry:N,CSG:X,MAX_CSG_TRIANGLES:f,MAX_BSP_DEPTH:h,MAX_TEXT_GEOMETRY_CHARS:b,materializeDeclarativeGeometry:z};return e&&typeof e=="object"&&(e.authorNamespace||(e.authorNamespace={}),Object.assign(e.authorNamespace,V),e.materializeDeclarativeGeometry=z),V}var Mr={name:"cad",onRegister(){vn(wn);let t=pe(),e=t.threeNamespace??(typeof globalThis<"u"?globalThis.THREE:void 0);e&&wn(e,t)}};function Er(t,e){function n(a,u,l,m){let f=typeof a=="number"?a:Number(a);return Number.isFinite(f)?Math.max(u,Math.min(l,f)):m}function r(a,u){let m=a[0]*u[0]+a[1]*u[1]+a[2]*u[2]+1;if(m<1e-6){if(Math.abs(a[0])>Math.abs(a[2])){let E=Math.hypot(a[1],a[0])||1;return[-a[1]/E,a[0]/E,0,0]}let p=Math.hypot(a[2],a[1])||1;return[0,-a[2]/p,a[1]/p,0]}let f=a[1]*u[2]-a[2]*u[1],h=a[2]*u[0]-a[0]*u[2],b=a[0]*u[1]-a[1]*u[0],d=Math.hypot(f,h,b,m)||1;return[f/d,h/d,b/d,m/d]}function i(a,u,l,m,f){let h=u[0]-a[0],b=u[1]-a[1],d=u[2]-a[2],p=Math.hypot(h,b,d),E=l[0]-u[0],A=l[1]-u[1],x=l[2]-u[2],R=Math.hypot(E,A,x);if(p<1e-6||R<1e-6)return{rootPos:[a[0],a[1],a[2]],midPos:[u[0],u[1],u[2]],effectorPos:[l[0],l[1],l[2]],rootRotation:[0,0,0,1],midRotation:[0,0,0,1]};let I=[h/p,b/p,d/p],P=[E/R,A/R,x/R],k=m[0]-a[0],D=m[1]-a[1],S=m[2]-a[2],_=Math.hypot(k,D,S),v=_>1e-6?[k/_,D/_,S/_]:I,G=Math.abs(p-R)+1e-5,L=Math.max(G,p+R-1e-5),U=Math.max(G,Math.min(L,_>1e-6?_:G)),q=n((p*p+U*U-R*R)/(2*p*U),-1,1,1),W=Math.sqrt(Math.max(0,1-q*q)),K=f?f[0]-a[0]:h,Y=f?f[1]-a[1]:b,te=f?f[2]-a[2]:d,ie=K*v[0]+Y*v[1]+te*v[2],$=K-v[0]*ie,ne=Y-v[1]*ie,re=te-v[2]*ie,O=Math.hypot($,ne,re);if(O<=1e-6){let w=Math.abs(v[1])<.99?0:1,F=Math.abs(v[1])<.99?1:0,H=0;$=v[1]*H-v[2]*F,ne=v[2]*w-v[0]*H,re=v[0]*F-v[1]*w,O=Math.hypot($,ne,re)||1}let X=[$/O,ne/O,re/O],M=[a[0]+v[0]*(p*q)+X[0]*(p*W),a[1]+v[1]*(p*q)+X[1]*(p*W),a[2]+v[2]*(p*q)+X[2]*(p*W)],N=[a[0]+v[0]*U,a[1]+v[1]*U,a[2]+v[2]*U],z=N[0]-M[0],V=N[1]-M[1],y=N[2]-M[2],g=Math.hypot(z,V,y),T=g>1e-6?[z/g,V/g,y/g]:v,C=[M[0]+T[0]*R,M[1]+T[1]*R,M[2]+T[2]*R],B=[(M[0]-a[0])/p,(M[1]-a[1])/p,(M[2]-a[2])/p];return{rootPos:[a[0],a[1],a[2]],midPos:M,effectorPos:C,rootRotation:r(I,B),midRotation:r(P,T)}}function o(a,u,l=8,m=.001){let f=a.length;if(f<2)return{positions:a.map(_=>[_[0],_[1],_[2]]),rotations:[],iterations:0};let h=a.map(_=>[_[0],_[1],_[2]]),b=[],d=[],p=0;for(let _=0;_<f-1;_++){let v=h[_+1][0]-h[_][0],G=h[_+1][1]-h[_][1],L=h[_+1][2]-h[_][2],U=Math.hypot(v,G,L);b.push(U),p+=U,d.push(U>1e-6?[v/U,G/U,L/U]:[0,1,0])}let E=[h[0][0],h[0][1],h[0][2]],A=Math.round(n(l,1,32,8)),x=n(m,1e-5,.1,.001),R=u[0]-E[0],I=u[1]-E[1],P=u[2]-E[2],k=Math.hypot(R,I,P),D=0;if(k>=p&&p>1e-6){let _=k>1e-6?[R/k,I/k,P/k]:d[0];h[0]=[E[0],E[1],E[2]];for(let v=0;v<f-1;v++){let G=b[v];h[v+1]=[h[v][0]+_[0]*G,h[v][1]+_[1]*G,h[v][2]+_[2]*G]}D=1}else for(let _=1;_<=A;_++){let v=h[f-1];if(Math.hypot(v[0]-u[0],v[1]-u[1],v[2]-u[2])<=x)break;D=_,h[f-1]=[u[0],u[1],u[2]];for(let L=f-2;L>=0;L--){let U=h[L][0]-h[L+1][0],q=h[L][1]-h[L+1][1],W=h[L][2]-h[L+1][2],K=Math.hypot(U,q,W),Y=b[L];if(K>1e-6){let te=Y/K;h[L]=[h[L+1][0]+U*te,h[L+1][1]+q*te,h[L+1][2]+W*te]}else{let te=d[L];h[L]=[h[L+1][0]-te[0]*Y,h[L+1][1]-te[1]*Y,h[L+1][2]-te[2]*Y]}}h[0]=[E[0],E[1],E[2]];for(let L=0;L<f-1;L++){let U=h[L+1][0]-h[L][0],q=h[L+1][1]-h[L][1],W=h[L+1][2]-h[L][2],K=Math.hypot(U,q,W),Y=b[L];if(K>1e-6){let te=Y/K;h[L+1]=[h[L][0]+U*te,h[L][1]+q*te,h[L][2]+W*te]}else{let te=d[L];h[L+1]=[h[L][0]+te[0]*Y,h[L][1]+te[1]*Y,h[L][2]+te[2]*Y]}}}let S=[];for(let _=0;_<f-1;_++){let v=h[_+1][0]-h[_][0],G=h[_+1][1]-h[_][1],L=h[_+1][2]-h[_][2],U=Math.hypot(v,G,L),q=U>1e-6?[v/U,G/U,L/U]:d[_];S.push(r(d[_],q))}return{positions:h,rotations:S,iterations:D}}function s(a){if(!a||typeof a!="object"||Array.isArray(a))return null;let u=a;if(u.enabled===!1)return null;let l=R=>{if(typeof R!="string")return;let I=R.trim().slice(0,64);return/^[A-Za-z0-9_.:-]+$/.test(I)?I:void 0},m=R=>Array.isArray(R)&&R.length===3&&typeof R[0]=="number"&&Number.isFinite(R[0])&&typeof R[1]=="number"&&Number.isFinite(R[1])&&typeof R[2]=="number"&&Number.isFinite(R[2]),f=l(u.root),h=l(u.effector);if(!f||!h)return null;let b=l(u.mid),d=u.target,p;if(m(d))p=[n(d[0],-1e3,1e3,0),n(d[1],-1e3,1e3,0),n(d[2],-1e3,1e3,0)];else{let R=l(d);if(!R)return null;p=R}let E=u.pole,A=m(E)?[n(E[0],-1e3,1e3,0),n(E[1],-1e3,1e3,0),n(E[2],-1e3,1e3,0)]:void 0,x=u.solver==="fabrik"?"fabrik":u.solver==="two-bone"||b?"two-bone":"fabrik";return{root:f,...b?{mid:b}:{},effector:h,target:p,...A?{pole:A}:{},solver:x,iterations:Math.round(n(u.iterations,1,32,8)),tolerance:n(u.tolerance,1e-5,.1,.001),weight:n(u.weight,0,1,1)}}let c=Object.freeze({solveTwoBone:i,solveFABRIK:o,parseIKTrait:s});return e&&typeof e=="object"&&(e.authorNamespace=e.authorNamespace||{},e.authorNamespace.IKSolver=c),{clampNum:n,parseIKTrait:s,quatFromUnitVectors:r,solveTwoBoneIK:i,solveFABRIK:o,IKSolver:c}}var kt=Er(),as=kt.clampNum,cs=kt.parseIKTrait,Gi=kt.quatFromUnitVectors,_r=kt.solveTwoBoneIK,Cr=kt.solveFABRIK,Xi=kt.IKSolver;function Rr(t){let e=t?.transform??t?.modelMatrix;return e&&e.length>=16?[e[12]||0,e[13]||0,e[14]||0]:[0,0,0]}function Ar(t,e){let n=t?.transform??t?.modelMatrix;!n||n.length<16||(n[12]=e[0],n[13]=e[1],n[14]=e[2])}function Sr(t,e,n,r,i){let o=as(i,0,1,1),s=e[0]+(n[0]-e[0])*o,c=e[1]+(n[1]-e[1])*o,a=e[2]+(n[2]-e[2])*o,u=s-t[0],l=c-t[1],m=a-t[2],f=Math.hypot(u,l,m);if(f>1e-6&&r>1e-6){let h=r/f;return[t[0]+u*h,t[1]+l*h,t[2]+m*h]}return[s,c,a]}function us(t,e,n){if(Array.isArray(t))return[t[0],t[1],t[2]];let r=e.get(t);if(r)return Rr(r);if(t==="head"){let i=n?.headPose?.position??n?.headPose??n?.cameraPosition;if(Array.isArray(i)&&i.length>=3)return[i[0],i[1],i[2]]}else if(t==="hand-left"){let i=n?.handPoses?.left?.position??n?.handPoses?.left??n?.hands?.left?.position??n?.hands?.left;if(Array.isArray(i)&&i.length>=3)return[i[0],i[1],i[2]]}else if(t==="hand-right"){let i=n?.handPoses?.right?.position??n?.handPoses?.right??n?.hands?.right?.position??n?.hands?.right;if(Array.isArray(i)&&i.length>=3)return[i[0],i[1],i[2]]}return null}var Ir={name:"ik",onRegister(){let t=pe();vn(Er),Er(t.threeNamespace,t)},onUpdate(t){let e=t?.meshes;if(!Array.isArray(e)||e.length===0)return;let n=null;for(let r of e){let i=r?.userData?.xr?.ik??r?.extras?.xr?.ik??r?.extensions?.ANDROID_xr_scenecore?.ik;if(!i)continue;let o=cs(i);if(!o||o.weight<=0)continue;if(!n){n=new Map;for(let p of e)p&&typeof p.name=="string"&&p.name&&n.set(p.name,p)}let s=n.get(o.root),c=n.get(o.effector);if(!s||!c)continue;let a=us(o.target,n,t);if(!a)continue;let u=o.mid?n.get(o.mid):void 0,l=u?[s,u,c]:[s,c],m=l.map(p=>p.name||"").join(">");if(!r.__ikRestOffsets||r.__ikRestKey!==m){let p=l.map(Rr),E=[];for(let A=0;A<p.length-1;A++)E.push([p[A+1][0]-p[A][0],p[A+1][1]-p[A][1],p[A+1][2]-p[A][2]]);r.__ikRestOffsets=E,r.__ikRestKey=m}let f=r.__ikRestOffsets,b=[Rr(s)],d=[];for(let p=0;p<f.length;p++){let E=b[p],A=f[p];b.push([E[0]+A[0],E[1]+A[1],E[2]+A[2]]),d.push(Math.hypot(A[0],A[1],A[2]))}if(o.solver==="two-bone"&&u&&b.length===3){let p=_r(b[0],b[1],b[2],a,o.pole),E=Sr(b[0],b[1],p.midPos,d[0],o.weight),A=[E[0]+f[1][0],E[1]+f[1][1],E[2]+f[1][2]],x=[E[0]+(p.effectorPos[0]-p.midPos[0]),E[1]+(p.effectorPos[1]-p.midPos[1]),E[2]+(p.effectorPos[2]-p.midPos[2])],R=Sr(E,A,x,d[1],o.weight);Ar(u,E),Ar(c,R)}else{let p=Cr(b,a,o.iterations,o.tolerance),E=b[0];for(let A=1;A<l.length;A++){let x=f[A-1],R=[E[0]+x[0],E[1]+x[1],E[2]+x[2]],I=[E[0]+(p.positions[A][0]-p.positions[A-1][0]),E[1]+(p.positions[A][1]-p.positions[A-1][1]),E[2]+(p.positions[A][2]-p.positions[A-1][2])],P=Sr(E,R,I,d[A-1],o.weight);Ar(l[A],P),E=P}}}}};function we(){let t=new Float32Array(16);return t[0]=1,t[5]=1,t[10]=1,t[15]=1,t}function Mn(t,e,n,r,i){let o=1/Math.tan(e/2);t.fill(0),t[0]=o/n,t[5]=o,t[11]=-1;let s=1/(r-i);return t[10]=(i+r)*s,t[14]=2*i*r*s,t}function Nt(t,e,n,r){let[i,o,s]=e,[c,a,u]=r,[l,m,f]=n,h=i-l,b=o-m,d=s-f,p=Math.hypot(h,b,d);p<=1e-5?(h=0,b=0,d=1):(h/=p,b/=p,d/=p);let E=a*d-u*b,A=u*h-c*d,x=c*b-a*h;p=Math.hypot(E,A,x),p<=1e-5?(E=0,A=0,x=0):(E/=p,A/=p,x/=p);let R=b*x-d*A,I=d*E-h*x,P=h*A-b*E;return p=Math.hypot(R,I,P),p<=1e-5?(R=0,I=0,P=0):(R/=p,I/=p,P/=p),t[0]=E,t[1]=R,t[2]=h,t[3]=0,t[4]=A,t[5]=I,t[6]=b,t[7]=0,t[8]=x,t[9]=P,t[10]=d,t[11]=0,t[12]=-(E*i+A*o+x*s),t[13]=-(R*i+I*o+P*s),t[14]=-(h*i+b*o+d*s),t[15]=1,t}function Ee(t,e,n){let r=e[0],i=e[1],o=e[2],s=e[3],c=e[4],a=e[5],u=e[6],l=e[7],m=e[8],f=e[9],h=e[10],b=e[11],d=e[12],p=e[13],E=e[14],A=e[15],x=n[0],R=n[1],I=n[2],P=n[3];return t[0]=x*r+R*c+I*m+P*d,t[1]=x*i+R*a+I*f+P*p,t[2]=x*o+R*u+I*h+P*E,t[3]=x*s+R*l+I*b+P*A,x=n[4],R=n[5],I=n[6],P=n[7],t[4]=x*r+R*c+I*m+P*d,t[5]=x*i+R*a+I*f+P*p,t[6]=x*o+R*u+I*h+P*E,t[7]=x*s+R*l+I*b+P*A,x=n[8],R=n[9],I=n[10],P=n[11],t[8]=x*r+R*c+I*m+P*d,t[9]=x*i+R*a+I*f+P*p,t[10]=x*o+R*u+I*h+P*E,t[11]=x*s+R*l+I*b+P*A,x=n[12],R=n[13],I=n[14],P=n[15],t[12]=x*r+R*c+I*m+P*d,t[13]=x*i+R*a+I*f+P*p,t[14]=x*o+R*u+I*h+P*E,t[15]=x*s+R*l+I*b+P*A,t}function rt(t,e,n,r){let i=e[0],o=e[1],s=e[2],c=e[3],a=i+i,u=o+o,l=s+s,m=i*a,f=i*u,h=i*l,b=o*u,d=o*l,p=s*l,E=c*a,A=c*u,x=c*l,R=r[0],I=r[1],P=r[2];return t[0]=(1-(b+p))*R,t[1]=(f+x)*R,t[2]=(h-A)*R,t[3]=0,t[4]=(f-x)*I,t[5]=(1-(m+p))*I,t[6]=(d+E)*I,t[7]=0,t[8]=(h+A)*P,t[9]=(d-E)*P,t[10]=(1-(m+b))*P,t[11]=0,t[12]=n[0],t[13]=n[1],t[14]=n[2],t[15]=1,t}function Le(t,e){let n=e[0],r=e[1],i=e[2],o=e[4],s=e[5],c=e[6],a=e[8],u=e[9],l=e[10],m=l*s-c*u,f=-l*o+c*a,h=u*o-s*a,b=n*m+r*f+i*h;return b&&(b=1/b,t[0]=m*b,t[1]=f*b,t[2]=h*b,t[3]=(-l*r+i*u)*b,t[4]=(l*n-i*a)*b,t[5]=(-u*n+r*a)*b,t[6]=(c*r-i*s)*b,t[7]=(-c*n+i*o)*b,t[8]=(s*n-r*o)*b),t}function An(t,e){let n=e[0],r=e[1],i=e[2],o=e[3],s=e[4],c=e[5],a=e[6],u=e[7],l=e[8],m=e[9],f=e[10],h=e[11],b=e[12],d=e[13],p=e[14],E=e[15],A=n*c-r*s,x=n*a-i*s,R=n*u-o*s,I=r*a-i*c,P=r*u-o*c,k=i*u-o*a,D=l*d-m*b,S=l*p-f*b,_=l*E-h*b,v=m*p-f*d,G=m*E-h*d,L=f*E-h*p,U=A*L-x*G+R*v+I*_-P*S+k*D;return U?(U=1/U,t[0]=(c*L-a*G+u*v)*U,t[1]=(i*G-r*L-o*v)*U,t[2]=(d*k-p*P+E*I)*U,t[3]=(f*P-m*k-h*I)*U,t[4]=(a*_-s*L-u*S)*U,t[5]=(n*L-i*_+o*S)*U,t[6]=(p*R-b*k-E*x)*U,t[7]=(l*k-f*R+h*x)*U,t[8]=(s*G-c*_+u*D)*U,t[9]=(r*_-n*G-o*D)*U,t[10]=(b*P-d*R+E*A)*U,t[11]=(m*R-l*P-h*A)*U,t[12]=(c*S-s*v-a*D)*U,t[13]=(n*v-r*S+i*D)*U,t[14]=(d*x-b*I-p*A)*U,t[15]=(l*I-m*x+f*A)*U,t):null}function Lr(t,e,n,r,i){let o=i[0]*e+i[4]*n+i[8]*r+i[12],s=i[1]*e+i[5]*n+i[9]*r+i[13],c=i[2]*e+i[6]*n+i[10]*r+i[14],a=i[3]*e+i[7]*n+i[11]*r+i[15],u=a!==0?1/a:1;t[0]=o*u,t[1]=s*u,t[2]=c*u}function Hi(t,e,n,r,i,o,s,c,a,u,l,m,f,h,b,d,p=0){let E=u-s,A=l-c,x=m-a,R=f-s,I=h-c,P=b-a,k=i*P-o*I,D=o*R-r*P,S=r*I-i*R,_=E*k+A*D+x*S;if(_>-1e-7&&_<1e-7)return!1;let v=1/_,G=t-s,L=e-c,U=n-a,q=v*(G*k+L*D+U*S);if(q<-p||q>1+p)return!1;let W=L*x-U*A,K=U*E-G*x,Y=G*A-L*E,te=v*(r*W+i*K+o*Y);if(te<-p||q+te>1+p)return!1;let ie=v*(R*W+I*K+P*Y);if(ie>1e-4&&ie<d.distance){d.distance=ie,d.point=[t+r*ie,e+i*ie,n+o*ie];let $=A*P-x*I,ne=x*R-E*P,re=E*I-A*R,O=Math.hypot($,ne,re)||1;return d.normal=[$/O,ne/O,re/O],!0}return!1}function it(t,e){let n=Array.isArray(t?.nodes)?t.nodes.length:0,r=[];for(let l=0;l<n;l++)r.push(we());if(n===0)return r;let i=new Set;for(let l of t.nodes)if(Array.isArray(l.children))for(let m of l.children)i.add(m);let o=new Set,s=128,c=(l,m,f=0)=>{if(f>s||l<0||l>=n||o.has(l))return;o.add(l);let h=t.nodes[l];if(!h)return;let b=we();if(e&&e[l])b.set(e[l]);else if(h.matrix&&h.matrix.length===16)b.set(h.matrix);else{let p=h.translation||[0,0,0],E=h.rotation||[0,0,0,1],A=h.scale||[1,1,1];rt(b,E,p,A)}let d=r[l];if(m?Ee(d,m,b):d.set(b),Array.isArray(h.children))for(let p of h.children)typeof p=="number"&&c(p,d,f+1)},a=[],u=t.scenes&&t.scenes[t.scene!==void 0?t.scene:0];if(u&&Array.isArray(u.nodes))a.push(...u.nodes);else for(let l=0;l<n;l++)i.has(l)||a.push(l);for(let l of a)c(l,null);for(let l=0;l<n;l++)!i.has(l)&&!a.includes(l)&&c(l,null);return r}function ls(t){return new TextDecoder().decode(t)}var Yi=pe().decoders;function ms(t,e){Yi.set(t.toLowerCase(),e)}function Ft(t){return Yi.get(t.toLowerCase())}function ji(t){let e=ArrayBuffer.isView(t)?t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength):t,n=new DataView(e);if(e.byteLength<12)throw new Error(`Invalid GLB buffer size: ${e.byteLength} bytes`);let r=n.getUint32(0,!0);if(r!==1179937895){let f=n.getUint8(0);throw f===123||f===32||f===10||f===13?new Error("[three-live] Multi-file JSON .gltf is not supported for performance reasons. Please pack your asset into a single binary .glb file."):new Error(`Invalid GLB magic: 0x${r.toString(16)}`)}let i=n.getUint32(4,!0);if(i!==2)throw new Error(`Unsupported GLB version: ${i}`);let o=n.getUint32(8,!0),s=12,c=null,a=null;for(;s+8<=o&&s+8<=e.byteLength;){let f=n.getUint32(s,!0),h=n.getUint32(s+4,!0),b=s+8;if(b+f>e.byteLength)throw new Error(`Truncated GLB chunk: required ${b+f} bytes, buffer has ${e.byteLength}`);if(h===1313821514){let d=new Uint8Array(e,b,f),p=ls(d);c=JSON.parse(p,(E,A)=>E==="__proto__"||E==="constructor"||E==="prototype"?void 0:A)}else h===5130562&&(a=e.slice(b,b+f));s=b+f}if(!c)throw new Error("Missing JSON chunk in GLB");let u=c.extensionsRequired||[];if(u.includes("KHR_draco_mesh_compression")&&!Ft("draco"))throw new Error("Model requires KHR_draco_mesh_compression. Register a decoder via ThreeLiveElement.registerDecoder('draco', decoder).");if(u.includes("EXT_meshopt_compression")&&!Ft("meshopt"))throw new Error("Model requires EXT_meshopt_compression. Register a decoder via ThreeLiveElement.registerDecoder('meshopt', decoder).");if(u.includes("KHR_texture_basisu")&&!Ft("ktx2"))throw new Error("Model requires KHR_texture_basisu. Register a decoder via ThreeLiveElement.registerDecoder('ktx2', decoder).");let l=a||new ArrayBuffer(0),m={gltf:c,bin:l,animations:[]};for(let f of Ie)f.onParseGLB?.(m);return m}function fs(t,e,n){return e%4===0?new Float32Array(t,e,n):new Float32Array(t.slice(e,e+n*4))}function hs(t){return typeof t=="object"&&t!==null&&"gltf"in t&&typeof t.gltf=="object"&&t.gltf!==null&&"bin"in t&&(t.bin instanceof ArrayBuffer||ArrayBuffer.isView(t.bin))}function ot(t){if(hs(t))return t;if(t instanceof ArrayBuffer||ArrayBuffer.isView(t))return ji(t);throw new TypeError("Invalid 3D model input: expected GLBData ({ gltf, bin }) or binary GLB (ArrayBuffer / ArrayBufferView).")}var Ki=`#version 300 es
|
|
17
|
+
var Xs=Object.defineProperty;var Ws=(e,t)=>{for(var n in t)Xs(e,n,{get:t[n],enumerable:!0})};var Wi={};Ws(Wi,{AmbientLight:()=>gn,BoxGeometry:()=>hn,BufferAttribute:()=>we,BufferGeometry:()=>je,Camera:()=>vn,CapsuleGeometry:()=>yr,CircleGeometry:()=>xr,Clock:()=>mr,Color:()=>Je,ConeGeometry:()=>Jn,CylinderGeometry:()=>St,DirectionalLight:()=>cr,DodecahedronGeometry:()=>pr,Euler:()=>mn,Float32BufferAttribute:()=>jn,Group:()=>ar,HemisphereLight:()=>wn,IKSolver:()=>fo,IcosahedronGeometry:()=>hr,InstancedMesh:()=>yn,InteractivityVM:()=>_n,Light:()=>Pt,MAX_BSP_DEPTH:()=>so,MAX_CSG_TRIANGLES:()=>oo,MAX_INSTANCES_PER_MESH:()=>bn,MAX_SHAPE_POINTS:()=>co,MAX_TEXT_GEOMETRY_CHARS:()=>ao,Material:()=>st,MathUtils:()=>Ho,Matrix3:()=>Yn,Matrix4:()=>It,Mesh:()=>Lt,MeshBasicMaterial:()=>rr,MeshLambertMaterial:()=>ir,MeshPhongMaterial:()=>or,MeshPhysicalMaterial:()=>sr,MeshStandardMaterial:()=>Ct,Object3D:()=>et,OctahedronGeometry:()=>dr,PerspectiveCamera:()=>ur,PlaneGeometry:()=>Qn,PointLight:()=>xn,PolyhedronFallbackGeometry:()=>Dt,Quaternion:()=>fn,RawShaderMaterial:()=>es,RectAreaLight:()=>ts,RingGeometry:()=>gr,Scene:()=>Tn,SceneQuotaValidator:()=>ot,ShaderMaterial:()=>An,SphereGeometry:()=>dn,SpotLight:()=>vr,THREE:()=>Nt,TetrahedronGeometry:()=>br,Texture:()=>pn,TextureLoader:()=>nr,ThreeLiveElement:()=>at,ThreeView:()=>He,TorusGeometry:()=>er,TorusKnotGeometry:()=>tr,Uint16BufferAttribute:()=>Kn,Uint32BufferAttribute:()=>Zn,Vector2:()=>$n,Vector3:()=>ke,Vector4:()=>qn,WebGLRenderer:()=>lr,activateAR:()=>Sr,applyMeshoptFilter:()=>Fi,authorScriptRunner:()=>Qt,buildSandboxWorkerSource:()=>ci,cadPlugin:()=>Or,clearAuthorWarnings:()=>Jo,computeOutlineClipOffset:()=>Os,contactShadowPlugin:()=>En,createUSDZBlob:()=>jt,crossFadeTo:()=>di,decodeMeshoptBuffer:()=>Ui,decodeMeshoptGLB:()=>Nr,encodeMeshoptBuffer:()=>Ds,environmentMapPlugin:()=>Ri,evaluateKawaseBloom:()=>Us,evaluateToneMapping:()=>Mo,exportSceneToCanvas3D:()=>oi,exportSceneToGLB:()=>si,exportSceneToUSDZ:()=>Wo,extractMaterialVariants:()=>Gi,extractPrimitiveVariantMappings:()=>Vs,generateUSDZ:()=>an,getARCapabilities:()=>Mr,getAllowClientScripts:()=>Yo,getAuthorWarnings:()=>Qo,getBestARMode:()=>us,getEnvironmentSH:()=>fs,getInteractivityVM:()=>Lr,getSandboxEngineSrc:()=>ai,getSandboxIframeSrc:()=>qo,glbToUSDZ:()=>sn,hotspotPlugin:()=>Ci,ikPlugin:()=>Yr,installCadExtension:()=>Fn,interactivityPlugin:()=>Ni,isAllowedSandboxEngineUrl:()=>Et,isQuickLookSupported:()=>Ai,isSceneViewerSupported:()=>wi,isWebXRSupported:()=>Mi,keyframeAnimationPlugin:()=>pi,materialsPlugin:()=>ki,meshoptDecoder:()=>kr,meshoptPlugin:()=>Oi,morphPlugin:()=>bi,noopProxy:()=>un,parseAnimations:()=>hi,parseHexRgb:()=>Bi,parseSafeGltfPointer:()=>Rn,postprocessingPlugin:()=>zi,quatFromUnitVectors:()=>Vn,registerMaterialShader:()=>vs,sampleChannel:()=>en,sceneToCanvas3D:()=>qt,sceneToGLB:()=>on,sceneToUSDZ:()=>Yt,selectMaterialVariant:()=>Bs,sendInteractivityEvent:()=>Di,setAllowClientScripts:()=>_a,setEnvironmentSH:()=>Er,setMorphTargetWeight:()=>os,setSandboxEngineSrc:()=>Ma,setSandboxIframeSrc:()=>Ea,skinningPlugin:()=>gi,solveFABRIK:()=>$r,solveTwoBoneIK:()=>Wr,threeAuthorPlugin:()=>ln,threeMicroPlugin:()=>Ua,toGLBData:()=>ht,toTrustedWorkerScriptURL:()=>$o,validateSandboxWorkerMessage:()=>ui,variantsPlugin:()=>Hi,warnUnsupported:()=>Ke,webxrPlugin:()=>Xi});function io(e,t,n){let r=[],i=new Map,o=[],a=[],u=[],s=new Map,c=b=>{let A=i.get(b);return A===void 0&&(A=r.length,r.push({op:b}),i.set(b,A)),A},l=b=>{let A=s.get(b);return A===void 0&&(A=u.length,u.push({id:b}),s.set(b,A)),A},f=(b,A={})=>o.push({declaration:c(b),...A})-1,m=(b,A,w)=>a.push({id:b,type:A,value:w})-1,h=b=>({node:b,socket:"value"}),p=n?.interactivity??n?.gltfExtensions?.KHR_interactivity;if(p&&typeof p=="object"){let b=Array.isArray(p.graphs)?p.graphs[p.graph??0]:p;if(b&&Array.isArray(b.nodes)){let A=Array.isArray(b.declarations)?b.declarations:[];for(let w of A)w?.op&&c(w.op);Array.isArray(b.variables)&&a.push(...b.variables);for(let w of b.events||[])w?.id&&l(w.id);for(let w of b.nodes){if(!w||typeof w!="object")continue;let P=w.op||(typeof w.declaration=="number"?A[w.declaration]?.op:"");o.push(P?{...w,declaration:c(P)}:{...w})}}}let d=(b,A,w="translation")=>w==="baseColorFactor"||w==="metallicFactor"||w==="roughnessFactor"?`/materials/${Math.max(0,A)}/pbrMetallicRoughness/${w}`:w==="emissiveFactor"||w==="alphaCutoff"?`/materials/${Math.max(0,A)}/${w}`:w==="visible"?`/nodes/${b}/extensions/KHR_node_visibility/visible`:`/nodes/${b}/${w}`,y=new Map;e.forEach((b,A)=>{typeof b?.name=="string"&&!y.has(b.name)&&y.set(b.name,A)});let T=(b,A)=>typeof b.target=="string"&&y.has(b.target)?y.get(b.target):typeof b.targetNode=="number"?b.targetNode:A,S=b=>{let A=e[b];return(typeof A?.mesh=="number"?t[A.mesh]?.primitives?.[0]?.material:0)??0};for(let b=0;b<e.length;b++){let A=e[b],w=A?.extras?.interactivity;if(!w||typeof w!="object")continue;let P=(typeof A.mesh=="number"?t[A.mesh]?.primitives?.[0]?.material:0)??0,N=_=>{let v=Array.isArray(_)?_:[_],g=[];for(let k=0;k<v.length;k++){let R=v[k];if(!R||typeof R!="object")continue;let B=R.action||"interpolate",Z=typeof R.duration=="number"?R.duration:.35;if(B==="toggleTransform"){let j=R.property==="rotation"||R.property==="scale"?R.property:"translation",ie=j==="rotation"?A.rotation||[0,0,0,1]:j==="scale"?A.scale||[1,1,1]:A.translation||[0,0,0],ee=`/nodes/${b}/${j}`,ne=m(`__toggle_${b}_${k}`,"bool",!1),X=f("variable/get",{configuration:{variable:ne}}),ae=f("math/not",{values:{a:h(X)}}),se=f("variable/set",{configuration:{variable:ne},values:{value:h(ae)}}),F=f("pointer/interpolate",{configuration:{pointer:ee},values:{value:{value:Array.isArray(R.to)?R.to:ie},duration:{value:Z}}}),H=f("pointer/interpolate",{configuration:{pointer:ee},values:{value:{value:Array.isArray(R.from)?R.from:ie},duration:{value:Z}}});o[se].flows={out:{node:f("flow/branch",{values:{condition:h(X)},flows:{true:{node:F},false:{node:H}}})}},g.push(se)}else if(B==="interpolate"){let j=R.to??R.value;if(j===void 0)continue;let ie={value:{value:j},duration:{value:Z}};R.from!==void 0&&(ie.from={value:R.from}),g.push(f("pointer/interpolate",{configuration:{pointer:typeof R.pointer=="string"?R.pointer:d(T(R,b),S(T(R,b)),R.property)},values:ie}))}else if(B==="setProperty"){if(R.value===void 0)continue;g.push(f("pointer/set",{configuration:{pointer:typeof R.pointer=="string"?R.pointer:d(T(R,b),S(T(R,b)),R.property)},values:{value:{value:R.value}}}))}else if(B==="toggleVisibility"){let j=T(R,b),ie=m(`__vis_${j}_${k}`,"bool",!0),ee=f("variable/get",{configuration:{variable:ie}}),ne=f("math/not",{values:{a:h(ee)}}),X=f("variable/set",{configuration:{variable:ie},values:{value:h(ne)}});o[X].flows={out:{node:f("pointer/set",{configuration:{pointer:`/nodes/${j}/extensions/KHR_node_visibility/visible`},values:{value:h(ee)}})}},g.push(X)}else if(B==="cycleMaterialColor"&&Array.isArray(R.colors)&&R.colors.length>0){let j=typeof R.duration=="number"?R.duration:.25,ie=`/materials/${Math.max(0,P)}/pbrMetallicRoughness/baseColorFactor`,ee=m(`__color_idx_${b}_${k}`,"int",0),ne=f("variable/get",{configuration:{variable:ee}}),X=f("math/add",{values:{a:h(ne),b:{value:1}}}),ae=f("math/rem",{values:{a:h(X),b:{value:R.colors.length}}}),se=f("variable/set",{configuration:{variable:ee},values:{value:h(ae)}}),F={};for(let H=0;H<R.colors.length;H++){let E=R.colors[H],V=Array.isArray(E)&&E.length>=3?[E[0],E[1],E[2],E[3]??1]:[1,1,1,1];F[String(H)]={node:j>0?f("pointer/interpolate",{configuration:{pointer:ie},values:{value:{value:V},duration:{value:j}}}):f("pointer/set",{configuration:{pointer:ie},values:{value:{value:V}}})}}o[se].flows={out:{node:f("flow/switch",{values:{selection:h(ne)},flows:F})}},g.push(se)}else if(B==="playAnimation")g.push(f("animation/start",{configuration:{animation:R.animation??R.clip??0}}));else if(B==="stopAnimation")g.push(f("animation/stop"));else if(B==="sendEvent"){let j={};for(let[ie,ee]of Object.entries(R.values||{}))j[ie]={value:ee};g.push(f("event/send",{configuration:{event:l(String(R.event??R.id??"custom"))},values:j}))}}if(!g.length)return null;if(g.length===1)return g[0];let M={};return g.forEach((k,R)=>{M[String(R)]={node:k}}),f("flow/sequence",{flows:M})},I=(_,v,g)=>{let M=N(v);M!==null&&f(_,{...g?{configuration:g}:{},flows:{out:{node:M}}})};if(w.onSelect&&I("pointer/onSelect",w.onSelect,{nodeIndex:b}),w.onHoverIn&&I("pointer/onHoverIn",w.onHoverIn,{nodeIndex:b}),w.onHoverOut&&I("pointer/onHoverOut",w.onHoverOut,{nodeIndex:b}),w.onStart&&I("event/onStart",w.onStart),w.onReceive&&typeof w.onReceive=="object")for(let[_,v]of Object.entries(w.onReceive))I("event/receive",v,{event:l(_)})}return o.length?{graphs:[{declarations:r,nodes:o,variables:a,events:u}],graph:0}:null}var Ln='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).',Pn="Security Error: client-side scripts require allow-client-scripts opt-in.";var Dn="__THREE_LIVE_REGISTRY__";function ge(){let e=typeof globalThis<"u"?globalThis:{};if(!e[Dn]){let t={plugins:[],decoders:new Map};try{Object.defineProperty(e,Dn,{value:t,writable:!1,configurable:!1,enumerable:!1})}catch{e[Dn]=t}}return e[Dn]}var Ne=ge().plugins;function Nn(e){let t=ge();t.workerExtensionInstallers||(t.workerExtensionInstallers=[]),t.workerExtensionInstallers.includes(e)||t.workerExtensionInstallers.push(e)}function Fe(e){let t=ge().plugins;t.some(n=>n.name===e.name)||t.push(e),e.onRegister?.()}function kn(){return ge().plugins}var oo=8192,so=2048,ao=128,co=4096;function Fn(e,t){if(!e||!e.BufferGeometry)return null;let n=e.Vector2,r=e.Vector3,i=e.Quaternion,o=e.Matrix4,a=e.Matrix3,u=e.Color,s=e.BufferAttribute,c=e.BufferGeometry,l=e.Material,f=e.MeshStandardMaterial,m=e.Mesh,h=8192,p=2048,d=128,y=4096,T=(D,x)=>{let C=D==null?NaN:Number(D);return Number.isFinite(C)?C:x};class S{constructor(x){this.currentPoint=new n(0,0),this.segments=[],Array.isArray(x)&&x.length>0&&this.fromPoints(x)}fromPoints(x){if(!x.length)return this;this.moveTo(x[0].x,x[0].y);for(let C=1;C<x.length;C++)this.lineTo(x[C].x,x[C].y);return this}moveTo(x,C){let L=Number(x)||0,z=Number(C)||0;return this.currentPoint.set(L,z),this.segments.push({type:"move",pts:[L,z]}),this}lineTo(x,C){let L=Number(x)||0,z=Number(C)||0;return this.segments.length===0&&this.segments.push({type:"move",pts:[this.currentPoint.x,this.currentPoint.y]}),this.currentPoint.set(L,z),this.segments.push({type:"line",pts:[L,z]}),this}quadraticCurveTo(x,C,L,z){let W=this.currentPoint.x,$=this.currentPoint.y,Y=Number(x)||0,Q=Number(C)||0,q=Number(L)||0,J=Number(z)||0;return this.segments.length===0&&this.segments.push({type:"move",pts:[W,$]}),this.currentPoint.set(q,J),this.segments.push({type:"quad",pts:[W,$,Y,Q,q,J]}),this}bezierCurveTo(x,C,L,z,W,$){let Y=this.currentPoint.x,Q=this.currentPoint.y,q=Number(x)||0,J=Number(C)||0,oe=Number(L)||0,te=Number(z)||0,me=Number(W)||0,fe=Number($)||0;return this.segments.length===0&&this.segments.push({type:"move",pts:[Y,Q]}),this.currentPoint.set(me,fe),this.segments.push({type:"cubic",pts:[Y,Q,q,J,oe,te,me,fe]}),this}absarc(x,C,L,z,W,$=!1){return this.absellipse(x,C,L,L,z,W,$,0)}arc(x,C,L,z,W,$=!1){return this.absarc(this.currentPoint.x+(Number(x)||0),this.currentPoint.y+(Number(C)||0),L,z,W,$)}absellipse(x,C,L,z,W,$,Y=!1,Q=0){let q=Number(x)||0,J=Number(C)||0,oe=Math.max(0,Number(L)||0),te=Math.max(0,Number(z)||0),me=Number(W)||0,fe=Number($)||0,he=Y?1:0,de=Number(Q)||0;this.segments.push({type:"arc",pts:[q,J,oe,te,me,fe,he,de]});let ce=Math.cos(de),pe=Math.sin(de),ve=oe*Math.cos(fe),be=te*Math.sin(fe);return this.currentPoint.set(q+ve*ce-be*pe,J+ve*pe+be*ce),this}ellipse(x,C,L,z,W,$,Y=!1,Q=0){return this.absellipse(this.currentPoint.x+(Number(x)||0),this.currentPoint.y+(Number(C)||0),L,z,W,$,Y,Q)}closePath(){if(this.segments.length>0){let x=this.segments[0],C=0,L=0;if(x.type==="arc"){let z=x.pts[0],W=x.pts[1],$=x.pts[2],Y=x.pts[3],Q=x.pts[4],q=x.pts[7],J=Math.cos(q),oe=Math.sin(q),te=$*Math.cos(Q),me=Y*Math.sin(Q);C=z+te*J-me*oe,L=W+te*oe+me*J}else C=x.pts[0],L=x.pts[1];Math.hypot(this.currentPoint.x-C,this.currentPoint.y-L)>1e-6&&this.lineTo(C,L)}return this}getPoints(x=12){let C=Math.max(1,Math.min(128,Math.floor(Number(x)||12))),L=[],z=(W,$)=>{if(L.length>0){let Y=L[L.length-1];if(Math.hypot(Y.x-W,Y.y-$)<1e-6)return}L.push(new n(W,$))};for(let W of this.segments){let $=W.pts;if(W.type==="move"||W.type==="line")z($[0],$[1]);else if(W.type==="quad"){let Y=$[0],Q=$[1],q=$[2],J=$[3],oe=$[4],te=$[5];z(Y,Q);for(let me=1;me<=C;me++){let fe=me/C,he=1-fe;z(he*he*Y+2*he*fe*q+fe*fe*oe,he*he*Q+2*he*fe*J+fe*fe*te)}}else if(W.type==="cubic"){let Y=$[0],Q=$[1],q=$[2],J=$[3],oe=$[4],te=$[5],me=$[6],fe=$[7];z(Y,Q);for(let he=1;he<=C;he++){let de=he/C,ce=1-de,pe=ce*ce,ve=de*de;z(pe*ce*Y+3*pe*de*q+3*ce*ve*oe+ve*de*me,pe*ce*Q+3*pe*de*J+3*ce*ve*te+ve*de*fe)}}else if(W.type==="arc"){let Y=$[0],Q=$[1],q=$[2],J=$[3],oe=$[4],te=$[5],me=$[6]!==0,fe=$[7],he=Math.PI*2,de=te-oe,ce=Math.abs(de)<1e-9;for(;de<0;)de+=he;for(;de>he;)de-=he;de<1e-9&&(de=ce?0:he),me&&!ce&&(de=de===he?-he:de-he);let pe=Math.cos(fe),ve=Math.sin(fe),be=Math.max(2,C);for(let Ce=0;Ce<=be;Ce++){let Se=Ce/be,Ue=oe+Se*de,_e=q*Math.cos(Ue),Le=J*Math.sin(Ue);z(Y+_e*pe-Le*ve,Q+_e*ve+Le*pe)}}}if(L.length>2){let W=L[0],$=L[L.length-1];Math.hypot(W.x-$.x,W.y-$.y)<1e-6&&L.pop()}return L}getSpacedPoints(x=12){return this.getPoints(x)}}class b extends S{constructor(x){super(x),this.holes=[]}extractPoints(x=12){return{shape:this.getPoints(x),holes:this.holes.map(C=>C.getPoints(x))}}}function A(D){let x=0,C=D.length;for(let L=0,z=C-1;L<C;z=L++)x+=D[z].x*D[L].y-D[L].x*D[z].y;return x*.5}function w(D,x,C,L,z,W,$,Y){let Q=$-C,q=Y-L,J=z-C,oe=W-L,te=D-C,me=x-L,fe=Q*Q+q*q,he=Q*J+q*oe,de=Q*te+q*me,ce=J*J+oe*oe,pe=J*te+oe*me,ve=fe*ce-he*he;if(Math.abs(ve)<1e-12)return!1;let be=1/ve,Ce=(ce*de-he*pe)*be,Se=(fe*pe-he*de)*be;return Ce>=-1e-7&&Se>=-1e-7&&Ce+Se<=1+1e-7}function P(D,x){let C=D.slice();A(C)<0&&C.reverse();let L=C.map(Q=>new n(Q.x,Q.y)),z=C.map((Q,q)=>q),W=[];for(let Q of x){if(!Q||Q.length<3)continue;let q=Q.slice();A(q)>0&&q.reverse();let J=[],oe=-1/0,te=0;for(let me=0;me<q.length;me++){let fe=q[me],he=L.length;L.push(new n(fe.x,fe.y)),J.push(he),fe.x>oe&&(oe=fe.x,te=me)}W.push({pts:q,indices:J,maxX:oe,maxIdx:te})}W.sort((Q,q)=>q.maxX-Q.maxX);let $=(Q,q,J)=>(q.x-Q.x)*(J.y-Q.y)-(q.y-Q.y)*(J.x-Q.x),Y=(Q,q,J)=>{for(let oe=0;oe<J.length;oe++){let te=J[oe],me=J[(oe+1)%J.length];if($(Q,q,te)*$(Q,q,me)<0&&$(te,me,Q)*$(te,me,q)<0)return!0}return!1};for(let Q of W){let q=Q.pts[Q.maxIdx],J=q.x,oe=z.length,te=z.map(ce=>L[ce]),me=ce=>Math.hypot(te[ce].x-J,te[ce].y-q.y),fe=te.map((ce,pe)=>pe).sort((ce,pe)=>+(te[ce].x<J)-+(te[pe].x<J)||me(ce)-me(pe)),he=fe[0];for(let ce of fe){let pe=te[ce],ve=te[(ce+oe-1)%oe],be=te[(ce+1)%oe],Ce=$(pe,be,q)>=0,Se=$(ve,pe,q)>=0;if(($(ve,pe,be)>=0?Ce&&Se:Ce||Se)&&!Y(q,pe,te)&&!W.some(_e=>Y(q,pe,_e.pts))){he=ce;break}}let de=[];for(let ce=0;ce<=he;ce++)de.push(z[ce]);for(let ce=0;ce<=Q.indices.length;ce++){let pe=Q.indices[(Q.maxIdx+ce)%Q.indices.length];de.push(pe)}for(let ce=he;ce<z.length;ce++)de.push(z[ce]);z=de}return{merged:z.map(Q=>L[Q]),mergedIndices:z,allVertices:L}}function N(D,x){let C=[],L=D.slice();if(L.length<3)return C;let z=L.length*L.length+64,W=0;for(;L.length>2&&z-- >0;){let $=L.length,Y=L[(W+$-1)%$],Q=L[W%$],q=L[(W+1)%$],J=x[Y],oe=x[Q],te=x[q];if((oe.x-J.x)*(te.y-J.y)-(oe.y-J.y)*(te.x-J.x)>1e-9){let fe=!0;for(let he=0;he<$;he++){let de=L[he];if(de===Y||de===Q||de===q)continue;let ce=x[de];if(w(ce.x,ce.y,J.x,J.y,oe.x,oe.y,te.x,te.y)&&Math.hypot(ce.x-J.x,ce.y-J.y)>=1e-6&&Math.hypot(ce.x-oe.x,ce.y-oe.y)>=1e-6&&Math.hypot(ce.x-te.x,ce.y-te.y)>=1e-6){fe=!1;break}}if(fe){C.push([Y,Q,q]),L.splice(W%$,1),W=Math.max(0,W%$-1);continue}}W++,W>=$*2&&(C.push([Y,Q,q]),L.splice((W-1)%$,1),W=0)}return C}function I(D,x){let C=D instanceof b?D.extractPoints(x):{shape:D.getPoints(x),holes:[]},L=C.shape.length;for(let z of C.holes)L+=z.length;if(L>y)throw new RangeError(`SecurityError: shape point count (${L}) exceeds MAX_SHAPE_POINTS (${y})`);return C}class _ extends c{constructor(x=new b,C=12){super();let L=Array.isArray(x)?x:[x],z=[],W=[],$=[],Y=[];for(let Q of L){if(!(Q instanceof S))continue;let q=I(Q,C);if(q.shape.length<3)continue;let{mergedIndices:J,allVertices:oe}=P(q.shape,q.holes),te=N(J,oe),me=z.length/3,fe=1/0,he=1/0,de=-1/0,ce=-1/0;for(let be of oe)be.x<fe&&(fe=be.x),be.y<he&&(he=be.y),be.x>de&&(de=be.x),be.y>ce&&(ce=be.y);let pe=Math.max(1e-6,de-fe),ve=Math.max(1e-6,ce-he);for(let be of oe)z.push(be.x,be.y,0),W.push(0,0,1),$.push((be.x-fe)/pe,(be.y-he)/ve);for(let[be,Ce,Se]of te)Y.push(me+be,me+Ce,me+Se)}this.setAttribute("position",new s(new Float32Array(z),3)),this.setAttribute("normal",new s(new Float32Array(W),3)),this.setAttribute("uv",new s(new Float32Array($),2)),this.setIndex(Y)}}function v(D){let x=D.length,C=[];for(let L=0;L<x;L++){let z=D[(L+x-1)%x],W=D[L],$=D[(L+1)%x],Y=W.x-z.x,Q=W.y-z.y,q=Math.hypot(Y,Q)||1;Y/=q,Q/=q;let J=$.x-W.x,oe=$.y-W.y,te=Math.hypot(J,oe)||1;J/=te,oe/=te;let me=Q,fe=-Y,he=oe,de=-J,ce=me+he,pe=fe+de,ve=Math.hypot(ce,pe);if(ve>1e-6){ce/=ve,pe/=ve;let be=Math.max(.35,ce*me+pe*fe);C.push(new n(ce/be,pe/be))}else C.push(new n(me,fe))}return C}class g extends c{constructor(x=new b,C={}){super();let L=Array.isArray(x)?x:[x],z=Math.max(1,Math.min(64,Math.floor(T(C.curveSegments,12)))),W=T(C.depth??C.amount,1),$=Math.max(1,Math.min(32,Math.floor(T(C.steps,1)))),Y=!!(C.bevelEnabled??!1),Q=Y?Math.max(0,T(C.bevelThickness,.06)):0,q=Y?Math.max(0,T(C.bevelSize,Q*.8)):0,J=Y?T(C.bevelOffset,0):0,oe=Y?Math.max(1,Math.min(8,Math.floor(T(C.bevelSegments,2)))):0,te=[],me=[],fe=[],he=[];for(let de of L){if(!(de instanceof S))continue;let ce=I(de,z);if(ce.shape.length<3)continue;let pe=ce.shape.slice();A(pe)<0&&pe.reverse();let ve=[];for(let ye of ce.holes){if(ye.length<3)continue;let Ee=ye.slice();A(Ee)>0&&Ee.reverse(),ve.push(Ee)}let{mergedIndices:be,allVertices:Ce}=P(pe,ve),Se=N(be,Ce),Ue=[pe,...ve],_e=[];for(let ye of Ue){let Ee=v(ye);for(let Ie of Ee)_e.push(Ie)}let Le=1/0,Ge=1/0,ze=-1/0,Ye=-1/0;for(let ye of Ce)ye.x<Le&&(Le=ye.x),ye.y<Ge&&(Ge=ye.y),ye.x>ze&&(ze=ye.x),ye.y>Ye&&(Ye=ye.y);let Xe=Math.max(1e-6,ze-Le),nt=Math.max(1e-6,Ye-Ge),Ut=-Q,Ot=W+Q,bt=te.length/3;for(let ye=0;ye<Ce.length;ye++){let Ee=Ce[ye],Ie=_e[ye]??new n(0,0),Oe=Ee.x+Ie.x*J,Ve=Ee.y+Ie.y*J;te.push(Oe,Ve,Ut),me.push(0,0,-1),fe.push((Oe-Le)/Xe,(Ve-Ge)/nt)}for(let[ye,Ee,Ie]of Se)he.push(bt+ye,bt+Ie,bt+Ee);let yt=te.length/3;for(let ye=0;ye<Ce.length;ye++){let Ee=Ce[ye],Ie=_e[ye]??new n(0,0),Oe=Ee.x+Ie.x*J,Ve=Ee.y+Ie.y*J;te.push(Oe,Ve,Ot),me.push(0,0,1),fe.push((Oe-Le)/Xe,(Ve-Ge)/nt)}for(let[ye,Ee,Ie]of Se)he.push(yt+ye,yt+Ee,yt+Ie);let $e=[];if(Y&&oe>0)for(let ye=0;ye<oe;ye++){let Ie=ye/oe*Math.PI/2;$e.push({z:-Q*Math.cos(Ie),expand:J+q*Math.sin(Ie)})}for(let ye=0;ye<=$;ye++){let Ee=ye/$;$e.push({z:Ee*W,expand:J+q})}if(Y&&oe>0)for(let ye=1;ye<=oe;ye++){let Ie=ye/oe*Math.PI/2;$e.push({z:W+Q*Math.sin(Ie),expand:J+q*Math.cos(Ie)})}let rt=0;for(let ye of Ue){let Ee=ye.length;for(let Ie=0;Ie<$e.length-1;Ie++){let Oe=$e[Ie],Ve=$e[Ie+1];for(let qe=0;qe<Ee;qe++){let lt=(qe+1)%Ee,gt=ye[qe],xt=ye[lt],vt=_e[rt+qe],Tt=_e[rt+lt],At=gt.x+vt.x*Oe.expand,wt=gt.y+vt.y*Oe.expand,Rt=xt.x+Tt.x*Oe.expand,mt=xt.y+Tt.y*Oe.expand,Gs=xt.x+Tt.x*Ve.expand,Hs=xt.y+Tt.y*Ve.expand,$i=gt.x+vt.x*Ve.expand,qi=gt.y+vt.y*Ve.expand,Yi=Rt-At,ji=mt-wt,Ki=0,Zi=$i-At,Qi=qi-wt,Ji=Ve.z-Oe.z,Vt=ji*Ji-Ki*Qi,Bt=Ki*Zi-Yi*Ji,zt=Yi*Qi-ji*Zi,Ur=Math.hypot(Vt,Bt,zt)||1;Vt/=Ur,Bt/=Ur,zt/=Ur;let Gt=te.length/3;te.push(At,wt,Oe.z,Rt,mt,Oe.z,Gs,Hs,Ve.z,$i,qi,Ve.z),me.push(Vt,Bt,zt,Vt,Bt,zt,Vt,Bt,zt,Vt,Bt,zt);let eo=qe/Ee,to=(qe+1)/Ee,no=Ie/($e.length-1),ro=(Ie+1)/($e.length-1);fe.push(eo,no,to,no,to,ro,eo,ro),he.push(Gt,Gt+1,Gt+2,Gt,Gt+2,Gt+3)}}rt+=Ee}}this.setAttribute("position",new s(new Float32Array(te),3)),this.setAttribute("normal",new s(new Float32Array(me),3)),this.setAttribute("uv",new s(new Float32Array(fe),2)),this.setIndex(he)}}function M(D){return{x:D.x,y:D.y,z:D.z,nx:D.nx,ny:D.ny,nz:D.nz,u:D.u,v:D.v}}function k(D){return{x:D.x,y:D.y,z:D.z,nx:-D.nx,ny:-D.ny,nz:-D.nz,u:D.u,v:D.v}}function R(D,x,C){let L=D.nx+(x.nx-D.nx)*C,z=D.ny+(x.ny-D.ny)*C,W=D.nz+(x.nz-D.nz)*C,$=Math.hypot(L,z,W)||1;return{x:D.x+(x.x-D.x)*C,y:D.y+(x.y-D.y)*C,z:D.z+(x.z-D.z)*C,nx:L/$,ny:z/$,nz:W/$,u:D.u+(x.u-D.u)*C,v:D.v+(x.v-D.v)*C}}function B(D){if(D.length<3)return null;let x=D[0],C=D[1],L=D[2],z=C.x-x.x,W=C.y-x.y,$=C.z-x.z,Y=L.x-x.x,Q=L.y-x.y,q=L.z-x.z,J=W*q-$*Q,oe=$*Y-z*q,te=z*Q-W*Y,me=Math.hypot(J,oe,te);if(me<1e-9)return null;J/=me,oe/=me,te/=me;let fe=J*x.x+oe*x.y+te*x.z;return{vertices:D,nx:J,ny:oe,nz:te,w:fe}}function Z(D){D.vertices.reverse();for(let x=0;x<D.vertices.length;x++)D.vertices[x]=k(D.vertices[x]);D.nx=-D.nx,D.ny=-D.ny,D.nz=-D.nz,D.w=-D.w}let j=1e-5,ie=0,ee=1,ne=2,X=3;function ae(D,x,C,L,z,W,$,Y,Q){let q=0,J=[];for(let oe=0;oe<z.vertices.length;oe++){let te=z.vertices[oe],me=D*te.x+x*te.y+C*te.z-L,fe=me<-j?ne:me>j?ee:ie;q|=fe,J.push(fe)}switch(q){case ie:{D*z.nx+x*z.ny+C*z.nz>0?W.push(z):$.push(z);break}case ee:Y.push(z);break;case ne:Q.push(z);break;case X:{let oe=[],te=[],me=z.vertices.length;for(let pe=0;pe<me;pe++){let ve=(pe+1)%me,be=J[pe],Ce=J[ve],Se=z.vertices[pe],Ue=z.vertices[ve];if(be!==ne&&oe.push(Se),be!==ee&&te.push(be!==ne?M(Se):Se),(be|Ce)===X){let _e=Ue.x-Se.x,Le=Ue.y-Se.y,Ge=Ue.z-Se.z,ze=D*_e+x*Le+C*Ge,Ye=Math.abs(ze)>1e-12?(L-(D*Se.x+x*Se.y+C*Se.z))/ze:.5,Xe=R(Se,Ue,Math.max(0,Math.min(1,Ye)));oe.push(Xe),te.push(M(Xe))}}let{nx:fe,ny:he,nz:de,w:ce}=z;oe.length>=3&&Y.push({vertices:oe,nx:fe,ny:he,nz:de,w:ce}),te.length>=3&&Q.push({vertices:te,nx:fe,ny:he,nz:de,w:ce});break}default:break}}class se{constructor(x,C=0){this.nx=0,this.ny=0,this.nz=0,this.w=0,this.hasPlane=!1,this.polygons=[],this.front=null,this.back=null,x&&x.length>0&&this.build(x,C)}invert(){for(let C=0;C<this.polygons.length;C++)Z(this.polygons[C]);this.nx=-this.nx,this.ny=-this.ny,this.nz=-this.nz,this.w=-this.w,this.front&&this.front.invert(),this.back&&this.back.invert();let x=this.front;this.front=this.back,this.back=x}clipPolygons(x,C=0){if(!this.hasPlane||x.length===0)return x.slice();if(C>=p)throw new RangeError(`SecurityError: CSG BSP depth exceeds MAX_BSP_DEPTH (${p})`);let L=[],z=[];for(let W=0;W<x.length;W++)ae(this.nx,this.ny,this.nz,this.w,x[W],L,z,L,z);return this.front&&L.length>0&&(L=this.front.clipPolygons(L,C+1)),this.back?z=z.length>0?this.back.clipPolygons(z,C+1):[]:z=[],L.concat(z)}clipTo(x,C=0){this.polygons.length>0&&(this.polygons=x.clipPolygons(this.polygons,0)),C<p&&(this.front&&this.front.clipTo(x,C+1),this.back&&this.back.clipTo(x,C+1))}allPolygons(x=[]){for(let C=0;C<this.polygons.length;C++)x.push(this.polygons[C]);return this.front&&this.front.allPolygons(x),this.back&&this.back.allPolygons(x),x}build(x,C=0){if(!x.length)return;if(!this.hasPlane){let W=x[0];this.nx=W.nx,this.ny=W.ny,this.nz=W.nz,this.w=W.w,this.hasPlane=!0}if(C>=p)throw new RangeError(`SecurityError: CSG BSP depth exceeds MAX_BSP_DEPTH (${p})`);let L=[],z=[];for(let W=0;W<x.length;W++)ae(this.nx,this.ny,this.nz,this.w,x[W],this.polygons,this.polygons,L,z);L.length>0&&(this.front||(this.front=new se),this.front.build(L,C+1)),z.length>0&&(this.back||(this.back=new se),this.back.build(z,C+1))}}function F(D,x){let C=D.attributes.position;if(!C||C.count===0)return[];let L=D.attributes.normal,z=D.attributes.uv,W=D.index?D.index.array:null,$=Math.floor(W?W.length/3:C.count/3);if($>h)throw new RangeError(`SecurityError: CSG input triangle count (${$}) exceeds MAX_CSG_TRIANGLES (${h})`);let Y=x?x.elements:null,Q=Y?Y[0]*(Y[5]*Y[10]-Y[9]*Y[6])-Y[4]*(Y[1]*Y[10]-Y[9]*Y[2])+Y[8]*(Y[1]*Y[6]-Y[5]*Y[2])<0:!1,q=Y?new a().getNormalMatrix(x).elements:null,J=te=>{let me=C.getX(te),fe=C.getY(te),he=C.getZ(te),de=L?L.getX(te):NaN,ce=L?L.getY(te):NaN,pe=L?L.getZ(te):NaN;if(Y&&q){let Ce=Y[0]*me+Y[4]*fe+Y[8]*he+Y[12],Se=Y[1]*me+Y[5]*fe+Y[9]*he+Y[13],Ue=Y[2]*me+Y[6]*fe+Y[10]*he+Y[14];me=Ce,fe=Se,he=Ue;let _e=q[0]*de+q[3]*ce+q[6]*pe,Le=q[1]*de+q[4]*ce+q[7]*pe,Ge=q[2]*de+q[5]*ce+q[8]*pe,ze=Math.hypot(_e,Le,Ge)||1;de=_e/ze,ce=Le/ze,pe=Ge/ze}let ve=z?z.getX(te):0,be=z?z.getY(te):0;return{x:me,y:fe,z:he,nx:de,ny:ce,nz:pe,u:ve,v:be}},oe=[];for(let te=0;te<$;te++){let me=W?W[te*3]:te*3,fe=W?W[te*3+1]:te*3+1,he=W?W[te*3+2]:te*3+2,de=B(Q?[J(me),J(he),J(fe)]:[J(me),J(fe),J(he)]);de&&oe.push(de)}return oe}function H(D){let x=[],C=[],L=[],z=[];for(let $ of D){let Y=$.vertices;if(Y.length<3)continue;let Q=x.length/3;for(let q of Y)x.push(q.x,q.y,q.z),Number.isFinite(q.nx)&&q.nx*q.nx+q.ny*q.ny+q.nz*q.nz>.5?C.push(q.nx,q.ny,q.nz):C.push($.nx,$.ny,$.nz),L.push(q.u,q.v);for(let q=1;q<Y.length-1;q++)z.push(Q,Q+q,Q+q+1)}let W=new c;return W.setAttribute("position",new s(new Float32Array(x),3)),W.setAttribute("normal",new s(new Float32Array(C),3)),W.setAttribute("uv",new s(new Float32Array(L),2)),W.setIndex(z),W}function E(D,x,C){if(D.length+x.length>h)throw new RangeError(`SecurityError: Combined CSG triangle count (${D.length+x.length}) exceeds MAX_CSG_TRIANGLES (${h})`);if(D.length===0)return C==="union"?x:[];if(x.length===0)return C==="intersect"?[]:D;let L=new se(D),z=new se(x);return C==="union"?(L.clipTo(z),z.clipTo(L),z.invert(),z.clipTo(L),z.invert(),L.build(z.allPolygons()),L.allPolygons()):C==="subtract"?(L.invert(),L.clipTo(z),z.clipTo(L),z.invert(),z.clipTo(L),z.invert(),L.build(z.allPolygons()),L.invert(),L.allPolygons()):(L.invert(),z.clipTo(L),z.invert(),L.clipTo(z),z.clipTo(L),L.build(z.allPolygons()),L.invert(),L.allPolygons())}function V(D,x,C,L=null,z=null){let W=F(D,L),$=F(x,z);return H(E(W,$,C))}function O(D,x,C){let L=D instanceof m||!!D?.isMesh,z=x instanceof m||!!x?.isMesh,W=L?D.geometry:D,$=z?x.geometry:x,Y=null;if(z)if(x.updateMatrix(),L){D.updateMatrix();let oe=new o().makeScale(1/(D.scale.x||1),1/(D.scale.y||1),1/(D.scale.z||1)),te=Math.hypot(D.quaternion.x,D.quaternion.y,D.quaternion.z,D.quaternion.w)||1,me=new o().compose(new r(0,0,0),new i(-D.quaternion.x/te,-D.quaternion.y/te,-D.quaternion.z/te,D.quaternion.w/te),new r(1,1,1)),fe=new o().makeTranslation(-D.position.x,-D.position.y,-D.position.z);Y=oe.multiply(me).multiply(fe).multiply(x.matrix)}else Y=x.matrix;let Q=V(W,$,C,null,Y),q=L?D.material:new f,J=new m(Q,q);return L&&(J.position.copy(D.position),J.quaternion.copy(D.quaternion),J.scale.copy(D.scale),J.name=D.name),J}let U={toGeometry:V,subtract(D,x){return O(D,x,"subtract")},union(D,x){return O(D,x,"union")},intersect(D,x){return O(D,x,"intersect")}},G={0:[[[.15,0],[.85,0],[.85,1],[.15,1],[.15,0]]],1:[[[.3,.8],[.5,1],[.5,0]],[[.2,0],[.8,0]]],2:[[[.15,.8],[.3,1],[.7,1],[.85,.8],[.85,.55],[.15,0],[.85,0]]],3:[[[.15,.85],[.3,1],[.75,1],[.85,.75],[.5,.5],[.85,.25],[.75,0],[.3,0],[.15,.15]]],4:[[[.7,0],[.7,1],[.15,.35],[.9,.35]]],5:[[[.85,1],[.2,1],[.15,.55],[.75,.55],[.85,.3],[.75,0],[.2,0]]],6:[[[.8,.9],[.5,1],[.15,.7],[.15,.15],[.5,0],[.85,.2],[.85,.45],[.5,.55],[.15,.45]]],7:[[[.15,1],[.85,1],[.35,0]]],8:[[[.2,.5],[.15,.75],[.3,1],[.7,1],[.85,.75],[.8,.5],[.2,.5],[.15,.2],[.3,0],[.7,0],[.85,.2],[.8,.5]]],9:[[[.85,.55],[.5,.45],[.15,.55],[.15,.85],[.5,1],[.85,.85],[.85,.2],[.5,0],[.2,.1]]],A:[[[.1,0],[.5,1],[.9,0]],[[.25,.35],[.75,.35]]],B:[[[.15,0],[.15,1],[.7,1],[.85,.75],[.7,.5],[.15,.5]],[[.7,.5],[.85,.25],[.7,0],[.15,0]]],C:[[[.85,.8],[.65,1],[.3,1],[.15,.75],[.15,.25],[.3,0],[.65,0],[.85,.2]]],D:[[[.15,0],[.15,1],[.65,1],[.85,.75],[.85,.25],[.65,0],[.15,0]]],E:[[[.85,1],[.15,1],[.15,0],[.85,0]],[[.15,.5],[.7,.5]]],F:[[[.85,1],[.15,1],[.15,0]],[[.15,.5],[.7,.5]]],G:[[[.85,.8],[.65,1],[.3,1],[.15,.75],[.15,.25],[.3,0],[.85,0],[.85,.45],[.55,.45]]],H:[[[.15,0],[.15,1]],[[.85,0],[.85,1]],[[.15,.5],[.85,.5]]],I:[[[.25,1],[.75,1]],[[.5,1],[.5,0]],[[.25,0],[.75,0]]],J:[[[.8,1],[.8,.25],[.6,0],[.3,0],[.15,.25]]],K:[[[.15,0],[.15,1]],[[.85,1],[.15,.45],[.85,0]]],L:[[[.15,1],[.15,0],[.85,0]]],M:[[[.1,0],[.1,1],[.5,.35],[.9,1],[.9,0]]],N:[[[.15,0],[.15,1],[.85,0],[.85,1]]],O:[[[.3,0],[.7,0],[.85,.25],[.85,.75],[.7,1],[.3,1],[.15,.75],[.15,.25],[.3,0]]],P:[[[.15,0],[.15,1],[.7,1],[.85,.75],[.7,.5],[.15,.5]]],Q:[[[.3,0],[.7,0],[.85,.25],[.85,.75],[.7,1],[.3,1],[.15,.75],[.15,.25],[.3,0]],[[.55,.3],[.9,-.05]]],R:[[[.15,0],[.15,1],[.7,1],[.85,.75],[.7,.5],[.15,.5]],[[.55,.5],[.85,0]]],S:[[[.85,.85],[.65,1],[.3,1],[.15,.75],[.85,.25],[.7,0],[.3,0],[.15,.15]]],T:[[[.1,1],[.9,1]],[[.5,1],[.5,0]]],U:[[[.15,1],[.15,.25],[.35,0],[.65,0],[.85,.25],[.85,1]]],V:[[[.1,1],[.5,0],[.9,1]]],W:[[[.05,1],[.25,0],[.5,.65],[.75,0],[.95,1]]],X:[[[.15,1],[.85,0]],[[.85,1],[.15,0]]],Y:[[[.15,1],[.5,.5],[.85,1]],[[.5,.5],[.5,0]]],Z:[[[.15,1],[.85,1],[.15,0],[.85,0]]],".":[[[.45,0],[.55,0],[.55,.12],[.45,.12],[.45,0]]],",":[[[.5,.15],[.4,-.1]]],":":[[[.45,.1],[.55,.1]],[[.45,.7],[.55,.7]]],"-":[[[.2,.5],[.8,.5]]],"+":[[[.2,.5],[.8,.5]],[[.5,.2],[.5,.8]]],"=":[[[.2,.35],[.8,.35]],[[.2,.65],[.8,.65]]],"/":[[[.2,0],[.8,1]]],"!":[[[.5,1],[.5,.28]],[[.5,.1],[.5,0]]],"?":[[[.2,.8],[.35,1],[.7,1],[.85,.75],[.5,.45],[.5,.28]],[[.5,.1],[.5,0]]],"(":[[[.65,1],[.35,.65],[.35,.35],[.65,0]]],")":[[[.35,1],[.65,.65],[.65,.35],[.35,0]]],"%":[[[.2,0],[.8,1]],[[.2,.8],[.35,.8],[.35,.95],[.2,.95],[.2,.8]],[[.65,.05],[.8,.05],[.8,.2],[.65,.2],[.65,.05]]],"#":[[[.32,0],[.32,1]],[[.68,0],[.68,1]],[[.12,.35],[.88,.35]],[[.12,.65],[.88,.65]]],$:[[[.8,.8],[.6,.92],[.3,.92],[.18,.72],[.82,.28],[.7,.08],[.4,.08],[.2,.2]],[[.5,1],[.5,0]]],_:[[[.1,0],[.9,0]]],"[":[[[.65,1],[.3,1],[.3,0],[.65,0]]],"]":[[[.35,1],[.7,1],[.7,0],[.35,0]]],"<":[[[.75,.85],[.25,.5],[.75,.15]]],">":[[[.25,.85],[.75,.5],[.25,.15]]],"*":[[[.5,.2],[.5,.8]],[[.2,.35],[.8,.65]],[[.2,.65],[.8,.35]]],"\\":[[[.2,1],[.8,0]]]};class K extends c{constructor(x="",C={}){super();let L=String(x??"").slice(0,d),z=Math.max(.005,Math.min(100,T(C.size,.2))),W=!!(C.bevelEnabled??!1),$=W?Math.max(0,Math.min(2,T(C.bevelThickness,z*.04))):0,Y=W?Math.max(0,Math.min(2,T(C.bevelSize,z*.03))):0,Q=Math.max(.001,Math.min(20,T(C.depth??C.height,z*.2)))+$*2,q=z*.085+Y,J=z*.68,oe=z*.82,te=[],me=[],fe=[],he=[],de=(ve,be,Ce,Se,Ue,_e,Le)=>{let Ge=Ce-ve,ze=Se-be,Ye=Math.hypot(Ge,ze),Xe=1,nt=0;Ye>1e-6&&(Xe=Ge/Ye,nt=ze/Ye);let Ut=-nt*Ue,Ot=Xe*Ue,bt=Xe*Ue*.6,yt=nt*Ue*.6,$e=ve-bt+Ut,rt=be-yt+Ot,ye=ve-bt-Ut,Ee=be-yt-Ot,Ie=Ce+bt-Ut,Oe=Se+yt-Ot,Ve=Ce+bt+Ut,qe=Se+yt+Ot,lt=(gt,xt,vt,Tt,At,wt,Rt)=>{let mt=te.length/3;te.push(gt[0],gt[1],gt[2],xt[0],xt[1],xt[2],vt[0],vt[1],vt[2],Tt[0],Tt[1],Tt[2]),me.push(At,wt,Rt,At,wt,Rt,At,wt,Rt,At,wt,Rt),fe.push(0,0,1,0,1,1,0,1),he.push(mt,mt+1,mt+2,mt,mt+2,mt+3)};lt([$e,rt,Le],[ye,Ee,Le],[Ie,Oe,Le],[Ve,qe,Le],0,0,1),lt([ye,Ee,_e],[$e,rt,_e],[Ve,qe,_e],[Ie,Oe,_e],0,0,-1),lt([$e,rt,_e],[ye,Ee,_e],[ye,Ee,Le],[$e,rt,Le],-Xe,-nt,0),lt([Ie,Oe,_e],[Ve,qe,_e],[Ve,qe,Le],[Ie,Oe,Le],Xe,nt,0),lt([ye,Ee,_e],[Ie,Oe,_e],[Ie,Oe,Le],[ye,Ee,Le],nt,-Xe,0),lt([Ve,qe,_e],[$e,rt,_e],[$e,rt,Le],[Ve,qe,Le],-nt,Xe,0)},ce=0,pe=0;for(let ve=0;ve<L.length;ve++){let be=L[ve];if(be===`
|
|
18
|
+
`){ce=0,pe-=z*1.35;continue}if(be===" "||be===" "){ce+=oe*(be===" "?.75:3);continue}if(be==="\r")continue;let Ce=be.toUpperCase(),Se=be!==Ce&&be>="a"&&be<="z",Ue=G[Ce]??G["?"],_e=Se?z*.76:z,Le=Se?J*.88:J;for(let Ge of Ue)for(let ze=0;ze<Ge.length-1;ze++){let Ye=Ge[ze],Xe=Ge[ze+1];de(ce+Ye[0]*Le,pe+Ye[1]*_e,ce+Xe[0]*Le,pe+Xe[1]*_e,q,-Q*.5,Q*.5)}ce+=Se?oe*.88:oe}this.setAttribute("position",new s(new Float32Array(te),3)),this.setAttribute("normal",new s(new Float32Array(me),3)),this.setAttribute("uv",new s(new Float32Array(fe),2)),this.setIndex(he),C.center!==!1?this.center():this.computeBoundingBox()}}function ue(D){if(!D)return;let x=D,C=D.userData?.xr?.text;if(C!=null&&C!==!1){let z=x.geometry?.attributes?.position;if((!z||z.count===0)&&D.userData._textApplied!==!0){let W="",$=.08,Y=.015,Q;if(typeof C=="string"||typeof C=="number")W=String(C);else if(typeof C=="object"){let q=C;W=String(q.text??q.value??""),q.size!==void 0&&($=Number(q.size)||.08),(q.depth!==void 0||q.height!==void 0)&&(Y=Number(q.depth??q.height)||$*.2),(typeof q.color=="string"||typeof q.color=="number")&&(Q=q.color)}W.trim().length>0&&(x.geometry=new K(W,{size:$,depth:Y}),D.userData._textApplied=!0,x.material instanceof l?Q!==void 0&&D.userData._autoTextColorApplied!==!0&&(x.material.color=new u(Q),D.userData._autoTextColorApplied=!0):x.material=new f({color:Q??16317180}))}}let L=D.userData?.csg;if(L&&typeof L=="object"&&D.userData._csgApplied!==!0&&x.geometry instanceof c&&x.geometry.attributes.position?.count>0){D.userData._csgApplied=!0;let z=Array.isArray(L)?L:[L],W=x.geometry;for(let $ of z){if(!$||typeof $!="object")continue;let Y=$,Q=String(Y.op??Y.operation??"subtract"),q=Q==="union"||Q==="intersect"?Q:"subtract",J=Y.target??Y.mesh??Y.geometry;if(J instanceof m||J instanceof c)try{let oe=q==="union"?U.union(x,J):q==="intersect"?U.intersect(x,J):U.subtract(x,J);x.geometry!==W&&x.geometry.dispose?.(),x.geometry=oe.geometry}catch(oe){typeof console<"u"&&console.warn("[three-live] userData.csg skipped:",oe)}}}}let re={Path:S,Shape:b,ShapeGeometry:_,ExtrudeGeometry:g,TextGeometry:K,CSG:U,MAX_CSG_TRIANGLES:h,MAX_BSP_DEPTH:p,MAX_TEXT_GEOMETRY_CHARS:d,MAX_SHAPE_POINTS:y,materializeDeclarativeGeometry:ue};return t&&typeof t=="object"&&(t.authorNamespace||(t.authorNamespace={}),Object.assign(t.authorNamespace,re),t.materializeDeclarativeGeometry=ue),re}var Or={name:"cad",onRegister(){Nn(Fn);let e=ge(),t=e.threeNamespace??(typeof globalThis<"u"?globalThis.THREE:void 0);t&&Fn(t,e)}};function Te(){let e=new Float32Array(16);return e[0]=1,e[5]=1,e[10]=1,e[15]=1,e}function Un(e,t,n,r,i){let o=1/Math.tan(t/2);e.fill(0),e[0]=o/n,e[5]=o,e[11]=-1;let a=1/(r-i);return e[10]=(i+r)*a,e[14]=2*i*r*a,e}function Ht(e,t,n,r){let[i,o,a]=t,[u,s,c]=r,[l,f,m]=n,h=i-l,p=o-f,d=a-m,y=Math.hypot(h,p,d);y<=1e-5?(h=0,p=0,d=1):(h/=y,p/=y,d/=y);let T=s*d-c*p,S=c*h-u*d,b=u*p-s*h;y=Math.hypot(T,S,b),y<=1e-5?(T=0,S=0,b=0):(T/=y,S/=y,b/=y);let A=p*b-d*S,w=d*T-h*b,P=h*S-p*T;return y=Math.hypot(A,w,P),y<=1e-5?(A=0,w=0,P=0):(A/=y,w/=y,P/=y),e[0]=T,e[1]=A,e[2]=h,e[3]=0,e[4]=S,e[5]=w,e[6]=p,e[7]=0,e[8]=b,e[9]=P,e[10]=d,e[11]=0,e[12]=-(T*i+S*o+b*a),e[13]=-(A*i+w*o+P*a),e[14]=-(h*i+p*o+d*a),e[15]=1,e}function Re(e,t,n){let r=t[0],i=t[1],o=t[2],a=t[3],u=t[4],s=t[5],c=t[6],l=t[7],f=t[8],m=t[9],h=t[10],p=t[11],d=t[12],y=t[13],T=t[14],S=t[15],b=n[0],A=n[1],w=n[2],P=n[3];return e[0]=b*r+A*u+w*f+P*d,e[1]=b*i+A*s+w*m+P*y,e[2]=b*o+A*c+w*h+P*T,e[3]=b*a+A*l+w*p+P*S,b=n[4],A=n[5],w=n[6],P=n[7],e[4]=b*r+A*u+w*f+P*d,e[5]=b*i+A*s+w*m+P*y,e[6]=b*o+A*c+w*h+P*T,e[7]=b*a+A*l+w*p+P*S,b=n[8],A=n[9],w=n[10],P=n[11],e[8]=b*r+A*u+w*f+P*d,e[9]=b*i+A*s+w*m+P*y,e[10]=b*o+A*c+w*h+P*T,e[11]=b*a+A*l+w*p+P*S,b=n[12],A=n[13],w=n[14],P=n[15],e[12]=b*r+A*u+w*f+P*d,e[13]=b*i+A*s+w*m+P*y,e[14]=b*o+A*c+w*h+P*T,e[15]=b*a+A*l+w*p+P*S,e}function Qe(e,t,n,r){let i=t[0],o=t[1],a=t[2],u=t[3],s=i+i,c=o+o,l=a+a,f=i*s,m=i*c,h=i*l,p=o*c,d=o*l,y=a*l,T=u*s,S=u*c,b=u*l,A=r[0],w=r[1],P=r[2];return e[0]=(1-(p+y))*A,e[1]=(m+b)*A,e[2]=(h-S)*A,e[3]=0,e[4]=(m-b)*w,e[5]=(1-(f+y))*w,e[6]=(d+T)*w,e[7]=0,e[8]=(h+S)*P,e[9]=(d-T)*P,e[10]=(1-(f+p))*P,e[11]=0,e[12]=n[0],e[13]=n[1],e[14]=n[2],e[15]=1,e}function De(e,t){let n=t[0],r=t[1],i=t[2],o=t[4],a=t[5],u=t[6],s=t[8],c=t[9],l=t[10],f=l*a-u*c,m=-l*o+u*s,h=c*o-a*s,p=n*f+r*m+i*h;return p&&(p=1/p,e[0]=f*p,e[1]=m*p,e[2]=h*p,e[3]=(-l*r+i*c)*p,e[4]=(l*n-i*s)*p,e[5]=(-c*n+r*s)*p,e[6]=(u*r-i*a)*p,e[7]=(-u*n+i*o)*p,e[8]=(a*n-r*o)*p),e}function Xt(e,t){let n=t[0],r=t[1],i=t[2],o=t[3],a=t[4],u=t[5],s=t[6],c=t[7],l=t[8],f=t[9],m=t[10],h=t[11],p=t[12],d=t[13],y=t[14],T=t[15],S=n*u-r*a,b=n*s-i*a,A=n*c-o*a,w=r*s-i*u,P=r*c-o*u,N=i*c-o*s,I=l*d-f*p,_=l*y-m*p,v=l*T-h*p,g=f*y-m*d,M=f*T-h*d,k=m*T-h*y,R=S*k-b*M+A*g+w*v-P*_+N*I;return R?(R=1/R,e[0]=(u*k-s*M+c*g)*R,e[1]=(i*M-r*k-o*g)*R,e[2]=(d*N-y*P+T*w)*R,e[3]=(m*P-f*N-h*w)*R,e[4]=(s*v-a*k-c*_)*R,e[5]=(n*k-i*v+o*_)*R,e[6]=(y*A-p*N-T*b)*R,e[7]=(l*N-m*A+h*b)*R,e[8]=(a*M-u*v+c*I)*R,e[9]=(r*v-n*M-o*I)*R,e[10]=(p*P-d*A+T*S)*R,e[11]=(f*A-l*P-h*S)*R,e[12]=(u*_-a*g-s*I)*R,e[13]=(n*g-r*_+i*I)*R,e[14]=(d*b-p*w-y*S)*R,e[15]=(l*w-f*b+m*S)*R,e):null}function Vr(e,t,n,r,i){let o=i[0]*t+i[4]*n+i[8]*r+i[12],a=i[1]*t+i[5]*n+i[9]*r+i[13],u=i[2]*t+i[6]*n+i[10]*r+i[14],s=i[3]*t+i[7]*n+i[11]*r+i[15],c=s!==0?1/s:1;e[0]=o*c,e[1]=a*c,e[2]=u*c}function uo(e,t,n,r,i,o,a,u,s,c,l,f,m,h,p,d,y=0){let T=c-a,S=l-u,b=f-s,A=m-a,w=h-u,P=p-s,N=i*P-o*w,I=o*A-r*P,_=r*w-i*A,v=T*N+S*I+b*_;if(v>-1e-7&&v<1e-7)return!1;let g=1/v,M=e-a,k=t-u,R=n-s,B=g*(M*N+k*I+R*_);if(B<-y||B>1+y)return!1;let Z=k*b-R*S,j=R*T-M*b,ie=M*S-k*T,ee=g*(r*Z+i*j+o*ie);if(ee<-y||B+ee>1+y)return!1;let ne=g*(A*Z+w*j+P*ie);if(ne>1e-4&&ne<d.distance){d.distance=ne,d.point=[e+r*ne,t+i*ne,n+o*ne];let X=S*P-b*w,ae=b*A-T*P,se=T*w-S*A,F=Math.hypot(X,ae,se)||1;return d.normal=[X/F,ae/F,se/F],!0}return!1}function ft(e,t){let n=Array.isArray(e?.nodes)?e.nodes.length:0,r=[];for(let l=0;l<n;l++)r.push(Te());if(n===0)return r;let i=new Set;for(let l of e.nodes)if(Array.isArray(l.children))for(let f of l.children)i.add(f);let o=new Set,a=128,u=(l,f,m=0)=>{if(m>a||l<0||l>=n||o.has(l))return;o.add(l);let h=e.nodes[l];if(!h)return;let p=Te();if(t&&t[l])p.set(t[l]);else if(h.matrix&&h.matrix.length===16)p.set(h.matrix);else{let y=h.translation||[0,0,0],T=h.rotation||[0,0,0,1],S=h.scale||[1,1,1];Qe(p,T,y,S)}let d=r[l];if(f?Re(d,f,p):d.set(p),Array.isArray(h.children))for(let y of h.children)typeof y=="number"&&u(y,d,m+1)},s=[],c=e.scenes&&e.scenes[e.scene!==void 0?e.scene:0];if(c&&Array.isArray(c.nodes))s.push(...c.nodes);else for(let l=0;l<n;l++)i.has(l)||s.push(l);for(let l of s)u(l,null);for(let l=0;l<n;l++)!i.has(l)&&!s.includes(l)&&u(l,null);return r}function Gr(e,t){function n(s,c,l,f){let m=typeof s=="number"?s:Number(s);return Number.isFinite(m)?Math.max(c,Math.min(l,m)):f}function r(s,c){let f=s[0]*c[0]+s[1]*c[1]+s[2]*c[2]+1;if(f<1e-6){if(Math.abs(s[0])>Math.abs(s[2])){let T=Math.hypot(s[1],s[0])||1;return[-s[1]/T,s[0]/T,0,0]}let y=Math.hypot(s[2],s[1])||1;return[0,-s[2]/y,s[1]/y,0]}let m=s[1]*c[2]-s[2]*c[1],h=s[2]*c[0]-s[0]*c[2],p=s[0]*c[1]-s[1]*c[0],d=Math.hypot(m,h,p,f)||1;return[m/d,h/d,p/d,f/d]}function i(s,c,l,f,m){let h=c[0]-s[0],p=c[1]-s[1],d=c[2]-s[2],y=Math.hypot(h,p,d),T=l[0]-c[0],S=l[1]-c[1],b=l[2]-c[2],A=Math.hypot(T,S,b);if(y<1e-6||A<1e-6)return{rootPos:[s[0],s[1],s[2]],midPos:[c[0],c[1],c[2]],effectorPos:[l[0],l[1],l[2]],rootRotation:[0,0,0,1],midRotation:[0,0,0,1]};let w=[h/y,p/y,d/y],P=[T/A,S/A,b/A],N=f[0]-s[0],I=f[1]-s[1],_=f[2]-s[2],v=Math.hypot(N,I,_),g=v>1e-6?[N/v,I/v,_/v]:w,M=Math.abs(y-A)+1e-5,k=Math.max(M,y+A-1e-5),R=Math.max(M,Math.min(k,v>1e-6?v:M)),B=n((y*y+R*R-A*A)/(2*y*R),-1,1,1),Z=Math.sqrt(Math.max(0,1-B*B)),j=m?m[0]-s[0]:h,ie=m?m[1]-s[1]:p,ee=m?m[2]-s[2]:d,ne=j*g[0]+ie*g[1]+ee*g[2],X=j-g[0]*ne,ae=ie-g[1]*ne,se=ee-g[2]*ne,F=Math.hypot(X,ae,se);if(F<=1e-6){let x=Math.abs(g[1])<.99?0:1,C=Math.abs(g[1])<.99?1:0,L=0;X=g[1]*L-g[2]*C,ae=g[2]*x-g[0]*L,se=g[0]*C-g[1]*x,F=Math.hypot(X,ae,se)||1}let H=[X/F,ae/F,se/F],E=[s[0]+g[0]*(y*B)+H[0]*(y*Z),s[1]+g[1]*(y*B)+H[1]*(y*Z),s[2]+g[2]*(y*B)+H[2]*(y*Z)],V=[s[0]+g[0]*R,s[1]+g[1]*R,s[2]+g[2]*R],O=V[0]-E[0],U=V[1]-E[1],G=V[2]-E[2],K=Math.hypot(O,U,G),ue=K>1e-6?[O/K,U/K,G/K]:g,re=[E[0]+ue[0]*A,E[1]+ue[1]*A,E[2]+ue[2]*A],D=[(E[0]-s[0])/y,(E[1]-s[1])/y,(E[2]-s[2])/y];return{rootPos:[s[0],s[1],s[2]],midPos:E,effectorPos:re,rootRotation:r(w,D),midRotation:r(P,ue)}}function o(s,c,l=8,f=.001){let m=s.length;if(m<2)return{positions:s.map(v=>[v[0],v[1],v[2]]),rotations:[],iterations:0};let h=s.map(v=>[v[0],v[1],v[2]]),p=[],d=[],y=0;for(let v=0;v<m-1;v++){let g=h[v+1][0]-h[v][0],M=h[v+1][1]-h[v][1],k=h[v+1][2]-h[v][2],R=Math.hypot(g,M,k);p.push(R),y+=R,d.push(R>1e-6?[g/R,M/R,k/R]:[0,1,0])}let T=[h[0][0],h[0][1],h[0][2]],S=Math.round(n(l,1,32,8)),b=n(f,1e-5,.1,.001),A=c[0]-T[0],w=c[1]-T[1],P=c[2]-T[2],N=Math.hypot(A,w,P),I=0;if(N>=y&&y>1e-6){let v=N>1e-6?[A/N,w/N,P/N]:d[0];h[0]=[T[0],T[1],T[2]];for(let g=0;g<m-1;g++){let M=p[g];h[g+1]=[h[g][0]+v[0]*M,h[g][1]+v[1]*M,h[g][2]+v[2]*M]}I=1}else for(let v=1;v<=S;v++){let g=h[m-1];if(Math.hypot(g[0]-c[0],g[1]-c[1],g[2]-c[2])<=b)break;I=v;let k=(R,B,Z,j,ie)=>{let ee=B[0]-R[0],ne=B[1]-R[1],X=B[2]-R[2],ae=Math.hypot(ee,ne,X);if(ae>1e-6){let se=Z/ae;return[R[0]+ee*se,R[1]+ne*se,R[2]+X*se]}return[R[0]+j[0]*Z*ie,R[1]+j[1]*Z*ie,R[2]+j[2]*Z*ie]};h[m-1]=[c[0],c[1],c[2]];for(let R=m-2;R>=0;R--)h[R]=k(h[R+1],h[R],p[R],d[R],-1);h[0]=[T[0],T[1],T[2]];for(let R=0;R<m-1;R++)h[R+1]=k(h[R],h[R+1],p[R],d[R],1)}let _=[];for(let v=0;v<m-1;v++){let g=h[v+1][0]-h[v][0],M=h[v+1][1]-h[v][1],k=h[v+1][2]-h[v][2],R=Math.hypot(g,M,k),B=R>1e-6?[g/R,M/R,k/R]:d[v];_.push(r(d[v],B))}return{positions:h,rotations:_,iterations:I}}function a(s){if(!s||typeof s!="object"||Array.isArray(s))return null;let c=s;if(c.enabled===!1)return null;let l=b=>{if(typeof b!="string")return;let A=b.trim().slice(0,64);return/^[A-Za-z0-9_.:-]+$/.test(A)?A:void 0},f=b=>Array.isArray(b)&&b.length===3&&b.every(A=>typeof A=="number"&&Number.isFinite(A))?[n(b[0],-1e3,1e3,0),n(b[1],-1e3,1e3,0),n(b[2],-1e3,1e3,0)]:void 0,m=l(c.root),h=l(c.effector);if(!m||!h)return null;let p=l(c.mid),d=f(c.target)??l(c.target);if(!d)return null;let y=c.pole??c.poleTarget,T=f(y)??l(y),S=c.solver==="fabrik"?"fabrik":c.solver==="two-bone"||p?"two-bone":"fabrik";return{root:m,...p?{mid:p}:{},effector:h,target:d,...T?{pole:T}:{},solver:S,iterations:Math.round(n(c.iterations,1,32,8)),tolerance:n(c.tolerance,1e-5,.1,.001),weight:n(c.weight,0,1,1)}}let u=Object.freeze({solveTwoBone:i,solveFABRIK:o,parseIKTrait:a});return t&&typeof t=="object"&&(t.authorNamespace=t.authorNamespace||{},t.authorNamespace.IKSolver=u),{clampNum:n,parseIKTrait:a,quatFromUnitVectors:r,solveTwoBoneIK:i,solveFABRIK:o,IKSolver:u}}var Wt=Gr(),mo=Wt.clampNum,$s=Wt.parseIKTrait,Vn=Wt.quatFromUnitVectors,Wr=Wt.solveTwoBoneIK,$r=Wt.solveFABRIK,fo=Wt.IKSolver;function Hr(e){let t=e?.transform??e?.modelMatrix;return t&&t.length>=16?[t[12]||0,t[13]||0,t[14]||0]:[0,0,0]}function qs(e,t){let n=e?.transform??e?.modelMatrix;!n||n.length<16||(n[12]=t[0],n[13]=t[1],n[14]=t[2])}function Ys(e,t,n,r,i){let o=mo(i,0,1,1),a=t[0]+(n[0]-t[0])*o,u=t[1]+(n[1]-t[1])*o,s=t[2]+(n[2]-t[2])*o,c=a-e[0],l=u-e[1],f=s-e[2],m=Math.hypot(c,l,f);if(m>1e-6&&r>1e-6){let T=r/m;return[e[0]+c*T,e[1]+l*T,e[2]+f*T]}let h=n[0]-e[0],p=n[1]-e[1],d=n[2]-e[2],y=Math.hypot(h,p,d);if(y>1e-6&&r>1e-6){let T=r/y;return[e[0]+h*T,e[1]+p*T,e[2]+d*T]}return[a,u,s]}function js(e,t){let n=e?.modelRootMatrix;if(!n||n.length!==16)return t;let r=new Float32Array(16);return Xt(r,n instanceof Float32Array?n:Float32Array.from(n))?[r[0]*t[0]+r[4]*t[1]+r[8]*t[2]+r[12],r[1]*t[0]+r[5]*t[1]+r[9]*t[2]+r[13],r[2]*t[0]+r[6]*t[1]+r[10]*t[2]+r[14]]:t}function Br(e,t){e.__ikWarned||(e.__ikWarned=new Set);let n=e.__ikWarned;n.has(t)||(n.add(t),console.warn(`[three-live] ik: joint '${t}' on '${e?.name??""}' not found among scene nodes or meshes.`))}function Xr(e,t,n){if(Array.isArray(e))return[e[0],e[1],e[2]];let r=t.get(e);if(r)return Hr(r);let i;if(e==="head"?i=n?.headPose?.position??n?.headPose??n?.cameraPosition:e==="hand-left"?i=n?.handPoses?.left?.position??n?.handPoses?.left??n?.hands?.left?.position??n?.hands?.left:e==="hand-right"&&(i=n?.handPoses?.right?.position??n?.handPoses?.right??n?.hands?.right?.position??n?.hands?.right),(Array.isArray(i)||ArrayBuffer.isView(i))&&i.length>=3){let o=i;return js(n,[o[0],o[1],o[2]])}return null}function zr(e,t){return[e[3]*t[0]+e[0]*t[3]+e[1]*t[2]-e[2]*t[1],e[3]*t[1]-e[0]*t[2]+e[1]*t[3]+e[2]*t[0],e[3]*t[2]+e[0]*t[1]-e[1]*t[0]+e[2]*t[3],e[3]*t[3]-e[0]*t[0]-e[1]*t[1]-e[2]*t[2]]}function Ks(e){return[-e[0],-e[1],-e[2],e[3]]}function qr(e){let t=Math.hypot(e[0],e[1],e[2],e[3]);return t>1e-12?[e[0]/t,e[1]/t,e[2]/t,e[3]/t]:[0,0,0,1]}function Zs(e,t){if(t>=1)return e;if(t<=0)return[0,0,0,1];let[n,r,i,o]=e;o<0&&(n=-n,r=-r,i=-i,o=-o);let a=Math.acos(Math.min(1,o)),u=Math.sin(a);if(u<1e-9)return[0,0,0,1];let s=Math.sin(a*t)/u;return qr([n*s,r*s,i*s,Math.cos(a*t)])}function Qs(e){let t=Math.hypot(e[0],e[1],e[2])||1,n=Math.hypot(e[4],e[5],e[6])||1,r=Math.hypot(e[8],e[9],e[10])||1,i=e[0]/t,o=e[1]/t,a=e[2]/t,u=e[4]/n,s=e[5]/n,c=e[6]/n,l=e[8]/r,f=e[9]/r,m=e[10]/r,h=i+s+m,p;if(h>0){let d=Math.sqrt(h+1)*2;p=[(c-f)/d,(l-a)/d,(o-u)/d,.25*d]}else if(i>s&&i>m){let d=Math.sqrt(1+i-s-m)*2;p=[.25*d,(u+o)/d,(l+a)/d,(c-f)/d]}else if(s>m){let d=Math.sqrt(1+s-i-m)*2;p=[(u+o)/d,.25*d,(f+c)/d,(l-a)/d]}else{let d=Math.sqrt(1+m-i-s)*2;p=[(l+a)/d,(f+c)/d,.25*d,(o-u)/d]}return qr(p)}function Js(e,t,n){let[r,i,o,a]=n,u=1-2*(i*i+o*o),s=2*(r*i-o*a),c=2*(r*o+i*a),l=2*(r*i+o*a),f=1-2*(r*r+o*o),m=2*(i*o-r*a),h=2*(r*o-i*a),p=2*(i*o+r*a),d=1-2*(r*r+i*i);for(let y=0;y<3;y++){let T=t[y*4],S=t[y*4+1],b=t[y*4+2];e[y*4]=u*T+s*S+c*b,e[y*4+1]=l*T+f*S+m*b,e[y*4+2]=h*T+p*S+d*b}}function On(e,t){let n=t[0]-e[0],r=t[1]-e[1],i=t[2]-e[2],o=Math.hypot(n,r,i);return o>1e-9?[n/o,r/o,i/o]:null}function ho(e){e?.normalMatrix&&e?.transform&&De(e.normalMatrix,e.transform)}var lo=new WeakMap;function ea(e){let t=lo.get(e);return t||(t=new Int32Array(e.nodes.length).fill(-1),e.nodes.forEach((n,r)=>{for(let i of Array.isArray(n?.children)?n.children:[])typeof i=="number"&&i>=0&&i<t.length&&(t[i]=r)}),lo.set(e,t)),t}function ta(e,t,n){let r=e?.gltf,i=r?.nodes;if(!Array.isArray(i)||i.length===0)return!1;let o=new Map;i.forEach((v,g)=>{typeof v?.name=="string"&&v.name&&!o.has(v.name)&&o.set(v.name,g)});let u=(t.mid?[t.root,t.mid,t.effector]:[t.root,t.effector]).map(v=>o.get(v));if(u.some(v=>v===void 0))return!1;let s=u,c=ea(r);for(let v=1;v<s.length;v++){let g=c[s[v]],M=0;for(;g>=0&&g!==s[v-1]&&M++<256;)g=c[g];if(g!==s[v-1])return!1}let l=s[0],f=e.initialNodeTransforms,m=new Map,h=[],p=[l];for(;p.length&&h.length<4096;){let v=p.pop();if(m.has(v))continue;let g=f?.[v],M=i[v];m.set(v,{t:g?[g.t[0],g.t[1],g.t[2]]:M?.translation?[...M.translation]:[0,0,0],r:g?[g.r[0],g.r[1],g.r[2],g.r[3]]:M?.rotation?[...M.rotation]:[0,0,0,1],s:g?[g.s[0],g.s[1],g.s[2]]:M?.scale?[...M.scale]:[1,1,1]}),h.push(v);for(let k of Array.isArray(M?.children)?M.children:[])typeof k=="number"&&p.push(k)}let d=c[l],y=d>=0&&e.worldMatrices?.[d]?.length===16?Float32Array.from(e.worldMatrices[d]):Te(),T=new Map,S=()=>{let v=(g,M)=>{let k=m.get(g);if(!k)return;let R=Te();Qe(R,k.r,k.t,k.s);let B=Te();Re(B,M,R),T.set(g,B);for(let Z of Array.isArray(i[g]?.children)?i[g].children:[])typeof Z=="number"&&v(Z,B)};v(l,y)},b=v=>{let g=T.get(v);return[g[12],g[13],g[14]]};S();let A=s.map(b),w=v=>{if(typeof v=="string"&&!n.has(v)){let g=o.get(v),M=g!==void 0?T.get(g)??e.worldMatrices?.[g]:void 0;if(M&&M.length===16)return[M[12],M[13],M[14]]}return Xr(v,n,e)},P=w(t.target);if(!P)return!0;let N=t.pole?w(t.pole)??void 0:void 0,I=po(A,t,P,N),_=mo(t.weight,0,1,1);for(let v=0;v<s.length-1;v++){let g=On(b(s[v]),b(s[v+1])),M=On(I[v],I[v+1]);if(!g||!M)continue;let k=Zs(Vn(g,M),_),R=s[v],B=c[R],Z=B===d||B<0?y:T.get(B)??y,j=Qs(Z),ie=m.get(R);ie.r=qr(zr(Ks(j),zr(k,zr(j,ie.r)))),S()}if(Array.isArray(e.worldMatrices))for(let[v,g]of T)e.worldMatrices[v]?.set&&e.worldMatrices[v].set(g);for(let v of e.meshes??[]){let g=T.get(v?.nodeIndex);g&&v.transform?.set&&(v.transform.set(g),ho(v))}return!0}function po(e,t,n,r){if(t.solver==="two-bone"&&e.length===3){let i=Wr(e[0],e[1],e[2],n,r);return[e[0],i.midPos,i.effectorPos]}return $r(e,n,t.iterations,t.tolerance).positions}function na(e,t,n){let r=e.__ikRestOffsets,i=e.__ikRestMats;if(!(!r||!i))for(let o=0;o<t.length-1;o++){let a=t[o]?.transform??t[o]?.modelMatrix,u=i[o],s=On([0,0,0],r[o]),c=On(n[o],n[o+1]);!a||a.length<16||!u||u.length<16||!s||!c||(Js(a,u,Vn(s,c)),ho(t[o]))}}var Yr={name:"ik",onRegister(){let e=ge();Nn(Gr),Gr(e.threeNamespace,e)},onUpdate(e){let t=e?.meshes;if(!Array.isArray(t)||t.length===0)return;let n=null;for(let r of t){let i=r?.userData?.xr?.ik??r?.extras?.xr?.ik??r?.extensions?.ANDROID_xr_scenecore?.ik;if(!i)continue;let o=$s(i);if(!o||o.weight<=0)continue;if(!n){n=new Map;for(let A of t)A&&typeof A.name=="string"&&A.name&&n.set(A.name,A)}if(ta(e,o,n))continue;let a=n.get(o.root),u=n.get(o.effector),s=o.mid?n.get(o.mid):void 0;if(a||Br(r,o.root),u||Br(r,o.effector),o.mid&&!s&&Br(r,o.mid),!a||!u)continue;let c=Xr(o.target,n,e);if(!c)continue;let l=o.pole?Xr(o.pole,n,e)??void 0:void 0,f=s?[a,s,u]:[a,u],m=f.map(A=>A.name||"").join(">");if(!r.__ikRestOffsets||r.__ikRestKey!==m){let A=f.map(Hr),w=[];for(let P=0;P<A.length-1;P++)w.push([A[P+1][0]-A[P][0],A[P+1][1]-A[P][1],A[P+1][2]-A[P][2]]);r.__ikRestOffsets=w,r.__ikRestKey=m,r.__ikRestMats=f.map(P=>Array.from(P.transform??P.modelMatrix??[]))}let h=r.__ikRestOffsets,d=[Hr(a)],y=[];for(let A=0;A<h.length;A++){let w=d[A],P=h[A];d.push([w[0]+P[0],w[1]+P[1],w[2]+P[2]]),y.push(Math.hypot(P[0],P[1],P[2]))}let T=po(d,o,c,l),S=d[0],b=[d[0]];for(let A=1;A<f.length;A++){let w=h[A-1],P=[S[0]+w[0],S[1]+w[1],S[2]+w[2]],N=[S[0]+(T[A][0]-T[A-1][0]),S[1]+(T[A][1]-T[A-1][1]),S[2]+(T[A][2]-T[A-1][2])],I=Ys(S,P,N,y[A-1],o.weight);qs(f[A],I),S=I,b.push(I)}na(r,f,b)}}};var ra={5120:1,5121:1,5122:2,5123:2,5125:4,5126:4};function it(e,t,n,r){if(!n||n.bufferView===void 0)return null;let i=e.bufferViews?.[n.bufferView];if(!i)return null;let o=Number(n.count??0);if(!Number.isInteger(o)||o<=0)return null;let a=n.componentType??5126,u=ra[a];if(!u)throw new RangeError(`glTF accessor has unsupported componentType ${a}`);let s=u*r,c=i.byteStride&&i.byteStride>0?i.byteStride:s,l=(i.byteOffset||0)+(n.byteOffset||0);if(!Number.isInteger(l)||l<0||c<s||l+(o-1)*c+s>t.byteLength)throw new RangeError(`glTF accessor reads past the end of the binary buffer (${t.byteLength} bytes)`);if(a===5126&&c===s&&l%4===0)return new Float32Array(t,l,o*r);let f=new DataView(t),m=n.normalized===!0,h=new Float32Array(o*r);for(let p=0;p<o;p++){let d=l+p*c;for(let y=0;y<r;y++){let T=d+y*u,S;switch(a){case 5126:S=f.getFloat32(T,!0);break;case 5120:S=f.getInt8(T),m&&(S=Math.max(S/127,-1));break;case 5121:S=f.getUint8(T),m&&(S/=255);break;case 5122:S=f.getInt16(T,!0),m&&(S=Math.max(S/32767,-1));break;case 5123:S=f.getUint16(T,!0),m&&(S/=65535);break;default:S=f.getUint32(T,!0),m&&(S/=4294967295)}h[p*r+y]=S}}return h}function bo(e,t){let n=Number(t.offset?.[0]??0)||0,r=Number(t.offset?.[1]??0)||0,i=Number(t.scale?.[0]??1),o=Number(t.scale?.[1]??1),a=Number(t.rotation??0)||0,u=Math.cos(a),s=Math.sin(a),c=(Number.isFinite(i)?i:1)*u,l=(Number.isFinite(i)?i:1)*s,f=-(Number.isFinite(o)?o:1)*s,m=(Number.isFinite(o)?o:1)*u;for(let h=0;h+1<e.length;h+=2){let p=e[h],d=e[h+1];e[h]=c*p+l*d+n,e[h+1]=f*p+m*d+r}}var vo=["neutral","reinhard","none","aces","agx"];function _t(e){let t=String(e??"").trim().toLowerCase();return vo.includes(t)?t:"neutral"}function ia(e){return vo.indexOf(_t(e))}function oa(e){return new TextDecoder().decode(e)}var To=ge().decoders;function sa(e,t){To.set(e.toLowerCase(),t)}function $t(e){return To.get(e.toLowerCase())}function Ao(e){let t=ArrayBuffer.isView(e)?e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength):e,n=new DataView(t);if(t.byteLength<12)throw new Error(`Invalid GLB buffer size: ${t.byteLength} bytes`);let r=n.getUint32(0,!0);if(r!==1179937895){let m=n.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=n.getUint32(4,!0);if(i!==2)throw new Error(`Unsupported GLB version: ${i}`);let o=n.getUint32(8,!0),a=12,u=null,s=null;for(;a+8<=o&&a+8<=t.byteLength;){let m=n.getUint32(a,!0),h=n.getUint32(a+4,!0),p=a+8;if(p+m>t.byteLength)throw new Error(`Truncated GLB chunk: required ${p+m} bytes, buffer has ${t.byteLength}`);if(h===1313821514){let d=new Uint8Array(t,p,m),y=oa(d);u=JSON.parse(y,(T,S)=>T==="__proto__"||T==="constructor"||T==="prototype"?void 0:S)}else h===5130562&&(s=t.slice(p,p+m));a=p+m}if(!u)throw new Error("Missing JSON chunk in GLB");let c=u.extensionsRequired||[];if(c.includes("KHR_draco_mesh_compression")&&!$t("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)&&!$t("meshopt"))throw new Error(`Model requires ${m}. Register a decoder via ThreeLiveElement.registerDecoder('meshopt', decoder).`);if(c.includes("KHR_texture_basisu")&&!$t("ktx2"))throw new Error("Model requires KHR_texture_basisu. Register a decoder via ThreeLiveElement.registerDecoder('ktx2', decoder).");let l=s||new ArrayBuffer(0),f={gltf:u,bin:l,animations:[]};for(let m of Ne)m.onParseGLB?.(f);return f}function aa(e){return typeof e=="object"&&e!==null&&"gltf"in e&&typeof e.gltf=="object"&&e.gltf!==null&&"bin"in e&&(e.bin instanceof ArrayBuffer||ArrayBuffer.isView(e.bin))}function ht(e){if(aa(e))return e;if(e instanceof ArrayBuffer||ArrayBuffer.isView(e))return Ao(e);throw new TypeError("Invalid 3D model input: expected GLBData ({ gltf, bin }) or binary GLB (ArrayBuffer / ArrayBufferView).")}var wo=`#version 300 es
|
|
19
19
|
layout(location=0) in vec3 aPosition;
|
|
20
20
|
layout(location=1) in vec3 aNormal;
|
|
21
21
|
layout(location=2) in vec2 aUV;
|
|
22
22
|
uniform mat4 uMVP,uModel;
|
|
23
23
|
uniform mat3 uNormalMatrix;
|
|
24
24
|
uniform vec4 uUvTransform;
|
|
25
|
+
layout(location=8) in vec4 aInst0;
|
|
26
|
+
layout(location=9) in vec4 aInst1;
|
|
27
|
+
layout(location=10) in vec4 aInst2;
|
|
28
|
+
layout(location=11) in vec4 aInst3;
|
|
29
|
+
layout(location=12) in vec4 aInstColor;
|
|
30
|
+
uniform int uInstanced;
|
|
31
|
+
uniform mat4 uViewProj;
|
|
32
|
+
out vec4 vInstTint;
|
|
33
|
+
mat4 xrModel(){return uInstanced==1?uModel*mat4(aInst0,aInst1,aInst2,aInst3):uModel;}
|
|
34
|
+
mat4 xrMVP(){return uInstanced==1?uViewProj*xrModel():uMVP;}
|
|
35
|
+
mat3 xrNormalMatrix(){return uInstanced==1?transpose(inverse(mat3(xrModel()))):uNormalMatrix;}
|
|
36
|
+
#define uModel xrModel()
|
|
37
|
+
#define uMVP xrMVP()
|
|
38
|
+
#define uNormalMatrix xrNormalMatrix()
|
|
25
39
|
out vec3 vNormal,vWorldPos;
|
|
26
40
|
out vec2 vUV;
|
|
27
41
|
void main(){
|
|
42
|
+
vInstTint=uInstanced==1?aInstColor:vec4(1.0);
|
|
28
43
|
vec3 rawN=uNormalMatrix*aNormal;
|
|
29
44
|
vNormal=length(rawN)>1e-5?normalize(rawN):vec3(0.0);
|
|
30
45
|
vec4 world=uModel*vec4(aPosition,1.0);
|
|
@@ -33,12 +48,14 @@ vec2 scaleUV=uUvTransform.zw;
|
|
|
33
48
|
if(scaleUV.x==0.0&&scaleUV.y==0.0)scaleUV=vec2(1.0);
|
|
34
49
|
vUV=aUV*scaleUV+uUvTransform.xy;
|
|
35
50
|
gl_Position=uMVP*vec4(aPosition,1.0);
|
|
36
|
-
}`,
|
|
51
|
+
}`,ca=`#version 300 es
|
|
37
52
|
precision highp float;
|
|
38
53
|
in vec3 vNormal,vWorldPos;
|
|
39
54
|
in vec2 vUV;
|
|
40
55
|
uniform vec4 uBaseColor;
|
|
41
|
-
|
|
56
|
+
in vec4 vInstTint;
|
|
57
|
+
#define uBaseColor (uBaseColor*vInstTint)
|
|
58
|
+
uniform float uMetallic,uRoughness,uEmissive,uEnvIntensity,uExposure;
|
|
42
59
|
uniform vec2 uClearcoat;
|
|
43
60
|
uniform vec3 uCameraPos,uAmbientColor;
|
|
44
61
|
uniform sampler2D uBaseColorTexture,uMetallicRoughnessTexture,uNormalTexture,uOcclusionTexture,uEnvironmentMap;
|
|
@@ -219,23 +236,24 @@ if(uClearcoat.x>0.0){
|
|
|
219
236
|
vec3 ccF=F_SchlickRoughness(vec3(0.04),uClearcoat.y,NoV)*uClearcoat.x;
|
|
220
237
|
color=color*(vec3(1.0)-ccF)+getStudioRadiance(R,uClearcoat.y)*ccF*uEnvIntensity;
|
|
221
238
|
}
|
|
239
|
+
color*=uExposure;
|
|
222
240
|
color=applyToneMapping(color,uToneMapping);
|
|
223
241
|
float outAlpha=base.a;
|
|
224
242
|
/*XRD_O*/
|
|
225
243
|
fragColor=vec4(color,outAlpha);
|
|
226
|
-
}`;function
|
|
244
|
+
}`;function Mo(e,t,n=1){t=_t(t);let r=Number.isFinite(n)?Math.max(0,n):1,i=Math.max(0,(Number(e[0])||0)*r),o=Math.max(0,(Number(e[1])||0)*r),a=Math.max(0,(Number(e[2])||0)*r),u=T=>Math.max(0,Math.min(1,T));if(t==="none")return[u(i),u(o),u(a)];if(t==="reinhard")return[i/(i+1),o/(o+1),a/(a+1)];if(t==="aces"){let T=S=>{let b=S*.6;return u(b*(2.51*b+.03)/(b*(2.43*b+.59)+.14))};return[T(i),T(o),T(a)]}if(t==="agx"){let T=.84247906*i+.0784336*o+.07922375*a,S=.04232824*i+.87846864*o+.07916613*a,b=.04237565*i+.0784336*o+.87914297*a,A=g=>{let M=u((Math.log2(Math.max(g,1e-6))+12.47393)/16.5),k=M*M,R=k*k;return 15.5*R*k-40.14*R*M+31.96*R-6.868*k*M+.4298*k+.1191*M-.00232},w=A(T),P=A(S),N=A(b),I=1.196879*w-.09802088*P-.09902974*N,_=-.05289685*w+1.15190313*P-.09896118*N,v=-.05297164*w-.09804345*P+1.15107367*N;return[u(Math.pow(Math.max(I,0),2.2)),u(Math.pow(Math.max(_,0),2.2)),u(Math.max(0,Math.pow(Math.max(v,0),2.2)))]}let s=.76,c=.15,l=Math.min(i,o,a),f=l<.08?l-6.25*l*l:.04;i-=f,o-=f,a-=f;let m=Math.max(i,o,a);if(m<s)return[u(i),u(o),u(a)];let h=1-s,p=1-h*h/(m+h-s),d=p/m;i*=d,o*=d,a*=d;let y=1-1/(c*(m-p)+1);return[u(i+(p-i)*y),u(o+(p-o)*y),u(a+(p-a)*y)]}var ua=`#version 300 es
|
|
227
245
|
layout(location=0) in vec3 aPosition;
|
|
228
246
|
uniform mat4 uMVP;
|
|
229
|
-
void main(){gl_Position=uMVP*vec4(aPosition,1.0);}`,
|
|
247
|
+
void main(){gl_Position=uMVP*vec4(aPosition,1.0);}`,la=`#version 300 es
|
|
230
248
|
precision highp float;
|
|
231
249
|
uniform vec4 uColorId;
|
|
232
250
|
out vec4 fragColor;
|
|
233
|
-
void main(){fragColor=uColorId;}`;function Wi(t,e,n){let r=t.createShader(e);if(t.shaderSource(r,n),t.compileShader(r),!t.getShaderParameter(r,35713)){let i=t.getShaderInfoLog(r);throw t.deleteShader(r),new Error(`Shader compile error: ${i}`)}return r}function Dr(t,e,n){let r=Wi(t,35633,e),i=Wi(t,35632,n),o=t.createProgram();if(t.attachShader(o,r),t.attachShader(o,i),t.linkProgram(o),!t.getProgramParameter(o,35714)){let s=t.getProgramInfoLog(o);throw t.deleteProgram(o),new Error(`Program link error: ${s}`)}return o}function kr(t,e,n){let r={};for(let i of n)r[i]=t.getUniformLocation(e,i);return r}var $i=["uMVP","uModel","uNormalMatrix","uUvTransform","uBaseColor","uMetallic","uRoughness","uClearcoat","uEmissive","uCameraPos","uBaseColorTexture","uHasTexture","uMetallicRoughnessTexture","uHasMetallicRoughnessTexture","uNormalTexture","uHasNormalTexture","uNormalScale","uOcclusionTexture","uHasOcclusionTexture","uOcclusionStrength","uToneMapping","uEnvironmentMap","uHasEnvironmentMap","uAmbientColor","uNumDirLights","uDirLightDir","uDirLightColor","uNumPointLights","uPointLightPos","uPointLightColor","uEnvIntensity","uViewportSize","uSectionPlane","uSectionEnabled"];function Qi(){let t=pe().xrDepthShader;return{fs:ds.replace("/*XRD_U*/",t?.uniformsGLSL||"").replace("/*XRD_O*/",t?.occlusionGLSL||""),uniforms:t?[...$i,...t.uniformNames]:$i}}function ys(t){if(typeof t!="string")return null;let e=t.trim();if(!e||/[\x00-\x1f\x7f]/.test(e))return null;let n=e.toLowerCase();return n.startsWith("data:")?/^data:image\/(png|jpeg|jpg|webp|ktx2|avif)(;|,)/i.test(e)?e:null:n.startsWith("https://")||n.startsWith("blob:")?e:n.startsWith("//")||/^[a-z][a-z0-9+.-]*:/i.test(e)||/(^|[\\/])\.\.([\\/]|$)/.test(e)?null:e}function Pr(t,e,n,r,i,o,s){if(r===void 0||!e.accessors?.[r])return null;let c=e.accessors[r],a=e.bufferViews[c.bufferView],u=(a.byteOffset||0)+(c.byteOffset||0),l=a.byteStride&&a.byteStride>o*4?a.byteStride>>2:o,m;if(l===o)m=new Float32Array(n,u,c.count*o);else{m=new Float32Array(c.count*o);let h=new Float32Array(n,a.byteOffset||0,Math.floor(a.byteLength/4)),b=(c.byteOffset||0)>>2;for(let d=0;d<c.count;d++){let p=b+d*l;for(let E=0;E<o;E++)m[d*o+E]=h[p+E]}}let f=t.createBuffer();return s.push(f),t.bindBuffer(34962,f),t.bufferData(34962,m,35044),t.enableVertexAttribArray(i),t.vertexAttribPointer(i,o,5126,!1,0,0),m}var Ji=Object.freeze({maxMeshes:1e3,maxTextures:64,maxVertices:1e6,maxIndices:3e6}),eo=Object.freeze({maxMeshes:1/0,maxTextures:1/0,maxVertices:1/0,maxIndices:1/0});function qi(t,e,n=eo,r){if(!e||!e.gltf)throw new Error("Invalid GLBData passed to buildGpuScene: missing gltf object.");let{gltf:i}=e,o=Ft("meshopt");o?.decodeBufferViews&&o.decodeBufferViews(i,e);let s=e.bin,c=[],a=[],u=i.extensions?.KHR_materials_variants;if(u&&Array.isArray(u.variants))for(let v of u.variants)v&&typeof v.name=="string"&&a.push(v.name);let l=it(i),m=[];if(Array.isArray(i.nodes))for(let v=0;v<i.nodes.length;v++){let G=i.nodes[v];G.mesh!==void 0&&i.meshes&&i.meshes[G.mesh]&&m.push({node:G,nodeIdx:v,meshIdx:G.mesh})}let f=m.length>0?m:(i.meshes||[]).map((v,G)=>({node:v,nodeIdx:-1,meshIdx:G})),h=[];if(Array.isArray(e.lights)&&e.lights.length>0)h.push(...e.lights);else if(i.extensions?.KHR_lights_punctual?.lights){let v=i.extensions.KHR_lights_punctual.lights;for(let G of v){let L=G.type==="directional"?"directional":G.type==="point"?"point":"ambient";h.push({type:L,color:G.color||[1,1,1],intensity:G.intensity!==void 0?G.intensity:1})}}if(h.length===0&&(h.push({type:"ambient",color:[1,1,1],intensity:.35}),h.push({type:"directional",color:[1,1,1],intensity:.85,direction:[.5,1,.8]})),f.length>n.maxMeshes)throw new Error(`SecurityError: GLB scene exceeds host mesh limit (${n.maxMeshes}). Found: ${f.length}`);let b=[];if(i.textures&&i.images){if(i.textures.length>n.maxTextures)throw new Error(`SecurityError: GLB scene exceeds host texture limit (${n.maxTextures}). Found: ${i.textures.length}`);for(let v=0;v<i.textures.length;v++){let G=i.textures[v],L=i.images[G.source];if(L){let U=t.createTexture();if(t.bindTexture(3553,U),t.texImage2D(3553,0,6408,1,1,0,6408,5121,new Uint8Array([255,255,255,255])),t.texParameteri(3553,10242,10497),t.texParameteri(3553,10243,10497),t.texParameteri(3553,10241,9729),t.texParameteri(3553,10240,9729),L.bufferView!==void 0){let q=i.bufferViews[L.bufferView],W=s.slice(q.byteOffset||0,(q.byteOffset||0)+q.byteLength),K=new Blob([W],{type:L.mimeType||"image/png"});typeof createImageBitmap=="function"&&createImageBitmap(K).then(Y=>{t.bindTexture(3553,U),t.texImage2D(3553,0,6408,6408,5121,Y),t.generateMipmap(3553),r?.()}).catch(()=>{})}else if(L.uri){let q=ys(L.uri);if(q){let W=new Image;W.crossOrigin="anonymous",W.referrerPolicy="no-referrer",W.onload=()=>{t.bindTexture(3553,U),t.texImage2D(3553,0,6408,6408,5121,W),t.generateMipmap(3553),r?.()},W.src=q}else console.warn("[Three-Live Security] Blocked unsafe glTF image URI:",L.uri)}b.push(U)}else b.push(null)}}let d=[1/0,1/0,1/0],p=[-1/0,-1/0,-1/0],E=0,A=0;for(let v=0;v<f.length;v++){let G=f[v],L=i.meshes[G.meshIdx],U=G.nodeIdx>=0?l[G.nodeIdx]:we(),q=new Float32Array(9);Le(q,U);let W={name:G.node.name||L.name||`Mesh_${G.meshIdx}`,nodeIndex:G.nodeIdx,transform:U,normalMatrix:q,primitives:[],extras:G.node.extras||L.extras},K=G.node?.extensions?.EXT_mesh_gpu_instancing;if(K&&K.attributes&&typeof K.attributes=="object"){let Y=K.attributes,te=Y.TRANSLATION!==void 0?i.accessors?.[Y.TRANSLATION]:null,ie=Y.ROTATION!==void 0?i.accessors?.[Y.ROTATION]:null,$=Y.SCALE!==void 0?i.accessors?.[Y.SCALE]:null,ne=Y._COLOR_0!==void 0?i.accessors?.[Y._COLOR_0]:null,re=Number(te?.count??ie?.count??$?.count??0);if(!Number.isFinite(re)||re<0||re>1e4)throw new Error(`SecurityError: EXT_mesh_gpu_instancing exceeds maximum instance limit (10000). Found: ${re}`);if(re>0){let O=(T,C)=>{if(!T||T.bufferView===void 0||!i.bufferViews?.[T.bufferView])return null;let w=(i.bufferViews[T.bufferView].byteOffset||0)+(T.byteOffset||0);return fs(s,w,re*C)},X=O(te,3),M=O(ie,4),N=O($,3),z=ne?.type==="VEC4"?4:3,V=O(ne,z),y=new Float32Array(re*16),g=we();for(let T=0;T<re;T++){let C=X?[X[T*3],X[T*3+1],X[T*3+2]]:[0,0,0],B=M?[M[T*4],M[T*4+1],M[T*4+2],M[T*4+3]]:[0,0,0,1],w=N?[N[T*3],N[T*3+1],N[T*3+2]]:[1,1,1];rt(g,B,C,w),y.set(g,T*16)}if(W.instanceMatrices=y,V){let T=new Float32Array(re*3);for(let C=0;C<re;C++)T[C*3]=V[C*z],T[C*3+1]=V[C*z+1],T[C*3+2]=V[C*z+2];W.instanceColors=T}}}for(let Y of L.primitives||[]){if(Y.extensions?.KHR_draco_mesh_compression){let me=Ft("draco");me&&me.decodePrimitive(i,Y,s)}let te=[],ie=t.createVertexArray();t.bindVertexArray(ie);let $=i.accessors[Y.attributes.POSITION],ne=Number($?.count??0);if(!Number.isFinite(ne)||ne<0||E+ne>n.maxVertices)throw new Error(`SecurityError: GLB scene exceeds host vertex limit (${n.maxVertices}).`);if(E+=ne,$?.min&&$?.max){let me=ge=>{for(let Te=0;Te<3;Te++){let ye=ge[12+Te],ve=ge[12+Te];for(let _e=0;_e<3;_e++){let Ue=ge[_e*4+Te]*$.min[_e],Ve=ge[_e*4+Te]*$.max[_e];ye+=Ue<Ve?Ue:Ve,ve+=Ue>Ve?Ue:Ve}ye<d[Te]&&(d[Te]=ye),ve>p[Te]&&(p[Te]=ve)}};if(W.instanceMatrices&&W.instanceMatrices.length>=16){let ge=W.instanceMatrices.length>>4,Te=we();for(let ye=0;ye<ge;ye++){let ve=W.instanceMatrices.subarray(ye*16,ye*16+16);Ee(Te,U,ve),me(Te)}}else me(U)}let re=Pr(t,i,s,Y.attributes.POSITION,0,3,te);Pr(t,i,s,Y.attributes.NORMAL,1,3,te),Pr(t,i,s,Y.attributes.TEXCOORD_0,2,2,te);let O=0,X=5123,M=null;if(Y.indices!==void 0){let me=i.accessors[Y.indices],Te=(i.bufferViews[me.bufferView].byteOffset||0)+(me.byteOffset||0);if(O=Number(me.count??0),!Number.isFinite(O)||O<0||A+O>n.maxIndices)throw new Error(`SecurityError: GLB scene exceeds host index limit (${n.maxIndices}).`);A+=O,X=me.componentType===5125?5125||5125:5123||5123;let ye=t.createBuffer();te.push(ye),t.bindBuffer(34963,ye),me.componentType===5125?(M=new Uint32Array(s,Te,me.count),t.bufferData(34963,M,35044)):(M=new Uint16Array(s,Te,me.count),t.bufferData(34963,M,35044))}else O=$.count;let N={};for(let me of Ie)if(me.onBuildPrimitiveVAO){let ge=me.onBuildPrimitiveVAO(t,ie,Y,i,s);ge&&(N[me.name]=ge)}t.bindVertexArray(null);let z=i.materials&&Y.material!==void 0?i.materials[Y.material]:null,V=Qi(),y=Ki,g=V.fs,T=!1;for(let me of Ie)if(me.onResolveShader){let ge=me.onResolveShader(Y,z,y,g);ge&&(y=ge.vs,g=ge.fs,T=!0)}let C=T?Dr(t,y,g):null,B=C?kr(t,C,V.uniforms):null,w=z?.pbrMetallicRoughness,F=w?.baseColorFactor||[.8,.8,.8,1],H=w?.metallicFactor??.1,J=w?.roughnessFactor??.5,Z=z?.extensions?.KHR_materials_clearcoat,ee=Z?Z.clearcoatFactor??1:0,j=Math.max(.04,Z?.clearcoatRoughnessFactor??.04),Q=w?.baseColorTexture!==void 0&&b[w.baseColorTexture.index]?b[w.baseColorTexture.index]:null,se=w?.metallicRoughnessTexture!==void 0&&b[w.metallicRoughnessTexture.index]?b[w.metallicRoughnessTexture.index]:null,oe=z?.normalTexture!==void 0&&b[z.normalTexture.index]?b[z.normalTexture.index]:null,ce=z?.normalTexture?.scale??1,ue=z?.occlusionTexture!==void 0&&b[z.occlusionTexture.index]?b[z.occlusionTexture.index]:null,le=z?.occlusionTexture?.strength??1,de=!!(z?.extensions?.KHR_materials_transmission||N.materials?.isTransmissive),be=Y.extensions?.KHR_materials_variants?.mappings,he=Array.isArray(be)?be.filter(me=>me&&typeof me.material=="number"&&Array.isArray(me.variants)).map(me=>({material:me.material|0,variants:me.variants.map(ge=>Number(ge)|0)})):void 0;W.primitives.push({vao:ie,indexCount:O,indexType:X,baseColor:F,metallic:H,roughness:J,clearcoat:ee,clearcoatRoughness:j,positions:re,indices:M,texture:Q,metallicRoughnessTexture:se,normalTexture:oe,occlusionTexture:ue,normalScale:ce,occlusionStrength:le,buffers:te,materialIndex:Y.material,defaultMaterialIndex:Y.material,variantMappings:he,pluginData:N,customProgram:C,customUniforms:B,isTransmissive:de})}c.push(W)}isFinite(d[0])||(d=[-1,-1,-1]),isFinite(p[0])||(p=[1,1,1]);let x=[(d[0]+p[0])/2,(d[1]+p[1])/2,(d[2]+p[2])/2],R=p[0]-d[0],I=p[1]-d[1],P=p[2]-d[2],k=Math.max(Math.hypot(R,I,P)/2,.5),D=[d[0],d[1],d[2]],S=[p[0],p[1],p[2]],_=e.animations;if(!_){for(let v of Ie)if(v.onParseGLB?.(e),e.animations){_=e.animations;break}}return _||(_=[]),{meshes:c,bounds:{center:x,radius:k,min:D,max:S},lights:h,animations:_,worldMatrices:l,gpuTextures:b,availableVariants:a}}var Fe=class{constructor(e,n,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=we();this.clearColor=[0,0,0,0];this.envIntensity=1;this.shadowIntensity=0;this.shadowSoftness=.5;this.toneMapping="neutral";this.environmentTexture=null;this.animations=[];this.currentClip=null;this.animationTime=0;this.isPlayingAnimation=!1;this.autoplay=!1;this.animationName="";this.gpuTextures=[];this.availableVariants=[];this.activeVariantName=null;this.gltf=null;this.worldMatrices=[];this.initialNodeTransforms=[];this.projMatrix=we();this.viewMatrix=we();this.modelMatrix=we();this.mvpMatrix=we();this.normalMatrix=new Float32Array(9);this.initialTheta=.6;this.initialPhi=.35;this.initialDistance=null;this.customDistance=!1;this.distanceMode="auto";this.initialCustomTarget=null;this.customTarget=null;this.fov=Math.PI/4;this.minTheta=-1/0;this.maxTheta=1/0;this.minPhi=-Math.PI*.48;this.maxPhi=Math.PI*.48;this.minDistanceLimit=null;this.maxDistanceLimit=null;this.activePointers=new Map;this.isPanning=!1;this.targetTheta=.6;this.currTheta=.6;this.targetPhi=.35;this.currPhi=.35;this.targetDistance=3;this.currDistance=3;this.autoRotate=!1;this.autoRotateSpeed=Math.PI/6;this.autoRotateDelay=3e3;this.lastInteractionTime=-1/0;this.turntableRotation=0;this.isPointerDown=!1;this.interactive=!0;this.skyboxTexture=null;this.lastPointerX=0;this.lastPointerY=0;this.totalDragDist=0;this.selectedMeshName="";this.pickFbo=null;this.pickTexture=null;this.pickDepth=null;this.pickFboWidth=0;this.pickFboHeight=0;this.animFrameId=null;this.isVisible=!0;this.xrSessionActive=!1;this.lastTime=0;this.lastReportedTheta=-999;this.lastReportedPhi=-999;this.lastReportedZoom=-999;this.boundPointerDown=null;this.boundPointerMove=null;this.boundPointerUp=null;this.boundWheel=null;this.boundKeyDown=null;this.boundContextMenu=null;this.boundSetCamera=null;this.boundResetCamera=null;this.stereoSBS=!1;this.renderErrorReported=!1;this.xrDepthState={enabled:!1,texture:null,uvTransform:we(),rawValueToMeters:.001,format:0};this.container=e;let i,o;if(n&&typeof n.getContext=="function"?(i=n,o=r):(o=n,i=o?.canvas),!i){let u=e.querySelector("canvas");u||(u=document.createElement("canvas"),u.style.width="100%",u.style.height="100%",u.style.display="block",u.style.touchAction="none",e.prepend(u)),i=u}this.canvas=i,this.opts=o||{},this.opts.clearColor&&(this.clearColor=this.opts.clearColor);let s=typeof window<"u"&&typeof window.matchMedia=="function"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches;this.opts.autoRotate!==void 0?this.autoRotate=this.opts.autoRotate&&!s:s&&(this.autoRotate=!1),this.opts.autoRotateSpeed!==void 0&&(this.autoRotateSpeed=this.opts.autoRotateSpeed),this.opts.autoRotateDelay!==void 0&&(this.autoRotateDelay=Math.max(0,Number(this.opts.autoRotateDelay)||0)),this.opts.exposure!==void 0&&(this.envIntensity=Math.max(0,Number(this.opts.exposure))),this.opts.camera&&this.setInitialCamera(this.opts.camera.theta,this.opts.camera.phi,this.opts.camera.distance,this.opts.camera.zoom),this.opts.shadowIntensity!==void 0&&(this.shadowIntensity=Math.max(0,Math.min(1,Number(this.opts.shadowIntensity)||0))),this.opts.shadowSoftness!==void 0&&(this.shadowSoftness=Math.max(0,Math.min(1,Number(this.opts.shadowSoftness)||0))),this.opts.toneMapping!==void 0&&(this.toneMapping=this.opts.toneMapping),this.opts.autoplay!==void 0&&(this.autoplay=this.opts.autoplay),this.opts.animationName!==void 0&&(this.animationName=this.opts.animationName),this.opts.variantName!==void 0&&(this.activeVariantName=this.opts.variantName||null),this.opts.fieldOfView!==void 0&&(this.fov=this.opts.fieldOfView*Math.PI/180),this.opts.distanceMode!==void 0&&(this.distanceMode=this.opts.distanceMode),this.opts.cameraTarget!==void 0&&(this.setTarget(this.opts.cameraTarget[0],this.opts.cameraTarget[1],this.opts.cameraTarget[2]),this.initialCustomTarget=[...this.opts.cameraTarget]),(this.opts.minCameraOrbit||this.opts.maxCameraOrbit)&&this.setOrbitLimits({minTheta:this.opts.minCameraOrbit?.theta,maxTheta:this.opts.maxCameraOrbit?.theta,minPhi:this.opts.minCameraOrbit?.phi,maxPhi:this.opts.maxCameraOrbit?.phi,minDistance:this.opts.minCameraOrbit?.distance,maxDistance:this.opts.maxCameraOrbit?.distance});let c=i.getContext("webgl2",{antialias:!0,alpha:!0,xrCompatible:!0});if(!c)throw new Error("WebGL2 not supported");this.gl=c;let a=Qi();this.renderProg=Dr(c,Ki,a.fs),this.pickProg=Dr(c,ps,bs),this.uRender=kr(c,this.renderProg,a.uniforms),this.uPick=kr(c,this.pickProg,["uMVP","uColorId"]),this.setupPickingFbo(),this.setupEvents(),this.opts.environmentImage&&this.setEnvironmentImage(this.opts.environmentImage).catch(()=>{}),typeof requestAnimationFrame<"u"&&this.opts.autoStart!==!1&&this.start()}static registerDecoder(e,n){ms(e,n)}static getDecoder(e){return Ft(e)}setupPickingFbo(){let e=this.gl;if(typeof e.createFramebuffer!="function")return;this.pickFbo=e.createFramebuffer(),this.pickTexture=e.createTexture(),this.pickDepth=e.createRenderbuffer();let n=Math.max(1,this.canvas.width),r=Math.max(1,this.canvas.height);this.pickFboWidth=n,this.pickFboHeight=r,e.bindTexture(3553,this.pickTexture),e.texImage2D(3553,0,6408,n,r,0,6408,5121,null),e.texParameteri(3553,10241,9728),e.texParameteri(3553,10240,9728),e.bindRenderbuffer(36161,this.pickDepth),e.renderbufferStorage(36161,33189,n,r),e.bindFramebuffer(36160,this.pickFbo),e.framebufferTexture2D(36160,36064,3553,this.pickTexture,0),e.framebufferRenderbuffer(36160,36096,36161,this.pickDepth),e.bindFramebuffer(36160,null)}resizePickingFbo(e,n){if(!this.pickFbo)return;let r=this.gl,i=Math.max(1,e),o=Math.max(1,n);this.pickFboWidth=i,this.pickFboHeight=o,r.bindTexture(3553,this.pickTexture),r.texImage2D(3553,0,6408,i,o,0,6408,5121,null),r.bindRenderbuffer(36161,this.pickDepth),r.renderbufferStorage(36161,33189,i,o)}loadGLBData(e,n){let{meshes:r,bounds:i,lights:o,animations:s,worldMatrices:c,gpuTextures:a,availableVariants:u}=qi(this.gl,e,n,()=>this.render());if(this.disposeMeshGpuResources(),this.meshes=r,this.bounds=i,this.turntableRotation=0,this.updateTurntableMatrix(),this.lights=o,this.animations=s||[],this.worldMatrices=c||[],this.gpuTextures=a||[],this.availableVariants=u||[],this.gltf=e.gltf,this.activeVariantName&&this.applyVariantMaterial(this.activeVariantName),this.initialNodeTransforms=[],Array.isArray(e.gltf?.nodes))for(let m of e.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 Ie)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 l=e.exposure??e.environmentIntensity??e.gltf?.extras?.exposure??e.gltf?.extras?.environmentIntensity??e.gltf?.asset?.extras?.exposure??e.gltf?.asset?.extras?.environmentIntensity;l!==void 0&&(this.envIntensity=Math.max(0,Number(l))),this.container&&typeof this.container.hasAttribute=="function"&&this.container.hasAttribute("poster")&&this.container.removeAttribute("poster"),this.resize(),this.update(0),this.render(),this.animFrameId===null&&typeof requestAnimationFrame<"u"&&this.opts.autoStart!==!1&&this.start()}loadGLB(e){this.loadGLBData(ji(e))}clearScene(){this.disposeMeshGpuResources(),this.lights=[],this.animations=[],this.currentClip=null,this.isPlayingAnimation=!1,this.worldMatrices=[],this.gltf=null,this.initialNodeTransforms=[],this.turntableRotation=0,this.updateTurntableMatrix(),this.gl&&this.render()}loadModel(e){this.loadGLBData(ot(e))}setBackdropGLB(e,n){if(this.disposeMeshListGpuResources(this.backdropMeshes),this.backdropMeshes=[],!e){this.update(0),this.render();return}let r=ot(e),{meshes:i}=qi(this.gl,r,eo,()=>this.render());if(n)for(let o of i)o.transform[12]+=n[0],o.transform[13]+=n[1],o.transform[14]+=n[2],Le(o.normalMatrix,o.transform);this.backdropMeshes=i,this.update(0),this.render()}setClearColor(e,n,r,i=1){this.clearColor=[e,n,r,i]}updateMeshTransforms(e){for(let n=0;n<this.meshes.length;n++){let r=this.meshes[n],i;e instanceof Map?i=e.get(r.name)??e.get(n):Array.isArray(e)?i=e[n]:e&&typeof e=="object"&&(Object.prototype.hasOwnProperty.call(e,r.name)?i=e[r.name]:Object.prototype.hasOwnProperty.call(e,n)&&(i=e[n])),i&&i.length===16&&(r.transform.set(i),Le(r.normalMatrix,r.transform))}}bindLights(e=this.uRender){let n=this.gl,r=[.28,.28,.28],i=[],o=[],s=[],c=[];for(let a of this.lights){let u=a.color||[1,1,1],l=a.intensity!==void 0?a.intensity:1;if(a.type==="ambient")r=[u[0]*l,u[1]*l,u[2]*l];else if(a.type==="directional"&&i.length<6){let m=a.direction||[.5,1,.8];i.push(m[0],m[1],m[2]),o.push(u[0]*l,u[1]*l,u[2]*l)}else if(a.type==="point"&&s.length<6){let m=a.position||[0,0,0];s.push(m[0],m[1],m[2]),c.push(u[0]*l,u[1]*l,u[2]*l)}}i.length===0&&(i.push(.5,1,.8),o.push(1,1,1)),n.uniform3fv(e.uAmbientColor,r),n.uniform1i(e.uNumDirLights,i.length/3),i.length>0&&(n.uniform3fv(e.uDirLightDir,i),n.uniform3fv(e.uDirLightColor,o)),n.uniform1i(e.uNumPointLights,s.length/3),s.length>0&&(n.uniform3fv(e.uPointLightPos,s),n.uniform3fv(e.uPointLightColor,c)),n.uniform1f(e.uEnvIntensity,this.envIntensity)}setExposure(e){this.envIntensity=Math.max(0,Number(e))}getExposure(){return this.envIntensity}setShadow(e,n){this.shadowIntensity=Math.max(0,Math.min(1,Number(e)||0)),n!==void 0&&(this.shadowSoftness=Math.max(0,Math.min(1,Number(n)||0)))}getShadowIntensity(){return this.shadowIntensity}getShadowSoftness(){return this.shadowSoftness}setToneMapping(e){this.toneMapping=e}getToneMapping(){return this.toneMapping}async setEnvironmentImage(e){for(let n of Ie)if(n.setEnvironmentImage){await n.setEnvironmentImage(this,e);return}}async setSkyboxImage(e){for(let n of Ie)if(n.setSkyboxImage){await n.setSkyboxImage(this,e);return}}setInteractive(e){this.interactive=e}isInteractive(){return this.interactive}getCameraOrbit(){let e=this.currTheta,n=this.currPhi,r=this.currDistance;return{theta:e,phi:n,radius:r,toString(){return`${e.toFixed(4)}rad ${n.toFixed(4)}rad ${r.toFixed(4)}m`}}}getCameraTarget(){let e=this.customTarget||this.bounds.center;return{x:e[0],y:e[1],z:e[2],toString(){return`${e[0].toFixed(4)}m ${e[1].toFixed(4)}m ${e[2].toFixed(4)}m`}}}jumpCameraToGoal(){this.currTheta=this.targetTheta,this.currPhi=this.targetPhi,this.currDistance=this.targetDistance,this.update(0),this.render()}getModelMaterials(){let e=this.gltf?.materials?.length?this.gltf.materials:[{name:"DefaultMaterial",pbrMetallicRoughness:{}}];return e.map((n,r)=>{let i=this.meshes.flatMap(l=>l.primitives.filter(m=>m.materialIndex===r||e.length===1&&m.materialIndex===void 0)),o=i[0],s=o?[...o.baseColor]:n.pbrMetallicRoughness?.baseColorFactor||[.8,.8,.8,1],c=o?o.metallic:n.pbrMetallicRoughness?.metallicFactor??.1,a=o?o.roughness:n.pbrMetallicRoughness?.roughnessFactor??.5,u={baseColorFactor:s,metallicFactor:c,roughnessFactor:a,setBaseColorFactor:l=>{let m=[l[0],l[1],l[2],l[3]??1];u.baseColorFactor=m,n.pbrMetallicRoughness&&(n.pbrMetallicRoughness.baseColorFactor=m);for(let f of i)f.baseColor=m;this.render()},setMetallicFactor:l=>{u.metallicFactor=l,n.pbrMetallicRoughness&&(n.pbrMetallicRoughness.metallicFactor=l);for(let m of i)m.metallic=l;this.render()},setRoughnessFactor:l=>{u.roughnessFactor=l,n.pbrMetallicRoughness&&(n.pbrMetallicRoughness.roughnessFactor=l);for(let m of i)m.roughness=l;this.render()}};return{name:n.name||`Material_${r}`,pbrMetallicRoughness:u}})}playAnimation(e){if(this.animations.length!==0){if(e){let n=this.animations.find(r=>r.name===e);n&&(this.currentClip=n)}else this.currentClip||(this.currentClip=this.animations[0]);this.isPlayingAnimation=!0}}pauseAnimation(){this.isPlayingAnimation=!1}getAvailableAnimations(){return this.animations.map(e=>e.name)}getAvailableVariants(){return[...this.availableVariants]}getVariantName(){return this.activeVariantName}selectVariant(e){let n=this.applyVariantMaterial(e);return n&&this.gl&&this.render(),n}applyVariantMaterial(e){let n=e===null||e===""||e==="default",r=-1;if(n)this.activeVariantName=null;else{if(r=this.availableVariants.indexOf(e),r<0)return!1;this.activeVariantName=e}let i=this.gltf?.materials;if(!Array.isArray(i))return n;for(let o of this.meshes)for(let s of o.primitives){let c=s.defaultMaterialIndex;if(!n&&Array.isArray(s.variantMappings)){for(let m of s.variantMappings)if(Array.isArray(m.variants)&&m.variants.includes(r)){c=m.material;break}}if(c===void 0||!i[c]){s.materialIndex=void 0,s.baseColor=[.8,.8,.8,1],s.metallic=.1,s.roughness=.5,s.clearcoat=0,s.clearcoatRoughness=.04,s.texture=null,s.metallicRoughnessTexture=null,s.normalTexture=null,s.normalScale=1,s.occlusionTexture=null,s.occlusionStrength=1,s.isTransmissive=!1;continue}let a=i[c];s.materialIndex=c;let u=a.pbrMetallicRoughness;s.baseColor=u?.baseColorFactor?[u.baseColorFactor[0],u.baseColorFactor[1],u.baseColorFactor[2],u.baseColorFactor[3]??1]:[.8,.8,.8,1],s.metallic=u?.metallicFactor??.1,s.roughness=u?.roughnessFactor??.5;let l=a.extensions?.KHR_materials_clearcoat;s.clearcoat=l?l.clearcoatFactor??1:0,s.clearcoatRoughness=Math.max(.04,l?.clearcoatRoughnessFactor??.04),s.texture=u?.baseColorTexture!==void 0&&this.gpuTextures[u.baseColorTexture.index]?this.gpuTextures[u.baseColorTexture.index]:null,s.metallicRoughnessTexture=u?.metallicRoughnessTexture!==void 0&&this.gpuTextures[u.metallicRoughnessTexture.index]?this.gpuTextures[u.metallicRoughnessTexture.index]:null,s.normalTexture=a.normalTexture!==void 0&&this.gpuTextures[a.normalTexture.index]?this.gpuTextures[a.normalTexture.index]:null,s.normalScale=a.normalTexture?.scale??1,s.occlusionTexture=a.occlusionTexture!==void 0&&this.gpuTextures[a.occlusionTexture.index]?this.gpuTextures[a.occlusionTexture.index]:null,s.occlusionStrength=a.occlusionTexture?.strength??1,s.isTransmissive=!!(a.extensions?.KHR_materials_transmission||s.pluginData?.materials?.isTransmissive)}return!0}setAutoplay(e){this.autoplay=e,e?this.playAnimation(this.animationName||void 0):this.pauseAnimation()}setAnimationName(e){this.animationName=e,(this.isPlayingAnimation||this.autoplay)&&this.playAnimation(e)}evaluateAnimation(e){for(let n of Ie)if(n.evaluateAnimation){n.evaluateAnimation(this,e);return}}setTarget(e,n,r){this.customTarget=[e,n,r],this.gl&&(this.meshes.length>0||this.backdropMeshes.length>0)&&(this.update(0),this.render())}getTarget(){return this.customTarget?[...this.customTarget]:null}setFieldOfView(e){let n=Math.max(10,Math.min(90,e));this.fov=n*Math.PI/180}getFieldOfView(){return this.fov*180/Math.PI}setDistanceMode(e){if(this.distanceMode=e,!this.customDistance){let n=this.clampDistance(this.distanceMode==="absolute"?3:this.bounds.radius*2.5);this.initialDistance=n,this.targetDistance=n,this.currDistance=n,this.gl&&(this.meshes.length>0||this.backdropMeshes.length>0)&&(this.update(0),this.render())}}getDistanceMode(){return this.distanceMode}setOrbitLimits(e){e.minTheta!==void 0&&(this.minTheta=e.minTheta*Math.PI/180),e.maxTheta!==void 0&&(this.maxTheta=e.maxTheta*Math.PI/180),e.minPhi!==void 0&&(this.minPhi=Math.max(-Math.PI*.48,e.minPhi*Math.PI/180)),e.maxPhi!==void 0&&(this.maxPhi=Math.min(Math.PI*.48,e.maxPhi*Math.PI/180)),e.minDistance!==void 0&&(this.minDistanceLimit=e.minDistance),e.maxDistance!==void 0&&(this.maxDistanceLimit=e.maxDistance),this.targetTheta=this.clampTheta(this.targetTheta),this.targetPhi=this.clampPhi(this.targetPhi),this.targetDistance=this.clampDistance(this.targetDistance)}getOrbitLimits(){return{minTheta:isFinite(this.minTheta)?this.minTheta*180/Math.PI:void 0,maxTheta:isFinite(this.maxTheta)?this.maxTheta*180/Math.PI:void 0,minPhi:this.minPhi*180/Math.PI,maxPhi:this.maxPhi*180/Math.PI,minDistance:this.minDistanceLimit!==null?this.minDistanceLimit:void 0,maxDistance:this.maxDistanceLimit!==null?this.maxDistanceLimit:void 0}}clampTheta(e){return Math.max(this.minTheta,Math.min(this.maxTheta,e))}clampPhi(e){return Math.max(this.minPhi,Math.min(this.maxPhi,e))}clampDistance(e){let n=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(n,Math.min(r,e))}setCamera(e,n,r,i){e!==void 0&&(this.targetTheta=this.clampTheta(e*Math.PI/180)),n!==void 0&&(this.targetPhi=this.clampPhi(n*Math.PI/180)),r!==void 0&&r>0&&(this.targetDistance=this.clampDistance(r)),i!==void 0&&i>0&&(this.targetDistance=this.clampDistance(this.bounds.radius*2.5/i))}setInitialCamera(e,n,r,i){if(e!==void 0&&(this.initialTheta=this.clampTheta(e*Math.PI/180),this.targetTheta=this.initialTheta,this.currTheta=this.initialTheta),n!==void 0&&(this.initialPhi=this.clampPhi(n*Math.PI/180),this.targetPhi=this.initialPhi,this.currPhi=this.initialPhi),r!==void 0&&r>0){let o=this.clampDistance(r);this.initialDistance=o,this.customDistance=!0,this.targetDistance=o,this.currDistance=o}else if(i!==void 0&&i>0){let o=this.clampDistance(this.bounds.radius*2.5/i);this.initialDistance=o,this.customDistance=!0,this.targetDistance=o,this.currDistance=o}else{this.customDistance=!1;let o=this.clampDistance(this.distanceMode==="absolute"?3:this.bounds.radius*2.5);this.initialDistance=o,this.targetDistance=o,this.currDistance=o}this.gl&&(this.meshes.length>0||this.backdropMeshes.length>0)&&(this.update(0),this.render())}resetCamera(){this.targetTheta=this.clampTheta(this.initialTheta),this.targetPhi=this.clampPhi(this.initialPhi),this.initialDistance!==null?this.targetDistance=this.clampDistance(this.initialDistance):this.targetDistance=this.clampDistance(this.bounds.radius*2.5),this.initialCustomTarget?this.customTarget=[...this.initialCustomTarget]:this.customTarget=null,this.turntableRotation=0,this.updateTurntableMatrix()}projectPointToScreen(e,n){let r=we();Ee(r,this.projMatrix,this.viewMatrix);let[i,o,s]=e,c=n?n[0]:0,a=n?n[1]:0,u=n?n[2]:0,l=this.modelRootMatrix;l&&(i=l[0]*e[0]+l[4]*e[1]+l[8]*e[2]+l[12],o=l[1]*e[0]+l[5]*e[1]+l[9]*e[2]+l[13],s=l[2]*e[0]+l[6]*e[1]+l[10]*e[2]+l[14],n&&(c=l[0]*n[0]+l[4]*n[1]+l[8]*n[2],a=l[1]*n[0]+l[5]*n[1]+l[9]*n[2],u=l[2]*n[0]+l[6]*n[1]+l[10]*n[2]));let m=r[0]*i+r[4]*o+r[8]*s+r[12],f=r[1]*i+r[5]*o+r[9]*s+r[13],h=r[2]*i+r[6]*o+r[10]*s+r[14],b=r[3]*i+r[7]*o+r[11]*s+r[15];if(b<=1e-4)return{x:0,y:0,z:1,visible:!1};let d=m/b,p=f/b,E=h/b,A=this.canvas.getBoundingClientRect(),x=A.width||this.canvas.clientWidth||this.canvas.width||300,R=A.height||this.canvas.clientHeight||this.canvas.height||150,I=(d*.5+.5)*x,P=(-p*.5+.5)*R,k=d>=-1.1&&d<=1.1&&p>=-1.1&&p<=1.1&&E>=-1&&E<=1;if(k&&n){let D=this.customTarget||this.bounds.center,S=D[0]+this.currDistance*Math.cos(this.currPhi)*Math.sin(this.currTheta),_=D[1]+this.currDistance*Math.sin(this.currPhi),v=D[2]+this.currDistance*Math.cos(this.currPhi)*Math.cos(this.currTheta),G=[i-S,o-_,s-v];c*G[0]+a*G[1]+u*G[2]>.05&&(k=!1)}return{x:I,y:P,z:E,visible:k}}setSelectedMesh(e){this.selectedMeshName=e||""}getSelectedMesh(){return this.selectedMeshName}setupEvents(){let e=this.canvas;this.boundContextMenu=n=>{n.preventDefault()},e.addEventListener("contextmenu",this.boundContextMenu),this.boundPointerDown=n=>{this.interactive&&(this.isPointerDown=!0,this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now(),this.lastPointerX=n.clientX,this.lastPointerY=n.clientY,this.totalDragDist=0,this.activePointers.set(n.pointerId,{x:n.clientX,y:n.clientY}),this.isPanning=n.button===2||n.shiftKey||this.activePointers.size===2,e.setPointerCapture(n.pointerId))},e.addEventListener("pointerdown",this.boundPointerDown),this.boundPointerMove=n=>{if(!this.isPointerDown||!this.interactive)return;this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now();let r=this.activePointers.get(n.pointerId)||{x:this.lastPointerX,y:this.lastPointerY},i=n.clientX-r.x,o=n.clientY-r.y;if(this.activePointers.set(n.pointerId,{x:n.clientX,y:n.clientY}),this.lastPointerX=n.clientX,this.lastPointerY=n.clientY,this.totalDragDist+=Math.hypot(i,o),this.isPanning||n.button===2||n.shiftKey||this.activePointers.size===2){let s=[this.viewMatrix[0],this.viewMatrix[4],this.viewMatrix[8]],c=[this.viewMatrix[1],this.viewMatrix[5],this.viewMatrix[9]],a=this.customTarget?[...this.customTarget]:[...this.bounds.center],u=this.currDistance/Math.max(e.clientHeight||300,1)*1.5;a[0]+=(-i*s[0]+o*c[0])*u,a[1]+=(-i*s[1]+o*c[1])*u,a[2]+=(-i*s[2]+o*c[2])*u,this.customTarget=a}else this.targetTheta=this.clampTheta(this.targetTheta-i*.008),this.targetPhi=this.clampPhi(this.targetPhi+o*.008)},e.addEventListener("pointermove",this.boundPointerMove),this.boundPointerUp=n=>{this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now(),this.activePointers.delete(n.pointerId),this.activePointers.size===0?(this.isPointerDown=!1,this.isPanning=!1):this.activePointers.size===1&&(this.isPanning=!1);try{e.releasePointerCapture(n.pointerId)}catch{}if(this.totalDragDist<5&&n.button===0){let r=e.getBoundingClientRect(),i=Math.floor((n.clientX-r.left)*(e.width/Math.max(r.width,1))),o=Math.floor((n.clientY-r.top)*(e.height/Math.max(r.height,1)));this.performMeshPick(i,o,!0)}},e.addEventListener("pointerup",this.boundPointerUp),this.boundWheel=n=>{if(!this.interactive)return;n.preventDefault(),this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now();let r=Math.exp(n.deltaY*.001);this.targetDistance=this.clampDistance(this.targetDistance*r)},e.addEventListener("wheel",this.boundWheel,{passive:!1}),this.boundSetCamera=n=>{let r=n.detail||{};r.reset?this.resetCamera():this.setCamera(r.theta,r.phi,r.distance,r.zoom)},this.container.addEventListener("setCamera",this.boundSetCamera),this.boundResetCamera=()=>{this.resetCamera()},this.container.addEventListener("resetCamera",this.boundResetCamera),e.tabIndex!==void 0&&e.tabIndex<0&&(e.tabIndex=0),e.getAttribute?.("role")||e.setAttribute?.("role","region"),e.getAttribute?.("aria-label")||e.setAttribute?.("aria-label","Interactive 3D model viewport"),this.boundKeyDown=n=>{if(!this.interactive)return;let r=typeof performance<"u"?performance.now():Date.now();switch(n.key){case"ArrowLeft":this.lastInteractionTime=r,this.targetTheta=this.clampTheta(this.targetTheta-.1),n.preventDefault();break;case"ArrowRight":this.lastInteractionTime=r,this.targetTheta=this.clampTheta(this.targetTheta+.1),n.preventDefault();break;case"ArrowUp":this.lastInteractionTime=r,this.targetPhi=this.clampPhi(this.targetPhi+.08),n.preventDefault();break;case"ArrowDown":this.lastInteractionTime=r,this.targetPhi=this.clampPhi(this.targetPhi-.08),n.preventDefault();break;case"+":case"=":{this.lastInteractionTime=r,this.targetDistance=this.clampDistance(this.targetDistance*.9),n.preventDefault();break}case"-":case"_":{this.lastInteractionTime=r,this.targetDistance=this.clampDistance(this.targetDistance*1.1),n.preventDefault();break}case"Home":this.lastInteractionTime=r,this.resetCamera(),n.preventDefault();break}},e.addEventListener("keydown",this.boundKeyDown)}teardownEvents(){let e=this.canvas;this.boundContextMenu&&(e.removeEventListener("contextmenu",this.boundContextMenu),this.boundContextMenu=null),this.boundPointerDown&&(e.removeEventListener("pointerdown",this.boundPointerDown),this.boundPointerDown=null),this.boundPointerMove&&(e.removeEventListener("pointermove",this.boundPointerMove),this.boundPointerMove=null),this.boundPointerUp&&(e.removeEventListener("pointerup",this.boundPointerUp),this.boundPointerUp=null),this.boundWheel&&(e.removeEventListener("wheel",this.boundWheel),this.boundWheel=null),this.boundKeyDown&&(e.removeEventListener("keydown",this.boundKeyDown),this.boundKeyDown=null),this.boundSetCamera&&(this.container.removeEventListener("setCamera",this.boundSetCamera),this.boundSetCamera=null),this.boundResetCamera&&(this.container.removeEventListener("resetCamera",this.boundResetCamera),this.boundResetCamera=null)}raycastFromScreenPoint(e,n){let r=this.canvas,i=r.getBoundingClientRect(),o=r.width||300,s=r.height||300,c=i.width>0?Math.floor((e-i.left)*(o/i.width)):Math.floor(e),a=i.height>0?Math.floor((n-i.top)*(s/i.height)):Math.floor(n);return this.performMeshPick(c,a,!1)}performMeshPick(e,n,r=!0){if(this.meshes.length===0)return null;let i=this.gl,o=Math.max(1,this.canvas.width||300),s=Math.max(1,this.canvas.height||300);e=this.mapStereoPickX(e,o);let c=we();Ee(c,this.projMatrix,this.viewMatrix);let a=[],u=Math.max(0,Math.min(o-1,e)),l=Math.max(0,Math.min(s-1,s-1-n));if(this.pickFbo&&i&&!this.xrSessionActive){(this.pickFboWidth!==o||this.pickFboHeight!==s)&&this.resizePickingFbo(o,s),i.bindFramebuffer(36160,this.pickFbo),i.viewport(0,0,o,s),i.enable(2929),i.clearColor(0,0,0,0),i.clear(16384|256),i.useProgram(this.pickProg);for(let D=0;D<this.meshes.length;D++){let S=this.meshes[D];if(S.visible===!1||S.isPluginMesh)continue;let _=D+1,v=(_&255)/255,G=(_>>8&255)/255,L=(_>>16&255)/255;i.uniform4f(this.uPick.uColorId,v,G,L,1),Ee(this.modelMatrix,this.modelRootMatrix,S.transform);let U=S.instanceMatrices;if(U&&U.length>=16){let q=U.length>>4,W=we();for(let K of S.primitives){i.bindVertexArray(K.vao);for(let Y=0;Y<q;Y++)Ee(W,this.modelMatrix,U.subarray(Y*16,Y*16+16)),Ee(this.mvpMatrix,c,W),i.uniformMatrix4fv(this.uPick.uMVP,!1,this.mvpMatrix),K.indices?i.drawElements(4,K.indexCount,K.indexType,0):i.drawArrays(4,0,K.indexCount)}}else{Ee(this.mvpMatrix,c,this.modelMatrix),i.uniformMatrix4fv(this.uPick.uMVP,!1,this.mvpMatrix);for(let q of S.primitives)i.bindVertexArray(q.vao),q.indices?i.drawElements(4,q.indexCount,q.indexType,0):i.drawArrays(4,0,q.indexCount)}}let P=new Uint8Array(4);i.readPixels(u,l,1,1,6408,5121,P),i.bindFramebuffer(36160,null);let k=P[0]+(P[1]<<8)+(P[2]<<16);k>0&&k<=this.meshes.length&&(a=[this.meshes[k-1]])}a.length===0&&(a=this.meshes.filter(P=>P.visible!==!1));let m=null,f=1/0,h=[0,0,0],b=[0,1,0],d=this.customTarget||this.bounds.center,p=d[0]+this.currDistance*Math.cos(this.currPhi)*Math.sin(this.currTheta),E=d[1]+this.currDistance*Math.sin(this.currPhi),A=d[2]+this.currDistance*Math.cos(this.currPhi)*Math.cos(this.currTheta),x=we();for(let P of a){Ee(x,this.modelRootMatrix,P.transform);let k=P.instanceMatrices,D=k&&k.length>=16?k.length>>4:1;for(let S=0;S<D;S++){k&&k.length>=16?Ee(this.modelMatrix,x,k.subarray(S*16,S*16+16)):this.modelMatrix.set(x),Ee(this.mvpMatrix,c,this.modelMatrix);let _=we();if(!An(_,this.mvpMatrix))continue;let v=(u+.5)/o*2-1,G=(l+.5)/s*2-1,L=[0,0,0],U=[0,0,0];Lr(L,v,G,-1,_),Lr(U,v,G,1,_);let q=U[0]-L[0],W=U[1]-L[1],K=U[2]-L[2],Y=Math.hypot(q,W,K)||1,te=q/Y,ie=W/Y,$=K/Y,ne={distance:1/0,point:[0,0,0],normal:[0,1,0]};if((O=>{for(let X of P.primitives){if(!X.positions)continue;let M=X.positions,N=X.indices,z=Math.floor(N?N.length/3:M.length/9);for(let V=0;V<z;V++){let y=N?N[V*3]:V*3,g=N?N[V*3+1]:V*3+1,T=N?N[V*3+2]:V*3+2;Hi(L[0],L[1],L[2],te,ie,$,M[y*3],M[y*3+1],M[y*3+2],M[g*3],M[g*3+1],M[g*3+2],M[T*3],M[T*3+1],M[T*3+2],ne,O)}}})(1e-4),isFinite(ne.distance)){let O=ne.point[0],X=ne.point[1],M=ne.point[2],N=this.modelMatrix,z=N[0]*O+N[4]*X+N[8]*M+N[12],V=N[1]*O+N[5]*X+N[9]*M+N[13],y=N[2]*O+N[6]*X+N[10]*M+N[14],g=z-p,T=V-E,C=y-A,B=Math.hypot(g,T,C);if(B<f){Le(this.normalMatrix,this.modelMatrix);let w=this.normalMatrix,F=ne.normal[0],H=ne.normal[1],J=ne.normal[2],Z=w[0]*F+w[3]*H+w[6]*J,ee=w[1]*F+w[4]*H+w[7]*J,j=w[2]*F+w[5]*H+w[8]*J,Q=Math.hypot(Z,ee,j)||1;Z/=Q,ee/=Q,j/=Q,Z*g+ee*T+j*C>0&&(Z=-Z,ee=-ee,j=-j),m=P,f=Math.round(B*1e3)/1e3,h=[Math.round(z*1e3)/1e3,Math.round(V*1e3)/1e3,Math.round(y*1e3)/1e3],b=[Math.round(Z*1e3)/1e3,Math.round(ee*1e3)/1e3,Math.round(j*1e3)/1e3]}}}}if(!m)return null;let I={meshIndex:this.meshes.indexOf(m),meshName:m.name,nodeIndex:m.nodeIndex,distance:f,hitPoint:h,normal:b,screenX:e,screenY:n};if(r){for(let P of Ie)P.onMeshSelect?.(this,I);this.opts.onMeshClick&&this.opts.onMeshClick(I),typeof CustomEvent<"u"&&typeof this.container.dispatchEvent=="function"&&this.container.dispatchEvent(new CustomEvent("meshClick",{bubbles:!0,detail:I}))}return I}mapStereoPickX(e,n){if(!this.stereoSBS||this.xrSessionActive||n<2)return e;let r=Math.max(1,Math.floor(n*.5)),i=e>=r,o=i?e-r:e,s=i?Math.max(1,n-r):r,c=(o+.5)/s*2-1;return Math.floor((c*.5+1)*.5*n)}setStereoSBS(e){this.stereoSBS=!!e,this.xrSessionActive||(this.syncCameraMatrices(),this.render())}syncCameraMatrices(){let e=Math.max(1,this.canvas.width||1)/Math.max(1,this.canvas.height||1),n=this.backdropMeshes.length>0?Math.max(this.bounds.radius*20,120):Math.max(this.bounds.radius*20,10);Mn(this.projMatrix,this.fov,e,.1,n);let r=this.customTarget||this.bounds.center,i=r[0]+this.currDistance*Math.cos(this.currPhi)*Math.sin(this.currTheta),o=r[1]+this.currDistance*Math.sin(this.currPhi),s=r[2]+this.currDistance*Math.cos(this.currPhi)*Math.cos(this.currTheta);Nt(this.viewMatrix,[i,o,s],r,[0,1,0]),Ee(this.mvpMatrix,this.projMatrix,this.viewMatrix),Le(this.normalMatrix,this.modelMatrix)}resize(){let e=Math.min((typeof window<"u"?window.devicePixelRatio:1)||1,2),n=this.canvas.getBoundingClientRect(),r=Math.max(1,Math.floor(n.width*e)),i=Math.max(1,Math.floor(n.height*e));this.canvas.width!==r||this.canvas.height!==i?(this.canvas.width=r,this.canvas.height=i,this.resizePickingFbo(r,i),this.xrSessionActive||this.syncCameraMatrices()):!this.xrSessionActive&&this.projMatrix[0]===0&&this.syncCameraMatrices()}getGLContext(){return this.gl}setXRSessionActive(e){let n=this.xrSessionActive;if(this.xrSessionActive=e,n&&!e){this.xrDepthState.enabled=!1;for(let r of Ie)r.onXRSessionEnd?.(this);if(this.lastTime=typeof performance<"u"?performance.now():Date.now(),this.updateTurntableMatrix(),this.isVisible)try{this.resize(),this.syncCameraMatrices(),this.render()}catch(r){this.reportRenderError(r)}}}reportRenderError(e){this.renderErrorReported||(this.renderErrorReported=!0,typeof console<"u"&&console.warn("[three-live] render frame failed:",e))}stepXRUpdate(e){for(let n of Ie)n.onUpdate?.(this,e)}start(){if(this.animFrameId!==null)return;this.lastTime=typeof performance<"u"?performance.now():Date.now();let e=n=>{if(this.animFrameId===null)return;let r=Math.min(Math.max((n-this.lastTime)/1e3,0),.1);if(this.lastTime=n,this.isVisible&&!this.xrSessionActive)try{this.resize(),this.update(r),this.render()}catch(i){this.reportRenderError(i)}this.animFrameId!==null&&(this.animFrameId=requestAnimationFrame(e))};this.animFrameId=requestAnimationFrame(e)}stop(){this.animFrameId!==null&&(cancelAnimationFrame(this.animFrameId),this.animFrameId=null)}setAutoRotate(e){this.autoRotate=e}getAutoRotate(){return this.autoRotate}setAutoRotateSpeed(e){this.autoRotateSpeed=e}getAutoRotateSpeed(){return this.autoRotateSpeed}setAutoRotateDelay(e){this.autoRotateDelay=Math.max(0,Number(e)||0)}getAutoRotateDelay(){return this.autoRotateDelay}resetTurntableRotation(e=0){this.turntableRotation=Number(e)||0,this.updateTurntableMatrix(),this.render()}updateTurntableMatrix(){let e=Math.cos(this.turntableRotation),n=Math.sin(this.turntableRotation),r=this.bounds.center[0],i=this.bounds.center[2],o=this.modelRootMatrix;o[0]=e,o[1]=0,o[2]=-n,o[3]=0,o[4]=0,o[5]=1,o[6]=0,o[7]=0,o[8]=n,o[9]=0,o[10]=e,o[11]=0,o[12]=r-(e*r+n*i),o[13]=0,o[14]=i-(-n*r+e*i),o[15]=1}setVisible(e){this.isVisible=e}update(e){for(let s of Ie)s.onUpdate?.(this,e);let n=typeof performance<"u"?performance.now():Date.now();if(!this.isPointerDown&&this.autoRotate&&n-this.lastInteractionTime>=this.autoRotateDelay){this.turntableRotation+=this.autoRotateSpeed*e,this.updateTurntableMatrix();for(let s of Ie)s.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),o=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(o-this.lastReportedZoom)>=.02){this.lastReportedTheta=r,this.lastReportedPhi=i,this.lastReportedZoom=o;let s={theta:r,phi:i,zoom:o,distance:Math.round(this.currDistance*100)/100};this.opts.onCameraChange&&this.opts.onCameraChange(s),typeof CustomEvent<"u"&&typeof this.container.dispatchEvent=="function"&&this.container.dispatchEvent(new CustomEvent("cameraChange",{bubbles:!0,detail:s}))}}renderXRView(e,n,r,i,o=!0,s=0){this.onBeforeRenderXRView&&this.onBeforeRenderXRView(e);let c=e?.transform?.inverse?.matrix||this.viewMatrix,a=e?.projectionMatrix||this.projMatrix,u=e?.transform?.position,l=u?[u.x,u.y,u.z]:[0,1.6,0];n?this.modelRootMatrix.set(n):r&&n&&this.modelRootMatrix.set(n),this.render({viewMatrix:c,projMatrix:a,eyePos:l,viewport:i,eye:e?.eye||"none",clear:s>0?!1:e?.eye!=="right",isAR:o})}render(e){if(!e&&this.stereoSBS){let R=Math.max(2,this.canvas.width||2),I=Math.max(1,this.canvas.height||1),P=Math.max(1,Math.floor(R*.5)),k=Math.max(1,R-P),D=this.backdropMeshes.length>0?Math.max(this.bounds.radius*20,120):Math.max(this.bounds.radius*20,10),S=this.customTarget||this.bounds.center,_=S[0]+this.currDistance*Math.cos(this.currPhi)*Math.sin(this.currTheta),v=S[1]+this.currDistance*Math.sin(this.currPhi),G=S[2]+this.currDistance*Math.cos(this.currPhi)*Math.cos(this.currTheta),L=Math.cos(this.currTheta),U=-Math.sin(this.currTheta),q=.032,W=we(),K=we(),Y=[_-L*q,v,G-U*q],te=[S[0]-L*q*.25,S[1],S[2]-U*q*.25];Mn(W,this.fov,P/I,.1,D),Nt(K,Y,te,[0,1,0]);let ie=we(),$=we(),ne=[_+L*q,v,G+U*q],re=[S[0]+L*q*.25,S[1],S[2]+U*q*.25];Mn(ie,this.fov,k/I,.1,D),Nt($,ne,re,[0,1,0]),this.render({viewMatrix:K,projMatrix:W,eyePos:Y,viewport:[0,0,P,I],eye:"left",clear:!0,isAR:!1}),this.render({viewMatrix:$,projMatrix:ie,eyePos:ne,viewport:[P,0,k,I],eye:"right",clear:!1,isAR:!1}),this.gl.viewport(0,0,R,I);return}let n=this.gl,r=0,i=0,o=this.canvas.width,s=this.canvas.height;e?.viewport?(r=e.viewport[0],i=e.viewport[1],o=e.viewport[2],s=e.viewport[3],n.viewport(r,i,o,s)):n.viewport(0,0,this.canvas.width,this.canvas.height),n.enable(2929),(!e||e.clear!==!1)&&(e?.isAR?n.clearColor(0,0,0,0):n.clearColor(this.clearColor[0],this.clearColor[1],this.clearColor[2],this.clearColor[3]),n.clear(16384|256));let c=we(),a=e?.viewMatrix??this.viewMatrix;Ee(c,e?.projMatrix??this.projMatrix,a);let u=pe().xrDepthShader,l=this.toneMapping==="reinhard"?1:this.toneMapping==="none"?2:this.toneMapping==="aces"?3:this.toneMapping==="agx"?4:0,m=this.customTarget||this.bounds.center,f=e?e.eyePos[0]:m[0]+this.currDistance*Math.cos(this.currPhi)*Math.sin(this.currTheta),h=e?e.eyePos[1]:m[1]+this.currDistance*Math.sin(this.currPhi),b=e?e.eyePos[2]:m[2]+this.currDistance*Math.cos(this.currPhi)*Math.cos(this.currTheta);for(let R of Ie)R.onBeforeDrawScene?.(this,n,c,[f,h,b],l);let d=e?.isAR?0:this.backdropMeshes.length;if(this.meshes.length===0&&d===0)return;let p=e?.eye||"none",E=!1,A=d>0?[...this.backdropMeshes,...this.meshes]:this.meshes,x=R=>{for(let I=0;I<A.length;I++){let P=A[I];if(P.visible===!1)continue;let k=this.selectedMeshName!==""&&P.name===this.selectedMeshName;I<d||P.worldSpace===!0||P.name==="__xr_reticle__"?this.modelMatrix.set(P.transform):Ee(this.modelMatrix,this.modelRootMatrix,P.transform),Ee(this.mvpMatrix,c,this.modelMatrix),Le(P.normalMatrix,this.modelMatrix);let D=P.extras?.xr?.stereo||P.userData?.xr?.stereo,S=0,_=0,v=1,G=1;D==="sbs"?(v=.5,S=p==="right"?.5:0):D==="ou"&&(G=.5,_=p==="right"?.5:0);for(let L of P.primitives){let U=!!L.isTransmissive;if(!R&&U){E=!0;continue}if(R&&!U)continue;let q=L.customProgram||this.renderProg,W=L.customUniforms||this.uRender;n.useProgram(q),n.uniform1i(W.uToneMapping,l),n.uniform1f(W.uEnvIntensity,this.envIntensity),n.uniform3f(W.uCameraPos,f,h,b),n.uniform1f(W.uEmissive,k?1:0),n.uniformMatrix4fv(W.uMVP,!1,this.mvpMatrix),n.uniformMatrix4fv(W.uModel,!1,this.modelMatrix),n.uniformMatrix3fv(W.uNormalMatrix,!1,P.normalMatrix),W.uUvTransform&&n.uniform4f(W.uUvTransform,S,_,v,G),W.uViewportSize&&n.uniform2f(W.uViewportSize,Math.max(1,o),Math.max(1,s)),u?.bind(n,W,this.xrDepthState,a,[r,i,Math.max(1,o),Math.max(1,s)]),this.environmentTexture?(n.activeTexture(33988),n.bindTexture(3553,this.environmentTexture),n.uniform1i(W.uEnvironmentMap,4),n.uniform1i(W.uHasEnvironmentMap,1)):n.uniform1i(W.uHasEnvironmentMap,0),this.bindLights(W),W.uSectionEnabled&&n.uniform1i(W.uSectionEnabled,0);for(let Y of Ie)Y.onBeforeDrawPrimitive?.(n,q,L,P,this.worldMatrices||[],this.gltf);n.uniform4fv(W.uBaseColor,L.baseColor),n.uniform1f(W.uMetallic,L.metallic),n.uniform1f(W.uRoughness,L.roughness),W.uClearcoat&&n.uniform2f(W.uClearcoat,L.clearcoat??0,L.clearcoatRoughness??.04),L.texture?(n.activeTexture(33984),n.bindTexture(3553,L.texture),n.uniform1i(W.uBaseColorTexture,0),n.uniform1i(W.uHasTexture,1)):n.uniform1i(W.uHasTexture,0),L.metallicRoughnessTexture?(n.activeTexture(33985),n.bindTexture(3553,L.metallicRoughnessTexture),n.uniform1i(W.uMetallicRoughnessTexture,1),n.uniform1i(W.uHasMetallicRoughnessTexture,1)):n.uniform1i(W.uHasMetallicRoughnessTexture,0),L.normalTexture?(n.activeTexture(33986),n.bindTexture(3553,L.normalTexture),n.uniform1i(W.uNormalTexture,2),n.uniform1i(W.uHasNormalTexture,1),n.uniform1f(W.uNormalScale,L.normalScale)):n.uniform1i(W.uHasNormalTexture,0),L.occlusionTexture?(n.activeTexture(33987),n.bindTexture(3553,L.occlusionTexture),n.uniform1i(W.uOcclusionTexture,3),n.uniform1i(W.uHasOcclusionTexture,1),n.uniform1f(W.uOcclusionStrength,L.occlusionStrength)):n.uniform1i(W.uHasOcclusionTexture,0),n.bindVertexArray(L.vao);let K=P.instanceMatrices;if(K&&K.length>=16){let Y=K.length>>4,te=P.instanceColors,ie=we(),$=new Float32Array(9),ne=[L.baseColor[0],L.baseColor[1],L.baseColor[2],L.baseColor[3]];for(let re=0;re<Y;re++)Ee(ie,this.modelMatrix,K.subarray(re*16,re*16+16)),Ee(this.mvpMatrix,c,ie),Le($,ie),n.uniformMatrix4fv(W.uMVP,!1,this.mvpMatrix),n.uniformMatrix4fv(W.uModel,!1,ie),n.uniformMatrix3fv(W.uNormalMatrix,!1,$),te&&(ne[0]=L.baseColor[0]*te[re*3],ne[1]=L.baseColor[1]*te[re*3+1],ne[2]=L.baseColor[2]*te[re*3+2],ne[3]=L.baseColor[3],n.uniform4fv(W.uBaseColor,ne)),L.indices?n.drawElements(4,L.indexCount,L.indexType,0):n.drawArrays(4,0,L.indexCount)}else L.indices?n.drawElements(4,L.indexCount,L.indexType,0):n.drawArrays(4,0,L.indexCount)}}};if(x(!1),E){for(let R of Ie)R.onBeforeTransmissivePass?.(n,this);x(!0)}for(let R of Ie)R.onAfterRender?.(n,this,c)}disposeMeshListGpuResources(e,n){let r=this.gl,i=new Set,o=s=>{s&&!i.has(s)&&(i.add(s),r.deleteTexture(s))};for(let s of e)for(let c of s.primitives){if(c.vao&&r.deleteVertexArray(c.vao),c.buffers)for(let a of c.buffers)r.deleteBuffer(a);o(c.texture),o(c.metallicRoughnessTexture),o(c.normalTexture),o(c.occlusionTexture),c.customProgram&&r.deleteProgram(c.customProgram)}if(n)for(let s of n)o(s)}disposeMeshGpuResources(){this.disposeMeshListGpuResources(this.meshes,this.gpuTextures),this.meshes=[],this.gpuTextures=[],this.availableVariants=[]}disposeGpuResources(){let e=this.gl;this.disposeMeshGpuResources(),this.disposeMeshListGpuResources(this.backdropMeshes),this.backdropMeshes=[];for(let n of Ie)n.onDestroy?.(e,this);this.environmentTexture&&(e.deleteTexture(this.environmentTexture),this.environmentTexture=null),this.renderProg&&e.deleteProgram(this.renderProg),this.pickProg&&e.deleteProgram(this.pickProg),this.pickFbo&&e.deleteFramebuffer(this.pickFbo),this.pickTexture&&e.deleteTexture(this.pickTexture),this.pickDepth&&e.deleteRenderbuffer(this.pickDepth),this.pickFbo=null,this.pickTexture=null,this.pickDepth=null}dispose(){this.stop(),this.teardownEvents(),this.disposeGpuResources()}destroy(){this.dispose()}};Fe.registerPlugin=Pe,Fe.getRegisteredPlugins=Tn;function gs(t){return t+3&-4}function xs(t,e=0){let n=($,ne)=>typeof $=="number"&&Number.isFinite($)?$:ne,r=n(t[e+12],0),i=n(t[e+13],0),o=n(t[e+14],0),s=n(t[e+0],1),c=n(t[e+1],0),a=n(t[e+2],0),u=n(t[e+4],0),l=n(t[e+5],1),m=n(t[e+6],0),f=n(t[e+8],0),h=n(t[e+9],0),b=n(t[e+10],1),d=Math.hypot(s,c,a),p=Math.hypot(u,l,m),E=Math.hypot(f,h,b);s*(l*b-h*m)-u*(c*b-h*a)+f*(c*m-l*a)<0&&(d=-d);let x=Math.abs(d)>1e-8?1/d:0,R=Math.abs(p)>1e-8?1/p:0,I=Math.abs(E)>1e-8?1/E:0,P=s*x,k=c*x,D=a*x,S=u*R,_=l*R,v=m*R,G=f*I,L=h*I,U=b*I,q=P+_+U,W=0,K=0,Y=0,te=1;if(q>0){let $=.5/Math.sqrt(q+1);te=.25/$,W=(v-L)*$,K=(G-D)*$,Y=(k-S)*$}else if(P>_&&P>U){let $=2*Math.sqrt(Math.max(0,1+P-_-U));$>1e-8&&(te=(v-L)/$,W=.25*$,K=(S+k)/$,Y=(G+D)/$)}else if(_>U){let $=2*Math.sqrt(Math.max(0,1+_-P-U));$>1e-8&&(te=(G-D)/$,W=(S+k)/$,K=.25*$,Y=(v+L)/$)}else{let $=2*Math.sqrt(Math.max(0,1+U-P-_));$>1e-8&&(te=(k-S)/$,W=(G+D)/$,K=(v+L)/$,Y=.25*$)}let ie=Math.hypot(W,K,Y,te);return ie>1e-8&&Number.isFinite(ie)?(W/=ie,K/=ie,Y/=ie,te/=ie):(W=0,K=0,Y=0,te=1),{t:[r,i,o],r:[W,K,Y,te],s:[d,p,E]}}function vs(t){let e={};return t.grab&&(e.interactable={mode:typeof t.grab=="string"?t.grab:"2-hand"},e.movable={scaleInZ:!!t.scale,minScale:typeof t.scale=="object"?t.scale.min??.1:.1,maxScale:typeof t.scale=="object"?t.scale.max??10:10}),t.billboard&&(e.billboard={mode:typeof t.billboard=="string"?t.billboard:"capsule"}),t.follow&&(e.follow={target:typeof t.follow=="object"?t.follow.mode??"head":t.follow}),t.anchor&&(e.anchor={plane:t.anchor}),t.physics&&t.physics!=="none"&&(e.rigidbody={type:t.physics}),e}function Ut(t,e){t.updateMatrixWorld(!0);let n=[],r=0,i=[],o=[],s=[],c=[],a=new Set,u=[],l=[],m=new Map,f=[],h=[];function b(S){let _=m.get(S);if(_!==void 0)return _;_=l.length,m.set(S,_);let v=S,G=v.color?.r??.8,L=v.color?.g??.8,U=v.color?.b??.8,q=v.opacity??1,W={name:v.name||"",pbrMetallicRoughness:{baseColorFactor:[G,L,U,q],metallicFactor:v.metalness??.1,roughnessFactor:v.roughness??.5},doubleSided:v.side===2||!!v.doubleSided};if(v.emissive&&(v.emissive.r>0||v.emissive.g>0||v.emissive.b>0)){let Y=v.emissiveIntensity??1;W.emissiveFactor=[v.emissive.r*Y,v.emissive.g*Y,v.emissive.b*Y]}let K={};return v.clearcoat&&v.clearcoat>0&&(K.KHR_materials_clearcoat={clearcoatFactor:v.clearcoat,clearcoatRoughnessFactor:v.clearcoatRoughness||0}),v.sheen&&v.sheen>0&&(K.KHR_materials_sheen={sheenColorFactor:v.sheenColor?[v.sheenColor.r,v.sheenColor.g,v.sheenColor.b]:[1,1,1],sheenRoughnessFactor:v.sheenRoughness||0}),v.transmission&&v.transmission>0&&(K.KHR_materials_transmission={transmissionFactor:v.transmission}),v.thickness&&v.thickness>0&&(K.KHR_materials_volume={thicknessFactor:v.thickness,attenuationDistance:v.attenuationDistance??1/0,attenuationColor:v.attenuationColor?[v.attenuationColor.r,v.attenuationColor.g,v.attenuationColor.b]:[1,1,1]}),v.ior!==void 0&&v.ior!==1.5&&(K.KHR_materials_ior={ior:v.ior}),v.dispersion&&v.dispersion>0&&(K.KHR_materials_dispersion={dispersion:v.dispersion}),v.iridescence&&v.iridescence>0&&(K.KHR_materials_iridescence={iridescenceFactor:v.iridescence,iridescenceIor:v.iridescenceIOR??1.3}),Object.keys(K).length>0&&(W.extensions=K),l.push(W),_}function d(S,_){let v=new Uint8Array(S.buffer,S.byteOffset,S.byteLength),G=gs(v.byteLength),L=new Uint8Array(G);L.set(v),n.push(L);let U=i.length;return i.push({buffer:0,byteOffset:r,byteLength:v.byteLength,target:_}),r+=G,U}function p(S,_,v,G,L,U,q){let W=d(S,v),K=o.length,Y={bufferView:W,byteOffset:0,componentType:G,count:L,type:_};return U&&(Y.min=U),q&&(Y.max=q),o.push(Y),K}t.traverse(S=>{(S.isLight||S.color&&S.intensity!==void 0)&&h.push({type:S.type,color:[S.color.r,S.color.g,S.color.b],intensity:S.intensity,position:[S.position.x,S.position.y,S.position.z]})});let E=[];function A(S){let _={name:S.name||""},v=S.position,G=S.quaternion,L=S.scale;if((v.x||v.y||v.z)&&(_.translation=[v.x,v.y,v.z]),(G.x||G.y||G.z||G.w!==1)&&(_.rotation=[G.x,G.y,G.z,G.w]),(L.x!==1||L.y!==1||L.z!==1)&&(_.scale=[L.x,L.y,L.z]),S.userData&&Object.keys(S.userData).length>0&&(_.extras=JSON.parse(JSON.stringify(S.userData,(q,W)=>{if(!(q==="__proto__"||q==="prototype"||q==="constructor"))return typeof W=="function"?void 0:W})),S.userData.xr)){let q=vs(S.userData.xr);_.extensions={..._.extensions||{},MOZ_hubs_components:q,ANDROID_xr_scenecore:q},pe().xrTraitSerializer?.gltfNode(_,S.userData.xr),a.add("MOZ_hubs_components").add("ANDROID_xr_scenecore")}if(S.geometry){let q=S.geometry,W=q.attributes.position;if(W&&W.count>0){let K=[1/0,1/0,1/0],Y=[-1/0,-1/0,-1/0];for(let O=0;O<W.count;O++){let X=W.getX(O),M=W.getY(O),N=W.getZ(O);X<K[0]&&(K[0]=X),X>Y[0]&&(Y[0]=X),M<K[1]&&(K[1]=M),M>Y[1]&&(Y[1]=M),N<K[2]&&(K[2]=N),N>Y[2]&&(Y[2]=N)}let ie={attributes:{POSITION:p(W.array,"VEC3",34962,5126,W.count,K,Y)}};if(q.attributes.normal&&(ie.attributes.NORMAL=p(q.attributes.normal.array,"VEC3",34962,5126,q.attributes.normal.count)),q.attributes.uv&&(ie.attributes.TEXCOORD_0=p(q.attributes.uv.array,"VEC2",34962,5126,q.attributes.uv.count)),q.index){let O=q.index.array instanceof Uint32Array;ie.indices=p(q.index.array,"SCALAR",34963,O?5125:5123,q.index.count)}S.material&&(ie.material=b(S.material));let $=S.userData?.variants;if($&&typeof $=="object"){let O=new Map;for(let X of Object.keys($)){if(!X||X==="__proto__"||X==="constructor"||X==="prototype")continue;let M=$[X];if(!M||typeof M!="object")continue;let N=f.indexOf(X);if(N===-1&&f.length<256&&(N=f.length,f.push(X)),N===-1)continue;let z=b(M),V=O.get(z);V||(V=[],O.set(z,V)),V.push(N)}if(O.size>0){let X=[];for(let[M,N]of O.entries())X.push({material:M,variants:N});ie.extensions={...ie.extensions||{},KHR_materials_variants:{mappings:X}},a.add("KHR_materials_variants")}}let ne=S;if(ne.isInstancedMesh&&typeof ne.count=="number"&&ne.count>0&&ne.instanceMatrix?.array){let O=Math.min(1e4,Math.floor(ne.count)),X=ne.instanceMatrix.array,M=new Float32Array(O*3),N=new Float32Array(O*4),z=new Float32Array(O*3);for(let y=0;y<O;y++){let{t:g,r:T,s:C}=xs(X,y*16);M[y*3]=g[0],M[y*3+1]=g[1],M[y*3+2]=g[2],N[y*4]=T[0],N[y*4+1]=T[1],N[y*4+2]=T[2],N[y*4+3]=T[3],z[y*3]=C[0],z[y*3+1]=C[1],z[y*3+2]=C[2]}let V={TRANSLATION:p(M,"VEC3",0,5126,O),ROTATION:p(N,"VEC4",0,5126,O),SCALE:p(z,"VEC3",0,5126,O)};if(ne.instanceColor?.array&&ne.instanceColor.array.length>=O*3){let y=new Float32Array(ne.instanceColor.array.subarray(0,O*3));V._COLOR_0=p(y,"VEC3",0,5126,O)}_.extensions={..._.extensions||{},EXT_mesh_gpu_instancing:{attributes:V}},a.add("EXT_mesh_gpu_instancing")}let re=s.length;s.push({primitives:[ie],name:S.name,..._.extras?{extras:_.extras}:{}}),_.mesh=re}}let U=c.length;if(c.push(_),u.push(S),S.children.length>0){_.children=[];for(let q of S.children)_.children.push(A(q))}return U}for(let S of t.children)E.push(A(S));let x=e?.animateCallback||e?.animateFn||(typeof t.userData?.animate=="function"?t.userData.animate:typeof t.__animateFn=="function"?t.__animateFn:typeof globalThis.animate=="function"?globalThis.animate:void 0),R=[];if(typeof x=="function"&&u.length>0){let S=e?.duration??4,_=e?.fps??15,v=Math.max(2,Math.round(S*_)+1),G=new Float32Array(v),L=u.map($=>({px:$.position.x,py:$.position.y,pz:$.position.z,qx:$.quaternion.x,qy:$.quaternion.y,qz:$.quaternion.z,qw:$.quaternion.w,sx:$.scale.x,sy:$.scale.y,sz:$.scale.z})),U=u.map(()=>new Float32Array(v*3)),q=u.map(()=>new Float32Array(v*4)),W=u.map(()=>new Float32Array(v*3));for(let $=0;$<v;$++){let ne=$/(v-1)*S;G[$]=ne;try{x(ne)}catch{}for(let re=0;re<u.length;re++){let O=u[re];U[re][$*3]=O.position.x,U[re][$*3+1]=O.position.y,U[re][$*3+2]=O.position.z,q[re][$*4]=O.quaternion.x,q[re][$*4+1]=O.quaternion.y,q[re][$*4+2]=O.quaternion.z,q[re][$*4+3]=O.quaternion.w,W[re][$*3]=O.scale.x,W[re][$*3+1]=O.scale.y,W[re][$*3+2]=O.scale.z}}for(let $=0;$<u.length;$++){let ne=u[$],re=L[$];ne.position.set(re.px,re.py,re.pz),ne.quaternion.set(re.qx,re.qy,re.qz,re.qw),ne.scale.set(re.sx,re.sy,re.sz)}t.updateMatrixWorld(!0);let K=null,Y=()=>(K===null&&(K=p(G,"SCALAR",0,5126,v,[0],[S])),K),te=[],ie=[];for(let $=0;$<u.length;$++){let ne=L[$],re=!1,O=!1,X=!1;for(let M=0;M<v;M++)(Math.abs(U[$][M*3]-ne.px)>1e-4||Math.abs(U[$][M*3+1]-ne.py)>1e-4||Math.abs(U[$][M*3+2]-ne.pz)>1e-4)&&(re=!0),(Math.abs(q[$][M*4]-ne.qx)>1e-4||Math.abs(q[$][M*4+1]-ne.qy)>1e-4||Math.abs(q[$][M*4+2]-ne.qz)>1e-4||Math.abs(q[$][M*4+3]-ne.qw)>1e-4)&&(O=!0),(Math.abs(W[$][M*3]-ne.sx)>1e-4||Math.abs(W[$][M*3+1]-ne.sy)>1e-4||Math.abs(W[$][M*3+2]-ne.sz)>1e-4)&&(X=!0);if(re){let M=p(U[$],"VEC3",0,5126,v),N=te.length;te.push({input:Y(),interpolation:"LINEAR",output:M}),ie.push({sampler:N,target:{node:$,path:"translation"}})}if(O){let M=p(q[$],"VEC4",0,5126,v),N=te.length;te.push({input:Y(),interpolation:"LINEAR",output:M}),ie.push({sampler:N,target:{node:$,path:"rotation"}})}if(X){let M=p(W[$],"VEC3",0,5126,v),N=te.length;te.push({input:Y(),interpolation:"LINEAR",output:M}),ie.push({sampler:N,target:{node:$,path:"scale"}})}}ie.length>0&&R.push({name:"ProceduralLoop",samplers:te,channels:ie})}let I=Oi(c,s,t.userData),P={asset:{version:"2.0",generator:"ThreeLiveConvert",extras:{environmentIntensity:t.environmentIntensity}},scenes:[{nodes:E}],scene:0,nodes:c,meshes:s,materials:l,accessors:o,bufferViews:i,buffers:[{byteLength:r}],...R.length>0?{animations:R}:{},...I||a.size>0?{extensionsUsed:[...I?["KHR_interactivity"]:[],...a]}:{},...I||f.length>0?{extensions:{...I?{KHR_interactivity:I}:{},...f.length>0?{KHR_materials_variants:{variants:f.map(S=>({name:S}))}}:{}}}:{}},k=new Uint8Array(r),D=0;for(let S of n)k.set(S,D),D+=S.byteLength;return{gltf:P,bin:k.buffer,lights:h,environmentIntensity:t.environmentIntensity}}function En(t){return new TextEncoder().encode(t)}function Wt(t,e){let{gltf:n,bin:r}=Ut(t,e),i=JSON.stringify(n),o=En(i),s=(4-o.byteLength%4)%4,c=o.byteLength+s,a=20+c+8+r.byteLength,u=new Uint8Array(a),l=new DataView(u.buffer);l.setUint32(0,1179937895,!0),l.setUint32(4,2,!0),l.setUint32(8,a,!0),l.setUint32(12,c,!0),l.setUint32(16,1313821514,!0),u.set(o,20);for(let f=0;f<s;f++)u[20+o.byteLength+f]=32;let m=20+c;return l.setUint32(m,r.byteLength,!0),l.setUint32(m+4,5130562,!0),u.set(new Uint8Array(r),m+8),u}function Ts(t,e){t.updateMatrixWorld(!0);let n=[];return t.traverse(r=>{if(r.geometry){let i=r.geometry,o=i.attributes.position;if(!o||o.count===0)return;let s=o.count,c=new Float32Array(s*3),a=r.matrixWorld.elements;for(let D=0;D<s;D++){let S=o.getX(D),_=o.getY(D),v=o.getZ(D);c[D*3]=a[0]*S+a[4]*_+a[8]*v+a[12],c[D*3+1]=a[1]*S+a[5]*_+a[9]*v+a[13],c[D*3+2]=a[2]*S+a[6]*_+a[10]*v+a[14]}let u;if(i.attributes.normal){let D=i.attributes.normal;u=new Float32Array(s*3);let S=new Float32Array(9);Le(S,a);for(let _=0;_<s;_++){let v=D.getX(_),G=D.getY(_),L=D.getZ(_),U=S[0]*v+S[3]*G+S[6]*L,q=S[1]*v+S[4]*G+S[7]*L,W=S[2]*v+S[5]*G+S[8]*L,K=Math.hypot(U,q,W)||1;u[_*3]=U/K,u[_*3+1]=q/K,u[_*3+2]=W/K}}let l;if(i.attributes.uv){let D=i.attributes.uv;l=new Float32Array(s*2);for(let S=0;S<s;S++)l[S*2]=D.getX(S),l[S*2+1]=D.getY(S)}let m;if(i.index)m=i.index.array;else{m=s>65535?new Uint32Array(s):new Uint16Array(s);for(let D=0;D<s;D++)m[D]=D}let f="DefaultMaterial",h=[.8,.8,.8],b=.5,d=.1,p=0,E=0,A=1.5,x=1,R=[0,0,0];if(r.material){let D=r.material;f=D.name||`Material_${n.length}`,D.color&&(h=[D.color.r,D.color.g,D.color.b]),typeof D.roughness=="number"&&(b=D.roughness),typeof D.metalness=="number"&&(d=D.metalness),typeof D.clearcoat=="number"&&(p=D.clearcoat),typeof D.clearcoatRoughness=="number"&&(E=D.clearcoatRoughness),typeof D.ior=="number"&&(A=D.ior);let S=typeof D.opacity=="number"?D.opacity:1,_=typeof D.transmission=="number"?D.transmission:0;if(x=S*(1-_),D.emissive&&(D.emissive.r>0||D.emissive.g>0||D.emissive.b>0)){let v=D.emissiveIntensity??1;R=[D.emissive.r*v,D.emissive.g*v,D.emissive.b*v]}}let I,P=e?.animateCallback||e?.animateFn||(typeof t.userData?.animate=="function"?t.userData.animate:typeof t.__animateFn=="function"?t.__animateFn:typeof globalThis.animate=="function"?globalThis.animate:void 0);if(typeof P=="function"){let D=e?.duration??4,S=e?.fps??4,_=Math.max(2,Math.round(D*S)+1),v=[],G=[],L=[],U=[],q=[r.position.x,r.position.y,r.position.z],W=[r.quaternion.x,r.quaternion.y,r.quaternion.z,r.quaternion.w],K=[r.scale.x,r.scale.y,r.scale.z],Y=!1;for(let te=0;te<_;te++){let ie=te/(_-1)*D;v.push(ie);try{P(ie)}catch{}G.push([r.position.x,r.position.y,r.position.z]),L.push([r.quaternion.x,r.quaternion.y,r.quaternion.z,r.quaternion.w]),U.push([r.scale.x,r.scale.y,r.scale.z]),(Math.abs(r.position.x-q[0])>1e-4||Math.abs(r.position.y-q[1])>1e-4||Math.abs(r.position.z-q[2])>1e-4||Math.abs(r.quaternion.x-W[0])>1e-4||Math.abs(r.quaternion.y-W[1])>1e-4||Math.abs(r.quaternion.z-W[2])>1e-4||Math.abs(r.quaternion.w-W[3])>1e-4||Math.abs(r.scale.x-K[0])>1e-4)&&(Y=!0)}r.position.set(q[0],q[1],q[2]),r.quaternion.set(W[0],W[1],W[2],W[3]),r.scale.set(K[0],K[1],K[2]),Y&&(I={times:v,translations:G,rotations:L,scales:U})}let k=r;if(k.isInstancedMesh&&typeof k.count=="number"&&k.count>0&&k.instanceMatrix?.array){let D=Math.min(1e3,Math.floor(k.count)),S=k.instanceMatrix.array,_=k.instanceColor?.array,v=r.name||`Mesh_${n.length}`,G=new Float32Array(16),L=new Float32Array(9);for(let U=0;U<D;U++){let q=S.subarray(U*16,(U+1)*16);Ee(G,a,q);let W=new Float32Array(s*3);for(let ie=0;ie<s;ie++){let $=o.getX(ie),ne=o.getY(ie),re=o.getZ(ie);W[ie*3]=G[0]*$+G[4]*ne+G[8]*re+G[12],W[ie*3+1]=G[1]*$+G[5]*ne+G[9]*re+G[13],W[ie*3+2]=G[2]*$+G[6]*ne+G[10]*re+G[14]}let K;if(i.attributes.normal){let ie=i.attributes.normal;K=new Float32Array(s*3),Le(L,G);for(let $=0;$<s;$++){let ne=ie.getX($),re=ie.getY($),O=ie.getZ($),X=L[0]*ne+L[3]*re+L[6]*O,M=L[1]*ne+L[4]*re+L[7]*O,N=L[2]*ne+L[5]*re+L[8]*O,z=Math.hypot(X,M,N)||1;K[$*3]=X/z,K[$*3+1]=M/z,K[$*3+2]=N/z}}let Y=h,te=f;_&&_.length>=(U+1)*3&&(Y=[h[0]*_[U*3],h[1]*_[U*3+1],h[2]*_[U*3+2]],te=`${f}_inst_${U}`),n.push({name:`${v}_${U}`,positions:W,indices:m,normals:K,uvs:l,materialName:te,color:Y,roughness:b,metallic:d,clearcoat:p,clearcoatRoughness:E,ior:A,opacity:x,emissiveColor:R,xrTraits:r.userData?.xr})}return}n.push({name:r.name||`Mesh_${n.length}`,positions:c,indices:m,normals:u,uvs:l,materialName:f,color:h,roughness:b,metallic:d,clearcoat:p,clearcoatRoughness:E,ior:A,opacity:x,emissiveColor:R,xrTraits:r.userData?.xr,timeSamples:I})}}),n}function ro(t){let e=[],n=t.gltf,r=pe().decoders.get("meshopt");r&&typeof r.decodeBufferViews=="function"&&r.decodeBufferViews(n,t);let i=t.bin,o=i instanceof ArrayBuffer?i:i.buffer.slice(i.byteOffset,i.byteOffset+i.byteLength),s=n.accessors||[],c=n.bufferViews||[],a=n.materials||[],u=n.meshes||[],l=n.nodes||[];function m(b){let d=s[b];if(!d)throw new Error(`Accessor ${b} not found`);let p=c[d.bufferView||0],E=(p.byteOffset||0)+(d.byteOffset||0),A=p.byteLength||0,x=o.slice(E,E+A);return{acc:d,buffer:x}}let f=new Map;if(l.length>0){let b=it(n);for(let d=0;d<b.length;d++)f.set(d,b[d])}function h(b,d,p,E){let A=u[b];if(!A)return;let x=new Float32Array(9);Le(x,d);for(let R=0;R<(A.primitives||[]).length;R++){let I=A.primitives[R],P=I.attributes?.POSITION;if(P===void 0)continue;let{acc:k,buffer:D}=m(P),S=new Float32Array(D,0,k.count*3),_=new Float32Array(S.length);for(let M=0;M<k.count;M++){let N=S[M*3],z=S[M*3+1],V=S[M*3+2];_[M*3]=d[0]*N+d[4]*z+d[8]*V+d[12],_[M*3+1]=d[1]*N+d[5]*z+d[9]*V+d[13],_[M*3+2]=d[2]*N+d[6]*z+d[10]*V+d[14]}let v,G=I.attributes?.NORMAL;if(G!==void 0){let{acc:M,buffer:N}=m(G),z=new Float32Array(N,0,M.count*3);v=new Float32Array(z.length);for(let V=0;V<M.count;V++){let y=z[V*3],g=z[V*3+1],T=z[V*3+2],C=x[0]*y+x[3]*g+x[6]*T,B=x[1]*y+x[4]*g+x[7]*T,w=x[2]*y+x[5]*g+x[8]*T,F=Math.hypot(C,B,w)||1;v[V*3]=C/F,v[V*3+1]=B/F,v[V*3+2]=w/F}}let L,U=I.attributes?.TEXCOORD_0;if(U!==void 0){let{acc:M,buffer:N}=m(U);L=new Float32Array(N,0,M.count*2)}let q;if(I.indices!==void 0){let{acc:M,buffer:N}=m(I.indices);M.componentType===5125?q=new Uint32Array(N,0,M.count):q=new Uint16Array(N,0,M.count);let z=k.count;for(let V of q)if(V>=z)throw new Error(`SecurityError: Index buffer value (${V}) out of vertex bounds [0, ${z}).`)}else{let M=k.count;q=M>65535?new Uint32Array(M):new Uint16Array(M);for(let N=0;N<M;N++)q[N]=N}let W="DefaultMaterial",K=[.8,.8,.8],Y=.5,te=.1,ie=0,$=0,ne=1.5,re=1,O=[0,0,0];if(I.material!==void 0&&a[I.material]){let M=a[I.material];W=M.name||`Material_${I.material}`;let N=M.pbrMetallicRoughness||{},z=1;Array.isArray(N.baseColorFactor)&&(K=[N.baseColorFactor[0],N.baseColorFactor[1],N.baseColorFactor[2]],typeof N.baseColorFactor[3]=="number"&&(z=N.baseColorFactor[3])),typeof N.roughnessFactor=="number"&&(Y=N.roughnessFactor),typeof N.metallicFactor=="number"&&(te=N.metallicFactor),Array.isArray(M.emissiveFactor)&&M.emissiveFactor.length>=3&&(O=[M.emissiveFactor[0],M.emissiveFactor[1],M.emissiveFactor[2]]);let V=M.extensions||{};V.KHR_materials_clearcoat&&(ie=V.KHR_materials_clearcoat.clearcoatFactor??0,$=V.KHR_materials_clearcoat.clearcoatRoughnessFactor??0),V.KHR_materials_ior&&typeof V.KHR_materials_ior.ior=="number"&&(ne=V.KHR_materials_ior.ior);let y=V.KHR_materials_transmission?.transmissionFactor??0;re=z*(1-y)}let X=(A.primitives||[]).length>1?`${p}_p${R}`:p;e.push({name:X,positions:_,indices:q,normals:v,uvs:L,materialName:W,color:K,roughness:Y,metallic:te,clearcoat:ie,clearcoatRoughness:$,ior:ne,opacity:re,emissiveColor:O,xrTraits:E?.xr||A.extras?.xr})}}if(l.length>0)for(let b=0;b<l.length;b++){let d=l[b];if(d.mesh!==void 0&&d.mesh<u.length){let p=f.get(b)||we(),E=d.name||u[d.mesh].name||`Node_${b}`,A=d.extensions?.EXT_mesh_gpu_instancing?.attributes;if(A&&typeof A=="object"){let x=A.TRANSLATION,R=A.ROTATION,I=A.SCALE,P=x!==void 0?(()=>{let{acc:_,buffer:v}=m(x);return new Float32Array(v,0,_.count*3)})():null,k=R!==void 0?(()=>{let{acc:_,buffer:v}=m(R);return new Float32Array(v,0,_.count*4)})():null,D=I!==void 0?(()=>{let{acc:_,buffer:v}=m(I);return new Float32Array(v,0,_.count*3)})():null,S=Math.min(1e3,P?P.length/3:k?k.length/4:D?D.length/3:0);if(S>0){let _=new Float32Array(16),v=new Float32Array(16);for(let G=0;G<S;G++){let L=P?[P[G*3],P[G*3+1],P[G*3+2]]:[0,0,0],U=k?[k[G*4],k[G*4+1],k[G*4+2],k[G*4+3]]:[0,0,0,1],q=D?[D[G*3],D[G*3+1],D[G*3+2]]:[1,1,1];rt(_,U,L,q),Ee(v,p,_),h(d.mesh,v,`${E}_${G}`,d.extras)}continue}}h(d.mesh,p,E,d.extras)}}else{let b=we();for(let d=0;d<u.length;d++){let p=u[d].name||`Mesh_${d}`;h(d,b,p,u[d].extras)}}return e}function Nr(t,e){if(!t||typeof t!="string")return e;let n=t.replace(/[^A-Za-z0-9_]/g,"_");return/^[0-9]/.test(n)&&(n="_"+n),n||e}function to(t){return String(t??"").replace(/[\x00-\x1f\x7f]/g,"").replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function xe(t){if(!Number.isFinite(t)||Math.abs(t)<1e-7)return"0";let e=Number(t.toFixed(5)).toString();return e.indexOf(".")===-1?`${e}.0`:e}function no(t){let e=t.length/3,n=new Array(e);for(let r=0;r<e;r++)n[r]=`(${xe(t[r*3])}, ${xe(t[r*3+1])}, ${xe(t[r*3+2])})`;return n.join(", ")}function ws(t,e){let n=new Array(e);for(let r=0;r<e;r++)n[r]=`(${xe(t[r*2])}, ${xe(1-t[r*2+1])})`;return n.join(", ")}function Ms(t){return Array.from(t).join(", ")}function Fr(t){let e=new Map;for(let a of t){let u=Nr(a.materialName,"DefaultMaterial");e.has(u)||e.set(u,{color:a.color||[.8,.8,.8],roughness:a.roughness??.5,metallic:a.metallic??0,clearcoat:a.clearcoat??0,clearcoatRoughness:a.clearcoatRoughness??0,ior:a.ior??1.5,opacity:a.opacity??1,emissiveColor:a.emissiveColor||[0,0,0]})}let n=0,r=null;for(let a of t){if(a.timeSamples&&a.timeSamples.times.length>0){let u=a.timeSamples.times[a.timeSamples.times.length-1];u>n&&(n=u)}a.xrTraits?.anchor&&!r&&(r=a.xrTraits.anchor==="vertical"||a.xrTraits.anchor==="wall"?"vertical":"horizontal")}let i="";n>0&&(i=`startTimeCode = 0
|
|
234
|
-
endTimeCode = ${
|
|
251
|
+
void main(){fragColor=uColorId;}`;function yo(e,t,n){let r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),!e.getShaderParameter(r,35713)){let i=e.getShaderInfoLog(r);throw e.deleteShader(r),new Error(`Shader compile error: ${i}`)}return r}function Zr(e,t,n){let r=yo(e,35633,t),i=yo(e,35632,n),o=e.createProgram();if(e.attachShader(o,r),e.attachShader(o,i),e.linkProgram(o),!e.getProgramParameter(o,35714)){let a=e.getProgramInfoLog(o);throw e.deleteProgram(o),new Error(`Program link error: ${a}`)}return o}function Qr(e,t,n){let r={};for(let i of n)r[i]=e.getUniformLocation(t,i);return r}var go=["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 So(){let e=ge().xrDepthShader;return{fs:ca.replace("/*XRD_U*/",e?.uniformsGLSL||"").replace("/*XRD_O*/",e?.occlusionGLSL||""),uniforms:e?[...go,...e.uniformNames]:go}}function ma(e){if(typeof e!="string")return null;let t=e.trim();if(!t||/[\x00-\x1f\x7f]/.test(t))return null;let n=t.toLowerCase();return n.startsWith("data:")?/^data:image\/(png|jpeg|jpg|webp|ktx2|avif)(;|,)/i.test(t)?t:null:n.startsWith("https://")||n.startsWith("blob:")?t:n.startsWith("//")||/^[a-z][a-z0-9+.-]*:/i.test(t)||/(^|[\\/])\.\.([\\/]|$)/.test(t)?null:t}function jr(e,t,n,r,i,o,a,u){if(r===void 0||!t.accessors?.[r])return null;let s=it(t,n,t.accessors[r],o);if(!s)return null;u&&(s=s.slice(),bo(s,u));let c=e.createBuffer();return a.push(c),e.bindBuffer(34962,c),e.bufferData(34962,s,35044),e.enableVertexAttribArray(i),e.vertexAttribPointer(i,o,5126,!1,0,0),s}function Kr(e){let t=Number(e);return Number.isFinite(t)?Math.max(0,t):1}function Eo(e,t,n){let r=So(),i=wo,o=r.fs,a=!1;for(let s of Ne)if(s.onResolveShader){let c=s.onResolveShader(t,n,i,o);c&&(i=c.vs,o=c.fs,a=!0)}let u=a?Zr(e,i,o):null;return{program:u,uniforms:u?Qr(e,u,r.uniforms):null}}function fa(e,t,n){let r=t.instanceMatrices;if(!r||r.length<16||typeof e.vertexAttribDivisor!="function"||typeof e.drawElementsInstanced!="function")return!1;let i=r.length>>4,o=t.instanceColors,a=new Float32Array(i*20);for(let s=0;s<i;s++)a.set(r.subarray(s*16,s*16+16),s*20),a[s*20+16]=o?o[s*3]:1,a[s*20+17]=o?o[s*3+1]:1,a[s*20+18]=o?o[s*3+2]:1,a[s*20+19]=1;let u=e.createBuffer();n.push(u),e.bindBuffer(34962,u),e.bufferData(34962,a,35044);for(let s=0;s<5;s++)e.enableVertexAttribArray(8+s),e.vertexAttribPointer(8+s,4,5126,!1,80,s*16),e.vertexAttribDivisor(8+s,1);return!0}function ha(e,t){let n=e.materials?.[t?.material];if(!n)return null;let r=[n.pbrMetallicRoughness?.baseColorTexture,n.pbrMetallicRoughness?.metallicRoughnessTexture,n.normalTexture,n.occlusionTexture,n.emissiveTexture];for(let i of r){let o=i?.extensions?.KHR_texture_transform;if(o&&typeof o=="object")return o}return null}var Ro=Object.freeze({maxMeshes:1e3,maxTextures:64,maxVertices:1e6,maxIndices:3e6}),_o=Object.freeze({maxMeshes:1/0,maxTextures:1/0,maxVertices:1/0,maxIndices:1/0});function Bn(e,t){t.indices?e.drawElements(4,t.indexCount,t.indexType,0):e.drawArrays(4,0,t.indexCount)}function Io(e,t){let n=e?.pbrMetallicRoughness,r=n?.baseColorFactor,i=e?.extensions?.KHR_materials_clearcoat,o=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:n?.metallicFactor??.1,roughness:n?.roughnessFactor??.5,clearcoat:i?i.clearcoatFactor??1:0,clearcoatRoughness:Math.max(.04,i?.clearcoatRoughnessFactor??.04),texture:o(n?.baseColorTexture),metallicRoughnessTexture:o(n?.metallicRoughnessTexture),normalTexture:o(e?.normalTexture),normalScale:e?.normalTexture?.scale??1,occlusionTexture:o(e?.occlusionTexture),occlusionStrength:e?.occlusionTexture?.strength??1,isTransmissive:(e?.extensions?.KHR_materials_transmission?.transmissionFactor??0)>0}}function Co(e,t,n){let r=new Set,i=o=>{o&&!r.has(o)&&(r.add(o),e.deleteTexture(o))};for(let o of t)for(let a of o.primitives){if(a.vao&&e.deleteVertexArray(a.vao),a.buffers)for(let s of a.buffers)e.deleteBuffer(s);i(a.texture),i(a.metallicRoughnessTexture),i(a.normalTexture),i(a.occlusionTexture);let u=new Set;a.customProgram&&u.add(a.customProgram);for(let s of a.programCache?.values()??[])s.program&&u.add(s.program);for(let s of u)e.deleteProgram(s)}if(n)for(let o of n)i(o)}function xo(e,t,n=_o,r){let i={meshes:[],mesh:null,gpuTextures:[],vao:null,buffers:[]};try{return da(e,t,n,r,i)}catch(o){let a=i.mesh&&!i.meshes.includes(i.mesh)?[...i.meshes,i.mesh]:i.meshes;Co(e,a,i.gpuTextures),i.vao&&e.deleteVertexArray(i.vao);for(let u of i.buffers)e.deleteBuffer(u);throw o}}function da(e,t,n,r,i){if(!t||!t.gltf)throw new Error("Invalid GLBData passed to buildGpuScene: missing gltf object.");let{gltf:o}=t,a=$t("meshopt");a?.decodeBufferViews&&a.decodeBufferViews(o,t);let u=t.bin,s=[];i.meshes=s;let c=[],l=o.extensions?.KHR_materials_variants;l&&Array.isArray(l.variants)&&l.variants.forEach((M,k)=>{c.push(typeof M?.name=="string"&&M.name?M.name:`Variant_${k}`)});let f=ft(o),m=[];if(Array.isArray(o.nodes))for(let M=0;M<o.nodes.length;M++){let k=o.nodes[M];k.mesh!==void 0&&o.meshes&&o.meshes[k.mesh]&&m.push({node:k,nodeIdx:M,meshIdx:k.mesh})}let h=m.length>0?m:(o.meshes||[]).map((M,k)=>({node:M,nodeIdx:-1,meshIdx:k})),p=[];if(Array.isArray(t.lights)&&t.lights.length>0)p.push(...t.lights);else if(o.extensions?.KHR_lights_punctual?.lights){let M=o.extensions.KHR_lights_punctual.lights;for(let k of M){let R=k.type==="directional"?"directional":k.type==="point"?"point":"ambient";p.push({type:R,color:k.color||[1,1,1],intensity:k.intensity!==void 0?k.intensity:1})}}if(p.length===0&&(p.push({type:"ambient",color:[1,1,1],intensity:.35}),p.push({type:"directional",color:[1,1,1],intensity:.85,direction:[.5,1,.8]})),h.length>n.maxMeshes)throw new Error(`SecurityError: GLB scene exceeds host mesh limit (${n.maxMeshes}). Found: ${h.length}`);let d=[];if(i.gpuTextures=d,o.textures&&o.images){if(o.textures.length>n.maxTextures)throw new Error(`SecurityError: GLB scene exceeds host texture limit (${n.maxTextures}). Found: ${o.textures.length}`);for(let M=0;M<o.textures.length;M++){let k=o.textures[M],R=o.images[k.source];if(R){let B=e.createTexture();if(e.bindTexture(3553,B),e.texImage2D(3553,0,6408,1,1,0,6408,5121,new Uint8Array([255,255,255,255])),e.texParameteri(3553,10242,10497),e.texParameteri(3553,10243,10497),e.texParameteri(3553,10241,9729),e.texParameteri(3553,10240,9729),R.bufferView!==void 0){let Z=o.bufferViews[R.bufferView],j=u.slice(Z.byteOffset||0,(Z.byteOffset||0)+Z.byteLength),ie=new Blob([j],{type:R.mimeType||"image/png"});typeof createImageBitmap=="function"&&createImageBitmap(ie).then(ee=>{e.bindTexture(3553,B),e.texImage2D(3553,0,6408,6408,5121,ee),e.generateMipmap(3553),r?.()}).catch(()=>{})}else if(R.uri){let Z=ma(R.uri);if(Z){let j=new Image;j.crossOrigin="anonymous",j.referrerPolicy="no-referrer",j.onload=()=>{e.bindTexture(3553,B),e.texImage2D(3553,0,6408,6408,5121,j),e.generateMipmap(3553),r?.()},j.src=Z}else console.warn("[Three-Live Security] Blocked unsafe glTF image URI:",R.uri)}d.push(B)}else d.push(null)}}let y=[1/0,1/0,1/0],T=[-1/0,-1/0,-1/0],S=0,b=0;for(let M=0;M<h.length;M++){let k=h[M],R=o.meshes[k.meshIdx],B=k.nodeIdx>=0?f[k.nodeIdx]:Te(),Z=new Float32Array(9);De(Z,B);let j={name:k.node.name||R.name||`Mesh_${k.meshIdx}`,nodeIndex:k.nodeIdx,transform:B,normalMatrix:Z,primitives:[],extras:k.node.extras||R.extras};i.mesh=j;let ie=k.node?.extensions?.EXT_mesh_gpu_instancing;if(ie&&ie.attributes&&typeof ie.attributes=="object"){let ee=ie.attributes,ne=ee.TRANSLATION!==void 0?o.accessors?.[ee.TRANSLATION]:null,X=ee.ROTATION!==void 0?o.accessors?.[ee.ROTATION]:null,ae=ee.SCALE!==void 0?o.accessors?.[ee.SCALE]:null,se=ee._COLOR_0!==void 0?o.accessors?.[ee._COLOR_0]:null,F=Number(ne?.count??X?.count??ae?.count??0);if(!Number.isFinite(F)||F<0||F>1e4)throw new Error(`SecurityError: EXT_mesh_gpu_instancing exceeds maximum instance limit (10000). Found: ${F}`);if(F>0){let H=(re,D)=>{if(!re||re.bufferView===void 0||!o.bufferViews?.[re.bufferView])return null;let x=re.componentType??5126,C=z=>(console.warn(`[three-live] EXT_mesh_gpu_instancing: skipping accessor (${z})`),null);if(x!==5120&&x!==5121&&x!==5122&&x!==5123&&x!==5126)return C(`componentType ${x}`);if(!(Number(re.count)>=F))return C(`count ${re.count} < ${F}`);let L=null;try{L=it(o,u,{...re,count:F},D)}catch{return C("out of bounds")}return!L||!L.every(Number.isFinite)?C("non-finite value"):L},E=H(ne,3),V=H(X,4),O=H(ae,3),U=se?.type==="VEC4"?4:3,G=H(se,U),K=new Float32Array(F*16),ue=Te();for(let re=0;re<F;re++){let D=E?[E[re*3],E[re*3+1],E[re*3+2]]:[0,0,0],x=V?[V[re*4],V[re*4+1],V[re*4+2],V[re*4+3]]:[0,0,0,1],C=O?[O[re*3],O[re*3+1],O[re*3+2]]:[1,1,1];Qe(ue,x,D,C),K.set(ue,re*16)}if(j.instanceMatrices=K,G){let re=new Float32Array(F*3);for(let D=0;D<F;D++)re[D*3]=G[D*U],re[D*3+1]=G[D*U+1],re[D*3+2]=G[D*U+2];j.instanceColors=re}}}for(let ee of R.primitives||[]){if(ee.extensions?.KHR_draco_mesh_compression){let L=$t("draco");L&&L.decodePrimitive(o,ee,u)}let ne=[],X=e.createVertexArray();i.vao=X,i.buffers=ne,e.bindVertexArray(X);let ae=fa(e,j,ne),se=o.accessors[ee.attributes.POSITION],F=Number(se?.count??0);if(!Number.isFinite(F)||F<0||S+F>n.maxVertices)throw new Error(`SecurityError: GLB scene exceeds host vertex limit (${n.maxVertices}).`);if(S+=F,se?.min&&se?.max){let L=z=>{for(let W=0;W<3;W++){let $=z[12+W],Y=z[12+W];for(let Q=0;Q<3;Q++){let q=z[Q*4+W]*se.min[Q],J=z[Q*4+W]*se.max[Q];$+=q<J?q:J,Y+=q>J?q:J}$<y[W]&&(y[W]=$),Y>T[W]&&(T[W]=Y)}};if(j.instanceMatrices&&j.instanceMatrices.length>=16){let z=j.instanceMatrices.length>>4,W=Te();for(let $=0;$<z;$++){let Y=j.instanceMatrices.subarray($*16,$*16+16);Re(W,B,Y),L(W)}}else L(B)}let H=jr(e,o,u,ee.attributes.POSITION,0,3,ne);jr(e,o,u,ee.attributes.NORMAL,1,3,ne),jr(e,o,u,ee.attributes.TEXCOORD_0,2,2,ne,ha(o,ee));let E=0,V=5123,O=null;if(ee.indices!==void 0){let L=o.accessors[ee.indices],W=(o.bufferViews[L.bufferView].byteOffset||0)+(L.byteOffset||0);if(E=Number(L.count??0),!Number.isFinite(E)||E<0||b+E>n.maxIndices)throw new Error(`SecurityError: GLB scene exceeds host index limit (${n.maxIndices}).`);b+=E,V=L.componentType===5125?5125||5125:5123||5123;let $=e.createBuffer();ne.push($),e.bindBuffer(34963,$),L.componentType===5125?(O=new Uint32Array(u,W,L.count),e.bufferData(34963,O,35044)):L.componentType===5121?(O=Uint16Array.from(new Uint8Array(u,W,L.count)),e.bufferData(34963,O,35044)):(O=W%2===0?new Uint16Array(u,W,L.count):new Uint16Array(u.slice(W,W+L.count*2)),e.bufferData(34963,O,35044))}else E=se.count;let U={};for(let L of Ne)if(L.onBuildPrimitiveVAO){let z=L.onBuildPrimitiveVAO(e,X,ee,o,u);z&&(U[L.name]=z)}e.bindVertexArray(null);let G=o.materials&&ee.material!==void 0?o.materials[ee.material]:null,{program:K,uniforms:ue}=Eo(e,ee,G),re=Io(G,d),D=!!(G?.extensions?.KHR_materials_transmission||U.materials?.isTransmissive),x=ee.extensions?.KHR_materials_variants?.mappings,C=Array.isArray(x)?x.filter(L=>L&&typeof L.material=="number"&&Array.isArray(L.variants)).map(L=>({material:L.material|0,variants:L.variants.map(z=>Number(z)|0)})):void 0;j.primitives.push({vao:X,instanced:ae,indexCount:E,indexType:V,...re,positions:H,indices:O,buffers:ne,materialIndex:ee.material,defaultMaterialIndex:ee.material,variantMappings:C,primitiveDef:ee,programCache:new Map([[ee.material??-1,{program:K,uniforms:ue}]]),pluginData:U,customProgram:K,customUniforms:ue,isTransmissive:D})}s.push(j)}isFinite(y[0])||(y=[-1,-1,-1]),isFinite(T[0])||(T=[1,1,1]);let A=[(y[0]+T[0])/2,(y[1]+T[1])/2,(y[2]+T[2])/2],w=T[0]-y[0],P=T[1]-y[1],N=T[2]-y[2],I=Math.max(Math.hypot(w,P,N)/2,.5),_=[y[0],y[1],y[2]],v=[T[0],T[1],T[2]],g=t.animations;if(!g){for(let M of Ne)if(M.onParseGLB?.(t),t.animations){g=t.animations;break}}return g||(g=[]),{meshes:s,bounds:{center:A,radius:I,min:_,max:v},lights:p,animations:g,worldMatrices:f,gpuTextures:d,availableVariants:c}}function rn(e){let t=e.customTarget||e.bounds.center,n=e.currDistance*Math.cos(e.currPhi);return[t[0]+n*Math.sin(e.currTheta),t[1]+e.currDistance*Math.sin(e.currPhi),t[2]+n*Math.cos(e.currTheta)]}var He=class{constructor(t,n,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=Te();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=Te();this.viewMatrix=Te();this.activeViewMatrix=null;this.modelMatrix=Te();this.mvpMatrix=Te();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:Te(),rawValueToMeters:.001,format:0};this.container=t;let i,o;if(n&&typeof n.getContext=="function"?(i=n,o=r):(o=n,i=o?.canvas),!i){let s=t.querySelector("canvas");s||(s=document.createElement("canvas"),s.style.width="100%",s.style.height="100%",s.style.display="block",s.style.touchAction="none",t.prepend(s)),i=s}this.canvas=i,this.opts=o||{},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=Kr(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=_t(this.opts.toneMapping)),this.opts.autoplay!==void 0&&(this.autoplay=this.opts.autoplay),this.opts.animationName!==void 0&&(this.animationName=this.opts.animationName),this.opts.variantName!==void 0&&(this.activeVariantName=this.opts.variantName||null),this.opts.fieldOfView!==void 0&&(this.fov=this.opts.fieldOfView*Math.PI/180),this.opts.distanceMode!==void 0&&(this.distanceMode=this.opts.distanceMode),this.opts.cameraTarget!==void 0&&(this.setTarget(this.opts.cameraTarget[0],this.opts.cameraTarget[1],this.opts.cameraTarget[2]),this.initialCustomTarget=[...this.opts.cameraTarget]),(this.opts.minCameraOrbit||this.opts.maxCameraOrbit)&&this.setOrbitLimits({minTheta:this.opts.minCameraOrbit?.theta,maxTheta:this.opts.maxCameraOrbit?.theta,minPhi:this.opts.minCameraOrbit?.phi,maxPhi:this.opts.maxCameraOrbit?.phi,minDistance:this.opts.minCameraOrbit?.distance,maxDistance:this.opts.maxCameraOrbit?.distance});let u=i.getContext("webgl2",{antialias:!0,alpha:!0,xrCompatible:!0});if(!u)throw new Error("WebGL2 not supported");this.gl=u,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,n){sa(t,n)}static getDecoder(t){return $t(t)}setupContextLossHandling(){let t=this.canvas;typeof t?.addEventListener=="function"&&(this.boundContextLost=n=>{n.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,n=So();this.renderProg=Zr(t,wo,n.fs),this.pickProg=Zr(t,ua,la),this.uRender=Qr(t,this.renderProg,n.uniforms),this.uPick=Qr(t,this.pickProg,["uMVP","uColorId"]),this.setupPickingFbo()}restoreContext(){let t=this.gl;this.contextLost=!1,this.initGlState();for(let n of Ne)n.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 n=Math.max(1,this.canvas.width),r=Math.max(1,this.canvas.height);this.pickFboWidth=n,this.pickFboHeight=r,t.bindTexture(3553,this.pickTexture),t.texImage2D(3553,0,6408,n,r,0,6408,5121,null),t.texParameteri(3553,10241,9728),t.texParameteri(3553,10240,9728),t.bindRenderbuffer(36161,this.pickDepth),t.renderbufferStorage(36161,33189,n,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,n){if(!this.pickFbo)return;let r=this.gl,i=Math.max(1,t),o=Math.max(1,n);this.pickFboWidth=i,this.pickFboHeight=o,r.bindTexture(3553,this.pickTexture),r.texImage2D(3553,0,6408,i,o,0,6408,5121,null),r.bindRenderbuffer(36161,this.pickDepth),r.renderbufferStorage(36161,33189,i,o)}loadGLBData(t,n){this.lastGlbData=t,this.lastLimits=n;let{meshes:r,bounds:i,lights:o,animations:a,worldMatrices:u,gpuTextures:s,availableVariants:c}=xo(this.gl,t,n,()=>this.render());if(this.disposeMeshGpuResources(),this.meshes=r,this.bounds=i,this.turntableRotation=0,this.updateTurntableMatrix(),this.lights=o,this.animations=a||[],this.worldMatrices=u||[],this.gpuTextures=s||[],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 Ne)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 l=t.exposure??t.gltf?.extras?.exposure??t.gltf?.asset?.extras?.exposure;l!==void 0&&(this.exposure=Kr(l));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(Ao(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(ht(t))}setBackdropGLB(t,n){if(this.disposeMeshListGpuResources(this.backdropMeshes),this.backdropMeshes=[],!t){this.update(0),this.render();return}let r=ht(t),{meshes:i}=xo(this.gl,r,_o,()=>this.render());if(n)for(let o of i)o.transform[12]+=n[0],o.transform[13]+=n[1],o.transform[14]+=n[2],De(o.normalMatrix,o.transform);this.backdropMeshes=i,this.update(0),this.render()}setClearColor(t,n,r,i=1){this.clearColor=[t,n,r,i]}updateMeshTransforms(t){for(let n=0;n<this.meshes.length;n++){let r=this.meshes[n],i;t instanceof Map?i=t.get(r.name)??t.get(n):Array.isArray(t)?i=t[n]:t&&typeof t=="object"&&(Object.prototype.hasOwnProperty.call(t,r.name)?i=t[r.name]:Object.prototype.hasOwnProperty.call(t,n)&&(i=t[n])),i&&i.length===16&&(r.transform.set(i),De(r.normalMatrix,r.transform))}}bindLights(t=this.uRender){let n=this.gl,r=[.28,.28,.28],i=[],o=[],a=[],u=[];for(let s of this.lights){let c=s.color||[1,1,1],l=s.intensity!==void 0?s.intensity:1;if(s.type==="ambient")r=[c[0]*l,c[1]*l,c[2]*l];else if(s.type==="directional"&&i.length<6){let f=s.direction||[.5,1,.8];i.push(f[0],f[1],f[2]),o.push(c[0]*l,c[1]*l,c[2]*l)}else if(s.type==="point"&&a.length<6){let f=s.position||[0,0,0];a.push(f[0],f[1],f[2]),u.push(c[0]*l,c[1]*l,c[2]*l)}}i.length===0&&(i.push(.5,1,.8),o.push(1,1,1)),n.uniform3fv(t.uAmbientColor,r),n.uniform1i(t.uNumDirLights,i.length/3),i.length>0&&(n.uniform3fv(t.uDirLightDir,i),n.uniform3fv(t.uDirLightColor,o)),n.uniform1i(t.uNumPointLights,a.length/3),a.length>0&&(n.uniform3fv(t.uPointLightPos,a),n.uniform3fv(t.uPointLightColor,u)),n.uniform1f(t.uEnvIntensity,this.envIntensity)}setExposure(t){this.exposure=Kr(t)}getExposure(){return this.exposure}setShadow(t,n){this.shadowIntensity=Math.max(0,Math.min(1,Number(t)||0)),n!==void 0&&(this.shadowSoftness=Math.max(0,Math.min(1,Number(n)||0)))}getShadowIntensity(){return this.shadowIntensity}getShadowSoftness(){return this.shadowSoftness}setToneMapping(t){this.toneMapping=_t(t)}getToneMapping(){return this.toneMapping}async setEnvironmentImage(t){for(let n of Ne)if(n.setEnvironmentImage){await n.setEnvironmentImage(this,t);return}}async setSkyboxImage(t){for(let n of Ne)if(n.setSkyboxImage){await n.setSkyboxImage(this,t);return}}setInteractive(t){this.interactive=t}isInteractive(){return this.interactive}getCameraOrbit(){let t=this.currTheta,n=this.currPhi,r=this.currDistance;return{theta:t,phi:n,radius:r,toString(){return`${t.toFixed(4)}rad ${n.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((n,r)=>{let i=this.meshes.flatMap(l=>l.primitives.filter(f=>f.materialIndex===r||t.length===1&&f.materialIndex===void 0)),o=i[0],a=o?[...o.baseColor]:n.pbrMetallicRoughness?.baseColorFactor||[.8,.8,.8,1],u=o?o.metallic:n.pbrMetallicRoughness?.metallicFactor??.1,s=o?o.roughness:n.pbrMetallicRoughness?.roughnessFactor??.5,c={baseColorFactor:a,metallicFactor:u,roughnessFactor:s,setBaseColorFactor:l=>{let f=[l[0],l[1],l[2],l[3]??1];c.baseColorFactor=f,n.pbrMetallicRoughness&&(n.pbrMetallicRoughness.baseColorFactor=f);for(let m of i)m.baseColor=f;this.render()},setMetallicFactor:l=>{c.metallicFactor=l,n.pbrMetallicRoughness&&(n.pbrMetallicRoughness.metallicFactor=l);for(let f of i)f.metallic=l;this.render()},setRoughnessFactor:l=>{c.roughnessFactor=l,n.pbrMetallicRoughness&&(n.pbrMetallicRoughness.roughnessFactor=l);for(let f of i)f.roughness=l;this.render()}};return{name:n.name||`Material_${r}`,pbrMetallicRoughness:c}})}playAnimation(t){if(this.animations.length!==0){if(t){let n=this.animations.find(r=>r.name===t);n&&(this.currentClip=n)}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 n=this.applyVariantMaterial(t);return n&&this.gl&&this.render(),n}applyVariantMaterial(t){let n=t===null||t==="",r=-1;if(n)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 n;for(let o of this.meshes)for(let a of o.primitives){let u=a.defaultMaterialIndex;if(!n&&Array.isArray(a.variantMappings)){for(let c of a.variantMappings)if(Array.isArray(c.variants)&&c.variants.includes(r)){u=c.material;break}}let s=u!==void 0?i[u]:void 0;a.materialIndex=s?u:void 0,Object.assign(a,Io(s,this.gpuTextures)),this.applyPrimitiveProgram(a,a.materialIndex,s??null)}return!0}applyPrimitiveProgram(t,n,r){if(!this.gl||!t.primitiveDef)return;t.programCache??(t.programCache=new Map);let i=n??-1,o=t.programCache.get(i);o||(o=Eo(this.gl,{...t.primitiveDef,material:n},r),t.programCache.set(i,o)),t.customProgram=o.program,t.customUniforms=o.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 n of Ne)if(n.evaluateAnimation){n.evaluateAnimation(this,t);return}}setTarget(t,n,r){this.customTarget=[t,n,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 n=Math.max(10,Math.min(90,t));this.fov=n*Math.PI/180}getFieldOfView(){return this.fov*180/Math.PI}setDistanceMode(t){if(this.distanceMode=t,!this.customDistance){let n=this.clampDistance(this.distanceMode==="absolute"?3:this.bounds.radius*2.5);this.initialDistance=n,this.targetDistance=n,this.currDistance=n,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 n=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(n,Math.min(r,t))}setCamera(t,n,r,i){t!==void 0&&(this.targetTheta=this.clampTheta(t*Math.PI/180)),n!==void 0&&(this.targetPhi=this.clampPhi(n*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,n,r,i){if(t!==void 0&&(this.initialTheta=this.clampTheta(t*Math.PI/180),this.targetTheta=this.initialTheta,this.currTheta=this.initialTheta),n!==void 0&&(this.initialPhi=this.clampPhi(n*Math.PI/180),this.targetPhi=this.initialPhi,this.currPhi=this.initialPhi),r!==void 0&&r>0){let o=this.clampDistance(r);this.initialDistance=o,this.customDistance=!0,this.targetDistance=o,this.currDistance=o}else if(i!==void 0&&i>0){let o=this.clampDistance(this.bounds.radius*2.5/i);this.initialDistance=o,this.customDistance=!0,this.targetDistance=o,this.currDistance=o}else{this.customDistance=!1;let o=this.clampDistance(this.distanceMode==="absolute"?3:this.bounds.radius*2.5);this.initialDistance=o,this.targetDistance=o,this.currDistance=o}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,n){let r=Te();Re(r,this.projMatrix,this.viewMatrix);let[i,o,a]=t,u=n?n[0]:0,s=n?n[1]:0,c=n?n[2]:0,l=this.modelRootMatrix;l&&(i=l[0]*t[0]+l[4]*t[1]+l[8]*t[2]+l[12],o=l[1]*t[0]+l[5]*t[1]+l[9]*t[2]+l[13],a=l[2]*t[0]+l[6]*t[1]+l[10]*t[2]+l[14],n&&(u=l[0]*n[0]+l[4]*n[1]+l[8]*n[2],s=l[1]*n[0]+l[5]*n[1]+l[9]*n[2],c=l[2]*n[0]+l[6]*n[1]+l[10]*n[2]));let f=r[0]*i+r[4]*o+r[8]*a+r[12],m=r[1]*i+r[5]*o+r[9]*a+r[13],h=r[2]*i+r[6]*o+r[10]*a+r[14],p=r[3]*i+r[7]*o+r[11]*a+r[15];if(p<=1e-4)return{x:0,y:0,z:1,visible:!1};let d=f/p,y=m/p,T=h/p,S=this.canvas.getBoundingClientRect(),b=S.width||this.canvas.clientWidth||this.canvas.width||300,A=S.height||this.canvas.clientHeight||this.canvas.height||150,w=(d*.5+.5)*b,P=(-y*.5+.5)*A,N=d>=-1.1&&d<=1.1&&y>=-1.1&&y<=1.1&&T>=-1&&T<=1;if(N&&n){let[I,_,v]=rn(this),g=[i-I,o-_,a-v];u*g[0]+s*g[1]+c*g[2]>.05&&(N=!1)}return{x:w,y:P,z:T,visible:N}}setSelectedMesh(t){this.selectedMeshName=t||""}getSelectedMesh(){return this.selectedMeshName}setupEvents(){let t=this.canvas;this.boundContextMenu=n=>{n.preventDefault()},t.addEventListener("contextmenu",this.boundContextMenu),this.boundPointerDown=n=>{this.interactive&&(this.isPointerDown=!0,this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now(),this.lastPointerX=n.clientX,this.lastPointerY=n.clientY,this.totalDragDist=0,this.activePointers.set(n.pointerId,{x:n.clientX,y:n.clientY}),this.isPanning=n.button===2||n.shiftKey||this.activePointers.size===2,t.setPointerCapture(n.pointerId))},t.addEventListener("pointerdown",this.boundPointerDown),this.boundPointerMove=n=>{if(!this.isPointerDown||!this.interactive)return;this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now();let r=this.activePointers.get(n.pointerId)||{x:this.lastPointerX,y:this.lastPointerY},i=n.clientX-r.x,o=n.clientY-r.y;if(this.activePointers.set(n.pointerId,{x:n.clientX,y:n.clientY}),this.lastPointerX=n.clientX,this.lastPointerY=n.clientY,this.totalDragDist+=Math.hypot(i,o),this.isPanning||n.button===2||n.shiftKey||this.activePointers.size===2){let a=[this.viewMatrix[0],this.viewMatrix[4],this.viewMatrix[8]],u=[this.viewMatrix[1],this.viewMatrix[5],this.viewMatrix[9]],s=this.customTarget?[...this.customTarget]:[...this.bounds.center],c=this.currDistance/Math.max(t.clientHeight||300,1)*1.5;s[0]+=(-i*a[0]+o*u[0])*c,s[1]+=(-i*a[1]+o*u[1])*c,s[2]+=(-i*a[2]+o*u[2])*c,this.customTarget=s}else this.targetTheta=this.clampTheta(this.targetTheta-i*.008),this.targetPhi=this.clampPhi(this.targetPhi+o*.008)},t.addEventListener("pointermove",this.boundPointerMove),this.boundPointerUp=n=>{this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now(),this.activePointers.delete(n.pointerId),this.activePointers.size===0?(this.isPointerDown=!1,this.isPanning=!1):this.activePointers.size===1&&(this.isPanning=!1);try{t.releasePointerCapture(n.pointerId)}catch{}if(this.totalDragDist<5&&n.button===0){let r=t.getBoundingClientRect(),i=Math.floor((n.clientX-r.left)*(t.width/Math.max(r.width,1))),o=Math.floor((n.clientY-r.top)*(t.height/Math.max(r.height,1)));this.performMeshPick(i,o,!0)}},t.addEventListener("pointerup",this.boundPointerUp),this.boundWheel=n=>{if(!this.interactive)return;n.preventDefault(),this.lastInteractionTime=typeof performance<"u"?performance.now():Date.now();let r=Math.exp(n.deltaY*.001);this.targetDistance=this.clampDistance(this.targetDistance*r)},t.addEventListener("wheel",this.boundWheel,{passive:!1}),this.boundSetCamera=n=>{let r=n.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=n=>{if(!this.interactive)return;let r=typeof performance<"u"?performance.now():Date.now();switch(n.key){case"ArrowLeft":this.lastInteractionTime=r,this.targetTheta=this.clampTheta(this.targetTheta-.1),n.preventDefault();break;case"ArrowRight":this.lastInteractionTime=r,this.targetTheta=this.clampTheta(this.targetTheta+.1),n.preventDefault();break;case"ArrowUp":this.lastInteractionTime=r,this.targetPhi=this.clampPhi(this.targetPhi+.08),n.preventDefault();break;case"ArrowDown":this.lastInteractionTime=r,this.targetPhi=this.clampPhi(this.targetPhi-.08),n.preventDefault();break;case"+":case"=":{this.lastInteractionTime=r,this.targetDistance=this.clampDistance(this.targetDistance*.9),n.preventDefault();break}case"-":case"_":{this.lastInteractionTime=r,this.targetDistance=this.clampDistance(this.targetDistance*1.1),n.preventDefault();break}case"Home":this.lastInteractionTime=r,this.resetCamera(),n.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,n){let r=this.canvas,i=r.getBoundingClientRect(),o=r.width||300,a=r.height||300,u=i.width>0?Math.floor((t-i.left)*(o/i.width)):Math.floor(t),s=i.height>0?Math.floor((n-i.top)*(a/i.height)):Math.floor(n);return this.performMeshPick(u,s,!1)}performMeshPick(t,n,r=!0){if(this.meshes.length===0)return null;let i=this.gl,o=Math.max(1,this.canvas.width||300),a=Math.max(1,this.canvas.height||300);t=this.mapStereoPickX(t,o);let u=Te();Re(u,this.projMatrix,this.viewMatrix);let s=[],c=Math.max(0,Math.min(o-1,t)),l=Math.max(0,Math.min(a-1,a-1-n));if(this.pickFbo&&i&&!this.xrSessionActive){(this.pickFboWidth!==o||this.pickFboHeight!==a)&&this.resizePickingFbo(o,a),i.bindFramebuffer(36160,this.pickFbo),i.viewport(0,0,o,a),i.enable(2929),i.clearColor(0,0,0,0),i.clear(16384|256),i.useProgram(this.pickProg);for(let N=0;N<this.meshes.length;N++){let I=this.meshes[N];if(I.visible===!1||I.isPluginMesh)continue;let _=N+1,v=(_&255)/255,g=(_>>8&255)/255,M=(_>>16&255)/255;i.uniform4f(this.uPick.uColorId,v,g,M,1),Re(this.modelMatrix,this.modelRootMatrix,I.transform);let k=I.instanceMatrices;if(k&&k.length>=16){let R=k.length>>4,B=Te();for(let Z of I.primitives){i.bindVertexArray(Z.vao);for(let j=0;j<R;j++)Re(B,this.modelMatrix,k.subarray(j*16,j*16+16)),Re(this.mvpMatrix,u,B),i.uniformMatrix4fv(this.uPick.uMVP,!1,this.mvpMatrix),Bn(i,Z)}}else{Re(this.mvpMatrix,u,this.modelMatrix),i.uniformMatrix4fv(this.uPick.uMVP,!1,this.mvpMatrix);for(let R of I.primitives)i.bindVertexArray(R.vao),Bn(i,R)}}let w=new Uint8Array(4);i.readPixels(c,l,1,1,6408,5121,w),i.bindFramebuffer(36160,null);let P=w[0]+(w[1]<<8)+(w[2]<<16);P>0&&P<=this.meshes.length&&(s=[this.meshes[P-1]])}s.length===0&&(s=this.meshes.filter(w=>w.visible!==!1));let f=null,m=1/0,h=[0,0,0],p=[0,1,0],[d,y,T]=rn(this),S=Te();for(let w of s){Re(S,this.modelRootMatrix,w.transform);let P=w.instanceMatrices,N=P&&P.length>=16?P.length>>4:1;for(let I=0;I<N;I++){P&&P.length>=16?Re(this.modelMatrix,S,P.subarray(I*16,I*16+16)):this.modelMatrix.set(S),Re(this.mvpMatrix,u,this.modelMatrix);let _=Te();if(!Xt(_,this.mvpMatrix))continue;let v=(c+.5)/o*2-1,g=(l+.5)/a*2-1,M=[0,0,0],k=[0,0,0];Vr(M,v,g,-1,_),Vr(k,v,g,1,_);let R=k[0]-M[0],B=k[1]-M[1],Z=k[2]-M[2],j=Math.hypot(R,B,Z)||1,ie=R/j,ee=B/j,ne=Z/j,X={distance:1/0,point:[0,0,0],normal:[0,1,0]};if((se=>{for(let F of w.primitives){if(!F.positions)continue;let H=F.positions,E=F.indices,V=Math.floor(E?E.length/3:H.length/9);for(let O=0;O<V;O++){let U=E?E[O*3]:O*3,G=E?E[O*3+1]:O*3+1,K=E?E[O*3+2]:O*3+2;uo(M[0],M[1],M[2],ie,ee,ne,H[U*3],H[U*3+1],H[U*3+2],H[G*3],H[G*3+1],H[G*3+2],H[K*3],H[K*3+1],H[K*3+2],X,se)}}})(1e-4),isFinite(X.distance)){let se=X.point[0],F=X.point[1],H=X.point[2],E=this.modelMatrix,V=E[0]*se+E[4]*F+E[8]*H+E[12],O=E[1]*se+E[5]*F+E[9]*H+E[13],U=E[2]*se+E[6]*F+E[10]*H+E[14],G=V-d,K=O-y,ue=U-T,re=Math.hypot(G,K,ue);if(re<m){De(this.normalMatrix,this.modelMatrix);let D=this.normalMatrix,x=X.normal[0],C=X.normal[1],L=X.normal[2],z=D[0]*x+D[3]*C+D[6]*L,W=D[1]*x+D[4]*C+D[7]*L,$=D[2]*x+D[5]*C+D[8]*L,Y=Math.hypot(z,W,$)||1;z/=Y,W/=Y,$/=Y,z*G+W*K+$*ue>0&&(z=-z,W=-W,$=-$),f=w,m=Math.round(re*1e3)/1e3,h=[Math.round(V*1e3)/1e3,Math.round(O*1e3)/1e3,Math.round(U*1e3)/1e3],p=[Math.round(z*1e3)/1e3,Math.round(W*1e3)/1e3,Math.round($*1e3)/1e3]}}}}if(!f)return null;let A={meshIndex:this.meshes.indexOf(f),meshName:f.name,nodeIndex:f.nodeIndex,distance:m,hitPoint:h,normal:p,screenX:t,screenY:n};if(r){for(let w of Ne)w.onMeshSelect?.(this,A);this.opts.onMeshClick&&this.opts.onMeshClick(A),typeof CustomEvent<"u"&&typeof this.container.dispatchEvent=="function"&&this.container.dispatchEvent(new CustomEvent("meshClick",{bubbles:!0,detail:A}))}return A}mapStereoPickX(t,n){if(!this.stereoSBS||this.xrSessionActive||n<2)return t;let r=Math.max(1,Math.floor(n*.5)),i=t>=r,o=i?t-r:t,a=i?Math.max(1,n-r):r,u=(o+.5)/a*2-1;return Math.floor((u*.5+1)*.5*n)}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),n=this.backdropMeshes.length>0?Math.max(this.bounds.radius*20,120):Math.max(this.bounds.radius*20,10);Un(this.projMatrix,this.fov,t,.1,n);let r=this.customTarget||this.bounds.center;Ht(this.viewMatrix,rn(this),r,[0,1,0]),Re(this.mvpMatrix,this.projMatrix,this.viewMatrix),De(this.normalMatrix,this.modelMatrix)}resize(){let t=Math.min((typeof window<"u"?window.devicePixelRatio:1)||1,2),n=this.canvas.getBoundingClientRect(),r=Math.max(1,Math.floor(n.width*t)),i=Math.max(1,Math.floor(n.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 n=this.xrSessionActive;if(this.xrSessionActive=t,n&&!t){this.xrDepthState.enabled=!1;for(let r of Ne)r.onXRSessionEnd?.(this);if(this.lastTime=typeof performance<"u"?performance.now():Date.now(),this.updateTurntableMatrix(),this.isVisible)try{this.resize(),this.syncCameraMatrices(),this.render()}catch(r){this.reportRenderError(r)}}}reportRenderError(t){this.renderErrorReported||(this.renderErrorReported=!0,typeof console<"u"&&console.warn("[three-live] render frame failed:",t))}stepXRUpdate(t){for(let n of Ne)n.onUpdate?.(this,t)}start(){if(this.animFrameId!==null)return;this.lastTime=typeof performance<"u"?performance.now():Date.now();let t=n=>{if(this.animFrameId===null)return;let r=Math.min(Math.max((n-this.lastTime)/1e3,0),.1);if(this.lastTime=n,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),n=Math.sin(this.turntableRotation),r=this.bounds.center[0],i=this.bounds.center[2],o=this.modelRootMatrix;o[0]=t,o[1]=0,o[2]=-n,o[3]=0,o[4]=0,o[5]=1,o[6]=0,o[7]=0,o[8]=n,o[9]=0,o[10]=t,o[11]=0,o[12]=r-(t*r+n*i),o[13]=0,o[14]=i-(-n*r+t*i),o[15]=1}setVisible(t){this.isVisible=t}update(t){for(let a of Ne)a.onUpdate?.(this,t);let n=typeof performance<"u"?performance.now():Date.now();if(!this.isPointerDown&&this.autoRotate&&n-this.lastInteractionTime>=this.autoRotateDelay){this.turntableRotation+=this.autoRotateSpeed*t,this.updateTurntableMatrix();for(let a of Ne)a.onCameraChange?.(this,this.container)}this.currTheta+=(this.targetTheta-this.currTheta)*.12,this.currPhi+=(this.targetPhi-this.currPhi)*.12,this.currDistance+=(this.targetDistance-this.currDistance)*.12,this.syncCameraMatrices();let r=Math.round((this.currTheta*180/Math.PI%360+360)%360),i=Math.round(this.currPhi*180/Math.PI),o=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(o-this.lastReportedZoom)>=.02){this.lastReportedTheta=r,this.lastReportedPhi=i,this.lastReportedZoom=o;let a={theta:r,phi:i,zoom:o,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,n,r,i,o=!0,a=0){this.onBeforeRenderXRView&&this.onBeforeRenderXRView(t);let u=t?.transform?.inverse?.matrix||this.viewMatrix,s=t?.projectionMatrix||this.projMatrix,c=t?.transform?.position,l=c?[c.x,c.y,c.z]:[0,1.6,0];n?this.modelRootMatrix.set(n):r&&n&&this.modelRootMatrix.set(n),this.render({viewMatrix:u,projMatrix:s,eyePos:l,viewport:i,eye:t?.eye||"none",clear:a>0?!1:t?.eye!=="right",isAR:o})}render(t){if(this.contextLost)return;if(!t&&this.stereoSBS){let b=Math.max(2,this.canvas.width||2),A=Math.max(1,this.canvas.height||1),w=Math.max(1,Math.floor(b*.5)),P=Math.max(1,b-w),N=this.backdropMeshes.length>0?Math.max(this.bounds.radius*20,120):Math.max(this.bounds.radius*20,10),I=this.customTarget||this.bounds.center,[_,v,g]=rn(this),M=Math.cos(this.currTheta),k=-Math.sin(this.currTheta),R=.032,B=Te(),Z=Te(),j=[_-M*R,v,g-k*R],ie=[I[0]-M*R*.25,I[1],I[2]-k*R*.25];Un(B,this.fov,w/A,.1,N),Ht(Z,j,ie,[0,1,0]);let ee=Te(),ne=Te(),X=[_+M*R,v,g+k*R],ae=[I[0]+M*R*.25,I[1],I[2]+k*R*.25];Un(ee,this.fov,P/A,.1,N),Ht(ne,X,ae,[0,1,0]),this.render({viewMatrix:Z,projMatrix:B,eyePos:j,viewport:[0,0,w,A],eye:"left",clear:!0,isAR:!1}),this.render({viewMatrix:ne,projMatrix:ee,eyePos:X,viewport:[w,0,P,A],eye:"right",clear:!1,isAR:!1}),this.gl.viewport(0,0,b,A);return}let n=this.gl,r=0,i=0,o=this.canvas.width,a=this.canvas.height;t?.viewport?(r=t.viewport[0],i=t.viewport[1],o=t.viewport[2],a=t.viewport[3],n.viewport(r,i,o,a)):n.viewport(0,0,this.canvas.width,this.canvas.height),n.enable(2929),(!t||t.clear!==!1)&&(t?.isAR?n.clearColor(0,0,0,0):n.clearColor(this.clearColor[0],this.clearColor[1],this.clearColor[2],this.clearColor[3]),n.clear(16384|256));let u=Te(),s=t?.viewMatrix??this.viewMatrix;this.activeViewMatrix=s,Re(u,t?.projMatrix??this.projMatrix,s);let c=ge().xrDepthShader,l=ia(this.toneMapping),[f,m,h]=t?t.eyePos:rn(this);for(let b of Ne)b.onBeforeDrawScene?.(this,n,u,[f,m,h],l);let p=t?.isAR?0:this.backdropMeshes.length;if(this.meshes.length===0&&p===0)return;let d=t?.eye||"none",y=!1,T=p>0?[...this.backdropMeshes,...this.meshes]:this.meshes,S=b=>{for(let A=0;A<T.length;A++){let w=T[A];if(w.visible===!1)continue;let P=this.selectedMeshName!==""&&w.name===this.selectedMeshName;A<p||w.worldSpace===!0||w.name==="__xr_reticle__"?this.modelMatrix.set(w.transform):Re(this.modelMatrix,this.modelRootMatrix,w.transform),Re(this.mvpMatrix,u,this.modelMatrix),De(w.normalMatrix,this.modelMatrix);let N=w.extras?.xr?.stereo||w.userData?.xr?.stereo,I=0,_=0,v=1,g=1;N==="sbs"?(v=.5,I=d==="right"?.5:0):N==="ou"&&(g=.5,_=d==="right"?.5:0);for(let M of w.primitives){let k=!!M.isTransmissive;if(!b&&k){y=!0;continue}if(b&&!k)continue;let R=M.customProgram||this.renderProg,B=M.customUniforms||this.uRender;n.useProgram(R),n.uniform1i(B.uToneMapping,l),n.uniform1f(B.uEnvIntensity,this.envIntensity),B.uExposure&&n.uniform1f(B.uExposure,this.exposure),n.uniform3f(B.uCameraPos,f,m,h),n.uniform1f(B.uEmissive,P?1:0),n.uniformMatrix4fv(B.uMVP,!1,this.mvpMatrix),n.uniformMatrix4fv(B.uModel,!1,this.modelMatrix),n.uniformMatrix3fv(B.uNormalMatrix,!1,w.normalMatrix),B.uUvTransform&&n.uniform4f(B.uUvTransform,I,_,v,g),B.uViewportSize&&n.uniform2f(B.uViewportSize,Math.max(1,o),Math.max(1,a)),c?.bind(n,B,this.xrDepthState,s,[r,i,Math.max(1,o),Math.max(1,a)]),this.environmentTexture?(n.activeTexture(33988),n.bindTexture(3553,this.environmentTexture),n.uniform1i(B.uEnvironmentMap,4),n.uniform1i(B.uHasEnvironmentMap,1)):n.uniform1i(B.uHasEnvironmentMap,0),this.bindLights(B),B.uSectionEnabled&&n.uniform1i(B.uSectionEnabled,0);for(let j of Ne)j.onBeforeDrawPrimitive?.(n,R,M,w,this.worldMatrices||[],this.gltf);n.uniform4fv(B.uBaseColor,M.baseColor),n.uniform1f(B.uMetallic,M.metallic),n.uniform1f(B.uRoughness,M.roughness),B.uClearcoat&&n.uniform2f(B.uClearcoat,M.clearcoat??0,M.clearcoatRoughness??.04),M.texture?(n.activeTexture(33984),n.bindTexture(3553,M.texture),n.uniform1i(B.uBaseColorTexture,0),n.uniform1i(B.uHasTexture,1)):n.uniform1i(B.uHasTexture,0),M.metallicRoughnessTexture?(n.activeTexture(33985),n.bindTexture(3553,M.metallicRoughnessTexture),n.uniform1i(B.uMetallicRoughnessTexture,1),n.uniform1i(B.uHasMetallicRoughnessTexture,1)):n.uniform1i(B.uHasMetallicRoughnessTexture,0),M.normalTexture?(n.activeTexture(33986),n.bindTexture(3553,M.normalTexture),n.uniform1i(B.uNormalTexture,2),n.uniform1i(B.uHasNormalTexture,1),n.uniform1f(B.uNormalScale,M.normalScale)):n.uniform1i(B.uHasNormalTexture,0),M.occlusionTexture?(n.activeTexture(33987),n.bindTexture(3553,M.occlusionTexture),n.uniform1i(B.uOcclusionTexture,3),n.uniform1i(B.uHasOcclusionTexture,1),n.uniform1f(B.uOcclusionStrength,M.occlusionStrength)):n.uniform1i(B.uHasOcclusionTexture,0),n.bindVertexArray(M.vao);let Z=w.instanceMatrices;if(Z&&Z.length>=16&&M.instanced&&B.uInstanced&&B.uViewProj){let j=Z.length>>4;n.uniform1i(B.uInstanced,1),n.uniformMatrix4fv(B.uViewProj,!1,u),M.indices?n.drawElementsInstanced(4,M.indexCount,M.indexType,0,j):n.drawArraysInstanced(4,0,M.indexCount,j),n.uniform1i(B.uInstanced,0)}else if(Z&&Z.length>=16){let j=Z.length>>4,ie=w.instanceColors,ee=Te(),ne=new Float32Array(9),X=[M.baseColor[0],M.baseColor[1],M.baseColor[2],M.baseColor[3]];for(let ae=0;ae<j;ae++)Re(ee,this.modelMatrix,Z.subarray(ae*16,ae*16+16)),Re(this.mvpMatrix,u,ee),De(ne,ee),n.uniformMatrix4fv(B.uMVP,!1,this.mvpMatrix),n.uniformMatrix4fv(B.uModel,!1,ee),n.uniformMatrix3fv(B.uNormalMatrix,!1,ne),ie&&(X[0]=M.baseColor[0]*ie[ae*3],X[1]=M.baseColor[1]*ie[ae*3+1],X[2]=M.baseColor[2]*ie[ae*3+2],X[3]=M.baseColor[3],n.uniform4fv(B.uBaseColor,X)),Bn(n,M)}else Bn(n,M)}}};if(S(!1),y){for(let b of Ne)b.onBeforeTransmissivePass?.(n,this);S(!0)}for(let b of Ne)b.onAfterRender?.(n,this,u)}disposeMeshListGpuResources(t,n){Co(this.gl,t,n)}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 n of Ne)n.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()}};He.registerPlugin=Fe,He.getRegisteredPlugins=kn;function pa(e){return e+3&-4}function ba(e,t=0){let n=(X,ae)=>typeof X=="number"&&Number.isFinite(X)?X:ae,r=n(e[t+12],0),i=n(e[t+13],0),o=n(e[t+14],0),a=n(e[t+0],1),u=n(e[t+1],0),s=n(e[t+2],0),c=n(e[t+4],0),l=n(e[t+5],1),f=n(e[t+6],0),m=n(e[t+8],0),h=n(e[t+9],0),p=n(e[t+10],1),d=Math.hypot(a,u,s),y=Math.hypot(c,l,f),T=Math.hypot(m,h,p);a*(l*p-h*f)-c*(u*p-h*s)+m*(u*f-l*s)<0&&(d=-d);let b=Math.abs(d)>1e-8?1/d:0,A=Math.abs(y)>1e-8?1/y:0,w=Math.abs(T)>1e-8?1/T:0,P=a*b,N=u*b,I=s*b,_=c*A,v=l*A,g=f*A,M=m*w,k=h*w,R=p*w,B=P+v+R,Z=0,j=0,ie=0,ee=1;if(B>0){let X=.5/Math.sqrt(B+1);ee=.25/X,Z=(g-k)*X,j=(M-I)*X,ie=(N-_)*X}else if(P>v&&P>R){let X=2*Math.sqrt(Math.max(0,1+P-v-R));X>1e-8&&(ee=(g-k)/X,Z=.25*X,j=(_+N)/X,ie=(M+I)/X)}else if(v>R){let X=2*Math.sqrt(Math.max(0,1+v-P-R));X>1e-8&&(ee=(M-I)/X,Z=(_+N)/X,j=.25*X,ie=(g+k)/X)}else{let X=2*Math.sqrt(Math.max(0,1+R-P-v));X>1e-8&&(ee=(N-_)/X,Z=(M+I)/X,j=(g+k)/X,ie=.25*X)}let ne=Math.hypot(Z,j,ie,ee);return ne>1e-8&&Number.isFinite(ne)?(Z/=ne,j/=ne,ie/=ne,ee/=ne):(Z=0,j=0,ie=0,ee=1),{t:[r,i,o],r:[Z,j,ie,ee],s:[d,y,T]}}function ya(e){let t={};return e.grab&&(t.interactable={mode:typeof e.grab=="string"?e.grab:"2-hand"},t.movable={scaleInZ:!!e.scale,minScale:typeof e.scale=="object"?e.scale.min??.1:.1,maxScale:typeof e.scale=="object"?e.scale.max??10:10}),e.billboard&&(t.billboard={mode:typeof e.billboard=="string"?e.billboard:"capsule"}),e.follow&&(t.follow={target:typeof e.follow=="object"?e.follow.mode??"head":e.follow}),e.anchor&&(t.anchor={plane:e.anchor}),e.physics&&e.physics!=="none"&&(t.rigidbody={type:e.physics}),t}function qt(e,t){e.updateMatrixWorld(!0);let n=[],r=0,i=[],o=[],a=[],u=[],s=new Set,c=[],l=[],f=new Map,m=[],h=[];function p(_){let v=f.get(_);if(v!==void 0)return v;v=l.length,f.set(_,v);let g=_,M=g.color?.r??.8,k=g.color?.g??.8,R=g.color?.b??.8,B=g.opacity??1,Z={name:g.name||"",pbrMetallicRoughness:{baseColorFactor:[M,k,R,B],metallicFactor:g.metalness??.1,roughnessFactor:g.roughness??.5},doubleSided:g.side===2||!!g.doubleSided};if(g.emissive&&(g.emissive.r>0||g.emissive.g>0||g.emissive.b>0)){let ie=g.emissiveIntensity??1;Z.emissiveFactor=[g.emissive.r*ie,g.emissive.g*ie,g.emissive.b*ie]}let j={};return g.clearcoat&&g.clearcoat>0&&(j.KHR_materials_clearcoat={clearcoatFactor:g.clearcoat,clearcoatRoughnessFactor:g.clearcoatRoughness||0}),g.sheen&&g.sheen>0&&(j.KHR_materials_sheen={sheenColorFactor:g.sheenColor?[g.sheenColor.r,g.sheenColor.g,g.sheenColor.b]:[1,1,1],sheenRoughnessFactor:g.sheenRoughness||0}),g.transmission&&g.transmission>0&&(j.KHR_materials_transmission={transmissionFactor:g.transmission}),g.thickness&&g.thickness>0&&(j.KHR_materials_volume={thicknessFactor:g.thickness,attenuationDistance:g.attenuationDistance??1/0,attenuationColor:g.attenuationColor?[g.attenuationColor.r,g.attenuationColor.g,g.attenuationColor.b]:[1,1,1]}),g.ior!==void 0&&g.ior!==1.5&&(j.KHR_materials_ior={ior:g.ior}),g.dispersion&&g.dispersion>0&&(j.KHR_materials_dispersion={dispersion:g.dispersion}),g.iridescence&&g.iridescence>0&&(j.KHR_materials_iridescence={iridescenceFactor:g.iridescence,iridescenceIor:g.iridescenceIOR??1.3}),Object.keys(j).length>0&&(Z.extensions=j),l.push(Z),v}function d(_,v){let g=new Uint8Array(_.buffer,_.byteOffset,_.byteLength),M=pa(g.byteLength),k=new Uint8Array(M);k.set(g),n.push(k);let R=i.length;return i.push({buffer:0,byteOffset:r,byteLength:g.byteLength,target:v}),r+=M,R}function y(_,v,g,M,k,R,B){let Z=d(_,g),j=o.length,ie={bufferView:Z,byteOffset:0,componentType:M,count:k,type:v};return R&&(ie.min=R),B&&(ie.max=B),o.push(ie),j}e.traverse(_=>{(_.isLight||_.color&&_.intensity!==void 0)&&h.push({type:_.type,color:[_.color.r,_.color.g,_.color.b],intensity:_.intensity,position:[_.position.x,_.position.y,_.position.z]})});let T=[];function S(_){let v={name:_.name||""},g=_.position,M=_.quaternion,k=_.scale;if((g.x||g.y||g.z)&&(v.translation=[g.x,g.y,g.z]),(M.x||M.y||M.z||M.w!==1)&&(v.rotation=[M.x,M.y,M.z,M.w]),(k.x!==1||k.y!==1||k.z!==1)&&(v.scale=[k.x,k.y,k.z]),_.userData&&Object.keys(_.userData).length>0&&(v.extras=JSON.parse(JSON.stringify(_.userData,(B,Z)=>{if(!(B==="__proto__"||B==="prototype"||B==="constructor"))return typeof Z=="function"?void 0:Z})),_.userData.xr)){let B=ya(_.userData.xr);v.extensions={...v.extensions||{},MOZ_hubs_components:B,ANDROID_xr_scenecore:B},ge().xrTraitSerializer?.gltfNode(v,_.userData.xr),s.add("MOZ_hubs_components").add("ANDROID_xr_scenecore")}if(_.geometry){let B=_.geometry,Z=B.attributes.position;if(Z&&Z.count>0){let j=[1/0,1/0,1/0],ie=[-1/0,-1/0,-1/0];for(let F=0;F<Z.count;F++){let H=Z.getX(F),E=Z.getY(F),V=Z.getZ(F);H<j[0]&&(j[0]=H),H>ie[0]&&(ie[0]=H),E<j[1]&&(j[1]=E),E>ie[1]&&(ie[1]=E),V<j[2]&&(j[2]=V),V>ie[2]&&(ie[2]=V)}let ne={attributes:{POSITION:y(Z.array,"VEC3",34962,5126,Z.count,j,ie)}};if(B.attributes.normal&&(ne.attributes.NORMAL=y(B.attributes.normal.array,"VEC3",34962,5126,B.attributes.normal.count)),B.attributes.uv&&(ne.attributes.TEXCOORD_0=y(B.attributes.uv.array,"VEC2",34962,5126,B.attributes.uv.count)),B.index){let F=B.index.array instanceof Uint32Array;ne.indices=y(B.index.array,"SCALAR",34963,F?5125:5123,B.index.count)}_.material&&(ne.material=p(_.material));let X=_.userData?.variants;if(X&&typeof X=="object"){let F=new Map;for(let H of Object.keys(X)){if(!H||H==="__proto__"||H==="constructor"||H==="prototype")continue;let E=X[H];if(!E||typeof E!="object")continue;let V=m.indexOf(H);if(V===-1&&m.length<256&&(V=m.length,m.push(H)),V===-1)continue;let O=p(E),U=F.get(O);U||(U=[],F.set(O,U)),U.push(V)}if(F.size>0){let H=[];for(let[E,V]of F.entries())H.push({material:E,variants:V});ne.extensions={...ne.extensions||{},KHR_materials_variants:{mappings:H}},s.add("KHR_materials_variants")}}let ae=_;if(ae.isInstancedMesh&&typeof ae.count=="number"&&ae.count>0&&ae.instanceMatrix?.array){let F=Math.min(1e4,Math.floor(ae.count)),H=ae.instanceMatrix.array,E=new Float32Array(F*3),V=new Float32Array(F*4),O=new Float32Array(F*3);for(let G=0;G<F;G++){let{t:K,r:ue,s:re}=ba(H,G*16);E[G*3]=K[0],E[G*3+1]=K[1],E[G*3+2]=K[2],V[G*4]=ue[0],V[G*4+1]=ue[1],V[G*4+2]=ue[2],V[G*4+3]=ue[3],O[G*3]=re[0],O[G*3+1]=re[1],O[G*3+2]=re[2]}let U={TRANSLATION:y(E,"VEC3",0,5126,F),ROTATION:y(V,"VEC4",0,5126,F),SCALE:y(O,"VEC3",0,5126,F)};if(ae.instanceColor?.array&&ae.instanceColor.array.length>=F*3){let G=new Float32Array(ae.instanceColor.array.subarray(0,F*3));U._COLOR_0=y(G,"VEC3",0,5126,F)}v.extensions={...v.extensions||{},EXT_mesh_gpu_instancing:{attributes:U}},s.add("EXT_mesh_gpu_instancing")}let se=a.length;a.push({primitives:[ne],name:_.name,...v.extras?{extras:v.extras}:{}}),v.mesh=se}}let R=u.length;if(u.push(v),c.push(_),_.children.length>0){v.children=[];for(let B of _.children)v.children.push(S(B))}return R}for(let _ of e.children)T.push(S(_));let b=t?.animateCallback||t?.animateFn||(typeof e.userData?.animate=="function"?e.userData.animate:typeof e.__animateFn=="function"?e.__animateFn:typeof globalThis.animate=="function"?globalThis.animate:void 0),A=[];if(typeof b=="function"&&c.length>0){let _=t?.duration??4,v=t?.fps??15,g=Math.max(2,Math.round(_*v)+1),M=new Float32Array(g),k=c.map(X=>({px:X.position.x,py:X.position.y,pz:X.position.z,qx:X.quaternion.x,qy:X.quaternion.y,qz:X.quaternion.z,qw:X.quaternion.w,sx:X.scale.x,sy:X.scale.y,sz:X.scale.z})),R=c.map(()=>new Float32Array(g*3)),B=c.map(()=>new Float32Array(g*4)),Z=c.map(()=>new Float32Array(g*3));for(let X=0;X<g;X++){let ae=X/(g-1)*_;M[X]=ae;try{b(ae)}catch{}for(let se=0;se<c.length;se++){let F=c[se];R[se][X*3]=F.position.x,R[se][X*3+1]=F.position.y,R[se][X*3+2]=F.position.z,B[se][X*4]=F.quaternion.x,B[se][X*4+1]=F.quaternion.y,B[se][X*4+2]=F.quaternion.z,B[se][X*4+3]=F.quaternion.w,Z[se][X*3]=F.scale.x,Z[se][X*3+1]=F.scale.y,Z[se][X*3+2]=F.scale.z}}for(let X=0;X<c.length;X++){let ae=c[X],se=k[X];ae.position.set(se.px,se.py,se.pz),ae.quaternion.set(se.qx,se.qy,se.qz,se.qw),ae.scale.set(se.sx,se.sy,se.sz)}e.updateMatrixWorld(!0);let j=null,ie=()=>(j===null&&(j=y(M,"SCALAR",0,5126,g,[0],[_])),j),ee=[],ne=[];for(let X=0;X<c.length;X++){let ae=k[X],se=!1,F=!1,H=!1;for(let E=0;E<g;E++)(Math.abs(R[X][E*3]-ae.px)>1e-4||Math.abs(R[X][E*3+1]-ae.py)>1e-4||Math.abs(R[X][E*3+2]-ae.pz)>1e-4)&&(se=!0),(Math.abs(B[X][E*4]-ae.qx)>1e-4||Math.abs(B[X][E*4+1]-ae.qy)>1e-4||Math.abs(B[X][E*4+2]-ae.qz)>1e-4||Math.abs(B[X][E*4+3]-ae.qw)>1e-4)&&(F=!0),(Math.abs(Z[X][E*3]-ae.sx)>1e-4||Math.abs(Z[X][E*3+1]-ae.sy)>1e-4||Math.abs(Z[X][E*3+2]-ae.sz)>1e-4)&&(H=!0);if(se){let E=y(R[X],"VEC3",0,5126,g),V=ee.length;ee.push({input:ie(),interpolation:"LINEAR",output:E}),ne.push({sampler:V,target:{node:X,path:"translation"}})}if(F){let E=y(B[X],"VEC4",0,5126,g),V=ee.length;ee.push({input:ie(),interpolation:"LINEAR",output:E}),ne.push({sampler:V,target:{node:X,path:"rotation"}})}if(H){let E=y(Z[X],"VEC3",0,5126,g),V=ee.length;ee.push({input:ie(),interpolation:"LINEAR",output:E}),ne.push({sampler:V,target:{node:X,path:"scale"}})}}ne.length>0&&A.push({name:"ProceduralLoop",samplers:ee,channels:ne})}let w=io(u,a,e.userData),P={asset:{version:"2.0",generator:"ThreeLiveConvert",extras:{environmentIntensity:e.environmentIntensity}},scenes:[{nodes:T}],scene:0,nodes:u,meshes:a,materials:l,accessors:o,bufferViews:i,buffers:[{byteLength:r}],...A.length>0?{animations:A}:{},...w||s.size>0?{extensionsUsed:[...w?["KHR_interactivity"]:[],...s]}:{},...w||m.length>0?{extensions:{...w?{KHR_interactivity:w}:{},...m.length>0?{KHR_materials_variants:{variants:m.map(_=>({name:_}))}}:{}}}:{}},N=new Uint8Array(r),I=0;for(let _ of n)N.set(_,I),I+=_.byteLength;return{gltf:P,bin:N.buffer,lights:h,environmentIntensity:e.environmentIntensity}}function Gn(e){return new TextEncoder().encode(e)}function on(e,t){let{gltf:n,bin:r}=qt(e,t),i=JSON.stringify(n),o=Gn(i),a=(4-o.byteLength%4)%4,u=o.byteLength+a,s=20+u+8+r.byteLength,c=new Uint8Array(s),l=new DataView(c.buffer);l.setUint32(0,1179937895,!0),l.setUint32(4,2,!0),l.setUint32(8,s,!0),l.setUint32(12,u,!0),l.setUint32(16,1313821514,!0),c.set(o,20);for(let m=0;m<a;m++)c[20+o.byteLength+m]=32;let f=20+u;return l.setUint32(f,r.byteLength,!0),l.setUint32(f+4,5130562,!0),c.set(new Uint8Array(r),f+8),c}function ga(e,t){e.updateMatrixWorld(!0);let n=[];return e.traverse(r=>{if(r.geometry){let i=r.geometry,o=i.attributes.position;if(!o||o.count===0)return;let a=o.count,u=new Float32Array(a*3),s=r.matrixWorld.elements;for(let I=0;I<a;I++){let _=o.getX(I),v=o.getY(I),g=o.getZ(I);u[I*3]=s[0]*_+s[4]*v+s[8]*g+s[12],u[I*3+1]=s[1]*_+s[5]*v+s[9]*g+s[13],u[I*3+2]=s[2]*_+s[6]*v+s[10]*g+s[14]}let c;if(i.attributes.normal){let I=i.attributes.normal;c=new Float32Array(a*3);let _=new Float32Array(9);De(_,s);for(let v=0;v<a;v++){let g=I.getX(v),M=I.getY(v),k=I.getZ(v),R=_[0]*g+_[3]*M+_[6]*k,B=_[1]*g+_[4]*M+_[7]*k,Z=_[2]*g+_[5]*M+_[8]*k,j=Math.hypot(R,B,Z)||1;c[v*3]=R/j,c[v*3+1]=B/j,c[v*3+2]=Z/j}}let l;if(i.attributes.uv){let I=i.attributes.uv;l=new Float32Array(a*2);for(let _=0;_<a;_++)l[_*2]=I.getX(_),l[_*2+1]=I.getY(_)}let f;if(i.index)f=i.index.array;else{f=a>65535?new Uint32Array(a):new Uint16Array(a);for(let I=0;I<a;I++)f[I]=I}let m="DefaultMaterial",h=[.8,.8,.8],p=.5,d=.1,y=0,T=0,S=1.5,b=1,A=[0,0,0];if(r.material){let I=r.material;m=I.name||`Material_${n.length}`,I.color&&(h=[I.color.r,I.color.g,I.color.b]),typeof I.roughness=="number"&&(p=I.roughness),typeof I.metalness=="number"&&(d=I.metalness),typeof I.clearcoat=="number"&&(y=I.clearcoat),typeof I.clearcoatRoughness=="number"&&(T=I.clearcoatRoughness),typeof I.ior=="number"&&(S=I.ior);let _=typeof I.opacity=="number"?I.opacity:1,v=typeof I.transmission=="number"?I.transmission:0;if(b=_*(1-v),I.emissive&&(I.emissive.r>0||I.emissive.g>0||I.emissive.b>0)){let g=I.emissiveIntensity??1;A=[I.emissive.r*g,I.emissive.g*g,I.emissive.b*g]}}let w,P=t?.animateCallback||t?.animateFn||(typeof e.userData?.animate=="function"?e.userData.animate:typeof e.__animateFn=="function"?e.__animateFn:typeof globalThis.animate=="function"?globalThis.animate:void 0);if(typeof P=="function"){let I=t?.duration??4,_=t?.fps??4,v=Math.max(2,Math.round(I*_)+1),g=[],M=[],k=[],R=[],B=[r.position.x,r.position.y,r.position.z],Z=[r.quaternion.x,r.quaternion.y,r.quaternion.z,r.quaternion.w],j=[r.scale.x,r.scale.y,r.scale.z],ie=!1;for(let ee=0;ee<v;ee++){let ne=ee/(v-1)*I;g.push(ne);try{P(ne)}catch{}M.push([r.position.x,r.position.y,r.position.z]),k.push([r.quaternion.x,r.quaternion.y,r.quaternion.z,r.quaternion.w]),R.push([r.scale.x,r.scale.y,r.scale.z]),(Math.abs(r.position.x-B[0])>1e-4||Math.abs(r.position.y-B[1])>1e-4||Math.abs(r.position.z-B[2])>1e-4||Math.abs(r.quaternion.x-Z[0])>1e-4||Math.abs(r.quaternion.y-Z[1])>1e-4||Math.abs(r.quaternion.z-Z[2])>1e-4||Math.abs(r.quaternion.w-Z[3])>1e-4||Math.abs(r.scale.x-j[0])>1e-4)&&(ie=!0)}r.position.set(B[0],B[1],B[2]),r.quaternion.set(Z[0],Z[1],Z[2],Z[3]),r.scale.set(j[0],j[1],j[2]),ie&&(w={times:g,translations:M,rotations:k,scales:R})}let N=r;if(N.isInstancedMesh&&typeof N.count=="number"&&N.count>0&&N.instanceMatrix?.array){let I=Math.min(1e3,Math.floor(N.count)),_=N.instanceMatrix.array,v=N.instanceColor?.array,g=r.name||`Mesh_${n.length}`,M=new Float32Array(16),k=new Float32Array(9);for(let R=0;R<I;R++){let B=_.subarray(R*16,(R+1)*16);Re(M,s,B);let Z=new Float32Array(a*3);for(let ne=0;ne<a;ne++){let X=o.getX(ne),ae=o.getY(ne),se=o.getZ(ne);Z[ne*3]=M[0]*X+M[4]*ae+M[8]*se+M[12],Z[ne*3+1]=M[1]*X+M[5]*ae+M[9]*se+M[13],Z[ne*3+2]=M[2]*X+M[6]*ae+M[10]*se+M[14]}let j;if(i.attributes.normal){let ne=i.attributes.normal;j=new Float32Array(a*3),De(k,M);for(let X=0;X<a;X++){let ae=ne.getX(X),se=ne.getY(X),F=ne.getZ(X),H=k[0]*ae+k[3]*se+k[6]*F,E=k[1]*ae+k[4]*se+k[7]*F,V=k[2]*ae+k[5]*se+k[8]*F,O=Math.hypot(H,E,V)||1;j[X*3]=H/O,j[X*3+1]=E/O,j[X*3+2]=V/O}}let ie=h,ee=m;v&&v.length>=(R+1)*3&&(ie=[h[0]*v[R*3],h[1]*v[R*3+1],h[2]*v[R*3+2]],ee=`${m}_inst_${R}`),n.push({name:`${g}_${R}`,positions:Z,indices:f,normals:j,uvs:l,materialName:ee,color:ie,roughness:p,metallic:d,clearcoat:y,clearcoatRoughness:T,ior:S,opacity:b,emissiveColor:A,xrTraits:r.userData?.xr})}return}n.push({name:r.name||`Mesh_${n.length}`,positions:u,indices:f,normals:c,uvs:l,materialName:m,color:h,roughness:p,metallic:d,clearcoat:y,clearcoatRoughness:T,ior:S,opacity:b,emissiveColor:A,xrTraits:r.userData?.xr,timeSamples:w})}}),n}function Do(e){let t=[],n=e.gltf,r=ge().decoders.get("meshopt");r&&typeof r.decodeBufferViews=="function"&&r.decodeBufferViews(n,e);let i=e.bin,o=i instanceof ArrayBuffer?i:i.buffer.slice(i.byteOffset,i.byteOffset+i.byteLength),a=n.accessors||[],u=n.bufferViews||[],s=n.materials||[],c=n.meshes||[],l=n.nodes||[];function f(p){let d=a[p];if(!d)throw new Error(`Accessor ${p} not found`);let y=u[d.bufferView||0],T=(y.byteOffset||0)+(d.byteOffset||0),S=y.byteLength||0,b=o.slice(T,T+S);return{acc:d,buffer:b}}let m=new Map;if(l.length>0){let p=ft(n);for(let d=0;d<p.length;d++)m.set(d,p[d])}function h(p,d,y,T){let S=c[p];if(!S)return;let b=new Float32Array(9);De(b,d);for(let A=0;A<(S.primitives||[]).length;A++){let w=S.primitives[A],P=w.attributes?.POSITION;if(P===void 0)continue;let{acc:N,buffer:I}=f(P),_=new Float32Array(I,0,N.count*3),v=new Float32Array(_.length);for(let E=0;E<N.count;E++){let V=_[E*3],O=_[E*3+1],U=_[E*3+2];v[E*3]=d[0]*V+d[4]*O+d[8]*U+d[12],v[E*3+1]=d[1]*V+d[5]*O+d[9]*U+d[13],v[E*3+2]=d[2]*V+d[6]*O+d[10]*U+d[14]}let g,M=w.attributes?.NORMAL;if(M!==void 0){let{acc:E,buffer:V}=f(M),O=new Float32Array(V,0,E.count*3);g=new Float32Array(O.length);for(let U=0;U<E.count;U++){let G=O[U*3],K=O[U*3+1],ue=O[U*3+2],re=b[0]*G+b[3]*K+b[6]*ue,D=b[1]*G+b[4]*K+b[7]*ue,x=b[2]*G+b[5]*K+b[8]*ue,C=Math.hypot(re,D,x)||1;g[U*3]=re/C,g[U*3+1]=D/C,g[U*3+2]=x/C}}let k,R=w.attributes?.TEXCOORD_0;if(R!==void 0){let{acc:E,buffer:V}=f(R);k=new Float32Array(V,0,E.count*2)}let B;if(w.indices!==void 0){let{acc:E,buffer:V}=f(w.indices);E.componentType===5125?B=new Uint32Array(V,0,E.count):B=new Uint16Array(V,0,E.count);let O=N.count;for(let U of B)if(U>=O)throw new Error(`SecurityError: Index buffer value (${U}) out of vertex bounds [0, ${O}).`)}else{let E=N.count;B=E>65535?new Uint32Array(E):new Uint16Array(E);for(let V=0;V<E;V++)B[V]=V}let Z="DefaultMaterial",j=[.8,.8,.8],ie=.5,ee=.1,ne=0,X=0,ae=1.5,se=1,F=[0,0,0];if(w.material!==void 0&&s[w.material]){let E=s[w.material];Z=E.name||`Material_${w.material}`;let V=E.pbrMetallicRoughness||{},O=1;Array.isArray(V.baseColorFactor)&&(j=[V.baseColorFactor[0],V.baseColorFactor[1],V.baseColorFactor[2]],typeof V.baseColorFactor[3]=="number"&&(O=V.baseColorFactor[3])),typeof V.roughnessFactor=="number"&&(ie=V.roughnessFactor),typeof V.metallicFactor=="number"&&(ee=V.metallicFactor),Array.isArray(E.emissiveFactor)&&E.emissiveFactor.length>=3&&(F=[E.emissiveFactor[0],E.emissiveFactor[1],E.emissiveFactor[2]]);let U=E.extensions||{};U.KHR_materials_clearcoat&&(ne=U.KHR_materials_clearcoat.clearcoatFactor??0,X=U.KHR_materials_clearcoat.clearcoatRoughnessFactor??0),U.KHR_materials_ior&&typeof U.KHR_materials_ior.ior=="number"&&(ae=U.KHR_materials_ior.ior);let G=U.KHR_materials_transmission?.transmissionFactor??0;se=O*(1-G)}let H=(S.primitives||[]).length>1?`${y}_p${A}`:y;t.push({name:H,positions:v,indices:B,normals:g,uvs:k,materialName:Z,color:j,roughness:ie,metallic:ee,clearcoat:ne,clearcoatRoughness:X,ior:ae,opacity:se,emissiveColor:F,xrTraits:T?.xr||S.extras?.xr})}}if(l.length>0)for(let p=0;p<l.length;p++){let d=l[p];if(d.mesh!==void 0&&d.mesh<c.length){let y=m.get(p)||Te(),T=d.name||c[d.mesh].name||`Node_${p}`,S=d.extensions?.EXT_mesh_gpu_instancing?.attributes;if(S&&typeof S=="object"){let b=S.TRANSLATION,A=S.ROTATION,w=S.SCALE,P=b!==void 0?(()=>{let{acc:v,buffer:g}=f(b);return new Float32Array(g,0,v.count*3)})():null,N=A!==void 0?(()=>{let{acc:v,buffer:g}=f(A);return new Float32Array(g,0,v.count*4)})():null,I=w!==void 0?(()=>{let{acc:v,buffer:g}=f(w);return new Float32Array(g,0,v.count*3)})():null,_=Math.min(1e3,P?P.length/3:N?N.length/4:I?I.length/3:0);if(_>0){let v=new Float32Array(16),g=new Float32Array(16);for(let M=0;M<_;M++){let k=P?[P[M*3],P[M*3+1],P[M*3+2]]:[0,0,0],R=N?[N[M*4],N[M*4+1],N[M*4+2],N[M*4+3]]:[0,0,0,1],B=I?[I[M*3],I[M*3+1],I[M*3+2]]:[1,1,1];Qe(v,R,k,B),Re(g,y,v),h(d.mesh,g,`${T}_${M}`,d.extras)}continue}}h(d.mesh,y,T,d.extras)}}else{let p=Te();for(let d=0;d<c.length;d++){let y=c[d].name||`Mesh_${d}`;h(d,p,y,c[d].extras)}}return t}function Jr(e,t){if(!e||typeof e!="string")return t;let n=e.replace(/[^A-Za-z0-9_]/g,"_");return/^[0-9]/.test(n)&&(n="_"+n),n||t}function Lo(e){return String(e??"").replace(/[\x00-\x1f\x7f]/g,"").replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function Ae(e){if(!Number.isFinite(e)||Math.abs(e)<1e-7)return"0";let t=Number(e.toFixed(5)).toString();return t.indexOf(".")===-1?`${t}.0`:t}function Po(e){let t=e.length/3,n=new Array(t);for(let r=0;r<t;r++)n[r]=`(${Ae(e[r*3])}, ${Ae(e[r*3+1])}, ${Ae(e[r*3+2])})`;return n.join(", ")}function xa(e,t){let n=new Array(t);for(let r=0;r<t;r++)n[r]=`(${Ae(e[r*2])}, ${Ae(1-e[r*2+1])})`;return n.join(", ")}function va(e){return Array.from(e).join(", ")}function ei(e){let t=new Map;for(let s of e){let c=Jr(s.materialName,"DefaultMaterial");t.has(c)||t.set(c,{color:s.color||[.8,.8,.8],roughness:s.roughness??.5,metallic:s.metallic??0,clearcoat:s.clearcoat??0,clearcoatRoughness:s.clearcoatRoughness??0,ior:s.ior??1.5,opacity:s.opacity??1,emissiveColor:s.emissiveColor||[0,0,0]})}let n=0,r=null;for(let s of e){if(s.timeSamples&&s.timeSamples.times.length>0){let c=s.timeSamples.times[s.timeSamples.times.length-1];c>n&&(n=c)}s.xrTraits?.anchor&&!r&&(r=s.xrTraits.anchor==="vertical"||s.xrTraits.anchor==="wall"?"vertical":"horizontal")}let i="";n>0&&(i=`startTimeCode = 0
|
|
252
|
+
endTimeCode = ${Ae(n)}
|
|
235
253
|
timeCodesPerSecond = 1.0
|
|
236
254
|
`);let o="";r&&(o=`uniform token preliminary:anchoring:type = "plane"
|
|
237
255
|
uniform token preliminary:planeAnchoring:alignment = "${r}"
|
|
238
|
-
`);let
|
|
256
|
+
`);let a=`#usda 1.0
|
|
239
257
|
(
|
|
240
258
|
defaultPrim = "Root"
|
|
241
259
|
metersPerUnit = 1.0
|
|
@@ -248,87 +266,87 @@ kind = "component"
|
|
|
248
266
|
{
|
|
249
267
|
${o}def Scope "Materials"
|
|
250
268
|
{
|
|
251
|
-
`;for(let[
|
|
252
|
-
`,
|
|
253
|
-
`),
|
|
254
|
-
`),
|
|
255
|
-
`),(h>0||
|
|
256
|
-
`),
|
|
269
|
+
`;for(let[s,c]of t.entries()){let[l,f,m]=c.color,[h,p,d]=c.emissiveColor,y="";c.clearcoat>0&&(y+=`float inputs:clearcoat = ${Ae(c.clearcoat)}
|
|
270
|
+
`,y+=`float inputs:clearcoatRoughness = ${Ae(c.clearcoatRoughness)}
|
|
271
|
+
`),c.ior!==1.5&&(y+=`float inputs:ior = ${Ae(c.ior)}
|
|
272
|
+
`),c.opacity<1&&(y+=`float inputs:opacity = ${Ae(c.opacity)}
|
|
273
|
+
`),(h>0||p>0||d>0)&&(y+=`color3f inputs:emissiveColor = (${Ae(h)}, ${Ae(p)}, ${Ae(d)})
|
|
274
|
+
`),a+=`def Material "${s}"
|
|
257
275
|
{
|
|
258
276
|
def Shader "PBRShader"
|
|
259
277
|
{
|
|
260
278
|
uniform token info:id = "UsdPreviewSurface"
|
|
261
|
-
color3f inputs:diffuseColor = (${
|
|
262
|
-
float inputs:metallic = ${
|
|
263
|
-
float inputs:roughness = ${
|
|
264
|
-
${
|
|
279
|
+
color3f inputs:diffuseColor = (${Ae(l)}, ${Ae(f)}, ${Ae(m)})
|
|
280
|
+
float inputs:metallic = ${Ae(c.metallic)}
|
|
281
|
+
float inputs:roughness = ${Ae(c.roughness)}
|
|
282
|
+
${y}token outputs:surface
|
|
265
283
|
}
|
|
266
|
-
token outputs:surface.connect = </Root/Materials/${
|
|
284
|
+
token outputs:surface.connect = </Root/Materials/${s}/PBRShader.outputs:surface>
|
|
267
285
|
}
|
|
268
|
-
`}
|
|
286
|
+
`}a+=`}
|
|
269
287
|
def Scope "Meshes"
|
|
270
288
|
{
|
|
271
|
-
`;let
|
|
289
|
+
`;let u=new Set;for(let s=0;s<e.length;s++){let c=e[s],l=c.positions.length/3,f=1/0,m=1/0,h=1/0,p=-1/0,d=-1/0,y=-1/0;for(let N=0;N<l;N++){let I=c.positions[N*3],_=c.positions[N*3+1],v=c.positions[N*3+2];I<f&&(f=I),I>p&&(p=I),_<m&&(m=_),_>d&&(d=_),v<h&&(h=v),v>y&&(y=v)}isFinite(f)||(f=m=h=-1,p=d=y=1);let T=Math.floor(c.indices.length/3),S=Jr(c.materialName,"DefaultMaterial"),b=Jr(c.name,`Mesh_${s}`);u.has(b)&&(b=`${b}_${s}`),u.add(b);let A=T>0?T===1?"3":"3, ".repeat(T-1)+"3":"",w=c.xrTraits,P="";if(w){let N=[];w.physics&&w.physics!=="none"&&N.push('prepend apiSchemas = ["PhysicsBodyAPI", "PhysicsCollisionAPI"]');let I=ge().xrTraitSerializer?.usdLines(w,Lo)??[];if(!I.length)for(let _ of["grab","billboard","follow","anchor","physics"]){let v=_==="follow"&&typeof w.follow=="object"?w.follow.mode??"head":w[_];v!==void 0&&I.push(`string ${_} = "${Lo(v)}"`)}I.length>0&&N.push(`customData = {
|
|
272
290
|
dictionary xr = {
|
|
273
|
-
${
|
|
291
|
+
${I.join(`
|
|
274
292
|
`)}
|
|
275
293
|
}
|
|
276
|
-
}`),
|
|
277
|
-
${
|
|
294
|
+
}`),N.length>0&&(P=` (
|
|
295
|
+
${N.join(`
|
|
278
296
|
`)}
|
|
279
|
-
)`)}if(
|
|
297
|
+
)`)}if(a+=`def Mesh "${b}"${P}
|
|
280
298
|
{
|
|
281
|
-
`,
|
|
282
|
-
bool physics:kinematicEnabled = ${
|
|
299
|
+
`,w?.physics&&w.physics!=="none"){let N=w.physics==="static"?"true":"false";a+=`bool physics:rigidBodyEnabled = true
|
|
300
|
+
bool physics:kinematicEnabled = ${N}
|
|
283
301
|
bool physics:collisionEnabled = true
|
|
284
|
-
`}if(
|
|
285
|
-
quatf xformOp:orient.timeSamples = { ${
|
|
286
|
-
double3 xformOp:scale.timeSamples = { ${
|
|
302
|
+
`}if(c.timeSamples&&c.timeSamples.times.length>0){let N=c.timeSamples,I=N.times.map((g,M)=>{let k=N.translations?.[M]||[0,0,0];return`${Ae(g)}: (${Ae(k[0])}, ${Ae(k[1])}, ${Ae(k[2])})`}).join(", "),_=N.times.map((g,M)=>{let k=N.rotations?.[M]||[0,0,0,1];return`${Ae(g)}: (${Ae(k[3])}, ${Ae(k[0])}, ${Ae(k[1])}, ${Ae(k[2])})`}).join(", "),v=N.times.map((g,M)=>{let k=N.scales?.[M]||[1,1,1];return`${Ae(g)}: (${Ae(k[0])}, ${Ae(k[1])}, ${Ae(k[2])})`}).join(", ");a+=`double3 xformOp:translate.timeSamples = { ${I} }
|
|
303
|
+
quatf xformOp:orient.timeSamples = { ${_} }
|
|
304
|
+
double3 xformOp:scale.timeSamples = { ${v} }
|
|
287
305
|
uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:orient", "xformOp:scale"]
|
|
288
|
-
`}
|
|
289
|
-
int[] faceVertexCounts = [${
|
|
290
|
-
int[] faceVertexIndices = [${
|
|
291
|
-
point3f[] points = [${
|
|
292
|
-
`,
|
|
306
|
+
`}a+=`float3[] extent = [(${Ae(f)}, ${Ae(m)}, ${Ae(h)}), (${Ae(p)}, ${Ae(d)}, ${Ae(y)})]
|
|
307
|
+
int[] faceVertexCounts = [${A}]
|
|
308
|
+
int[] faceVertexIndices = [${va(c.indices)}]
|
|
309
|
+
point3f[] points = [${Po(c.positions)}]
|
|
310
|
+
`,c.normals&&c.normals.length===c.positions.length&&(a+=`normal3f[] normals = [${Po(c.normals)}] (
|
|
293
311
|
interpolation = "vertex"
|
|
294
312
|
)
|
|
295
|
-
`),
|
|
313
|
+
`),c.uvs&&c.uvs.length===l*2&&(a+=`texCoord2f[] primvars:st = [${xa(c.uvs,l)}] (
|
|
296
314
|
interpolation = "vertex"
|
|
297
315
|
)
|
|
298
|
-
`),
|
|
316
|
+
`),a+=`rel material:binding = </Root/Materials/${S}>
|
|
299
317
|
}
|
|
300
|
-
`}return
|
|
318
|
+
`}return a+=`}
|
|
301
319
|
}
|
|
302
|
-
`,s}function io(t,e){if(t&&typeof t.traverse=="function"){let i=Ts(t,e);return Fr(i)}let n=ot(t),r=ro(n);return Fr(r)}var Sn=null;function oo(t){if(!Sn){Sn=new Uint32Array(256);for(let n=0;n<256;n++){let r=n;for(let i=0;i<8;i++)r=r&1?3988292384^r>>>1:r>>>1;Sn[n]=r}}let e=4294967295;for(let n=0;n<t.length;n++)e=Sn[(e^t[n])&255]^e>>>8;return(e^4294967295)>>>0}function Ur(t){let e=[],n=0,r=[];for(let l of t){let m=En(l.filename),f=oo(l.data),h=l.data.length,b=30+m.length,d=n+b,p=0,E=d%64;E!==0&&(p=64-E);let A=new Uint8Array(b+p),x=new DataView(A.buffer);x.setUint32(0,67324752,!0),x.setUint16(4,20,!0),x.setUint16(6,0,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,0,!0),x.setUint32(14,f,!0),x.setUint32(18,h,!0),x.setUint32(22,h,!0),x.setUint16(26,m.length,!0),x.setUint16(28,p,!0),A.set(m,30),p>0&&A.fill(0,30+m.length),e.push({offset:n,size:h,crc:f,filenameBytes:m,entry:l}),r.push(A),r.push(l.data),n+=A.length+l.data.length}let i=n;for(let l of e){let m=new Uint8Array(46+l.filenameBytes.length),f=new DataView(m.buffer);f.setUint32(0,33639248,!0),f.setUint16(4,20,!0),f.setUint16(6,20,!0),f.setUint16(8,0,!0),f.setUint16(10,0,!0),f.setUint16(12,0,!0),f.setUint16(14,0,!0),f.setUint32(16,l.crc,!0),f.setUint32(20,l.size,!0),f.setUint32(24,l.size,!0),f.setUint16(28,l.filenameBytes.length,!0),f.setUint16(30,0,!0),f.setUint16(32,0,!0),f.setUint16(34,0,!0),f.setUint16(36,0,!0),f.setUint32(38,0,!0),f.setUint32(42,l.offset,!0),m.set(l.filenameBytes,46),r.push(m),n+=m.length}let o=n-i,s=new Uint8Array(22),c=new DataView(s.buffer);c.setUint32(0,101010256,!0),c.setUint16(4,0,!0),c.setUint16(6,0,!0),c.setUint16(8,e.length,!0),c.setUint16(10,e.length,!0),c.setUint32(12,o,!0),c.setUint32(16,i,!0),c.setUint16(20,0,!0),r.push(s),n+=22;let a=new Uint8Array(n),u=0;for(let l of r)a.set(l,u),u+=l.length;return a}function Ot(t){let e=io(t),n=En(e);return Ur([{filename:"model.usda",data:n}])}function $t(t){let e=ot(t),n=ro(e),r=Fr(n),i=En(r);return Ur([{filename:"model.usda",data:i}])}function qt(t){return t&&typeof t.toUSDZ=="function"?t.toUSDZ():t&&typeof t.traverse=="function"?Ot(t):$t(t)}function Vt(t){let e=qt(t);return new Blob([e],{type:"model/vnd.usdz+zip"})}function st(t,e,n,r){let i=typeof t=="number"&&Number.isFinite(t)?t:r;return Math.max(e,Math.min(n,i))}function As(t){return Array.isArray(t)&&t.length>=3&&Number.isFinite(t[0])&&Number.isFinite(t[1])&&Number.isFinite(t[2])}function Or(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function Ss(t,e=256){return typeof t=="string"&&t.length>0?t.slice(0,e):void 0}function so(t){let e=Or(t);if(!e)return null;let n=e.target;return{target:As(n)?[n[0],n[1],n[2]]:typeof n=="string"&&n.length>0&&n.length<=256?n:[0,0,0],radius:st(e.radius,.01,50,.5),speed:st(e.speed,-20,20,.5),height:st(e.height,-10,10,0),phase:st(e.phase,-1e6,1e6,0),faceCenter:e.faceCenter===!0}}function Rn(t,e){let n=Ss(t,16)?.trim();if(!n)return e;let r=/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(n);return r?`#${r[1].toLowerCase()}`:e}function Vr(t){if(t===!1||t===null||t===void 0)return null;if(typeof t=="number")return!Number.isFinite(t)||t<=0?null:{enabled:!0,strength:st(t,0,5,.35),threshold:.8,radius:.5};if(t===!0)return{enabled:!0,strength:.35,threshold:.8,radius:.5};let e=Or(t);if(!e||e.enabled===!1)return null;let n=st(e.strength??e.intensity,0,5,.35);return n<=0?null:{enabled:!0,strength:n,threshold:st(e.threshold,0,4,.8),radius:st(e.radius,0,2,.5)}}function _n(t){if(!t)return null;if(typeof t=="string")return{enabled:!0,color:Rn(t,"#38bdf8"),thickness:3,pulse:!1};if(t===!0)return{enabled:!0,color:"#38bdf8",thickness:3,pulse:!1};let e=Or(t);return!e||e.enabled===!1?null:{enabled:!0,color:Rn(e.color,"#38bdf8"),thickness:st(e.thickness??e.width,.5,20,3),pulse:e.pulse===!0}}var In=class t{constructor(e=0,n=0){this.x=Number(e),this.y=Number(n)}set(e,n){return this.x=Number(e),this.y=Number(n),this}clone(){return new t(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}sub(e){return this.x-=e.x,this.y-=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}},Ce=class t{constructor(e=0,n=0,r=0){this.x=Number(e),this.y=Number(n),this.z=Number(r)}set(e,n,r){return this.x=Number(e),this.y=Number(n),this.z=Number(r),this}clone(){return new t(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addVectors(e,n){return this.x=e.x+n.x,this.y=e.y+n.y,this.z=e.z+n.z,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subVectors(e,n){return this.x=e.x-n.x,this.y=e.y-n.y,this.z=e.z-n.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}length(){return Math.hypot(this.x,this.y,this.z)}normalize(){let e=this.length();return e>1e-5&&(this.x/=e,this.y/=e,this.z/=e),this}cross(e){let n=this.y*e.z-this.z*e.y,r=this.z*e.x-this.x*e.z,i=this.x*e.y-this.y*e.x;return this.x=n,this.y=r,this.z=i,this}crossVectors(e,n){let r=e.x,i=e.y,o=e.z,s=n.x,c=n.y,a=n.z;return this.x=i*a-o*c,this.y=o*s-r*a,this.z=r*c-i*s,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}distanceTo(e){return Math.hypot(this.x-e.x,this.y-e.y,this.z-e.z)}applyMatrix4(e){let n=this.x,r=this.y,i=this.z,o=e.elements,s=1/(o[3]*n+o[7]*r+o[11]*i+o[15]);return this.x=(o[0]*n+o[4]*r+o[8]*i+o[12])*s,this.y=(o[1]*n+o[5]*r+o[9]*i+o[13])*s,this.z=(o[2]*n+o[6]*r+o[10]*i+o[14])*s,this}},Ln=class{constructor(e=0,n=0,r=0,i=1){this.x=Number(e),this.y=Number(n),this.z=Number(r),this.w=Number(i)}set(e,n,r,i){return this.x=Number(e),this.y=Number(n),this.z=Number(r),this.w=Number(i),this}},Zt=class t{constructor(e=0,n=0,r=0,i="XYZ"){this._onChangeCallback=null;this._x=Number(e),this._y=Number(n),this._z=Number(r),this.order=i}get x(){return this._x}set x(e){this._x=Number(e),this._onChangeCallback?.()}get y(){return this._y}set y(e){this._y=Number(e),this._onChangeCallback?.()}get z(){return this._z}set z(e){this._z=Number(e),this._onChangeCallback?.()}set(e,n,r,i=this.order){return this._x=Number(e),this._y=Number(n),this._z=Number(r),this.order=i,this._onChangeCallback?.(),this}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this.order=e.order,this._onChangeCallback?.(),this}clone(){return new t(this._x,this._y,this._z,this.order)}_onChange(e){return this._onChangeCallback=e,this}},Qt=class t{constructor(e=0,n=0,r=0,i=1){this._onChangeCallback=null;this._x=Number(e),this._y=Number(n),this._z=Number(r),this._w=Number(i)}get x(){return this._x}set x(e){this._x=Number(e),this._onChangeCallback?.()}get y(){return this._y}set y(e){this._y=Number(e),this._onChangeCallback?.()}get z(){return this._z}set z(e){this._z=Number(e),this._onChangeCallback?.()}get w(){return this._w}set w(e){this._w=Number(e),this._onChangeCallback?.()}set(e,n,r,i){return this._x=Number(e),this._y=Number(n),this._z=Number(r),this._w=Number(i),this._onChangeCallback?.(),this}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback?.(),this}clone(){return new t(this._x,this._y,this._z,this._w)}setFromEuler(e,n=!0){let r=e.x,i=e.y,o=e.z,s=Math.cos(r/2),c=Math.cos(i/2),a=Math.cos(o/2),u=Math.sin(r/2),l=Math.sin(i/2),m=Math.sin(o/2);return this._x=u*c*a+s*l*m,this._y=s*l*a-u*c*m,this._z=s*c*m+u*l*a,this._w=s*c*a-u*l*m,n&&this._onChangeCallback?.(),this}setFromAxisAngle(e,n){let r=n/2,i=Math.sin(r);return this._x=e.x*i,this._y=e.y*i,this._z=e.z*i,this._w=Math.cos(r),this._onChangeCallback?.(),this}multiply(e){return this.multiplyQuaternions(this,e)}multiplyQuaternions(e,n){let r=e.x,i=e.y,o=e.z,s=e.w,c=n.x,a=n.y,u=n.z,l=n.w;return this._x=r*l+s*c+i*u-o*a,this._y=i*l+s*a+o*c-r*u,this._z=o*l+s*u+r*a-i*c,this._w=s*l-r*c-i*a-o*u,this._onChangeCallback?.(),this}_onChange(e){return this._onChangeCallback=e,this}},vt=class t{constructor(){this.elements=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])}identity(){let e=this.elements;return e.fill(0),e[0]=1,e[5]=1,e[10]=1,e[15]=1,this}copy(e){return this.elements.set(e.elements),this}clone(){let e=new t;return e.copy(this),e}compose(e,n,r){return rt(this.elements,[n.x,n.y,n.z,n.w],[e.x,e.y,e.z],[r.x,r.y,r.z]),this}multiply(e){return this.multiplyMatrices(this,e)}multiplyMatrices(e,n){return Ee(this.elements,e.elements,n.elements),this}lookAt(e,n,r){return Nt(this.elements,[e.x,e.y,e.z],[n.x,n.y,n.z],[r.x,r.y,r.z]),this}makeRotationFromQuaternion(e){let n=new Ce(0,0,0),r=new Ce(1,1,1);return this.compose(n,e,r)}makeTranslation(e,n,r){return this.identity(),this.elements[12]=Number(e),this.elements[13]=Number(n),this.elements[14]=Number(r),this}makeScale(e,n,r){return this.identity(),this.elements[0]=Number(e),this.elements[5]=Number(n),this.elements[10]=Number(r),this}},Pn=class{constructor(){this.elements=new Float32Array([1,0,0,0,1,0,0,0,1])}identity(){let e=this.elements;return e.fill(0),e[0]=1,e[4]=1,e[8]=1,this}getNormalMatrix(e){return Le(this.elements,e.elements),this}},$e=class t{constructor(e,n,r){this.r=1;this.g=1;this.b=1;e!==void 0&&(n!==void 0&&r!==void 0?this.setRGB(e,n,r):this.set(e))}set(e){if(typeof e=="number")this.setHex(e);else if(typeof e=="string")if(e.startsWith("#")){let n=parseInt(e.slice(1),16);this.setHex(n)}else e==="red"?this.setRGB(1,0,0):e==="green"?this.setRGB(0,1,0):e==="blue"?this.setRGB(0,0,1):e==="white"?this.setRGB(1,1,1):e==="black"&&this.setRGB(0,0,0);else e&&typeof e=="object"&&"r"in e&&(this.r=Number(e.r),this.g=Number(e.g),this.b=Number(e.b));return this}setHex(e){let n=Math.floor(e);return this.r=(n>>16&255)/255,this.g=(n>>8&255)/255,this.b=(n&255)/255,this}setRGB(e,n,r){return this.r=Number(e),this.g=Number(n),this.b=Number(r),this}getHex(){return Math.round(Math.max(0,Math.min(1,this.r))*255)<<16|Math.round(Math.max(0,Math.min(1,this.g))*255)<<8|Math.round(Math.max(0,Math.min(1,this.b))*255)}getHexString(){return("000000"+this.getHex().toString(16)).slice(-6)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}equals(e){return e.r===this.r&&e.g===this.g&&e.b===this.b}clone(){return new t(this.r,this.g,this.b)}},ho={degToRad:t=>t*Math.PI/180,radToDeg:t=>t*180/Math.PI,clamp:(t,e,n)=>Math.max(e,Math.min(n,t)),lerp:(t,e,n)=>t+(e-t)*n,generateUUID:()=>Math.random().toString(36).substring(2,15),randFloat:(t,e)=>t+Math.random()*(e-t)},Me=class{constructor(e,n){this.needsUpdate=!1;if(typeof n!="number"||!Number.isInteger(n)||n<1||n>16)throw new Error(`SecurityError: BufferAttribute itemSize must be an integer in [1, 16]. Received: ${String(n)}`);Array.isArray(e)?this.array=new Float32Array(e):this.array=e,this.itemSize=n;let r=this.array?this.array.length:0;if(!Number.isFinite(r)||r<0)throw new Error(`SecurityError: BufferAttribute array has a non-finite length: ${String(r)}`);this.count=Math.floor(r/n)}getX(e){return this.array[e*this.itemSize]}getY(e){return this.array[e*this.itemSize+1]}getZ(e){return this.array[e*this.itemSize+2]}setX(e,n){return this.array[e*this.itemSize]=n,this.needsUpdate=!0,this}setY(e,n){return this.array[e*this.itemSize+1]=n,this.needsUpdate=!0,this}setZ(e,n){return this.array[e*this.itemSize+2]=n,this.needsUpdate=!0,this}setXYZ(e,n,r,i){let o=e*this.itemSize;return this.array[o]=n,this.array[o+1]=r,this.array[o+2]=i,this.needsUpdate=!0,this}},Dn=class extends Me{constructor(e,n){super(e instanceof Float32Array?e:new Float32Array(e),n)}},kn=class extends Me{constructor(e,n){super(e instanceof Uint16Array?e:new Uint16Array(e),n)}},Nn=class extends Me{constructor(e,n){super(e instanceof Uint32Array?e:new Uint32Array(e),n)}},Xe=class{constructor(){this.name="";this.attributes={};this.index=null;this.boundingBox=null}setAttribute(e,n){return this.attributes[e]=n,this}getAttribute(e){return this.attributes[e]}setIndex(e){if(e instanceof Me)this.index=e;else if(Array.isArray(e)){let n=0;for(let i=0;i<e.length;i++)e[i]>n&&(n=e[i]);let r=n>65535?new Uint32Array(e):new Uint16Array(e);this.index=new Me(r,1)}else e&&e.buffer&&(this.index=new Me(e,1));return this}computeVertexNormals(){let e=this.attributes.position;if(!e)return this;let n=e.count,r=new Float32Array(n*3),i=new Ce,o=new Ce,s=new Ce,c=new Ce,a=new Ce;if(this.index){let u=this.index.array;for(let l=0;l<u.length;l+=3){let m=u[l],f=u[l+1],h=u[l+2];i.set(e.getX(m),e.getY(m),e.getZ(m)),o.set(e.getX(f),e.getY(f),e.getZ(f)),s.set(e.getX(h),e.getY(h),e.getZ(h)),c.subVectors(s,o),a.subVectors(i,o),c.cross(a).normalize();for(let b of[m,f,h])r[b*3]+=c.x,r[b*3+1]+=c.y,r[b*3+2]+=c.z}}else for(let u=0;u<n;u+=3){i.set(e.getX(u),e.getY(u),e.getZ(u)),o.set(e.getX(u+1),e.getY(u+1),e.getZ(u+1)),s.set(e.getX(u+2),e.getY(u+2),e.getZ(u+2)),c.subVectors(s,o),a.subVectors(i,o),c.cross(a).normalize();for(let l=0;l<3;l++)r[(u+l)*3]=c.x,r[(u+l)*3+1]=c.y,r[(u+l)*3+2]=c.z}for(let u=0;u<n;u++){let l=r[u*3],m=r[u*3+1],f=r[u*3+2],h=Math.hypot(l,m,f)||1;r[u*3]=l/h,r[u*3+1]=m/h,r[u*3+2]=f/h}return this.setAttribute("normal",new Me(r,3)),this}setFromBuffers(e,n,r,i){this.setAttribute("position",new Me(e instanceof Float32Array?e:new Float32Array(e),3)),this.setAttribute("normal",new Me(n instanceof Float32Array?n:new Float32Array(n),3)),this.setAttribute("uv",new Me(r instanceof Float32Array?r:new Float32Array(r),2)),this.setIndex(i)}computeBoundingBox(){let e=this.attributes.position,n=new Ce(1/0,1/0,1/0),r=new Ce(-1/0,-1/0,-1/0);if(e&&e.count>0)for(let i=0;i<e.count;i++){let o=e.getX(i),s=e.getY(i),c=e.getZ(i);o<n.x&&(n.x=o),s<n.y&&(n.y=s),c<n.z&&(n.z=c),o>r.x&&(r.x=o),s>r.y&&(r.y=s),c>r.z&&(r.z=c)}else n.set(0,0,0),r.set(0,0,0);return this.boundingBox={min:n,max:r},this.boundingBox}center(){let e=this.computeBoundingBox(),n=(e.min.x+e.max.x)*.5,r=(e.min.y+e.max.y)*.5,i=(e.min.z+e.max.z)*.5,o=this.attributes.position;if(o&&o.count>0){for(let s=0;s<o.count;s++)o.setXYZ(s,o.getX(s)-n,o.getY(s)-r,o.getZ(s)-i);this.computeBoundingBox()}return this}dispose(){}},Jt=class extends Xe{constructor(e=1,n=1,r=1){super();let i=e/2,o=n/2,s=r/2,c=[-i,-o,s,i,-o,s,i,o,s,-i,o,s,i,-o,-s,-i,-o,-s,-i,o,-s,i,o,-s,-i,o,s,i,o,s,i,o,-s,-i,o,-s,-i,-o,-s,i,-o,-s,i,-o,s,-i,-o,s,i,-o,s,i,-o,-s,i,o,-s,i,o,s,-i,-o,-s,-i,-o,s,-i,o,s,-i,o,-s],a=[0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0],u=[0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,1],l=[];for(let m=0;m<6;m++){let f=m*4;l.push(f,f+1,f+2,f,f+2,f+3)}this.setAttribute("position",new Me(new Float32Array(c),3)),this.setAttribute("normal",new Me(new Float32Array(a),3)),this.setAttribute("uv",new Me(new Float32Array(u),2)),this.setIndex(l)}},Fn=class extends Xe{constructor(e=1,n=1){super();let r=e/2,i=n/2,o=[-r,i,0,r,i,0,-r,-i,0,r,-i,0],s=[0,0,1,0,0,1,0,0,1,0,0,1],c=[0,1,1,1,0,0,1,0],a=[0,2,1,2,3,1];this.setAttribute("position",new Me(new Float32Array(o),3)),this.setAttribute("normal",new Me(new Float32Array(s),3)),this.setAttribute("uv",new Me(new Float32Array(c),2)),this.setIndex(a)}},en=class extends Xe{constructor(e=1,n=16,r=12){super(),n=Math.max(3,Math.floor(n)),r=Math.max(2,Math.floor(r));let i=[],o=[],s=[],c=[],a=[];for(let u=0;u<=r;u++){let l=[],m=u/r;for(let f=0;f<=n;f++){let h=f/n,b=h*Math.PI*2,d=m*Math.PI,p=-e*Math.cos(b)*Math.sin(d),E=e*Math.cos(d),A=e*Math.sin(b)*Math.sin(d);i.push(p,E,A);let x=Math.hypot(p,E,A)||1;o.push(p/x,E/x,A/x),s.push(h,1-m),l.push(i.length/3-1)}a.push(l)}for(let u=0;u<r;u++)for(let l=0;l<n;l++){let m=a[u][l+1],f=a[u][l],h=a[u+1][l],b=a[u+1][l+1];u!==0&&c.push(m,f,b),u!==r-1&&c.push(f,h,b)}this.setAttribute("position",new Me(new Float32Array(i),3)),this.setAttribute("normal",new Me(new Float32Array(o),3)),this.setAttribute("uv",new Me(new Float32Array(s),2)),this.setIndex(c)}},yt=class extends Xe{constructor(e=1,n=1,r=1,i=16){super(),i=Math.max(3,Math.floor(i));let o=[],s=[],c=[],a=[],u=r/2;for(let l=0;l<=1;l++){let m=l,f=l===0?e:n,h=l===0?u:-u;for(let b=0;b<=i;b++){let d=b/i,p=d*Math.PI*2,E=Math.sin(p),A=Math.cos(p);o.push(f*E,h,f*A),s.push(E,0,A),c.push(d,1-m)}}for(let l=0;l<i;l++){let m=l,f=l+i+1,h=l+i+2,b=l+1;a.push(m,f,b,f,h,b)}if(e>0){let l=o.length/3;o.push(0,u,0),s.push(0,1,0),c.push(.5,.5);let m=o.length/3;for(let f=0;f<=i;f++){let h=f/i*Math.PI*2,b=Math.sin(h),d=Math.cos(h);o.push(e*b,u,e*d),s.push(0,1,0),c.push(d*.5+.5,b*.5+.5)}for(let f=0;f<i;f++)a.push(l,m+f,m+f+1)}if(n>0){let l=o.length/3;o.push(0,-u,0),s.push(0,-1,0),c.push(.5,.5);let m=o.length/3;for(let f=0;f<=i;f++){let h=f/i*Math.PI*2,b=Math.sin(h),d=Math.cos(h);o.push(n*b,-u,n*d),s.push(0,-1,0),c.push(d*.5+.5,1-(b*.5+.5))}for(let f=0;f<i;f++)a.push(l,m+f+1,m+f)}this.setAttribute("position",new Me(new Float32Array(o),3)),this.setAttribute("normal",new Me(new Float32Array(s),3)),this.setAttribute("uv",new Me(new Float32Array(c),2)),this.setIndex(a)}},Un=class extends yt{constructor(e=1,n=1,r=16){super(0,e,n,r)}},On=class extends Xe{constructor(e=1,n=.4,r=12,i=32){super(),r=Math.max(3,Math.floor(r)),i=Math.max(3,Math.floor(i));let o=[],s=[],c=[],a=[];for(let u=0;u<=r;u++){let l=u/r*Math.PI*2;for(let m=0;m<=i;m++){let f=m/i*Math.PI*2,h=(e+n*Math.cos(l))*Math.cos(f),b=(e+n*Math.cos(l))*Math.sin(f),d=n*Math.sin(l);o.push(h,b,d);let p=e*Math.cos(f),E=e*Math.sin(f),A=h-p,x=b-E,R=d,I=Math.hypot(A,x,R)||1;s.push(A/I,x/I,R/I),c.push(m/i,u/r)}}for(let u=1;u<=r;u++)for(let l=1;l<=i;l++){let m=(i+1)*u+l-1,f=(i+1)*(u-1)+l-1,h=(i+1)*(u-1)+l,b=(i+1)*u+l;a.push(m,f,b,f,h,b)}this.setAttribute("position",new Me(new Float32Array(o),3)),this.setAttribute("normal",new Me(new Float32Array(s),3)),this.setAttribute("uv",new Me(new Float32Array(c),2)),this.setIndex(a)}},Vn=class extends Xe{constructor(e=1,n=.4,r=64,i=8,o=2,s=3){super(),r=Math.floor(r),i=Math.floor(i);let c=[],a=[],u=[],l=[],m=new Ce,f=new Ce,h=new Ce,b=new Ce,d=new Ce;function p(x,R){let I=Math.cos(R),P=Math.sin(R),k=s/o*R,D=e*(2+Math.cos(k))*.5;x.set(D*I,D*P,e*Math.sin(k)*.5)}let E=[];for(let x=0;x<=i;++x){let R=x/i*Math.PI*2;E.push(-n*Math.cos(R),n*Math.sin(R),x/i)}for(let x=0;x<=r;++x){let R=x/r,I=R*o*Math.PI*2;p(m,I),p(f,I+.01),h.subVectors(f,m).normalize(),b.addVectors(m,f).normalize(),d.crossVectors(h,b).normalize(),b.crossVectors(d,h).normalize();for(let P=0;P<=i;++P){let k=P*3,D=E[k],S=E[k+1],_=E[k+2],v=D*b.x+S*d.x,G=D*b.y+S*d.y,L=D*b.z+S*d.z;c.push(m.x+v,m.y+G,m.z+L);let U=Math.hypot(v,G,L)||1;a.push(v/U,G/U,L/U),u.push(R,_)}}let A=i+1;for(let x=1;x<=r;x++){let R=A*(x-1),I=R+A;for(let P=1;P<=i;P++){let k=R+(P-1),D=I+(P-1),S=I+P,_=R+P;l.push(k,D,_,D,S,_)}}this.setAttribute("position",new Me(new Float32Array(c),3)),this.setAttribute("normal",new Me(new Float32Array(a),3)),this.setAttribute("uv",new Me(new Float32Array(u),2)),this.setIndex(l)}},tn=class{constructor(e=""){this.isTexture=!0;this.wrapS=10497;this.wrapT=10497;this.image=null;this.width=0;this.height=0;this.source=e,e&&typeof e=="object"&&(this.image=e)}dispose(){}},Bn=class{load(e,n){let r=new tn(e);return n?.(r),r}};function Oe(t,e){return t!==void 0?Number(t):e}function Br(t,e){return t!==void 0?!!t:e}var Qe=class{constructor(e={}){this.name=e.name||"",this.color=new $e(e.color!==void 0?e.color:16777215),this.emissive=new $e(e.emissive!==void 0?e.emissive:0),this.emissiveIntensity=Oe(e.emissiveIntensity,1),this.roughness=Oe(e.roughness,.5),this.metalness=Oe(e.metalness,.1),this.opacity=Oe(e.opacity,1),this.transparent=Br(e.transparent,!1),this.wireframe=Br(e.wireframe,!1),this.side=Oe(e.side,2),this.doubleSided=Br(e.doubleSided,!0),this.map=e.map||null,this.clearcoat=Oe(e.clearcoat,0),this.clearcoatRoughness=Oe(e.clearcoatRoughness,0),this.sheen=Oe(e.sheen,0),this.sheenColor=new $e(e.sheenColor!==void 0?e.sheenColor:0),this.sheenRoughness=Oe(e.sheenRoughness,0),this.transmission=Oe(e.transmission,0),this.thickness=Oe(e.thickness,0),this.attenuationColor=new $e(e.attenuationColor!==void 0?e.attenuationColor:16777215),this.attenuationDistance=Oe(e.attenuationDistance,1/0),this.ior=Oe(e.ior,1.5),this.dispersion=Oe(e.dispersion,0),this.iridescence=Oe(e.iridescence,0),this.iridescenceIOR=Oe(e.iridescenceIOR,1.3)}dispose(){}},Tt=class extends Qe{},zn=class extends Qe{},Gn=class extends Qe{},Xn=class extends Qe{},Hn=class extends Qe{},qe=class t{constructor(){this.name="";this.matrixAutoUpdate=!0;this.visible=!0;this.castShadow=!1;this.receiveShadow=!1;this.parent=null;this.children=[];this.userData={};this.position=new Ce,this.rotation=new Zt,this.quaternion=new Qt,this.scale=new Ce(1,1,1),this.matrix=new vt,this.matrixWorld=new vt,this.rotation._onChange(()=>{this.quaternion.setFromEuler(this.rotation,!1)}),this.quaternion._onChange(()=>{let e=this.quaternion,n=Math.atan2(2*(e.w*e.x+e.y*e.z),1-2*(e.x*e.x+e.y*e.y)),r=Math.asin(Math.max(-1,Math.min(1,2*(e.w*e.y-e.z*e.x)))),i=Math.atan2(2*(e.w*e.z+e.x*e.y),1-2*(e.y*e.y+e.z*e.z));this.rotation.set(n,r,i)})}add(...e){for(let n of e)n&&n instanceof t&&(n.parent&&n.parent.remove(n),n.parent=this,this.children.push(n));return this}remove(...e){for(let n of e){let r=this.children.indexOf(n);r!==-1&&(n.parent=null,this.children.splice(r,1))}return this}traverse(e){e(this);for(let n of this.children)n.traverse(e)}updateMatrix(){this.matrix.compose(this.position,this.quaternion,this.scale)}updateMatrixWorld(e=!1){po(this),(this.matrixAutoUpdate||e)&&this.updateMatrix(),this.parent?this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);for(let n of this.children)n.updateMatrixWorld(e)}lookAt(e,n,r){let i=typeof e=="object"?e:new Ce(e,n,r);this.updateMatrixWorld(!0);let o=new vt;o.lookAt(this.position,i,new Ce(0,1,0));let s=o.elements,c=s[0],a=s[4],u=s[8],l=s[1],m=s[5],f=s[9],h=s[2],b=s[6],d=s[10],p=c+m+d;if(p>0){let E=.5/Math.sqrt(p+1);this.quaternion.set((b-f)*E,(u-h)*E,(l-a)*E,.25/E)}}},Wn=class extends qe{},wt=class extends qe{constructor(n,r){super();this.isMesh=!0;let i=Array.isArray(r)?r[0]:r;this.geometry=n instanceof Xe?n:n?(He("unsupported geometry","BoxGeometry"),new Jt(.5,.5,.5)):new Xe,this.material=i instanceof Qe?i:i?(He("unsupported material","MeshStandardMaterial"),new Tt({color:13421772})):new Tt}};function po(t){let e=pe().materializeDeclarativeGeometry;typeof e=="function"&&e(t)}var nn=1e4,rn=class extends wt{constructor(n,r,i=1){super(n,r);this.instanceColor=null;this.isInstancedMesh=!0;let o=Number(i);if(!Number.isFinite(o)||o<0||o>nn)throw new RangeError(`SecurityError: InstancedMesh count (${String(i)}) exceeds MAX_INSTANCES_PER_MESH (${nn})`);this.count=Math.floor(o);let s=new Float32Array(this.count*16);for(let c=0;c<this.count;c++){let a=c*16;s[a]=1,s[a+5]=1,s[a+10]=1,s[a+15]=1}this.instanceMatrix=new Me(s,16)}setMatrixAt(n,r){let i=Math.floor(Number(n));if(!Number.isFinite(i)||i<0||i>=this.count||!r||!r.elements)return;let o=this.instanceMatrix.array,s=i*16;if(!(s+16>o.length))for(let c=0;c<16;c++){let a=Number(r.elements[c]);o[s+c]=Number.isFinite(a)?a:c%5===0?1:0}}getMatrixAt(n,r){let i=Math.floor(Number(n));if(!Number.isFinite(i)||i<0||i>=this.count||!r||!r.elements)return;let o=this.instanceMatrix.array,s=i*16;if(!(s+16>o.length))for(let c=0;c<16;c++)r.elements[c]=o[s+c]}setColorAt(n,r){let i=Math.floor(Number(n));if(!Number.isFinite(i)||i<0||i>=this.count||!r)return;if(!this.instanceColor||this.instanceColor.array.length<this.count*3){let c=new Float32Array(this.count*3);c.fill(1),this.instanceColor=new Me(c,3)}let o=this.instanceColor.array,s=i*3;o[s]=Number.isFinite(r.r)?r.r:1,o[s+1]=Number.isFinite(r.g)?r.g:1,o[s+2]=Number.isFinite(r.b)?r.b:1}getColorAt(n,r){let i=Math.floor(Number(n));if(!Number.isFinite(i)||i<0||i>=this.count||!r)return;if(!this.instanceColor||this.instanceColor.array.length<(i+1)*3){r.setRGB(1,1,1);return}let o=this.instanceColor.array,s=i*3;r.setRGB(o[s],o[s+1],o[s+2])}dispose(){}},Mt=class extends qe{constructor(e=16777215,n=1){super(),this.color=new $e(e),this.intensity=Number(n),this.type="directional"}},on=class extends Mt{constructor(e,n){super(e,n),this.type="ambient"}},$n=class extends Mt{constructor(n,r){super(n,r);this.target=new qe;this.type="directional"}},sn=class extends Mt{constructor(n,r,i=0,o=2){super(n,r);this.distance=0;this.decay=2;this.type="point",this.distance=i,this.decay=o}},an=class extends qe{},qn=class extends an{constructor(n=45,r=1,i=.1,o=1e3){super();this.target=new Ce(0,0,0);this.fov=Number(n),this.aspect=Number(r),this.near=Number(i),this.far=Number(o)}},cn=class extends qe{constructor(){super(...arguments);this.background=null;this.environmentIntensity=1}toCanvas3D(){return Ze.validate(this),Ut(this)}toGLB(){return Ze.validate(this),Wt(this)}toUSDZ(){return Ze.validate(this),Ot(this)}getMeshTransforms(){this.updateMatrixWorld(!0);let n=new Map,r=0;return this.traverse(i=>{if(i instanceof wt){let o=new Float32Array(i.matrixWorld.elements);n.set(r,o),i.name&&n.set(i.name,o),r++}}),n}},zr=Ut,Gr=Wt,bo=Ot;var Ze=class{static validate(e){let n=0,r=0,i=0,o=new Set,s=(a,u,l)=>{throw new Error(`SecurityError: Scene exceeds SECURITY_3D_MAX_${a} (${u}). Found: ${l}`)},c=(a,u)=>{if(!Number.isFinite(u))throw new Error(`SecurityError: Scene reports a non-finite ${a} count (${String(u)}), which cannot be bounds-checked.`);return u};e.traverse(a=>{if(po(a),a instanceof wt||a.geometry?.attributes?.position?.count){if(i++,i>1e3&&s("MESHES",1e3,i),a instanceof rn){let l=c("instance",a.count);(l<0||l>nn)&&s("INSTANCES",nn,l)}let u=a.geometry;if(u){let l=0;if(u.attributes.position&&(l=c("vertex",u.attributes.position.count),n+=l,n>1e5&&s("VERTICES",1e5,n)),u.index){let m=c("index",u.index.count);r+=m,r>3e5&&s("INDICES",3e5,r);let f=u.index.array;if(f&&l>0){let h=Math.min(m,f.length);for(let b=0;b<h;b++){let d=f[b];if(!Number.isFinite(d)||d<0||d>=l)throw new Error(`SecurityError: Index buffer value (${String(d)}) out of vertex bounds [0, ${l}).`)}}}}if(a.material){let l=a.material;l.map&&o.add(l.map),l.normalMap&&o.add(l.normalMap),l.roughnessMap&&o.add(l.roughnessMap)}}}),o.size>16&&s("TEXTURES",16,o.size);for(let a of o){let u=a,l=u.image,m=Number(l?.width??u.width??0)||0,f=Number(l?.height??u.height??0)||0;(!Number.isFinite(m)||!Number.isFinite(f)||m>2048||f>2048)&&s("TEXTURE_DIMENSION",2048,Math.max(m,f))}}},Yn=class{constructor(e={}){this.shadowMap={enabled:!1,type:0};this.capabilities={isWebGL2:!0,maxTextures:16};this.boundViewer=null;this.isSandboxed=!1;this.containerId="";this.hasInitialModelRendered=!1;this.domElement=e.canvas||(typeof document<"u"?document.createElement("canvas"):{}),e.viewer&&(this.boundViewer=e.viewer),e.container?.threeLiveViewer&&(this.boundViewer=e.container.threeLiveViewer),e.canvas?.parentElement?.threeLiveViewer&&(this.boundViewer=e.canvas.parentElement.threeLiveViewer);let n=typeof WorkerGlobalScope<"u"&&typeof self<"u"&&self instanceof WorkerGlobalScope;this.isSandboxed=e.isSandboxed||n,this.containerId=e.containerId||""}setSize(e,n){return this}setPixelRatio(e){return this}setClearColor(e,n=1){let r=new $e(e);return this.boundViewer&&typeof this.boundViewer.setClearColor=="function"&&this.boundViewer.setClearColor(r.r,r.g,r.b,n),this}clear(){return this}dispose(){}render(e,n){if(this.isSandboxed){Ze.validate(e);let i=(o,s)=>{typeof self<"u"&&typeof self.postMessage=="function"&&(s&&s.length?self.postMessage(o,s):self.postMessage(o))};if(this.hasInitialModelRendered){let o=e.getMeshTransforms(),s={};for(let[c,a]of o.entries())s[c]=Array.from(a);i({type:"3D_UPDATE_TRANSFORMS",containerId:this.containerId,transforms:s})}else{this.hasInitialModelRendered=!0;let o=zr(e),s=Gr(e),c=(o.lights||[]).map(a=>({type:a.type,color:a.color,intensity:a.intensity,position:a.position}));i({type:"3D_MODEL_READY",containerId:this.containerId,glbBuffer:s.buffer,dynamicLights:c,camera:n?{fov:n.fov||60,position:[n.position.x,n.position.y,n.position.z]}:void 0},[s.buffer])}return}let r=this.boundViewer;!r&&this.domElement?.parentElement&&this.domElement.parentElement.threeLiveViewer&&(r=this.domElement.parentElement.threeLiveViewer,this.boundViewer=r),!r&&typeof window<"u"&&(r=window.__three_live_active_viewer__,this.boundViewer=r),r&&typeof r.loadModel=="function"&&(r._hasThreeLiveModelLoaded?typeof r.updateMeshTransforms=="function"&&r.updateMeshTransforms(e.getMeshTransforms()):(r.loadModel(e.toCanvas3D()),r._hasThreeLiveModelLoaded=!0))}};function ao(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}var jn=class{constructor(e=!0){this.startTime=0;this.oldTime=0;this.elapsedTime=0;this.running=!1;this.autoStart=e,e&&this.start()}start(){this.startTime=ao(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let e=0;if(this.autoStart&&!this.running&&this.start(),this.running){let n=ao();e=(n-this.oldTime)/1e3,this.oldTime=n,this.elapsedTime+=e}return e}};function Es(){}var jt=new Proxy(Es,{get:(t,e)=>{if(e==="isProxy")return!0;if(!(e==="constructor"||e==="__proto__"||e==="prototype"))return e==="domElement"?typeof document<"u"?document.createElement("canvas"):{}:e==="shadowMap"?{enabled:!1,type:0}:e==="capabilities"?{isWebGL2:!0,maxTextures:16}:e===Symbol.toPrimitive?()=>0:jt},getPrototypeOf:()=>null,setPrototypeOf:()=>!1,apply:()=>jt,construct:()=>jt}),co=(()=>{try{if(typeof document>"u")return null;let t=document.currentScript;return t?.src?t.src:t?.textContent&&typeof Blob<"u"&&typeof URL<"u"&&typeof URL.createObjectURL=="function"?URL.createObjectURL(new Blob([t.textContent],{type:"text/javascript"})):null}catch{return null}})();function zt(){return typeof document<"u"&&document.baseURI?document.baseURI:typeof location<"u"&&location.href?location.href:"https://localhost/"}function gt(t,e){if(!t||typeof t!="string")return!1;let n=t.trim();if(!n)return!1;try{let r=new URL(n,zt());return!(r.protocol!=="https:"&&r.protocol!=="http:"&&r.protocol!=="blob:"||e?.requireSameOrigin&&r.protocol!=="blob:"&&typeof location<"u"&&location.origin&&location.origin!=="null"&&r.origin!==location.origin)}catch{return!1}}var uo,Yt;function yo(t){if(!gt(t))throw new Error(`SecurityError: Refusing to create TrustedScriptURL for disallowed URL "${t}".`);let n=globalThis.trustedTypes;if(!n||typeof n.createPolicy!="function")return t;if(Yt===void 0||uo!==n){uo=n;try{Yt=n.createPolicy("three-live#worker",{createScriptURL:r=>{if(!gt(r))throw new TypeError(`SecurityError: Disallowed Three-Live worker script URL "${r}".`);return r}})}catch{Yt=null}}return Yt?Yt.createScriptURL(t):t}function Rs(t){pe().sandboxEngineSrc=t}function Xr(){let t=pe().sandboxEngineSrc;if(t)return t;if(co)return co;try{if(typeof document>"u")return null;let e=zt(),n=Array.from(document.querySelectorAll("script[src]"));for(let r of n){let i=r.src;if(!i)continue;let o=new URL(i,e).pathname;if(/(?:^|\/)(?:three|xr)-live[^/]*\.js$/.test(o)&>(i,{requireSameOrigin:!0}))return i}}catch{}return null}function _s(){let t=Xr();if(!t)throw new Error("Three-Live could not locate its own bundle URL, which the worker sandbox needs in order to load the THREE runtime. Set it explicitly, e.g. ThreeLiveElement.sandboxEngineSrc = new URL('three-live.min.js', import.meta.url).href. Refusing to execute the script, because unsandboxed host-realm execution is prohibited.");if(!gt(t))throw new Error(`SecurityError: Refusing to load sandbox engine from disallowed URL "${t}". Only http:, https:, and blob: URLs are permitted.`);return new URL(t,zt()).href}function Cs(t){pe().sandboxIframeSrc=t}function go(){let t=pe().sandboxIframeSrc;if(t)return t;let e=Xr();if(!e||!gt(e))return null;let n=new URL(e,zt());return n.protocol==="blob:"?null:new URL("three-live-sandbox.html",n).href}function Is(){let t=go();if(!t)throw new Error("Three-Live could not locate three-live-sandbox.html for iframe sandbox execution. Set ThreeLiveElement.sandboxIframeSrc (or ThreeLiveElement.sandboxEngineSrc) explicitly.");if(!gt(t))throw new Error(`SecurityError: Refusing to load sandbox iframe from disallowed URL "${t}". Only http:, https:, and blob: URLs are permitted.`);return new URL(t,zt()).href}function Ls(t){pe().allowClientScripts=t}function xo(){return!!pe().allowClientScripts}function Ps(t){if(!gt(t))throw new Error(`SecurityError: Refusing to load procedural scene script from disallowed URL "${t}". Only http:, https:, and blob: URLs are permitted.`);return new URL(t,zt()).href}var Ds=["fetch","XMLHttpRequest","WebSocket","WebSocketStream","WebTransport","EventSource","importScripts","Request","Response","Headers","navigator","WorkerNavigator","WorkerLocation","RTCPeerConnection","RTCDataChannel","FontFace","FontFaceSet","fonts","PerformanceObserver","ReportingObserver","indexedDB","IDBFactory","caches","CacheStorage","Cache","cookieStore","StorageManager","FileSystemHandle","Worker","SharedWorker","ServiceWorker","ServiceWorkerContainer","ServiceWorkerRegistration","registration","clients","BroadcastChannel","MessageChannel","MessagePort","createImageBitmap","OffscreenCanvas","WebAssembly","WorkerGlobalScope","DedicatedWorkerGlobalScope","trustedTypes","TrustedTypePolicyFactory","SharedArrayBuffer","Atomics"];function ks(t,e){let n=self,r=t.nonce,i=t.engineSrc,o=t.allowedScriptUrl,s=t.allowClientScripts,c=t.revoked,a=n.postMessage.bind(n);function u(P){a({type:"ERROR",nonce:r,message:String(P)})}let l=typeof n.importScripts=="function"?n.importScripts.bind(n):null,m=o,f=null;try{let P=i;if(typeof n.trustedTypes<"u"&&n.trustedTypes&&typeof n.trustedTypes.createPolicy=="function")try{let k={createScriptURL:function(S){if(S!==i&&(!o||S!==o))throw new TypeError("Disallowed worker importScripts URL");return S}};s&&(k.createScript=function(S){return String(S)});let D=n.trustedTypes.createPolicy("three-live#worker-boot",k);P=D.createScriptURL(i),o&&(m=D.createScriptURL(o)),s&&typeof D.createScript=="function"&&(f=D.createScript.bind(D))}catch{}l(P)}catch(P){u('Sandbox failed to load the Three-Live engine from "'+i+'". It must be a same-origin (or CORS-enabled) IIFE bundle such as three-live.min.js. Underlying error: '+(P&&P.message||P));return}let h=n.THREE;if(!h||typeof h.Scene!="function"){u('Sandbox loaded "'+i+'" but it did not install a THREE namespace. Point sandboxEngineSrc at an IIFE build (three-live.min.js), not an ES module build.');return}if(Array.isArray(e)){let P=n.__THREE_LIVE_REGISTRY__;for(let k=0;k<e.length;k++)if(typeof e[k]=="function")try{e[k](h,P)}catch{}}for(let P=0;P<c.length;P++){let k=c[P],D=n;for(;D&&D!==Object.prototype;){if(D!==n)try{delete D[k]}catch{}try{Object.defineProperty(D,k,{value:void 0,writable:!1,configurable:!1,enumerable:!1})}catch{}try{D=Object.getPrototypeOf(D)}catch{break}}}let b=Object.freeze({now:function(){return Date.now()}}),d=n;for(;d&&d!==Object.prototype;){if(d!==n)try{delete d.performance}catch{}try{Object.defineProperty(d,"performance",{value:b,writable:!1,configurable:!1,enumerable:!1})}catch{}try{d=Object.getPrototypeOf(d)}catch{break}}let p=["3D_MODEL_READY","3D_UPDATE_TRANSFORMS"],E=!1;function A(P,k){if(P.type==="3D_MODEL_READY"){if(E)return;E=!0}P.nonce=r,k&&k.length?a(P,k):a(P)}let x=function(P,k){if(!P||p.indexOf(P.type)===-1)throw new Error("Sandboxed scripts may only post Three-Live scene messages ("+p.join(", ")+").");A(P,k)},R=n;for(;R&&R!==Object.prototype;){if(R===n||Object.prototype.hasOwnProperty.call(R,"postMessage"))try{Object.defineProperty(R,"postMessage",{value:x,writable:!1,configurable:!1})}catch{}try{R=Object.getPrototypeOf(R)}catch{break}}let I=!1;n.onmessage=function(P){let k=P&&P.data;if(!(!k||k.nonce!==r)&&!(k.type!=="EXECUTE"&&k.type!=="EXECUTE_URL")&&!I){I=!0;try{let D=new h.Scene,S=new h.PerspectiveCamera(60,1,.1,1e3),_=new h.WebGLRenderer({isSandboxed:!0});if(k.type==="EXECUTE_URL"){if(!o||k.scriptUrl!==o||typeof l!="function"){u("SecurityError: Refusing to execute unapproved script URL inside sandbox worker.");return}let v=m||o,G=l;if(l=null,m=null,n.THREE=h,n.scene=D,n.camera=S,n.renderer=_,G(v),typeof n.__THREE_LIVE_SCENE__=="function"){let L=n.__THREE_LIVE_SCENE__(h,D,S,_);L&&typeof L.toGLB=="function"&&(D=L)}else n.scene&&typeof n.scene.toGLB=="function"&&(D=n.scene)}else{if(!s){u("SecurityError: Client-modified script compilation (Use Case 1) is disabled in this sandbox worker.");return}let v=f?(0,eval)(f(`(function (THREE, scene, camera, renderer) {
|
|
320
|
+
`,a}function No(e,t){if(e&&typeof e.traverse=="function"){let i=ga(e,t);return ei(i)}let n=ht(e),r=Do(n);return ei(r)}var zn=null;function ko(e){if(!zn){zn=new Uint32Array(256);for(let n=0;n<256;n++){let r=n;for(let i=0;i<8;i++)r=r&1?3988292384^r>>>1:r>>>1;zn[n]=r}}let t=4294967295;for(let n=0;n<e.length;n++)t=zn[(t^e[n])&255]^t>>>8;return(t^4294967295)>>>0}function ti(e){let t=[],n=0,r=[];for(let l of e){let f=Gn(l.filename),m=ko(l.data),h=l.data.length,p=30+f.length,d=n+p,y=0,T=d%64;T!==0&&(y=64-T);let S=new Uint8Array(p+y),b=new DataView(S.buffer);b.setUint32(0,67324752,!0),b.setUint16(4,20,!0),b.setUint16(6,0,!0),b.setUint16(8,0,!0),b.setUint16(10,0,!0),b.setUint16(12,0,!0),b.setUint32(14,m,!0),b.setUint32(18,h,!0),b.setUint32(22,h,!0),b.setUint16(26,f.length,!0),b.setUint16(28,y,!0),S.set(f,30),y>0&&S.fill(0,30+f.length),t.push({offset:n,size:h,crc:m,filenameBytes:f,entry:l}),r.push(S),r.push(l.data),n+=S.length+l.data.length}let i=n;for(let l of t){let f=new Uint8Array(46+l.filenameBytes.length),m=new DataView(f.buffer);m.setUint32(0,33639248,!0),m.setUint16(4,20,!0),m.setUint16(6,20,!0),m.setUint16(8,0,!0),m.setUint16(10,0,!0),m.setUint16(12,0,!0),m.setUint16(14,0,!0),m.setUint32(16,l.crc,!0),m.setUint32(20,l.size,!0),m.setUint32(24,l.size,!0),m.setUint16(28,l.filenameBytes.length,!0),m.setUint16(30,0,!0),m.setUint16(32,0,!0),m.setUint16(34,0,!0),m.setUint16(36,0,!0),m.setUint32(38,0,!0),m.setUint32(42,l.offset,!0),f.set(l.filenameBytes,46),r.push(f),n+=f.length}let o=n-i,a=new Uint8Array(22),u=new DataView(a.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,t.length,!0),u.setUint16(10,t.length,!0),u.setUint32(12,o,!0),u.setUint32(16,i,!0),u.setUint16(20,0,!0),r.push(a),n+=22;let s=new Uint8Array(n),c=0;for(let l of r)s.set(l,c),c+=l.length;return s}function Yt(e){let t=No(e),n=Gn(t);return ti([{filename:"model.usda",data:n}])}function sn(e){let t=ht(e),n=Do(t),r=ei(n),i=Gn(r);return ti([{filename:"model.usda",data:i}])}function an(e){return e&&typeof e.toUSDZ=="function"?e.toUSDZ():e&&typeof e.traverse=="function"?Yt(e):sn(e)}function jt(e){let t=an(e);return new Blob([t],{type:"model/vnd.usdz+zip"})}function dt(e,t,n,r){let i=typeof e=="number"&&Number.isFinite(e)?e:r;return Math.max(t,Math.min(n,i))}function Ta(e){return Array.isArray(e)&&e.length>=3&&Number.isFinite(e[0])&&Number.isFinite(e[1])&&Number.isFinite(e[2])}function ni(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function Aa(e,t=256){return typeof e=="string"&&e.length>0?e.slice(0,t):void 0}function Fo(e){let t=ni(e);if(!t)return null;let n=t.target;return{target:Ta(n)?[n[0],n[1],n[2]]:typeof n=="string"&&n.length>0&&n.length<=256?n:[0,0,0],radius:dt(t.radius,.01,50,.5),speed:dt(t.speed,-20,20,.5),height:dt(t.height,-10,10,0),phase:dt(t.phase,-1e6,1e6,0),faceCenter:t.faceCenter===!0}}function Hn(e,t){let n=Aa(e,16)?.trim();if(!n)return t;let r=/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(n);return r?`#${r[1].toLowerCase()}`:t}function ri(e){if(e===!1||e===null||e===void 0)return null;if(typeof e=="number")return!Number.isFinite(e)||e<=0?null:{enabled:!0,strength:dt(e,0,5,.35),threshold:.8,radius:.5};if(e===!0)return{enabled:!0,strength:.35,threshold:.8,radius:.5};let t=ni(e);if(!t||t.enabled===!1)return null;let n=dt(t.strength??t.intensity,0,5,.35);return n<=0?null:{enabled:!0,strength:n,threshold:dt(t.threshold,0,4,.8),radius:dt(t.radius,0,2,.5)}}function Xn(e){if(!e)return null;if(typeof e=="string")return{enabled:!0,color:Hn(e,"#38bdf8"),thickness:3,pulse:!1};if(e===!0)return{enabled:!0,color:"#38bdf8",thickness:3,pulse:!1};let t=ni(e);if(!t||t.enabled===!1)return null;let n=t.thickness??t.width;return{enabled:!0,color:Hn(t.color,"#38bdf8"),thickness:dt(typeof n=="number"&&n>0&&n<.25?Math.max(1.5,n*140):n,.5,20,3),pulse:t.pulse===!0}}var $n=class e{constructor(t=0,n=0){this.x=Number(t),this.y=Number(n)}set(t,n){return this.x=Number(t),this.y=Number(n),this}clone(){return new e(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}sub(t){return this.x-=t.x,this.y-=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}},ke=class e{constructor(t=0,n=0,r=0){this.x=Number(t),this.y=Number(n),this.z=Number(r)}set(t,n,r){return this.x=Number(t),this.y=Number(n),this.z=Number(r),this}clone(){return new e(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addVectors(t,n){return this.x=t.x+n.x,this.y=t.y+n.y,this.z=t.z+n.z,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subVectors(t,n){return this.x=t.x-n.x,this.y=t.y-n.y,this.z=t.z-n.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}length(){return Math.hypot(this.x,this.y,this.z)}normalize(){let t=this.length();return t>1e-5&&(this.x/=t,this.y/=t,this.z/=t),this}cross(t){let n=this.y*t.z-this.z*t.y,r=this.z*t.x-this.x*t.z,i=this.x*t.y-this.y*t.x;return this.x=n,this.y=r,this.z=i,this}crossVectors(t,n){let r=t.x,i=t.y,o=t.z,a=n.x,u=n.y,s=n.z;return this.x=i*s-o*u,this.y=o*a-r*s,this.z=r*u-i*a,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}distanceTo(t){return Math.hypot(this.x-t.x,this.y-t.y,this.z-t.z)}applyMatrix4(t){let n=this.x,r=this.y,i=this.z,o=t.elements,a=1/(o[3]*n+o[7]*r+o[11]*i+o[15]);return this.x=(o[0]*n+o[4]*r+o[8]*i+o[12])*a,this.y=(o[1]*n+o[5]*r+o[9]*i+o[13])*a,this.z=(o[2]*n+o[6]*r+o[10]*i+o[14])*a,this}},qn=class{constructor(t=0,n=0,r=0,i=1){this.x=Number(t),this.y=Number(n),this.z=Number(r),this.w=Number(i)}set(t,n,r,i){return this.x=Number(t),this.y=Number(n),this.z=Number(r),this.w=Number(i),this}},mn=class e{constructor(t=0,n=0,r=0,i="XYZ"){this._onChangeCallback=null;this._x=Number(t),this._y=Number(n),this._z=Number(r),this.order=i}get x(){return this._x}set x(t){this._x=Number(t),this._onChangeCallback?.()}get y(){return this._y}set y(t){this._y=Number(t),this._onChangeCallback?.()}get z(){return this._z}set z(t){this._z=Number(t),this._onChangeCallback?.()}set(t,n,r,i=this.order){return this._x=Number(t),this._y=Number(n),this._z=Number(r),this.order=i,this._onChangeCallback?.(),this}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this.order=t.order,this._onChangeCallback?.(),this}clone(){return new e(this._x,this._y,this._z,this.order)}_onChange(t){return this._onChangeCallback=t,this}},fn=class e{constructor(t=0,n=0,r=0,i=1){this._onChangeCallback=null;this._x=Number(t),this._y=Number(n),this._z=Number(r),this._w=Number(i)}get x(){return this._x}set x(t){this._x=Number(t),this._onChangeCallback?.()}get y(){return this._y}set y(t){this._y=Number(t),this._onChangeCallback?.()}get z(){return this._z}set z(t){this._z=Number(t),this._onChangeCallback?.()}get w(){return this._w}set w(t){this._w=Number(t),this._onChangeCallback?.()}set(t,n,r,i){return this._x=Number(t),this._y=Number(n),this._z=Number(r),this._w=Number(i),this._onChangeCallback?.(),this}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback?.(),this}clone(){return new e(this._x,this._y,this._z,this._w)}setFromEuler(t,n=!0){let r=t.x,i=t.y,o=t.z,a=Math.cos(r/2),u=Math.cos(i/2),s=Math.cos(o/2),c=Math.sin(r/2),l=Math.sin(i/2),f=Math.sin(o/2);return this._x=c*u*s+a*l*f,this._y=a*l*s-c*u*f,this._z=a*u*f+c*l*s,this._w=a*u*s-c*l*f,n&&this._onChangeCallback?.(),this}setFromAxisAngle(t,n){let r=n/2,i=Math.sin(r);return this._x=t.x*i,this._y=t.y*i,this._z=t.z*i,this._w=Math.cos(r),this._onChangeCallback?.(),this}multiply(t){return this.multiplyQuaternions(this,t)}multiplyQuaternions(t,n){let r=t.x,i=t.y,o=t.z,a=t.w,u=n.x,s=n.y,c=n.z,l=n.w;return this._x=r*l+a*u+i*c-o*s,this._y=i*l+a*s+o*u-r*c,this._z=o*l+a*c+r*s-i*u,this._w=a*l-r*u-i*s-o*c,this._onChangeCallback?.(),this}_onChange(t){return this._onChangeCallback=t,this}},It=class e{constructor(){this.elements=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])}identity(){let t=this.elements;return t.fill(0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,this}copy(t){return this.elements.set(t.elements),this}clone(){let t=new e;return t.copy(this),t}compose(t,n,r){return Qe(this.elements,[n.x,n.y,n.z,n.w],[t.x,t.y,t.z],[r.x,r.y,r.z]),this}multiply(t){return this.multiplyMatrices(this,t)}multiplyMatrices(t,n){return Re(this.elements,t.elements,n.elements),this}lookAt(t,n,r){return Ht(this.elements,[t.x,t.y,t.z],[n.x,n.y,n.z],[r.x,r.y,r.z]),this}makeRotationFromQuaternion(t){let n=new ke(0,0,0),r=new ke(1,1,1);return this.compose(n,t,r)}makeTranslation(t,n,r){return this.identity(),this.elements[12]=Number(t),this.elements[13]=Number(n),this.elements[14]=Number(r),this}makeScale(t,n,r){return this.identity(),this.elements[0]=Number(t),this.elements[5]=Number(n),this.elements[10]=Number(r),this}},Yn=class{constructor(){this.elements=new Float32Array([1,0,0,0,1,0,0,0,1])}identity(){let t=this.elements;return t.fill(0),t[0]=1,t[4]=1,t[8]=1,this}getNormalMatrix(t){return De(this.elements,t.elements),this}},Je=class e{constructor(t,n,r){this.r=1;this.g=1;this.b=1;t!==void 0&&(n!==void 0&&r!==void 0?this.setRGB(t,n,r):this.set(t))}set(t){if(typeof t=="number")this.setHex(t);else if(typeof t=="string")if(t.startsWith("#")){let n=parseInt(t.slice(1),16);this.setHex(n)}else t==="red"?this.setRGB(1,0,0):t==="green"?this.setRGB(0,1,0):t==="blue"?this.setRGB(0,0,1):t==="white"?this.setRGB(1,1,1):t==="black"&&this.setRGB(0,0,0);else t&&typeof t=="object"&&"r"in t&&(this.r=Number(t.r),this.g=Number(t.g),this.b=Number(t.b));return this}setHex(t){let n=Math.floor(t);return this.r=(n>>16&255)/255,this.g=(n>>8&255)/255,this.b=(n&255)/255,this}setRGB(t,n,r){return this.r=Number(t),this.g=Number(n),this.b=Number(r),this}getHex(){return Math.round(Math.max(0,Math.min(1,this.r))*255)<<16|Math.round(Math.max(0,Math.min(1,this.g))*255)<<8|Math.round(Math.max(0,Math.min(1,this.b))*255)}getHexString(){return("000000"+this.getHex().toString(16)).slice(-6)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}equals(t){return t.r===this.r&&t.g===this.g&&t.b===this.b}clone(){return new e(this.r,this.g,this.b)}},Ho={degToRad:e=>e*Math.PI/180,radToDeg:e=>e*180/Math.PI,clamp:(e,t,n)=>Math.max(t,Math.min(n,e)),lerp:(e,t,n)=>e+(t-e)*n,generateUUID:()=>Math.random().toString(36).substring(2,15),randFloat:(e,t)=>e+Math.random()*(t-e)},we=class{constructor(t,n){this.needsUpdate=!1;if(typeof n!="number"||!Number.isInteger(n)||n<1||n>16)throw new Error(`SecurityError: BufferAttribute itemSize must be an integer in [1, 16]. Received: ${String(n)}`);Array.isArray(t)?this.array=new Float32Array(t):this.array=t,this.itemSize=n;let r=this.array?this.array.length:0;if(!Number.isFinite(r)||r<0)throw new Error(`SecurityError: BufferAttribute array has a non-finite length: ${String(r)}`);this.count=Math.floor(r/n)}getX(t){return this.array[t*this.itemSize]}getY(t){return this.array[t*this.itemSize+1]}getZ(t){return this.array[t*this.itemSize+2]}setX(t,n){return this.array[t*this.itemSize]=n,this.needsUpdate=!0,this}setY(t,n){return this.array[t*this.itemSize+1]=n,this.needsUpdate=!0,this}setZ(t,n){return this.array[t*this.itemSize+2]=n,this.needsUpdate=!0,this}setXYZ(t,n,r,i){let o=t*this.itemSize;return this.array[o]=n,this.array[o+1]=r,this.array[o+2]=i,this.needsUpdate=!0,this}},jn=class extends we{constructor(t,n){super(t instanceof Float32Array?t:new Float32Array(t),n)}},Kn=class extends we{constructor(t,n){super(t instanceof Uint16Array?t:new Uint16Array(t),n)}},Zn=class extends we{constructor(t,n){super(t instanceof Uint32Array?t:new Uint32Array(t),n)}},je=class{constructor(){this.name="";this.attributes={};this.index=null;this.boundingBox=null}setAttribute(t,n){return this.attributes[t]=n,this}getAttribute(t){return this.attributes[t]}setIndex(t){if(t instanceof we)this.index=t;else if(Array.isArray(t)){let n=0;for(let i=0;i<t.length;i++)t[i]>n&&(n=t[i]);let r=n>65535?new Uint32Array(t):new Uint16Array(t);this.index=new we(r,1)}else t&&t.buffer&&(this.index=new we(t,1));return this}computeVertexNormals(){let t=this.attributes.position;if(!t)return this;let n=t.count,r=new Float32Array(n*3),i=new ke,o=new ke,a=new ke,u=new ke,s=new ke;if(this.index){let c=this.index.array;for(let l=0;l<c.length;l+=3){let f=c[l],m=c[l+1],h=c[l+2];i.set(t.getX(f),t.getY(f),t.getZ(f)),o.set(t.getX(m),t.getY(m),t.getZ(m)),a.set(t.getX(h),t.getY(h),t.getZ(h)),u.subVectors(a,o),s.subVectors(i,o),u.cross(s).normalize();for(let p of[f,m,h])r[p*3]+=u.x,r[p*3+1]+=u.y,r[p*3+2]+=u.z}}else for(let c=0;c<n;c+=3){i.set(t.getX(c),t.getY(c),t.getZ(c)),o.set(t.getX(c+1),t.getY(c+1),t.getZ(c+1)),a.set(t.getX(c+2),t.getY(c+2),t.getZ(c+2)),u.subVectors(a,o),s.subVectors(i,o),u.cross(s).normalize();for(let l=0;l<3;l++)r[(c+l)*3]=u.x,r[(c+l)*3+1]=u.y,r[(c+l)*3+2]=u.z}for(let c=0;c<n;c++){let l=r[c*3],f=r[c*3+1],m=r[c*3+2],h=Math.hypot(l,f,m)||1;r[c*3]=l/h,r[c*3+1]=f/h,r[c*3+2]=m/h}return this.setAttribute("normal",new we(r,3)),this}setFromBuffers(t,n,r,i){this.setAttribute("position",new we(t instanceof Float32Array?t:new Float32Array(t),3)),this.setAttribute("normal",new we(n instanceof Float32Array?n:new Float32Array(n),3)),this.setAttribute("uv",new we(r instanceof Float32Array?r:new Float32Array(r),2)),this.setIndex(i)}computeBoundingBox(){let t=this.attributes.position,n=new ke(1/0,1/0,1/0),r=new ke(-1/0,-1/0,-1/0);if(t&&t.count>0)for(let i=0;i<t.count;i++){let o=t.getX(i),a=t.getY(i),u=t.getZ(i);o<n.x&&(n.x=o),a<n.y&&(n.y=a),u<n.z&&(n.z=u),o>r.x&&(r.x=o),a>r.y&&(r.y=a),u>r.z&&(r.z=u)}else n.set(0,0,0),r.set(0,0,0);return this.boundingBox={min:n,max:r},this.boundingBox}center(){let t=this.computeBoundingBox(),n=(t.min.x+t.max.x)*.5,r=(t.min.y+t.max.y)*.5,i=(t.min.z+t.max.z)*.5,o=this.attributes.position;if(o&&o.count>0){for(let a=0;a<o.count;a++)o.setXYZ(a,o.getX(a)-n,o.getY(a)-r,o.getZ(a)-i);this.computeBoundingBox()}return this}dispose(){}},hn=class extends je{constructor(t=1,n=1,r=1){super();let i=t/2,o=n/2,a=r/2,u=[-i,-o,a,i,-o,a,i,o,a,-i,o,a,i,-o,-a,-i,-o,-a,-i,o,-a,i,o,-a,-i,o,a,i,o,a,i,o,-a,-i,o,-a,-i,-o,-a,i,-o,-a,i,-o,a,-i,-o,a,i,-o,a,i,-o,-a,i,o,-a,i,o,a,-i,-o,-a,-i,-o,a,-i,o,a,-i,o,-a],s=[0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0],c=[0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,1],l=[];for(let f=0;f<6;f++){let m=f*4;l.push(m,m+1,m+2,m,m+2,m+3)}this.setAttribute("position",new we(new Float32Array(u),3)),this.setAttribute("normal",new we(new Float32Array(s),3)),this.setAttribute("uv",new we(new Float32Array(c),2)),this.setIndex(l)}},Qn=class extends je{constructor(t=1,n=1){super();let r=t/2,i=n/2,o=[-r,i,0,r,i,0,-r,-i,0,r,-i,0],a=[0,0,1,0,0,1,0,0,1,0,0,1],u=[0,1,1,1,0,0,1,0],s=[0,2,1,2,3,1];this.setAttribute("position",new we(new Float32Array(o),3)),this.setAttribute("normal",new we(new Float32Array(a),3)),this.setAttribute("uv",new we(new Float32Array(u),2)),this.setIndex(s)}},dn=class extends je{constructor(t=1,n=16,r=12){super(),n=Math.max(3,Math.floor(n)),r=Math.max(2,Math.floor(r));let i=[],o=[],a=[],u=[],s=[];for(let c=0;c<=r;c++){let l=[],f=c/r;for(let m=0;m<=n;m++){let h=m/n,p=h*Math.PI*2,d=f*Math.PI,y=-t*Math.cos(p)*Math.sin(d),T=t*Math.cos(d),S=t*Math.sin(p)*Math.sin(d);i.push(y,T,S);let b=Math.hypot(y,T,S)||1;o.push(y/b,T/b,S/b),a.push(h,1-f),l.push(i.length/3-1)}s.push(l)}for(let c=0;c<r;c++)for(let l=0;l<n;l++){let f=s[c][l+1],m=s[c][l],h=s[c+1][l],p=s[c+1][l+1];c!==0&&u.push(f,m,p),c!==r-1&&u.push(m,h,p)}this.setAttribute("position",new we(new Float32Array(i),3)),this.setAttribute("normal",new we(new Float32Array(o),3)),this.setAttribute("uv",new we(new Float32Array(a),2)),this.setIndex(u)}},St=class extends je{constructor(t=1,n=1,r=1,i=16){super(),i=Math.max(3,Math.floor(i));let o=[],a=[],u=[],s=[],c=r/2;for(let l=0;l<=1;l++){let f=l,m=l===0?t:n,h=l===0?c:-c;for(let p=0;p<=i;p++){let d=p/i,y=d*Math.PI*2,T=Math.sin(y),S=Math.cos(y);o.push(m*T,h,m*S),a.push(T,0,S),u.push(d,1-f)}}for(let l=0;l<i;l++){let f=l,m=l+i+1,h=l+i+2,p=l+1;s.push(f,m,p,m,h,p)}if(t>0){let l=o.length/3;o.push(0,c,0),a.push(0,1,0),u.push(.5,.5);let f=o.length/3;for(let m=0;m<=i;m++){let h=m/i*Math.PI*2,p=Math.sin(h),d=Math.cos(h);o.push(t*p,c,t*d),a.push(0,1,0),u.push(d*.5+.5,p*.5+.5)}for(let m=0;m<i;m++)s.push(l,f+m,f+m+1)}if(n>0){let l=o.length/3;o.push(0,-c,0),a.push(0,-1,0),u.push(.5,.5);let f=o.length/3;for(let m=0;m<=i;m++){let h=m/i*Math.PI*2,p=Math.sin(h),d=Math.cos(h);o.push(n*p,-c,n*d),a.push(0,-1,0),u.push(d*.5+.5,1-(p*.5+.5))}for(let m=0;m<i;m++)s.push(l,f+m+1,f+m)}this.setAttribute("position",new we(new Float32Array(o),3)),this.setAttribute("normal",new we(new Float32Array(a),3)),this.setAttribute("uv",new we(new Float32Array(u),2)),this.setIndex(s)}},Jn=class extends St{constructor(t=1,n=1,r=16){super(0,t,n,r)}},er=class extends je{constructor(t=1,n=.4,r=12,i=32){super(),r=Math.max(3,Math.floor(r)),i=Math.max(3,Math.floor(i));let o=[],a=[],u=[],s=[];for(let c=0;c<=r;c++){let l=c/r*Math.PI*2;for(let f=0;f<=i;f++){let m=f/i*Math.PI*2,h=(t+n*Math.cos(l))*Math.cos(m),p=(t+n*Math.cos(l))*Math.sin(m),d=n*Math.sin(l);o.push(h,p,d);let y=t*Math.cos(m),T=t*Math.sin(m),S=h-y,b=p-T,A=d,w=Math.hypot(S,b,A)||1;a.push(S/w,b/w,A/w),u.push(f/i,c/r)}}for(let c=1;c<=r;c++)for(let l=1;l<=i;l++){let f=(i+1)*c+l-1,m=(i+1)*(c-1)+l-1,h=(i+1)*(c-1)+l,p=(i+1)*c+l;s.push(f,m,p,m,h,p)}this.setAttribute("position",new we(new Float32Array(o),3)),this.setAttribute("normal",new we(new Float32Array(a),3)),this.setAttribute("uv",new we(new Float32Array(u),2)),this.setIndex(s)}},tr=class extends je{constructor(t=1,n=.4,r=64,i=8,o=2,a=3){super(),r=Math.floor(r),i=Math.floor(i);let u=[],s=[],c=[],l=[],f=new ke,m=new ke,h=new ke,p=new ke,d=new ke;function y(b,A){let w=Math.cos(A),P=Math.sin(A),N=a/o*A,I=t*(2+Math.cos(N))*.5;b.set(I*w,I*P,t*Math.sin(N)*.5)}let T=[];for(let b=0;b<=i;++b){let A=b/i*Math.PI*2;T.push(-n*Math.cos(A),n*Math.sin(A),b/i)}for(let b=0;b<=r;++b){let A=b/r,w=A*o*Math.PI*2;y(f,w),y(m,w+.01),h.subVectors(m,f).normalize(),p.addVectors(f,m).normalize(),d.crossVectors(h,p).normalize(),p.crossVectors(d,h).normalize();for(let P=0;P<=i;++P){let N=P*3,I=T[N],_=T[N+1],v=T[N+2],g=I*p.x+_*d.x,M=I*p.y+_*d.y,k=I*p.z+_*d.z;u.push(f.x+g,f.y+M,f.z+k);let R=Math.hypot(g,M,k)||1;s.push(g/R,M/R,k/R),c.push(A,v)}}let S=i+1;for(let b=1;b<=r;b++){let A=S*(b-1),w=A+S;for(let P=1;P<=i;P++){let N=A+(P-1),I=w+(P-1),_=w+P,v=A+P;l.push(N,I,v,I,_,v)}}this.setAttribute("position",new we(new Float32Array(u),3)),this.setAttribute("normal",new we(new Float32Array(s),3)),this.setAttribute("uv",new we(new Float32Array(c),2)),this.setIndex(l)}},pn=class{constructor(t=""){this.isTexture=!0;this.wrapS=10497;this.wrapT=10497;this.image=null;this.width=0;this.height=0;this.source=t,t&&typeof t=="object"&&(this.image=t)}dispose(){}},nr=class{load(t,n){let r=new pn(t);return n?.(r),r}};function We(e,t){return e!==void 0?Number(e):t}function ii(e,t){return e!==void 0?!!e:t}var st=class{constructor(t={}){this.name=t.name||"",this.color=new Je(t.color!==void 0?t.color:16777215),this.emissive=new Je(t.emissive!==void 0?t.emissive:0),this.emissiveIntensity=We(t.emissiveIntensity,1),this.roughness=We(t.roughness,.5),this.metalness=We(t.metalness,.1),this.opacity=We(t.opacity,1),this.transparent=ii(t.transparent,!1),this.wireframe=ii(t.wireframe,!1),this.side=We(t.side,2),this.doubleSided=ii(t.doubleSided,!0),this.map=t.map||null,this.clearcoat=We(t.clearcoat,0),this.clearcoatRoughness=We(t.clearcoatRoughness,0),this.sheen=We(t.sheen,0),this.sheenColor=new Je(t.sheenColor!==void 0?t.sheenColor:0),this.sheenRoughness=We(t.sheenRoughness,0),this.transmission=We(t.transmission,0),this.thickness=We(t.thickness,0),this.attenuationColor=new Je(t.attenuationColor!==void 0?t.attenuationColor:16777215),this.attenuationDistance=We(t.attenuationDistance,1/0),this.ior=We(t.ior,1.5),this.dispersion=We(t.dispersion,0),this.iridescence=We(t.iridescence,0),this.iridescenceIOR=We(t.iridescenceIOR,1.3)}dispose(){}},Ct=class extends st{},rr=class extends st{},ir=class extends st{},or=class extends st{},sr=class extends st{},et=class e{constructor(){this.name="";this.matrixAutoUpdate=!0;this.visible=!0;this.castShadow=!1;this.receiveShadow=!1;this.parent=null;this.children=[];this.userData={};this.position=new ke,this.rotation=new mn,this.quaternion=new fn,this.scale=new ke(1,1,1),this.matrix=new It,this.matrixWorld=new It,this.rotation._onChange(()=>{this.quaternion.setFromEuler(this.rotation,!1)}),this.quaternion._onChange(()=>{let t=this.quaternion,n=Math.atan2(2*(t.w*t.x+t.y*t.z),1-2*(t.x*t.x+t.y*t.y)),r=Math.asin(Math.max(-1,Math.min(1,2*(t.w*t.y-t.z*t.x)))),i=Math.atan2(2*(t.w*t.z+t.x*t.y),1-2*(t.y*t.y+t.z*t.z));this.rotation.set(n,r,i)})}add(...t){for(let n of t)n&&n instanceof e&&(n.parent&&n.parent.remove(n),n.parent=this,this.children.push(n));return this}remove(...t){for(let n of t){let r=this.children.indexOf(n);r!==-1&&(n.parent=null,this.children.splice(r,1))}return this}traverse(t){t(this);for(let n of this.children)n.traverse(t)}updateMatrix(){this.matrix.compose(this.position,this.quaternion,this.scale)}updateMatrixWorld(t=!1){Xo(this),(this.matrixAutoUpdate||t)&&this.updateMatrix(),this.parent?this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix):this.matrixWorld.copy(this.matrix);for(let n of this.children)n.updateMatrixWorld(t)}lookAt(t,n,r){let i=typeof t=="object"?t:new ke(t,n,r);this.updateMatrixWorld(!0);let o=new It;o.lookAt(this.position,i,new ke(0,1,0));let a=o.elements,u=a[0],s=a[4],c=a[8],l=a[1],f=a[5],m=a[9],h=a[2],p=a[6],d=a[10],y=u+f+d;if(y>0){let T=.5/Math.sqrt(y+1);this.quaternion.set((p-m)*T,(c-h)*T,(l-s)*T,.25/T)}}},ar=class extends et{},Lt=class extends et{constructor(n,r){super();this.isMesh=!0;let i=Array.isArray(r)?r[0]:r;this.geometry=n instanceof je?n:n?(Ke("unsupported geometry","BoxGeometry"),new hn(.5,.5,.5)):new je,this.material=i instanceof st?i:i?(Ke("unsupported material","MeshStandardMaterial"),new Ct({color:13421772})):new Ct}};function Xo(e){let t=ge().materializeDeclarativeGeometry;typeof t=="function"&&t(e)}var bn=1e4,yn=class extends Lt{constructor(n,r,i=1){super(n,r);this.instanceColor=null;this.isInstancedMesh=!0;let o=Number(i);if(!Number.isFinite(o)||o<0||o>bn)throw new RangeError(`SecurityError: InstancedMesh count (${String(i)}) exceeds MAX_INSTANCES_PER_MESH (${bn})`);this.count=Math.floor(o);let a=new Float32Array(this.count*16);for(let u=0;u<this.count;u++){let s=u*16;a[s]=1,a[s+5]=1,a[s+10]=1,a[s+15]=1}this.instanceMatrix=new we(a,16)}setMatrixAt(n,r){let i=Math.floor(Number(n));if(!Number.isFinite(i)||i<0||i>=this.count||!r||!r.elements)return;let o=this.instanceMatrix.array,a=i*16;if(!(a+16>o.length))for(let u=0;u<16;u++){let s=Number(r.elements[u]);o[a+u]=Number.isFinite(s)?s:u%5===0?1:0}}getMatrixAt(n,r){let i=Math.floor(Number(n));if(!Number.isFinite(i)||i<0||i>=this.count||!r||!r.elements)return;let o=this.instanceMatrix.array,a=i*16;if(!(a+16>o.length))for(let u=0;u<16;u++)r.elements[u]=o[a+u]}setColorAt(n,r){let i=Math.floor(Number(n));if(!Number.isFinite(i)||i<0||i>=this.count||!r)return;if(!this.instanceColor||this.instanceColor.array.length<this.count*3){let u=new Float32Array(this.count*3);u.fill(1),this.instanceColor=new we(u,3)}let o=this.instanceColor.array,a=i*3;o[a]=Number.isFinite(r.r)?r.r:1,o[a+1]=Number.isFinite(r.g)?r.g:1,o[a+2]=Number.isFinite(r.b)?r.b:1}getColorAt(n,r){let i=Math.floor(Number(n));if(!Number.isFinite(i)||i<0||i>=this.count||!r)return;if(!this.instanceColor||this.instanceColor.array.length<(i+1)*3){r.setRGB(1,1,1);return}let o=this.instanceColor.array,a=i*3;r.setRGB(o[a],o[a+1],o[a+2])}dispose(){}},Pt=class extends et{constructor(t=16777215,n=1){super(),this.color=new Je(t),this.intensity=Number(n),this.type="directional"}},gn=class extends Pt{constructor(t,n){super(t,n),this.type="ambient"}},cr=class extends Pt{constructor(n,r){super(n,r);this.target=new et;this.type="directional"}},xn=class extends Pt{constructor(n,r,i=0,o=2){super(n,r);this.distance=0;this.decay=2;this.type="point",this.distance=i,this.decay=o}},vn=class extends et{},ur=class extends vn{constructor(n=45,r=1,i=.1,o=1e3){super();this.target=new ke(0,0,0);this.fov=Number(n),this.aspect=Number(r),this.near=Number(i),this.far=Number(o)}},Tn=class extends et{constructor(){super(...arguments);this.background=null;this.environmentIntensity=1}toCanvas3D(){return ot.validate(this),qt(this)}toGLB(){return ot.validate(this),on(this)}toUSDZ(){return ot.validate(this),Yt(this)}getMeshTransforms(){this.updateMatrixWorld(!0);let n=new Map,r=0;return this.traverse(i=>{if(i instanceof Lt){let o=new Float32Array(i.matrixWorld.elements);n.set(r,o),i.name&&n.set(i.name,o),r++}}),n}},oi=qt,si=on,Wo=Yt;var ot=class{static validate(t){let n=0,r=0,i=0,o=new Set,a=(s,c,l)=>{throw new Error(`SecurityError: Scene exceeds SECURITY_3D_MAX_${s} (${c}). Found: ${l}`)},u=(s,c)=>{if(!Number.isFinite(c))throw new Error(`SecurityError: Scene reports a non-finite ${s} count (${String(c)}), which cannot be bounds-checked.`);return c};t.traverse(s=>{if(Xo(s),s instanceof Lt||s.geometry?.attributes?.position?.count){if(i++,i>1e3&&a("MESHES",1e3,i),s instanceof yn){let l=u("instance",s.count);(l<0||l>bn)&&a("INSTANCES",bn,l)}let c=s.geometry;if(c){let l=0;if(c.attributes.position&&(l=u("vertex",c.attributes.position.count),n+=l,n>1e5&&a("VERTICES",1e5,n)),c.index){let f=u("index",c.index.count);r+=f,r>3e5&&a("INDICES",3e5,r);let m=c.index.array;if(m&&l>0){let h=Math.min(f,m.length);for(let p=0;p<h;p++){let d=m[p];if(!Number.isFinite(d)||d<0||d>=l)throw new Error(`SecurityError: Index buffer value (${String(d)}) out of vertex bounds [0, ${l}).`)}}}}if(s.material){let l=s.material;l.map&&o.add(l.map),l.normalMap&&o.add(l.normalMap),l.roughnessMap&&o.add(l.roughnessMap)}}}),o.size>16&&a("TEXTURES",16,o.size);for(let s of o){let c=s,l=c.image,f=Number(l?.width??c.width??0)||0,m=Number(l?.height??c.height??0)||0;(!Number.isFinite(f)||!Number.isFinite(m)||f>2048||m>2048)&&a("TEXTURE_DIMENSION",2048,Math.max(f,m))}}},lr=class{constructor(t={}){this.shadowMap={enabled:!1,type:0};this.capabilities={isWebGL2:!0,maxTextures:16};this.boundViewer=null;this.isSandboxed=!1;this.containerId="";this.hasInitialModelRendered=!1;this.domElement=t.canvas||(typeof document<"u"?document.createElement("canvas"):{}),t.viewer&&(this.boundViewer=t.viewer),t.container?.threeLiveViewer&&(this.boundViewer=t.container.threeLiveViewer),t.canvas?.parentElement?.threeLiveViewer&&(this.boundViewer=t.canvas.parentElement.threeLiveViewer);let n=typeof WorkerGlobalScope<"u"&&typeof self<"u"&&self instanceof WorkerGlobalScope;this.isSandboxed=t.isSandboxed||n,this.containerId=t.containerId||""}setSize(t,n){return this}setPixelRatio(t){return this}setClearColor(t,n=1){let r=new Je(t);return this.boundViewer&&typeof this.boundViewer.setClearColor=="function"&&this.boundViewer.setClearColor(r.r,r.g,r.b,n),this}clear(){return this}dispose(){}render(t,n){if(this.isSandboxed){ot.validate(t);let i=(o,a)=>{typeof self<"u"&&typeof self.postMessage=="function"&&(a&&a.length?self.postMessage(o,a):self.postMessage(o))};if(this.hasInitialModelRendered){let o=t.getMeshTransforms(),a={};for(let[u,s]of o.entries())a[u]=Array.from(s);i({type:"3D_UPDATE_TRANSFORMS",containerId:this.containerId,transforms:a})}else{this.hasInitialModelRendered=!0;let o=oi(t),a=si(t),u=(o.lights||[]).map(s=>({type:s.type,color:s.color,intensity:s.intensity,position:s.position}));i({type:"3D_MODEL_READY",containerId:this.containerId,glbBuffer:a.buffer,dynamicLights:u,camera:n?{fov:n.fov||60,position:[n.position.x,n.position.y,n.position.z]}:void 0},[a.buffer])}return}let r=this.boundViewer;!r&&this.domElement?.parentElement&&this.domElement.parentElement.threeLiveViewer&&(r=this.domElement.parentElement.threeLiveViewer,this.boundViewer=r),!r&&typeof window<"u"&&(r=window.__three_live_active_viewer__,this.boundViewer=r),r&&typeof r.loadModel=="function"&&(r._hasThreeLiveModelLoaded?typeof r.updateMeshTransforms=="function"&&r.updateMeshTransforms(t.getMeshTransforms()):(r.loadModel(t.toCanvas3D()),r._hasThreeLiveModelLoaded=!0))}};function Uo(){return typeof performance<"u"&&typeof performance.now=="function"?performance.now():Date.now()}var mr=class{constructor(t=!0){this.startTime=0;this.oldTime=0;this.elapsedTime=0;this.running=!1;this.autoStart=t,t&&this.start()}start(){this.startTime=Uo(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let t=0;if(this.autoStart&&!this.running&&this.start(),this.running){let n=Uo();t=(n-this.oldTime)/1e3,this.oldTime=n,this.elapsedTime+=t}return t}};function wa(){}var un=new Proxy(wa,{get:(e,t)=>{if(t==="isProxy")return!0;if(!(t==="constructor"||t==="__proto__"||t==="prototype"))return t==="domElement"?typeof document<"u"?document.createElement("canvas"):{}:t==="shadowMap"?{enabled:!1,type:0}:t==="capabilities"?{isWebGL2:!0,maxTextures:16}:t===Symbol.toPrimitive?()=>0:un},getPrototypeOf:()=>null,setPrototypeOf:()=>!1,apply:()=>un,construct:()=>un}),Oo=(()=>{try{if(typeof document>"u")return null;let e=document.currentScript;return e?.src?e.src:e?.textContent&&typeof Blob<"u"&&typeof URL<"u"&&typeof URL.createObjectURL=="function"?URL.createObjectURL(new Blob([e.textContent],{type:"text/javascript"})):null}catch{return null}})();function Zt(){return typeof document<"u"&&document.baseURI?document.baseURI:typeof location<"u"&&location.href?location.href:"https://localhost/"}function Et(e,t){if(!e||typeof e!="string")return!1;let n=e.trim();if(!n)return!1;try{let r=new URL(n,Zt());return!(r.protocol!=="https:"&&r.protocol!=="http:"&&r.protocol!=="blob:"||t?.requireSameOrigin&&r.protocol!=="blob:"&&typeof location<"u"&&location.origin&&location.origin!=="null"&&r.origin!==location.origin)}catch{return!1}}var Vo,cn;function $o(e){if(!Et(e))throw new Error(`SecurityError: Refusing to create TrustedScriptURL for disallowed URL "${e}".`);let n=globalThis.trustedTypes;if(!n||typeof n.createPolicy!="function")return e;if(cn===void 0||Vo!==n){Vo=n;try{cn=n.createPolicy("three-live#worker",{createScriptURL:r=>{if(!Et(r))throw new TypeError(`SecurityError: Disallowed Three-Live worker script URL "${r}".`);return r}})}catch{cn=null}}return cn?cn.createScriptURL(e):e}function Ma(e){ge().sandboxEngineSrc=e}function ai(){let e=ge().sandboxEngineSrc;if(e)return e;if(Oo)return Oo;try{if(typeof document>"u")return null;let t=Zt(),n=Array.from(document.querySelectorAll("script[src]"));for(let r of n){let i=r.src;if(!i)continue;let o=new URL(i,t).pathname;if(/(?:^|\/)(?:three|xr)-live[^/]*\.js$/.test(o)&&Et(i,{requireSameOrigin:!0}))return i}}catch{}return null}function Sa(){let e=ai();if(!e)throw new Error("Three-Live could not locate its own bundle URL, which the worker sandbox needs in order to load the THREE runtime. Set it explicitly, e.g. ThreeLiveElement.sandboxEngineSrc = new URL('three-live.min.js', import.meta.url).href. Refusing to execute the script, because unsandboxed host-realm execution is prohibited.");if(!Et(e))throw new Error(`SecurityError: Refusing to load sandbox engine from disallowed URL "${e}". Only http:, https:, and blob: URLs are permitted.`);return new URL(e,Zt()).href}function Ea(e){ge().sandboxIframeSrc=e}function qo(){let e=ge().sandboxIframeSrc;if(e)return e;let t=ai();if(!t||!Et(t))return null;let n=new URL(t,Zt());return n.protocol==="blob:"?null:new URL("three-live-sandbox.html",n).href}function Ra(){let e=qo();if(!e)throw new Error("Three-Live could not locate three-live-sandbox.html for iframe sandbox execution. Set ThreeLiveElement.sandboxIframeSrc (or ThreeLiveElement.sandboxEngineSrc) explicitly.");if(!Et(e))throw new Error(`SecurityError: Refusing to load sandbox iframe from disallowed URL "${e}". Only http:, https:, and blob: URLs are permitted.`);return new URL(e,Zt()).href}function _a(e){ge().allowClientScripts=e}function Yo(){return!!ge().allowClientScripts}function Ia(e){if(!Et(e))throw new Error(`SecurityError: Refusing to load procedural scene script from disallowed URL "${e}". Only http:, https:, and blob: URLs are permitted.`);return new URL(e,Zt()).href}var Ca=["fetch","XMLHttpRequest","WebSocket","WebSocketStream","WebTransport","EventSource","importScripts","Request","Response","Headers","navigator","WorkerNavigator","WorkerLocation","RTCPeerConnection","RTCDataChannel","FontFace","FontFaceSet","fonts","PerformanceObserver","ReportingObserver","indexedDB","IDBFactory","caches","CacheStorage","Cache","cookieStore","StorageManager","FileSystemHandle","Worker","SharedWorker","ServiceWorker","ServiceWorkerContainer","ServiceWorkerRegistration","registration","clients","BroadcastChannel","MessageChannel","MessagePort","createImageBitmap","OffscreenCanvas","WebAssembly","WorkerGlobalScope","DedicatedWorkerGlobalScope","trustedTypes","TrustedTypePolicyFactory","SharedArrayBuffer","Atomics"];function La(e,t){let n=self,r=e.nonce,i=e.engineSrc,o=e.allowedScriptUrl,a=e.allowClientScripts,u=e.revoked,s=n.postMessage.bind(n);function c(P){s({type:"ERROR",nonce:r,message:String(P)})}let l=typeof n.importScripts=="function"?n.importScripts.bind(n):null,f=o,m=null;try{let P=i;if(typeof n.trustedTypes<"u"&&n.trustedTypes&&typeof n.trustedTypes.createPolicy=="function")try{let N={createScriptURL:function(_){if(_!==i&&(!o||_!==o))throw new TypeError("Disallowed worker importScripts URL");return _}};a&&(N.createScript=function(_){return String(_)});let I=n.trustedTypes.createPolicy("three-live#worker-boot",N);P=I.createScriptURL(i),o&&(f=I.createScriptURL(o)),a&&typeof I.createScript=="function"&&(m=I.createScript.bind(I))}catch{}l(P)}catch(P){c('Sandbox failed to load the Three-Live engine from "'+i+'". It must be a same-origin (or CORS-enabled) IIFE bundle such as three-live.min.js. Underlying error: '+(P&&P.message||P));return}let h=n.THREE;if(!h||typeof h.Scene!="function"){c('Sandbox loaded "'+i+'" but it did not install a THREE namespace. Point sandboxEngineSrc at an IIFE build (three-live.min.js), not an ES module build.');return}if(Array.isArray(t)){let P=n.__THREE_LIVE_REGISTRY__;for(let N=0;N<t.length;N++)if(typeof t[N]=="function")try{t[N](h,P)}catch{}}for(let P=0;P<u.length;P++){let N=u[P],I=n;for(;I&&I!==Object.prototype;){if(I!==n)try{delete I[N]}catch{}try{Object.defineProperty(I,N,{value:void 0,writable:!1,configurable:!1,enumerable:!1})}catch{}try{I=Object.getPrototypeOf(I)}catch{break}}}let p=Object.freeze({now:function(){return Date.now()}}),d=n;for(;d&&d!==Object.prototype;){if(d!==n)try{delete d.performance}catch{}try{Object.defineProperty(d,"performance",{value:p,writable:!1,configurable:!1,enumerable:!1})}catch{}try{d=Object.getPrototypeOf(d)}catch{break}}let y=["3D_MODEL_READY","3D_UPDATE_TRANSFORMS"],T=!1;function S(P,N){if(P.type==="3D_MODEL_READY"){if(T)return;T=!0}P.nonce=r,N&&N.length?s(P,N):s(P)}let b=function(P,N){if(!P||y.indexOf(P.type)===-1)throw new Error("Sandboxed scripts may only post Three-Live scene messages ("+y.join(", ")+").");S(P,N)},A=n;for(;A&&A!==Object.prototype;){if(A===n||Object.prototype.hasOwnProperty.call(A,"postMessage"))try{Object.defineProperty(A,"postMessage",{value:b,writable:!1,configurable:!1})}catch{}try{A=Object.getPrototypeOf(A)}catch{break}}let w=!1;n.onmessage=function(P){let N=P&&P.data;if(!(!N||N.nonce!==r)&&!(N.type!=="EXECUTE"&&N.type!=="EXECUTE_URL")&&!w){w=!0;try{let I=new h.Scene,_=new h.PerspectiveCamera(60,1,.1,1e3),v=new h.WebGLRenderer({isSandboxed:!0});if(N.type==="EXECUTE_URL"){if(!o||N.scriptUrl!==o||typeof l!="function"){c("SecurityError: Refusing to execute unapproved script URL inside sandbox worker.");return}let g=f||o,M=l;if(l=null,f=null,n.THREE=h,n.scene=I,n.camera=_,n.renderer=v,M(g),typeof n.__THREE_LIVE_SCENE__=="function"){let k=n.__THREE_LIVE_SCENE__(h,I,_,v);k&&typeof k.toGLB=="function"&&(I=k)}else n.scene&&typeof n.scene.toGLB=="function"&&(I=n.scene)}else{if(!a){c("SecurityError: Client-modified script compilation (Use Case 1) is disabled in this sandbox worker.");return}let g=m?(0,eval)(m(`(function (THREE, scene, camera, renderer) {
|
|
303
321
|
return (function () {
|
|
304
|
-
`+
|
|
322
|
+
`+N.script+`
|
|
305
323
|
})();
|
|
306
324
|
})`)):new Function("THREE","scene","camera","renderer",`return (function () {
|
|
307
|
-
`+
|
|
308
|
-
})();`);f=null;let G=v(h,D,S,_);G&&typeof G.toGLB=="function"&&(D=G)}if(!E){h.SceneQuotaValidator&&h.SceneQuotaValidator.validate(D);let v=D.toGLB(),G=v instanceof ArrayBuffer?v:v.buffer.slice(v.byteOffset,v.byteOffset+v.byteLength);A({type:"3D_MODEL_READY",glbBuffer:G},[G])}a({type:"DONE",nonce:r})}catch(D){u(D&&D.message||D)}}},a({type:"READY",nonce:r})}function Hr(t,e,n){let r=n?.allowedScriptUrl??null,i=n?.allowClientScripts??r===null,o={nonce:e,engineSrc:t,allowedScriptUrl:r,allowClientScripts:i,revoked:Ds},s=(pe().workerExtensionInstallers??[]).map(c=>`(${c.toString()})`).join(",");return`'use strict';(${ks.toString()})(${JSON.stringify(o)},[${s}]);`}function vo(t){t.onError?.(new Error("SecurityError: Sandboxed script exceeded SECURITY_3D_SANDBOX_TIMEOUT_MS (3000 ms) and was terminated.")),t.onToast?.("Security Error: script timed out and was stopped.")}var bt=0;function To(){try{let t=new Uint32Array(4);return globalThis.crypto?.getRandomValues(t),Array.from(t,n=>n.toString(16).padStart(8,"0")).join("")}catch{return`${Date.now().toString(16)}-${Math.random().toString(16).slice(2)}`}}function Ns(t){try{return new TextEncoder().encode(t).length}catch{return t.length}}var Fs=1024,Us=256;function lo(t){if(!Array.isArray(t)&&!(t instanceof Float32Array)||t.length!==16)return!1;for(let e=0;e<16;e++){let n=t[e];if(typeof n!="number"||!Number.isFinite(n))return!1}return!0}function Wr(t,e){if(!t||typeof t!="object")return null;let n=t;if(n.nonce!==e)return null;switch(n.type){case"READY":return{type:"READY"};case"DONE":return{type:"DONE"};case"ERROR":return{type:"ERROR",message:(typeof n.message=="string"?n.message:String(n.message??"Unknown worker error")).replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g,"").slice(0,Fs)};case"3D_UPDATE_TRANSFORMS":{let i=n.transforms;if(Array.isArray(i)){if(i.length>1e3)return null;for(let o of i)if(!lo(o))return null;return{type:"3D_UPDATE_TRANSFORMS",transforms:i}}if(i&&typeof i=="object"){let o=Object.keys(i);if(o.length>1e3)return null;let s=Object.create(null),c=i;for(let a of o){if(a.length>Us||a==="__proto__"||a==="constructor"||a==="prototype")return null;let u=c[a];if(!lo(u))return null;s[a]=u}return{type:"3D_UPDATE_TRANSFORMS",transforms:s}}return null}case"3D_MODEL_READY":{let i=n.glbBuffer;return!(i instanceof ArrayBuffer)||i.byteLength>16777216?null:{type:"3D_MODEL_READY",payload:i}}default:return null}}function Os(t){let e=Ns(t);if(e>1048576)throw new Error(`SecurityError: Script length (${e} bytes) exceeds SECURITY_3D_MAX_SCRIPT_BYTES (1048576).`)}function wo(t,e,n,r){switch(t.type){case"READY":return;case"3D_UPDATE_TRANSFORMS":e.onUpdateTransforms?.(t.transforms);return;case"3D_MODEL_READY":if(r.modelDispatched)return;r.modelDispatched=!0,e.onModelReady(t.payload);return;case"DONE":n();return;case"ERROR":n(),e.onError?.(new Error(`Worker script error: ${t.message}`));return;default:return t}}function Vs(t,e,n,r){let i=To(),o=Hr(e,i,t.kind==="url"?{allowClientScripts:!1,allowedScriptUrl:t.scriptUrl}:{allowClientScripts:!0,allowedScriptUrl:null}),s=document.createElement("iframe");s.setAttribute("sandbox","allow-scripts"),s.setAttribute("aria-hidden","true"),s.tabIndex=-1,s.style.display="none",s.src=n,bt++;let c=!1,a=!1,u={modelDispatched:!1},l,m=()=>{if(c||a)return;let d=s.contentWindow;!d||typeof d.postMessage!="function"||(a=!0,d.postMessage(t.kind==="url"?{type:"SANDBOX_RUN",nonce:i,workerSource:o,scriptUrl:t.scriptUrl}:{type:"SANDBOX_RUN",nonce:i,workerSource:o,script:t.script},"*"))},f=()=>{},h=d=>{if(c||!s.contentWindow||d.source!==s.contentWindow)return;let p=d.data;if(p&&typeof p=="object"&&p.type==="IFRAME_READY"){m();return}let E=Wr(p,i);E&&wo(E,r,f,u)};f=()=>{c||(c=!0,l!==void 0&&clearTimeout(l),bt=Math.max(0,bt-1),typeof globalThis.removeEventListener=="function"&&globalThis.removeEventListener("message",h),typeof s.remove=="function"?s.remove():s.parentNode&&s.parentNode.removeChild(s))},l=setTimeout(()=>{c||(f(),vo(r))},3e3),typeof globalThis.addEventListener=="function"&&globalThis.addEventListener("message",h),s.onload=()=>{m()},s.onerror=()=>{f(),r.onError?.(new Error(`Sandbox iframe failed to load "${n}". Verify that three-live-sandbox.html is served at that URL.`))};let b=document.body||document.documentElement;if(!b||typeof b.appendChild!="function"){f();let d=new Error("SecurityError: Cannot mount sandbox iframe because document.body is unavailable.");throw r.onError?.(d),d}return b.appendChild(s),{terminate:f}}function mo(t,e,n,r){if(e==="worker"&&typeof Worker>"u")return r("Sandboxed procedural execution requires Web Workers, but Workers are unavailable in this environment. For host security, Three-Live prohibits unsandboxed in-process evaluation.","Security Error: Web Workers unavailable. Script execution aborted.");if(e==="iframe"&&(typeof document>"u"||typeof document.createElement!="function"))return r("Sandboxed iframe execution requires a DOM environment with document.createElement. Refusing to evaluate in the host realm.","Security Error: DOM unavailable for iframe sandbox.");if(bt>=32)return r(`SecurityError: ${bt} sandbox workers are already running, which meets SECURITY_3D_MAX_CONCURRENT_TASKS (32). Refusing to start another.`,"Security Error: too many concurrent sandboxed scripts.");let i;try{i=_s()}catch(f){let h=f instanceof Error?f.message:String(f);return r(h,"Security Error: sandbox engine URL is not configured.")}if(e==="iframe"){let f;try{f=Is()}catch(h){let b=h instanceof Error?h.message:String(h);return r(b,"Security Error: sandbox iframe URL is not configured.")}try{return Promise.resolve(Vs(t,i,f,n))}catch(h){return Promise.reject(h)}}let o=To(),s=Hr(i,o,t.kind==="url"?{allowClientScripts:!1,allowedScriptUrl:t.scriptUrl}:{allowClientScripts:!0,allowedScriptUrl:null}),c;try{let f=new Blob([s],{type:"application/javascript"}),h=URL.createObjectURL(f);try{let b=yo(h);c=new Worker(b)}finally{URL.revokeObjectURL(h)}}catch(f){let h=f instanceof Error?f.message:String(f);return r(`Failed to initialize Web Worker for sandboxed execution (CSP may block blob workers): ${h}`,"Security Error: Failed to start Worker sandbox.")}bt++;let a=!1,u={modelDispatched:!1},l,m=()=>{a||(a=!0,l!==void 0&&clearTimeout(l),bt=Math.max(0,bt-1),c.terminate())};return l=setTimeout(()=>{a||(m(),vo(n))},3e3),c.onmessage=f=>{let h=Wr(f.data,o);h&&wo(h,n,m,u)},c.onerror=f=>{m(),n.onError?.(new Error(`Worker execution error: ${f.message}`))},t.kind==="url"?c.postMessage({type:"EXECUTE_URL",scriptUrl:t.scriptUrl,nonce:o}):c.postMessage({type:"EXECUTE",script:t.script,nonce:o}),Promise.resolve({terminate:m})}function fo(t,e){return t==="none"||t==="unsafe-host-realm"?e(`SecurityError: sandbox="${t}" is prohibited. Sandboxing is mandatory for live compilation and cannot be bypassed. Use sandbox="worker" (default) or sandbox="iframe".`,`Security Error: sandbox="${t}" is not permitted.`):t!=="worker"&&t!=="iframe"?e(`SecurityError: Unsupported sandbox mode "${t}". Live compilation requires sandbox="worker" or sandbox="iframe".`,"Security Error: unsupported sandbox mode."):null}var Gt={execute(t,e,n,r){let i=(c,a)=>{let u=new Error(c);return n.onError?.(u),a&&n.onToast?.(a),Promise.reject(u)},o=fo(e,i);if(o)return o;try{Os(t)}catch(c){let a=c instanceof Error?c.message:String(c);return i(a,"Security Error: script exceeds the size limit.")}return r?.allowClientScripts??xo()?mo({kind:"script",script:t},e,n,i):i(yn,gn)},executeUrl(t,e,n){let r=(s,c)=>{let a=new Error(s);return n.onError?.(a),c&&n.onToast?.(c),Promise.reject(a)},i=fo(e,r);if(i)return i;let o;try{o=Ps(t)}catch(s){let c=s instanceof Error?s.message:String(s);return r(c,"Security Error: disallowed scene script URL.")}return mo({kind:"url",scriptUrl:o},e,n,r)}},Kn=new Set;function He(t,e){let n=`[three-live] ${t} is unsupported; degraded to ${e}.`;Kn.has(n)||(Kn.add(n),typeof console<"u"&&typeof console.warn=="function"&&console.warn(n))}function Mo(){return Array.from(Kn)}function Ao(){Kn.clear()}var un=class extends Tt{constructor(e={}){He("ShaderMaterial","MeshStandardMaterial");let n=e.uniforms||{},r=n.color?.value??n.uColor?.value??n.diffuse?.value??e.color;super({color:r!==void 0?r:8421504,opacity:n.opacity?.value??e.opacity??1,transparent:!!e.transparent,wireframe:!!e.wireframe,side:e.side}),this.uniforms=n}},So=un,At=class extends en{constructor(e=1,n=0,r="PolyhedronGeometry"){He(r,"SphereGeometry");let i=Math.max(4,Math.min(32,4<<Math.min(n,3)));super(e,i,i)}},Zn=class extends At{constructor(e=1,n=0){super(e,n,"IcosahedronGeometry")}},Qn=class extends At{constructor(e=1,n=0){super(e,n,"OctahedronGeometry")}},Jn=class extends At{constructor(e=1,n=0){super(e,n,"DodecahedronGeometry")}},er=class extends At{constructor(e=1,n=0){super(e,n,"TetrahedronGeometry")}},tr=class extends yt{constructor(e=1,n=1,r=4,i=8){He("CapsuleGeometry","CylinderGeometry"),super(e,e,n+e*2,i)}},nr=class extends yt{constructor(e=.5,n=1,r=16){He("RingGeometry","CylinderGeometry"),super(n,n,.01,Math.max(8,r))}},rr=class extends yt{constructor(e=1,n=16){He("CircleGeometry","CylinderGeometry"),super(e,e,.01,Math.max(8,n))}},ir=class extends sn{constructor(n,r,i=0,o=Math.PI/3,s=0,c=2){He("SpotLight","PointLight");super(n,r,i,c);this.target=new qe;this.angle=Math.PI/3;this.penumbra=0;this.angle=o,this.penumbra=s}},ln=class extends on{constructor(e,n,r){He("HemisphereLight","AmbientLight"),super(e,r),this.groundColor=new $e(n??4473924)}},Eo=ln,Ro={Vector2:In,Vector3:Ce,Vector4:Ln,Euler:Zt,Quaternion:Qt,Matrix4:vt,Matrix3:Pn,Color:$e,MathUtils:ho,BufferAttribute:Me,Float32BufferAttribute:Dn,Uint16BufferAttribute:kn,Uint32BufferAttribute:Nn,BufferGeometry:Xe,BoxGeometry:Jt,PlaneGeometry:Fn,SphereGeometry:en,CylinderGeometry:yt,ConeGeometry:Un,TorusGeometry:On,TorusKnotGeometry:Vn,IcosahedronGeometry:Zn,OctahedronGeometry:Qn,DodecahedronGeometry:Jn,TetrahedronGeometry:er,CapsuleGeometry:tr,RingGeometry:nr,CircleGeometry:rr,Texture:tn,TextureLoader:Bn,Material:Qe,MeshStandardMaterial:Tt,MeshBasicMaterial:zn,MeshLambertMaterial:Gn,MeshPhongMaterial:Xn,MeshPhysicalMaterial:Hn,ShaderMaterial:un,RawShaderMaterial:So,Object3D:qe,Group:Wn,Mesh:wt,InstancedMesh:rn,Light:Mt,AmbientLight:on,DirectionalLight:$n,PointLight:sn,SpotLight:ir,HemisphereLight:ln,RectAreaLight:Eo,Camera:an,PerspectiveCamera:qn,Scene:cn,WebGLRenderer:Yn,Clock:jn,SceneQuotaValidator:Ze,exportSceneToCanvas3D:zr,exportSceneToGLB:Gr,exportSceneToUSDZ:bo,generateUSDZ:qt,glbToUSDZ:$t,sceneToCanvas3D:Ut,sceneToGLB:Wt,sceneToUSDZ:Ot,authorScriptRunner:Gt,getAuthorWarnings:Mo,clearAuthorWarnings:Ao};Object.freeze(Ze);Object.freeze(Ze.prototype);Object.freeze(cn.prototype);Object.freeze(Ro);var St=new Proxy(Ro,{get:(t,e)=>{if(e in t)return t[e];let n=pe().authorNamespace;return n&&typeof e=="string"&&e in n?n[e]:(typeof e=="string"&&e!=="then"&&e!=="toJSON"&&!e.startsWith("__")&&He(`THREE.${e}`,"no-op proxy"),jt)},has:(t,e)=>{if(e in t)return!0;let n=pe().authorNamespace;return!!(n&&typeof e=="string"&&e in n)},set:(t,e)=>{throw new TypeError(`Cannot assign to read only property '${String(e)}' of #<THREE>`)},defineProperty:(t,e)=>{throw new TypeError(`Cannot define property '${String(e)}', object is not extensible`)},deleteProperty:(t,e)=>{throw new TypeError(`Cannot delete property '${String(e)}' of #<THREE>`)},setPrototypeOf:()=>{throw new TypeError("#<THREE> is not extensible")}}),Cn=pe();Cn.threeNamespace=St;if(Cn.workerExtensionInstallers)for(let t of Cn.workerExtensionInstallers)t(St,Cn);var Kt={name:"three_author",THREE:St},Bs=Kt,Bt=typeof globalThis<"u"?globalThis:typeof window<"u"?window:void 0;typeof Bt.THREE>"u"&&(Bt.THREE=St);typeof Bt.requestAnimationFrame!="function"&&(Bt.requestAnimationFrame=()=>(He("requestAnimationFrame","single-frame static evaluation"),0));typeof Bt.cancelAnimationFrame!="function"&&(Bt.cancelAnimationFrame=()=>{});if(typeof window<"u"){let t=window;t.ThreeLive=t.ThreeLive||{},t.ThreeLive.THREE=St,t.ThreeLivePlugins=t.ThreeLivePlugins||{},t.ThreeLivePlugins.threeAuthor=Kt,t.ThreeLivePlugins.three_author=Kt,t.ThreeLivePlugins["three-author"]=Kt}var zs=typeof HTMLElement<"u"?HTMLElement:class{};typeof CustomEvent>"u"&&typeof Event<"u"&&(globalThis.CustomEvent=class extends Event{constructor(t,e){super(t,e),this.detail=e?.detail??null}});var Ne=class Ne extends zs{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 pe().arProvider}static set arProvider(n){pe().arProvider=n}static get scriptRunner(){return pe().scriptRunner}static set scriptRunner(n){pe().scriptRunner=n}static get sandboxEngineSrc(){return pe().sandboxEngineSrc??null}static set sandboxEngineSrc(n){pe().sandboxEngineSrc=n}static get sandboxIframeSrc(){return pe().sandboxIframeSrc??null}static set sandboxIframeSrc(n){pe().sandboxIframeSrc=n}static get allowClientScripts(){return!!pe().allowClientScripts}static set allowClientScripts(n){pe().allowClientScripts=n}static registerScriptRunner(n){Ne.scriptRunner=n}static registerDecoder(n,r){Fe.registerDecoder(n,r)}static getDecoder(n){return Fe.getDecoder(n)}static registerAR(n){typeof n=="function"?Ne.arProvider={activateAR:n}:Ne.arProvider=n,typeof document<"u"&&document.querySelectorAll("three-live").forEach(i=>{i instanceof Ne&&i.updateARButtonVisibility()})}static isARSupported(){return!!Ne.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 n=this.getAttribute("src"),r=this.getAttribute("script-src");if(n)this.loadModelFromSrc(n).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 Fe.getRegisteredPlugins())i.onElementConnected?.(this)}disconnectedCallback(){for(let n of Fe.getRegisteredPlugins())n.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(n,r,i){if(r!==i){switch(n){case"src":i&&this.loadModelFromSrc(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 o=parseFloat(i);isNaN(o)||this.viewer.setExposure(o)}break;case"shadow-intensity":case"shadow-softness":this.viewer&&this.viewer.setShadow(this.shadowIntensity,this.shadowSoftness);break;case"tone-mapping":this.viewer&&i&&this.viewer.setToneMapping(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 o=this.cameraControls;this.viewer&&this.viewer.setInteractive?.(o),this.canvas&&(this.canvas.style.touchAction=o?"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 o of Fe.getRegisteredPlugins())o.onAttributeChanged?.(this,n,r,i)}}getAttr(n){return this.getAttribute(n)}setAttr(n,r){r!==null?this.setAttribute(n,r):this.removeAttribute(n)}getBoolAttr(n){return this.hasAttribute(n)&&this.getAttribute(n)!=="false"}setBoolAttr(n,r){r?this.setAttribute(n,""):this.removeAttribute(n)}getFloatAttr(n,r){let i=this.getAttribute(n);return i!==null?parseFloat(i):r}get src(){return this.getAttr("src")}set src(n){this.setAttr("src",n)}get cameraControls(){return this.getBoolAttr("camera-controls")}set cameraControls(n){this.setBoolAttr("camera-controls",n)}get cameraOrbit(){return this.getAttr("camera-orbit")}set cameraOrbit(n){this.setAttr("camera-orbit",n)}get cameraTarget(){return this.getAttr("camera-target")}set cameraTarget(n){this.setAttr("camera-target",n)}get minCameraOrbit(){return this.getAttr("min-camera-orbit")}set minCameraOrbit(n){this.setAttr("min-camera-orbit",n)}get maxCameraOrbit(){return this.getAttr("max-camera-orbit")}set maxCameraOrbit(n){this.setAttr("max-camera-orbit",n)}get fieldOfView(){return this.getAttr("field-of-view")}set fieldOfView(n){this.setAttr("field-of-view",n)}get iosSrc(){return this.getAttr("ios-src")}set iosSrc(n){this.setAttr("ios-src",n)}get scriptSrc(){return this.getAttr("script-src")}set scriptSrc(n){this.setAttr("script-src",n)}get sandbox(){return this.getAttribute("sandbox")||(pe().sandboxIframeSrc?"iframe":"worker")}set sandbox(n){this.setAttribute("sandbox",n)}get allowClientScripts(){return this.getBoolAttr("allow-client-scripts")||Ne.allowClientScripts}set allowClientScripts(n){this.setBoolAttr("allow-client-scripts",n)}get poster(){return this.getAttr("poster")}set poster(n){this.setAttr("poster",n)}get selectedMesh(){return this.getAttr("selected-mesh")}set selectedMesh(n){this.setAttr("selected-mesh",n)}get exposure(){return this.getFloatAttr("exposure",1)}set exposure(n){this.setAttribute("exposure",String(n))}get autoRotate(){return this.getBoolAttr("auto-rotate")}set autoRotate(n){this.setBoolAttr("auto-rotate",n)}get autoRotateDelay(){return this.getFloatAttr("auto-rotate-delay",3e3)}set autoRotateDelay(n){this.setAttribute("auto-rotate-delay",String(n))}get rotationPerSecond(){return this.getAttr("rotation-per-second")||"30deg"}set rotationPerSecond(n){this.setAttr("rotation-per-second",n)}get turntableRotation(){return this.viewer?this.viewer.turntableRotation:0}get ar(){return this.hasAttribute("ar")}set ar(n){this.setBoolAttr("ar",n)}get arScale(){return this.getAttribute("ar-scale")||"auto"}set arScale(n){this.setAttribute("ar-scale",n)}get arPlacement(){return this.getAttribute("ar-placement")||"floor"}set arPlacement(n){this.setAttribute("ar-placement",n)}get canActivateAR(){return Ne.isARSupported()}get shadowIntensity(){return this.getFloatAttr("shadow-intensity",0)}set shadowIntensity(n){this.setAttribute("shadow-intensity",String(n))}get shadowSoftness(){return this.getFloatAttr("shadow-softness",.5)}set shadowSoftness(n){this.setAttribute("shadow-softness",String(n))}get toneMapping(){return this.getAttribute("tone-mapping")||"neutral"}set toneMapping(n){this.setAttribute("tone-mapping",n)}get bloom(){return this.getFloatAttr("bloom",0)}set bloom(n){this.setAttribute("bloom",String(n))}get bloomThreshold(){return this.getFloatAttr("bloom-threshold",.8)}set bloomThreshold(n){this.setAttribute("bloom-threshold",String(n))}get bloomRadius(){return this.getFloatAttr("bloom-radius",.5)}set bloomRadius(n){this.setAttribute("bloom-radius",String(n))}get outlineSelected(){return this.getBoolAttr("outline-selected")}set outlineSelected(n){this.setBoolAttr("outline-selected",n)}get outlineColor(){return this.getAttr("outline-color")||"#38bdf8"}set outlineColor(n){this.setAttr("outline-color",n)}get environmentImage(){return this.getAttr("environment-image")}set environmentImage(n){this.setAttr("environment-image",n)}get skyboxImage(){return this.getAttr("skybox-image")}set skyboxImage(n){this.setAttr("skybox-image",n)}get autoplay(){return this.getBoolAttr("autoplay")}set autoplay(n){this.setBoolAttr("autoplay",n)}get animationName(){return this.getAttr("animation-name")}set animationName(n){this.setAttr("animation-name",n)}get availableAnimations(){return this.viewer?this.viewer.getAvailableAnimations():[]}get variantName(){return this.viewer?this.viewer.getVariantName():this.getAttr("variant-name")}set variantName(n){this.setAttr("variant-name",n)}get availableVariants(){return this.viewer?this.viewer.getAvailableVariants():[]}selectVariant(n){if(!this.viewer)return!1;let r=this.viewer.selectVariant(n);return r&&this.dispatchEvent(new CustomEvent("variant-applied",{bubbles:!0,composed:!0,detail:{variantName:this.viewer.getVariantName()}})),r}get model(){let n=this.viewer?this.viewer.getModelMaterials():[];return{materials:n,getMaterialByName(r){return n.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(n=0){this.viewer?.resetTurntableRotation(n)}setCamera(n,r,i,o){this.viewer&&this.viewer.setCamera(n,r,i,o)}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(n,r){return this.viewer&&this.viewer.render?.(),this.canvas?this.canvas.toDataURL(n,r):""}toBlob(n){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(o=>{o?r(o):i(new Error("Failed to capture canvas blob."))},n?.mimeType,n?.qualityArgument)})}positionAndNormalFromPoint(n,r){if(!this.viewer)return null;let i=this.viewer.raycastFromScreenPoint(n,r);if(!i)return null;let[o,s,c]=i.hitPoint||i.point,[a,u,l]=i.normal;return{position:{x:o,y:s,z:c,toString(){return`${o}m ${s}m ${c}m`}},normal:{x:a,y:u,z:l,toString(){return`${a}m ${u}m ${l}m`}}}}async loadModel(n){return this.loadModelWithLimits(n)}async loadModelWithLimits(n,r){if(!this.viewer){this.currentModel=n,this.currentModelLimits=r;return}try{let i;if(typeof n=="string"){this.isModelLoaded=!1,this.viewer?.clearScene?.();let a=await fetch(n);if(!a.ok)throw new Error(`Failed to load 3D model from "${n}": HTTP ${a.status}`);i=await a.arrayBuffer()}else i=n;let o=ot(i);this.viewer.loadGLBData(o,r),this.currentModel=o,this.currentModelLimits=r,this.isModelLoaded=!0,this.hidePoster(),this.updateHotspots();let s=this.getAttribute("selected-mesh");s&&this.viewer.setSelectedMesh(s);let c=this.getAttribute("variant-name");c&&this.selectVariant(c),this.dispatchEvent(new CustomEvent("load",{bubbles:!0,composed:!0,detail:{model:o}}))}catch(i){throw this.dispatchEvent(new CustomEvent("error",{bubbles:!0,composed:!0,detail:{error:i}})),i}}showToast(n,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=n,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(!Ne.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 n=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 Ne.arProvider.activateAR({model:n||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:o=>{this.activeXRSession=null,this.dispatchEvent(new CustomEvent("ar-status",{bubbles:!0,composed:!0,detail:{status:"failed",error:o}})),this.showToast(`AR error: ${o.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 o=typeof navigator<"u"&&navigator.userAgent||"",s=/Macintosh/i.test(o)&&!(typeof navigator<"u"&&navigator.maxTouchPoints>1),c=/Android|iPhone|iPad|iPod/i.test(o);if(s&&!c&&typeof document<"u"&&this.currentModel&&Ne.arProvider.createUSDZBlob)try{let a=this.currentModel instanceof Blob&&this.currentModel.type==="model/vnd.usdz+zip"?this.currentModel:Ne.arProvider.createUSDZBlob(this.currentModel),u=URL.createObjectURL(a),l=document.createElement("a");l.href=u,l.download="three_live_model.usdz",document.body.appendChild(l),l.click(),document.body.removeChild(l),setTimeout(()=>URL.revokeObjectURL(u),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 n=this.querySelector("canvas");n||(n=document.createElement("canvas"),n.style.width="100%",n.style.height="100%",n.style.display="block",n.style.touchAction=this.cameraControls?"none":"auto",n.style.outline="none",this.appendChild(n)),this.canvas=n;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 n=this.autoRotate,r=this.exposure,i=this.parseOrbitLimit(this.getAttribute("min-camera-orbit")),o=this.parseOrbitLimit(this.getAttribute("max-camera-orbit")),s=this.parseCameraTarget(this.getAttribute("camera-target")),c=this.parseFieldOfView(this.getAttribute("field-of-view"));this.viewer=new Fe(this,this.canvas,{autoRotate:n,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:c,cameraTarget:s,minCameraOrbit:i,maxCameraOrbit:o,onMeshClick:u=>{this.dispatchEvent(new CustomEvent("meshclick",{bubbles:!0,composed:!0,detail:u}))},onCameraChange:u=>{this.updateHotspots();for(let l of Fe.getRegisteredPlugins())l.onCameraChange?.(this.viewer,this);this.dispatchEvent(new CustomEvent("camera-change",{bubbles:!0,composed:!0,detail:u}))}}),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(n){if(!(typeof document>"u")){if(!n){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=n,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 n=document.createElement("button");n.setAttribute("type","button"),n.setAttribute("aria-label","View in Augmented Reality"),n.className="three-live-ar-button",n.setAttribute("part","default-ar-button");let r="http://www.w3.org/2000/svg";if(typeof document.createElementNS=="function"){let o=document.createElementNS(r,"svg");o.setAttribute("width","20"),o.setAttribute("height","20"),o.setAttribute("viewBox","0 0 24 24"),o.setAttribute("fill","none"),o.setAttribute("stroke","currentColor"),o.setAttribute("stroke-width","2"),o.setAttribute("stroke-linecap","round"),o.setAttribute("stroke-linejoin","round"),o.style.marginRight="6px";let s=document.createElementNS(r,"path");s.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 c=document.createElementNS(r,"polyline");c.setAttribute("points","3.27 6.96 12 12.01 20.73 6.96");let a=document.createElementNS(r,"line");a.setAttribute("x1","12"),a.setAttribute("y1","22.08"),a.setAttribute("x2","12"),a.setAttribute("y2","12"),o.appendChild(s),o.appendChild(c),o.appendChild(a),n.appendChild(o)}let i=document.createElement("span");i.textContent="View in AR",n.appendChild(i),n.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",n.addEventListener("mouseenter",()=>{n.style.backgroundColor="rgba(30, 41, 59, 0.95)",n.style.transform="scale(1.04)"}),n.addEventListener("mouseleave",()=>{n.style.backgroundColor="rgba(15, 23, 42, 0.85)",n.style.transform="scale(1)"}),n.addEventListener("click",o=>{o.stopPropagation(),this.activateAR()}),this.arButton=n,this.appendChild(n)}this.updateARButtonVisibility()}}updateARButtonVisibility(){let n=this.hasAttribute("ar")&&!!Ne.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=n?r.dataset.tlOrigDisplay||"":"none"):this.arButton&&(this.arButton.style.display=n?"flex":"none")}applyCameraOrbit(n){if(!(!n||!this.viewer))try{let r=JSON.parse(n);this.viewer.setInitialCamera(r.theta,r.phi,r.distance,r.zoom)}catch{let r=n.trim().split(/\s+/);if(r.length>=2){let i=a=>a.endsWith("rad")?parseFloat(a)*180/Math.PI:parseFloat(a.replace(/deg$/,"")),o=r[0]==="auto"?void 0:i(r[0]),s=r[1]==="auto"?void 0:i(r[1]),c;r.length>=3&&r[2]!=="auto"&&(c=parseFloat(r[2].replace(/m$/,""))),(o!==void 0&&!isNaN(o)||s!==void 0&&!isNaN(s))&&this.viewer.setInitialCamera(o!==void 0&&!isNaN(o)?o:void 0,s!==void 0&&!isNaN(s)?s:void 0,c!==void 0&&!isNaN(c)?c:void 0)}}}parseOrbitLimit(n){if(!n)return{};let r=n.trim().split(/\s+/),i={};if(r.length>0&&r[0]!=="auto"){let o=r[0].endsWith("rad")?parseFloat(r[0])*180/Math.PI:parseFloat(r[0].replace(/deg$/,""));isNaN(o)||(i.theta=o)}if(r.length>1&&r[1]!=="auto"){let o=r[1].endsWith("rad")?parseFloat(r[1])*180/Math.PI:parseFloat(r[1].replace(/deg$/,""));isNaN(o)||(i.phi=o)}if(r.length>2&&r[2]!=="auto"){let o=parseFloat(r[2].replace(/m$/,""));isNaN(o)||(i.distance=o)}return i}applyOrbitLimits(){if(!this.viewer)return;let n=this.parseOrbitLimit(this.getAttribute("min-camera-orbit")),r=this.parseOrbitLimit(this.getAttribute("max-camera-orbit"));this.viewer.setOrbitLimits({minTheta:n.theta,maxTheta:r.theta,minPhi:n.phi,maxPhi:r.phi,minDistance:n.distance,maxDistance:r.distance})}parseCameraTarget(n){if(!n)return;let r=n.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(n){if(!n)return;let r=n.endsWith("rad")?parseFloat(n)*180/Math.PI:parseFloat(n.replace(/deg$/,""));return isNaN(r)?void 0:r}parseRotationPerSecond(n){if(!n)return Math.PI/6;let r=n.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(n){let r=this.parseCameraTarget(n);this.viewer&&r&&this.viewer.setTarget(r[0],r[1],r[2])}applyFieldOfView(n){let r=this.parseFieldOfView(n);this.viewer&&r!==void 0&&this.viewer.setFieldOfView(r)}updateHotspot(n){let r=this.querySelector(`[slot="${n.name}"]`);r&&(n.position!==void 0&&r.setAttribute("data-position",n.position),n.normal!==void 0&&r.setAttribute("data-normal",n.normal)),this.updateHotspots()}updateHotspots(){for(let n of Fe.getRegisteredPlugins())if(n.updateHotspotsForElement){n.updateHotspotsForElement(this,this.viewer);return}}async loadModelFromSrc(n){await this.loadModel(n)}runWithScriptRunner(n){let r=Ne.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,o)=>{let s=!1;n(r,{onModelReady:a=>{this.loadModelWithLimits(a,Ji).then(()=>{s||(s=!0,i(a))},u=>{let l=u instanceof Error?u.message:String(u);this.showToast(l),s||(s=!0,o(u))})},onUpdateTransforms:a=>this.viewer?.updateMeshTransforms(a),onError:a=>{this.showToast(a.message),this.dispatchEvent(new CustomEvent("error",{bubbles:!0,composed:!0,detail:{error:a}})),s||(s=!0,o(a))},onToast:a=>this.showToast(a)}).then(a=>{a&&(this.scriptHandle=a)},a=>{a instanceof Error&&a.message&&this.showToast(a.message),s||(s=!0,o(a))})})}loadScriptFromSrc(n){return this.runWithScriptRunner((r,i)=>{if(typeof r.executeUrl!="function"){let o=new Error("Registered ScriptRunner does not support executeUrl() for server-generated scripts.");return i.onError?.(o),Promise.reject(o)}return r.executeUrl(n,this.sandbox,i)})}executeScript(n){if(!Ne.scriptRunner)return this.runWithScriptRunner(()=>Promise.resolve());if(!this.allowClientScripts){let r=new Error(yn);return this.showToast(gn),this.dispatchEvent(new CustomEvent("error",{bubbles:!0,composed:!0,detail:{error:r}})),Promise.reject(r)}return this.runWithScriptRunner((r,i)=>r.execute(n,this.sandbox,i,{allowClientScripts:!0}))}};Ne.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"],Ne.registerPlugin=Fe.registerPlugin,Ne.getRegisteredPlugins=Fe.getRegisteredPlugins;var Je=Ne;typeof customElements<"u"&&!customElements.get("three-live")&&customElements.define("three-live",Je);function or(t,e,n){return e%4===0?new Float32Array(t,e,n):new Float32Array(t.slice(e,e+n*4))}function ar(t,e,n,r){let i=e[0],o=e[1],s=e[2],c=e[3],a=n[0],u=n[1],l=n[2],m=n[3],f=i*a+o*u+s*l+c*m;if(f<0&&(a=-a,u=-u,l=-l,m=-m,f=-f),Math.abs(f)>=1)return t[0]=i,t[1]=o,t[2]=s,t[3]=c,t;let h=Math.acos(f),b=Math.sqrt(1-f*f);if(Math.abs(b)<.001)return t[0]=.5*(i+a),t[1]=.5*(o+u),t[2]=.5*(s+l),t[3]=.5*(c+m),t;let d=Math.sin((1-r)*h)/b,p=Math.sin(r*h)/b;return t[0]=i*d+a*p,t[1]=o*d+u*p,t[2]=s*d+l*p,t[3]=c*d+m*p,t}function _o(t,e,n,r){return t[0]=e[0]+r*(n[0]-e[0]),t[1]=e[1]+r*(n[1]-e[1]),t[2]=e[2]+r*(n[2]-e[2]),t}function qr(t,e){if(!Array.isArray(t?.animations))return[];let n=[];for(let r=0;r<t.animations.length;r++){let i=t.animations[r],o=i.name||`Animation_${r}`,s=[],c=0;if(Array.isArray(i.channels)&&Array.isArray(i.samplers))for(let a of i.channels){if(!a.target||a.target.node===void 0||!a.target.path)continue;let u=i.samplers[a.sampler];if(!u)continue;let l=t.accessors?.[u.input],m=t.accessors?.[u.output];if(!l||!m)continue;let f=t.bufferViews?.[l.bufferView],h=t.bufferViews?.[m.bufferView];if(!f||!h)continue;let b=(f.byteOffset||0)+(l.byteOffset||0),d=(h.byteOffset||0)+(m.byteOffset||0),p=or(e,b,l.count);p.length>0&&p[p.length-1]>c&&(c=p[p.length-1]);let E=a.target.path==="rotation"?4:a.target.path==="weights"?Math.max(1,Math.round(m.count/Math.max(1,l.count))):3,A=or(e,d,m.count*(a.target.path==="weights"?1:E)),x=u.interpolation==="STEP"?"STEP":"LINEAR";s.push({nodeIndex:a.target.node,path:a.target.path,times:p,values:A,interpolation:x})}s.length>0&&n.push({name:o,duration:c,channels:s})}return n}function Xt(t,e,n){let{times:r,values:i,path:o,interpolation:s}=t,c=r.length;if(c===0)return;let a=o==="rotation"?4:o==="weights"?Math.max(1,Math.round(i.length/c)):3;if(e<=r[0]){for(let A=0;A<a;A++)n[A]=i[A];return}if(e>=r[c-1]){let A=(c-1)*a;for(let x=0;x<a;x++)n[x]=i[A+x];return}let u=0,l=c-1;for(;u<=l;){let A=u+l>>1;r[A]<=e?u=A+1:l=A-1}let m=Math.max(0,l),f=Math.min(c-1,m+1);if(s==="STEP"||m===f){let A=m*a;for(let x=0;x<a;x++)n[x]=i[A+x];return}let h=r[m],b=r[f],d=(e-h)/Math.max(1e-5,b-h),p=m*a,E=f*a;if(o==="rotation"){let A=[i[p],i[p+1],i[p+2],i[p+3]],x=[i[E],i[E+1],i[E+2],i[E+3]];ar(n,A,x,d)}else for(let A=0;A<a;A++)n[A]=i[p+A]+d*(i[E+A]-i[p+A])}var sr=new WeakMap;function Yr(t,e,n=.3){if(!t?.animations)return;let r=t.animations.find(c=>c.name===e);if(!r)return;let i=sr.get(t);i||(i=[],t.currentClip&&i.push({clip:t.currentClip,time:t.animationTime||0,weight:1,fadeSpeed:0}),sr.set(t,i));let o=n>0?1/n:1e3;for(let c of i)c.clip.name!==e&&(c.fadeSpeed=-o);let s=i.find(c=>c.clip.name===e);s?s.fadeSpeed=o:i.push({clip:r,time:0,weight:n>0?0:1,fadeSpeed:o}),t.currentClip=r,t.isPlayingAnimation=!0}function $r(t,e){if(!t.gltf||!Array.isArray(t.gltf.nodes))return;let n=sr.get(t);if(!n||n.length===0){if(!t.currentClip)return;n=[{clip:t.currentClip,time:e,weight:1,fadeSpeed:0}]}let r=t.gltf.nodes.length,i=[];for(let m=0;m<r;m++){let f=t.initialNodeTransforms[m];f?i.push({t:[f.t[0],f.t[1],f.t[2]],r:[f.r[0],f.r[1],f.r[2],f.r[3]],s:[f.s[0],f.s[1],f.s[2]]}):i.push({t:[0,0,0],r:[0,0,0,1],s:[1,1,1]})}let o=[0,0,0],s=[0,0,0,1],c=[1,1,1],a=new Float32Array(64);for(let m of n){let f=Math.max(0,Math.min(1,m.weight));if(!(f<=1e-4))for(let h of m.clip.channels){if(h.nodeIndex<0||h.nodeIndex>=r)continue;let b=i[h.nodeIndex];if(h.path==="translation")Xt(h,m.time,o),_o(b.t,b.t,o,f);else if(h.path==="rotation")Xt(h,m.time,s),ar(b.r,b.r,s,f);else if(h.path==="scale")Xt(h,m.time,c),_o(b.s,b.s,c,f);else if(h.path==="weights"&&(Xt(h,m.time,a),t.meshes)){for(let d of t.meshes)if(d.nodeIndex===h.nodeIndex){for(let p of d.primitives)if(p.pluginData?.morph?.weights){let E=p.pluginData.morph.weights,A=p.pluginData.morph.numTargets||E.length;for(let x=0;x<A;x++)E[x]=E[x]*(1-f)+a[x]*f}}}}}let u=[];for(let m=0;m<r;m++){let f=we(),{t:h,r:b,s:d}=i[m];rt(f,b,h,d),u.push(f)}let l=it(t.gltf,u);t.worldMatrices=l;for(let m of t.meshes)m.nodeIndex>=0&&m.nodeIndex<l.length&&(m.transform.set(l[m.nodeIndex]),Le(m.normalMatrix,m.transform))}var jr={name:"keyframes",evaluateAnimation:$r,crossFadeTo:Yr,onParseGLB(t){!t.animations&&t.gltf?.animations&&(t.animations=qr(t.gltf,t.bin))},onUpdate(t,e){if(!t.isPlayingAnimation)return;let n=sr.get(t);if(n&&n.length>0){for(let r=n.length-1;r>=0;r--){let i=n[r];if(i.time+=e,i.clip.duration>0&&(i.time%=i.clip.duration),i.fadeSpeed!==0)if(i.weight+=i.fadeSpeed*e,i.weight<=0){n.splice(r,1);continue}else i.weight>=1&&(i.weight=1,i.fadeSpeed=0)}n.length>0&&(t.animationTime=n[n.length-1].time),$r(t,t.animationTime)}else t.currentClip&&(t.animationTime+=e,t.currentClip.duration>0&&(t.animationTime%=t.currentClip.duration),$r(t,t.animationTime))}};var mn=64;function Co(t,e,n){if(!(!t?.meshes||e<0||e>=mn))for(let r of t.meshes)for(let i of r.primitives){let o=i.pluginData?.morph;o?.weights&&(o.weights[e]=n)}}var Kr={name:"morph",onResolveShader(t,e,n,r){if(!Array.isArray(t?.targets)||t.targets.length===0)return null;let i=n.replace("uniform mat4 uMVP,uModel;",`uniform mat4 uMVP,uModel;
|
|
325
|
+
`+N.script+`
|
|
326
|
+
})();`);m=null;let M=g(h,I,_,v);M&&typeof M.toGLB=="function"&&(I=M)}if(!T){h.SceneQuotaValidator&&h.SceneQuotaValidator.validate(I);let g=I.toGLB(),M=g instanceof ArrayBuffer?g:g.buffer.slice(g.byteOffset,g.byteOffset+g.byteLength);S({type:"3D_MODEL_READY",glbBuffer:M},[M])}s({type:"DONE",nonce:r})}catch(I){c(I&&I.message||I)}}},s({type:"READY",nonce:r})}function ci(e,t,n){let r=n?.allowedScriptUrl??null,i=n?.allowClientScripts??r===null,o={nonce:t,engineSrc:e,allowedScriptUrl:r,allowClientScripts:i,revoked:Ca},a=(ge().workerExtensionInstallers??[]).map(u=>`(${u.toString()})`).join(",");return`'use strict';(${La.toString()})(${JSON.stringify(o)},[${a}]);`}function jo(e){e.onError?.(new Error("SecurityError: Sandboxed script exceeded SECURITY_3D_SANDBOX_TIMEOUT_MS (3000 ms) and was terminated.")),e.onToast?.("Security Error: script timed out and was stopped.")}var Mt=0;function Ko(){try{let e=new Uint32Array(4);return globalThis.crypto?.getRandomValues(e),Array.from(e,n=>n.toString(16).padStart(8,"0")).join("")}catch{return`${Date.now().toString(16)}-${Math.random().toString(16).slice(2)}`}}function Pa(e){try{return new TextEncoder().encode(e).length}catch{return e.length}}var Da=1024,Na=256;function Bo(e){if(!Array.isArray(e)&&!(e instanceof Float32Array)||e.length!==16)return!1;for(let t=0;t<16;t++){let n=e[t];if(typeof n!="number"||!Number.isFinite(n))return!1}return!0}function ui(e,t){if(!e||typeof e!="object")return null;let n=e;if(n.nonce!==t)return null;switch(n.type){case"READY":return{type:"READY"};case"DONE":return{type:"DONE"};case"ERROR":return{type:"ERROR",message:(typeof n.message=="string"?n.message:String(n.message??"Unknown worker error")).replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g,"").slice(0,Da)};case"3D_UPDATE_TRANSFORMS":{let i=n.transforms;if(Array.isArray(i)){if(i.length>1e3)return null;for(let o of i)if(!Bo(o))return null;return{type:"3D_UPDATE_TRANSFORMS",transforms:i}}if(i&&typeof i=="object"){let o=Object.keys(i);if(o.length>1e3)return null;let a=Object.create(null),u=i;for(let s of o){if(s.length>Na||s==="__proto__"||s==="constructor"||s==="prototype")return null;let c=u[s];if(!Bo(c))return null;a[s]=c}return{type:"3D_UPDATE_TRANSFORMS",transforms:a}}return null}case"3D_MODEL_READY":{let i=n.glbBuffer;return!(i instanceof ArrayBuffer)||i.byteLength>16777216?null:{type:"3D_MODEL_READY",payload:i}}default:return null}}function ka(e){let t=Pa(e);if(t>1048576)throw new Error(`SecurityError: Script length (${t} bytes) exceeds SECURITY_3D_MAX_SCRIPT_BYTES (1048576).`)}function Zo(e,t,n,r){switch(e.type){case"READY":return;case"3D_UPDATE_TRANSFORMS":t.onUpdateTransforms?.(e.transforms);return;case"3D_MODEL_READY":if(r.modelDispatched)return;r.modelDispatched=!0,t.onModelReady(e.payload);return;case"DONE":n();return;case"ERROR":n(),t.onError?.(new Error(`Worker script error: ${e.message}`));return;default:return e}}function Fa(e,t,n,r){let i=Ko(),o=ci(t,i,e.kind==="url"?{allowClientScripts:!1,allowedScriptUrl:e.scriptUrl}:{allowClientScripts:!0,allowedScriptUrl:null}),a=document.createElement("iframe");a.setAttribute("sandbox","allow-scripts"),a.setAttribute("aria-hidden","true"),a.tabIndex=-1,a.style.display="none",a.src=n,Mt++;let u=!1,s=!1,c={modelDispatched:!1},l,f=()=>{if(u||s)return;let d=a.contentWindow;!d||typeof d.postMessage!="function"||(s=!0,d.postMessage(e.kind==="url"?{type:"SANDBOX_RUN",nonce:i,workerSource:o,scriptUrl:e.scriptUrl}:{type:"SANDBOX_RUN",nonce:i,workerSource:o,script:e.script},"*"))},m=()=>{},h=d=>{if(u||!a.contentWindow||d.source!==a.contentWindow)return;let y=d.data;if(y&&typeof y=="object"&&y.type==="IFRAME_READY"){f();return}let T=ui(y,i);T&&Zo(T,r,m,c)};m=()=>{u||(u=!0,l!==void 0&&clearTimeout(l),Mt=Math.max(0,Mt-1),typeof globalThis.removeEventListener=="function"&&globalThis.removeEventListener("message",h),typeof a.remove=="function"?a.remove():a.parentNode&&a.parentNode.removeChild(a))},l=setTimeout(()=>{u||(m(),jo(r))},3e3),typeof globalThis.addEventListener=="function"&&globalThis.addEventListener("message",h),a.onload=()=>{f()},a.onerror=()=>{m(),r.onError?.(new Error(`Sandbox iframe failed to load "${n}". Verify that three-live-sandbox.html is served at that URL.`))};let p=document.body||document.documentElement;if(!p||typeof p.appendChild!="function"){m();let d=new Error("SecurityError: Cannot mount sandbox iframe because document.body is unavailable.");throw r.onError?.(d),d}return p.appendChild(a),{terminate:m}}function zo(e,t,n,r){if(t==="worker"&&typeof Worker>"u")return r("Sandboxed procedural execution requires Web Workers, but Workers are unavailable in this environment. For host security, Three-Live prohibits unsandboxed in-process evaluation.","Security Error: Web Workers unavailable. Script execution aborted.");if(t==="iframe"&&(typeof document>"u"||typeof document.createElement!="function"))return r("Sandboxed iframe execution requires a DOM environment with document.createElement. Refusing to evaluate in the host realm.","Security Error: DOM unavailable for iframe sandbox.");if(Mt>=32)return r(`SecurityError: ${Mt} sandbox workers are already running, which meets SECURITY_3D_MAX_CONCURRENT_TASKS (32). Refusing to start another.`,"Security Error: too many concurrent sandboxed scripts.");let i;try{i=Sa()}catch(m){let h=m instanceof Error?m.message:String(m);return r(h,"Security Error: sandbox engine URL is not configured.")}if(t==="iframe"){let m;try{m=Ra()}catch(h){let p=h instanceof Error?h.message:String(h);return r(p,"Security Error: sandbox iframe URL is not configured.")}try{return Promise.resolve(Fa(e,i,m,n))}catch(h){return Promise.reject(h)}}let o=Ko(),a=ci(i,o,e.kind==="url"?{allowClientScripts:!1,allowedScriptUrl:e.scriptUrl}:{allowClientScripts:!0,allowedScriptUrl:null}),u;try{let m=new Blob([a],{type:"application/javascript"}),h=URL.createObjectURL(m);try{let p=$o(h);u=new Worker(p)}finally{URL.revokeObjectURL(h)}}catch(m){let h=m instanceof Error?m.message:String(m);return r(`Failed to initialize Web Worker for sandboxed execution (CSP may block blob workers): ${h}`,"Security Error: Failed to start Worker sandbox.")}Mt++;let s=!1,c={modelDispatched:!1},l,f=()=>{s||(s=!0,l!==void 0&&clearTimeout(l),Mt=Math.max(0,Mt-1),u.terminate())};return l=setTimeout(()=>{s||(f(),jo(n))},3e3),u.onmessage=m=>{let h=ui(m.data,o);h&&Zo(h,n,f,c)},u.onerror=m=>{f(),n.onError?.(new Error(`Worker execution error: ${m.message}`))},e.kind==="url"?u.postMessage({type:"EXECUTE_URL",scriptUrl:e.scriptUrl,nonce:o}):u.postMessage({type:"EXECUTE",script:e.script,nonce:o}),Promise.resolve({terminate:f})}function Go(e,t){return e==="none"||e==="unsafe-host-realm"?t(`SecurityError: sandbox="${e}" is prohibited. Sandboxing is mandatory for live compilation and cannot be bypassed. Use sandbox="worker" (default) or sandbox="iframe".`,`Security Error: sandbox="${e}" is not permitted.`):e!=="worker"&&e!=="iframe"?t(`SecurityError: Unsupported sandbox mode "${e}". Live compilation requires sandbox="worker" or sandbox="iframe".`,"Security Error: unsupported sandbox mode."):null}var Qt={execute(e,t,n,r){let i=(u,s)=>{let c=new Error(u);return n.onError?.(c),s&&n.onToast?.(s),Promise.reject(c)},o=Go(t,i);if(o)return o;try{ka(e)}catch(u){let s=u instanceof Error?u.message:String(u);return i(s,"Security Error: script exceeds the size limit.")}return r?.allowClientScripts??Yo()?zo({kind:"script",script:e},t,n,i):i(Ln,Pn)},executeUrl(e,t,n){let r=(a,u)=>{let s=new Error(a);return n.onError?.(s),u&&n.onToast?.(u),Promise.reject(s)},i=Go(t,r);if(i)return i;let o;try{o=Ia(e)}catch(a){let u=a instanceof Error?a.message:String(a);return r(u,"Security Error: disallowed scene script URL.")}return zo({kind:"url",scriptUrl:o},t,n,r)}},fr=new Set;function Ke(e,t){let n=`[three-live] ${e} is unsupported; degraded to ${t}.`;fr.has(n)||(fr.add(n),typeof console<"u"&&typeof console.warn=="function"&&console.warn(n))}function Qo(){return Array.from(fr)}function Jo(){fr.clear()}var An=class extends Ct{constructor(t={}){Ke("ShaderMaterial","MeshStandardMaterial");let n=t.uniforms||{},r=n.color?.value??n.uColor?.value??n.diffuse?.value??t.color;super({color:r!==void 0?r:8421504,opacity:n.opacity?.value??t.opacity??1,transparent:!!t.transparent,wireframe:!!t.wireframe,side:t.side}),this.uniforms=n}},es=An,Dt=class extends dn{constructor(t=1,n=0,r="PolyhedronGeometry"){Ke(r,"SphereGeometry");let i=Math.max(4,Math.min(32,4<<Math.min(n,3)));super(t,i,i)}},hr=class extends Dt{constructor(t=1,n=0){super(t,n,"IcosahedronGeometry")}},dr=class extends Dt{constructor(t=1,n=0){super(t,n,"OctahedronGeometry")}},pr=class extends Dt{constructor(t=1,n=0){super(t,n,"DodecahedronGeometry")}},br=class extends Dt{constructor(t=1,n=0){super(t,n,"TetrahedronGeometry")}},yr=class extends St{constructor(t=1,n=1,r=4,i=8){Ke("CapsuleGeometry","CylinderGeometry"),super(t,t,n+t*2,i)}},gr=class extends St{constructor(t=.5,n=1,r=16){Ke("RingGeometry","CylinderGeometry"),super(n,n,.01,Math.max(8,r))}},xr=class extends St{constructor(t=1,n=16){Ke("CircleGeometry","CylinderGeometry"),super(t,t,.01,Math.max(8,n))}},vr=class extends xn{constructor(n,r,i=0,o=Math.PI/3,a=0,u=2){Ke("SpotLight","PointLight");super(n,r,i,u);this.target=new et;this.angle=Math.PI/3;this.penumbra=0;this.angle=o,this.penumbra=a}},wn=class extends gn{constructor(t,n,r){Ke("HemisphereLight","AmbientLight"),super(t,r),this.groundColor=new Je(n??4473924)}},ts=wn,ns={Vector2:$n,Vector3:ke,Vector4:qn,Euler:mn,Quaternion:fn,Matrix4:It,Matrix3:Yn,Color:Je,MathUtils:Ho,BufferAttribute:we,Float32BufferAttribute:jn,Uint16BufferAttribute:Kn,Uint32BufferAttribute:Zn,BufferGeometry:je,BoxGeometry:hn,PlaneGeometry:Qn,SphereGeometry:dn,CylinderGeometry:St,ConeGeometry:Jn,TorusGeometry:er,TorusKnotGeometry:tr,IcosahedronGeometry:hr,OctahedronGeometry:dr,DodecahedronGeometry:pr,TetrahedronGeometry:br,CapsuleGeometry:yr,RingGeometry:gr,CircleGeometry:xr,Texture:pn,TextureLoader:nr,Material:st,MeshStandardMaterial:Ct,MeshBasicMaterial:rr,MeshLambertMaterial:ir,MeshPhongMaterial:or,MeshPhysicalMaterial:sr,ShaderMaterial:An,RawShaderMaterial:es,Object3D:et,Group:ar,Mesh:Lt,InstancedMesh:yn,Light:Pt,AmbientLight:gn,DirectionalLight:cr,PointLight:xn,SpotLight:vr,HemisphereLight:wn,RectAreaLight:ts,Camera:vn,PerspectiveCamera:ur,Scene:Tn,WebGLRenderer:lr,Clock:mr,SceneQuotaValidator:ot,exportSceneToCanvas3D:oi,exportSceneToGLB:si,exportSceneToUSDZ:Wo,generateUSDZ:an,glbToUSDZ:sn,sceneToCanvas3D:qt,sceneToGLB:on,sceneToUSDZ:Yt,authorScriptRunner:Qt,getAuthorWarnings:Qo,clearAuthorWarnings:Jo};Object.freeze(ot);Object.freeze(ot.prototype);Object.freeze(Tn.prototype);Object.freeze(ns);var Nt=new Proxy(ns,{get:(e,t)=>{if(t in e)return e[t];let n=ge().authorNamespace;return n&&typeof t=="string"&&t in n?n[t]:(typeof t=="string"&&t!=="then"&&t!=="toJSON"&&!t.startsWith("__")&&Ke(`THREE.${t}`,"no-op proxy"),un)},has:(e,t)=>{if(t in e)return!0;let n=ge().authorNamespace;return!!(n&&typeof t=="string"&&t in n)},set:(e,t)=>{throw new TypeError(`Cannot assign to read only property '${String(t)}' of #<THREE>`)},defineProperty:(e,t)=>{throw new TypeError(`Cannot define property '${String(t)}', object is not extensible`)},deleteProperty:(e,t)=>{throw new TypeError(`Cannot delete property '${String(t)}' of #<THREE>`)},setPrototypeOf:()=>{throw new TypeError("#<THREE> is not extensible")}}),Wn=ge();Wn.threeNamespace=Nt;if(Wn.workerExtensionInstallers)for(let e of Wn.workerExtensionInstallers)e(Nt,Wn);var ln={name:"three_author",THREE:Nt},Ua=ln,Kt=typeof globalThis<"u"?globalThis:typeof window<"u"?window:void 0;typeof Kt.THREE>"u"&&(Kt.THREE=Nt);typeof Kt.requestAnimationFrame!="function"&&(Kt.requestAnimationFrame=()=>(Ke("requestAnimationFrame","single-frame static evaluation"),0));typeof Kt.cancelAnimationFrame!="function"&&(Kt.cancelAnimationFrame=()=>{});if(typeof window<"u"){let e=window;e.ThreeLive=e.ThreeLive||{},e.ThreeLive.THREE=Nt,e.ThreeLivePlugins=e.ThreeLivePlugins||{},e.ThreeLivePlugins.threeAuthor=ln,e.ThreeLivePlugins.three_author=ln,e.ThreeLivePlugins["three-author"]=ln}function Jt(e,t){let n=e?.trim(),r=n?Number(n):NaN;return Number.isFinite(r)?r:t}var Oa=typeof HTMLElement<"u"?HTMLElement:class{};typeof CustomEvent>"u"&&typeof Event<"u"&&(globalThis.CustomEvent=class extends Event{constructor(e,t){super(e,t),this.detail=t?.detail??null}});var Be=class Be extends Oa{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 ge().arProvider}static set arProvider(n){ge().arProvider=n}static get scriptRunner(){return ge().scriptRunner}static set scriptRunner(n){ge().scriptRunner=n}static get sandboxEngineSrc(){return ge().sandboxEngineSrc??null}static set sandboxEngineSrc(n){ge().sandboxEngineSrc=n}static get sandboxIframeSrc(){return ge().sandboxIframeSrc??null}static set sandboxIframeSrc(n){ge().sandboxIframeSrc=n}static get allowClientScripts(){return!!ge().allowClientScripts}static set allowClientScripts(n){ge().allowClientScripts=n}static registerScriptRunner(n){Be.scriptRunner=n}static registerDecoder(n,r){He.registerDecoder(n,r)}static getDecoder(n){return He.getDecoder(n)}static registerAR(n){typeof n=="function"?Be.arProvider={activateAR:n}:Be.arProvider=n,typeof document<"u"&&document.querySelectorAll("three-live").forEach(i=>{i instanceof Be&&i.updateARButtonVisibility()})}static isARSupported(){return!!Be.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 n=this.getAttribute("src"),r=this.getAttribute("script-src");if(n)this.loadModel(n).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 He.getRegisteredPlugins())i.onElementConnected?.(this)}disconnectedCallback(){for(let n of He.getRegisteredPlugins())n.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(n,r,i){if(r!==i){switch(n){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 o=parseFloat(i);isNaN(o)||this.viewer.setExposure(o)}break;case"shadow-intensity":case"shadow-softness":this.viewer&&this.viewer.setShadow(this.shadowIntensity,this.shadowSoftness);break;case"tone-mapping":this.viewer?.setToneMapping(_t(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 o=this.cameraControls;this.viewer&&this.viewer.setInteractive?.(o),this.canvas&&(this.canvas.style.touchAction=o?"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 o of He.getRegisteredPlugins())o.onAttributeChanged?.(this,n,r,i)}}getAttr(n){return this.getAttribute(n)}setAttr(n,r){r!==null?this.setAttribute(n,r):this.removeAttribute(n)}getBoolAttr(n){return this.hasAttribute(n)&&this.getAttribute(n)!=="false"}setBoolAttr(n,r){r?this.setAttribute(n,""):this.removeAttribute(n)}getFloatAttr(n,r){let i=this.getAttribute(n);return i!==null?parseFloat(i):r}get src(){return this.getAttr("src")}set src(n){this.setAttr("src",n)}get cameraControls(){return this.getBoolAttr("camera-controls")}set cameraControls(n){this.setBoolAttr("camera-controls",n)}get cameraOrbit(){return this.getAttr("camera-orbit")}set cameraOrbit(n){this.setAttr("camera-orbit",n)}get cameraTarget(){return this.getAttr("camera-target")}set cameraTarget(n){this.setAttr("camera-target",n)}get minCameraOrbit(){return this.getAttr("min-camera-orbit")}set minCameraOrbit(n){this.setAttr("min-camera-orbit",n)}get maxCameraOrbit(){return this.getAttr("max-camera-orbit")}set maxCameraOrbit(n){this.setAttr("max-camera-orbit",n)}get fieldOfView(){return this.getAttr("field-of-view")}set fieldOfView(n){this.setAttr("field-of-view",n)}get iosSrc(){return this.getAttr("ios-src")}set iosSrc(n){this.setAttr("ios-src",n)}get scriptSrc(){return this.getAttr("script-src")}set scriptSrc(n){this.setAttr("script-src",n)}get sandbox(){return this.getAttribute("sandbox")||(ge().sandboxIframeSrc?"iframe":"worker")}set sandbox(n){this.setAttribute("sandbox",n)}get allowClientScripts(){return this.getBoolAttr("allow-client-scripts")||Be.allowClientScripts}set allowClientScripts(n){this.setBoolAttr("allow-client-scripts",n)}get poster(){return this.getAttr("poster")}set poster(n){this.setAttr("poster",n)}get selectedMesh(){return this.getAttr("selected-mesh")}set selectedMesh(n){this.setAttr("selected-mesh",n)}get exposure(){return this.getFloatAttr("exposure",1)}set exposure(n){this.setAttribute("exposure",String(n))}get autoRotate(){return this.getBoolAttr("auto-rotate")}set autoRotate(n){this.setBoolAttr("auto-rotate",n)}get autoRotateDelay(){return this.getFloatAttr("auto-rotate-delay",3e3)}set autoRotateDelay(n){this.setAttribute("auto-rotate-delay",String(n))}get rotationPerSecond(){return this.getAttr("rotation-per-second")||"30deg"}set rotationPerSecond(n){this.setAttr("rotation-per-second",n)}get turntableRotation(){return this.viewer?this.viewer.turntableRotation:0}get ar(){return this.hasAttribute("ar")}set ar(n){this.setBoolAttr("ar",n)}get arScale(){return this.getAttribute("ar-scale")||"auto"}set arScale(n){this.setAttribute("ar-scale",n)}get arPlacement(){return this.getAttribute("ar-placement")||"floor"}set arPlacement(n){this.setAttribute("ar-placement",n)}get canActivateAR(){return Be.isARSupported()}get shadowIntensity(){return this.getFloatAttr("shadow-intensity",0)}set shadowIntensity(n){this.setAttribute("shadow-intensity",String(n))}get shadowSoftness(){return this.getFloatAttr("shadow-softness",.5)}set shadowSoftness(n){this.setAttribute("shadow-softness",String(n))}get toneMapping(){return _t(this.getAttribute("tone-mapping"))}set toneMapping(n){this.setAttribute("tone-mapping",n)}get bloom(){return this.getFloatAttr("bloom",0)}set bloom(n){this.setAttribute("bloom",String(n))}get bloomThreshold(){return Jt(this.getAttribute("bloom-threshold"),.62)}set bloomThreshold(n){this.setAttribute("bloom-threshold",String(n))}get bloomRadius(){return Jt(this.getAttribute("bloom-radius"),.75)}set bloomRadius(n){this.setAttribute("bloom-radius",String(n))}get outlineSelected(){return this.getBoolAttr("outline-selected")}set outlineSelected(n){this.setBoolAttr("outline-selected",n)}get outlineColor(){return this.getAttr("outline-color")||"#38bdf8"}set outlineColor(n){this.setAttr("outline-color",n)}get environmentImage(){return this.getAttr("environment-image")}set environmentImage(n){this.setAttr("environment-image",n)}get skyboxImage(){return this.getAttr("skybox-image")}set skyboxImage(n){this.setAttr("skybox-image",n)}get autoplay(){return this.getBoolAttr("autoplay")}set autoplay(n){this.setBoolAttr("autoplay",n)}get animationName(){return this.getAttr("animation-name")}set animationName(n){this.setAttr("animation-name",n)}get availableAnimations(){return this.viewer?this.viewer.getAvailableAnimations():[]}get variantName(){return this.viewer?this.viewer.getVariantName():this.getAttr("variant-name")}set variantName(n){this.setAttr("variant-name",n)}get availableVariants(){return this.viewer?this.viewer.getAvailableVariants():[]}selectVariant(n){if(!this.viewer)return!1;let r=this.viewer.selectVariant(n);return r&&this.dispatchEvent(new CustomEvent("variant-applied",{bubbles:!0,composed:!0,detail:{variantName:this.viewer.getVariantName()}})),r}get model(){let n=this.viewer?this.viewer.getModelMaterials():[];return{materials:n,getMaterialByName(r){return n.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(n=0){this.viewer?.resetTurntableRotation(n)}setCamera(n,r,i,o){this.viewer&&this.viewer.setCamera(n,r,i,o)}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(n,r){return this.viewer&&this.viewer.render?.(),this.canvas?this.canvas.toDataURL(n,r):""}toBlob(n){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(o=>{o?r(o):i(new Error("Failed to capture canvas blob."))},n?.mimeType,n?.qualityArgument)})}positionAndNormalFromPoint(n,r){if(!this.viewer)return null;let i=this.viewer.raycastFromScreenPoint(n,r);if(!i)return null;let[o,a,u]=i.hitPoint||i.point,[s,c,l]=i.normal;return{position:{x:o,y:a,z:u,toString(){return`${o}m ${a}m ${u}m`}},normal:{x:s,y:c,z:l,toString(){return`${s}m ${c}m ${l}m`}}}}async loadModel(n){return this.loadModelWithLimits(n)}async loadModelWithLimits(n,r){if(!this.viewer){this.currentModel=n,this.currentModelLimits=r;return}try{let i;if(typeof n=="string"){this.isModelLoaded=!1,this.viewer?.clearScene?.();let s=await fetch(n);if(!s.ok)throw new Error(`Failed to load 3D model from "${n}": HTTP ${s.status}`);i=await s.arrayBuffer()}else i=n;let o=ht(i);this.viewer.loadGLBData(o,r),this.currentModel=o,this.currentModelLimits=r,this.isModelLoaded=!0,this.hidePoster(),this.updateHotspots();let a=this.getAttribute("selected-mesh");a&&this.viewer.setSelectedMesh(a);let u=this.getAttribute("variant-name");u&&this.selectVariant(u),this.dispatchEvent(new CustomEvent("load",{bubbles:!0,composed:!0,detail:{model:o}}))}catch(i){throw this.dispatchEvent(new CustomEvent("error",{bubbles:!0,composed:!0,detail:{error:i}})),i}}showToast(n,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=n,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(!Be.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 n=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 Be.arProvider.activateAR({model:n||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:o=>{this.activeXRSession=null,this.dispatchEvent(new CustomEvent("ar-status",{bubbles:!0,composed:!0,detail:{status:"failed",error:o}})),this.showToast(`AR error: ${o.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 o=typeof navigator<"u"&&navigator.userAgent||"",a=/Macintosh/i.test(o)&&!(typeof navigator<"u"&&navigator.maxTouchPoints>1),u=/Android|iPhone|iPad|iPod/i.test(o);if(a&&!u&&typeof document<"u"&&this.currentModel&&Be.arProvider.createUSDZBlob)try{let s=this.currentModel instanceof Blob&&this.currentModel.type==="model/vnd.usdz+zip"?this.currentModel:Be.arProvider.createUSDZBlob(this.currentModel),c=URL.createObjectURL(s),l=document.createElement("a");l.href=c,l.download="three_live_model.usdz",document.body.appendChild(l),l.click(),document.body.removeChild(l),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 n=this.querySelector("canvas");n||(n=document.createElement("canvas"),n.style.width="100%",n.style.height="100%",n.style.display="block",n.style.touchAction=this.cameraControls?"none":"auto",n.style.outline="none",this.appendChild(n)),this.canvas=n;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 n=this.autoRotate,r=this.exposure,i=this.parseOrbitLimit(this.getAttribute("min-camera-orbit")),o=this.parseOrbitLimit(this.getAttribute("max-camera-orbit")),a=this.parseCameraTarget(this.getAttribute("camera-target")),u=this.parseFieldOfView(this.getAttribute("field-of-view"));this.viewer=new He(this,this.canvas,{autoRotate:n,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:u,cameraTarget:a,minCameraOrbit:i,maxCameraOrbit:o,onMeshClick:c=>{this.dispatchEvent(new CustomEvent("meshclick",{bubbles:!0,composed:!0,detail:c}))},onCameraChange:c=>{this.updateHotspots();for(let l of He.getRegisteredPlugins())l.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 s=this.getAttribute("camera-orbit");s&&this.applyCameraOrbit(s),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(n){if(!(typeof document>"u")){if(!n){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=n,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 n=document.createElement("button");n.setAttribute("type","button"),n.setAttribute("aria-label","View in Augmented Reality"),n.className="three-live-ar-button",n.setAttribute("part","default-ar-button");let r="http://www.w3.org/2000/svg";if(typeof document.createElementNS=="function"){let o=document.createElementNS(r,"svg");o.setAttribute("width","20"),o.setAttribute("height","20"),o.setAttribute("viewBox","0 0 24 24"),o.setAttribute("fill","none"),o.setAttribute("stroke","currentColor"),o.setAttribute("stroke-width","2"),o.setAttribute("stroke-linecap","round"),o.setAttribute("stroke-linejoin","round"),o.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 u=document.createElementNS(r,"polyline");u.setAttribute("points","3.27 6.96 12 12.01 20.73 6.96");let s=document.createElementNS(r,"line");s.setAttribute("x1","12"),s.setAttribute("y1","22.08"),s.setAttribute("x2","12"),s.setAttribute("y2","12"),o.appendChild(a),o.appendChild(u),o.appendChild(s),n.appendChild(o)}let i=document.createElement("span");i.textContent="View in AR",n.appendChild(i),n.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",n.addEventListener("mouseenter",()=>{n.style.backgroundColor="rgba(30, 41, 59, 0.95)",n.style.transform="scale(1.04)"}),n.addEventListener("mouseleave",()=>{n.style.backgroundColor="rgba(15, 23, 42, 0.85)",n.style.transform="scale(1)"}),n.addEventListener("click",o=>{o.stopPropagation(),this.activateAR()}),this.arButton=n,this.appendChild(n)}this.updateARButtonVisibility()}}updateARButtonVisibility(){let n=this.hasAttribute("ar")&&!!Be.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=n?r.dataset.tlOrigDisplay||"":"none"):this.arButton&&(this.arButton.style.display=n?"flex":"none")}applyCameraOrbit(n){if(!(!n||!this.viewer))try{let r=JSON.parse(n);this.viewer.setInitialCamera(r.theta,r.phi,r.distance,r.zoom)}catch{let r=this.parseOrbitLimit(n);(r.theta!==void 0||r.phi!==void 0)&&this.viewer.setInitialCamera(r.theta,r.phi,r.distance)}}parseOrbitLimit(n){if(!n)return{};let r=n.trim().split(/\s+/),i={};if(r.length>0&&r[0]!=="auto"){let o=this.parseFieldOfView(r[0]);o!==void 0&&(i.theta=o)}if(r.length>1&&r[1]!=="auto"){let o=this.parseFieldOfView(r[1]);o!==void 0&&(i.phi=o)}if(r.length>2&&r[2]!=="auto"){let o=parseFloat(r[2].replace(/m$/,""));isNaN(o)||(i.distance=o)}return i}applyOrbitLimits(){if(!this.viewer)return;let n=this.parseOrbitLimit(this.getAttribute("min-camera-orbit")),r=this.parseOrbitLimit(this.getAttribute("max-camera-orbit"));this.viewer.setOrbitLimits({minTheta:n.theta,maxTheta:r.theta,minPhi:n.phi,maxPhi:r.phi,minDistance:n.distance,maxDistance:r.distance})}parseCameraTarget(n){if(!n)return;let r=n.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(n){if(!n)return;let r=n.endsWith("rad")?parseFloat(n)*180/Math.PI:parseFloat(n.replace(/deg$/,""));return isNaN(r)?void 0:r}parseRotationPerSecond(n){if(!n)return Math.PI/6;let r=n.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(n){let r=this.parseCameraTarget(n);this.viewer&&r&&this.viewer.setTarget(r[0],r[1],r[2])}applyFieldOfView(n){let r=this.parseFieldOfView(n);this.viewer&&r!==void 0&&this.viewer.setFieldOfView(r)}updateHotspot(n){let r=this.querySelector(`[slot="${n.name}"]`);r&&(n.position!==void 0&&r.setAttribute("data-position",n.position),n.normal!==void 0&&r.setAttribute("data-normal",n.normal)),this.updateHotspots()}updateHotspots(){for(let n of He.getRegisteredPlugins())if(n.updateHotspotsForElement){n.updateHotspotsForElement(this,this.viewer);return}}runWithScriptRunner(n){let r=Be.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,o)=>{let a=!1;n(r,{onModelReady:s=>{this.loadModelWithLimits(s,Ro).then(()=>{a||(a=!0,i(s))},c=>{let l=c instanceof Error?c.message:String(c);this.showToast(l),a||(a=!0,o(c))})},onUpdateTransforms:s=>this.viewer?.updateMeshTransforms(s),onError:s=>{this.showToast(s.message),this.dispatchEvent(new CustomEvent("error",{bubbles:!0,composed:!0,detail:{error:s}})),a||(a=!0,o(s))},onToast:s=>this.showToast(s)}).then(s=>{s&&(this.scriptHandle=s)},s=>{s instanceof Error&&s.message&&this.showToast(s.message),a||(a=!0,o(s))})})}loadScriptFromSrc(n){return this.runWithScriptRunner((r,i)=>{if(typeof r.executeUrl!="function"){let o=new Error("Registered ScriptRunner does not support executeUrl() for server-generated scripts.");return i.onError?.(o),Promise.reject(o)}return r.executeUrl(n,this.sandbox,i)})}executeScript(n){if(!Be.scriptRunner)return this.runWithScriptRunner(()=>Promise.resolve());if(!this.allowClientScripts){let r=new Error(Ln);return this.showToast(Pn),this.dispatchEvent(new CustomEvent("error",{bubbles:!0,composed:!0,detail:{error:r}})),Promise.reject(r)}return this.runWithScriptRunner((r,i)=>r.execute(n,this.sandbox,i,{allowClientScripts:!0}))}};Be.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"],Be.registerPlugin=He.registerPlugin,Be.getRegisteredPlugins=He.getRegisteredPlugins;var at=Be;typeof customElements<"u"&&!customElements.get("three-live")&&customElements.define("three-live",at);function rs(e,t,n){return t%4===0?new Float32Array(e,t,n):new Float32Array(e.slice(t,t+n*4))}function Ar(e,t,n,r){let i=t[0],o=t[1],a=t[2],u=t[3],s=n[0],c=n[1],l=n[2],f=n[3],m=i*s+o*c+a*l+u*f;if(m<0&&(s=-s,c=-c,l=-l,f=-f,m=-m),Math.abs(m)>=1)return e[0]=i,e[1]=o,e[2]=a,e[3]=u,e;let h=Math.acos(m),p=Math.sqrt(1-m*m);if(Math.abs(p)<.001)return e[0]=.5*(i+s),e[1]=.5*(o+c),e[2]=.5*(a+l),e[3]=.5*(u+f),e;let d=Math.sin((1-r)*h)/p,y=Math.sin(r*h)/p;return e[0]=i*d+s*y,e[1]=o*d+c*y,e[2]=a*d+l*y,e[3]=u*d+f*y,e}function is(e,t,n,r){return e[0]=t[0]+r*(n[0]-t[0]),e[1]=t[1]+r*(n[1]-t[1]),e[2]=t[2]+r*(n[2]-t[2]),e}function hi(e,t){if(!Array.isArray(e?.animations))return[];let n=[];for(let r=0;r<e.animations.length;r++){let i=e.animations[r],o=i.name||`Animation_${r}`,a=[],u=0;if(Array.isArray(i.channels)&&Array.isArray(i.samplers))for(let s of i.channels){if(!s.target||s.target.node===void 0||!s.target.path)continue;let c=i.samplers[s.sampler];if(!c)continue;let l=e.accessors?.[c.input],f=e.accessors?.[c.output];if(!l||!f)continue;let m=e.bufferViews?.[l.bufferView],h=e.bufferViews?.[f.bufferView];if(!m||!h)continue;let p=(m.byteOffset||0)+(l.byteOffset||0),d=(h.byteOffset||0)+(f.byteOffset||0),y=it(e,t,l,1)??rs(t,p,l.count);y.length>0&&y[y.length-1]>u&&(u=y[y.length-1]);let T=s.target.path==="rotation"?4:s.target.path==="weights"?Math.max(1,Math.round(f.count/Math.max(1,l.count))):3,S=s.target.path==="weights"?1:T,b=it(e,t,f,S)??rs(t,d,f.count*S),A=c.interpolation==="STEP"?"STEP":"LINEAR";a.push({nodeIndex:s.target.node,path:s.target.path,times:y,values:b,interpolation:A})}a.length>0&&n.push({name:o,duration:u,channels:a})}return n}function en(e,t,n){let{times:r,values:i,path:o,interpolation:a}=e,u=r.length;if(u===0)return;let s=o==="rotation"?4:o==="weights"?Math.max(1,Math.round(i.length/u)):3;if(t<=r[0]){for(let S=0;S<s;S++)n[S]=i[S];return}if(t>=r[u-1]){let S=(u-1)*s;for(let b=0;b<s;b++)n[b]=i[S+b];return}let c=0,l=u-1;for(;c<=l;){let S=c+l>>1;r[S]<=t?c=S+1:l=S-1}let f=Math.max(0,l),m=Math.min(u-1,f+1);if(a==="STEP"||f===m){let S=f*s;for(let b=0;b<s;b++)n[b]=i[S+b];return}let h=r[f],p=r[m],d=(t-h)/Math.max(1e-5,p-h),y=f*s,T=m*s;if(o==="rotation"){let S=[i[y],i[y+1],i[y+2],i[y+3]],b=[i[T],i[T+1],i[T+2],i[T+3]];Ar(n,S,b,d)}else for(let S=0;S<s;S++)n[S]=i[y+S]+d*(i[T+S]-i[y+S])}var Tr=new WeakMap;function di(e,t,n=.3){if(!e?.animations)return;let r=e.animations.find(u=>u.name===t);if(!r)return;let i=Tr.get(e);i||(i=[],e.currentClip&&i.push({clip:e.currentClip,time:e.animationTime||0,weight:1,fadeSpeed:0}),Tr.set(e,i));let o=n>0?1/n:1e3;for(let u of i)u.clip.name!==t&&(u.fadeSpeed=-o);let a=i.find(u=>u.clip.name===t);a?a.fadeSpeed=o:i.push({clip:r,time:0,weight:n>0?0:1,fadeSpeed:o}),e.currentClip=r,e.isPlayingAnimation=!0}function fi(e,t){if(!e.gltf||!Array.isArray(e.gltf.nodes))return;let n=Tr.get(e);if(!n||n.length===0){if(!e.currentClip)return;n=[{clip:e.currentClip,time:t,weight:1,fadeSpeed:0}]}let r=e.gltf.nodes.length,i=[];for(let f=0;f<r;f++){let m=e.initialNodeTransforms[f];m?i.push({t:[m.t[0],m.t[1],m.t[2]],r:[m.r[0],m.r[1],m.r[2],m.r[3]],s:[m.s[0],m.s[1],m.s[2]]}):i.push({t:[0,0,0],r:[0,0,0,1],s:[1,1,1]})}let o=[0,0,0],a=[0,0,0,1],u=[1,1,1],s=new Float32Array(64);for(let f of n){let m=Math.max(0,Math.min(1,f.weight));if(!(m<=1e-4))for(let h of f.clip.channels){if(h.nodeIndex<0||h.nodeIndex>=r)continue;let p=i[h.nodeIndex];if(h.path==="translation")en(h,f.time,o),is(p.t,p.t,o,m);else if(h.path==="rotation")en(h,f.time,a),Ar(p.r,p.r,a,m);else if(h.path==="scale")en(h,f.time,u),is(p.s,p.s,u,m);else if(h.path==="weights"&&(en(h,f.time,s),e.meshes)){for(let d of e.meshes)if(d.nodeIndex===h.nodeIndex){for(let y of d.primitives)if(y.pluginData?.morph?.weights){let T=y.pluginData.morph.weights,S=y.pluginData.morph.numTargets||T.length;for(let b=0;b<S;b++)T[b]=T[b]*(1-m)+s[b]*m}}}}}let c=[];for(let f=0;f<r;f++){let m=Te(),{t:h,r:p,s:d}=i[f];Qe(m,p,h,d),c.push(m)}let l=ft(e.gltf,c);e.worldMatrices=l;for(let f of e.meshes)f.nodeIndex>=0&&f.nodeIndex<l.length&&(f.transform.set(l[f.nodeIndex]),De(f.normalMatrix,f.transform))}var pi={name:"keyframes",evaluateAnimation:fi,crossFadeTo:di,onParseGLB(e){!e.animations&&e.gltf?.animations&&(e.animations=hi(e.gltf,e.bin))},onUpdate(e,t){if(!e.isPlayingAnimation)return;let n=Tr.get(e);if(n&&n.length>0){for(let r=n.length-1;r>=0;r--){let i=n[r];if(i.time+=t,i.clip.duration>0&&(i.time%=i.clip.duration),i.fadeSpeed!==0)if(i.weight+=i.fadeSpeed*t,i.weight<=0){n.splice(r,1);continue}else i.weight>=1&&(i.weight=1,i.fadeSpeed=0)}n.length>0&&(e.animationTime=n[n.length-1].time),fi(e,e.animationTime)}else e.currentClip&&(e.animationTime+=t,e.currentClip.duration>0&&(e.animationTime%=e.currentClip.duration),fi(e,e.animationTime))}};var Mn=64;function os(e,t,n){if(!(!e?.meshes||t<0||t>=Mn))for(let r of e.meshes)for(let i of r.primitives){let o=i.pluginData?.morph;o?.weights&&(o.weights[t]=n)}}var bi={name:"morph",onResolveShader(e,t,n,r){if(!Array.isArray(e?.targets)||e.targets.length===0)return null;let i=n.replace("uniform mat4 uMVP,uModel;",`uniform mat4 uMVP,uModel;
|
|
309
327
|
uniform sampler2D uMorphDeltasTex;
|
|
310
|
-
uniform float uMorphWeights[${
|
|
328
|
+
uniform float uMorphWeights[${Mn}];
|
|
311
329
|
uniform int uNumMorphTargets;`);return i=i.replace("vec4 world=uModel*vec4(aPosition,1.0);",`vec3 morphedPos = aPosition;
|
|
312
|
-
for (int m = 0; m < ${
|
|
330
|
+
for (int m = 0; m < ${Mn}; m++) {
|
|
313
331
|
if (m >= uNumMorphTargets) break;
|
|
314
332
|
float w = uMorphWeights[m];
|
|
315
333
|
if (abs(w) > 0.0001) {
|
|
316
334
|
morphedPos += texelFetch(uMorphDeltasTex, ivec2(gl_VertexID, m), 0).xyz * w;
|
|
317
335
|
}
|
|
318
336
|
}
|
|
319
|
-
vec4 world=uModel*vec4(morphedPos,1.0);`).replace("gl_Position=uMVP*vec4(aPosition,1.0);","gl_Position=uMVP*vec4(morphedPos,1.0);"),{vs:i,fs:r}},onBuildPrimitiveVAO(t,
|
|
337
|
+
vec4 world=uModel*vec4(morphedPos,1.0);`).replace("gl_Position=uMVP*vec4(aPosition,1.0);","gl_Position=uMVP*vec4(morphedPos,1.0);"),{vs:i,fs:r}},onBuildPrimitiveVAO(e,t,n,r,i){let o=n?.targets;if(!Array.isArray(o)||o.length===0)return null;let a=n.attributes?.POSITION,u=r?.accessors?.[a];if(!u)return null;let s=u.count,c=Math.min(o.length,Mn),l=new Float32Array(s*c*4);for(let h=0;h<c;h++){let p=o[h].POSITION;if(p===void 0)continue;let d=r.accessors?.[p],y=r.bufferViews?.[d?.bufferView];if(!d||!y)continue;let T=it(r,i,d,3);if(!T||T.length<s*3)continue;let S=h*s*4;for(let b=0;b<s;b++)l[S+b*4]=T[b*3],l[S+b*4+1]=T[b*3+1],l[S+b*4+2]=T[b*3+2],l[S+b*4+3]=0}let f=e.createTexture();e.bindTexture(3553,f),e.texImage2D(3553,0,34836,s,c,0,6408,5126,l),e.texParameteri(3553,10242,33071),e.texParameteri(3553,10243,33071),e.texParameteri(3553,10241,9728),e.texParameteri(3553,10240,9728);let m=new Float32Array(Mn);return{hasMorph:!0,morphTex:f,numTargets:c,vertexCount:s,weights:m}},onBeforeDrawPrimitive(e,t,n,r,i,o){let a=n.pluginData?.morph;if(!a?.hasMorph||!a.morphTex)return;e.activeTexture(33989),e.bindTexture(3553,a.morphTex);let u=e.getUniformLocation(t,"uMorphDeltasTex");u&&e.uniform1i(u,5);let s=e.getUniformLocation(t,"uNumMorphTargets");s&&e.uniform1i(s,a.numTargets);let c=e.getUniformLocation(t,"uMorphWeights[0]");c&&e.uniform1fv(c,a.weights)}};var yi=64,gi={name:"skinning",onResolveShader(e,t,n,r){if(e?.attributes?.JOINTS_0===void 0||e?.attributes?.WEIGHTS_0===void 0)return null;let i=n.replace("layout(location=2) in vec2 aUV;",`layout(location=2) in vec2 aUV;
|
|
320
338
|
layout(location=4) in uvec4 aJoints;
|
|
321
339
|
layout(location=5) in vec4 aWeights;
|
|
322
|
-
uniform mat4 uJointMatrix[${
|
|
340
|
+
uniform mat4 uJointMatrix[${yi}];`),o=i.includes("morphedPos")?"morphedPos":"aPosition";return i=i.replace(`vec4 world=uModel*vec4(${o},1.0);`,`mat4 skinMatrix =
|
|
323
341
|
aWeights.x * uJointMatrix[int(aJoints.x)] +
|
|
324
342
|
aWeights.y * uJointMatrix[int(aJoints.y)] +
|
|
325
343
|
aWeights.z * uJointMatrix[int(aJoints.z)] +
|
|
326
344
|
aWeights.w * uJointMatrix[int(aJoints.w)];
|
|
327
|
-
vec4 world=uModel*(skinMatrix*vec4(${o},1.0));`).replace(`gl_Position=uMVP*vec4(${o},1.0);`,`gl_Position=uMVP*(skinMatrix*vec4(${o},1.0));`),{vs:i,fs:r}},onBuildPrimitiveVAO(t,
|
|
328
|
-
layout(location=0) in vec3 aPosition;layout(location=1) in vec2 aUV;uniform mat4 uMVP;out vec2 vUV;void main(){vUV=aUV;gl_Position=uMVP*vec4(aPosition,1.);}`,
|
|
329
|
-
precision highp float;in vec2 vUV;uniform float uShadowIntensity,uShadowSoftness;out vec4 fragColor;void main(){vec2 p=(vUV-.5)*2.;float d=clamp(length(p),0.,1.);fragColor=vec4(0.,0.,0.,pow(1.-d*d,mix(1.2,2.8,uShadowSoftness))*smoothstep(1.,.85-uShadowSoftness*.6,d)*uShadowIntensity);}`,cr=new WeakMap,Io=new Float32Array(20);function Jr(t,e){let[n,r,i,o,s,c]=e;return[t[0]*n+t[4]*r+t[8]*i+t[12],t[1]*n+t[5]*r+t[9]*i+t[13],t[2]*n+t[6]*r+t[10]*i+t[14],Math.abs(t[0])*o+Math.abs(t[4])*s+Math.abs(t[8])*c,Math.abs(t[1])*o+Math.abs(t[5])*s+Math.abs(t[9])*c,Math.abs(t[2])*o+Math.abs(t[6])*s+Math.abs(t[10])*c]}function Hs(t){if(t._lb!==void 0)return t._lb;let e=1e9,n=1e9,r=1e9,i=-1e9,o=-1e9,s=-1e9;for(let c of t.primitives||[]){let a=c.positions;if(a)for(let u=0;u<a.length;u+=3)a[u]<e&&(e=a[u]),a[u+1]<n&&(n=a[u+1]),a[u+2]<r&&(r=a[u+2]),a[u]>i&&(i=a[u]),a[u+1]>o&&(o=a[u+1]),a[u+2]>s&&(s=a[u+2])}return t._lb=e<=i?[(e+i)*.5,(n+o)*.5,(r+s)*.5,(i-e)*.5,(o-n)*.5,(s-r)*.5]:null}function Ws(t){let e=cr.get(t);if(e)return e;let n=(c,a)=>{let u=t.createShader(c);return t.shaderSource(u,a),t.compileShader(u),u},r=t.createProgram();t.attachShader(r,n(35633,Gs)),t.attachShader(r,n(35632,Xs)),t.linkProgram(r);let i=t.createVertexArray(),o=t.createBuffer(),s=t.createBuffer();return t.bindVertexArray(i),t.bindBuffer(34962,o),t.bufferData(34962,80,35048),t.enableVertexAttribArray(0),t.vertexAttribPointer(0,3,5126,!1,20,0),t.enableVertexAttribArray(1),t.vertexAttribPointer(1,2,5126,!1,20,12),t.bindBuffer(34963,s),t.bufferData(34963,new Uint16Array([0,1,2,0,2,3]),35044),t.bindVertexArray(null),e={prog:r,vao:i,vbo:o,ibo:s,uMVP:t.getUniformLocation(r,"uMVP"),uIntensity:t.getUniformLocation(r,"uShadowIntensity"),uSoftness:t.getUniformLocation(r,"uShadowSoftness")},cr.set(t,e),e}var fn={name:"contact-shadow",onAfterRender(t,e,n){let r=e.shadowIntensity;if(r<=0||!e.bounds)return;let i=Ws(t),o=!e.xrSessionActive&&(e.backdropMeshes?.length??0)>0,s=[],c=[];for(let d of e.meshes||[]){if(!d||d.visible===!1||d.isPluginMesh||d.name==="__xr_reticle__"||d.name?.startsWith("__xr_slot_"))continue;let p=Hs(d);if(!p)continue;d.transform&&(p=Jr(d.transform,p)),e.modelRootMatrix&&(p=Jr(e.modelRootMatrix,p));let[E,A,x,R,I,P]=p,k=[E,x,R,P,A-I,A+I];/floor|table|pedestal|ground|base|plane/i.test(d.name||"")||I<.14&&Math.min(R,P)>.45?c.push(k):s.push(k)}let a=[],u=e.bounds.center||[0,0,0],l=Math.max(.05,Number(e.bounds.radius)||.5),m=e.bounds.min,f=m?[u[0],u[1],u[2],l,Math.max(.01,u[1]-m[1]),l]:[u[0],u[1],u[2],l,l,l];e.modelRootMatrix&&(f=Jr(e.modelRootMatrix,f));let b=e.xrSessionActive&&c.length===0&&String(e.container?.tagName||"").toLowerCase()==="xr-live"?(e.modelRootMatrix?e.modelRootMatrix[5]*-.25+e.modelRootMatrix[13]:-.25)+.002:f[1]-f[4]+.002;for(let[d,p,E,A,x]of s){let R=-1/0;for(let[P,k,D,S,,_]of c)x>=_-.08&&Math.abs(d-P)<=D&&Math.abs(p-k)<=S&&_+.002>R&&(R=_+.002);o&&(R=Math.max(R,d>=.04&&d<=.36&&p>=-.34&&p<=-.04&&x>=.01?.036:Math.hypot(d,p)<=.66&&x>=-.06?.003:-.477)),isFinite(R)||(R=b);let I=a.find(P=>Math.hypot(d-P[0],p-P[1])<.06&&Math.abs(R-P[5])<.05);I?(I[2]=Math.max(I[2],E*.78),I[3]=Math.max(I[3],A*.78),I[4]=Math.min(I[4],x)):a.push([d,p,E,A,x,R])}if(a.length===0){let d=Math.max(.1,f[3]*1.5)/1.45;a.push([f[0],f[2],d,d,b,b])}t.useProgram(i.prog),t.uniformMatrix4fv(i.uMVP,!1,n),t.enable(3042),(t.blendFuncSeparate||t.blendFunc).call(t,770,771,1,771),t.depthMask(!1),t.bindVertexArray(i.vao),t.bindBuffer(34962,i.vbo);for(let[d,p,E,A,x,R]of a){let I=Math.max(0,x-R),P=r/(1+I*2);if(P<.02)continue;let k=1+Math.min(.75,I*.85),D=Math.max(.045,E*1.45*k),S=Math.max(.045,A*1.45*k);Io.set([d-D,R,p-S,0,0,d+D,R,p-S,1,0,d+D,R,p+S,1,1,d-D,R,p+S,0,1]),t.bufferSubData(34962,0,Io),t.uniform1f(i.uIntensity,P),t.uniform1f(i.uSoftness,Math.min(1,e.shadowSoftness+Math.min(.45,I*.6))),t.drawElements(4,6,5123,0)}t.bindVertexArray(null),t.depthMask(!0),t.disable(3042)},onDestroy(t){let e=cr.get(t);e&&(t.deleteVertexArray(e.vao),t.deleteBuffer(e.vbo),t.deleteBuffer(e.ibo),t.deleteProgram(e.prog),cr.delete(t))}};function ni(){if(typeof window>"u"||typeof navigator>"u")return!1;let t=navigator.userAgent||"";if(!(/iPad|iPhone|iPod/.test(t)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1))return!1;let n=document.createElement("a");return n.relList!==void 0&&n.relList.supports!==void 0&&n.relList.supports("ar")}function ri(){if(typeof navigator>"u")return!1;let t=navigator.userAgent||"";return/android/i.test(t)}async function ii(){if(typeof navigator>"u")return!1;let t=navigator;if(!t.xr||typeof t.xr.isSessionSupported!="function")return!1;try{return await t.xr.isSessionSupported("immersive-ar")?!0:await t.xr.isSessionSupported("immersive-vr")}catch{return!1}}async function Do(){return(await lr()).bestMode}async function lr(){let[t,e,n]=await Promise.all([ii(),Promise.resolve(ni()),Promise.resolve(ri())]),r=[];e&&r.push("quick-look"),t&&r.push("webxr"),n&&r.push("scene-viewer");let i=null;return e?i="quick-look":t?i="webxr":n&&(i="scene-viewer"),{webxr:t,quickLook:e,sceneViewer:n,availableModes:r,bestMode:i}}function Lo(t,e={}){if(typeof document>"u")throw new Error("launchQuickLook requires a browser DOM environment");let n,r=!1;if(typeof t=="string"){if(n=$s(t),!n)throw new Error("[XR-Live Security] Quick Look URL is empty.")}else n=URL.createObjectURL(t),r=!0;let i=[];if(e.allowScale===!1&&i.push("allowsContentScaling=0"),e.canonicalWebPageUrl){let c=ur(e.canonicalWebPageUrl,!1);c&&i.push(`canonicalWebPageURL=${encodeURIComponent(c)}`)}e.checkoutTitle&&i.push(`checkoutTitle=${encodeURIComponent(e.checkoutTitle)}`),e.checkoutSubtitle&&i.push(`checkoutSubtitle=${encodeURIComponent(e.checkoutSubtitle)}`),e.price&&i.push(`price=${encodeURIComponent(e.price)}`),i.length>0&&(n+=`#${i.join("&")}`);let o=document.createElement("a");o.setAttribute("rel","ar"),o.setAttribute("href",n);let s=document.createElement("img");s.setAttribute("src","data:image/svg+xml;utf8,<svg/>"),s.style.display="none",o.appendChild(s),document.body.appendChild(o),o.click(),setTimeout(()=>{document.body.removeChild(o),r&&URL.revokeObjectURL(n.split("#")[0])},3e3)}function ur(t,e=!1){if(typeof t!="string")return"";let n=t.replace(/[\x00-\x1f\x7f]+/g,"").trim();if(!n)return"";if(/^[\\/]{2}/.test(n))throw new Error(`[XR-Live Security] Rejected protocol-relative URL in Scene Viewer intent: ${n.slice(0,32)}`);let r=n.toLowerCase();if(r.startsWith("https://")||r.startsWith("http://")||e&&r.startsWith("blob:")||!/^[a-z][a-z0-9+.-]*:/i.test(n))return n;throw new Error(`[XR-Live Security] Rejected unsafe URL scheme in Scene Viewer intent: ${n.slice(0,32)}`)}function $s(t){try{return ur(t,!0)}catch{throw new Error(`[XR-Live Security] Rejected unsafe URL scheme in Quick Look launch: ${(t||"").trim().slice(0,32)}`)}}function qs(t,e={}){let n=ur(t,!0),r=e.mode||"ar_preferred",i=new URLSearchParams({file:n,mode:r,resizable:e.resizable!==!1?"true":"false",enable_vertical_placement:e.enableVerticalPlacement?"true":"false"});return e.title&&i.set("title",e.title),e.link&&i.set("link",ur(e.link,!1)),`intent://arvr.google.com/scene-viewer/1.0?${i.toString()}#Intent;scheme=https;package=com.google.ar.core;action=android.intent.action.VIEW;end;`}function Ys(t,e={}){if(typeof window>"u")throw new Error("launchSceneViewer requires a browser environment");let n=qs(t,e);window.location.href=n}var Et=null;function js(t,e){let r=new Float32Array(144),i=new Float32Array(24*6),o=new Float32Array(24*4),s=new Uint16Array(24*6);for(let m=0;m<24;m++){let f=m/24*Math.PI*2,h=Math.cos(f),b=Math.sin(f),d=m*2,p=d+1,E=(m+1)%24*2;r[d*3]=h*.11,r[d*3+1]=.002,r[d*3+2]=b*.11,r[p*3]=h*.145,r[p*3+1]=.002,r[p*3+2]=b*.145,i[d*3+1]=i[p*3+1]=1,s.set([d,E,p,p,E,E+1],m*6)}let c=t.createVertexArray();t.bindVertexArray(c);let a=(m,f,h)=>{let b=t.createBuffer();return t.bindBuffer(34962,b),t.bufferData(34962,m,35044),t.enableVertexAttribArray(f),t.vertexAttribPointer(f,h,5126,!1,0,0),b},u=[a(r,0,3),a(i,1,3),a(o,2,2)],l=t.createBuffer();return u.push(l),t.bindBuffer(34963,l),t.bufferData(34963,s,35044),t.bindVertexArray(null),{name:"__xr_reticle__",nodeIndex:-1,worldSpace:!0,visible:!1,transform:new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),normalMatrix:new Float32Array([1,0,0,0,1,0,0,0,1]),primitives:[{vao:c,indexCount:s.length,indexType:5123,baseColor:e&&e.length>=3?[e[0],e[1],e[2],e[3]??.95]:[.22,.74,.97,.95],metallic:0,roughness:.2,positions:r,indices:s,texture:null,metallicRoughnessTexture:null,normalTexture:null,occlusionTexture:null,normalScale:1,occlusionStrength:1,buffers:u}]}}function Po(t,e,n,r,i){let o=Math.cos(r),s=Math.sin(r),c=Math.max(.01,i);t.fill(0),t[0]=c*o,t[2]=-c*s,t[5]=c,t[8]=c*s,t[10]=c*o,t[12]=e[0]-c*(o*n[0]+s*n[2]),t[13]=e[1]-c*n[1],t[14]=e[2]-c*(-s*n[0]+o*n[2]),t[15]=1}var ti=class{constructor(e={}){this.s=null;this.placed=!1;this.placedMat=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);this.cleanFn=null;this.opts=e}isSessionActive(){return this.s!==null}hasPlacedModel(){return this.placed}getPlacedMatrix(){return this.placedMat}async start(e,n){if(typeof navigator>"u"||!navigator.xr)throw new Error("WebXR is not supported on this browser.");Et&&Et!==this&&Et.isSessionActive()&&await Et.stop().catch(()=>{});let r=navigator.xr,i=this.opts,o=n||e?.container,s=String(o?.tagName||"").toLowerCase()==="xr-live",c=e?.bounds,a=Number(c?.radius)||1,u=Array.isArray(c?.center)?c.center:[0,0,0],l=Array.isArray(c?.min)?c.min:[-.5,-.5,-.5],m=typeof navigator<"u"&&navigator.userAgent||"",f=/Android|iPhone|iPad|iPod/i.test(m)&&!/Quest|Oculus|Pico|Vision/i.test(m),h=s?i.arScale==="fixed"?1:f?.55:1:i.arScale==="fixed"?1:a>.45?.3/a:a<.05?.12/Math.max(a,.001):1,b=s?[0,-.25,0]:[u[0]||0,i.arPlacement==="wall"?u[1]:l[1]??0,u[2]||0],d="immersive-ar";try{await r.isSessionSupported("immersive-ar")||(d="immersive-vr")}catch{d="immersive-vr"}let p=o?.querySelector?.('[slot="ar-overlay"]')||null,E=!1,A=null,x=()=>{E&&p?.parentNode&&p.parentNode.removeChild(p),p=null,A=null,E=!1};if(d==="immersive-ar"){if(p)p.addEventListener?.("beforexrselect",M=>M.preventDefault());else if(typeof document<"u"&&document.body&&typeof document.createElement=="function"){let M=document.createElement("div");M.style.cssText="position:fixed;inset:0;pointer-events:none;background:transparent!important;z-index:2147483647;font-family:system-ui,sans-serif;user-select:none";let N=document.createElement("button");N.type="button",N.textContent="\u2715 Exit AR",N.style.cssText="position:absolute;top:max(16px,env(safe-area-inset-top,16px));right:16px;pointer-events:auto;padding:8px 14px;border-radius:99px;border:1px solid rgba(255,255,255,.3);background:rgba(15,23,42,.8);color:#f8fafc;font:600 13px system-ui,sans-serif",N.addEventListener("beforexrselect",z=>z.preventDefault()),N.addEventListener("click",z=>{z.stopPropagation(),this.stop().catch(()=>{})}),A=document.createElement("div"),A.style.cssText="position:absolute;bottom:max(28px,env(safe-area-inset-bottom,28px));left:50%;transform:translateX(-50%);padding:8px 15px;border-radius:99px;border:1px solid rgba(56,189,248,.4);background:rgba(15,23,42,.82);color:#f8fafc;font:500 12.5px system-ui,sans-serif;text-align:center;max-width:88vw",A.textContent="Move phone to detect a surface \u2022 Tap to place",M.appendChild(N),M.appendChild(A),document.body.appendChild(M),p=M,E=!0}}let R=new Set(i.optionalFeatures||["local","local-floor","hit-test","light-estimation"]),I={requiredFeatures:i.requiredFeatures?[...i.requiredFeatures]:[],optionalFeatures:Array.from(R)};p&&(R.add("dom-overlay"),I.optionalFeatures=Array.from(R),I.domOverlay={root:p});for(let M of Ie)M.onConfigureXRSessionInit?.(o,I);Array.isArray(I.optionalFeatures)&&I.optionalFeatures.includes("dom-overlay")&&!I.domOverlay?.root&&(I.optionalFeatures=I.optionalFeatures.filter(M=>M!=="dom-overlay"));let P=M=>{let N=String(M?.name||"");return N==="NotAllowedError"||N==="SecurityError"};try{this.s=await r.requestSession(d,I)}catch(M){if(x(),P(M))throw i.onError?.(M),M;try{this.s=await r.requestSession(d,{requiredFeatures:[],optionalFeatures:["local","hit-test"]})}catch(N){if(P(N))throw i.onError?.(N),N;try{this.s=await r.requestSession(d)}catch(z){throw i.onError?.(z),z}}}let k=this.s;Et=this,this.placed=!1;let D=null,S=null,_=null,v=null,G=null,L=[0,-.25,-1.2],U=[0,-.25,-1.2],q=new Float32Array(16),W=new Float32Array(16),K=!1,Y=1,te=0,ie=!1,$=null,ne=null,re=0,O=null,X=()=>{Et===this&&(Et=null),O?.(),O=null;try{S?.cancel?.()}catch{}if(S=null,_){let M=e?.meshes;if(Array.isArray(M)){let z=M.indexOf(_);z!==-1&&M.splice(z,1)}let N=e.getGLContext?.()||e?.gl;if(N)for(let z of _.primitives||[]){N.deleteVertexArray?.(z.vao);for(let V of z.buffers||[])N.deleteBuffer?.(V)}_=null}e?.setXRSessionActive?.(!1),x(),this.s=null,this.placed=!1,this.cleanFn=null};this.cleanFn=X,k.addEventListener("end",()=>{X(),i.onExit?.()}),k.addEventListener("select",()=>{if(!this.placed){let M=G||L;U=[M[0],M[1],M[2]],Po(this.placedMat,U,b,te,h*Y),this.placed=!0,_&&(_.visible=!1),A&&(A.textContent="Placed \u2022 Drag to move \u2022 Pinch to scale"),i.onPlaced?.(this.placedMat)}});try{let M=e.getGLContext?.()||e?.gl;M&&typeof M.makeXRCompatible=="function"&&await M.makeXRCompatible();let N=typeof XRWebGLLayer<"u"?XRWebGLLayer:globalThis?.XRWebGLLayer;M&&typeof N=="function"&&typeof k.updateRenderState=="function"&&k.updateRenderState({baseLayer:new N(k,M,{alpha:!0})});try{D=await k.requestReferenceSpace("local")}catch{try{D=await k.requestReferenceSpace("local-floor")}catch{D=await k.requestReferenceSpace("viewer")}}let z=await k.requestReferenceSpace("viewer").catch(()=>D);if(typeof k.requestHitTestSource=="function"&&z&&(S=await k.requestHitTestSource({space:z}).catch(()=>null)),d==="immersive-ar"&&M&&typeof M.createVertexArray=="function"&&Array.isArray(e.meshes)&&(_=js(M,i.reticleColor),e.meshes.push(_)),typeof window<"u"&&typeof window.addEventListener=="function"){let y=w=>Math.hypot(w.touches[1].clientX-w.touches[0].clientX,w.touches[1].clientY-w.touches[0].clientY),g=w=>Math.atan2(w.touches[1].clientY-w.touches[0].clientY,w.touches[1].clientX-w.touches[0].clientX),T=w=>{this.s&&(w.touches.length===1&&this.placed?ie=!0:w.touches.length>=2&&(ie=!1,$=y(w),ne=g(w)))},C=w=>{if(!this.s||w.touches.length<2)return;let F=y(w),H=g(w);if($&&$>4&&i.arScale!=="fixed"&&(Y=Math.max(.15,Math.min(6,Y*(F/$)))),ne!==null){let J=H-ne;J>Math.PI&&(J-=Math.PI*2),J<-Math.PI&&(J+=Math.PI*2),te-=J}$=F,ne=H},B=w=>{(!w.touches||w.touches.length===0)&&(ie=!1),(!w.touches||w.touches.length<2)&&($=null,ne=null)};window.addEventListener("touchstart",T,{passive:!0}),window.addEventListener("touchmove",C,{passive:!0}),window.addEventListener("touchend",B,{passive:!0}),window.addEventListener("touchcancel",B,{passive:!0}),O=()=>{window.removeEventListener("touchstart",T),window.removeEventListener("touchmove",C),window.removeEventListener("touchend",B),window.removeEventListener("touchcancel",B)}}e.setXRSessionActive?.(!0);let V=(y,g)=>{if(this.s!==k)return;k.requestAnimationFrame(V);let T=re>0?Math.min(Math.max((y-re)/1e3,0),.1):1/60;re=y,e?.stepXRUpdate?.(T);let C=g.getViewerPose(D);if(!C)return;let B=C.views?.[0];if(!K&&B?.transform){let ee=B.transform.position,j=B.transform.matrix,Q=ee?.x??(j?j[12]:0),se=ee?.y??(j?j[13]:0),oe=ee?.z??(j?j[14]:0),ce=j?-j[8]:0,ue=j?-j[10]:-1,le=Math.hypot(ce,ue);le>1e-4?(ce/=le,ue/=le):(ce=0,ue=-1),L=[Q+ce*1.2,se-.25,oe+ue*1.2],te=Math.atan2(-ce,-ue),K=!0}if(S&&typeof g.getHitTestResults=="function"&&(!this.placed||ie)){let ee=g.getHitTestResults(S)||[],j=!1;for(let Q of ee){let se=Q.getPose(D);if(se?.transform?.matrix){let oe=se.transform.matrix,ce=oe[5];if(i.arPlacement==="wall"&&Math.abs(ce)>.35||i.arPlacement==="floor"&&Math.abs(ce)<.65)continue;v||(v=new Float32Array(16)),v.set(oe),G=[oe[12],oe[13],oe[14]],this.placed&&ie&&(U=[oe[12],oe[13],oe[14]]),_&&(_.visible=!this.placed||ie,_.transform.set(oe)),!this.placed&&A&&(A.textContent="Surface found \u2022 Tap to place \u2022 Pinch to scale"),i.onHit?.(v),j=!0;break}}!j&&_&&(_.visible=!1)}Po(q,this.placed?U:G||L,b,te,h*Y),this.placed&&this.placedMat.set(q);let w=e.xrRigMatrix;w instanceof Float32Array&&w.length===16?Ee(W,w,q):W.set(q),e.modelRootMatrix&&e.modelRootMatrix.set(W);for(let ee of Ie)ee.onXRFrame?.(e,k,g,D);let F=e.getGLContext?.()||e?.gl,H=k.renderState?.baseLayer;F&&H&&H.framebuffer!==void 0&&F.bindFramebuffer(36160,H.framebuffer);let J=d==="immersive-ar",Z=C.views||[];for(let ee=0;ee<Z.length;ee++){let j=Z[ee];if(typeof e.renderXRView=="function"){let Q;if(H&&typeof H.getViewport=="function"){let se=H.getViewport(j);se&&se.width>0&&se.height>0&&(Q=[se.x,se.y,se.width,se.height])}else H?.framebufferWidth>0&&H?.framebufferHeight>0&&(Q=[0,0,H.framebufferWidth,H.framebufferHeight]);e.renderXRView(j,W,this.placed,Q,J,ee)}}F&&H&&H.framebuffer&&F.bindFramebuffer(36160,null)};k.requestAnimationFrame(V)}catch(M){throw typeof k.end=="function"&&await k.end().catch(()=>{}),X(),i.onError?.(M),M}}async stop(){let e=this.s;if(e)try{await e.end()}catch{}finally{this.cleanFn?.()}else this.cleanFn?.()}};async function mr(t){let e=await lr(),n=t.preferredModes||["quick-look","webxr","scene-viewer"],r=null;for(let c of n)if(e.availableModes.includes(c)){r=c;break}if(r||(r=e.bestMode),!r)return{mode:"quick-look",success:!1,error:new Error("No augmented reality viewing mode is supported on this device.")};let i={...t.quickLookOptions,allowScale:t.arScale==="fixed"?!1:t.quickLookOptions?.allowScale},o={...t.sceneViewerOptions,resizable:t.arScale==="fixed"?!1:t.sceneViewerOptions?.resizable,enableVerticalPlacement:t.arPlacement==="wall"?!0:t.sceneViewerOptions?.enableVerticalPlacement},s={...t.webXROptions,arScale:t.arScale||t.webXROptions?.arScale,arPlacement:t.arPlacement||t.webXROptions?.arPlacement};try{if(r==="quick-look"){let c;if(t.model instanceof Blob&&t.model.type==="model/vnd.usdz+zip")c=t.model;else{if(typeof t.model=="string")return Lo(t.model,i),{mode:"quick-look",success:!0};c=Vt(t.model)}return Lo(c,i),{mode:"quick-look",success:!0}}if(r==="scene-viewer"){let c=t.glbUrl||(typeof t.model=="string"?t.model:null);if(!c)throw new Error("Scene Viewer requires a hosted GLB URL (glbUrl option).");return Ys(c,o),{mode:"scene-viewer",success:!0}}if(r==="webxr"){if(!t.view)throw new Error("WebXR AR mode requires an active ThreeView instance.");let c=new ti(s);return await c.start(t.view,t.element),{mode:"webxr",success:!0,session:c}}}catch(c){return{mode:r,success:!1,error:c}}return{mode:r,success:!1,error:new Error(`Unhandled AR mode: ${r}`)}}Je.registerAR({activateAR:mr,createUSDZBlob:Vt});Je.registerScriptRunner(Gt);Pe(fn);var oi=new WeakMap;function fr(t,e){let n=e instanceof Float32Array?e:new Float32Array(e);oi.set(t,n)}function Uo(t){return oi.get(t)}async function Ks(t,e){if(!e)return null;let n;if(typeof e=="string")if(typeof fetch<"u"&&typeof createImageBitmap=="function"){let o=await(await fetch(e)).blob();n=await createImageBitmap(o)}else if(typeof Image<"u")n=await new Promise((i,o)=>{let s=new Image;s.crossOrigin="anonymous",s.onload=()=>i(s),s.onerror=o,s.src=e});else return null;else n=e;let r=t.createTexture();return t.bindTexture(3553,r),t.texImage2D(3553,0,6408,6408,5121,n),t.texParameteri(3553,10242,33071),t.texParameteri(3553,10243,33071),t.texParameteri(3553,10241,9987),t.texParameteri(3553,10240,9729),t.generateMipmap(3553),r}var ko=new WeakMap,No=new Float32Array(16);async function Fo(t,e,n){let r=n?await Ks(t.gl,n):null;t[e]&&t.gl.deleteTexture(t[e]),t[e]=r}var si={name:"environment-map",setEnvironmentImage(t,e){return Fo(t,"environmentTexture",e)},setSkyboxImage(t,e){return Fo(t,"skyboxTexture",e)},onBeforeDrawScene(t,e,n,r,i){if(!t.skyboxTexture||typeof e.createProgram!="function")return;let o=ko.get(e);if(!o){let m=(b,d)=>{let p=e.createShader(b);return e.shaderSource(p,d),e.compileShader(p),p},f=e.createProgram();e.attachShader(f,m(35633,`#version 300 es
|
|
330
|
-
out vec2 vNDC;void main(){vec2 p=vec2((gl_VertexID<<1)&2,gl_VertexID&2);vNDC=p*2.-1.;gl_Position=vec4(vNDC,.999999,1.);}`)),
|
|
331
|
-
precision highp float;in vec2 vNDC;uniform mat4 uInvVP;uniform vec3 uCameraPos;uniform sampler2D uSkyboxMap;uniform float uExposure;out vec4 fragColor;vec2 eqUV(vec3 d){return vec2(atan(d.x,d.z)/6.2831853+.5,asin(clamp(d.y,-1.,1.))/3.1415926+.5);}void main(){vec4 fp=uInvVP*vec4(vNDC,1.,1.);vec3 dir=normalize(fp.xyz/fp.w-uCameraPos);fragColor=vec4(pow(texture(uSkyboxMap,eqUV(dir)).rgb*uExposure,vec3(1./2.2)),1.);}`)),
|
|
345
|
+
vec4 world=uModel*(skinMatrix*vec4(${o},1.0));`).replace(`gl_Position=uMVP*vec4(${o},1.0);`,`gl_Position=uMVP*(skinMatrix*vec4(${o},1.0));`),{vs:i,fs:r}},onBuildPrimitiveVAO(e,t,n,r,i){let o=n?.attributes;if(!o||o.JOINTS_0===void 0||o.WEIGHTS_0===void 0)return null;let a=r.accessors[o.JOINTS_0],u=r.accessors[o.WEIGHTS_0];if(!a||!u)return null;let s=r.bufferViews[a.bufferView],c=r.bufferViews[u.bufferView];if(!s||!c)return null;let l=(s.byteOffset||0)+(a.byteOffset||0),f=(c.byteOffset||0)+(u.byteOffset||0),m=e.createBuffer();e.bindBuffer(34962,m);let h=a.componentType===5121?5121:5123,p=h===5121?new Uint8Array(i,l,a.count*4):new Uint16Array(i,l,a.count*4);e.bufferData(34962,p,35044),e.enableVertexAttribArray(4),e.vertexAttribIPointer(4,4,h,0,0);let d=e.createBuffer();e.bindBuffer(34962,d);let y=it(r,i,u,4)??new Float32Array(i,f,u.count*4);return e.bufferData(34962,y,35044),e.enableVertexAttribArray(5),e.vertexAttribPointer(5,4,5126,!1,0,0),{hasSkin:!0,buffers:[m,d]}},onBeforeDrawPrimitive(e,t,n,r,i,o){if(!n.pluginData?.skinning?.hasSkin)return;let a=o?.nodes?.[r.nodeIndex]?.skin;if(a===void 0||!o.skins||!o.skins[a])return;let s=o.skins[a].joints||[],c=new Float32Array(yi*16);for(let f=0;f<s.length&&f<yi;f++){let m=s[f],h=i[m]||Te();c.subarray(f*16,(f+1)*16).set(h)}let l=e.getUniformLocation(t,"uJointMatrix[0]");l&&e.uniformMatrix4fv(l,!1,c)}};Fe(bi);Fe(pi);Fe(gi);Fe(Yr);Fe(Or);var Va=`#version 300 es
|
|
346
|
+
layout(location=0) in vec3 aPosition;layout(location=1) in vec2 aUV;uniform mat4 uMVP;out vec2 vUV;void main(){vUV=aUV;gl_Position=uMVP*vec4(aPosition,1.);}`,Ba=`#version 300 es
|
|
347
|
+
precision highp float;in vec2 vUV;uniform float uShadowIntensity,uShadowSoftness;out vec4 fragColor;void main(){vec2 p=(vUV-.5)*2.;float d=clamp(length(p),0.,1.);fragColor=vec4(0.,0.,0.,pow(1.-d*d,mix(1.2,2.8,uShadowSoftness))*smoothstep(1.,.85-uShadowSoftness*.6,d)*uShadowIntensity);}`,Sn=new WeakMap,ss=new Float32Array(20);function xi(e,t){let[n,r,i,o,a,u]=t;return[e[0]*n+e[4]*r+e[8]*i+e[12],e[1]*n+e[5]*r+e[9]*i+e[13],e[2]*n+e[6]*r+e[10]*i+e[14],Math.abs(e[0])*o+Math.abs(e[4])*a+Math.abs(e[8])*u,Math.abs(e[1])*o+Math.abs(e[5])*a+Math.abs(e[9])*u,Math.abs(e[2])*o+Math.abs(e[6])*a+Math.abs(e[10])*u]}function za(e){if(e._lb!==void 0)return e._lb;let t=1e9,n=1e9,r=1e9,i=-1e9,o=-1e9,a=-1e9;for(let u of e.primitives||[]){let s=u.positions;if(s)for(let c=0;c<s.length;c+=3)s[c]<t&&(t=s[c]),s[c+1]<n&&(n=s[c+1]),s[c+2]<r&&(r=s[c+2]),s[c]>i&&(i=s[c]),s[c+1]>o&&(o=s[c+1]),s[c+2]>a&&(a=s[c+2])}return e._lb=t<=i?[(t+i)*.5,(n+o)*.5,(r+a)*.5,(i-t)*.5,(o-n)*.5,(a-r)*.5]:null}function Ga(e){let t=Sn.get(e);if(t)return t;let n=(u,s)=>{let c=e.createShader(u);return e.shaderSource(c,s),e.compileShader(c),c},r=e.createProgram();e.attachShader(r,n(35633,Va)),e.attachShader(r,n(35632,Ba)),e.linkProgram(r);let i=e.createVertexArray(),o=e.createBuffer(),a=e.createBuffer();return e.bindVertexArray(i),e.bindBuffer(34962,o),e.bufferData(34962,80,35048),e.enableVertexAttribArray(0),e.vertexAttribPointer(0,3,5126,!1,20,0),e.enableVertexAttribArray(1),e.vertexAttribPointer(1,2,5126,!1,20,12),e.bindBuffer(34963,a),e.bufferData(34963,new Uint16Array([0,1,2,0,2,3]),35044),e.bindVertexArray(null),t={prog:r,vao:i,vbo:o,ibo:a,uMVP:e.getUniformLocation(r,"uMVP"),uIntensity:e.getUniformLocation(r,"uShadowIntensity"),uSoftness:e.getUniformLocation(r,"uShadowSoftness")},Sn.set(e,t),t}var En={name:"contact-shadow",onContextRestored(e){Sn.delete(e)},onAfterRender(e,t,n){let r=t.shadowIntensity;if(r<=0||!t.bounds)return;let i=Ga(e),o=!t.xrSessionActive&&(t.backdropMeshes?.length??0)>0,a=[],u=[];for(let d of t.meshes||[]){if(!d||d.visible===!1||d.isPluginMesh||d.name==="__xr_reticle__"||d.name?.startsWith("__xr_slot_"))continue;let y=za(d);if(!y)continue;d.transform&&(y=xi(d.transform,y)),t.modelRootMatrix&&(y=xi(t.modelRootMatrix,y));let[T,S,b,A,w,P]=y,N=[T,b,A,P,S-w,S+w];/floor|table|pedestal|ground|base|plane/i.test(d.name||"")||w<.14&&Math.min(A,P)>.45?u.push(N):a.push(N)}let s=[],c=t.bounds.center||[0,0,0],l=Math.max(.05,Number(t.bounds.radius)||.5),f=t.bounds.min,m=f?[c[0],c[1],c[2],l,Math.max(.01,c[1]-f[1]),l]:[c[0],c[1],c[2],l,l,l];t.modelRootMatrix&&(m=xi(t.modelRootMatrix,m));let p=t.xrSessionActive&&u.length===0&&String(t.container?.tagName||"").toLowerCase()==="xr-live"?(t.modelRootMatrix?t.modelRootMatrix[5]*-.25+t.modelRootMatrix[13]:-.25)+.002:m[1]-m[4]+.002;for(let[d,y,T,S,b]of a){let A=-1/0;for(let[P,N,I,_,,v]of u)b>=v-.08&&Math.abs(d-P)<=I&&Math.abs(y-N)<=_&&v+.002>A&&(A=v+.002);o&&(A=Math.max(A,d>=.04&&d<=.36&&y>=-.34&&y<=-.04&&b>=.01?.036:Math.hypot(d,y)<=.66&&b>=-.06?.003:-.477)),isFinite(A)||(A=p);let w=s.find(P=>Math.hypot(d-P[0],y-P[1])<.06&&Math.abs(A-P[5])<.05);w?(w[2]=Math.max(w[2],T*.78),w[3]=Math.max(w[3],S*.78),w[4]=Math.min(w[4],b)):s.push([d,y,T,S,b,A])}if(s.length===0){let d=Math.max(.1,m[3]*1.5)/1.45;s.push([m[0],m[2],d,d,p,p])}e.useProgram(i.prog),e.uniformMatrix4fv(i.uMVP,!1,n),e.enable(3042),(e.blendFuncSeparate||e.blendFunc).call(e,770,771,1,771),e.depthMask(!1),e.bindVertexArray(i.vao),e.bindBuffer(34962,i.vbo);for(let[d,y,T,S,b,A]of s){let w=Math.max(0,b-A),P=r/(1+w*2);if(P<.02)continue;let N=1+Math.min(.75,w*.85),I=Math.max(.045,T*1.45*N),_=Math.max(.045,S*1.45*N);ss.set([d-I,A,y-_,0,0,d+I,A,y-_,1,0,d+I,A,y+_,1,1,d-I,A,y+_,0,1]),e.bufferSubData(34962,0,ss),e.uniform1f(i.uIntensity,P),e.uniform1f(i.uSoftness,Math.min(1,t.shadowSoftness+Math.min(.45,w*.6))),e.drawElements(4,6,5123,0)}e.bindVertexArray(null),e.depthMask(!0),e.disable(3042)},onDestroy(e){let t=Sn.get(e);t&&(e.deleteVertexArray(t.vao),e.deleteBuffer(t.vbo),e.deleteBuffer(t.ibo),e.deleteProgram(t.prog),Sn.delete(e))}};function Ai(){if(typeof window>"u"||typeof navigator>"u")return!1;let e=navigator.userAgent||"";if(!(/iPad|iPhone|iPod/.test(e)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1))return!1;let n=document.createElement("a");return n.relList!==void 0&&n.relList.supports!==void 0&&n.relList.supports("ar")}function wi(){if(typeof navigator>"u")return!1;let e=navigator.userAgent||"";return/android/i.test(e)}async function Mi(){if(typeof navigator>"u")return!1;let e=navigator;if(!e.xr||typeof e.xr.isSessionSupported!="function")return!1;try{return await e.xr.isSessionSupported("immersive-ar")?!0:await e.xr.isSessionSupported("immersive-vr")}catch{return!1}}async function us(){return(await Mr()).bestMode}async function Mr(){let[e,t,n]=await Promise.all([Mi(),Promise.resolve(Ai()),Promise.resolve(wi())]),r=[];t&&r.push("quick-look"),e&&r.push("webxr"),n&&r.push("scene-viewer");let i=null;return t?i="quick-look":e?i="webxr":n&&(i="scene-viewer"),{webxr:e,quickLook:t,sceneViewer:n,availableModes:r,bestMode:i}}function as(e,t={}){if(typeof document>"u")throw new Error("launchQuickLook requires a browser DOM environment");let n,r=!1;if(typeof e=="string"){if(n=Ha(e),!n)throw new Error("[XR-Live Security] Quick Look URL is empty.")}else n=URL.createObjectURL(e),r=!0;let i=[];if(t.allowScale===!1&&i.push("allowsContentScaling=0"),t.canonicalWebPageUrl){let u=wr(t.canonicalWebPageUrl,!1);u&&i.push(`canonicalWebPageURL=${encodeURIComponent(u)}`)}t.checkoutTitle&&i.push(`checkoutTitle=${encodeURIComponent(t.checkoutTitle)}`),t.checkoutSubtitle&&i.push(`checkoutSubtitle=${encodeURIComponent(t.checkoutSubtitle)}`),t.price&&i.push(`price=${encodeURIComponent(t.price)}`),i.length>0&&(n+=`#${i.join("&")}`);let o=document.createElement("a");o.setAttribute("rel","ar"),o.setAttribute("href",n);let a=document.createElement("img");a.setAttribute("src","data:image/svg+xml;utf8,<svg/>"),a.style.display="none",o.appendChild(a),document.body.appendChild(o),o.click(),setTimeout(()=>{document.body.removeChild(o),r&&URL.revokeObjectURL(n.split("#")[0])},3e3)}function wr(e,t=!1){if(typeof e!="string")return"";let n=e.replace(/[\x00-\x1f\x7f]+/g,"").trim();if(!n)return"";if(/^[\\/]{2}/.test(n))throw new Error(`[XR-Live Security] Rejected protocol-relative URL in Scene Viewer intent: ${n.slice(0,32)}`);let r=n.toLowerCase();if(r.startsWith("https://")||r.startsWith("http://")||t&&r.startsWith("blob:")||!/^[a-z][a-z0-9+.-]*:/i.test(n))return n;throw new Error(`[XR-Live Security] Rejected unsafe URL scheme in Scene Viewer intent: ${n.slice(0,32)}`)}function Ha(e){try{return wr(e,!0)}catch{throw new Error(`[XR-Live Security] Rejected unsafe URL scheme in Quick Look launch: ${(e||"").trim().slice(0,32)}`)}}function Xa(e,t={}){let n=wr(e,!0),r=t.mode||"ar_preferred",i=new URLSearchParams({file:n,mode:r,resizable:t.resizable!==!1?"true":"false",enable_vertical_placement:t.enableVerticalPlacement?"true":"false"});return t.title&&i.set("title",t.title),t.link&&i.set("link",wr(t.link,!1)),`intent://arvr.google.com/scene-viewer/1.0?${i.toString()}#Intent;scheme=https;package=com.google.ar.core;action=android.intent.action.VIEW;end;`}function Wa(e,t={}){if(typeof window>"u")throw new Error("launchSceneViewer requires a browser environment");let n=Xa(e,t);window.location.href=n}var kt=null;function $a(e,t){let r=new Float32Array(144),i=new Float32Array(24*6),o=new Float32Array(24*4),a=new Uint16Array(24*6);for(let f=0;f<24;f++){let m=f/24*Math.PI*2,h=Math.cos(m),p=Math.sin(m),d=f*2,y=d+1,T=(f+1)%24*2;r[d*3]=h*.11,r[d*3+1]=.002,r[d*3+2]=p*.11,r[y*3]=h*.145,r[y*3+1]=.002,r[y*3+2]=p*.145,i[d*3+1]=i[y*3+1]=1,a.set([d,T,y,y,T,T+1],f*6)}let u=e.createVertexArray();e.bindVertexArray(u);let s=(f,m,h)=>{let p=e.createBuffer();return e.bindBuffer(34962,p),e.bufferData(34962,f,35044),e.enableVertexAttribArray(m),e.vertexAttribPointer(m,h,5126,!1,0,0),p},c=[s(r,0,3),s(i,1,3),s(o,2,2)],l=e.createBuffer();return c.push(l),e.bindBuffer(34963,l),e.bufferData(34963,a,35044),e.bindVertexArray(null),{name:"__xr_reticle__",nodeIndex:-1,worldSpace:!0,visible:!1,transform:new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),normalMatrix:new Float32Array([1,0,0,0,1,0,0,0,1]),primitives:[{vao:u,indexCount:a.length,indexType:5123,baseColor:t&&t.length>=3?[t[0],t[1],t[2],t[3]??.95]:[.22,.74,.97,.95],metallic:0,roughness:.2,positions:r,indices:a,texture:null,metallicRoughnessTexture:null,normalTexture:null,occlusionTexture:null,normalScale:1,occlusionStrength:1,buffers:c}]}}function cs(e,t,n,r,i){let o=Math.cos(r),a=Math.sin(r),u=Math.max(.01,i);e.fill(0),e[0]=u*o,e[2]=-u*a,e[5]=u,e[8]=u*a,e[10]=u*o,e[12]=t[0]-u*(o*n[0]+a*n[2]),e[13]=t[1]-u*n[1],e[14]=t[2]-u*(-a*n[0]+o*n[2]),e[15]=1}var Ti=class{constructor(t={}){this.s=null;this.placed=!1;this.placedMat=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);this.cleanFn=null;this.opts=t}isSessionActive(){return this.s!==null}hasPlacedModel(){return this.placed}getPlacedMatrix(){return this.placedMat}async start(t,n){if(typeof navigator>"u"||!navigator.xr)throw new Error("WebXR is not supported on this browser.");kt&&kt!==this&&kt.isSessionActive()&&await kt.stop().catch(()=>{});let r=navigator.xr,i=this.opts,o=n||t?.container,a=String(o?.tagName||"").toLowerCase()==="xr-live",u=t?.bounds,s=Number(u?.radius)||1,c=Array.isArray(u?.center)?u.center:[0,0,0],l=Array.isArray(u?.min)?u.min:[-.5,-.5,-.5],f=typeof navigator<"u"&&navigator.userAgent||"",m=/Android|iPhone|iPad|iPod/i.test(f)&&!/Quest|Oculus|Pico|Vision/i.test(f),h=a?i.arScale==="fixed"?1:m?.55:1:i.arScale==="fixed"?1:s>.45?.3/s:s<.05?.12/Math.max(s,.001):1,p=a?[0,-.25,0]:[c[0]||0,i.arPlacement==="wall"?c[1]:l[1]??0,c[2]||0],d="immersive-ar";try{await r.isSessionSupported("immersive-ar")||(d="immersive-vr")}catch{d="immersive-vr"}let y=o?.querySelector?.('[slot="ar-overlay"]')||null,T=!1,S=null,b=()=>{T&&y?.parentNode&&y.parentNode.removeChild(y),y=null,S=null,T=!1};if(d==="immersive-ar"){if(y)y.addEventListener?.("beforexrselect",E=>E.preventDefault());else if(typeof document<"u"&&document.body&&typeof document.createElement=="function"){let E=document.createElement("div");E.style.cssText="position:fixed;inset:0;pointer-events:none;background:transparent!important;z-index:2147483647;font-family:system-ui,sans-serif;user-select:none";let V=document.createElement("button");V.type="button",V.textContent="\u2715 Exit AR",V.style.cssText="position:absolute;top:max(16px,env(safe-area-inset-top,16px));right:16px;pointer-events:auto;padding:8px 14px;border-radius:99px;border:1px solid rgba(255,255,255,.3);background:rgba(15,23,42,.8);color:#f8fafc;font:600 13px system-ui,sans-serif",V.addEventListener("beforexrselect",O=>O.preventDefault()),V.addEventListener("click",O=>{O.stopPropagation(),this.stop().catch(()=>{})}),S=document.createElement("div"),S.style.cssText="position:absolute;bottom:max(28px,env(safe-area-inset-bottom,28px));left:50%;transform:translateX(-50%);padding:8px 15px;border-radius:99px;border:1px solid rgba(56,189,248,.4);background:rgba(15,23,42,.82);color:#f8fafc;font:500 12.5px system-ui,sans-serif;text-align:center;max-width:88vw",S.textContent="Move phone to detect a surface \u2022 Tap to place",E.appendChild(V),E.appendChild(S),document.body.appendChild(E),y=E,T=!0}}let A=new Set(i.optionalFeatures||["local","local-floor","hit-test","light-estimation"]),w={requiredFeatures:i.requiredFeatures?[...i.requiredFeatures]:[],optionalFeatures:Array.from(A)};y&&(A.add("dom-overlay"),w.optionalFeatures=Array.from(A),w.domOverlay={root:y});for(let E of Ne)E.onConfigureXRSessionInit?.(o,w);Array.isArray(w.optionalFeatures)&&w.optionalFeatures.includes("dom-overlay")&&!w.domOverlay?.root&&(w.optionalFeatures=w.optionalFeatures.filter(E=>E!=="dom-overlay"));let P=E=>{let V=String(E?.name||"");return V==="NotAllowedError"||V==="SecurityError"};try{this.s=await r.requestSession(d,w)}catch(E){if(b(),P(E))throw i.onError?.(E),E;try{this.s=await r.requestSession(d,{requiredFeatures:[],optionalFeatures:["local","hit-test"]})}catch(V){if(P(V))throw i.onError?.(V),V;try{this.s=await r.requestSession(d)}catch(O){throw i.onError?.(O),O}}}let N=this.s;kt=this,this.placed=!1;let I=null,_=null,v=null,g=null,M=null,k=[0,-.25,-1.2],R=[0,-.25,-1.2],B=new Float32Array(16),Z=new Float32Array(16),j=!1,ie=1,ee=0,ne=!1,X=null,ae=null,se=0,F=null,H=()=>{kt===this&&(kt=null),F?.(),F=null;try{_?.cancel?.()}catch{}if(_=null,v){let E=t?.meshes;if(Array.isArray(E)){let O=E.indexOf(v);O!==-1&&E.splice(O,1)}let V=t.getGLContext?.()||t?.gl;if(V)for(let O of v.primitives||[]){V.deleteVertexArray?.(O.vao);for(let U of O.buffers||[])V.deleteBuffer?.(U)}v=null}t?.setXRSessionActive?.(!1),b(),this.s=null,this.placed=!1,this.cleanFn=null};this.cleanFn=H,N.addEventListener("end",()=>{H(),i.onExit?.()}),N.addEventListener("select",()=>{if(!this.placed){let E=M||k;R=[E[0],E[1],E[2]],cs(this.placedMat,R,p,ee,h*ie),this.placed=!0,v&&(v.visible=!1),S&&(S.textContent="Placed \u2022 Drag to move \u2022 Pinch to scale"),i.onPlaced?.(this.placedMat)}});try{let E=t.getGLContext?.()||t?.gl;E&&typeof E.makeXRCompatible=="function"&&await E.makeXRCompatible();let V=typeof XRWebGLLayer<"u"?XRWebGLLayer:globalThis?.XRWebGLLayer;E&&typeof V=="function"&&typeof N.updateRenderState=="function"&&N.updateRenderState({baseLayer:new V(N,E,{alpha:!0})});try{I=await N.requestReferenceSpace("local")}catch{try{I=await N.requestReferenceSpace("local-floor")}catch{I=await N.requestReferenceSpace("viewer")}}let O=await N.requestReferenceSpace("viewer").catch(()=>I);if(typeof N.requestHitTestSource=="function"&&O&&(_=await N.requestHitTestSource({space:O}).catch(()=>null)),d==="immersive-ar"&&E&&typeof E.createVertexArray=="function"&&Array.isArray(t.meshes)&&(v=$a(E,i.reticleColor),t.meshes.push(v)),typeof window<"u"&&typeof window.addEventListener=="function"){let G=x=>Math.hypot(x.touches[1].clientX-x.touches[0].clientX,x.touches[1].clientY-x.touches[0].clientY),K=x=>Math.atan2(x.touches[1].clientY-x.touches[0].clientY,x.touches[1].clientX-x.touches[0].clientX),ue=x=>{this.s&&(x.touches.length===1&&this.placed?ne=!0:x.touches.length>=2&&(ne=!1,X=G(x),ae=K(x)))},re=x=>{if(!this.s||x.touches.length<2)return;let C=G(x),L=K(x);if(X&&X>4&&i.arScale!=="fixed"&&(ie=Math.max(.15,Math.min(6,ie*(C/X)))),ae!==null){let z=L-ae;z>Math.PI&&(z-=Math.PI*2),z<-Math.PI&&(z+=Math.PI*2),ee-=z}X=C,ae=L},D=x=>{(!x.touches||x.touches.length===0)&&(ne=!1),(!x.touches||x.touches.length<2)&&(X=null,ae=null)};window.addEventListener("touchstart",ue,{passive:!0}),window.addEventListener("touchmove",re,{passive:!0}),window.addEventListener("touchend",D,{passive:!0}),window.addEventListener("touchcancel",D,{passive:!0}),F=()=>{window.removeEventListener("touchstart",ue),window.removeEventListener("touchmove",re),window.removeEventListener("touchend",D),window.removeEventListener("touchcancel",D)}}t.setXRSessionActive?.(!0);let U=(G,K)=>{if(this.s!==N)return;N.requestAnimationFrame(U);let ue=se>0?Math.min(Math.max((G-se)/1e3,0),.1):1/60;se=G,t?.stepXRUpdate?.(ue);let re=K.getViewerPose(I);if(!re)return;let D=re.views?.[0];if(!j&&D?.transform){let $=D.transform.position,Y=D.transform.matrix,Q=$?.x??(Y?Y[12]:0),q=$?.y??(Y?Y[13]:0),J=$?.z??(Y?Y[14]:0),oe=Y?-Y[8]:0,te=Y?-Y[10]:-1,me=Math.hypot(oe,te);me>1e-4?(oe/=me,te/=me):(oe=0,te=-1),k=[Q+oe*1.2,q-.25,J+te*1.2],ee=Math.atan2(-oe,-te),j=!0}if(_&&typeof K.getHitTestResults=="function"&&(!this.placed||ne)){let $=K.getHitTestResults(_)||[],Y=!1;for(let Q of $){let q=Q.getPose(I);if(q?.transform?.matrix){let J=q.transform.matrix,oe=J[5];if(i.arPlacement==="wall"&&Math.abs(oe)>.35||i.arPlacement==="floor"&&Math.abs(oe)<.65)continue;g||(g=new Float32Array(16)),g.set(J),M=[J[12],J[13],J[14]],this.placed&&ne&&(R=[J[12],J[13],J[14]]),v&&(v.visible=!this.placed||ne,v.transform.set(J)),!this.placed&&S&&(S.textContent="Surface found \u2022 Tap to place \u2022 Pinch to scale"),i.onHit?.(g),Y=!0;break}}!Y&&v&&(v.visible=!1)}cs(B,this.placed?R:M||k,p,ee,h*ie),this.placed&&this.placedMat.set(B);let x=t.xrRigMatrix;x instanceof Float32Array&&x.length===16?Re(Z,x,B):Z.set(B),t.modelRootMatrix&&t.modelRootMatrix.set(Z);for(let $ of Ne)$.onXRFrame?.(t,N,K,I);let C=t.getGLContext?.()||t?.gl,L=N.renderState?.baseLayer;C&&L&&L.framebuffer!==void 0&&C.bindFramebuffer(36160,L.framebuffer);let z=d==="immersive-ar",W=re.views||[];for(let $=0;$<W.length;$++){let Y=W[$];if(typeof t.renderXRView=="function"){let Q;if(L&&typeof L.getViewport=="function"){let q=L.getViewport(Y);q&&q.width>0&&q.height>0&&(Q=[q.x,q.y,q.width,q.height])}else L?.framebufferWidth>0&&L?.framebufferHeight>0&&(Q=[0,0,L.framebufferWidth,L.framebufferHeight]);t.renderXRView(Y,Z,this.placed,Q,z,$)}}C&&L&&L.framebuffer&&C.bindFramebuffer(36160,null)};N.requestAnimationFrame(U)}catch(E){throw typeof N.end=="function"&&await N.end().catch(()=>{}),H(),i.onError?.(E),E}}async stop(){let t=this.s;if(t)try{await t.end()}catch{}finally{this.cleanFn?.()}else this.cleanFn?.()}};async function Sr(e){let t=await Mr(),n=e.preferredModes||["quick-look","webxr","scene-viewer"],r=null;for(let u of n)if(t.availableModes.includes(u)){r=u;break}if(r||(r=t.bestMode),!r)return{mode:"quick-look",success:!1,error:new Error("No augmented reality viewing mode is supported on this device.")};let i={...e.quickLookOptions,allowScale:e.arScale==="fixed"?!1:e.quickLookOptions?.allowScale},o={...e.sceneViewerOptions,resizable:e.arScale==="fixed"?!1:e.sceneViewerOptions?.resizable,enableVerticalPlacement:e.arPlacement==="wall"?!0:e.sceneViewerOptions?.enableVerticalPlacement},a={...e.webXROptions,arScale:e.arScale||e.webXROptions?.arScale,arPlacement:e.arPlacement||e.webXROptions?.arPlacement};try{if(r==="quick-look"){let u;if(e.model instanceof Blob&&e.model.type==="model/vnd.usdz+zip")u=e.model;else{if(typeof e.model=="string")return as(e.model,i),{mode:"quick-look",success:!0};u=jt(e.model)}return as(u,i),{mode:"quick-look",success:!0}}if(r==="scene-viewer"){let u=e.glbUrl||(typeof e.model=="string"?e.model:null);if(!u)throw new Error("Scene Viewer requires a hosted GLB URL (glbUrl option).");return Wa(u,o),{mode:"scene-viewer",success:!0}}if(r==="webxr"){if(!e.view)throw new Error("WebXR AR mode requires an active ThreeView instance.");let u=new Ti(a);return await u.start(e.view,e.element),{mode:"webxr",success:!0,session:u}}}catch(u){return{mode:r,success:!1,error:u}}return{mode:r,success:!1,error:new Error(`Unhandled AR mode: ${r}`)}}at.registerAR({activateAR:Sr,createUSDZBlob:jt});at.registerScriptRunner(Qt);Fe(En);var Ei=new WeakMap;function Er(e,t){let n=t instanceof Float32Array?t:new Float32Array(t);Ei.set(e,n)}function fs(e){return Ei.get(e)}async function qa(e,t){if(!t)return null;let n;if(typeof t=="string")if(typeof fetch<"u"&&typeof createImageBitmap=="function"){let o=await(await fetch(t)).blob();n=await createImageBitmap(o)}else if(typeof Image<"u")n=await new Promise((i,o)=>{let a=new Image;a.crossOrigin="anonymous",a.onload=()=>i(a),a.onerror=o,a.src=t});else return null;else n=t;let r=e.createTexture();return e.bindTexture(3553,r),e.texImage2D(3553,0,6408,6408,5121,n),e.texParameteri(3553,10242,33071),e.texParameteri(3553,10243,33071),e.texParameteri(3553,10241,9987),e.texParameteri(3553,10240,9729),e.generateMipmap(3553),r}var Si=new WeakMap,ls=new Float32Array(16);async function ms(e,t,n){let r=n?await qa(e.gl,n):null;e[t]&&e.gl.deleteTexture(e[t]),e[t]=r}var Ri={name:"environment-map",onContextRestored(e){Si.delete(e)},setEnvironmentImage(e,t){return ms(e,"environmentTexture",t)},setSkyboxImage(e,t){return ms(e,"skyboxTexture",t)},onBeforeDrawScene(e,t,n,r,i){if(!e.skyboxTexture||typeof t.createProgram!="function")return;let o=Si.get(t);if(!o){let f=(p,d)=>{let y=t.createShader(p);return t.shaderSource(y,d),t.compileShader(y),y},m=t.createProgram();t.attachShader(m,f(35633,`#version 300 es
|
|
348
|
+
out vec2 vNDC;void main(){vec2 p=vec2((gl_VertexID<<1)&2,gl_VertexID&2);vNDC=p*2.-1.;gl_Position=vec4(vNDC,.999999,1.);}`)),t.attachShader(m,f(35632,`#version 300 es
|
|
349
|
+
precision highp float;in vec2 vNDC;uniform mat4 uInvVP;uniform vec3 uCameraPos;uniform sampler2D uSkyboxMap;uniform float uExposure;out vec4 fragColor;vec2 eqUV(vec3 d){return vec2(atan(d.x,d.z)/6.2831853+.5,asin(clamp(d.y,-1.,1.))/3.1415926+.5);}void main(){vec4 fp=uInvVP*vec4(vNDC,1.,1.);vec3 dir=normalize(fp.xyz/fp.w-uCameraPos);fragColor=vec4(pow(texture(uSkyboxMap,eqUV(dir)).rgb*uExposure,vec3(1./2.2)),1.);}`)),t.linkProgram(m);let h=typeof t.createVertexArray=="function"?t.createVertexArray():null;o={program:m,vao:h},Si.set(t,o)}let a=Xt(ls,n)||ls;t.depthMask(!1),t.useProgram(o.program),o.vao&&t.bindVertexArray(o.vao),t.activeTexture(33984),t.bindTexture(3553,e.skyboxTexture);let u=t.getUniformLocation(o.program,"uSkyboxMap");u&&t.uniform1i(u,0);let s=t.getUniformLocation(o.program,"uInvVP");s&&t.uniformMatrix4fv(s,!1,a);let c=t.getUniformLocation(o.program,"uCameraPos");c&&t.uniform3f(c,r[0],r[1],r[2]);let l=t.getUniformLocation(o.program,"uExposure");l&&t.uniform1f(l,e.exposure??1),t.drawArrays(4,0,3),t.depthMask(!0)},onResolveShader(e,t,n,r){if(r.includes("evalSHIrradiance"))return null;let i=r.replace("out vec4 fragColor;",`uniform vec3 uSH[9];
|
|
332
350
|
uniform int uHasSH;
|
|
333
351
|
out vec4 fragColor;`).replace("void main(){",`vec3 integrateBRDFApprox(vec3 f0,float r,float NoV){vec4 c0=vec4(-1.,-.0275,-.572,.022),c1=vec4(1.,.0425,1.04,-.04),rv=r*c0+c1;float a=min(rv.x*rv.x,exp2(-9.28*NoV))*rv.x+rv.y;vec2 ab=vec2(-1.04,1.04)*a+rv.zw;return f0*ab.x+vec3(ab.y);}
|
|
334
352
|
vec3 evalSHIrradiance(vec3 n){return max(vec3(0.),uSH[0]+uSH[1]*n.y+uSH[2]*n.z+uSH[3]*n.x+uSH[4]*(n.x*n.y)+uSH[5]*(n.y*n.z)+uSH[6]*(3.*n.z*n.z-1.)+uSH[7]*(n.x*n.z)+uSH[8]*(n.x*n.x-n.y*n.y));}
|
|
@@ -341,15 +359,15 @@ envDiffuse=uHasSH==1?evalSHIrradiance(N):textureLod(uEnvironmentMap,equirectangu
|
|
|
341
359
|
}else if(uHasSH==1){
|
|
342
360
|
specularIBL=getStudioRadiance(R,roughness)*integrateBRDFApprox(F,roughness,NoV);
|
|
343
361
|
envDiffuse=evalSHIrradiance(N);
|
|
344
|
-
}`),{vs:n,fs:i}},onBeforeDrawPrimitive(t,e,n,r,i,o){let s=oi.get(t),c=t.getUniformLocation(e,"uHasSH");if(s&&s.length>=27){c&&t.uniform1i(c,1);let a=t.getUniformLocation(e,"uSH");a&&t.uniform3fv(a,s)}else c&&t.uniform1i(c,0)},onAttributeChanged(t,e,n,r){e==="environment-image"&&t.viewer?this.setEnvironmentImage?.(t.viewer,r):e==="skybox-image"&&t.viewer&&this.setSkyboxImage?.(t.viewer,r)}};var ai=new WeakMap;function ci(t,e){let n=e||t.viewer;if(!n||typeof n.projectPointToScreen!="function")return;let r=t.mockHotspots||t.querySelectorAll('[slot^="hotspot-"], [data-position]');for(let i=0;i<r.length;i++){let o=r[i],s=o.getAttribute("data-position");if(!s)continue;let c=s.trim().split(/\s+/).map(m=>parseFloat(m.replace(/m$/,"")));if(c.length<3||c.some(isNaN))continue;let a=o.getAttribute("data-normal"),u;if(a){let m=a.trim().split(/\s+/).map(f=>parseFloat(f));m.length>=3&&!m.some(isNaN)&&(u=[m[0],m[1],m[2]])}let l=n.projectPointToScreen([c[0],c[1],c[2]],u);o.style.position="absolute",o.style.left="0",o.style.top="0",o.style.transform=`translate(-50%, -50%) translate3d(${l.x}px, ${l.y}px, 0)`,o.style.zIndex="3",l.visible?(o.style.opacity="1",o.style.pointerEvents="auto",o.removeAttribute("data-occluded")):(o.style.opacity="0",o.style.pointerEvents="none",o.setAttribute("data-occluded",""))}}var ui={name:"hotspots",updateHotspotsForElement:ci,onElementConnected(t){if(typeof MutationObserver>"u"||!t)return;let e=new MutationObserver(()=>{ci(t)});e.observe(t,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-position","data-normal"]}),ai.set(t,e)},onCameraChange(t,e){e&&ci(e,t)},onElementDisconnected(t){let e=ai.get(t);e&&(e.disconnect(),ai.delete(t))}};var Oo=1024,li=256,hr=2048,Zs=128,Qs=64,Js=16,ea=1e4,ta=8,at=new Set(["__proto__","constructor","prototype"]),Vo={neg:t=>-t,abs:Math.abs,sign:Math.sign,floor:Math.floor,ceil:Math.ceil,round:Math.round,trunc:Math.trunc,fract:t=>t-Math.floor(t),sqrt:t=>Math.sqrt(Math.max(0,t)),cbrt:Math.cbrt,exp:Math.exp,log:t=>t>0?Math.log(t):0,sin:Math.sin,cos:Math.cos,tan:Math.tan,asin:t=>Math.asin(Math.max(-1,Math.min(1,t))),acos:t=>Math.acos(Math.max(-1,Math.min(1,t))),atan:Math.atan,rad:t=>t*Math.PI/180,deg:t=>t*180/Math.PI,saturate:t=>Math.max(0,Math.min(1,t))},Bo={add:(t,e)=>t+e,sub:(t,e)=>t-e,mul:(t,e)=>t*e,div:(t,e)=>Math.abs(e)<1e-12?0:t/e,rem:(t,e)=>Math.abs(e)<1e-12?0:t%e,mod:(t,e)=>Math.abs(e)<1e-12?0:t%e,min:Math.min,max:Math.max,pow:Math.pow,atan2:Math.atan2},dr={translation:[0,0,0],rotation:[0,0,0,1],scale:[1,1,1]},pr=(t,e)=>t!==null&&typeof t=="object"&&!at.has(e)&&Object.prototype.hasOwnProperty.call(t,e),We=t=>Array.isArray(t)?[...t]:t,Ho=t=>t!==null&&typeof t=="object"&&!Array.isArray(t)&&pr(t,"value")?t.value:t,Re=(t,e)=>pr(t.configuration,e)?Ho(t.configuration[e]):void 0,ae=(t,e=0)=>{let n=Number(t);return Number.isFinite(n)?n:e},Rt=t=>Math.max(0,Math.min(1,t)),Ye=t=>typeof t=="boolean"?t:typeof t=="number"?t!==0&&!Number.isNaN(t):typeof t=="string"?t.length>0&&t!=="false":!!t;function hn(t){if(typeof t!="string"||!t.startsWith("/"))return null;let e=[];for(let n of t.slice(1).split("/")){let r=n.replace(/~1/g,"/").replace(/~0/g,"~");if(!r||at.has(r)||at.has(n))return null;e.push(r)}return{segments:e}}var Ht=(t,e)=>{if(t===void 0||!/^\d+$/.test(t))return-1;let n=Number(t);return Number.isSafeInteger(n)&&n>=0&&n<e?n:-1},zo=t=>{let e=ae(t[0]),n=ae(t[1]),r=ae(t[2]),i=ae(t[3],1),o=Math.hypot(e,n,r,i);return o>1e-8?[e/o,n/o,r/o,i/o]:[0,0,0,1]},Go=(t,e,n,r)=>{if(typeof t=="number"&&typeof e=="number")return t+(e-t)*n;if(Array.isArray(t)&&Array.isArray(e)){if(r&&t.length===4&&e.length===4){let i=[0,0,0,1];return ar(i,zo(t),zo(e),n),i}return t.slice(0,e.length).map((i,o)=>i+(e[o]-i)*n)}return n>=.5?e:t},mi=(t,e,n)=>Array.isArray(t)&&Array.isArray(e)?t.slice(0,e.length).map((r,i)=>n(ae(r),ae(e[i]))):Array.isArray(t)?t.map(r=>n(ae(r),ae(e))):Array.isArray(e)?e.map(r=>n(ae(t),ae(r))):n(ae(t),ae(e)),na=(t,e)=>Array.isArray(t)?t.map(n=>e(ae(n))):e(ae(t)),Xo=(t,e)=>Array.isArray(t)&&Array.isArray(e)?t.length===e.length&&t.every((n,r)=>Math.abs(n-e[r])<=1e-6):t===e,dn=class{constructor(e,n,r){let i=Array.isArray(r.nodes)?r.nodes:[];if(i.length>Oo)throw new Error(`SecurityError: Exceeds MAX_GRAPH_NODES (${Oo})`);let o=Array.isArray(r.variables)?r.variables:[];if(o.length>li)throw new Error(`SecurityError: Exceeds MAX_VARIABLES (${li})`);let s=Array.isArray(r.declarations)?r.declarations:[],c=Array.isArray(r.events)?r.events:[],a=new Map,u=new Map,l=new Map,m=new Map,f=new Map,h=new Map,b=[],d=[],p=new Map,E=1,A=0,x=0,R=0,I=0,P=!1,k=!1,D=!1;o.forEach((O,X)=>{if(!O||typeof O!="object")return;let M=We(Ho(O.value));a.set(X,M);let N=O.id??O.name;typeof N=="string"&&N&&!at.has(N)&&a.set(N,M)}),(n?.nodes||[]).forEach((O,X)=>{for(let M of O?.children||[])typeof M=="number"&&p.set(M,X)});let S=O=>O.op||typeof O.declaration=="number"&&s[O.declaration]?.op||"",_=(O,X,M)=>{if(at.has(X))return;let N=u.get(O);N||u.set(O,N=Object.create(null)),N[X]=M},v=(O,X)=>{if(typeof O!="number"&&typeof O!="string"||typeof O=="string"&&at.has(O)||!a.has(O)&&a.size>=li*2)return;let M=We(X);if(a.set(O,M),typeof O=="number"){let N=o[O]?.id??o[O]?.name;typeof N=="string"&&!at.has(N)&&a.set(N,M)}},G=O=>typeof O=="number"?c[O]?.id??String(O):typeof O=="string"?/^\d+$/.test(O)&&c[Number(O)]?.id?c[Number(O)].id:O:"",L=(O,X)=>{for(let M=O,N=0;M!==void 0&&M>=0&&N<128;M=p.get(M),N++)if(M===X)return!0;return!1},U=O=>{for(let X=b.length-1;X>=0;X--)b[X].key===O&&b.splice(X,1)},q=O=>{U(O.key),b.length>=Zs&&b.shift(),b.push(O)},W=O=>{let X=hn(O)?.segments;if(X){if(X[0]==="nodes"&&Array.isArray(n?.nodes)){let M=n.nodes[Ht(X[1],n.nodes.length)];if(!M)return;let N=X[2];if(N in dr){let z=dr[N],V=M[N]||z;return z.map((y,g)=>ae(V[g],y))}if(N==="weights"){let z=Array.isArray(M.weights)?M.weights:[0],V=X.length===4?Ht(X[3],64):-2;return V===-2?z.map(y=>ae(y)):V>=0?ae(z[V]):void 0}if(N==="visible"||N==="extensions"&&X[3]==="KHR_node_visibility"&&X[4]==="visible")return M.extensions?.KHR_node_visibility?.visible??M.visible??!0}else if(X[0]==="materials"&&Array.isArray(n?.materials)){let M=n.materials[Ht(X[1],n.materials.length)];if(!M)return;let N=M.pbrMetallicRoughness||{};if(X[2]==="pbrMetallicRoughness"){if(X[3]==="baseColorFactor"){let z=N.baseColorFactor||[1,1,1,1];return[ae(z[0],1),ae(z[1],1),ae(z[2],1),ae(z[3],1)]}if(X[3]==="metallicFactor"||X[3]==="roughnessFactor")return ae(N[X[3]],1)}if(X[2]==="emissiveFactor"){let z=M.emissiveFactor||[0,0,0];return[ae(z[0]),ae(z[1]),ae(z[2])]}if(X[2]==="alphaCutoff")return ae(M.alphaCutoff,.5)}}},K=(O,X)=>{let M=hn(O)?.segments;if(!M)return!1;if(M[0]==="nodes"&&Array.isArray(n?.nodes)){let N=Ht(M[1],n.nodes.length),z=n.nodes[N];if(!z)return!1;let V=M[2];if(V in dr&&Array.isArray(X)){let y=dr[V];if(X.length<y.length)return!1;let g=y.map((C,B)=>ae(X[B],C));if(V==="rotation"){let C=Math.hypot(...g);g=C>1e-8?g.map(B=>B/C):[0,0,0,1]}z[V]=g,delete z.matrix;let T=e?.initialNodeTransforms?.[N];return T&&(T[V[0]]=[...g]),P=!0,!0}if(V==="weights"){Array.isArray(z.weights)||(z.weights=[]);let y=(g,T)=>{for(let C of e?.meshes||[])if(C.nodeIndex===N)for(let B of C.primitives||[])B.pluginData?.morph?.weights&&(B.pluginData.morph.weights[g]=T)};if(M.length===4){let g=Ht(M[3],64);if(g<0)return!1;y(g,z.weights[g]=ae(X))}else if(Array.isArray(X))z.weights=X.slice(0,64).map(g=>ae(g)),z.weights.forEach((g,T)=>y(T,g));else return!1;return D=!0,!0}if(V==="visible"||V==="extensions"&&M[3]==="KHR_node_visibility"&&M[4]==="visible"){let y=Ye(X);return z.visible=y,(!z.extensions||typeof z.extensions!="object")&&(z.extensions={}),z.extensions.KHR_node_visibility={visible:y},k=!0,!0}}else if(M[0]==="materials"&&Array.isArray(n?.materials)){let N=Ht(M[1],n.materials.length),z=n.materials[N];if(!z)return!1;let V=z.pbrMetallicRoughness||(z.pbrMetallicRoughness={}),y=g=>{for(let T of e?.meshes||[])for(let C of T.primitives||[])(C.materialIndex??0)===N&&g(C)};if(M[2]==="pbrMetallicRoughness"){if(M[3]==="baseColorFactor"&&Array.isArray(X)&&X.length>=3){let g=[Rt(ae(X[0],1)),Rt(ae(X[1],1)),Rt(ae(X[2],1)),X[3]!==void 0?Rt(ae(X[3],1)):V.baseColorFactor?.[3]??1];return V.baseColorFactor=g,y(T=>T.baseColor=[...g]),D=!0}if(M[3]==="metallicFactor"||M[3]==="roughnessFactor"){let g=M[3]==="metallicFactor",T=Rt(ae(X,g?0:.5));return V[M[3]]=T,y(C=>C[g?"metallic":"roughness"]=T),D=!0}}if(M[2]==="emissiveFactor"&&Array.isArray(X)&&X.length>=3)return z.emissiveFactor=[0,1,2].map(g=>Math.max(0,ae(X[g]))),D=!0;if(M[2]==="alphaCutoff")return z.alphaCutoff=Rt(ae(X,.5)),D=!0}return!1},Y=(O,X,M=new Set)=>{let N=Re(X,"pointer");if(typeof N!="string"||!N.startsWith("/"))return null;let z=N.replace(/\{([a-zA-Z0-9_]+)\}/g,(V,y)=>{let g=Math.trunc(Number(te(O,y,void 0,M)??Re(X,y)));return Number.isSafeInteger(g)&&g>=0?String(g):"-1"});return hn(z)?z:null},te=(O,X,M,N)=>{let z=i[O]?.values;if(!pr(z,X))return M;let V=z[X];if(V==null)return M;if(typeof V!="object"||Array.isArray(V))return We(V);let y=V;return typeof y.node=="number"?ie(y.node,y.socket||"value",N):pr(y,"value")?We(y.value):M},ie=(O,X,M)=>{if(O<0||O>=i.length||M.has(O)||M.size>128||++R>ea)return;let N=i[O],z=S(N);if(/^(event\/|pointer\/on|scene\/on|flow\/)/.test(z))return We(u.get(O)?.[X]);M.add(O);try{let V=(y,g=0)=>te(O,y,g,M);if(z==="variable/get"){let y=Re(N,"variable")??Re(N,"id");return typeof y=="number"||typeof y=="string"?We(a.get(y)):void 0}if(z==="pointer/get"){let y=Y(O,N,M);return y?W(y):void 0}if(z.startsWith("math/")){let y=z.slice(5);if(y in Vo)return na(V("a"),Vo[y]);if(y in Bo){let g=/^(mul|div|rem|mod|pow)$/.test(y)?1:0;return mi(V("a",y==="mul"?1:0),V("b",g),Bo[y])}if(y==="pi")return Math.PI;if(y==="e")return Math.E;if(y==="random")return Math.random();if(y==="clamp")return mi(mi(V("a"),V("b",V("min",0)),Math.max),V("c",V("max",1)),Math.min);if(y==="mix"||y==="quatSlerp")return Go(V("a",0),V("b",1),ae(V("c",V("t",.5)),.5),y==="quatSlerp");if(y==="dot"){let g=V("a"),T=V("b");return Array.isArray(g)&&Array.isArray(T)?g.reduce((C,B,w)=>C+(B||0)*(T[w]||0),0):ae(g)*ae(T)}if(y==="cross"){let g=V("a",[0,0,0]),T=V("b",[0,0,0]);return Array.isArray(g)&&Array.isArray(T)?[(g[1]||0)*(T[2]||0)-(g[2]||0)*(T[1]||0),(g[2]||0)*(T[0]||0)-(g[0]||0)*(T[2]||0),(g[0]||0)*(T[1]||0)-(g[1]||0)*(T[0]||0)]:[0,0,0]}if(y==="length"){let g=V("a");return Array.isArray(g)?Math.hypot(...g):Math.abs(ae(g))}if(y==="distance"){let g=V("a"),T=V("b");return Array.isArray(g)&&Array.isArray(T)?Math.hypot(...g.map((C,B)=>(C||0)-(T[B]||0))):Math.abs(ae(g)-ae(T))}if(y==="normalize"){let g=V("a");if(!Array.isArray(g))return ae(g)>=0?1:-1;let T=Math.hypot(...g);return T>1e-8?g.map(C=>C/T):g.map(()=>0)}if(y.startsWith("combine"))return["a","b","c","d"].slice(0,Number(y[7])||2).map(g=>ae(V(g)));if(y.startsWith("extract")){let g=V("a");return Array.isArray(g)?g[X==="0"||X==="x"?0:X==="1"||X==="y"?1:X==="2"||X==="z"?2:3]??0:0}if(y==="eq")return Xo(V("a"),V("b"));if(y==="ne")return!Xo(V("a"),V("b"));if(y==="lt")return ae(V("a"))<ae(V("b"));if(y==="le")return ae(V("a"))<=ae(V("b"));if(y==="gt")return ae(V("a"))>ae(V("b"));if(y==="ge")return ae(V("a"))>=ae(V("b"));if(y==="isNaN")return Number.isNaN(Number(V("a")));if(y==="isInf"){let g=Number(V("a"));return!Number.isFinite(g)&&!Number.isNaN(g)}return y==="and"?Ye(V("a",!1))&&Ye(V("b",!1)):y==="or"?Ye(V("a",!1))||Ye(V("b",!1)):y==="xor"?Ye(V("a",!1))!==Ye(V("b",!1)):y==="not"?!Ye(V("a",!1)):y==="select"?We(Ye(V("condition",!1))?V("a"):V("b")):void 0}return z==="type/boolToInt"||z==="type/boolToFloat"?Ye(V("a",!1))?1:0:z==="type/intToBool"||z==="type/floatToBool"?ae(V("a",0))!==0:z==="type/intToFloat"?ae(V("a",0)):z==="type/floatToInt"?Math.trunc(ae(V("a",0))):void 0}finally{M.delete(O)}},$=()=>{if(P){P=!1,D=!0;let O=it(n);if(e){e.worldMatrices=O;for(let X of e.meshes||[])X.nodeIndex>=0&&X.nodeIndex<O.length&&(X.transform.set(O[X.nodeIndex]),Le(X.normalMatrix,X.transform))}}if(k){k=!1,D=!0;let O=n?.nodes;if(Array.isArray(e?.meshes)&&Array.isArray(O))for(let X of e.meshes){let M=!0;for(let N=X.nodeIndex,z=0;N!==void 0&&N>=0&&z<128;N=p.get(N),z++){let V=O[N];if(V?.visible===!1||V?.extensions?.KHR_node_visibility?.visible===!1){M=!1;break}}X.visible=M}}D&&(D=!1,e?.render?.())},ne=(O,X={steps:0})=>{if(!O||typeof O.node!="number")return;X.steps===0&&(R=0);let M=[O],N=z=>{M.length+X.steps<hr&&M.push(z)};for(;M.length>0&&X.steps<hr;){X.steps++;let z=M.shift();if(!z||z.node<0||z.node>=i.length)continue;let V=z.node,y=i[V];if(!y)continue;let g=z.socket||"in",T=S(y),C=(w,F=void 0)=>te(V,w,F,new Set),B=(w="out")=>{let F=y.flows?.[w];F&&N(F)};switch(T){case"flow/branch":B(Ye(C("condition",!1))?"true":"false");break;case"flow/sequence":for(let w of Object.keys(y.flows||{}).sort((F,H)=>Number(F)-Number(H)||F.localeCompare(H)))B(w);break;case"flow/switch":{let w=y.flows?.[String(C("selection",C("value",0)))]??y.flows?.default;w&&N(w);break}case"flow/for":{let w=Math.trunc(ae(C("startIndex",0))),F=Math.trunc(ae(C("endIndex",0))),H=Math.max(1,Math.trunc(ae(C("step",1),1))),J=y.flows?.body;if(J&&F>w&&I<ta){let ee=Math.min(Math.ceil((F-w)/H),hr);I++;try{for(let j=0;j<ee&&X.steps<hr;j++)_(V,"index",w+j*H),ne(J,X)}finally{I--}}let Z=y.flows?.completed??y.flows?.out;Z&&N(Z);break}case"flow/doN":{let w=g==="reset"?0:(l.get(V)||0)+1;if(l.set(V,w),_(V,"currentCount",w),_(V,"count",w),g!=="reset"){let F=Math.trunc(ae(C("n",Re(y,"stopIterations")??Re(y,"n")??1),1));w<=F&&B()}break}case"flow/multiGate":{if(g==="reset"){h.set(V,0);break}let w=Object.keys(y.flows||{}).sort();if(!w.length)break;let F=Re(y,"isRandom")?Math.floor(Math.random()*w.length):h.get(V)||0;F<w.length&&(B(w[F]),h.set(V,Re(y,"isLoop")!==!1?(F+1)%w.length:F+1));break}case"flow/waitAll":{if(g==="reset"){m.delete(V);break}let w=m.get(V);w||m.set(V,w=new Set),w.add(g),w.size>=Math.max(1,Math.trunc(Number(Re(y,"inputFlows")??2)||2))&&(w.clear(),B("out"),B("completed"));break}case"flow/throttle":{if(g==="reset"){f.delete(V);break}let w=Math.max(0,ae(C("duration",0))),F=f.get(V);F===void 0||A-F>=w?(f.set(V,A),_(V,"lastRemainingTime",0),B()):_(V,"lastRemainingTime",Math.max(0,w-(A-F)));break}case"flow/delay":case"flow/setDelay":{if(g==="cancel"){for(let J=d.length-1;J>=0;J--)d[J].nodeIdx===V&&d.splice(J,1);_(V,"lastDelayIndex",-1);break}let w=Math.max(0,ae(C("duration",Re(y,"duration")??0))),F=y.flows?.done??y.flows?.out;if(w<=0){_(V,"lastDelayIndex",-1),F&&N(F);break}d.length>=Qs&&d.shift();let H=E++;_(V,"lastDelayIndex",H),d.push({id:H,nodeIdx:V,rem:w,done:F}),T==="flow/setDelay"&&y.flows?.out&&y.flows?.done&&B("out");break}case"flow/cancelDelay":{let w=Math.trunc(ae(C("delayIndex",-1),-1));if(w<0)d.length=0;else for(let F=d.length-1;F>=0;F--)d[F].id===w&&d.splice(F,1);B();break}case"variable/set":v(Re(y,"variable")??Re(y,"id"),C("value")),B();break;case"variable/interpolate":{let w=Re(y,"variable")??Re(y,"id"),F=C("value",C("target")),H=Math.max(0,ae(C("duration",Re(y,"duration")??.3),.3));w!==void 0&&F!==void 0&&q({key:`var:${String(w)}`,varKey:w,from:We(C("from")??a.get(w)??0),to:We(F),dur:H,elapsed:0,quat:!1,linear:Re(y,"easing")==="linear",done:y.flows?.done}),B();break}case"pointer/set":{let w=Y(V,y),F=C("value");w&&F!==void 0&&(U(`ptr:${w}`),K(w,F)),B();break}case"pointer/interpolate":{let w=Y(V,y),F=C("value",C("target")),H=Math.max(0,ae(C("duration",Re(y,"duration")??.3),.3));if(w&&F!==void 0){let J=C("from")??W(w);J!==void 0&&(H<=0?(K(w,F),B("done")):q({key:`ptr:${w}`,ptr:w,from:We(J),to:We(F),dur:H,elapsed:0,quat:w.endsWith("/rotation"),linear:Re(y,"easing")==="linear",done:y.flows?.done}))}B();break}case"animation/start":{let w=C("animation")??Re(y,"animation")??Re(y,"clipName"),F=typeof w=="number"?e?.animations?.[w]?.name??n?.animations?.[w]?.name:typeof w=="string"?w:void 0;e?.playAnimation?.(F),D=!0,B();break}case"animation/stop":case"animation/resetAt":e?.pauseAnimation?.(),T==="animation/resetAt"&&e?.evaluateAnimation?.(ae(C("time",0))),D=!0,B();break;case"event/send":case"customEvent/send":{let w=G(Re(y,"event")??Re(y,"id")),F={};for(let H of Object.keys(y.values||{}))at.has(H)||(F[H]=C(H));w&&(typeof CustomEvent<"u"&&typeof e?.container?.dispatchEvent=="function"&&e.container.dispatchEvent(new CustomEvent("interactivityEvent",{bubbles:!0,composed:!0,detail:{id:w,values:F}})),re(w,F,X)),B();break}default:B();break}}};this.readScenePointer=W,this.writeScenePointer=K,this.fireOnStart=()=>{i.forEach(O=>{S(O)==="event/onStart"&&ne(O.flows?.out)}),$()},this.fireOnSelect=O=>{if(!O)return;let X=typeof O.meshIndex=="number"?O.meshIndex:-1,M=typeof O.nodeIndex=="number"?O.nodeIndex:e?.meshes?.[X]?.nodeIndex??-1;i.forEach((N,z)=>{if(!/^(pointer|event|scene)\/onSelect$/.test(S(N)))return;let V=Re(N,"nodeIndex")??Re(N,"node")??te(z,"nodeIndex",void 0,new Set),y=Re(N,"meshName");if(typeof y=="string"&&y?O.meshName===y:V==null||Number(V)<0||Number.isNaN(Number(V))||L(M,Math.trunc(Number(V)))){if(_(z,"nodeIndex",M),_(z,"meshIndex",X),Array.isArray(O.hitPoint)){let T=[ae(O.hitPoint[0]),ae(O.hitPoint[1]),ae(O.hitPoint[2])];_(z,"hitPoint",T),_(z,"point",T),_(z,"intersectionPoint",T)}if(Array.isArray(O.normal)){let T=[ae(O.normal[0]),ae(O.normal[1],1),ae(O.normal[2])];_(z,"normal",T),_(z,"hitNormal",T)}typeof O.distance=="number"&&_(z,"distance",O.distance),ne(N.flows?.out)}}),$()},this.receiveCustomEvent=(O,X={})=>re(O,X,{steps:0});function re(O,X,M){if(!(x>=Js)){x++;try{let N=G(O);i.forEach((z,V)=>{if(!/^(customE|e)vent\/receive$/.test(S(z)))return;let y=Re(z,"event")??Re(z,"id");if(!(G(y)!==N&&String(y)!==String(O))){for(let[g,T]of Object.entries(X))at.has(g)||_(V,g,We(T));ne(z.flows?.out,M)}}),$()}finally{x--}}}this.tick=O=>{if(!Number.isFinite(O)||O<0)return;let X=Math.min(O,.25);A+=X,i.forEach((N,z)=>{S(N)==="event/onTick"&&(_(z,"timeDelta",X),_(z,"dt",X),_(z,"timeElapsed",A),ne(N.flows?.out))});let M=[];for(let N=b.length-1;N>=0;N--){let z=b[N];z.elapsed+=X;let V=z.dur>1e-6?Rt(z.elapsed/z.dur):1,y=z.linear?V:V*V*(3-2*V),g=Go(z.from,z.to,y,z.quat);z.ptr?K(z.ptr,g):z.varKey!==void 0&&v(z.varKey,g),V>=1&&(b.splice(N,1),z.done&&M.push(z.done))}for(let N=d.length-1;N>=0;N--){let z=d[N];z.rem-=X,z.rem<=0&&(d.splice(N,1),z.done&&M.push(z.done))}for(let N of M)ne(N);$()},this.dispose=()=>{b.length=0,d.length=0,a.clear(),u.clear(),l.clear(),m.clear(),f.clear(),h.clear()}}},et=new WeakMap,br=new WeakMap;function ra(t,e){if(!t||typeof t!="object"||!Number.isFinite(e)||e<=0||Tn().some(a=>a.name==="xr-live-head-follow")||(typeof t.getAutoRotate=="function"?t.getAutoRotate():t.autoRotate)===!1)return;let r=t.gltf,i=r?.nodes;if(!Array.isArray(i)||i.length===0)return;let o=Math.min(e,.1),s=(br.get(t)||0)+o,c=!1;for(let a=0;a<i.length;a++){let u=i[a],l=so(u?.extras?.xr?.orbit);if(!l)continue;let m=0,f=0,h=0;if(Array.isArray(l.target))m=l.target[0],f=l.target[1],h=l.target[2];else if(typeof l.target=="string"&&l.target!=="head"){let A=i.find(x=>x?.name===l.target);Array.isArray(A?.translation)&&(m=ae(A.translation[0]),f=ae(A.translation[1]),h=ae(A.translation[2]))}let b=l.phase+l.speed*s,d=m+Math.cos(b)*l.radius,p=f+l.height,E=h+Math.sin(b)*l.radius;if(u.translation=[d,p,E],l.faceCenter){let A=Math.atan2(m-d,h-E);u.rotation=[0,Math.sin(A*.5),0,Math.cos(A*.5)]}c=!0}if(c){br.set(t,s);let a=it(r);t.worldMatrices=a;for(let u of t.meshes||[])u.nodeIndex>=0&&u.nodeIndex<a.length&&(u.transform.set(a[u.nodeIndex]),Le(u.normalMatrix,u.transform))}}function yr(t){if(!(!t||typeof t!="object"))return et.get(t)||et.get(t.viewer)||et.get(t._view)}function fi(t,e,n){let r=yr(t);return r?(r.receiveCustomEvent(e,n),!0):!1}var hi={name:"khr-interactivity",sendInteractivityEvent:fi,getInteractivityVM:yr,onLoadModel(t,e){if(!t||typeof t!="object")return;et.get(t)?.dispose(),et.delete(t),br.delete(t);let n=e?.extensions?.KHR_interactivity,r=Array.isArray(n?.graphs)?n.graphs[n.graph??0]:n;if(!r||!Array.isArray(r.nodes))return;let i=new dn(t,e,r);et.set(t,i),i.fireOnStart()},onMeshSelect(t,e){et.get(t)?.fireOnSelect(e)},onUpdate(t,e){et.get(t)?.tick(e),ra(t,e)},onDestroy(t,e){et.get(e)?.dispose(),et.delete(e),br.delete(e)}};var pn=new Map,di=new WeakMap;function Wo(t,e){pn.set(t,e)}var pi={name:"materials",onBuildPrimitiveVAO(t,e,n,r,i){return(((r?.materials&&n.material!==void 0?r.materials[n.material]:null)?.extensions||{}).KHR_materials_transmission?.transmissionFactor??0)>0?{isTransmissive:!0}:null},onBeforeTransmissivePass(t,e){let n=di.get(t);n||(n=t.createTexture(),di.set(t,n));let r=Math.max(1,e.canvas.width),i=Math.max(1,e.canvas.height);t.activeTexture(33990),t.bindTexture(3553,n),t.copyTexImage2D(3553,0,6408,0,0,r,i,0),t.texParameteri(3553,10242,33071),t.texParameteri(3553,10243,33071),t.texParameteri(3553,10241,9987),t.texParameteri(3553,10240,9729),t.generateMipmap(3553)},onResolveShader(t,e,n,r){if(!e)return null;if(e.name&&pn.has(e.name)){let b=pn.get(e.name);return{vs:b.vs||n,fs:b.fs||r}}let i=e.extensions||{},o=i.KHR_materials_clearcoat,s=i.KHR_materials_sheen,c=!!i.KHR_materials_transmission,a=!!i.KHR_materials_ior,u=i.KHR_materials_iridescence;if(!o&&!s&&!i.KHR_materials_unlit&&!c&&!i.KHR_materials_volume&&!a&&!i.KHR_materials_dispersion&&!u)return null;if(i.KHR_materials_unlit)return{vs:n,fs:r.replace("fragColor=vec4(color,outAlpha);","fragColor=vec4(base.rgb,outAlpha);").replace("fragColor=vec4(color,base.a);","fragColor=vec4(base.rgb,base.a);")};let l=r;if(c){let b=l.includes("uniform vec2 uViewportSize;")?"":`uniform vec2 uViewportSize;
|
|
362
|
+
}`),{vs:n,fs:i}},onBeforeDrawPrimitive(e,t,n,r,i,o){let a=Ei.get(e),u=e.getUniformLocation(t,"uHasSH");if(a&&a.length>=27){u&&e.uniform1i(u,1);let s=e.getUniformLocation(t,"uSH");s&&e.uniform3fv(s,a)}else u&&e.uniform1i(u,0)},onAttributeChanged(e,t,n,r){t==="environment-image"&&e.viewer?this.setEnvironmentImage?.(e.viewer,r):t==="skybox-image"&&e.viewer&&this.setSkyboxImage?.(e.viewer,r)}};var _i=new WeakMap;function Ii(e,t){let n=t||e.viewer;if(!n||typeof n.projectPointToScreen!="function")return;let r=e.mockHotspots||e.querySelectorAll('[slot^="hotspot-"], [data-position]');for(let i=0;i<r.length;i++){let o=r[i],a=o.getAttribute("data-position");if(!a)continue;let u=a.trim().split(/\s+/).map(f=>parseFloat(f.replace(/m$/,"")));if(u.length<3||u.some(isNaN))continue;let s=o.getAttribute("data-normal"),c;if(s){let f=s.trim().split(/\s+/).map(m=>parseFloat(m));f.length>=3&&!f.some(isNaN)&&(c=[f[0],f[1],f[2]])}let l=n.projectPointToScreen([u[0],u[1],u[2]],c);o.style.position="absolute",o.style.left="0",o.style.top="0",o.style.transform=`translate(-50%, -50%) translate3d(${l.x}px, ${l.y}px, 0)`,o.style.zIndex="3",l.visible?(o.style.opacity="1",o.style.pointerEvents="auto",o.removeAttribute("data-occluded")):(o.style.opacity="0",o.style.pointerEvents="none",o.setAttribute("data-occluded",""))}}var Ci={name:"hotspots",updateHotspotsForElement:Ii,onElementConnected(e){if(typeof MutationObserver>"u"||!e)return;let t=new MutationObserver(()=>{Ii(e)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-position","data-normal"]}),_i.set(e,t)},onCameraChange(e,t){t&&Ii(t,e)},onElementDisconnected(e){let t=_i.get(e);t&&(t.disconnect(),_i.delete(e))}};var hs=1024,Li=256,Rr=2048,Ya=128,ja=64,Ka=16,Za=1e4,Qa=8,pt=new Set(["__proto__","constructor","prototype"]),ds={neg:e=>-e,abs:Math.abs,sign:Math.sign,floor:Math.floor,ceil:Math.ceil,round:Math.round,trunc:Math.trunc,fract:e=>e-Math.floor(e),sqrt:e=>Math.sqrt(Math.max(0,e)),cbrt:Math.cbrt,exp:Math.exp,log:e=>e>0?Math.log(e):0,sin:Math.sin,cos:Math.cos,tan:Math.tan,asin:e=>Math.asin(Math.max(-1,Math.min(1,e))),acos:e=>Math.acos(Math.max(-1,Math.min(1,e))),atan:Math.atan,rad:e=>e*Math.PI/180,deg:e=>e*180/Math.PI,saturate:e=>Math.max(0,Math.min(1,e))},ps={add:(e,t)=>e+t,sub:(e,t)=>e-t,mul:(e,t)=>e*t,div:(e,t)=>Math.abs(t)<1e-12?0:e/t,rem:(e,t)=>Math.abs(t)<1e-12?0:e%t,mod:(e,t)=>Math.abs(t)<1e-12?0:e%t,min:Math.min,max:Math.max,pow:Math.pow,atan2:Math.atan2},_r={translation:[0,0,0],rotation:[0,0,0,1],scale:[1,1,1]},Ir=(e,t)=>e!==null&&typeof e=="object"&&!pt.has(t)&&Object.prototype.hasOwnProperty.call(e,t),Ze=e=>Array.isArray(e)?[...e]:e,xs=e=>e!==null&&typeof e=="object"&&!Array.isArray(e)&&Ir(e,"value")?e.value:e,Pe=(e,t)=>Ir(e.configuration,t)?xs(e.configuration[t]):void 0,le=(e,t=0)=>{let n=Number(e);return Number.isFinite(n)?n:t},Ft=e=>Math.max(0,Math.min(1,e)),tt=e=>typeof e=="boolean"?e:typeof e=="number"?e!==0&&!Number.isNaN(e):typeof e=="string"?e.length>0&&e!=="false":!!e;function Rn(e){if(typeof e!="string"||!e.startsWith("/"))return null;let t=[];for(let n of e.slice(1).split("/")){let r=n.replace(/~1/g,"/").replace(/~0/g,"~");if(!r||pt.has(r)||pt.has(n))return null;t.push(r)}return{segments:t}}var tn=(e,t)=>{if(e===void 0||!/^\d+$/.test(e))return-1;let n=Number(e);return Number.isSafeInteger(n)&&n>=0&&n<t?n:-1},bs=e=>{let t=le(e[0]),n=le(e[1]),r=le(e[2]),i=le(e[3],1),o=Math.hypot(t,n,r,i);return o>1e-8?[t/o,n/o,r/o,i/o]:[0,0,0,1]},ys=(e,t,n,r)=>{if(typeof e=="number"&&typeof t=="number")return e+(t-e)*n;if(Array.isArray(e)&&Array.isArray(t)){if(r&&e.length===4&&t.length===4){let i=[0,0,0,1];return Ar(i,bs(e),bs(t),n),i}return e.slice(0,t.length).map((i,o)=>i+(t[o]-i)*n)}return n>=.5?t:e},Pi=(e,t,n)=>Array.isArray(e)&&Array.isArray(t)?e.slice(0,t.length).map((r,i)=>n(le(r),le(t[i]))):Array.isArray(e)?e.map(r=>n(le(r),le(t))):Array.isArray(t)?t.map(r=>n(le(e),le(r))):n(le(e),le(t)),Ja=(e,t)=>Array.isArray(e)?e.map(n=>t(le(n))):t(le(e)),gs=(e,t)=>Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((n,r)=>Math.abs(n-t[r])<=1e-6):e===t,_n=class{constructor(t,n,r){let i=Array.isArray(r.nodes)?r.nodes:[];if(i.length>hs)throw new Error(`SecurityError: Exceeds MAX_GRAPH_NODES (${hs})`);let o=Array.isArray(r.variables)?r.variables:[];if(o.length>Li)throw new Error(`SecurityError: Exceeds MAX_VARIABLES (${Li})`);let a=Array.isArray(r.declarations)?r.declarations:[],u=Array.isArray(r.events)?r.events:[],s=new Map,c=new Map,l=new Map,f=new Map,m=new Map,h=new Map,p=[],d=[],y=new Map,T=1,S=0,b=0,A=0,w=0,P=!1,N=!1,I=!1;o.forEach((F,H)=>{if(!F||typeof F!="object")return;let E=Ze(xs(F.value));s.set(H,E);let V=F.id??F.name;typeof V=="string"&&V&&!pt.has(V)&&s.set(V,E)}),(n?.nodes||[]).forEach((F,H)=>{for(let E of F?.children||[])typeof E=="number"&&y.set(E,H)});let _=F=>F.op||typeof F.declaration=="number"&&a[F.declaration]?.op||"",v=(F,H,E)=>{if(pt.has(H))return;let V=c.get(F);V||c.set(F,V=Object.create(null)),V[H]=E},g=(F,H)=>{if(typeof F!="number"&&typeof F!="string"||typeof F=="string"&&pt.has(F)||!s.has(F)&&s.size>=Li*2)return;let E=Ze(H);if(s.set(F,E),typeof F=="number"){let V=o[F]?.id??o[F]?.name;typeof V=="string"&&!pt.has(V)&&s.set(V,E)}},M=F=>typeof F=="number"?u[F]?.id??String(F):typeof F=="string"?/^\d+$/.test(F)&&u[Number(F)]?.id?u[Number(F)].id:F:"",k=(F,H)=>{for(let E=F,V=0;E!==void 0&&E>=0&&V<128;E=y.get(E),V++)if(E===H)return!0;return!1},R=F=>{for(let H=p.length-1;H>=0;H--)p[H].key===F&&p.splice(H,1)},B=F=>{R(F.key),p.length>=Ya&&p.shift(),p.push(F)},Z=F=>{let H=Rn(F)?.segments;if(H){if(H[0]==="nodes"&&Array.isArray(n?.nodes)){let E=n.nodes[tn(H[1],n.nodes.length)];if(!E)return;let V=H[2];if(V in _r){let O=_r[V],U=E[V]||O;return O.map((G,K)=>le(U[K],G))}if(V==="weights"){let O=Array.isArray(E.weights)?E.weights:[0],U=H.length===4?tn(H[3],64):-2;return U===-2?O.map(G=>le(G)):U>=0?le(O[U]):void 0}if(V==="visible"||V==="extensions"&&H[3]==="KHR_node_visibility"&&H[4]==="visible")return E.extensions?.KHR_node_visibility?.visible??E.visible??!0}else if(H[0]==="materials"&&Array.isArray(n?.materials)){let E=n.materials[tn(H[1],n.materials.length)];if(!E)return;let V=E.pbrMetallicRoughness||{};if(H[2]==="pbrMetallicRoughness"){if(H[3]==="baseColorFactor"){let O=V.baseColorFactor||[1,1,1,1];return[le(O[0],1),le(O[1],1),le(O[2],1),le(O[3],1)]}if(H[3]==="metallicFactor"||H[3]==="roughnessFactor")return le(V[H[3]],1)}if(H[2]==="emissiveFactor"){let O=E.emissiveFactor||[0,0,0];return[le(O[0]),le(O[1]),le(O[2])]}if(H[2]==="alphaCutoff")return le(E.alphaCutoff,.5)}}},j=(F,H)=>{let E=Rn(F)?.segments;if(!E)return!1;if(E[0]==="nodes"&&Array.isArray(n?.nodes)){let V=tn(E[1],n.nodes.length),O=n.nodes[V];if(!O)return!1;let U=E[2];if(U in _r&&Array.isArray(H)){let G=_r[U];if(H.length<G.length)return!1;let K=G.map((re,D)=>le(H[D],re));if(U==="rotation"){let re=Math.hypot(...K);K=re>1e-8?K.map(D=>D/re):[0,0,0,1]}O[U]=K,delete O.matrix;let ue=t?.initialNodeTransforms?.[V];return ue&&(ue[U[0]]=[...K]),P=!0,!0}if(U==="weights"){Array.isArray(O.weights)||(O.weights=[]);let G=(K,ue)=>{for(let re of t?.meshes||[])if(re.nodeIndex===V)for(let D of re.primitives||[])D.pluginData?.morph?.weights&&(D.pluginData.morph.weights[K]=ue)};if(E.length===4){let K=tn(E[3],64);if(K<0)return!1;G(K,O.weights[K]=le(H))}else if(Array.isArray(H))O.weights=H.slice(0,64).map(K=>le(K)),O.weights.forEach((K,ue)=>G(ue,K));else return!1;return I=!0,!0}if(U==="visible"||U==="extensions"&&E[3]==="KHR_node_visibility"&&E[4]==="visible"){let G=tt(H);return O.visible=G,(!O.extensions||typeof O.extensions!="object")&&(O.extensions={}),O.extensions.KHR_node_visibility={visible:G},N=!0,!0}}else if(E[0]==="materials"&&Array.isArray(n?.materials)){let V=tn(E[1],n.materials.length),O=n.materials[V];if(!O)return!1;let U=O.pbrMetallicRoughness||(O.pbrMetallicRoughness={}),G=K=>{for(let ue of t?.meshes||[])for(let re of ue.primitives||[])(re.materialIndex??0)===V&&K(re)};if(E[2]==="pbrMetallicRoughness"){if(E[3]==="baseColorFactor"&&Array.isArray(H)&&H.length>=3){let K=[Ft(le(H[0],1)),Ft(le(H[1],1)),Ft(le(H[2],1)),H[3]!==void 0?Ft(le(H[3],1)):U.baseColorFactor?.[3]??1];return U.baseColorFactor=K,G(ue=>ue.baseColor=[...K]),I=!0}if(E[3]==="metallicFactor"||E[3]==="roughnessFactor"){let K=E[3]==="metallicFactor",ue=Ft(le(H,K?0:.5));return U[E[3]]=ue,G(re=>re[K?"metallic":"roughness"]=ue),I=!0}}if(E[2]==="emissiveFactor"&&Array.isArray(H)&&H.length>=3)return O.emissiveFactor=[0,1,2].map(K=>Math.max(0,le(H[K]))),I=!0;if(E[2]==="alphaCutoff")return O.alphaCutoff=Ft(le(H,.5)),I=!0}return!1},ie=(F,H,E=new Set)=>{let V=Pe(H,"pointer");if(typeof V!="string"||!V.startsWith("/"))return null;let O=V.replace(/\{([a-zA-Z0-9_]+)\}/g,(U,G)=>{let K=Math.trunc(Number(ee(F,G,void 0,E)??Pe(H,G)));return Number.isSafeInteger(K)&&K>=0?String(K):"-1"});return Rn(O)?O:null},ee=(F,H,E,V)=>{let O=i[F]?.values;if(!Ir(O,H))return E;let U=O[H];if(U==null)return E;if(typeof U!="object"||Array.isArray(U))return Ze(U);let G=U;return typeof G.node=="number"?ne(G.node,G.socket||"value",V):Ir(G,"value")?Ze(G.value):E},ne=(F,H,E)=>{if(F<0||F>=i.length||E.has(F)||E.size>128||++A>Za)return;let V=i[F],O=_(V);if(/^(event\/|pointer\/on|scene\/on|flow\/)/.test(O))return Ze(c.get(F)?.[H]);E.add(F);try{let U=(G,K=0)=>ee(F,G,K,E);if(O==="variable/get"){let G=Pe(V,"variable")??Pe(V,"id");return typeof G=="number"||typeof G=="string"?Ze(s.get(G)):void 0}if(O==="pointer/get"){let G=ie(F,V,E);return G?Z(G):void 0}if(O.startsWith("math/")){let G=O.slice(5);if(G in ds)return Ja(U("a"),ds[G]);if(G in ps){let K=/^(mul|div|rem|mod|pow)$/.test(G)?1:0;return Pi(U("a",G==="mul"?1:0),U("b",K),ps[G])}if(G==="pi")return Math.PI;if(G==="e")return Math.E;if(G==="random")return Math.random();if(G==="clamp")return Pi(Pi(U("a"),U("b",U("min",0)),Math.max),U("c",U("max",1)),Math.min);if(G==="mix"||G==="quatSlerp")return ys(U("a",0),U("b",1),le(U("c",U("t",.5)),.5),G==="quatSlerp");if(G==="dot"){let K=U("a"),ue=U("b");return Array.isArray(K)&&Array.isArray(ue)?K.reduce((re,D,x)=>re+(D||0)*(ue[x]||0),0):le(K)*le(ue)}if(G==="cross"){let K=U("a",[0,0,0]),ue=U("b",[0,0,0]);return Array.isArray(K)&&Array.isArray(ue)?[(K[1]||0)*(ue[2]||0)-(K[2]||0)*(ue[1]||0),(K[2]||0)*(ue[0]||0)-(K[0]||0)*(ue[2]||0),(K[0]||0)*(ue[1]||0)-(K[1]||0)*(ue[0]||0)]:[0,0,0]}if(G==="length"){let K=U("a");return Array.isArray(K)?Math.hypot(...K):Math.abs(le(K))}if(G==="distance"){let K=U("a"),ue=U("b");return Array.isArray(K)&&Array.isArray(ue)?Math.hypot(...K.map((re,D)=>(re||0)-(ue[D]||0))):Math.abs(le(K)-le(ue))}if(G==="normalize"){let K=U("a");if(!Array.isArray(K))return le(K)>=0?1:-1;let ue=Math.hypot(...K);return ue>1e-8?K.map(re=>re/ue):K.map(()=>0)}if(G.startsWith("combine"))return["a","b","c","d"].slice(0,Number(G[7])||2).map(K=>le(U(K)));if(G.startsWith("extract")){let K=U("a");return Array.isArray(K)?K[H==="0"||H==="x"?0:H==="1"||H==="y"?1:H==="2"||H==="z"?2:3]??0:0}if(G==="eq")return gs(U("a"),U("b"));if(G==="ne")return!gs(U("a"),U("b"));if(G==="lt")return le(U("a"))<le(U("b"));if(G==="le")return le(U("a"))<=le(U("b"));if(G==="gt")return le(U("a"))>le(U("b"));if(G==="ge")return le(U("a"))>=le(U("b"));if(G==="isNaN")return Number.isNaN(Number(U("a")));if(G==="isInf"){let K=Number(U("a"));return!Number.isFinite(K)&&!Number.isNaN(K)}return G==="and"?tt(U("a",!1))&&tt(U("b",!1)):G==="or"?tt(U("a",!1))||tt(U("b",!1)):G==="xor"?tt(U("a",!1))!==tt(U("b",!1)):G==="not"?!tt(U("a",!1)):G==="select"?Ze(tt(U("condition",!1))?U("a"):U("b")):void 0}return O==="type/boolToInt"||O==="type/boolToFloat"?tt(U("a",!1))?1:0:O==="type/intToBool"||O==="type/floatToBool"?le(U("a",0))!==0:O==="type/intToFloat"?le(U("a",0)):O==="type/floatToInt"?Math.trunc(le(U("a",0))):void 0}finally{E.delete(F)}},X=()=>{if(P){P=!1,I=!0;let F=ft(n);if(t){t.worldMatrices=F;for(let H of t.meshes||[])H.nodeIndex>=0&&H.nodeIndex<F.length&&(H.transform.set(F[H.nodeIndex]),De(H.normalMatrix,H.transform))}}if(N){N=!1,I=!0;let F=n?.nodes;if(Array.isArray(t?.meshes)&&Array.isArray(F))for(let H of t.meshes){let E=!0;for(let V=H.nodeIndex,O=0;V!==void 0&&V>=0&&O<128;V=y.get(V),O++){let U=F[V];if(U?.visible===!1||U?.extensions?.KHR_node_visibility?.visible===!1){E=!1;break}}H.visible=E}}I&&(I=!1,t?.render?.())},ae=(F,H={steps:0})=>{if(!F||typeof F.node!="number")return;H.steps===0&&(A=0);let E=[F],V=O=>{E.length+H.steps<Rr&&E.push(O)};for(;E.length>0&&H.steps<Rr;){H.steps++;let O=E.shift();if(!O||O.node<0||O.node>=i.length)continue;let U=O.node,G=i[U];if(!G)continue;let K=O.socket||"in",ue=_(G),re=(x,C=void 0)=>ee(U,x,C,new Set),D=(x="out")=>{let C=G.flows?.[x];C&&V(C)};switch(ue){case"flow/branch":D(tt(re("condition",!1))?"true":"false");break;case"flow/sequence":for(let x of Object.keys(G.flows||{}).sort((C,L)=>Number(C)-Number(L)||C.localeCompare(L)))D(x);break;case"flow/switch":{let x=G.flows?.[String(re("selection",re("value",0)))]??G.flows?.default;x&&V(x);break}case"flow/for":{let x=Math.trunc(le(re("startIndex",0))),C=Math.trunc(le(re("endIndex",0))),L=Math.max(1,Math.trunc(le(re("step",1),1))),z=G.flows?.body;if(z&&C>x&&w<Qa){let $=Math.min(Math.ceil((C-x)/L),Rr);w++;try{for(let Y=0;Y<$&&H.steps<Rr;Y++)v(U,"index",x+Y*L),ae(z,H)}finally{w--}}let W=G.flows?.completed??G.flows?.out;W&&V(W);break}case"flow/doN":{let x=K==="reset"?0:(l.get(U)||0)+1;if(l.set(U,x),v(U,"currentCount",x),v(U,"count",x),K!=="reset"){let C=Math.trunc(le(re("n",Pe(G,"stopIterations")??Pe(G,"n")??1),1));x<=C&&D()}break}case"flow/multiGate":{if(K==="reset"){h.set(U,0);break}let x=Object.keys(G.flows||{}).sort();if(!x.length)break;let C=Pe(G,"isRandom")?Math.floor(Math.random()*x.length):h.get(U)||0;C<x.length&&(D(x[C]),h.set(U,Pe(G,"isLoop")!==!1?(C+1)%x.length:C+1));break}case"flow/waitAll":{if(K==="reset"){f.delete(U);break}let x=f.get(U);x||f.set(U,x=new Set),x.add(K),x.size>=Math.max(1,Math.trunc(Number(Pe(G,"inputFlows")??2)||2))&&(x.clear(),D("out"),D("completed"));break}case"flow/throttle":{if(K==="reset"){m.delete(U);break}let x=Math.max(0,le(re("duration",0))),C=m.get(U);C===void 0||S-C>=x?(m.set(U,S),v(U,"lastRemainingTime",0),D()):v(U,"lastRemainingTime",Math.max(0,x-(S-C)));break}case"flow/delay":case"flow/setDelay":{if(K==="cancel"){for(let z=d.length-1;z>=0;z--)d[z].nodeIdx===U&&d.splice(z,1);v(U,"lastDelayIndex",-1);break}let x=Math.max(0,le(re("duration",Pe(G,"duration")??0))),C=G.flows?.done??G.flows?.out;if(x<=0){v(U,"lastDelayIndex",-1),C&&V(C);break}d.length>=ja&&d.shift();let L=T++;v(U,"lastDelayIndex",L),d.push({id:L,nodeIdx:U,rem:x,done:C}),ue==="flow/setDelay"&&G.flows?.out&&G.flows?.done&&D("out");break}case"flow/cancelDelay":{let x=Math.trunc(le(re("delayIndex",-1),-1));if(x<0)d.length=0;else for(let C=d.length-1;C>=0;C--)d[C].id===x&&d.splice(C,1);D();break}case"variable/set":g(Pe(G,"variable")??Pe(G,"id"),re("value")),D();break;case"variable/interpolate":{let x=Pe(G,"variable")??Pe(G,"id"),C=re("value",re("target")),L=Math.max(0,le(re("duration",Pe(G,"duration")??.3),.3));x!==void 0&&C!==void 0&&B({key:`var:${String(x)}`,varKey:x,from:Ze(re("from")??s.get(x)??0),to:Ze(C),dur:L,elapsed:0,quat:!1,linear:Pe(G,"easing")==="linear",done:G.flows?.done}),D();break}case"pointer/set":{let x=ie(U,G),C=re("value");x&&C!==void 0&&(R(`ptr:${x}`),j(x,C)),D();break}case"pointer/interpolate":{let x=ie(U,G),C=re("value",re("target")),L=Math.max(0,le(re("duration",Pe(G,"duration")??.3),.3));if(x&&C!==void 0){let z=re("from")??Z(x);z!==void 0&&(L<=0?(j(x,C),D("done")):B({key:`ptr:${x}`,ptr:x,from:Ze(z),to:Ze(C),dur:L,elapsed:0,quat:x.endsWith("/rotation"),linear:Pe(G,"easing")==="linear",done:G.flows?.done}))}D();break}case"animation/start":{let x=re("animation")??Pe(G,"animation")??Pe(G,"clipName"),C=typeof x=="number"?t?.animations?.[x]?.name??n?.animations?.[x]?.name:typeof x=="string"?x:void 0;t?.playAnimation?.(C),I=!0,D();break}case"animation/stop":case"animation/resetAt":t?.pauseAnimation?.(),ue==="animation/resetAt"&&t?.evaluateAnimation?.(le(re("time",0))),I=!0,D();break;case"event/send":case"customEvent/send":{let x=M(Pe(G,"event")??Pe(G,"id")),C={};for(let L of Object.keys(G.values||{}))pt.has(L)||(C[L]=re(L));x&&(typeof CustomEvent<"u"&&typeof t?.container?.dispatchEvent=="function"&&t.container.dispatchEvent(new CustomEvent("interactivityEvent",{bubbles:!0,composed:!0,detail:{id:x,values:C}})),se(x,C,H)),D();break}default:D();break}}};this.readScenePointer=Z,this.writeScenePointer=j,this.fireOnStart=()=>{i.forEach(F=>{_(F)==="event/onStart"&&ae(F.flows?.out)}),X()},this.fireOnSelect=F=>{if(!F)return;let H=typeof F.meshIndex=="number"?F.meshIndex:-1,E=typeof F.nodeIndex=="number"?F.nodeIndex:t?.meshes?.[H]?.nodeIndex??-1;i.forEach((V,O)=>{if(!/^(pointer|event|scene)\/onSelect$/.test(_(V)))return;let U=Pe(V,"nodeIndex")??Pe(V,"node")??ee(O,"nodeIndex",void 0,new Set),G=Pe(V,"meshName");if(typeof G=="string"&&G?F.meshName===G:U==null||Number(U)<0||Number.isNaN(Number(U))||k(E,Math.trunc(Number(U)))){if(v(O,"nodeIndex",E),v(O,"meshIndex",H),Array.isArray(F.hitPoint)){let ue=[le(F.hitPoint[0]),le(F.hitPoint[1]),le(F.hitPoint[2])];v(O,"hitPoint",ue),v(O,"point",ue),v(O,"intersectionPoint",ue)}if(Array.isArray(F.normal)){let ue=[le(F.normal[0]),le(F.normal[1],1),le(F.normal[2])];v(O,"normal",ue),v(O,"hitNormal",ue)}typeof F.distance=="number"&&v(O,"distance",F.distance),ae(V.flows?.out)}}),X()},this.receiveCustomEvent=(F,H={})=>se(F,H,{steps:0});function se(F,H,E){if(!(b>=Ka)){b++;try{let V=M(F);i.forEach((O,U)=>{if(!/^(customE|e)vent\/receive$/.test(_(O)))return;let G=Pe(O,"event")??Pe(O,"id");if(!(M(G)!==V&&String(G)!==String(F))){for(let[K,ue]of Object.entries(H))pt.has(K)||v(U,K,Ze(ue));ae(O.flows?.out,E)}}),X()}finally{b--}}}this.tick=F=>{if(!Number.isFinite(F)||F<0)return;let H=Math.min(F,.25);S+=H,i.forEach((V,O)=>{_(V)==="event/onTick"&&(v(O,"timeDelta",H),v(O,"dt",H),v(O,"timeElapsed",S),ae(V.flows?.out))});let E=[];for(let V=p.length-1;V>=0;V--){let O=p[V];O.elapsed+=H;let U=O.dur>1e-6?Ft(O.elapsed/O.dur):1,G=O.linear?U:U*U*(3-2*U),K=ys(O.from,O.to,G,O.quat);O.ptr?j(O.ptr,K):O.varKey!==void 0&&g(O.varKey,K),U>=1&&(p.splice(V,1),O.done&&E.push(O.done))}for(let V=d.length-1;V>=0;V--){let O=d[V];O.rem-=H,O.rem<=0&&(d.splice(V,1),O.done&&E.push(O.done))}for(let V of E)ae(V);X()},this.dispose=()=>{p.length=0,d.length=0,s.clear(),c.clear(),l.clear(),f.clear(),m.clear(),h.clear()}}},ct=new WeakMap,Cr=new WeakMap;function ec(e,t){if(!e||typeof e!="object"||!Number.isFinite(t)||t<=0||kn().some(s=>s.name==="xr-live-head-follow")||(typeof e.getAutoRotate=="function"?e.getAutoRotate():e.autoRotate)===!1)return;let r=e.gltf,i=r?.nodes;if(!Array.isArray(i)||i.length===0)return;let o=Math.min(t,.1),a=(Cr.get(e)||0)+o,u=!1;for(let s=0;s<i.length;s++){let c=i[s],l=Fo(c?.extras?.xr?.orbit);if(!l)continue;let f=0,m=0,h=0;if(Array.isArray(l.target))f=l.target[0],m=l.target[1],h=l.target[2];else if(typeof l.target=="string"&&l.target!=="head"){let S=i.find(b=>b?.name===l.target);Array.isArray(S?.translation)&&(f=le(S.translation[0]),m=le(S.translation[1]),h=le(S.translation[2]))}let p=l.phase+l.speed*a,d=f+Math.cos(p)*l.radius,y=m+l.height,T=h+Math.sin(p)*l.radius;if(c.translation=[d,y,T],l.faceCenter){let S=Math.atan2(f-d,h-T);c.rotation=[0,Math.sin(S*.5),0,Math.cos(S*.5)]}u=!0}if(u){Cr.set(e,a);let s=ft(r);e.worldMatrices=s;for(let c of e.meshes||[])c.nodeIndex>=0&&c.nodeIndex<s.length&&(c.transform.set(s[c.nodeIndex]),De(c.normalMatrix,c.transform))}}function Lr(e){if(!(!e||typeof e!="object"))return ct.get(e)||ct.get(e.viewer)||ct.get(e._view)}function Di(e,t,n){let r=Lr(e);return r?(r.receiveCustomEvent(t,n),!0):!1}var Ni={name:"khr-interactivity",sendInteractivityEvent:Di,getInteractivityVM:Lr,onLoadModel(e,t){if(!e||typeof e!="object")return;ct.get(e)?.dispose(),ct.delete(e),Cr.delete(e);let n=t?.extensions?.KHR_interactivity,r=Array.isArray(n?.graphs)?n.graphs[n.graph??0]:n;if(!r||!Array.isArray(r.nodes))return;let i=new _n(e,t,r);ct.set(e,i),i.fireOnStart()},onMeshSelect(e,t){ct.get(e)?.fireOnSelect(t)},onUpdate(e,t){ct.get(e)?.tick(t),ec(e,t)},onDestroy(e,t){ct.get(t)?.dispose(),ct.delete(t),Cr.delete(t)}};var In=new Map,Pr=new WeakMap;function vs(e,t){In.set(e,t)}var ki={name:"materials",onContextRestored(e){Pr.delete(e)},onBuildPrimitiveVAO(e,t,n,r,i){return(((r?.materials&&n.material!==void 0?r.materials[n.material]:null)?.extensions||{}).KHR_materials_transmission?.transmissionFactor??0)>0?{isTransmissive:!0}:null},onBeforeTransmissivePass(e,t){let n=Pr.get(e);n||(n=e.createTexture(),Pr.set(e,n));let r=Math.max(1,t.canvas.width),i=Math.max(1,t.canvas.height);e.activeTexture(33990),e.bindTexture(3553,n),e.copyTexImage2D(3553,0,6408,0,0,r,i,0),e.texParameteri(3553,10242,33071),e.texParameteri(3553,10243,33071),e.texParameteri(3553,10241,9987),e.texParameteri(3553,10240,9729),e.generateMipmap(3553)},onResolveShader(e,t,n,r){if(!t)return null;if(t.name&&In.has(t.name)){let p=In.get(t.name);return{vs:p.vs||n,fs:p.fs||r}}let i=t.extensions||{},o=i.KHR_materials_clearcoat,a=i.KHR_materials_sheen,u=!!i.KHR_materials_transmission,s=!!i.KHR_materials_ior,c=i.KHR_materials_iridescence;if(!o&&!a&&!i.KHR_materials_unlit&&!u&&!i.KHR_materials_volume&&!s&&!i.KHR_materials_dispersion&&!c)return null;if(i.KHR_materials_unlit)return{vs:n,fs:r.replace("fragColor=vec4(color,outAlpha);","fragColor=vec4(base.rgb,outAlpha);").replace("fragColor=vec4(color,base.a);","fragColor=vec4(base.rgb,base.a);")};let l=r;if(u){let p=l.includes("uniform vec2 uViewportSize;")?"":`uniform vec2 uViewportSize;
|
|
345
363
|
`;l=l.replace("out vec4 fragColor;",`uniform sampler2D uTransmissionTex;
|
|
346
|
-
${
|
|
347
|
-
vec2 sUV=gl_FragCoord.xy/max(uViewportSize,vec2(1.));float iorB=${
|
|
364
|
+
${p}out vec4 fragColor;`)}let f=(p,d,y=0,T=1e6,S=3)=>{let b=Number(p);return(Number.isFinite(b)?Math.min(T,Math.max(y,b)):d).toFixed(S)},m=Number(i.KHR_materials_ior?.ior??1.5),h=Number.isFinite(m)?Math.min(10,Math.max(1,m)):1.5;if(s){let p=Math.pow((h-1)/(h+1),2);l=l.replace("vec3 F0=mix(vec3(0.04),base.rgb,metallic);",`vec3 F0=mix(vec3(${f(p,.04,0,1,4)}),base.rgb,metallic);`)}if(c){let p=f(c.iridescenceFactor,1,0,1),d=f(c.iridescenceIor,1.3,1,10);l=l.replace("vec3 F=F_SchlickRoughness(F0,roughness,NoV);",`vec3 F=F_SchlickRoughness(F0,roughness,NoV);vec3 iridColor=.5+.5*cos(800.*${d}*NoV*vec3(.015,.018,.022));F=mix(F,iridColor,${p}*pow(1.-NoV,2.));`)}if(u){let p=f(i.KHR_materials_transmission?.transmissionFactor,1,0,1),d=i.KHR_materials_volume||{},y=f(d.thicknessFactor,.5,0,1e4),T=f(d.attenuationDistance,1,.001,1e6),S=Array.isArray(d.attenuationColor)?d.attenuationColor:[1,1,1],b=f(i.KHR_materials_dispersion?.dispersion,0,0,10);l=l.replace("vec3 diffuseIBL=kD*base.rgb*(uAmbientColor+envDiffuse*0.5)*occ;",`vec3 diffuseIBL=kD*base.rgb*(uAmbientColor+envDiffuse*0.5)*occ;
|
|
365
|
+
vec2 sUV=gl_FragCoord.xy/max(uViewportSize,vec2(1.));float iorB=${f(h,1.5,1,10)},dV=${b},tV=${y},lod=clamp(roughness*5.,0.,5.),sc=.06*(1.+tV);
|
|
348
366
|
vec3 refractedR=refract(-V,N,1./(iorB-.02*dV)),rG=refract(-V,N,1./iorB),refractedB=refract(-V,N,1./(iorB+.02*dV));
|
|
349
367
|
vec3 tr=vec3(textureLod(uTransmissionTex,clamp(sUV+refractedR.xy*sc,.001,.999),lod).r,textureLod(uTransmissionTex,clamp(sUV+rG.xy*sc,.001,.999),lod).g,textureLod(uTransmissionTex,clamp(sUV+refractedB.xy*sc,.001,.999),lod).b);
|
|
350
|
-
vec3 aCol=vec3(${
|
|
351
|
-
vec3 volumeAtten=exp(-tV*(vec3(1.)-aCol)/max(${
|
|
352
|
-
diffuseIBL=mix(diffuseIBL,tr*volumeAtten*base.rgb,${b});`)}if(o&&!r.includes("uClearcoat")){let b=m(o.clearcoatFactor,1,0,1),d=m(o.clearcoatRoughnessFactor,0,0,1);l=l.replace("fragColor=vec4(color,base.a);",`vec3 ccF=F_SchlickRoughness(vec3(.04),${d},NoV)*${b};color=color*(vec3(1.)-ccF)+getStudioRadiance(R,${d})*ccF;fragColor=vec4(color,base.a);`)}if(s){let b=Array.isArray(s.sheenColorFactor)?s.sheenColorFactor:[1,1,1],d=`color+=vec3(${m(b[0],1,0,1)},${m(b[1],1,0,1)},${m(b[2],1,0,1)})*pow(1.-NoV,4.)*.5;`;l.includes("color=applyToneMapping(color,uToneMapping);")?l=l.replace("color=applyToneMapping(color,uToneMapping);",`${d}color=applyToneMapping(color,uToneMapping);`):l=l.replace("fragColor=vec4(color,base.a);",`${d}fragColor=vec4(color,base.a);`)}return{vs:n,fs:l}},onBeforeDrawPrimitive(t,e,n,r,i,o){let s=n.materialIndex;if(s!==void 0&&o?.materials){let c=o.materials[s];c?.name&&pn.has(c.name)&&pn.get(c.name).onBindUniforms?.(t,e,n)}if(n.isTransmissive){let c=di.get(t);if(c){t.activeTexture(33990),t.bindTexture(3553,c);let a=t.getUniformLocation(e,"uTransmissionTex");a&&t.uniform1i(a,6);let u=t.getUniformLocation(e,"uViewportSize");u&&t.uniform2f(u,t.drawingBufferWidth||1,t.drawingBufferHeight||1)}}}};var $o=64*1024*1024,qo=128*1024*1024,ia=16777216;function oa(t){let e=t<<24>>24;return(e<<1^e>>7)&255}function bi(t){return(t>>>1^-(t&1))&255}function sa(t){return(t<<1^t>>31)>>>0}function aa(t){return t>>>1^-(t&1)}function gr(t,e,n,r="NONE"){if(!r||r==="NONE"||e<=0)return;let i=new DataView(t.buffer,t.byteOffset,t.byteLength);if(r==="OCTAHEDRAL"){if(n!==4&&n!==8)throw new Error(`EXT_meshopt_compression: OCTAHEDRAL filter requires byteStride 4 or 8 (got ${n})`);let o=n===4?127:32767;for(let s=0;s<e;s++){let c=s*n,a=n===4?i.getInt8(c):i.getInt16(c,!0),u=n===4?i.getInt8(c+1):i.getInt16(c+2,!0),l=n===4?i.getInt8(c+2):i.getInt16(c+4,!0),m=l===0?1:l,f=a/m,h=u/m,b=1-Math.abs(f)-Math.abs(h),d=Math.max(-b,0);f+=f>=0?-d:d,h+=h>=0?-d:d;let p=Math.hypot(f,h,b)||1,E=Math.max(-o,Math.min(o,Math.round(f/p*o))),A=Math.max(-o,Math.min(o,Math.round(h/p*o))),x=Math.max(-o,Math.min(o,Math.round(b/p*o)));n===4?(i.setInt8(c,E),i.setInt8(c+1,A),i.setInt8(c+2,x)):(i.setInt16(c,E,!0),i.setInt16(c+2,A,!0),i.setInt16(c+4,x,!0))}return}if(r==="QUATERNION"){if(n!==8)throw new Error(`EXT_meshopt_compression: QUATERNION filter requires byteStride 8 (got ${n})`);for(let o=0;o<e;o++){let s=o*8,c=i.getInt16(s,!0),a=i.getInt16(s+2,!0),u=i.getInt16(s+4,!0),l=i.getInt16(s+6,!0),m=l&3,f=l|3,h=Math.SQRT1_2/(f===0?1:f),b=c*h,d=a*h,p=u*h,E=Math.sqrt(Math.max(0,1-b*b-d*d-p*p)),A=Math.hypot(b,d,p,E)||1,x=[0,0,0,0];x[m+1&3]=Math.max(-32767,Math.min(32767,Math.round(b/A*32767))),x[m+2&3]=Math.max(-32767,Math.min(32767,Math.round(d/A*32767))),x[m+3&3]=Math.max(-32767,Math.min(32767,Math.round(p/A*32767))),x[m]=Math.max(-32767,Math.min(32767,Math.round(E/A*32767))),i.setInt16(s,x[0],!0),i.setInt16(s+2,x[1],!0),i.setInt16(s+4,x[2],!0),i.setInt16(s+6,x[3],!0)}return}if(r==="EXPONENTIAL"){if(n<4||n%4!==0)throw new Error(`EXT_meshopt_compression: EXPONENTIAL filter requires byteStride multiple of 4 (got ${n})`);let o=e*n>>>2;for(let s=0;s<o;s++){let c=s*4,a=i.getInt32(c,!0),u=a>>24,l=a<<8>>8,m=Math.pow(2,u)*l;i.setFloat32(c,m,!0)}}}function Yo(t){let e=Math.floor(8192/t)&-16;return e<32?32:e>256?256:e}function yi(t,e,n,r,i="NONE"){if(!Number.isInteger(e)||e<0||e>ia||!Number.isInteger(n)||n<=0||n>256)throw new Error(`EXT_meshopt_compression: invalid count (${e}) or byteStride (${n})`);let o=e*n;if(o>$o)throw new Error(`EXT_meshopt_compression: decompressed size (${o}) exceeds MAX_MESHOPT_BUFFER_BYTES (${$o})`);if(e===0)return new Uint8Array(0);let s=new Uint8Array(o),c=t.length>0?t[0]:0;if(r==="ATTRIBUTES"){if(n%4!==0)throw new Error(`EXT_meshopt_compression: ATTRIBUTES byteStride must be a multiple of 4 (got ${n})`);if(c!==160){if(t.byteLength===o)return s.set(t),gr(s,e,n,i),s;throw new Error(`EXT_meshopt_compression: unsupported ATTRIBUTES header 0x${c.toString(16)}`)}if(t.byteLength<1+n)throw new Error("EXT_meshopt_compression: truncated ATTRIBUTES stream");let a=t.byteLength-n,u=new Uint8Array(n);u.set(t.subarray(a,a+n));let l=Yo(n),m=1,f=0;for(;f<e;){let h=Math.min(e-f,l),b=h+15>>>4,d=b+3>>>2;for(let p=0;p<n;p++){if(m+d>a)throw new Error("EXT_meshopt_compression: truncated ATTRIBUTES control header");let E=m;m+=d;let A=u[p];for(let x=0;x<b;x++){let R=t[E+(x>>>2)]>>>(x&3)*2&3,I=x*16,P=Math.min(16,h-I);if(R===0)for(let k=0;k<P;k++)s[(f+I+k)*n+p]=A;else if(R===1){if(m+4>a)throw new Error("EXT_meshopt_compression: truncated ATTRIBUTES 2-bit group");for(let k=0;k<16;k++){let S=t[m+(k>>>2)]>>>(k&3)*2&3;A=A+bi(S)&255,k<P&&(s[(f+I+k)*n+p]=A)}m+=4}else if(R===2){if(m+8>a)throw new Error("EXT_meshopt_compression: truncated ATTRIBUTES 4-bit group");for(let k=0;k<16;k++){let S=t[m+(k>>>1)]>>>(k&1)*4&15;A=A+bi(S)&255,k<P&&(s[(f+I+k)*n+p]=A)}m+=8}else{if(m+16>a)throw new Error("EXT_meshopt_compression: truncated ATTRIBUTES 8-bit group");for(let k=0;k<16;k++){let D=t[m+k];A=A+bi(D)&255,k<P&&(s[(f+I+k)*n+p]=A)}m+=16}}u[p]=A}f+=h}return gr(s,e,n,i),s}if(r==="TRIANGLES"||r==="INDICES"){if(n!==2&&n!==4)throw new Error(`EXT_meshopt_compression: ${r} byteStride must be 2 or 4 (got ${n})`);if(r==="TRIANGLES"&&e%3!==0)throw new Error(`EXT_meshopt_compression: TRIANGLES count must be divisible by 3 (got ${e})`);let a=r==="TRIANGLES"?176:192;if((c&240)!==a){if(t.byteLength===o)return s.set(t),s;throw new Error(`EXT_meshopt_compression: unsupported ${r} header 0x${c.toString(16)}`)}let u=new DataView(s.buffer,s.byteOffset,s.byteLength),l=1,m=0;for(let f=0;f<e;f++){let h=0,b=0;for(;;){if(l>=t.byteLength)throw new Error(`EXT_meshopt_compression: truncated ${r} stream`);let d=t[l++];if(h|=(d&127)<<b,!(d&128))break;if(b+=7,b>28)throw new Error(`EXT_meshopt_compression: varint overflow in ${r}`)}m=m+aa(h)>>>0,n===2?u.setUint16(f*2,m&65535,!0):u.setUint32(f*4,m,!0)}return s}throw new Error(`EXT_meshopt_compression: unknown mode "${String(r)}"`)}function jo(t,e,n,r){let i=e*n;if(t.byteLength<i)throw new Error(`encodeMeshoptBuffer: raw buffer (${t.byteLength}) smaller than count * byteStride (${i})`);if(e===0)return new Uint8Array([r==="ATTRIBUTES"?160:176]);if(r==="ATTRIBUTES"){let a=Yo(n),u=[160],l=new Uint8Array(n),m=0;for(;m<e;){let f=Math.min(e-m,a),h=f+15>>>4,b=h+3>>>2;for(let d=0;d<n;d++){let p=new Uint8Array(b),E=[],A=l[d];for(let x=0;x<h;x++){let R=x*16,I=Math.min(16,f-R),P=new Uint8Array(16),k=0;for(let S=0;S<16;S++)if(S<I){let _=t[(m+R+S)*n+d],v=_-A<<24>>24,G=oa(v);P[S]=G,G>k&&(k=G),A=_}else P[S]=0;let D=0;if(k===0)D=0;else if(k<=3){D=1;for(let S=0;S<16;S+=4)E.push(P[S]&3|(P[S+1]&3)<<2|(P[S+2]&3)<<4|(P[S+3]&3)<<6)}else if(k<=15){D=2;for(let S=0;S<16;S+=2)E.push(P[S]&15|(P[S+1]&15)<<4)}else{D=3;for(let S=0;S<16;S++)E.push(P[S])}p[x>>>2]|=D<<(x&3)*2}for(let x=0;x<p.length;x++)u.push(p[x]);for(let x=0;x<E.length;x++)u.push(E[x]);l[d]=A}m+=f}for(let f=0;f<n;f++)u.push(0);return new Uint8Array(u)}let o=new DataView(t.buffer,t.byteOffset,t.byteLength),s=[r==="TRIANGLES"?176:192],c=0;for(let a=0;a<e;a++){let u=n===2?o.getUint16(a*2,!0):o.getUint32(a*4,!0),l=u-c|0;c=u;let m=sa(l);for(;m>=128;)s.push(m&127|128),m>>>=7;s.push(m&127)}return new Uint8Array(s)}function bn(t,e){let n=e&&typeof e=="object"?e:t,r=e&&typeof e=="object"?t:n?.gltf;if(!r||!Array.isArray(r.bufferViews))return;let i=new Uint8Array(n.bin),o=[],s=0;for(let m=0;m<r.bufferViews.length;m++){let h=r.bufferViews[m]?.extensions?.EXT_meshopt_compression;if(!h||typeof h!="object")continue;let b=Number(h.count),d=Number(h.byteStride),p=Number(h.byteOffset??0),E=Number(h.byteLength??0),A=h.mode||"ATTRIBUTES",x=h.filter||"NONE";if(!Number.isInteger(p)||p<0||!Number.isInteger(E)||E<0||p+E>i.byteLength)throw new Error(`EXT_meshopt_compression: bufferView ${m} compressed range [${p}, ${p+E}] out of bounds (${i.byteLength})`);let R=b*d;if(s+=R,s>qo)throw new Error(`EXT_meshopt_compression: total decompressed size (${s}) exceeds MAX_MESHOPT_TOTAL_BYTES (${qo})`);let I=i.subarray(p,p+E),P=yi(I,b,d,A,x);o.push({index:m,bytes:P,ext:h})}if(o.length===0)return;let c=i.byteLength+3&-4,a=0;for(let m of o)a+=m.bytes.byteLength+3&-4;let u=new Uint8Array(c+a);u.set(i,0);let l=c;for(let m of o){u.set(m.bytes,l);let f=r.bufferViews[m.index];f.byteOffset=l,f.byteLength=m.bytes.byteLength,f._decoded=m.bytes,m.ext.mode==="ATTRIBUTES"&&f.byteStride===void 0&&(f.byteStride=Number(m.ext.byteStride)),f.extensions&&delete f.extensions.EXT_meshopt_compression,l+=m.bytes.byteLength+3&-4}n.bin=u.buffer}var xr={decodeBufferViews(t,e){bn(e)},decodePrimitive(t,e,n){let r=e?.extensions;r?.EXT_meshopt_compression&&delete r.EXT_meshopt_compression,bn({gltf:t,bin:n})}};pe().decoders.set("meshopt",xr);var gi={name:"meshopt",onParseGLB(t){pe().decoders.set("meshopt",xr),bn(t)}};var ca=`#version 300 es
|
|
368
|
+
vec3 aCol=vec3(${f(S[0],1,0,1)},${f(S[1],1,0,1)},${f(S[2],1,0,1)});
|
|
369
|
+
vec3 volumeAtten=exp(-tV*(vec3(1.)-aCol)/max(${T},.001));
|
|
370
|
+
diffuseIBL=mix(diffuseIBL,tr*volumeAtten*base.rgb,${p});`)}if(o&&!r.includes("uClearcoat")){let p=f(o.clearcoatFactor,1,0,1),d=f(o.clearcoatRoughnessFactor,0,0,1);l=l.replace("fragColor=vec4(color,base.a);",`vec3 ccF=F_SchlickRoughness(vec3(.04),${d},NoV)*${p};color=color*(vec3(1.)-ccF)+getStudioRadiance(R,${d})*ccF;fragColor=vec4(color,base.a);`)}if(a){let p=Array.isArray(a.sheenColorFactor)?a.sheenColorFactor:[1,1,1],d=`color+=vec3(${f(p[0],1,0,1)},${f(p[1],1,0,1)},${f(p[2],1,0,1)})*pow(1.-NoV,4.)*.5;`;l.includes("color=applyToneMapping(color,uToneMapping);")?l=l.replace("color=applyToneMapping(color,uToneMapping);",`${d}color=applyToneMapping(color,uToneMapping);`):l=l.replace("fragColor=vec4(color,base.a);",`${d}fragColor=vec4(color,base.a);`)}return{vs:n,fs:l}},onBeforeDrawPrimitive(e,t,n,r,i,o){let a=n.materialIndex;if(a!==void 0&&o?.materials){let u=o.materials[a];u?.name&&In.has(u.name)&&In.get(u.name).onBindUniforms?.(e,t,n)}if(n.isTransmissive){let u=Pr.get(e);if(u){e.activeTexture(33990),e.bindTexture(3553,u);let s=e.getUniformLocation(t,"uTransmissionTex");s&&e.uniform1i(s,6);let c=e.getUniformLocation(t,"uViewportSize");c&&e.uniform2f(c,e.drawingBufferWidth||1,e.drawingBufferHeight||1)}}}};var Ts=64*1024*1024,As=128*1024*1024,tc=16777216;function nc(e){return(e>>>1^-(e&1))&255}function rc(e){return(e>>>1^-(e&1))&65535}function ic(e){let t=e<<24>>24;return(t<<1^t>>7)&255}function ws(e){return(e<<1^e>>31)>>>0}function Es(e){if(e!==void 0&&e!=="NONE"&&e!=="OCTAHEDRAL"&&e!=="QUATERNION"&&e!=="EXPONENTIAL"&&e!=="COLOR")throw Me(`unknown filter "${String(e)}"`)}var xe=Math.fround;function nn(e){return Math.trunc(xe(e+(e>=0?.5:-.5)))}function Fi(e,t,n,r="NONE"){if(Es(r),!r||r==="NONE"||t<=0)return;let i=new DataView(e.buffer,e.byteOffset,e.byteLength);if(r==="OCTAHEDRAL"){if(n!==4&&n!==8)throw Me(`OCTAHEDRAL filter requires byteStride 4 or 8 (got ${n})`);let f=n===8,m=f?32767:127,h=y=>f?i.getInt16(y,!0):i.getInt8(y),p=(y,T)=>f?i.setInt16(y,T,!0):i.setInt8(y,T<<24>>24),d=f?2:1;for(let y=0;y<t;y++){let T=y*n,S=h(T),b=h(T+d),A=xe(h(T+2*d)-Math.abs(S)-Math.abs(b)),w=A>=0?0:A;S=xe(S+(S>=0?w:-w)),b=xe(b+(b>=0?w:-w));let P=xe(Math.sqrt(xe(xe(xe(S*S)+xe(b*b))+xe(A*A))));if(P===0){p(T,0),p(T+d,0),p(T+2*d,m);continue}let N=xe(m/P);p(T,nn(xe(S*N))),p(T+d,nn(xe(b*N))),p(T+2*d,nn(xe(A*N)))}return}if(r==="QUATERNION"){if(n!==8)throw Me(`QUATERNION filter requires byteStride 8 (got ${n})`);let f=xe(32767/xe(Math.SQRT2));for(let m=0;m<t;m++){let h=m*8,p=i.getInt16(h+6,!0),d=p|3,y=i.getInt16(h,!0),T=i.getInt16(h+2,!0),S=i.getInt16(h+4,!0),b=xe(d*d),A=xe(xe(xe(xe(b*2)-xe(y*y))-xe(T*T))-xe(S*S)),w=xe(Math.sqrt(A>=0?A:0)),P=xe(f/d),N=p&3,I=[0,0,0,0];I[N+1&3]=nn(xe(y*P)),I[N+2&3]=nn(xe(T*P)),I[N+3&3]=nn(xe(S*P)),I[N]=Math.trunc(xe(xe(w*P)+.5));for(let _=0;_<4;_++)i.setInt16(h+_*2,I[_]<<16>>16,!0)}return}if(r==="EXPONENTIAL"){if(n<4||n%4!==0)throw Me(`EXPONENTIAL filter requires byteStride multiple of 4 (got ${n})`);let f=t*n>>>2;for(let m=0;m<f;m++){let h=m*4,p=i.getUint32(h,!0),d=p<<8>>8,y=p>>24;i.setUint32(h,y+127<<23>>>0,!0);let T=i.getFloat32(h,!0);i.setFloat32(h,xe(T*d),!0)}return}if(n!==4&&n!==8)throw new Error(`KHR_meshopt_compression: COLOR filter requires byteStride 4 or 8 (got ${n})`);let o=n===8,a=o?65535:255,u=f=>o?i.getUint16(f,!0):i.getUint8(f),s=f=>o?i.getInt16(f,!0):i.getInt8(f),c=(f,m)=>o?i.setUint16(f,m&65535,!0):i.setUint8(f,m&255),l=o?2:1;for(let f=0;f<t;f++){let m=f*n,h=u(m+3*l);h|=h>>1,h|=h>>2,h|=h>>4,h|=h>>8;let p=u(m),d=s(m+l),y=s(m+2*l),T=p+d-y,S=p+y,b=p-d-y,A=u(m+3*l);A=A<<1&h|A&1;let w=h===0?0:xe(a/h);c(m,Math.trunc(xe(xe(T*w)+.5))),c(m+l,Math.trunc(xe(xe(S*w)+.5))),c(m+2*l,Math.trunc(xe(xe(b*w)+.5))),c(m+3*l,Math.trunc(xe(xe(A*w)+.5)))}}var Rs=160,ut=16,oc=24,_s=32,sc=24,ac=[0,2,4,8],cc=[0,1,2,4,8];function Is(e){let t=Math.floor(8192/e)&~(ut-1);return t<256?t:256}function Me(e){return new Error(`EXT_meshopt_compression: ${e}`)}function uc(e,t,n,r,i){if(i===0)return n.fill(0,r,r+ut),t;if(i===8)return n.set(e.subarray(t,t+ut),r),t+ut;let o=(1<<i)-1,a=8/i,u=t+ut*i/8;for(let s=0;s<ut;s++){let c=e[t+Math.floor(s/a)],l=s%a,f=i===1?c>>l&1:c>>8-i-l*i&o;n[r+s]=f===o?e[u++]:f}return u}function Ms(e,t,n,r,i,o,a,u){let s=o/ut,c=s+3>>2;if(n-t<c)throw Me("truncated ATTRIBUTES stream");let l=t;t+=c;for(let f=0;f<s;f++){if(n-t<oc)throw Me("truncated ATTRIBUTES stream");let m=e[l+(f>>2)]>>(f&3)*2&3;t=uc(e,t,r,i+f*ut,a[u+m])}return t}function lc(e,t,n,r){if(n%4!==0||n>256)throw Me(`ATTRIBUTES byteStride must be a multiple of 4 and <= 256 (got ${n})`);let i=e.byteLength;if(i<1)throw Me("truncated ATTRIBUTES stream");let o=e[0];if((o&240)!==Rs)throw Me(`unsupported ATTRIBUTES header 0x${o.toString(16)}`);let a=o&15;if(a>1)throw Me(`unsupported ATTRIBUTES codec version ${a}`);let u=n+(a===0?0:n/4),s=a===0?_s:sc,c=u<s?s:u;if(i-1<c)throw Me("truncated ATTRIBUTES stream");let l=i-u,f=e.slice(l,l+n),m=l+n,h=Is(n),p=new Uint8Array(256*4),d=1;for(let y=0;y<t;){let T=Math.min(h,t-y),S=T+ut-1&~(ut-1),b=a===0?0:n/4;if(i-d<b)throw Me("truncated ATTRIBUTES stream");let A=d;d+=b;for(let w=0;w<n;w+=4){let P=a===0?0:e[A+w/4];for(let _=0;_<4;_++){let v=P>>_*2&3;if(v===3){if(i-d<T)throw Me("truncated ATTRIBUTES stream");p.set(e.subarray(d,d+T),_*T),d+=T}else v===2?p.fill(0,_*T,_*T+T):d=a===0?Ms(e,d,i,p,_*T,S,ac,0):Ms(e,d,i,p,_*T,S,cc,v)}let N=a===0?0:e[m+w/4],I=N&3;if(I===0)for(let _=0;_<4;_++){let v=f[w+_];for(let g=0;g<T;g++)v=nc(p[_*T+g])+v&255,r[(y+g)*n+w+_]=v}else if(I===1)for(let _=0;_<4;_+=2){let v=f[w+_]|f[w+_+1]<<8,g=_*T;for(let M=0;M<T;M++){let k=p[g+M]|p[g+T+M]<<8;v=rc(k)+v&65535;let R=(y+M)*n+w+_;r[R]=v&255,r[R+1]=v>>8}}else if(I===2){let _=32-(N>>4)&31,v=(f[w]|f[w+1]<<8|f[w+2]<<16|f[w+3]<<24)>>>0;for(let g=0;g<T;g++){let M=(p[g]|p[T+g]<<8|p[2*T+g]<<16|p[3*T+g]<<24)>>>0;M=((M<<_|M>>>(32-_&31))^v)>>>0,v=M;let k=(y+g)*n+w;r[k]=M&255,r[k+1]=M>>>8&255,r[k+2]=M>>>16&255,r[k+3]=M>>>24}}else throw Me(`invalid ATTRIBUTES channel ${N}`)}f.set(r.subarray((y+T-1)*n,(y+T)*n)),y+=T}if(i-d!==c)throw Me("ATTRIBUTES trailing data")}var Cs=224,Ls=208;function Ps(e,t){let n=e[t.pos++]??0;if(n<128)return n;let r=n&127,i=7;for(let o=0;o<4;o++){let a=e[t.pos++]??0;if(r=(r|(a&127)<<i)>>>0,i+=7,a<128)break}return r>>>0}function Dr(e,t,n){let r=Ps(e,t),i=r>>>1^-(r&1);return n+i>>>0}function mc(e,t,n){if(t%3!==0)throw Me(`TRIANGLES count must be divisible by 3 (got ${t})`);let r=t/3;if(e.byteLength<1+r+16)throw Me("truncated TRIANGLES stream");let i=e[0];if((i&240)!==Cs)throw Me(`unsupported TRIANGLES header 0x${i.toString(16)}`);let o=i&15;if(o>1)throw Me(`unsupported TRIANGLES codec version ${o}`);let a=new Uint32Array(16).fill(4294967295),u=new Uint32Array(16).fill(4294967295),s=new Uint32Array(16).fill(4294967295),c=0,l=0,f=(P,N)=>{a[c]=P,u[c]=N,c=c+1&15},m=(P,N=1)=>{s[l]=P,l=l+N&15},h=0,p=0,d=o>=1?13:15,y=1+r,T=e.byteLength-16,S=T,b={pos:y},A=0,w=(P,N,I)=>{n(A++,P),n(A++,N),n(A++,I)};for(let P=1;P<y;P++){let N=e[P];if(N<240){let I=N>>4,_=c-1-I&15,v=a[_],g=u[_],M=0,k=N&15;if(k<d){let R=s[l-1-k&15];M=k===0?h:R;let B=k===0?1:0;h=h+B>>>0,m(M,B)}else{if(b.pos>T)throw Me("truncated TRIANGLES stream");M=k!==15?p+(k*2-27)>>>0:Dr(e,b,p),p=M,m(M)}f(M,g),f(v,M),w(v,g,M)}else if(N<254){let I=e[S+(N&15)],_=I>>4,v=I&15,g=h;h=h+1>>>0;let M=s[l-_&15],k=_===0?h:M,R=_===0?1:0;h=h+R>>>0;let B=s[l-v&15],Z=v===0?h:B,j=v===0?1:0;h=h+j>>>0,w(g,k,Z),m(g),m(k,R),m(Z,j),f(k,g),f(Z,k),f(g,Z)}else{if(b.pos>T)throw Me("truncated TRIANGLES stream");let I=e[b.pos++],_=N===254?0:15,v=I>>4,g=I&15;I===0&&(h=0);let M=0;_===0&&(M=h,h=h+1>>>0);let k;v===0?(k=h,h=h+1>>>0):k=s[l-v&15];let R;g===0?(R=h,h=h+1>>>0):R=s[l-g&15],_===15&&(p=M=Dr(e,b,p)),v===15&&(p=k=Dr(e,b,p)),g===15&&(p=R=Dr(e,b,p)),w(M,k,R),m(M),m(k,v===0||v===15?1:0),m(R,g===0||g===15?1:0),f(k,M),f(R,k),f(M,R)}}if(b.pos!==T)throw Me("TRIANGLES trailing data")}function fc(e,t,n){if(e.byteLength<1+t+4)throw Me("truncated INDICES stream");let r=e[0];if((r&240)!==Ls)throw Me(`unsupported INDICES header 0x${r.toString(16)}`);let i=r&15;if(i>1)throw Me(`unsupported INDICES codec version ${i}`);let o=e.byteLength-4,a=[0,0],u={pos:1};for(let s=0;s<t;s++){if(u.pos>=o)throw Me("truncated INDICES stream");let c=Ps(e,u),l=c&1;c>>>=1;let f=c>>>1^-(c&1),m=a[l]+f>>>0;a[l]=m,n(s,m)}if(u.pos!==o)throw Me("INDICES trailing data")}function Ui(e,t,n,r,i="NONE"){if(Es(i),!Number.isInteger(t)||t<0||t>tc||!Number.isInteger(n)||n<=0||n>256)throw Me(`invalid count (${t}) or byteStride (${n})`);let o=t*n;if(o>Ts)throw Me(`decompressed size (${o}) exceeds MAX_MESHOPT_BUFFER_BYTES (${Ts})`);if(t===0)return new Uint8Array(0);let a=new Uint8Array(o);if(r==="ATTRIBUTES")return lc(e,t,n,a),Fi(a,t,n,i),a;if(r==="TRIANGLES"||r==="INDICES"){if(n!==2&&n!==4)throw Me(`${r} byteStride must be 2 or 4 (got ${n})`);if(i&&i!=="NONE")throw Me(`filter ${i} is only valid for ATTRIBUTES`);let u=new DataView(a.buffer),s=n===2?(c,l)=>u.setUint16(c*2,l&65535,!0):(c,l)=>u.setUint32(c*4,l>>>0,!0);return r==="TRIANGLES"?mc(e,t,s):fc(e,t,s),a}throw Me(`unknown mode "${String(r)}"`)}function Ss(e,t){t>>>=0;do e.push(t&127|(t>127?128:0)),t>>>=7;while(t)}function Ds(e,t,n,r){let i=t*n;if(e.byteLength<i)throw new Error(`encodeMeshoptBuffer: raw buffer (${e.byteLength}) smaller than count * byteStride (${i})`);if(r==="ATTRIBUTES"){if(n%4!==0||n>256)throw new Error(`encodeMeshoptBuffer: ATTRIBUTES byteStride must be a multiple of 4 and <= 256 (got ${n})`);let u=[Rs],s=Is(n),c=new Uint8Array(n);t>0&&c.set(e.subarray(0,n));let l=c.slice(),f=new Uint8Array(256);for(let m=0;m<t;){let h=Math.min(s,t-m),p=h+15&-16;for(let d=0;d<n;d++){f.fill(0);let y=c[d];for(let b=0;b<h;b++){let A=e[(m+b)*n+d];f[b]=ic(A-y&255),y=A}c[d]=y;let T=p/16,S=u.length;for(let b=0;b<T+3>>2;b++)u.push(0);for(let b=0;b<T;b++){let A=f.subarray(b*16,b*16+16);if(!A.every(w=>w===0)){u[S+(b>>2)]|=3<<(b&3)*2;for(let w of A)u.push(w)}}}m+=h}for(let m=n;m<_s;m++)u.push(0);for(let m=0;m<n;m++)u.push(l[m]);return new Uint8Array(u)}if(n!==2&&n!==4)throw new Error(`encodeMeshoptBuffer: ${r} byteStride must be 2 or 4 (got ${n})`);let o=new DataView(e.buffer,e.byteOffset,e.byteLength),a=u=>n===2?o.getUint16(u*2,!0):o.getUint32(u*4,!0);if(r==="INDICES"){let u=[Ls|1],s=0;for(let c=0;c<t;c++){let l=a(c),f=l-s|0;s=l,Ss(u,ws(f)<<1>>>0)}return u.push(0,0,0,0),new Uint8Array(u)}if(r==="TRIANGLES"){if(t%3!==0)throw new Error(`encodeMeshoptBuffer: TRIANGLES count must be divisible by 3 (got ${t})`);let u=t/3,s=[Cs|1];for(let l=0;l<u;l++)s.push(255);let c=0;for(let l=0;l<u;l++){s.push(255);for(let f=0;f<3;f++){let m=a(l*3+f);Ss(s,ws(m-c|0)),c=m}}for(let l=0;l<16;l++)s.push(0);return new Uint8Array(s)}throw new Error(`encodeMeshoptBuffer: unknown mode "${String(r)}"`)}function Nr(e,t){let n=t&&typeof t=="object"?t:e,r=t&&typeof t=="object"?e:n?.gltf;if(!r||!Array.isArray(r.bufferViews))return;let i=new Uint8Array(n.bin),o=[],a=0;for(let f=0;f<r.bufferViews.length;f++){let m=r.bufferViews[f],h=m?.extensions?.KHR_meshopt_compression,p=h??m?.extensions?.EXT_meshopt_compression;if(!p||typeof p!="object")continue;let d=h?"KHR_meshopt_compression":"EXT_meshopt_compression",y=Number(p.count),T=Number(p.byteStride),S=Number(p.byteOffset??0),b=Number(p.byteLength??0),A=p.mode||"ATTRIBUTES",w=p.filter||"NONE";if(w==="COLOR"&&!h)throw Me(`bufferView ${f} uses the COLOR filter, which requires KHR_meshopt_compression`);if(Number(p.buffer??0)!==0)throw new Error(`${d}: bufferView ${f} references buffer ${String(p.buffer)}; only the GLB BIN chunk (buffer 0) is supported`);if(!Number.isInteger(S)||S<0||!Number.isInteger(b)||b<0||S+b>i.byteLength)throw new Error(`${d}: bufferView ${f} compressed range [${S}, ${S+b}] out of bounds (${i.byteLength})`);let P=y*T;if(a+=P,a>As)throw Me(`total decompressed size (${a}) exceeds MAX_MESHOPT_TOTAL_BYTES (${As})`);let N=i.subarray(S,S+b),I=Ui(N,y,T,A,w);o.push({index:f,bytes:I,ext:p})}if(o.length===0)return;let u=i.byteLength+3&-4,s=0;for(let f of o)s+=f.bytes.byteLength+3&-4;let c=new Uint8Array(u+s);c.set(i,0);let l=u;for(let f of o){c.set(f.bytes,l);let m=r.bufferViews[f.index];m.buffer=0,m.byteOffset=l,m.byteLength=f.bytes.byteLength,m._decoded=f.bytes,f.ext.mode==="ATTRIBUTES"&&m.byteStride===void 0&&(m.byteStride=Number(f.ext.byteStride)),m.extensions&&(delete m.extensions.EXT_meshopt_compression,delete m.extensions.KHR_meshopt_compression),l+=f.bytes.byteLength+3&-4}n.bin=c.buffer}var kr={decodeBufferViews(e,t){Nr(t)},decodePrimitive(e,t,n){let r=t?.extensions;r?.EXT_meshopt_compression&&delete r.EXT_meshopt_compression,r?.KHR_meshopt_compression&&delete r.KHR_meshopt_compression}};ge().decoders.set("meshopt",kr);var Oi={name:"meshopt",onParseGLB(e){ge().decoders.set("meshopt",kr),Nr(e)}};var hc=`#version 300 es
|
|
353
371
|
layout(location=0) in vec3 aPosition;
|
|
354
372
|
layout(location=1) in vec3 aNormal;
|
|
355
373
|
uniform mat4 uMVP,uVP;
|
|
@@ -370,19 +388,19 @@ vec2 pxOffset=dir*(uOutlineThickness*2.0/max(uViewportSize,vec2(1.0)))*clipPos.w
|
|
|
370
388
|
clipPos.xy+=pxOffset;
|
|
371
389
|
clipPos.z+=1e-4*clipPos.w;
|
|
372
390
|
gl_Position=clipPos;
|
|
373
|
-
}`,
|
|
391
|
+
}`,dc=`#version 300 es
|
|
374
392
|
precision highp float;
|
|
375
393
|
uniform vec4 uOutlineColor;
|
|
376
394
|
out vec4 fragColor;
|
|
377
395
|
void main(){
|
|
378
396
|
fragColor=uOutlineColor;
|
|
379
|
-
}`,
|
|
397
|
+
}`,Ns=`#version 300 es
|
|
380
398
|
out vec2 vUV;
|
|
381
399
|
void main(){
|
|
382
400
|
vec2 pos=vec2((gl_VertexID<<1)&2,gl_VertexID&2);
|
|
383
401
|
vUV=pos;
|
|
384
402
|
gl_Position=vec4(pos*2.0-1.0,0.0,1.0);
|
|
385
|
-
}`,
|
|
403
|
+
}`,pc=`#version 300 es
|
|
386
404
|
precision highp float;
|
|
387
405
|
in vec2 vUV;
|
|
388
406
|
uniform sampler2D uSourceTex;
|
|
@@ -405,7 +423,7 @@ c+=prefilter(texture(uSourceTex,vUV+vec2(h.x,-h.y)).rgb)*0.125;
|
|
|
405
423
|
c+=prefilter(texture(uSourceTex,vUV+vec2(-h.x,h.y)).rgb)*0.125;
|
|
406
424
|
c+=prefilter(texture(uSourceTex,vUV+vec2(h.x,h.y)).rgb)*0.125;
|
|
407
425
|
fragColor=vec4(c,1.0);
|
|
408
|
-
}`,
|
|
426
|
+
}`,bc=`#version 300 es
|
|
409
427
|
precision highp float;
|
|
410
428
|
in vec2 vUV;
|
|
411
429
|
uniform sampler2D uBloomTex;
|
|
@@ -427,4 +445,4 @@ sum+=texture(uBloomTex,vUV+vec2(-d.x,-d.y)).rgb*2.0;
|
|
|
427
445
|
vec3 bloom=(sum/12.0)*uStrength;
|
|
428
446
|
float a=clamp(min(bloom.r,min(bloom.g,bloom.b)),0.0,1.0);
|
|
429
447
|
fragColor=vec4(bloom,a);
|
|
430
|
-
}`,vr=3,Tr=new WeakMap;function vi(t,e=[.22,.74,.97]){let n=Rn(t,"");if(!n.startsWith("#"))return[e[0],e[1],e[2]];let r=n.slice(1);if(r.length===3){let i=+("0x"+r[0]+r[0])/255,o=+("0x"+r[1]+r[1])/255,s=+("0x"+r[2]+r[2])/255;return[i,o,s]}if(r.length===6){let i=+("0x"+r.slice(0,2))/255,o=+("0x"+r.slice(2,4))/255,s=+("0x"+r.slice(4,6))/255;return[i,o,s]}return[e[0],e[1],e[2]]}function Qo(t,e,n=.8,r=.5){let i=Number.isFinite(e)?Math.max(0,e):0;if(i<=0)return[0,0,0];let o=Math.max(0,Number(t[0])||0),s=Math.max(0,Number(t[1])||0),c=Math.max(0,Number(t[2])||0),a=Math.max(o,s,c);if(a<=1e-6)return[0,0,0];let u=Number.isFinite(n)?Math.max(0,n):.8,l=Math.max(u*Math.max(0,r),1e-4),m=Math.max(0,Math.min(2*l,a-u+l)),f=m*m/(4*l+1e-4),b=Math.min(1,Math.max(0,Math.max(f,a-u)/Math.max(a,1e-4)))*i;return[o*b,s*b,c*b]}function Jo(t,e,n,r){let i=Number(t[0])||0,o=Number(t[1])||0,s=Math.hypot(i,o);if(s<=1e-5||e<=0||n<=0)return[0,0];let c=Math.max(1,Number(r[0])||1),a=Math.max(1,Number(r[1])||1),u=Math.max(0,n)*2*e;return[i/s*(u/c),o/s*(u/a)]}function xi(t,e,n){let r=(o,s)=>{let c=t.createShader(o);return t.shaderSource(c,s),t.compileShader(c),c},i=t.createProgram();return t.attachShader(i,r(35633,e)),t.attachShader(i,r(35632,n)),t.linkProgram(i),i}function Zo(t){let e=Tr.get(t);if(e)return e;let n=xi(t,ca,ua),r=xi(t,Ko,la),i=xi(t,Ko,ma),o=typeof t.createVertexArray=="function"?t.createVertexArray():null;return e={outlineProg:n,uOutlineMVP:t.getUniformLocation(n,"uMVP"),uOutlineVP:t.getUniformLocation(n,"uVP"),uOutlineNormalMatrix:t.getUniformLocation(n,"uNormalMatrix"),uOutlineViewportSize:t.getUniformLocation(n,"uViewportSize"),uOutlineThickness:t.getUniformLocation(n,"uOutlineThickness"),uOutlineColor:t.getUniformLocation(n,"uOutlineColor"),downProg:r,uDownSourceTex:t.getUniformLocation(r,"uSourceTex"),uDownTexelSize:t.getUniformLocation(r,"uTexelSize"),uDownThreshold:t.getUniformLocation(r,"uThreshold"),upProg:i,uUpBloomTex:t.getUniformLocation(i,"uBloomTex"),uUpTexelSize:t.getUniformLocation(i,"uTexelSize"),uUpRadius:t.getUniformLocation(i,"uRadius"),uUpStrength:t.getUniformLocation(i,"uStrength"),fsVao:o,sceneTex:null,bloomTex:[],bloomFbo:[],mipWidth:[],mipHeight:[],texWidth:0,texHeight:0},Tr.set(t,e),e}function fa(t,e,n,r){if(typeof t.createFramebuffer!="function"||typeof t.copyTexSubImage2D!="function")return!1;let i=Math.max(2,n|0),o=Math.max(2,r|0);if(e.sceneTex&&e.bloomFbo.length===vr&&e.texWidth===i&&e.texHeight===o)return!0;e.sceneTex||(e.sceneTex=t.createTexture()),t.bindTexture(3553,e.sceneTex),t.texImage2D(3553,0,6408,i,o,0,6408,5121,null),t.texParameteri(3553,10241,9729),t.texParameteri(3553,10240,9729),t.texParameteri(3553,10242,33071),t.texParameteri(3553,10243,33071);let s=i,c=o;for(let a=0;a<vr;a++)s=Math.max(1,s>>1),c=Math.max(1,c>>1),e.mipWidth[a]=s,e.mipHeight[a]=c,e.bloomTex[a]||(e.bloomTex[a]=t.createTexture()),t.bindTexture(3553,e.bloomTex[a]),t.texImage2D(3553,0,6408,s,c,0,6408,5121,null),t.texParameteri(3553,10241,9729),t.texParameteri(3553,10240,9729),t.texParameteri(3553,10242,33071),t.texParameteri(3553,10243,33071),e.bloomFbo[a]||(e.bloomFbo[a]=t.createFramebuffer()),t.bindFramebuffer(36160,e.bloomFbo[a]),t.framebufferTexture2D(36160,36064,3553,e.bloomTex[a],0);return t.bindFramebuffer(36160,null),e.texWidth=i,e.texHeight=o,!0}function ha(t){let e=t.container;if(e&&typeof e.getAttribute=="function"){let r=e.getAttribute("bloom");if(r!==null){let i=r.trim().toLowerCase();if(i==="false"||i==="0"||i==="none")return null;let o=i===""||i==="true"?.35:Number(i);if(!Number.isFinite(o)||o<=0)return null;let s=e.getAttribute("bloom-threshold"),c=e.getAttribute("bloom-radius"),a=Vr({strength:o,threshold:s!==null?Number(s):.62,radius:c!==null?Number(c):.75});if(a)return a}}let n=null;for(let r of t.meshes||[]){if(r.visible===!1)continue;let i=r?.extras?.xr?.bloom??r?.userData?.xr?.bloom,o=Vr(i);o&&(!n||o.strength>n.strength)&&(n=o)}return n}function da(t,e){if(t==null)return null;let n=t.trim(),r=n.toLowerCase();if(r==="false"||r==="0"||r==="none")return null;let i=e,o=3.5,s=!1;if(n&&r!=="true"){let c=n.split(/\s+/);for(let a of c)if(a.startsWith("#"))i=a;else if(a.toLowerCase()==="pulse")s=!0;else{let u=Number(a);Number.isFinite(u)&&u>0&&(o=u<.25?Math.max(1.5,u*140):u)}}return _n({color:i,thickness:o,pulse:s})}function pa(t,e){let n=t.container,r=typeof n?.getAttribute=="function"?n.getAttribute("outline"):null;if(r!=null){let l=r.trim().toLowerCase();if(l==="false"||l==="0"||l==="none")return null}let i=e?.extras?.xr?.outline??e?.userData?.xr?.outline,o=_n(i);if(o)return o;let s=typeof n?.getAttribute=="function"&&n.getAttribute("outline-color")||"#38bdf8",c=da(r,s),a=n!=null&&typeof n.hasAttribute=="function"&&n.hasAttribute("outline-selected")&&n.getAttribute("outline-selected")!=="false",u=t.getSelectedMesh?.()||"";if(u)return e.name!==u?null:c||(a?_n({color:s,thickness:3,pulse:!1}):null);if(c){let l=e.name||"";return/floor|pedestal|ground|table|grid|pad/i.test(l)?null:c}return null}var Ti={name:"postprocessing",onAttributeChanged(t,e){(e==="bloom"||e==="bloom-threshold"||e==="bloom-radius"||e==="outline"||e==="outline-selected"||e==="outline-color"||e==="selected-mesh")&&t.viewer?.render?.()},onAfterRender(t,e,n){if(!e.meshes||e.meshes.length===0)return;let r=Math.max(1,e.canvas?.width||300),i=Math.max(1,e.canvas?.height||150),o=[];for(let m of e.meshes){if(m.visible===!1)continue;let f=pa(e,m);f&&o.push({mesh:m,trait:f})}if(o.length>0){let m=Zo(t),f=we(),h=we(),b=new Float32Array(9),d=(typeof performance<"u"?performance.now():Date.now())*.001;t.useProgram(m.outlineProg),m.uOutlineViewportSize&&t.uniform2f(m.uOutlineViewportSize,r,i),m.uOutlineVP&&t.uniformMatrix4fv(m.uOutlineVP,!1,n),t.enable(t.CULL_FACE),t.cullFace(t.FRONT),t.enable(2929),t.depthFunc(t.LEQUAL),t.depthMask(!1);for(let{mesh:p,trait:E}of o){let[A,x,R]=vi(E.color),I=E.pulse?.8+.25*Math.sin(d*4):1;m.uOutlineColor&&t.uniform4f(m.uOutlineColor,A,x,R,1),m.uOutlineThickness&&t.uniform1f(m.uOutlineThickness,E.thickness*I),p.worldSpace===!0?f.set(p.transform):Ee(f,e.modelRootMatrix,p.transform);let P=p.instanceMatrices;for(let k of p.primitives)if(t.bindVertexArray(k.vao),P&&P.length>=16){let D=P.length>>4,S=we();for(let _=0;_<D;_++)Ee(S,f,P.subarray(_*16,_*16+16)),Ee(h,n,S),Le(b,S),t.uniformMatrix4fv(m.uOutlineMVP,!1,h),t.uniformMatrix3fv(m.uOutlineNormalMatrix,!1,b),k.indices?t.drawElements(4,k.indexCount,k.indexType,0):t.drawArrays(4,0,k.indexCount)}else Ee(h,n,f),Le(b,f),t.uniformMatrix4fv(m.uOutlineMVP,!1,h),t.uniformMatrix3fv(m.uOutlineNormalMatrix,!1,b),k.indices?t.drawElements(4,k.indexCount,k.indexType,0):t.drawArrays(4,0,k.indexCount)}t.bindVertexArray(null),t.cullFace(t.BACK),t.disable(t.CULL_FACE),t.depthFunc(t.LESS),t.depthMask(!0)}if(e.xrSessionActive||e.stereoSBS)return;let s=ha(e);if(!s||s.strength<=0)return;let c=Zo(t);if(!fa(t,c,r,i)||!c.fsVao)return;t.activeTexture(33984),t.bindTexture(3553,c.sceneTex),t.copyTexSubImage2D(3553,0,0,0,0,0,r,i),t.disable(2929),t.depthMask(!1),t.disable(3042),t.useProgram(c.downProg),t.uniform1i(c.uDownSourceTex,0),t.bindVertexArray(c.fsVao);let a=c.sceneTex,u=r,l=i;for(let m=0;m<vr;m++){let f=c.mipWidth[m],h=c.mipHeight[m];t.bindFramebuffer(36160,c.bloomFbo[m]),t.viewport(0,0,f,h),t.bindTexture(3553,a),t.uniform2f(c.uDownTexelSize,1/u,1/l),t.uniform1f(c.uDownThreshold,m===0?s.threshold:0),t.drawArrays(4,0,3),a=c.bloomTex[m],u=f,l=h}t.enable(3042),typeof t.blendFuncSeparate=="function"?t.blendFuncSeparate(t.ONE,t.ONE,t.ONE,771):t.blendFunc(t.ONE,t.ONE),t.useProgram(c.upProg),t.uniform1i(c.uUpBloomTex,0),t.uniform1f(c.uUpRadius,s.radius);for(let m=vr-1;m>=1;m--){let f=m-1;t.bindFramebuffer(36160,c.bloomFbo[f]),t.viewport(0,0,c.mipWidth[f],c.mipHeight[f]),t.bindTexture(3553,c.bloomTex[m]),t.uniform2f(c.uUpTexelSize,1/c.mipWidth[m],1/c.mipHeight[m]),t.uniform1f(c.uUpStrength,.85),t.drawArrays(4,0,3)}t.bindFramebuffer(36160,null),t.viewport(0,0,r,i),t.bindTexture(3553,c.bloomTex[0]),t.uniform2f(c.uUpTexelSize,1/c.mipWidth[0],1/c.mipHeight[0]),t.uniform1f(c.uUpStrength,s.strength),t.drawArrays(4,0,3),t.bindVertexArray(null),t.blendFunc(770,771),t.disable(3042),t.depthMask(!0),t.enable(2929)},onDestroy(t){let e=Tr.get(t);if(e){t.deleteProgram(e.outlineProg),t.deleteProgram(e.downProg),t.deleteProgram(e.upProg),e.fsVao&&t.deleteVertexArray(e.fsVao),e.sceneTex&&t.deleteTexture(e.sceneTex);for(let n of e.bloomTex)n&&t.deleteTexture(n);for(let n of e.bloomFbo)n&&t.deleteFramebuffer(n);Tr.delete(t)}}};function wi(t){let n=t?.extensions?.KHR_materials_variants?.variants;if(!Array.isArray(n))return[];let r=[];for(let i=0;i<n.length&&r.length<256;i++){let o=n[i]?.name;r.push(typeof o=="string"&&o.length>0?o:`Variant_${i}`)}return r}function es(t){let n=t?.extensions?.KHR_materials_variants?.mappings;if(!Array.isArray(n))return[];let r=[];for(let i of n){if(!i||typeof i!="object")continue;let o=i,s=Number(o.material);if(!Number.isInteger(s)||s<0)continue;let c=[];if(Array.isArray(o.variants))for(let a of o.variants){let u=Number(a);Number.isInteger(u)&&u>=0&&c.push(u)}c.length>0&&r.push({material:s,variants:c})}return r}function ts(t,e,n,r=0){let i=t;if(i&&typeof i.selectVariant=="function"&&!Array.isArray(e))return i.selectVariant(typeof e=="string"?e:null);let o=t,s=Array.isArray(e)?e:[],c=n??null;if(!c)return r;let u=wi(o).indexOf(c);if(u<0)return r;for(let l of s)if(l.variants.includes(u))return l.material;return r}var Mi={name:"variants",onLoadModel(t,e){let n=t.getVariantName?.();n&&t.selectVariant(n)}};var ns=new WeakMap,Ai={name:"webxr-suite",onConfigureXRSessionInit(t,e){let n=new Set(e.optionalFeatures||[]);n.add("hit-test"),n.add("light-estimation");let r=t?.querySelector?.('[slot="ar-overlay"]')||null;r&&(n.add("dom-overlay"),e.domOverlay={root:r},r.addEventListener?.("beforexrselect",i=>{i.preventDefault()})),e.optionalFeatures=Array.from(n)},onXRFrame(t,e,n,r){if(!t||!e||!n||!r)return;let i=ns.get(e);if(i||(i={lightProbe:null},ns.set(e,i),typeof e.requestLightProbe=="function"&&e.requestLightProbe().then(o=>{i&&o&&(i.lightProbe=o)}).catch(()=>{})),i.lightProbe&&typeof n.getLightEstimate=="function"){let o=n.getLightEstimate(i.lightProbe);if(o){let s=o.primaryLightDirection,c=o.primaryLightIntensity;if(s&&c&&Array.isArray(t.lights)){let a=t.lights.find(l=>l.type==="directional");a||(a={type:"directional",direction:[.5,1,.8],color:[1,1,1],intensity:1},t.lights.push(a)),a.direction=[s.x,s.y,s.z];let u=Math.max(c.x,c.y,c.z,.001);a.color=[c.x/u,c.y/u,c.z/u],a.intensity=u}o.sphericalHarmonicsCoefficients&&t.gl&&fr(t.gl,o.sphericalHarmonicsCoefficients)}}}};Pe(fn);Pe(ui);Pe(si);Pe(pi);Pe(Ai);Pe(hi);Pe(gi);Pe(Mi);Pe(Ti);Je.registerScriptRunner(Gt);typeof window<"u"&&(window.ThreeLiveBundle=Si);export{on as AmbientLight,Jt as BoxGeometry,Me as BufferAttribute,Xe as BufferGeometry,an as Camera,tr as CapsuleGeometry,rr as CircleGeometry,jn as Clock,$e as Color,Un as ConeGeometry,yt as CylinderGeometry,$n as DirectionalLight,Jn as DodecahedronGeometry,Zt as Euler,Dn as Float32BufferAttribute,Wn as Group,ln as HemisphereLight,Xi as IKSolver,Zn as IcosahedronGeometry,rn as InstancedMesh,dn as InteractivityVM,Mt as Light,Bi as MAX_BSP_DEPTH,Vi as MAX_CSG_TRIANGLES,nn as MAX_INSTANCES_PER_MESH,zi as MAX_TEXT_GEOMETRY_CHARS,Qe as Material,ho as MathUtils,Pn as Matrix3,vt as Matrix4,wt as Mesh,zn as MeshBasicMaterial,Gn as MeshLambertMaterial,Xn as MeshPhongMaterial,Hn as MeshPhysicalMaterial,Tt as MeshStandardMaterial,qe as Object3D,Qn as OctahedronGeometry,qn as PerspectiveCamera,Fn as PlaneGeometry,sn as PointLight,At as PolyhedronFallbackGeometry,Qt as Quaternion,So as RawShaderMaterial,Eo as RectAreaLight,nr as RingGeometry,cn as Scene,Ze as SceneQuotaValidator,un as ShaderMaterial,en as SphereGeometry,ir as SpotLight,St as THREE,er as TetrahedronGeometry,tn as Texture,Bn as TextureLoader,Je as ThreeLiveElement,Fe as ThreeView,On as TorusGeometry,Vn as TorusKnotGeometry,kn as Uint16BufferAttribute,Nn as Uint32BufferAttribute,In as Vector2,Ce as Vector3,Ln as Vector4,Yn as WebGLRenderer,mr as activateAR,gr as applyMeshoptFilter,Gt as authorScriptRunner,Hr as buildSandboxWorkerSource,Mr as cadPlugin,Ao as clearAuthorWarnings,Jo as computeOutlineClipOffset,fn as contactShadowPlugin,Vt as createUSDZBlob,Yr as crossFadeTo,yi as decodeMeshoptBuffer,bn as decodeMeshoptGLB,jo as encodeMeshoptBuffer,si as environmentMapPlugin,Qo as evaluateKawaseBloom,Zi as evaluateToneMapping,zr as exportSceneToCanvas3D,Gr as exportSceneToGLB,bo as exportSceneToUSDZ,wi as extractMaterialVariants,es as extractPrimitiveVariantMappings,qt as generateUSDZ,lr as getARCapabilities,xo as getAllowClientScripts,Mo as getAuthorWarnings,Do as getBestARMode,Uo as getEnvironmentSH,yr as getInteractivityVM,Xr as getSandboxEngineSrc,go as getSandboxIframeSrc,$t as glbToUSDZ,ui as hotspotPlugin,Ir as ikPlugin,wn as installCadExtension,hi as interactivityPlugin,gt as isAllowedSandboxEngineUrl,ni as isQuickLookSupported,ri as isSceneViewerSupported,ii as isWebXRSupported,jr as keyframeAnimationPlugin,pi as materialsPlugin,xr as meshoptDecoder,gi as meshoptPlugin,Kr as morphPlugin,jt as noopProxy,qr as parseAnimations,vi as parseHexRgb,hn as parseSafeGltfPointer,Ti as postprocessingPlugin,Gi as quatFromUnitVectors,Wo as registerMaterialShader,Xt as sampleChannel,Ut as sceneToCanvas3D,Wt as sceneToGLB,Ot as sceneToUSDZ,ts as selectMaterialVariant,fi as sendInteractivityEvent,Ls as setAllowClientScripts,fr as setEnvironmentSH,Co as setMorphTargetWeight,Rs as setSandboxEngineSrc,Cs as setSandboxIframeSrc,Qr as skinningPlugin,Cr as solveFABRIK,_r as solveTwoBoneIK,Kt as threeAuthorPlugin,Bs as threeMicroPlugin,ot as toGLBData,yo as toTrustedWorkerScriptURL,Wr as validateSandboxWorkerMessage,Mi as variantsPlugin,He as warnUnsupported,Ai as webxrPlugin};
|
|
448
|
+
}`,Fr=3,Cn=new WeakMap;function Bi(e,t=[.22,.74,.97]){let n=Hn(e,"");if(!n.startsWith("#"))return[t[0],t[1],t[2]];let r=n.slice(1);if(r.length===3){let i=+("0x"+r[0]+r[0])/255,o=+("0x"+r[1]+r[1])/255,a=+("0x"+r[2]+r[2])/255;return[i,o,a]}if(r.length===6){let i=+("0x"+r.slice(0,2))/255,o=+("0x"+r.slice(2,4))/255,a=+("0x"+r.slice(4,6))/255;return[i,o,a]}return[t[0],t[1],t[2]]}function Us(e,t,n=.8,r=.5){let i=Number.isFinite(t)?Math.max(0,t):0;if(i<=0)return[0,0,0];let o=Math.max(0,Number(e[0])||0),a=Math.max(0,Number(e[1])||0),u=Math.max(0,Number(e[2])||0),s=Math.max(o,a,u);if(s<=1e-6)return[0,0,0];let c=Number.isFinite(n)?Math.max(0,n):.8,l=Math.max(c*Math.max(0,r),1e-4),f=Math.max(0,Math.min(2*l,s-c+l)),m=f*f/(4*l+1e-4),p=Math.min(1,Math.max(0,Math.max(m,s-c)/Math.max(s,1e-4)))*i;return[o*p,a*p,u*p]}function Os(e,t,n,r){let i=Number(e[0])||0,o=Number(e[1])||0,a=Math.hypot(i,o);if(a<=1e-5||t<=0||n<=0)return[0,0];let u=Math.max(1,Number(r[0])||1),s=Math.max(1,Number(r[1])||1),c=Math.max(0,n)*2*t;return[i/a*(c/u),o/a*(c/s)]}function Vi(e,t,n){let r=e.createProgram();if(!r)return null;let i=[];for(let[o,a]of[[35633,t],[35632,n]]){let u=e.createShader(o);u&&(e.shaderSource(u,a),e.compileShader(u),e.attachShader(r,u),i.push(u))}e.linkProgram(r);for(let o of i)e.detachShader?.(r,o),e.deleteShader?.(o);return i.length<2||typeof e.getProgramParameter=="function"&&!e.getProgramParameter(r,35714)?(e.deleteProgram?.(r),null):r}var ks=new WeakSet;function Fs(e){let t=Cn.get(e);if(t){if(typeof e.isProgram!="function"||e.isProgram(t.outlineProg))return t;Cn.delete(e)}if(ks.has(e)||e.isContextLost?.())return null;let n=Vi(e,hc,dc),r=Vi(e,Ns,pc),i=Vi(e,Ns,bc);if(!n||!r||!i){for(let a of[n,r,i])a&&e.deleteProgram(a);return ks.add(e),null}let o=typeof e.createVertexArray=="function"?e.createVertexArray():null;return t={outlineProg:n,uOutlineMVP:e.getUniformLocation(n,"uMVP"),uOutlineVP:e.getUniformLocation(n,"uVP"),uOutlineNormalMatrix:e.getUniformLocation(n,"uNormalMatrix"),uOutlineViewportSize:e.getUniformLocation(n,"uViewportSize"),uOutlineThickness:e.getUniformLocation(n,"uOutlineThickness"),uOutlineColor:e.getUniformLocation(n,"uOutlineColor"),downProg:r,uDownSourceTex:e.getUniformLocation(r,"uSourceTex"),uDownTexelSize:e.getUniformLocation(r,"uTexelSize"),uDownThreshold:e.getUniformLocation(r,"uThreshold"),upProg:i,uUpBloomTex:e.getUniformLocation(i,"uBloomTex"),uUpTexelSize:e.getUniformLocation(i,"uTexelSize"),uUpRadius:e.getUniformLocation(i,"uRadius"),uUpStrength:e.getUniformLocation(i,"uStrength"),fsVao:o,sceneTex:null,bloomTex:[],bloomFbo:[],mipWidth:[],mipHeight:[],texWidth:0,texHeight:0},Cn.set(e,t),t}function yc(e,t,n,r){if(typeof e.createFramebuffer!="function"||typeof e.copyTexSubImage2D!="function")return!1;let i=Math.max(2,n|0),o=Math.max(2,r|0);if(t.sceneTex&&t.bloomFbo.length===Fr&&t.texWidth===i&&t.texHeight===o)return!0;t.sceneTex||(t.sceneTex=e.createTexture()),e.bindTexture(3553,t.sceneTex),e.texImage2D(3553,0,6408,i,o,0,6408,5121,null),e.texParameteri(3553,10241,9729),e.texParameteri(3553,10240,9729),e.texParameteri(3553,10242,33071),e.texParameteri(3553,10243,33071);let a=i,u=o;for(let s=0;s<Fr;s++)a=Math.max(1,a>>1),u=Math.max(1,u>>1),t.mipWidth[s]=a,t.mipHeight[s]=u,t.bloomTex[s]||(t.bloomTex[s]=e.createTexture()),e.bindTexture(3553,t.bloomTex[s]),e.texImage2D(3553,0,6408,a,u,0,6408,5121,null),e.texParameteri(3553,10241,9729),e.texParameteri(3553,10240,9729),e.texParameteri(3553,10242,33071),e.texParameteri(3553,10243,33071),t.bloomFbo[s]||(t.bloomFbo[s]=e.createFramebuffer()),e.bindFramebuffer(36160,t.bloomFbo[s]),e.framebufferTexture2D(36160,36064,3553,t.bloomTex[s],0);return e.bindFramebuffer(36160,null),t.texWidth=i,t.texHeight=o,!0}function gc(e){let t=e.container;if(t&&typeof t.getAttribute=="function"){let r=t.getAttribute("bloom");if(r!==null){let i=r.trim().toLowerCase();if(i==="false"||i==="0"||i==="none")return null;let o=i===""||i==="true"?.35:Number(i);if(!Number.isFinite(o)||o<=0)return null;let a=ri({strength:o,threshold:Jt(t.getAttribute("bloom-threshold"),.62),radius:Jt(t.getAttribute("bloom-radius"),.75)});if(a)return a}}let n=null;for(let r of e.meshes||[]){if(r.visible===!1)continue;let i=r?.extras?.xr?.bloom??r?.userData?.xr?.bloom,o=ri(i);o&&(!n||o.strength>n.strength)&&(n=o)}return n}function xc(e,t){if(e==null)return null;let n=e.trim(),r=n.toLowerCase();if(r==="false"||r==="0"||r==="none")return null;let i=t,o=3.5,a=!1;if(n&&r!=="true"){let u=n.split(/\s+/);for(let s of u)if(s.startsWith("#"))i=s;else if(s.toLowerCase()==="pulse")a=!0;else{let c=Number(s);Number.isFinite(c)&&c>0&&(o=c)}}return Xn({color:i,thickness:o,pulse:a})}var vc=new Set(["floor","pedestal","ground","table","grid","pad"]);function Tc(e){return e.replace(/([a-z\d])([A-Z])/g,"$1 $2").toLowerCase().split(/[^a-z]+/).some(t=>vc.has(t))}function Ac(e,t){let n=e.container,r=typeof n?.getAttribute=="function"?n.getAttribute("outline"):null;if(r!=null){let l=r.trim().toLowerCase();if(l==="false"||l==="0"||l==="none")return null}let i=t?.extras?.xr?.outline??t?.userData?.xr?.outline,o=Xn(i);if(o)return o;let a=typeof n?.getAttribute=="function"&&n.getAttribute("outline-color")||"#38bdf8",u=xc(r,a),s=n!=null&&typeof n.hasAttribute=="function"&&n.hasAttribute("outline-selected")&&n.getAttribute("outline-selected")!=="false",c=e.getSelectedMesh?.()||"";if(c)return t.name!==c?null:u||(s?Xn({color:a,thickness:3,pulse:!1}):null);if(u){let l=t.name||"";return Tc(l)?null:u}return null}var zi={name:"postprocessing",onAttributeChanged(e,t){(t==="bloom"||t==="bloom-threshold"||t==="bloom-radius"||t==="outline"||t==="outline-selected"||t==="outline-color"||t==="selected-mesh")&&e.viewer?.render?.()},onAfterRender(e,t,n){if(!t.meshes||t.meshes.length===0)return;let r=Math.max(1,t.canvas?.width||300),i=Math.max(1,t.canvas?.height||150),o=[];for(let m of t.meshes){if(m.visible===!1)continue;let h=Ac(t,m);h&&o.push({mesh:m,trait:h})}let a=o.length>0?Fs(e):null;if(a){let m=a,h=Te(),p=Te(),d=new Float32Array(9),y=(typeof performance<"u"?performance.now():Date.now())*.001,T=typeof e.getParameter=="function"?e.getParameter(e.VIEWPORT):null,S=Math.max(1,T?.[2]||r),b=Math.max(1,T?.[3]||i);e.useProgram(m.outlineProg),m.uOutlineViewportSize&&e.uniform2f(m.uOutlineViewportSize,S,b),m.uOutlineVP&&e.uniformMatrix4fv(m.uOutlineVP,!1,n),e.enable(e.CULL_FACE),e.cullFace(e.FRONT),e.enable(2929),e.depthFunc(e.LEQUAL),e.depthMask(!1);for(let{mesh:A,trait:w}of o){let[P,N,I]=Bi(w.color),_=w.pulse?.8+.25*Math.sin(y*4):1;m.uOutlineColor&&e.uniform4f(m.uOutlineColor,P,N,I,1),m.uOutlineThickness&&e.uniform1f(m.uOutlineThickness,w.thickness*_),A.worldSpace===!0?h.set(A.transform):Re(h,t.modelRootMatrix,A.transform);let v=A.instanceMatrices;for(let g of A.primitives)if(!(g.pluginData?.skinning?.hasSkin||g.pluginData?.morph?.hasMorph))if(e.bindVertexArray(g.vao),v&&v.length>=16){let M=v.length>>4,k=Te();for(let R=0;R<M;R++)Re(k,h,v.subarray(R*16,R*16+16)),Re(p,n,k),De(d,k),e.uniformMatrix4fv(m.uOutlineMVP,!1,p),e.uniformMatrix3fv(m.uOutlineNormalMatrix,!1,d),g.indices?e.drawElements(4,g.indexCount,g.indexType,0):e.drawArrays(4,0,g.indexCount)}else Re(p,n,h),De(d,h),e.uniformMatrix4fv(m.uOutlineMVP,!1,p),e.uniformMatrix3fv(m.uOutlineNormalMatrix,!1,d),g.indices?e.drawElements(4,g.indexCount,g.indexType,0):e.drawArrays(4,0,g.indexCount)}e.bindVertexArray(null),e.cullFace(e.BACK),e.disable(e.CULL_FACE),e.depthFunc(e.LESS),e.depthMask(!0)}if(t.xrSessionActive||t.stereoSBS)return;let u=gc(t);if(!u||u.strength<=0)return;let s=Fs(e);if(!s||!yc(e,s,r,i)||!s.fsVao)return;e.activeTexture(33984),e.bindTexture(3553,s.sceneTex),e.copyTexSubImage2D(3553,0,0,0,0,0,r,i),e.disable(2929),e.depthMask(!1),e.disable(3042),e.useProgram(s.downProg),e.uniform1i(s.uDownSourceTex,0),e.bindVertexArray(s.fsVao);let c=s.sceneTex,l=r,f=i;for(let m=0;m<Fr;m++){let h=s.mipWidth[m],p=s.mipHeight[m];e.bindFramebuffer(36160,s.bloomFbo[m]),e.viewport(0,0,h,p),e.bindTexture(3553,c),e.uniform2f(s.uDownTexelSize,1/l,1/f),e.uniform1f(s.uDownThreshold,m===0?u.threshold:0),e.drawArrays(4,0,3),c=s.bloomTex[m],l=h,f=p}e.enable(3042),typeof e.blendFuncSeparate=="function"?e.blendFuncSeparate(e.ONE,e.ONE,e.ONE,771):e.blendFunc(e.ONE,e.ONE),e.useProgram(s.upProg),e.uniform1i(s.uUpBloomTex,0),e.uniform1f(s.uUpRadius,u.radius);for(let m=Fr-1;m>=1;m--){let h=m-1;e.bindFramebuffer(36160,s.bloomFbo[h]),e.viewport(0,0,s.mipWidth[h],s.mipHeight[h]),e.bindTexture(3553,s.bloomTex[m]),e.uniform2f(s.uUpTexelSize,1/s.mipWidth[m],1/s.mipHeight[m]),e.uniform1f(s.uUpStrength,.85),e.drawArrays(4,0,3)}e.bindFramebuffer(36160,null),e.viewport(0,0,r,i),e.bindTexture(3553,s.bloomTex[0]),e.uniform2f(s.uUpTexelSize,1/s.mipWidth[0],1/s.mipHeight[0]),e.uniform1f(s.uUpStrength,u.strength),e.drawArrays(4,0,3),e.bindVertexArray(null),e.blendFunc(770,771),e.disable(3042),e.depthMask(!0),e.enable(2929)},onDestroy(e){let t=Cn.get(e);if(t){e.deleteProgram(t.outlineProg),e.deleteProgram(t.downProg),e.deleteProgram(t.upProg),t.fsVao&&e.deleteVertexArray(t.fsVao),t.sceneTex&&e.deleteTexture(t.sceneTex);for(let n of t.bloomTex)n&&e.deleteTexture(n);for(let n of t.bloomFbo)n&&e.deleteFramebuffer(n);Cn.delete(e)}}};function Gi(e){let n=e?.extensions?.KHR_materials_variants?.variants;if(!Array.isArray(n))return[];let r=[];for(let i=0;i<n.length&&r.length<256;i++){let o=n[i]?.name;r.push(typeof o=="string"&&o.length>0?o:`Variant_${i}`)}return r}function Vs(e){let n=e?.extensions?.KHR_materials_variants?.mappings;if(!Array.isArray(n))return[];let r=[];for(let i of n){if(!i||typeof i!="object")continue;let o=i,a=Number(o.material);if(!Number.isInteger(a)||a<0)continue;let u=[];if(Array.isArray(o.variants))for(let s of o.variants){let c=Number(s);Number.isInteger(c)&&c>=0&&u.push(c)}u.length>0&&r.push({material:a,variants:u})}return r}function Bs(e,t,n,r=0){let i=e;if(i&&typeof i.selectVariant=="function"&&!Array.isArray(t))return i.selectVariant(typeof t=="string"?t:null);let o=e,a=Array.isArray(t)?t:[],u=n??null;if(!u)return r;let c=Gi(o).indexOf(u);if(c<0)return r;for(let l of a)if(l.variants.includes(c))return l.material;return r}var Hi={name:"variants",onLoadModel(e,t){let n=e.getVariantName?.();n&&e.selectVariant(n)}};var zs=new WeakMap,Xi={name:"webxr-suite",onConfigureXRSessionInit(e,t){let n=new Set(t.optionalFeatures||[]);n.add("hit-test"),n.add("light-estimation");let r=e?.querySelector?.('[slot="ar-overlay"]')||null;r&&(n.add("dom-overlay"),t.domOverlay={root:r},r.addEventListener?.("beforexrselect",i=>{i.preventDefault()})),t.optionalFeatures=Array.from(n)},onXRFrame(e,t,n,r){if(!e||!t||!n||!r)return;let i=zs.get(t);if(i||(i={lightProbe:null},zs.set(t,i),typeof t.requestLightProbe=="function"&&t.requestLightProbe().then(o=>{i&&o&&(i.lightProbe=o)}).catch(()=>{})),i.lightProbe&&typeof n.getLightEstimate=="function"){let o=n.getLightEstimate(i.lightProbe);if(o){let a=o.primaryLightDirection,u=o.primaryLightIntensity;if(a&&u&&Array.isArray(e.lights)){let s=e.lights.find(l=>l.type==="directional");s||(s={type:"directional",direction:[.5,1,.8],color:[1,1,1],intensity:1},e.lights.push(s)),s.direction=[a.x,a.y,a.z];let c=Math.max(u.x,u.y,u.z,.001);s.color=[u.x/c,u.y/c,u.z/c],s.intensity=c}o.sphericalHarmonicsCoefficients&&e.gl&&Er(e.gl,o.sphericalHarmonicsCoefficients)}}}};Fe(En);Fe(Ci);Fe(Ri);Fe(ki);Fe(Xi);Fe(Ni);Fe(Oi);Fe(Hi);Fe(zi);at.registerScriptRunner(Qt);typeof window<"u"&&(window.ThreeLiveBundle=Wi);export{gn as AmbientLight,hn as BoxGeometry,we as BufferAttribute,je as BufferGeometry,vn as Camera,yr as CapsuleGeometry,xr as CircleGeometry,mr as Clock,Je as Color,Jn as ConeGeometry,St as CylinderGeometry,cr as DirectionalLight,pr as DodecahedronGeometry,mn as Euler,jn as Float32BufferAttribute,ar as Group,wn as HemisphereLight,fo as IKSolver,hr as IcosahedronGeometry,yn as InstancedMesh,_n as InteractivityVM,Pt as Light,so as MAX_BSP_DEPTH,oo as MAX_CSG_TRIANGLES,bn as MAX_INSTANCES_PER_MESH,co as MAX_SHAPE_POINTS,ao as MAX_TEXT_GEOMETRY_CHARS,st as Material,Ho as MathUtils,Yn as Matrix3,It as Matrix4,Lt as Mesh,rr as MeshBasicMaterial,ir as MeshLambertMaterial,or as MeshPhongMaterial,sr as MeshPhysicalMaterial,Ct as MeshStandardMaterial,et as Object3D,dr as OctahedronGeometry,ur as PerspectiveCamera,Qn as PlaneGeometry,xn as PointLight,Dt as PolyhedronFallbackGeometry,fn as Quaternion,es as RawShaderMaterial,ts as RectAreaLight,gr as RingGeometry,Tn as Scene,ot as SceneQuotaValidator,An as ShaderMaterial,dn as SphereGeometry,vr as SpotLight,Nt as THREE,br as TetrahedronGeometry,pn as Texture,nr as TextureLoader,at as ThreeLiveElement,He as ThreeView,er as TorusGeometry,tr as TorusKnotGeometry,Kn as Uint16BufferAttribute,Zn as Uint32BufferAttribute,$n as Vector2,ke as Vector3,qn as Vector4,lr as WebGLRenderer,Sr as activateAR,Fi as applyMeshoptFilter,Qt as authorScriptRunner,ci as buildSandboxWorkerSource,Or as cadPlugin,Jo as clearAuthorWarnings,Os as computeOutlineClipOffset,En as contactShadowPlugin,jt as createUSDZBlob,di as crossFadeTo,Ui as decodeMeshoptBuffer,Nr as decodeMeshoptGLB,Ds as encodeMeshoptBuffer,Ri as environmentMapPlugin,Us as evaluateKawaseBloom,Mo as evaluateToneMapping,oi as exportSceneToCanvas3D,si as exportSceneToGLB,Wo as exportSceneToUSDZ,Gi as extractMaterialVariants,Vs as extractPrimitiveVariantMappings,an as generateUSDZ,Mr as getARCapabilities,Yo as getAllowClientScripts,Qo as getAuthorWarnings,us as getBestARMode,fs as getEnvironmentSH,Lr as getInteractivityVM,ai as getSandboxEngineSrc,qo as getSandboxIframeSrc,sn as glbToUSDZ,Ci as hotspotPlugin,Yr as ikPlugin,Fn as installCadExtension,Ni as interactivityPlugin,Et as isAllowedSandboxEngineUrl,Ai as isQuickLookSupported,wi as isSceneViewerSupported,Mi as isWebXRSupported,pi as keyframeAnimationPlugin,ki as materialsPlugin,kr as meshoptDecoder,Oi as meshoptPlugin,bi as morphPlugin,un as noopProxy,hi as parseAnimations,Bi as parseHexRgb,Rn as parseSafeGltfPointer,zi as postprocessingPlugin,Vn as quatFromUnitVectors,vs as registerMaterialShader,en as sampleChannel,qt as sceneToCanvas3D,on as sceneToGLB,Yt as sceneToUSDZ,Bs as selectMaterialVariant,Di as sendInteractivityEvent,_a as setAllowClientScripts,Er as setEnvironmentSH,os as setMorphTargetWeight,Ma as setSandboxEngineSrc,Ea as setSandboxIframeSrc,gi as skinningPlugin,$r as solveFABRIK,Wr as solveTwoBoneIK,ln as threeAuthorPlugin,Ua as threeMicroPlugin,ht as toGLBData,$o as toTrustedWorkerScriptURL,ui as validateSandboxWorkerMessage,Hi as variantsPlugin,Ke as warnUnsupported,Xi as webxrPlugin};
|