@liveroom-tech/react-immersive 4.3.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +697 -83
- package/dist/ModelViewer-CbbJT85n.d.mts +448 -0
- package/dist/ModelViewer-DOexHkJC.d.ts +448 -0
- package/dist/binding-builder.css +1 -0
- package/dist/binding-builder.d.mts +6 -0
- package/dist/binding-builder.d.ts +6 -0
- package/dist/binding-builder.js +3694 -0
- package/dist/binding-builder.mjs +1 -0
- package/dist/chunk-7EW6JZ46.mjs +27 -0
- package/dist/chunk-BGYK4Y2Y.mjs +1 -0
- package/dist/chunk-MMO7KCYU.mjs +3 -0
- package/dist/chunk-NVY7N7CU.mjs +3 -0
- package/dist/chunk-SEESCGUS.mjs +1 -0
- package/dist/chunk-WFEYRUZC.mjs +1 -0
- package/dist/chunk-XTLSAYAQ.mjs +1 -0
- package/dist/hosted.css +1 -1
- package/dist/hosted.d.mts +33 -13
- package/dist/hosted.d.ts +33 -13
- package/dist/hosted.js +11 -8
- package/dist/hosted.mjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.mts +107 -83
- package/dist/index.d.ts +107 -83
- package/dist/index.js +11 -8
- package/dist/index.mjs +1 -1
- package/dist/modelInfo-CEmmvVCH.d.mts +17 -0
- package/dist/modelInfo-CEmmvVCH.d.ts +17 -0
- package/dist/{objectBinding-CBRYMYk6.d.ts → objectCatalog-5W8n5xNQ.d.mts} +55 -3
- package/dist/{objectBinding-CBRYMYk6.d.mts → objectCatalog-5W8n5xNQ.d.ts} +55 -3
- package/dist/publicProps-tJuWZgT3.d.mts +12 -0
- package/dist/publicProps-tJuWZgT3.d.ts +12 -0
- package/dist/simple-model-viewer.css +1 -0
- package/dist/simple-model-viewer.d.mts +38 -0
- package/dist/simple-model-viewer.d.ts +38 -0
- package/dist/simple-model-viewer.js +3666 -0
- package/dist/simple-model-viewer.mjs +1 -0
- package/dist/utils.d.mts +49 -3
- package/dist/utils.d.ts +49 -3
- package/dist/utils.js +1 -1
- package/dist/utils.mjs +1 -1
- package/package.json +28 -18
- package/dist/chunk-7X37KAPE.mjs +0 -1
- package/dist/chunk-GYB4BOVW.mjs +0 -26
- package/dist/chunk-K7DMBJBJ.mjs +0 -1
- package/dist/publicProps-BST1E8an.d.mts +0 -349
- package/dist/publicProps-Bv3_PCP0.d.ts +0 -349
package/dist/chunk-GYB4BOVW.mjs
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import{a as rl,b as Th,c as Ph,d as kh,e as _h,f as Ah,g as Na,h as Fi,i as il,j as Eh,k as Rh}from"./chunk-K7DMBJBJ.mjs";import{a as ed}from"./chunk-JR557W27.mjs";import{useCallback as En,useRef as Bo,useState as Bh}from"react";import{Vector3 as Dh}from"three";var td=new WeakSet;function Lo(e){td.add(e)}function Lh(e){let t=td.has(e);return t&&td.delete(e),t}function Oh(e){return[e.x,e.y,e.z]}function ni(e,t){let n=new Dh,i=new Dh;return t.getPosition(n),t.getTarget(i),{position:Oh(n),target:Oh(i),fov:"fov"in e&&typeof e.fov=="number"?e.fov:null,zoom:"zoom"in e&&typeof e.zoom=="number"?e.zoom:1,azimuthAngle:t.azimuthAngle,polarAngle:t.polarAngle}}function Sy(e,t){return e?e.position[0]===t.position[0]&&e.position[1]===t.position[1]&&e.position[2]===t.position[2]&&e.target[0]===t.target[0]&&e.target[1]===t.target[1]&&e.target[2]===t.target[2]&&e.fov===t.fov&&e.zoom===t.zoom&&e.azimuthAngle===t.azimuthAngle&&e.polarAngle===t.polarAngle:!1}async function Ia(e,t,n=.6){let i=e.smoothTime;e.smoothTime=n;try{return await t()}finally{e.smoothTime=i}}function Nh(e={}){let t=Bo(e);t.current=e;let n=Bo(null),[i,r]=Bh(null),[o,a]=Bh(()=>({...e.presets})),s=Bo(o);s.current=o;let c=En(C=>{r(P=>Sy(P,C)?P:C)},[]),l=En((C,P)=>{c(ni(C,P))},[c]),u=Bo(null),d=Bo(null),h=Bo(null),b=En(C=>{n.current=C;let P=ni(C.controls.camera,C.controls);c(P),C.scene!==d.current&&(d.current=C.scene,u.current=null,h.current=null),C.homeCameraState&&!u.current&&(u.current=C.homeCameraState);let{initialPosition:_,initialTarget:z,initialTransition:L=!1}=t.current;if((_||z)&&C.scene&&(_||C.homeCameraState)&&h.current!==C.controls){h.current=C.controls,C.homeCameraState||Lo(C.controls);let I=_??P.position,N=z??P.target;C.controls.setLookAt(I[0],I[1],I[2],N[0],N[1],N[2],L).then(()=>{if(n.current?.controls!==C.controls)return;let R=ni(C.controls.camera,C.controls);u.current={position:R.position,target:R.target},c(R)}).catch(()=>{})}},[c]),m=En(async()=>{let C=n.current,P=C?.controls;if(!P)return!1;try{let _=u.current;return _?await Ia(P,()=>P.setLookAt(_.position[0],_.position[1],_.position[2],_.target[0],_.target[1],_.target[2],!0)):C?.scene?await Ia(P,()=>P.fitToBox(C.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})):await Ia(P,()=>P.reset(!0)),!0}catch{return!1}},[]),y=En(async()=>{let C=n.current;if(!C?.controls||!C.scene)return!1;try{return await Ia(C.controls,()=>C.controls.fitToBox(C.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),k=En(async C=>{let P=n.current;if(!P?.controls)return!1;let _=il(P.objectBindings,C);if(!_)return!1;let z=P.nodeRefs[_];if(!z)return!1;try{return await Ia(P.controls,()=>P.controls.fitToBox(z,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),w=En(async(C,P=!0)=>{let _=n.current?.controls;if(!_)return!1;try{return n.current?.homeCameraState||Lo(_),await _.setTarget(C[0],C[1],C[2],P),c(ni(_.camera,_)),!0}catch{return!1}},[c]),p=En(async(C,P=!0)=>{let _=n.current?.controls;if(!_)return!1;try{n.current?.homeCameraState||Lo(_);let z=[_.setLookAt(C.position[0],C.position[1],C.position[2],C.target[0],C.target[1],C.target[2],P)];C.azimuthAngle!=null&&C.polarAngle!=null&&z.push(_.rotateTo(C.azimuthAngle,C.polarAngle,P)),await Promise.all(z);let L=_.camera,I=!1;return C.fov!=null&&"fov"in L&&typeof L.fov=="number"&&(L.fov=C.fov,I=!0),C.zoom!=null&&"zoom"in L&&typeof L.zoom=="number"&&(L.zoom=C.zoom,I=!0),I&&"updateProjectionMatrix"in L&&L.updateProjectionMatrix(),c(ni(L,_)),!0}catch{return!1}},[c]),g=En((C,P=!0)=>p(C,P),[p]),S=En((C,P,_=!0)=>p({position:C,target:P},_),[p]),v=En(async(C,P,_=!0)=>{let z=n.current?.controls;if(!z)return!1;try{return n.current?.homeCameraState||Lo(z),await z.rotateTo(C,P,_),c(ni(z.camera,z)),!0}catch{return!1}},[c]),M=En(async(C,P=!0)=>{let _=n.current?.controls;if(!_)return!1;try{return n.current?.homeCameraState||Lo(_),await _.dollyTo(C,P),c(ni(_.camera,_)),!0}catch{return!1}},[c]),D=En(C=>{let P=n.current?.controls,_=C.trim();if(!P||!_)return null;let z=ni(P.camera,P);return s.current={...s.current,[_]:z},a(L=>({...L,[_]:z})),c(z),z},[c]),x=En((C,P=!0)=>{let _=s.current[C];return _?p(_,P):Promise.resolve(!1)},[p]);return{cameraState:i,cameraPresets:o,resetView:m,focusObject:k,fitScene:y,setCameraTarget:w,setCameraState:g,lookAt:S,orbitTo:v,dollyTo:M,savePreset:D,goToPreset:x,handleCameraChange:l,handleViewerReady:b}}import{useCallback as Do,useEffect as My,useRef as Ih,useState as ji}from"react";function zh(){let e=Ih(null),[t,n]=ji([]),i=Ih(null),[r,o]=ji([]),[a,s]=ji(null),[c,l]=ji(!1),[u,d]=ji(1),[h,b]=ji(0),[m,y]=ji(0);My(()=>()=>{i.current?.()},[]);let k=Do(M=>{i.current?.(),e.current=M,n(M.clips),o(M.clipDetails??M.clips.map(x=>({sourceName:x,duration:0})));let D=M.getState?.()??{currentClip:null,isPlaying:!1,speed:1,time:0,duration:0};s(D.currentClip),l(D.isPlaying),d(D.speed),b(D.time),y(D.duration),M.subscribe?i.current=M.subscribe(x=>{s(x.currentClip),l(x.isPlaying),d(x.speed),b(x.time),y(x.duration)}):i.current=null},[]),w=Do(M=>{e.current?.play(M),s(M),l(!0)},[]),p=Do(()=>{e.current?.pause(),l(!1)},[]),g=Do(()=>{e.current?.stop(),s(null),l(!1),b(0)},[]),S=Do(M=>{e.current?.setSpeed(M),d(M)},[]),v=Do(M=>{e.current?.seek?.(M),b(M)},[]);return{clips:t,clipDetails:r,currentClip:a,isPlaying:c,speed:u,time:h,duration:m,play:w,pause:p,stop:g,setSpeed:S,seek:v,handleAnimationsReady:k}}import{useCallback as St,useEffect as _r,useMemo as Kp,useRef as Mt,useState as De}from"react";import{Redo2 as _x,Undo2 as Ax,Upload as Ex,ListRestart as Rx,History as Lx,X as Bx,AlertTriangle as Dk}from"lucide-react";import{useRef as Je,useState as Pe,useEffect as ut,useCallback as fe,useMemo as Mn,Suspense as a2}from"react";import{Box3 as Ty,BufferAttribute as Py,Mesh as ky}from"three";import{acceleratedRaycast as _y,computeBoundsTree as Ay,disposeBoundsTree as Ey,MeshBVH as Ry}from"three-mesh-bvh";var Fh=!1,Oo=new WeakMap,za=new WeakMap;function Ly(){Fh||(ky.prototype.raycast=_y,Fh=!0)}function By(e){let t=new Set;return e.traverse(n=>{let i=n.geometry;!i||!i.attributes?.position||t.add(i)}),[...t]}function jh(e){let t=0;for(let n of e){let i=n.index?n.index.count:n.attributes.position.count;t+=i/3}return t}var Fa=12e6;function Uh(e){return nd(e)>Fa}function nd(e){let t=new Set;return e.traverse(n=>{let i=n.geometry;i?.attributes?.position&&t.add(i)}),jh([...t])}function Dy(e,t){return new Promise((n,i)=>{let r=l=>{let u=l.data;if(!u||!u.error&&!u.serialized)return;if(e.removeEventListener("message",r),e.removeEventListener("error",o),u.error){i(new Error(String(u.error)));return}let{serialized:d}=u,h=Ry.deserialize(d,t,{setIndex:!1});d.index&&(t.index?t.index.array=d.index:t.setIndex(new Py(d.index,1,!1))),t.boundingBox=h.getBoundingBox(new Ty),n(h)},o=l=>{e.removeEventListener("message",r),e.removeEventListener("error",o),i(new Error(l.message||"BVH worker error"))};e.addEventListener("message",r),e.addEventListener("error",o);let a=t.index?t.index.array.slice():null,s=t.attributes.position.array.slice(),c=[s,...a?[a]:[]].map(l=>l.buffer);e.postMessage({index:a,position:s,options:{groups:[...t.groups]}},c)})}async function Oy(){if(typeof window>"u"||typeof Worker>"u")return null;try{let{bvhWorkerCode:e}=await import("./bvhWorkerCode-6366A3UC.mjs"),t=new Blob([e],{type:"text/javascript"}),n=URL.createObjectURL(t),i=new Worker(n);return{worker:i,dispose:()=>{i.terminate(),URL.revokeObjectURL(n)}}}catch{return null}}async function Ny(e,t){if(t)try{return await Dy(t,e)}catch{}let n=Ay.call(e);return e.boundsTree=void 0,await new Promise(i=>setTimeout(i,0)),n}async function Iy(e,t,n){if(e.boundsTree)return;if(t.buildPromise)return t.buildPromise;let i=(async()=>{let r=await n();t.references>0&&!e.boundsTree&&(e.boundsTree=r,t.ownedTree=r)})();return t.buildPromise=i.finally(()=>{t.buildPromise=void 0,t.references===0&&Oo.delete(e)}),t.buildPromise}async function ol(e,t){if(t?.aborted)return;let n=za.get(e);if(!n){if(n=By(e),jh(n)>Fa){za.set(e,[]);return}za.set(e,n);for(let r of n){let o=Oo.get(r)??{references:0};o.references+=1,Oo.set(r,o)}}if(n.length===0)return;Ly();let i=await Oy();if(t?.aborted){i?.dispose();return}try{for(let r of n){if(t?.aborted)return;let o=Oo.get(r);o&&await Iy(r,o,()=>Ny(r,i?.worker))}}finally{i?.dispose()}}function ja(e){let t=za.get(e);if(t){za.delete(e);for(let n of t){let i=Oo.get(n);i&&(i.references=Math.max(0,i.references-1),!(i.references>0)&&(i.ownedTree&&n.boundsTree===i.ownedTree&&(Ey.call(n),n.boundsTree=void 0),i.ownedTree=void 0,i.buildPromise||Oo.delete(n)))}}}import{GizmoHelper as s2,GizmoViewport as l2}from"@react-three/drei";import{useFrame as Zf,useThree as e0}from"@react-three/fiber";import{QRCodeSVG as c2}from"qrcode.react";import{Box3 as sa,PerspectiveCamera as t0,Raycaster as d2,Sphere as u2,Vector2 as p2,Vector3 as Bn}from"three";import{AlertTriangle as zy}from"lucide-react";import{jsx as al,jsxs as Vh}from"react/jsx-runtime";function Ui({title:e,message:t,tone:n="default"}){return Vh("div",{className:`ri-license-overlay${n==="error"?" ri-license-overlay--error":""}`,children:[Vh("div",{className:"ri-license-overlay__header",children:[n==="error"?al(zy,{size:16,className:"ri-license-overlay__icon","aria-hidden":"true"}):al("span",{className:"ri-license-overlay__statusDot","aria-hidden":"true"}),al("span",{className:"ri-license-overlay__title",children:e})]}),al("p",{className:"ri-license-overlay__message",children:t})]})}import{Component as Fy}from"react";var sl=class extends Fy{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n,i){this.props.onLoadError?.(n)}render(){return this.state.hasError?null:this.props.children}};import{PerspectiveCamera as rd,Vector2 as jy}from"three";var Gh="riEditorGizmo";function Hh(e){return e.userData[Gh]=!0,e}function Wh(e){let t=[];return e.traverse(n=>{n.visible&&n.userData[Gh]&&(n.visible=!1,t.push(n))}),()=>{for(let n of t)n.visible=!0}}function ll(e,t={}){if(!e)return Promise.reject(new Error("Viewer not ready"));let{gl:n,scene:i,camera:r,invalidate:o}=e;if(!n.getContextAttributes().preserveDrawingBuffer)return Promise.reject(new Error("Screenshot capture is disabled. Set preserveDrawingBuffer on ModelViewer to enable it."));let{transparent:a=!1}=t,s=n.getSize(new jy),c=n.getPixelRatio(),l=r instanceof rd?r.aspect:null,u=i.background,d=t.width??s.x,h=t.height??s.y,b=d!==s.x||h!==s.y,m=Wh(i);return a&&(i.background=null),b&&(n.setPixelRatio(1),n.setSize(d,h,!1),r instanceof rd&&(r.aspect=d/h,r.updateProjectionMatrix())),o(),new Promise((y,k)=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{let w,p;try{w=n.domElement.toDataURL("image/png")}catch(g){p=g}m(),a&&(i.background=u),b&&(n.setPixelRatio(c),n.setSize(s.x,s.y,!1),r instanceof rd&&l!==null&&(r.aspect=l,r.updateProjectionMatrix())),o(),p?k(p):y(w)})})})}import{useCallback as ul,useEffect as Qy,useState as sd}from"react";import{GLTFExporter as Uy}from"three-stdlib";function Nr(e,t){let n=URL.createObjectURL(e),i=document.createElement("a");i.href=n,i.download=t,i.style.display="none";try{document.body.appendChild(i),i.click()}finally{i.remove(),window.setTimeout(()=>{URL.revokeObjectURL(n)},1e3)}}function $h({scene:e,objectBindings:t,matRefs:n,downloadFilename:i,onComplete:r}){import("three").then(({Group:o,Mesh:a})=>{let s=new o,c=new Map;for(let[d,h]of Object.entries(t))c.set(h.modelObjectId??d,d);let l=d=>{let h=d;for(;h;){let b=h.name||h.uuid,m=c.get(b)??b,y=t[m];if(y?y.visible===!1:h.visible===!1)return!1;h=h.parent}return!0};e.traverse(d=>{let h=d;if(!h.isMesh||!h.geometry||!l(h))return;let b=h.name||h.uuid,m=c.get(b)??b,y=n[m]??h.material;if(!y)return;let k=new a(h.geometry,y);k.name=b,k.applyMatrix4(h.matrixWorld),s.add(k)}),new Uy().parse(s,d=>{let h=d instanceof ArrayBuffer?new Blob([d],{type:"model/gltf-binary"}):new Blob([JSON.stringify(d)],{type:"model/gltf+json"}),b=d instanceof ArrayBuffer?".glb":".gltf";Nr(h,`${i}${b}`),r()},d=>{console.error("GLTFExporter error:",d),r()},{binary:!0})})}import{strToU8 as Gy}from"fflate";import{zip as Vy}from"fflate";function cl(e,t=6){return new Promise((n,i)=>{Vy(e,{level:t},(r,o)=>{r?i(r):n(o)})})}var Ua=2048,Xh=["#00e5ff","#ff4fd8","#ffe45e","#7cff6b","#ff784f","#a78bfa","#38bdf8","#fb7185"];function qh(e){return e.split("&").join("&").split("<").join("<").split(">").join(">").split('"').join(""").split("'").join("'")}function ad(e,t){return e.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||t}function Kh(e){return ad(e,"model")}function id(e,t){return e.index?Math.round(e.index.getX(t)):t}function Hy(e,t,n){let i=id(e,n),r=id(e,n+1),o=id(e,n+2);if(i>=t.count||r>=t.count||o>=t.count)return null;let a=[{index:i,u:t.getX(i),v:t.getY(i)},{index:r,u:t.getX(r),v:t.getY(r)},{index:o,u:t.getX(o),v:t.getY(o)}];return a.every(s=>Number.isFinite(s.u)&&Number.isFinite(s.v))?a:null}function Yh(e){return`${e.u.toFixed(6)},${e.v.toFixed(6)}`}function od(e,t,n,i){let r,o;i?(r=t.index,o=n.index):(r=Yh(t),o=Yh(n));let a=r<o?`${r}|${o}`:`${o}|${r}`,s=e.get(a);s?s.count+=1:e.set(a,{count:1,start:t,end:n})}function Wy(e,t,n){od(e,t[0],t[1],n),od(e,t[1],t[2],n),od(e,t[2],t[0],n)}function $y(e,t){return Array.isArray(e)?e[t]??null:e}function Xy(e){let t=new Map,n=0,i=0,r=0;return e.traverse(o=>{let a=o;if(!a.isMesh||!a.geometry||!a.material)return;let s=a.geometry,c=s.getAttribute("uv");if(!c||c.itemSize<2||c.count<3)return;n+=1;let l=a.name||`Mesh ${n}`,u=s.index?.count??c.count,d=s.groups.length>0?s.groups:[{start:0,count:u,materialIndex:0}];for(let h of d){let b=h.materialIndex??0,m=$y(a.material,b);if(!m)continue;let y=t.get(m.uuid);y||(i+=1,y={name:m.name||`Material ${i}`,layers:new Map},t.set(m.uuid,y));let k=y.layers.get(a.uuid);k||(k={name:l,color:Xh[r%Xh.length],edges:new Map},r+=1,y.layers.set(a.uuid,k));let w=Math.max(0,h.start),p=Math.min(u,w+h.count);for(let g=w;g+2<p;g+=3){let S=Hy(s,c,g);S&&Wy(k.edges,S,!!s.index)}}}),[...t.values()].filter(o=>[...o.layers.values()].some(a=>a.edges.size>0))}function dl(e){return(e*Ua).toFixed(2)}function qy(e){return`M${dl(e.start.u)} ${dl(1-e.start.v)}L${dl(e.end.u)} ${dl(1-e.end.v)}`}function Yy(e){let t=qh(e.name),n=[...e.layers.values()].filter(i=>i.edges.size>0).map((i,r)=>{let o=qh(i.name),a=`${ad(i.name,"mesh")}-${r+1}`,s=[...i.edges.values()],c=s.filter(d=>d.count===1),u=(c.length>0?c:s).map(qy).join("");return[` <g id="${a}" data-mesh="${o}" fill="none" stroke="${i.color}"`,' stroke-width="1" stroke-linejoin="round" vector-effect="non-scaling-stroke">',` <title>${o}</title>`,` <path d="${u}"/>`," </g>"].join(`
|
|
2
|
-
`)}).join(`
|
|
3
|
-
`);return['<?xml version="1.0" encoding="UTF-8"?>',`<svg xmlns="http://www.w3.org/2000/svg" width="${Ua}" height="${Ua}" viewBox="0 0 ${Ua} ${Ua}">`,` <title>${t} UV layout</title>`," <desc>UV0 island-outline template exported by React Immersive. The SVG canvas maps to the complete 0\u20131 texture area.</desc>",' <rect width="2048" height="2048" fill="none" stroke="#94a3b8" stroke-width="2"/>',n,"</svg>"].join(`
|
|
4
|
-
`)}function Ky(e,t="model"){let n=Xy(e),i=Kh(t);return n.map((r,o)=>{let a=ad(r.name,`material-${o+1}`);return{filename:n.length===1?`${i}-uv-layout.svg`:`${i}-uv-${a}-${o+1}.svg`,materialName:r.name,meshCount:[...r.layers.values()].filter(c=>c.edges.size>0).length,svg:Yy(r)}})}async function Qh(e,t="model"){let n=Ky(e,t);if(n.length===0)return n;if(n.length===1)return Nr(new Blob([n[0].svg],{type:"image/svg+xml;charset=utf-8"}),n[0].filename),n;let i=Object.fromEntries(n.map(o=>[o.filename,Gy(o.svg)])),r=await cl(i);return Nr(new Blob([r],{type:"application/zip"}),`${Kh(t)}-uv-layouts.zip`),n}function Jh({sceneRef:e,materialRefs:t,rendererCaptureRef:n,objectBindings:i,downloadFilename:r}){let[o,a]=sd(!1),[s,c]=sd(!1),[l,u]=sd(null);Qy(()=>{if(!s)return;let y=()=>c(!1);return window.addEventListener("pointerdown",y),()=>window.removeEventListener("pointerdown",y)},[s]);let d=ul(()=>{u(null),c(y=>!y)},[]),h=ul(()=>{let y=e.current;y&&(c(!1),a(!0),$h({scene:y,objectBindings:i,matRefs:t.current,downloadFilename:r,onComplete:()=>a(!1)}))},[r,t,i,e]),b=ul(()=>{c(!1),ll(n.current).then(y=>{let k=document.createElement("a");k.href=y,k.download=`${r}.png`,document.body.appendChild(k),k.click(),document.body.removeChild(k)}).catch(y=>{console.error("Screenshot failed:",y)})},[r,n]),m=ul(async()=>{let y=e.current;if(y)try{if((await Qh(y,r)).length===0){u("This model does not contain UV coordinates.");return}u(null),c(!1)}catch(k){console.error("UV layout export failed:",k),u("Could not create the UV layout archive.")}},[r,e]);return{isDownloading:o,downloadMenuOpen:s,uvExportError:l,toggleDownloadMenu:d,handleDownloadMesh:h,handleDownloadScreenshot:b,handleDownloadUvLayout:m}}import{useCallback as No,useEffect as ld,useRef as cd,useState as Va}from"react";import{Box3 as Zh,Raycaster as Jy,Vector2 as Zy,Vector3 as dd}from"three";function ev(e){let t=new Zh().setFromObject(e),n=new dd;return t.getSize(n),{min:[t.min.x,t.min.y,t.min.z],max:[t.max.x,t.max.y,t.max.z],size:[n.x,n.y,n.z]}}function tv(e){let t=new Zh().setFromObject(e);if(t.isEmpty())return null;let n=t.getCenter(new dd),i=t.getSize(new dd).length()/2;return!Number.isFinite(i)||i<=0?null:{center:[n.x,n.y,n.z],radius:i}}function em({canvasAreaRef:e,controlsRef:t,sceneRef:n,modelUrl:i,modelRotation:r,bindingTransformSignature:o,modelLoaded:a}){let[s,c]=Va(!1),[l,u]=Va([]),[d,h]=Va(!1),[b,m]=Va(null),[y,k]=Va(null),w=cd(!1),p=cd(0),g=cd(null);w.current=s;let S=No(P=>{P.updateMatrixWorld(!0),m(ev(P)),k(tv(P))},[]),v=No(()=>u([]),[]),M=No(()=>c(P=>!P),[]),D=No(()=>h(P=>!P),[]),x=No(P=>{w.current&&(g.current={x:P.clientX,y:P.clientY})},[]),C=No(P=>{if(!w.current)return;let _=g.current;if(g.current=null,_&&Math.hypot(P.clientX-_.x,P.clientY-_.y)>6||P.target.closest("button, input, textarea, .ri-measureTools"))return;let L=e.current,I=t.current?.camera,N=n.current;if(!L||!I||!N)return;let R=L.getBoundingClientRect(),F=(P.clientX-R.left)/R.width*2-1,G=-((P.clientY-R.top)/R.height)*2+1,Z=new Jy;Z.setFromCamera(new Zy(F,G),I);let ie=Z.intersectObject(N,!0)[0];ie&&(p.current+=1,u(ve=>[...ve,{id:p.current,position:[ie.point.x,ie.point.y,ie.point.z]}]))},[e,t,n]);return ld(()=>{u([]),m(null),k(null)},[i]),ld(()=>{u([])},[r,o]),ld(()=>{let P=n.current;!a||!P||S(P)},[o,a,S,n]),{measureMode:s,measureModeRef:w,measurePoints:l,showDimensions:d,measureBox:b,modelBounds:y,refreshBounds:S,clearMeasurements:v,toggleMeasureMode:M,toggleDimensions:D,handleMeasurePointerDown:x,handleMeasureClick:C}}import{createPortal as rv}from"react-dom";import{createXRStore as iv}from"@react-three/xr";import{MapPin as ov}from"lucide-react";import{useCallback as Vi,useEffect as Io,useMemo as rm,useRef as av,useState as ri}from"react";function ud(){return typeof navigator>"u"?!1:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function pd(){if(typeof navigator>"u")return!1;let e=navigator.userAgent;return/iPhone|iPad|iPod/i.test(e)?!0:navigator.platform==="MacIntel"&&typeof navigator.maxTouchPoints=="number"&&navigator.maxTouchPoints>1}function tm(){return ud()||pd()}function nv(){if(typeof window>"u"||typeof navigator>"u")return!1;let e=a=>typeof window.matchMedia=="function"&&window.matchMedia(a).matches,t=e("(pointer: coarse)")||e("(any-pointer: coarse)"),n=e("(hover: none)")||e("(any-hover: none)"),i=navigator.maxTouchPoints>0,r=typeof window.screen<"u"&&Math.min(window.screen.width,window.screen.height)<=1024,o=ud();return t||o||i&&n||i&&r}function hd(){if(!nv())return!1;if(ud())return!0;let e=navigator.deviceMemory;return!(typeof e=="number"&&e>=8)}function nm(e="auto"){switch(e){case"high":return!1;case"low":return!0;default:return hd()}}import{Fragment as sv,jsx as zo,jsxs as md}from"react/jsx-runtime";var im={canPlace:!1,isPlacementMode:!0,isModelPlaced:!1};function om({enableXR:e,usdzUrl:t,mobileHandoffUrl:n}){let i=av(null),r=rm(()=>{if(!e||typeof navigator>"u")return null;let F=navigator.xr;if(!F||typeof F.isSessionSupported!="function"||typeof F.addEventListener!="function")return null;try{return iv({emulate:!1})}catch{return null}},[e]),[o,a]=ri(!1),[s,c]=ri(!1),[l,u]=ri(!0),[d,h]=ri(null),[b,m]=ri(!1),[y,k]=ri(!1),[w,p]=ri(im),[g,S]=ri(!1),v=rm(()=>e&&!!t?.trim()&&pd(),[e,t]);Io(()=>{u(tm())},[]);let M=Vi(()=>{if(typeof window>"u")return null;try{let F=new URL(n?.trim()||window.location.href,window.location.href);return F.protocol==="http:"||F.protocol==="https:"?F.toString():null}catch{return null}},[n]);Io(()=>{if(!e||l){h(null),m(!1);return}h(M())},[e,l,M]),Io(()=>{if(r)return r.subscribe(F=>k(F.session!=null&&F.mode==="immersive-ar"))},[r]),Io(()=>{S(!1),p(im)},[y]),Io(()=>{if(!e||typeof navigator>"u")return;let F=navigator.xr;if(!F?.isSessionSupported)return;let G=!1;return F.isSessionSupported("immersive-ar").then(Z=>!G&&a(Z)).catch(()=>{}),F.isSessionSupported("immersive-vr").then(Z=>!G&&c(Z)).catch(()=>{}),()=>{G=!0}},[e]);let D=Vi(()=>{let F=M();F&&(h(F),m(!0))},[M]),x=Vi(()=>m(!1),[]),C=Vi(()=>{let F=t?.trim();if(!F)return;let G=document.createElement("a");G.setAttribute("rel","ar"),G.href=F,G.style.display="none";let Z=document.createElement("img");Z.alt="",Z.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",G.appendChild(Z),document.body.appendChild(G),G.click(),G.remove()},[t]),P=Vi(F=>{p(F),F.isPlacementMode||S(!1)},[]),_=Vi(F=>{S(!1),F?i.current?.finishPlacementMode():i.current?.cancelPlacementMode()},[]),z=Vi(F=>{F.preventDefault(),S(!0),i.current?.startPlacementMode()},[]);Io(()=>{if(!g)return;let F=()=>_(!0),G=()=>_(!1);return window.addEventListener("pointerup",F),window.addEventListener("pointercancel",G),()=>{window.removeEventListener("pointerup",F),window.removeEventListener("pointercancel",G)}},[_,g]);let L=w.isModelPlaced?w.isPlacementMode?w.canPlace?"Release to place":"Move your device over a flat surface":null:w.canPlace?null:"Move your device over a flat surface",I=w.isModelPlaced&&!w.isPlacementMode?"Pinch to resize \xB7 Twist to rotate":null,N=r?.getState().domOverlayRoot??null,R=y&&N?rv(md(sv,{children:[I&&zo("div",{className:"ri-arHintOverlay",children:zo("div",{className:"ri-arHint",children:I})}),zo("div",{className:"ri-arOverlay",children:md("div",{className:"ri-arControls",children:[L&&zo("div",{className:"ri-arStatus",children:L}),w.isModelPlaced&&md("button",{type:"button",className:`ri-arActionButton ${g?"ri-arActionButton--active":""}`,onPointerDown:F=>z(F.nativeEvent),"aria-pressed":g,children:[zo(ov,{size:14}),"Relocate"]}),!w.isModelPlaced&&w.canPlace&&zo("button",{type:"button",className:"ri-arActionButton ri-arActionButton--primary",onClick:()=>i.current?.placeCurrent(),children:"Tap to place"})]})})]}),N):null;return{xrStore:r,presenterRef:i,arSupported:o,vrSupported:s,quickLookSupported:v,resolvedMobileHandoffUrl:d,isMobileHandoffOpen:b,arOverlay:R,openMobileHandoff:D,closeMobileHandoff:x,openQuickLook:C,handleARStateChange:P}}import{Canvas as l1,useThree as c1}from"@react-three/fiber";import{ContactShadows as d1,Environment as u1}from"@react-three/drei";import{XR as p1}from"@react-three/xr";import{NoToneMapping as h1}from"three";import{Suspense as m1,useEffect as g1,useMemo as wl,useState as b1}from"react";import{useFrame as bd,useThree as Gi}from"@react-three/fiber";import{useXR as am}from"@react-three/xr";import{Color as lv,PerspectiveCamera as cv}from"three";import{useEffect as Fo,useLayoutEffect as dv,useRef as gd}from"react";function sm({renderMode:e}){let{scene:t}=Gi(),n=Gi(a=>a.setFrameloop),i=am(a=>a.session!=null),r=am(a=>a.mode==="immersive-ar"),o=gd(void 0);return Fo(()=>{n(i?"always":e)},[i,e,n]),Fo(()=>{r?(o.current=t.background,t.background=null):o.current!==void 0&&(t.background=o.current,o.current=void 0)},[r,t]),bd(()=>{r&&t.background!==null&&(t.background=null)}),null}function lm({onPresentingChange:e}){let t=Gi(r=>r.gl),n=gd(null);Fo(()=>{let r=t.xr;if(!r)return;let o=c=>{c?(n.current=t.shadowMap.enabled,t.shadowMap.enabled=!1):n.current!==null&&(t.shadowMap.enabled=n.current,n.current=null),e(c)},a=()=>o(!0),s=()=>o(!1);return r.addEventListener("sessionstart",a),r.addEventListener("sessionend",s),o(r.isPresenting),()=>{r.removeEventListener("sessionstart",a),r.removeEventListener("sessionend",s)}},[t,e]);let i=gd(0);return bd(()=>{if(!t.xr.isPresenting)return;let r=performance.now();if(r-i.current<1e3)return;i.current=r;let o=t.xr}),null}function cm({active:e}){let t=Gi(n=>n.invalidate);return Fo(()=>{e&&t()},[e,t]),bd(()=>{e&&t()}),null}function dm({color:e}){let{scene:t}=Gi();return Fo(()=>{let n=t.background;return t.background=e?new lv(e):null,()=>{t.background=n}},[t,e]),null}function um({rotation:e}){let{scene:t}=Gi();return dv(()=>{let n=e*Math.PI/180;t.environmentRotation.set(0,n,0),t.backgroundRotation.set(0,n,0)}),null}function pm({cameraConfig:e}){let{camera:t}=Gi();return Fo(()=>{if(!(t instanceof cv))return;let n=e?.fov;typeof n=="number"&&t.fov!==n&&(t.fov=n,t.updateProjectionMatrix())},[t,e]),null}import{useThree as xl}from"@react-three/fiber";import{Autofocus as Ev,Bloom as Rv,BrightnessContrast as Lv,ChromaticAberration as Bv,ColorAverage as Dv,DepthOfField as Ov,DotScreen as Nv,EffectComposer as Iv,Glitch as zv,GodRays as Fv,Grid as jv,HueSaturation as Uv,Noise as Vv,Outline as Gv,Pixelation as Hv,Ramp as Wv,Scanline as $v,SelectiveBloom as Xv,Sepia as qv,SMAA as Yv,SSAO as Kv,ToneMapping as Qv,Vignette as Jv}from"@react-three/postprocessing";import{BlendFunction as Wa,KernelSize as Zv}from"postprocessing";import{Color as yl,Vector2 as $a}from"three";import{memo as e1,useCallback as t1,useEffect as Bm,useMemo as Xa,useRef as Dm,useState as Om}from"react";import{CanvasTexture as mm,Color as gm,ImageLoader as uv,NoColorSpace as pl,RepeatWrapping as hm,SRGBColorSpace as vd,Texture as pv}from"three";var jo=new Map,Ir={color:"#93c5fd",intensity:.07},Ha=new gm(Ir.color).multiplyScalar(Ir.intensity),bm=new gm(Ir.color),fm=.28,Uo=new Map,yd=new Map;function hv(e){return`${e.name}|${e.size}|${e.lastModified}`}function xm(e){let t=hv(e),n=e.name.lastIndexOf("."),i=n>0?e.name.slice(0,n):e.name,r=n>0?e.name.slice(n):"",o=`materials/${e.name}`,a=2;for(;;){let s=yd.get(o);if(s===void 0||s===t)return yd.set(o,t),o;o=`materials/${i}-${a}${r}`,a+=1}}function ym(e){return Uo.get(e)}function vm(e,t){let n=++e.loadGeneration;e.loaded=!1;let i=()=>{if(e.loadGeneration!==n)return;e.loaded=!0;let r=e.pending;e.pending=[];for(let o of r)o()};new uv().load(t,r=>{e.loadGeneration===n&&(e.texture.image=r,e.texture.needsUpdate=!0,i())},void 0,()=>{e.loadGeneration===n&&(console.warn(`Failed to load texture: ${t}`),i())})}function wm(e,t){for(let n of[vd,pl]){let i=jo.get(Ga(e,n));i&&vm(i,t)}}function Cm(e,t){let n=Uo.get(e);n&&n!==t&&n.startsWith("blob:")&&URL.revokeObjectURL(n),Uo.set(e,t),wm(e,t)}function wd(e){let t=Uo.get(e);t&&(t.startsWith("blob:")&&URL.revokeObjectURL(t),Uo.delete(e),yd.delete(e),wm(e,e))}function Ga(e,t){return`${t}|${e}`}function Rt(e,t=pl,n){let i=Ga(e,t),r=jo.get(i);if(r)return n&&!r.loaded&&r.pending.push(n),r.texture;let o=Uo.get(e)??e,a={texture:new pv,refCount:0,loaded:!1,pending:n?[n]:[],loadGeneration:0};return a.texture.flipY=!1,a.texture.colorSpace=t,jo.set(i,a),vm(a,o),a.texture}function hl(e,t=pl,n){let i=Rt(e,t,n);return jo.get(Ga(e,t)).refCount+=1,i}function Hi(e,t=pl){let n=jo.get(Ga(e,t));n&&(n.refCount-=1,n.refCount<=0&&(n.loadGeneration+=1,n.pending=[],n.texture.dispose(),jo.delete(Ga(e,t))))}var fd=null;function ml(){if(fd)return fd;let e=256,t=document.createElement("canvas");t.width=e,t.height=e;let n=t.getContext("2d"),i=n.createRadialGradient(e*.35,e*.35,e*.02,e*.5,e*.5,e*.55);i.addColorStop(0,"#ffffff"),i.addColorStop(.4,"#b5b5b5"),i.addColorStop(1,"#3a3a3a"),n.fillStyle=i,n.fillRect(0,0,e,e);let r=new mm(t);return r.colorSpace=vd,fd=r,r}var xd=null;function Sm(){if(xd)return xd;let e=1024,t=8,n=e/t,i=["#ef4444","#f59e0b","#22c55e","#6366f1"],r=document.createElement("canvas");r.width=e,r.height=e;let o=r.getContext("2d");o.textAlign="center",o.textBaseline="middle";for(let s=0;s<t;s+=1)for(let c=0;c<t;c+=1){let l=c*n,u=s*n,d=(Math.floor(c/2)+Math.floor(s/2))%4;o.fillStyle=i[d],o.fillRect(l,u,n,n),o.strokeStyle="rgba(0, 0, 0, 0.28)",o.lineWidth=2;for(let p=1;p<4;p+=1){let g=p*n/4;o.beginPath(),o.moveTo(l+g,u),o.lineTo(l+g,u+n),o.moveTo(l,u+g),o.lineTo(l+n,u+g),o.stroke()}o.strokeStyle="#09090b",o.lineWidth=7,o.strokeRect(l,u,n,n);let h=l+n*.23,b=u+n*.72,m=l+n*.72,y=u+n*.23;o.lineCap="round",o.lineJoin="round",o.beginPath(),o.moveTo(h,b),o.lineTo(m,y),o.lineTo(m-n*.2,y),o.moveTo(m,y),o.lineTo(m,y+n*.2),o.stroke();let k=s*t+c+1;o.font=`700 ${Math.round(n*.2)}px ui-monospace, SFMono-Regular, Menlo, monospace`,o.fillStyle="#ffffff",o.strokeStyle="rgba(0, 0, 0, 0.85)",o.lineWidth=6;let w=String(k).padStart(2,"0");o.strokeText(w,l+n/2,u+n*.82),o.fillText(w,l+n/2,u+n*.82)}let a=new mm(r);return a.colorSpace=vd,a.wrapS=hm,a.wrapT=hm,a.flipY=!1,a.anisotropy=8,a.needsUpdate=!0,xd=a,a}import{forwardRef as mv,useImperativeHandle as gv,useMemo as bv}from"react";import{BlendFunction as fv,Effect as xv}from"postprocessing";import{Uniform as yv}from"three";import{jsx as wv}from"react/jsx-runtime";var vv=`
|
|
5
|
-
uniform float exposure;
|
|
6
|
-
void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
|
|
7
|
-
outputColor = vec4(inputColor.rgb * exposure, inputColor.a);
|
|
8
|
-
}
|
|
9
|
-
`,Cd=class extends xv{constructor(t=1){super("ExposureEffect",vv,{blendFunction:fv.NORMAL,uniforms:new Map([["exposure",new yv(t)]])})}set exposure(t){this.uniforms.get("exposure").value=t}},Mm=mv(function({exposure:t},n){let i=bv(()=>new Cd(t),[]);return i.exposure=t,gv(n,()=>i,[i]),wv("primitive",{object:i,dispose:null})});import{useFrame as Cv,useThree as gl}from"@react-three/fiber";import*as _m from"@react-three/postprocessing";import{BlendFunction as Sv}from"postprocessing";import{Color as Mv,MathUtils as Tv,Mesh as Pv,Vector2 as Tm,Vector3 as Pm}from"three";import{useEffect as km,useMemo as bl,useRef as Sd}from"react";import{jsx as _v}from"react/jsx-runtime";var kv=_m.LensFlareEffect;function Am({config:e}){let t=gl(h=>h.camera),n=gl(h=>h.raycaster),i=gl(h=>h.scene),r=gl(h=>h.viewport),o=Sd(null),a=Sd(new Pm),s=Sd(new Tm),c=bl(()=>new Pm(...e.lensPosition),[e.lensPosition]),l=bl(()=>new Mv(e.colorGain??"#141414"),[e.colorGain]),u=bl(()=>new Tm(0,0),[]),d=bl(()=>new kv({blendFunction:Sv.NORMAL,enabled:!0,glareSize:e.glareSize,lensPosition:c,screenRes:u,starPoints:6,flareSize:e.flareSize,flareSpeed:e.flareSpeed,flareShape:e.flareShape,animated:e.animated,anamorphic:e.anamorphic,colorGain:l,lensDirtTexture:null,haloScale:e.haloScale,secondaryGhosts:e.secondaryGhosts,aditionalStreaks:e.aditionalStreaks,ghostScale:e.ghostScale,opacity:e.opacity,starBurst:e.starBurst}),[l,e.aditionalStreaks,e.anamorphic,e.animated,e.flareShape,e.flareSize,e.flareSpeed,e.glareSize,e.haloScale,e.ghostScale,e.opacity,e.secondaryGhosts,e.starBurst,c,u]);return km(()=>(o.current=d,()=>{d.dispose(),o.current=null}),[d]),km(()=>{let h=d.uniforms.get("screenRes");h&&(h.value.x=r.width,h.value.y=r.height)},[d,r]),Cv((h,b)=>{let m=o.current;if(!m)return;let y=m.uniforms.get("lensPosition"),k=m.uniforms.get("opacity");if(!y||!k)return;let w=1;if(a.current.copy(c).project(t),a.current.z>1)return;y.value.x=a.current.x,y.value.y=a.current.y,s.current.x=a.current.x,s.current.y=a.current.y,n.setFromCamera(s.current,t);let p=n.intersectObjects(i.children,!0),{object:g}=p[0]||{};g&&(g.userData?.lensflare==="no-occlusion"?w=0:g instanceof Pv&&(g.material.uniforms?._transmission?.value>.2||g.material._transmission&&g.material._transmission>.2?w=.2:g.material.transparent&&(w=g.material.opacity))),k.value=Tv.damp(k.value,w,12,b)}),_v("primitive",{object:d,dispose:null})}import{RampType as Md}from"@react-three/postprocessing";import{GlitchMode as Td,KernelSize as Vo,ToneMappingMode as Pd}from"postprocessing";import{Color as Av}from"three";function Em(e){return e==="linear"?Pd.LINEAR:e==="reinhard"?Pd.REINHARD:Pd.ACES_FILMIC}function fl(e){switch(e){case"verySmall":return Vo.VERY_SMALL;case"small":return Vo.SMALL;case"medium":return Vo.MEDIUM;case"large":return Vo.LARGE;case"veryLarge":return Vo.VERY_LARGE;case"huge":return Vo.HUGE}}function Rm(e){switch(e){case"constantMild":return Td.CONSTANT_MILD;case"constantWild":return Td.CONSTANT_WILD;default:return Td.SPORADIC}}function kd(e){let t=new Av(e);return[t.r,t.g,t.b,1]}function Lm(e){return e==="radial"?Md.Radial:e==="mirroredLinear"?Md.MirroredLinear:Md.Linear}import{Fragment as a1,jsx as ot,jsxs as _d}from"react/jsx-runtime";var Wi={edgeStrength:1,pulseSpeed:0,visibleEdgeColor:new yl(Ir.color).getHex(),hiddenEdgeColor:new yl(Ir.color).multiplyScalar(.35).getHex(),kernelSize:Zv.VERY_SMALL,blur:!1,xRay:!1};function n1(e){let t=[];return e.traverse(n=>{n.isMesh&&t.push(n)}),t}var Ad=[],r1=e1(function({sceneConfig:t,selectedObjectRef:n,highlightOnHover:i=!1,disabled:r=!1,onOutlineEffect:o}){let a=xl(v=>v.scene),s=xl(v=>v.gl),c=Dm(null),l=t?.postProcessing,u=n??null,d=l?.outline.enabled===!0,h=d||i,[b,m]=Om(()=>s.xr?.isPresenting??!1);Bm(()=>{let v=s.xr;if(!v)return;let M=()=>m(!0),D=()=>m(!1);return v.addEventListener("sessionstart",M),v.addEventListener("sessionend",D),m(v.isPresenting),()=>{v.removeEventListener("sessionstart",M),v.removeEventListener("sessionend",D)}},[s]);let y=a.children.filter(v=>v.isLight),k=Xa(()=>new $a(l?.chromaticAberration.offsetX??.002,l?.chromaticAberration.offsetY??.002),[l?.chromaticAberration.offsetX,l?.chromaticAberration.offsetY]),w=Xa(()=>new yl(l?.outline.visibleEdgeColor??"#ffffff").getHex(),[l?.outline.visibleEdgeColor]),p=Xa(()=>new yl(l?.outline.hiddenEdgeColor??"#22090a").getHex(),[l?.outline.hiddenEdgeColor]),g=Xa(()=>kd(l?.ramp.startColor??"#000000"),[l?.ramp.startColor]),S=Xa(()=>kd(l?.ramp.endColor??"#ffffff"),[l?.ramp.endColor]);return!l||b||r?null:_d(a1,{children:[l.godRays.enabled===!0&&_d("mesh",{ref:c,position:l.godRays.sunPosition,visible:!1,frustumCulled:!1,children:[ot("sphereGeometry",{args:[.1,8,8]}),ot("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),_d(Iv,{multisampling:0,enableNormalPass:l.ssao.enabled===!0,autoClear:!1,children:[l.smaa.enabled===!0&&ot(Yv,{}),l.ssao.enabled===!0&&ot(Kv,{samples:l.ssao.samples,rings:l.ssao.rings,intensity:l.ssao.intensity,radius:l.ssao.radius,bias:l.ssao.bias,luminanceInfluence:l.ssao.luminanceInfluence,fade:l.ssao.fade,minRadiusScale:l.ssao.minRadiusScale,worldDistanceThreshold:l.ssao.worldDistanceThreshold,worldDistanceFalloff:l.ssao.worldDistanceFalloff,worldProximityThreshold:l.ssao.worldProximityThreshold,worldProximityFalloff:l.ssao.worldProximityFalloff}),l.autofocus.enabled===!0&&ot(Ev,{focusDistance:l.autofocus.focusDistance,focusRange:l.autofocus.focusRange,focalLength:l.autofocus.focalLength,bokehScale:l.autofocus.bokehScale,target:l.autofocus.target,mouse:l.autofocus.mouse,debug:l.autofocus.debug||void 0,manual:l.autofocus.manual,smoothTime:l.autofocus.smoothTime}),l.autofocus.enabled!==!0&&l.depthOfField.enabled===!0&&ot(Ov,{focusDistance:l.depthOfField.focusDistance,focusRange:l.depthOfField.focusRange,focalLength:l.depthOfField.focalLength,bokehScale:l.depthOfField.bokehScale}),l.bloom.enabled===!0&&ot(Rv,{intensity:l.bloom.intensity,luminanceThreshold:l.bloom.luminanceThreshold,luminanceSmoothing:l.bloom.luminanceSmoothing,mipmapBlur:l.bloom.mipmapBlur,radius:l.bloom.radius,levels:l.bloom.levels}),l.selectiveBloom.enabled===!0&&ot(Xv,{selection:u??void 0,lights:y,selectionLayer:l.selectiveBloom.selectionLayer,intensity:l.selectiveBloom.intensity,luminanceThreshold:l.selectiveBloom.luminanceThreshold,luminanceSmoothing:l.selectiveBloom.luminanceSmoothing,kernelSize:fl(l.selectiveBloom.kernelSize),mipmapBlur:l.selectiveBloom.mipmapBlur,inverted:l.selectiveBloom.inverted,ignoreBackground:l.selectiveBloom.ignoreBackground}),h&&ot(Gv,{ref:o,selection:Ad,selectionLayer:l.outline.selectionLayer,blendFunction:Wa.SCREEN,edgeStrength:d?l.outline.edgeStrength:Wi.edgeStrength,pulseSpeed:d?l.outline.pulseSpeed:Wi.pulseSpeed,visibleEdgeColor:d?w:Wi.visibleEdgeColor,hiddenEdgeColor:d?p:Wi.hiddenEdgeColor,kernelSize:d?fl(l.outline.kernelSize):Wi.kernelSize,blur:d?l.outline.blur:Wi.blur,xRay:d?l.outline.xRay:Wi.xRay}),l.chromaticAberration.enabled===!0&&ot(Bv,{offset:k,radialModulation:l.chromaticAberration.radialModulation,modulationOffset:l.chromaticAberration.modulationOffset}),l.colorAverage.enabled===!0&&ot(Dv,{}),l.dotScreen.enabled===!0&&ot(Nv,{angle:l.dotScreen.angle,scale:l.dotScreen.scale}),l.glitch.enabled===!0&&ot(zv,{mode:Rm(l.glitch.mode),delay:new $a(l.glitch.delay[0],l.glitch.delay[1]),duration:new $a(l.glitch.duration[0],l.glitch.duration[1]),strength:new $a(l.glitch.strength[0],l.glitch.strength[1]),chromaticAberrationOffset:new $a(l.glitch.chromaticAberrationOffset[0],l.glitch.chromaticAberrationOffset[1]),columns:l.glitch.columns,ratio:l.glitch.ratio,active:!0}),l.grid.enabled===!0&&ot(jv,{scale:l.grid.scale,lineWidth:l.grid.lineWidth}),l.lensflare.enabled===!0&&ot(Am,{config:l.lensflare}),l.godRays.enabled===!0&&ot(Fv,{sun:c,samples:l.godRays.samples,density:l.godRays.density,decay:l.godRays.decay,weight:l.godRays.weight,exposure:l.godRays.exposure,clampMax:l.godRays.clampMax,blur:l.godRays.blur,kernelSize:fl(l.godRays.kernelSize)}),l.noise.enabled===!0&&ot(Vv,{premultiply:l.noise.premultiply,opacity:l.noise.opacity,blendFunction:Wa.ADD}),l.brightnessContrast.enabled===!0&&ot(Lv,{brightness:l.brightnessContrast.brightness,contrast:l.brightnessContrast.contrast}),l.hueSaturation.enabled===!0&&ot(Uv,{hue:l.hueSaturation.hue,saturation:l.hueSaturation.saturation}),l.toneMapping.enabled===!0&&ot(Mm,{exposure:l.toneMapping.exposure}),l.vignette.enabled===!0&&ot(Jv,{eskil:l.vignette.eskil,offset:l.vignette.offset,darkness:l.vignette.darkness,blendFunction:Wa.NORMAL}),l.toneMapping.enabled===!0&&ot(Qv,{mode:Em(l.toneMapping.mode),resolution:l.toneMapping.resolution,whitePoint:l.toneMapping.whitePoint,middleGrey:l.toneMapping.middleGrey,minLuminance:l.toneMapping.minLuminance,averageLuminance:l.toneMapping.averageLuminance,adaptationRate:l.toneMapping.adaptationRate}),l.sepia.enabled===!0&&ot(qv,{intensity:l.sepia.intensity,blendFunction:Wa.NORMAL}),l.scanline.enabled===!0&&ot($v,{density:l.scanline.density,blendFunction:Wa.OVERLAY}),l.pixelation.enabled===!0&&ot(Hv,{granularity:l.pixelation.granularity}),l.ramp.enabled===!0&&ot(Wv,{rampType:Lm(l.ramp.rampType),rampStart:l.ramp.rampStart,rampEnd:l.ramp.rampEnd,startColor:g,endColor:S,opacity:l.ramp.rampMask?1:l.ramp.opacity??.5,rampBias:l.ramp.rampBias,rampGain:l.ramp.rampGain,rampMask:l.ramp.rampMask,rampInvert:l.ramp.rampInvert})]})]})});function i1(e){let t=[e];for(;t.length>0;){let n=t.pop();if(n.visible){if(n.isMesh)return!0;t.push(...n.children)}}return!1}function o1(e,t){return e.length===t.length&&e.every((n,i)=>n===t[i])}function Nm({hoveredObjectRef:e,...t}){let n=xl(c=>c.scene),i=xl(c=>c.invalidate),[r,o]=Om(null),a=t1(c=>o(c),[]),s=Dm({effect:null,objects:Ad});return Bm(()=>{if(!r)return;let l=t.sceneConfig?.postProcessing?.outline.enabled===!0?n1(n):e&&i1(e)?[e]:Ad;s.current.effect===r&&o1(s.current.objects,l)||(s.current={effect:r,objects:l},r.selection.set(l),i())}),ot(r1,{...t,onOutlineEffect:a})}import{Component as s1}from"react";var vl=class extends s1{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n,i){this.props.onError?.(n)}render(){return this.state.hasError?this.props.fallback??null:this.props.children}};import{Fragment as y1,jsx as Nn,jsxs as Im}from"react/jsx-runtime";var f1=1.5;function x1({captureRef:e}){let{gl:t,scene:n,camera:i,invalidate:r}=c1();return g1(()=>{if(e)return e.current={gl:t,scene:n,camera:i,invalidate:r},()=>{e.current=null}},[e,t,n,i,r]),null}function Ed({children:e,camera:t,backgroundColor:n,shadows:i=!0,sceneConfig:r,selectedObjectRef:o,hoveredObjectRef:a,highlightOnHover:s,renderMode:c="demand",maxDpr:l=2,xrStore:u,rendererCaptureRef:d,preserveDrawingBuffer:h=!1,reduceGpuLoad:b}){let m=b??hd(),y=m?Math.min(l,f1):l,k=i&&!m,w=wl(()=>n?{background:n}:r?.background.enabled?r.background.type==="color"?{background:r.background.color}:r.background.type==="image"&&r.background.imageUrl.trim()?{backgroundImage:`url("${r.background.imageUrl}")`,backgroundPosition:"center",backgroundRepeat:"no-repeat",backgroundSize:"cover"}:{background:"linear-gradient(180deg, #3a3a3c 0%, #1c1c1d 100%)"}:{background:"transparent"},[n,r]),p=wl(()=>{if(n)return n;let P=r?.background;if(P?.enabled){if(P.type==="color")return P.color;if(P.type==="image"&&P.imageUrl.trim()||P.type==="environment")return null}return"#1c1c1d"},[n,r]),g=wl(()=>{let P=r?.postProcessing;return P?!!(P.glitch.enabled||P.noise.enabled||P.lensflare.enabled&&P.lensflare.animated):!1},[r?.postProcessing]),[S,v]=b1(!1),M=r?.environment,D=r?.groundShadows,x=wl(()=>{if(!M)return null;if(M.source==="custom"){let P=M.customEnvironmentUrl.trim();return rl(P)?{files:P}:null}return{preset:M.preset}},[M]),C=Im(y1,{children:[Nn(x1,{captureRef:d}),Nn(pm,{cameraConfig:t}),Nn(cm,{active:g}),Nn(dm,{color:p}),x?Nn(vl,{onError:P=>console.warn("Failed to load environment map:",P),children:Nn(m1,{fallback:null,children:Nn(u1,{...x,environmentIntensity:M?.intensity??.25,backgroundIntensity:M?.intensity??.25,background:r?.background.enabled===!0&&r.background.type==="environment"})})}):null,Nn(um,{rotation:M?.rotation??0}),u&&Nn(lm,{onPresentingChange:v}),D?.enabled&&D.mode==="shadowCatcher"&&!S&&Nn(d1,{position:[0,D.height,0],scale:D.size,opacity:D.intensity,blur:D.borderFade,far:15,resolution:1024,color:"#000000"}),e,Nn(Nm,{sceneConfig:r,selectedObjectRef:o,hoveredObjectRef:a,highlightOnHover:s,disabled:m})]});return Nn(l1,{frameloop:c,dpr:[1,y],shadows:k?"soft":!1,resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:w,camera:t??{fov:50},gl:{preserveDrawingBuffer:h,toneMapping:h1,toneMappingExposure:1},children:u?Im(p1,{store:u,children:[Nn(sm,{renderMode:c}),C]}):C})}import{CameraControls as v1,PointerLockControls as w1}from"@react-three/drei";import{Box3 as C1,Vector3 as zm}from"three";import{useEffect as qa,useRef as S1}from"react";import{jsx as Fm}from"react/jsx-runtime";var ii={minDistance:0,maxDistance:1/0,minPolarAngle:0,maxPolarAngle:Math.PI,minAzimuthAngle:-1/0,maxAzimuthAngle:1/0,boundaryEnclosesCamera:!1,boundaryFriction:0};function Rd({controlsRef:e,onCameraChange:t,cameraLimits:n,controllerType:i="orbit",onPointerLockExit:r}){let o=i==="orbit",a=S1(null);return qa(()=>{if(!o)return a.current?.lock(),()=>{a.current?.unlock()}},[o]),qa(()=>{o&&document.pointerLockElement&&document.exitPointerLock()},[o]),qa(()=>{if(o)return;let s=()=>{document.pointerLockElement||r?.()};return document.addEventListener("pointerlockchange",s),()=>{document.removeEventListener("pointerlockchange",s)}},[o,r]),qa(()=>{if(!o||!t||!e||typeof e!="object"||!("current"in e))return;let s=e.current;if(!s)return;let c=()=>{t(s.camera,s)};return s.addEventListener("update",c),()=>{s.removeEventListener("update",c)}},[o,e,t]),qa(()=>{if(!o||!e||typeof e!="object"||!("current"in e))return;let s=e.current;s&&(s.minDistance=n?.minDistance??ii.minDistance,s.maxDistance=n?.maxDistance??ii.maxDistance,s.minPolarAngle=n?.minPolarAngle??ii.minPolarAngle,s.maxPolarAngle=n?.maxPolarAngle??ii.maxPolarAngle,s.minAzimuthAngle=n?.minAzimuthAngle??ii.minAzimuthAngle,s.maxAzimuthAngle=n?.maxAzimuthAngle??ii.maxAzimuthAngle,s.boundaryEnclosesCamera=n?.boundaryEnclosesCamera??ii.boundaryEnclosesCamera,s.boundaryFriction=n?.boundaryFriction??ii.boundaryFriction,s.setBoundary(n?.panBoundary?new C1(new zm(...n.panBoundary[0]),new zm(...n.panBoundary[1])):void 0))},[o,e,n?.minDistance,n?.maxDistance,n?.minPolarAngle,n?.maxPolarAngle,n?.minAzimuthAngle,n?.maxAzimuthAngle,n?.boundaryEnclosesCamera,n?.boundaryFriction,n?.panBoundary]),o?Fm(v1,{ref:e,makeDefault:!0,smoothTime:.3,dollyToCursor:!0}):Fm(w1,{ref:a,makeDefault:!0,selector:"[data-ri-pointer-lock-trigger]"})}import{useRef as Bd,useMemo as Cl,useEffect as T1}from"react";import{useFrame as P1,useThree as jm}from"@react-three/fiber";import{Vector3 as k1}from"three";var Ld=Symbol("react-immersive.model-node-id");function M1(e,t){Object.defineProperty(e,Ld,{value:t,configurable:!0})}function Go(e){let t=new Map;e.traverse(c=>{if(!c.name)return;let l=t.get(c.name);l?l.push(c):t.set(c.name,[c])});let n=Object.create(null),i=new WeakMap,r=new Map,o=new Set(Array.from(t,([c,l])=>l.length===1?c:null).filter(c=>c!==null)),a=new Set,s=(c,l)=>{M1(c,l),n[l]=c,i.set(c,l),a.add(l)};for(let[c,l]of t)l.length===1&&s(l[0],c);for(let[c,l]of t){if(l.length<2)continue;let u=[];l.forEach((d,h)=>{let b=`${c} [${h+1}]`,m=b,y=2;for(;o.has(m)||a.has(m);)m=`${b}.${y++}`;s(d,m),u.push(m)}),r.set(c,u)}return{nodesById:n,idByNode:i,duplicateNames:r}}function Ya(e){return e[Ld]??e.name??null}function zr(e,t){let n=null,i=[];return e.traverse(r=>{r[Ld]===t&&(n=r),r.name===t&&i.push(r)}),n??(i.length===1?i[0]:null)}import{Fragment as B1,jsx as $i,jsxs as D1}from"react/jsx-runtime";function Vm(e,t){if(!t)return e;let n=t*Math.PI/180,i=Math.cos(n),r=Math.sin(n);return[e[0]*i+e[2]*r,e[1],-e[0]*r+e[2]*i]}function _1(e,t){let[n,i,r]=e.center,o=e.radius,a=Math.hypot(t[0],t[1],t[2]),s=a>1e-6?[t[0]/a,t[1]/a,t[2]/a]:[0,1,0],c=o*2;return{position:[n+s[0]*c,i+s[1]*c,r+s[2]*c],target:e.center,extent:o,near:Math.max(o/100,.001),far:c+o*2}}function A1(e,t){let n=t[0]-e.center[0],i=t[1]-e.center[1],r=t[2]-e.center[2],o=Math.hypot(n,i,r);return{near:Math.max(o-e.radius,o*.01,.001),far:o+e.radius*2}}function E1(e,t,n){return t&&n&&!e.attachedToCamera?n.center:[0,0,0]}var R1={ambient:{intensity:.25,color:"#ffffff"},lights:[{id:"light-hemi",type:"hemisphere",color:"#ffffff",intensity:.3,position:[0,1,0],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0},{id:"light-key",type:"directional",color:"#ffffff",intensity:2.5,position:[6,12,6],attachedToCamera:!1,castShadow:!0,shadowBias:-5e-4,visible:!0},{id:"light-fill",type:"directional",color:"#ffffff",intensity:0,position:[-6,8,-6],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0}]},L1={enabled:!0,mapSize:2048,bias:-5e-4,normalBias:.02,radius:3};function Um({light:e,shadows:t,shadowsEnabled:n,environmentRotation:i,modelBounds:r,objectBindings:o,nodeRefs:a}){let s=Bd(null),c=Bd(null),l=Bd(null),u=jm(w=>w.camera),d=jm(w=>w.scene),h=Cl(()=>new k1,[]),b=Cl(()=>e.attachedToCamera||e.attachment?e.position:Vm(e.position,i),[e.position,e.attachedToCamera,e.attachment,i]);P1(()=>{let w=s.current??c.current??l.current;if(!w)return;if(e.attachedToCamera){w.position.copy(u.position);return}let p=e.attachment;if(!p)return;let g=o?il(o,p.objectId):null,v=(g?o?.[g]:void 0)?.modelObjectId??p.objectId,M=(g?a?.current[g]:void 0)??zr(d,v);M&&(h.fromArray(p.offset),M.localToWorld(h),w.position.copy(h))});let m=n&&t.enabled&&e.castShadow,y=Cl(()=>e.type==="directional"&&m&&r&&!e.attachedToCamera?_1(r,b):null,[e.type,e.attachedToCamera,m,r,b]),k=Cl(()=>e.type==="spot"&&m&&r&&!e.attachedToCamera?A1(r,b):null,[e.type,e.attachedToCamera,m,r,b]);return T1(()=>{let w=s.current??l.current;if(!w)return;let[p,g,S]=E1(e,m,r);w.target.position.set(p,g,S),w.target.updateMatrixWorld()},[e,m,r]),!e.visible||e.type==="none"?null:e.type==="directional"?$i("directionalLight",{ref:s,color:e.color,intensity:e.intensity,position:y?.position??b,castShadow:m,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias,"shadow-normalBias":t.normalBias,"shadow-radius":t.radius,"shadow-camera-near":y?.near??.5,"shadow-camera-far":y?.far??40,"shadow-camera-left":-(y?.extent??8),"shadow-camera-right":y?.extent??8,"shadow-camera-top":y?.extent??8,"shadow-camera-bottom":-(y?.extent??8)}):e.type==="point"?$i("pointLight",{ref:c,color:e.color,intensity:e.intensity,position:b,distance:e.distance,decay:e.decay,castShadow:m,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias}):e.type==="spot"?$i("spotLight",{ref:l,color:e.color,intensity:e.intensity,position:b,angle:e.angle??Math.PI/6,penumbra:e.penumbra??.2,distance:e.distance,decay:e.decay,castShadow:m,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias,"shadow-normalBias":t.normalBias,"shadow-radius":t.radius,"shadow-camera-near":k?.near??.5,"shadow-camera-far":k?.far??40}):e.type==="hemisphere"?$i("hemisphereLight",{color:e.color,groundColor:"#444444",intensity:e.intensity}):null}function Dd({lightingConfig:e,shadowConfig:t,shadowsEnabled:n=!0,environmentRotation:i=0,environmentConfig:r,modelBounds:o,objectBindings:a,nodeRefs:s}){let c=e??R1,l=t??L1,u=r?.shadowLight,d=Vm([5,10,5],i);return D1(B1,{children:[$i("ambientLight",{intensity:c.ambient.intensity,color:c.ambient.color}),c.lights.map(h=>$i(Um,{light:h,shadows:l,shadowsEnabled:n,environmentRotation:i,modelBounds:o,objectBindings:a,nodeRefs:s},h.id)),u?.enabled&&$i(Um,{light:{id:"light-env-shadow",type:"directional",color:"#ffffff",intensity:u.intensity,position:d,attachedToCamera:!1,castShadow:!0,shadowBias:u.bias,visible:!0},shadows:l,shadowsEnabled:n,environmentRotation:0,modelBounds:o,objectBindings:a,nodeRefs:s})]})}import{useState as Lw,useEffect as Lt,useRef as nn,useMemo as bn}from"react";import{useFrame as qd,useThree as Bw}from"@react-three/fiber";import{useLoader as sg,useThree as nw}from"@react-three/fiber";import{FileLoader as rw,Loader as iw,LoadingManager as ow}from"three";import{FBXLoader as aw,GLTFLoader as sw,MTLLoader as lw,OBJLoader as cw}from"three-stdlib";import{USDLoader as dw}from"three/examples/jsm/loaders/USDLoader.js";import{strFromU8 as O1,strToU8 as N1,unzip as I1}from"fflate";var Gm;function Hm(e){Gm=e}function Ka(e){Gm?.(e)}var z1=[".glb",".gltf",".obj",".fbx",".usdz",".zip"],F1=["model/gltf-binary","model/gltf+json","model/vnd.usdz+zip","application/vnd.usdz+zip","application/zip","application/x-zip-compressed"],Qa=1024*1024,Wm=128*Qa,$m=1024,Xm=128*Qa,qm=256*Qa,Ym=200,j1=Qa,Fr=new Map,Zm=".glb,.gltf,.obj,.fbx,.usdz,.zip,model/gltf-binary,model/gltf+json,model/vnd.usdz+zip,application/vnd.usdz+zip,application/zip";function Nd(e){let t=e.split(/[?#]/,1)[0].toLowerCase();return t.endsWith(".obj")?"obj":t.endsWith(".fbx")?"fbx":t.endsWith(".usdz")?"usdz":t.endsWith(".gltf")?"gltf":"glb"}function eg(e){return Fr.get(e)??{format:Nd(e)}}function U1(e){let t=e.name.toLowerCase();return z1.some(n=>t.endsWith(n))||F1.includes(e.type)}async function Id(e){if(!U1(e))throw new Error("Unsupported model file. Please upload a .glb, .gltf, .obj, .fbx, .usdz, or .zip asset.");let t=e.name.toLowerCase();if(t.endsWith(".usdz")||e.type==="model/vnd.usdz+zip"||e.type==="application/vnd.usdz+zip")return Km(e,"usdz");if(t.endsWith(".zip")||V1(e.type))return G1(e);if(t.endsWith(".gltf")||e.type==="model/gltf+json")return Qm(e);let n=Nd(e.name);return n==="gltf"?Qm(e):Km(e,n)}function Km(e,t){let n=URL.createObjectURL(e);return Fr.set(n,{format:t,entryPath:e.name}),{url:n,name:e.name,format:t,cleanup:()=>{Ka(n),Fr.delete(n),URL.revokeObjectURL(n)}}}function V1(e){return e==="application/zip"||e==="application/x-zip-compressed"}async function Qm(e){let t=await e.text(),n=tg(t,e.name);for(let r of ng(n))if(!zd(r))throw new Error(`${e.name} references external assets. Upload a .zip containing the .gltf file and its dependencies.`);let i=URL.createObjectURL(e);return Fr.set(i,{format:"gltf",entryPath:e.name}),{url:i,name:e.name,format:"gltf",cleanup:()=>{Ka(i),Fr.delete(i),URL.revokeObjectURL(i)}}}async function G1(e){if(e.size>Wm)throw new Error(`Model zip is too large. The compressed archive must be ${Od(Wm)} or smaller.`);let t=await H1(new Uint8Array(await e.arrayBuffer())),n=new Map;for(let[a,s]of Object.entries(t)){let c=Fd(a);!c||rg(c)||n.set(c,s)}let i=[...n.keys()].filter(a=>/\.(gltf|obj|fbx)$/i.test(a));if(i.length===0)throw new Error("Invalid model zip: no .gltf, .obj, or .fbx file found.");if(i.length>1)throw new Error("Invalid model zip: multiple model entry files found.");let r=i[0],o=Nd(r);if(o==="gltf")return $1(e,r,n);if(o==="obj"||o==="fbx")return W1(e,r,o,n);throw new Error(`Unsupported model entry ${r}.`)}function H1(e){return new Promise((t,n)=>{let i=0,r=0,o=null,a=c=>(o??(o=new Error(`Invalid model zip: ${c}`)),!1);I1(e,{filter:c=>{if(o)return!1;if(i+=1,i>$m)return a(`archive contains more than ${$m.toLocaleString()} entries.`);if(c.originalSize>Xm)return a(`${c.name} expands beyond the ${Od(Xm)} per-file limit.`);if(r+=c.originalSize,r>qm)return a(`expanded contents exceed ${Od(qm)}.`);if(c.originalSize>=j1&&(c.size===0||c.originalSize/c.size>Ym))return a(`${c.name} exceeds the ${Ym}:1 compression-ratio limit.`);let l=Fd(c.name);return!!l&&!rg(l)}},(c,l)=>{o?n(o):c?n(new Error(`Invalid model zip: ${c.message}`)):t(l)})})}function Od(e){return`${e/Qa} MiB`}function W1(e,t,n,i){let r=[],o={};for(let[s,c]of i){let l=URL.createObjectURL(new Blob([c],{type:ig(s)}));r.push(l),o[s]=l}let a=o[t];if(!a)throw r.forEach(s=>URL.revokeObjectURL(s)),new Error(`Invalid model zip: could not read ${t}.`);return Fr.set(a,{format:n,entryPath:t,resourceUrls:o}),{url:a,name:e.name,format:n,cleanup:()=>{Ka(a),Fr.delete(a),r.forEach(s=>URL.revokeObjectURL(s))}}}function $1(e,t,n){let i=n.get(t);if(!i)throw new Error("Invalid GLTF zip: no .gltf found.");let r=tg(O1(i),t);X1(r,t);let o=q1(t),a=[];try{Jm(r.buffers,o,n,a),Jm(r.images,o,n,a);let s=new Blob([N1(JSON.stringify(r))],{type:"model/gltf+json"}),c=URL.createObjectURL(s);return a.push(c),Fr.set(c,{format:"gltf",entryPath:t}),{url:c,name:e.name,format:"gltf",cleanup:()=>{Ka(c),Fr.delete(c),a.forEach(l=>URL.revokeObjectURL(l))}}}catch(s){throw a.forEach(c=>URL.revokeObjectURL(c)),s}}function Jm(e,t,n,i){for(let r of e??[]){if(typeof r.uri!="string"||zd(r.uri))continue;let o=Y1(t,r.uri),a=n.get(o);if(!a)throw new Error(`Invalid GLTF zip: missing referenced asset ${r.uri}.`);let s=URL.createObjectURL(new Blob([a],{type:ig(o)}));i.push(s),r.uri=s}}function tg(e,t){try{return JSON.parse(e)}catch{throw new Error(`${t} is not a valid .gltf JSON file.`)}}function ng(e){return[...e.buffers??[],...e.images??[]].map(t=>t.uri).filter(t=>typeof t=="string"&&t.length>0)}function X1(e,t){for(let n of ng(e)){if(zd(n))continue;let i=/^[a-z][a-z0-9+.-]*:/i.test(n),r=n.startsWith("/")||n.startsWith("\\");if(i||r)throw new Error(`${t} references external assets. Include every dependency inside the uploaded .zip.`)}}function zd(e){return e.startsWith("data:")}function Fd(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(i=>i&&i!==".")){if(n===".."){t.pop();continue}t.push(n)}return t.join("/")}function rg(e){let t=e.split("/");return e.endsWith("/")||t.includes("__MACOSX")||t.some(n=>n===".DS_Store"||n.startsWith("._"))}function q1(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t)}function Y1(e,t){let n=t.split(/[?#]/)[0],i=K1(n);return Fd(e?`${e}/${i}`:i)}function K1(e){try{return decodeURI(e)}catch{return e}}function ig(e){let t=e.toLowerCase();return t.endsWith(".obj")||t.endsWith(".mtl")?"text/plain":t.endsWith(".fbx")?"application/octet-stream":t.endsWith(".usdz")?"model/vnd.usdz+zip":t.endsWith(".bin")?"application/octet-stream":t.endsWith(".png")?"image/png":t.endsWith(".jpg")||t.endsWith(".jpeg")?"image/jpeg":t.endsWith(".webp")?"image/webp":t.endsWith(".avif")?"image/avif":t.endsWith(".ktx2")?"image/ktx2":"application/octet-stream"}import{useGLTF as l5}from"@react-three/drei";import{useThree as d5}from"@react-three/fiber";import{useMemo as p5}from"react";import{SRGBColorSpace as Q1}from"three";import{DRACOLoader as J1,KTX2Loader as Z1,MeshoptDecoder as ew}from"three-stdlib";function tw(e){return{name:"RI_unlit_emissive_texture",async afterRoot(t){let n=e.json.materials??[],i=new Map;if(n.forEach(o=>{let a=!!o?.extensions?.KHR_materials_unlit,s=!!o?.pbrMetallicRoughness?.baseColorTexture;a&&!s&&o?.emissiveTexture&&o.name&&i.set(o.name,o.emissiveTexture.index)}),i.size===0||!t.scene)return;let r=new Map;await Promise.all([...i].map(async([o,a])=>{let s=await e.getDependency("texture",a);s&&(s.colorSpace=Q1,r.set(o,s))})),t.scene.traverse(o=>{let a=Array.isArray(o.material)?o.material:o.material?[o.material]:[];for(let s of a){let c=s.name?r.get(s.name):void 0;c&&!s.map&&(s.map=c,s.needsUpdate=!0)}})}}}var jd="https://assets.react-immersive.liveroom.dev/three-r184/draco/",Ud="https://assets.react-immersive.liveroom.dev/three-r184/basis/";function og(e,t={},n){let{dracoDecoderPath:i=jd,ktx2TranscoderPath:r=Ud,meshopt:o=!0}=t;if(i){let a=new J1;a.setDecoderPath(i),e.setDRACOLoader(a)}if(o&&e.setMeshoptDecoder(ew),r&&n){let a=new Z1().setTranscoderPath(r).detectSupport(n);e.setKTX2Loader(a)}e.register((a=>tw(a)))}var Sl=class extends iw{constructor(){super(...arguments);this.options={source:{format:"glb"}}}configure(n){return this.options=n,this}load(n,i,r,o){this.loadAsset(n,r).then(i).catch(o)}async loadAsset(n,i){let r=pw(this.options.source),{format:o}=this.options.source;if(o==="obj")return uw(n,r,this.options.source,i);if(o==="fbx"){let c=Vd(this,new aw(r)),l=gw(n,this.options.source);l&&c.setResourcePath(l);let u=await c.loadAsync(n,i);return Gd(u,"FBXMesh",!1),{scene:u,animations:u.animations??[]}}if(o==="usdz"){let l=await Vd(this,new dw(r)).loadAsync(n,i);return Gd(l,"USDZMesh",!1),{scene:l,animations:l.animations??[]}}let a=Vd(this,new sw(r));og(a,this.options.decoderConfig,this.options.renderer);let s=await a.loadAsync(n,i);return{scene:s.scene,animations:s.animations??[]}}};Hm(e=>{sg.clear(Sl,e)});function lg(e,t={},n,i){let r=nw(s=>s.gl),o=eg(e),a=n?{...o,format:n}:o;return sg(Sl,e,s=>{s.configure({source:a,decoderConfig:t,renderer:r})},i)}async function uw(e,t,n,i){let r=await ag(e,t,i),o=new cw(t),a=hw(r);if(a){let c=mw(a,e,n);if(c)try{let l=await ag(c.url,t),d=new lw(t).parse(l,c.basePath);d.preload(),o.setMaterials(d)}catch(l){console.warn(`[react-immersive] Could not load OBJ material ${a}; rendering geometry with fallback materials.`,l)}}let s=o.parse(r);return Gd(s,"OBJMesh",!0),{scene:s,animations:[]}}function Gd(e,t,n){let i=new Set,r=0;e.traverse(o=>{if(!("isMesh"in o&&o.isMesh===!0)){o.name&&i.add(o.name);return}let s=o.name||`${t}_${++r}`;if(!n&&o.name){i.add(o.name);return}let c=s,l=2;for(;i.has(c);)c=`${s}_${l++}`;o.name=c,i.add(c)})}function ag(e,t,n){let i=new rw(t);return i.setResponseType("text"),i.loadAsync(e,n)}function Vd(e,t){return t.setCrossOrigin(e.crossOrigin),t.setWithCredentials(e.withCredentials),t.setRequestHeader(e.requestHeader),t}function pw(e){let t=new ow,n=e.resourceUrls;return n&&t.setURLModifier(i=>{if(/^(?:blob:|data:)/i.test(i))return i;let r=Tl(dg(i).split(/[?#]/)[0]),o=n[r];if(o)return o;let a=Ml(e.entryPath??""),s=Tl(a?`${a}/${r}`:r);return n[s]??i}),t}function hw(e){return/^\s*mtllib\s+(.+?)\s*$/im.exec(e)?.[1]?.trim()||null}function mw(e,t,n){if(n.resourceUrls&&n.entryPath){let i=Tl(`${Ml(n.entryPath)}/${dg(e)}`),r=n.resourceUrls[i];if(!r)return null;let o=Ml(i);return{url:r,basePath:o?`${o}/`:""}}try{let i=new URL(e,t).href;return{url:i,basePath:cg(i)}}catch{return null}}function gw(e,t){if(t.resourceUrls&&t.entryPath){let n=Ml(t.entryPath);return n?`${n}/`:""}return cg(e)}function cg(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t+1)}function Ml(e){let t=Tl(e),n=t.lastIndexOf("/");return n===-1?"":t.slice(0,n)}function Tl(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(i=>i&&i!=="."))n===".."?t.pop():t.push(n);return t.join("/")}function dg(e){try{return decodeURI(e)}catch{return e}}import{MeshStandardMaterial as Dw,MeshBasicMaterial as Yd,MeshNormalMaterial as Ow,MeshMatcapMaterial as Nw,DoubleSide as Iw,NormalBlending as zw,AnimationMixer as Fw,LoopOnce as jw,LoopRepeat as Uw,Box3 as Ol,Vector3 as qi,Matrix4 as Vw,MathUtils as Nl}from"three";import{SkeletonUtils as Gw}from"three-stdlib";function ug(e){let t=new Map;return e.map((n,i)=>{let o=n.name.trim()||`Animation ${i+1}`,a=t.get(o)??0;return t.set(o,a+1),{clip:n,sourceName:a===0?o:`${o} (${a+1})`,duration:n.duration}})}import{AdditiveBlending as bw,BackSide as fw,DoubleSide as xw,FrontSide as yw,NoColorSpace as vw,NormalBlending as ww,SRGBColorSpace as Cw,Vector2 as pg}from"three";function hg(e){return!!(e&&typeof e=="object"&&"clone"in e&&"color"in e&&"metalness"in e&&"roughness"in e)}function mg(e){return!!(e&&typeof e=="object"&&"isMeshPhysicalMaterial"in e&&e.isMeshPhysicalMaterial)}function Wn(e){return!!(e&&"isMesh"in e&&e.isMesh)}var Ja=["texture","metalnessMap","roughnessMap","emissiveMap","alphaMap","normalMap","bumpMap","aoMap","displacementMap","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","anisotropyMap","transmissionMap","thicknessMap","sheenColorMap","sheenRoughnessMap","specularIntensityMap","specularColorMap"],Sw=new Set(["texture","emissiveMap","sheenColorMap","specularColorMap"]);function Xi(e){return Sw.has(e)?Cw:vw}function mt(e,t){return e?.[t]?.path}function gg(e){return e==="back"?fw:e==="double"?xw:yw}function bg(e){return e==="additive"?bw:ww}function jr(e,t=1,n=t){if(e&&typeof e=="object"){let i=e;if(typeof i.x=="number"&&Number.isFinite(i.x)&&typeof i.y=="number"&&Number.isFinite(i.y))return new pg(i.x,i.y)}return new pg(t,n)}function Hd(e){return Number.isFinite(e)&&e>0?e:1}function Pl(e,t){return e?.animations.clips.find(n=>n.sourceName===t)}function fg(e){return e?.loopMode??"repeat"}import{Color as Wd,MeshPhysicalMaterial as Mw,MeshStandardMaterial as Tw,Texture as $d}from"three";function kl(e){if(hg(e))return e;if(!e||typeof e!="object")return null;let t=e,n=new Tw;typeof t.name=="string"&&(n.name=t.name),n.metalness=0,n.roughness=1,t.type==="MeshBasicMaterial"||t.isMeshBasicMaterial===!0?(n.color.set(0),n.emissiveIntensity=1,t.map instanceof $d?(n.emissiveMap=t.map,n.emissive.set(16777215)):t.color instanceof Wd&&n.emissive.copy(t.color)):(t.color instanceof Wd&&n.color.copy(t.color),t.map instanceof $d&&(n.map=t.map),t.emissive instanceof Wd&&n.emissive.copy(t.emissive),t.emissiveMap instanceof $d&&(n.emissiveMap=t.emissiveMap));let r=["aoMap","aoMapIntensity","lightMap","lightMapIntensity","alphaMap","opacity","transparent","alphaTest","side","vertexColors","wireframe","depthTest","depthWrite","visible","toneMapped","fog"];for(let o of r)t[o]!==void 0&&(n[o]=t[o]);return n.needsUpdate=!0,n}function _l(e){if(mg(e))return e.clone();let t=new Mw;return t.name=e.name,t.color.copy(e.color),t.map=e.map,t.lightMap=e.lightMap,t.lightMapIntensity=e.lightMapIntensity,t.aoMap=e.aoMap,t.aoMapIntensity=e.aoMapIntensity,t.emissive.copy(e.emissive),t.emissiveIntensity=e.emissiveIntensity,t.emissiveMap=e.emissiveMap,t.bumpMap=e.bumpMap,t.bumpScale=e.bumpScale,t.normalMap=e.normalMap,t.normalMapType=e.normalMapType,t.normalScale.copy(jr(e.normalScale)),t.displacementMap=e.displacementMap,t.displacementScale=e.displacementScale,t.displacementBias=e.displacementBias,t.roughness=e.roughness,t.roughnessMap=e.roughnessMap,t.metalness=e.metalness,t.metalnessMap=e.metalnessMap,t.alphaMap=e.alphaMap,t.envMap=e.envMap,t.envMapRotation.copy(e.envMapRotation),t.envMapIntensity=e.envMapIntensity,t.wireframe=e.wireframe,t.wireframeLinewidth=e.wireframeLinewidth,t.flatShading=e.flatShading,t.fog=e.fog,t.opacity=e.opacity,t.transparent=e.transparent,t.alphaHash=e.alphaHash,t.blendSrc=e.blendSrc,t.blendDst=e.blendDst,t.blendEquation=e.blendEquation,t.blendSrcAlpha=e.blendSrcAlpha,t.blendDstAlpha=e.blendDstAlpha,t.blendEquationAlpha=e.blendEquationAlpha,t.blending=e.blending,t.premultipliedAlpha=e.premultipliedAlpha,t.dithering=e.dithering,t.alphaTest=e.alphaTest,t.depthTest=e.depthTest,t.depthWrite=e.depthWrite,t.colorWrite=e.colorWrite,t.stencilWrite=e.stencilWrite,t.stencilWriteMask=e.stencilWriteMask,t.stencilFunc=e.stencilFunc,t.stencilRef=e.stencilRef,t.stencilFuncMask=e.stencilFuncMask,t.stencilFail=e.stencilFail,t.stencilZFail=e.stencilZFail,t.stencilZPass=e.stencilZPass,t.side=e.side,t.shadowSide=e.shadowSide,t.toneMapped=e.toneMapped,t.vertexColors=e.vertexColors,t.visible=e.visible,t.clippingPlanes=e.clippingPlanes,t.clipIntersection=e.clipIntersection,t.clipShadows=e.clipShadows,t.forceSinglePass=e.forceSinglePass,t.polygonOffset=e.polygonOffset,t.polygonOffsetFactor=e.polygonOffsetFactor,t.polygonOffsetUnits=e.polygonOffsetUnits,t}function Al(e){e.userData.baseColor=e.color.clone(),e.userData.baseMap=e.map??null,e.userData.baseMetalness=e.metalness,e.userData.baseMetalnessMap=e.metalnessMap??null,e.userData.baseRoughness=e.roughness,e.userData.baseRoughnessMap=e.roughnessMap??null,e.userData.baseEmissive=e.emissive.clone(),e.userData.baseEmissiveIntensity=e.emissiveIntensity,e.userData.baseEmissiveMap=e.emissiveMap??null,e.userData.baseOpacity=e.opacity,e.userData.baseTransparent=e.transparent,e.userData.baseAlphaMap=e.alphaMap??null,e.userData.baseAlphaTest=e.alphaTest,e.userData.baseAlphaHash=e.alphaHash,e.userData.baseDithering=e.dithering,e.userData.baseBlending=e.blending,e.userData.baseDepthWrite=e.depthWrite,e.userData.baseSide=e.side,e.userData.baseNormalMap=e.normalMap??null,e.userData.baseNormalScale=jr(e.normalScale),e.userData.baseBumpMap=e.bumpMap??null,e.userData.baseBumpScale=e.bumpScale,e.userData.baseAoMap=e.aoMap??null,e.userData.baseAoMapIntensity=e.aoMapIntensity,e.userData.baseDisplacementMap=e.displacementMap??null,e.userData.baseDisplacementScale=e.displacementScale,e.userData.baseDisplacementBias=e.displacementBias,e.userData.baseClearcoat=e.clearcoat,e.userData.baseClearcoatMap=e.clearcoatMap??null,e.userData.baseClearcoatRoughness=e.clearcoatRoughness,e.userData.baseClearcoatRoughnessMap=e.clearcoatRoughnessMap??null,e.userData.baseClearcoatNormalMap=e.clearcoatNormalMap??null,e.userData.baseClearcoatNormalScale=jr(e.clearcoatNormalScale),e.userData.baseSheen=e.sheen,e.userData.baseSheenColor=e.sheenColor.clone(),e.userData.baseSheenColorMap=e.sheenColorMap??null,e.userData.baseSheenRoughness=e.sheenRoughness,e.userData.baseSheenRoughnessMap=e.sheenRoughnessMap??null,e.userData.baseAnisotropy=e.anisotropy,e.userData.baseAnisotropyRotation=e.anisotropyRotation,e.userData.baseAnisotropyMap=e.anisotropyMap??null,e.userData.baseTransmission=e.transmission,e.userData.baseTransmissionMap=e.transmissionMap??null,e.userData.baseThickness=e.thickness,e.userData.baseThicknessMap=e.thicknessMap??null,e.userData.baseAttenuationColor=e.attenuationColor.clone(),e.userData.baseAttenuationDistance=e.attenuationDistance,e.userData.baseReflectivity=e.reflectivity,e.userData.baseSpecularIntensity=e.specularIntensity,e.userData.baseSpecularIntensityMap=e.specularIntensityMap??null,e.userData.baseSpecularColor=e.specularColor.clone(),e.userData.baseSpecularColorMap=e.specularColorMap??null,e.userData.baseFlatShading=e.flatShading,e.userData.baseEnvMapIntensity=e.envMapIntensity}import{Color as El,FrontSide as Pw,NormalBlending as xg,SRGBColorSpace as Rl}from"three";function Ll(e,t,n){e.map=e.userData.baseMap??null,e.color.copy(e.userData.baseColor),e.metalness=e.userData.baseMetalness??e.metalness,e.metalnessMap=e.userData.baseMetalnessMap??null,e.roughness=e.userData.baseRoughness??e.roughness,e.roughnessMap=e.userData.baseRoughnessMap??null,e.emissive.copy(e.userData.baseEmissive??new El(0,0,0)),e.emissiveIntensity=e.userData.baseEmissiveIntensity??e.emissiveIntensity,e.emissiveMap=e.userData.baseEmissiveMap??null,e.opacity=e.userData.baseOpacity??1,e.transparent=e.userData.baseTransparent??!1,e.alphaMap=e.userData.baseAlphaMap??null,e.alphaTest=e.userData.baseAlphaTest??0,e.alphaHash=e.userData.baseAlphaHash??!1,e.dithering=e.userData.baseDithering??!1,e.blending=e.userData.baseBlending??xg,e.depthWrite=e.userData.baseDepthWrite??!0,e.side=e.userData.baseSide??Pw,e.normalMap=e.userData.baseNormalMap??null,e.normalScale.copy(jr(e.userData.baseNormalScale)),e.bumpMap=e.userData.baseBumpMap??null,e.bumpScale=e.userData.baseBumpScale??e.bumpScale,e.aoMap=e.userData.baseAoMap??null,e.aoMapIntensity=e.userData.baseAoMapIntensity??e.aoMapIntensity,e.displacementMap=e.userData.baseDisplacementMap??null,e.displacementScale=e.userData.baseDisplacementScale??e.displacementScale,e.displacementBias=e.userData.baseDisplacementBias??e.displacementBias,e.clearcoat=e.userData.baseClearcoat??e.clearcoat,e.clearcoatMap=e.userData.baseClearcoatMap??null,e.clearcoatRoughness=e.userData.baseClearcoatRoughness??e.clearcoatRoughness,e.clearcoatRoughnessMap=e.userData.baseClearcoatRoughnessMap??null,e.clearcoatNormalMap=e.userData.baseClearcoatNormalMap??null,e.clearcoatNormalScale.copy(jr(e.userData.baseClearcoatNormalScale)),e.sheen=e.userData.baseSheen??e.sheen,e.sheenColor.copy(e.userData.baseSheenColor??new El(0,0,0)),e.sheenColorMap=e.userData.baseSheenColorMap??null,e.sheenRoughness=e.userData.baseSheenRoughness??e.sheenRoughness,e.sheenRoughnessMap=e.userData.baseSheenRoughnessMap??null,e.anisotropy=e.userData.baseAnisotropy??e.anisotropy,e.anisotropyRotation=e.userData.baseAnisotropyRotation??e.anisotropyRotation,e.anisotropyMap=e.userData.baseAnisotropyMap??null,e.transmission=e.userData.baseTransmission??e.transmission,e.transmissionMap=e.userData.baseTransmissionMap??null,e.thickness=e.userData.baseThickness??e.thickness,e.thicknessMap=e.userData.baseThicknessMap??null,e.attenuationColor.copy(e.userData.baseAttenuationColor??new El("#ffffff")),e.attenuationDistance=e.userData.baseAttenuationDistance??e.attenuationDistance,e.reflectivity=e.userData.baseReflectivity??e.reflectivity,e.specularIntensity=e.userData.baseSpecularIntensity??e.specularIntensity,e.specularIntensityMap=e.userData.baseSpecularIntensityMap??null,e.specularColor.copy(e.userData.baseSpecularColor??new El("#ffffff")),e.specularColorMap=e.userData.baseSpecularColorMap??null,e.flatShading=e.userData.baseFlatShading??e.flatShading,e.envMapIntensity=e.userData.baseEnvMapIntensity??e.envMapIntensity;let i=mt(t,"texture"),r=mt(t,"metalnessMap"),o=mt(t,"roughnessMap"),a=mt(t,"emissiveMap"),s=mt(t,"alphaMap"),c=mt(t,"normalMap"),l=mt(t,"bumpMap"),u=mt(t,"aoMap"),d=mt(t,"displacementMap"),h=mt(t,"clearcoatMap"),b=mt(t,"clearcoatRoughnessMap"),m=mt(t,"clearcoatNormalMap"),y=mt(t,"anisotropyMap"),k=mt(t,"transmissionMap"),w=mt(t,"thicknessMap"),p=mt(t,"sheenColorMap"),g=mt(t,"sheenRoughnessMap"),S=mt(t,"specularIntensityMap"),v=mt(t,"specularColorMap");if(i?(e.map=Rt(i,Rl),e.color.set(n??"#ffffff")):n&&(e.map=null,e.color.set(n)),r&&(e.metalnessMap=Rt(r)),t?.metalness!==void 0&&(e.metalness=t.metalness),o&&(e.roughnessMap=Rt(o)),t?.roughness!==void 0&&(e.roughness=t.roughness),t?.emissive?e.emissive.set(t.emissive):a&&e.emissive.set("#ffffff"),t?.emissiveIntensity!==void 0&&(e.emissiveIntensity=t.emissiveIntensity),a&&(e.emissiveMap=Rt(a,Rl)),t?.opacity!==void 0&&(e.opacity=t.opacity),s&&(e.alphaMap=Rt(s)),t?.alphaTest!==void 0&&(e.alphaTest=t.alphaTest),t?.alphaHash!==void 0&&(e.alphaHash=t.alphaHash),t?.dithering!==void 0&&(e.dithering=t.dithering),t?.blendingMode&&(e.blending=bg(t.blendingMode),e.depthWrite=t.blendingMode!=="additive"),t?.side&&(e.side=gg(t.side)),c&&(e.normalMap=Rt(c)),c||t?.normalScale!==void 0){let M=t?.normalScale??Math.abs(jr(e.userData.baseNormalScale).x);e.normalScale.set(M,t?.flipNormalY?-M:M)}if(l&&(e.bumpMap=Rt(l)),t?.bumpScale!==void 0&&(e.bumpScale=t.bumpScale),u&&(e.aoMap=Rt(u)),t?.aoMapIntensity!==void 0&&(e.aoMapIntensity=t.aoMapIntensity),d&&(e.displacementMap=Rt(d)),t?.displacementScale!==void 0&&(e.displacementScale=t.displacementScale),t?.displacementBias!==void 0&&(e.displacementBias=t.displacementBias),h&&(e.clearcoatMap=Rt(h)),t?.clearcoat!==void 0&&(e.clearcoat=t.clearcoat),b&&(e.clearcoatRoughnessMap=Rt(b)),t?.clearcoatRoughness!==void 0&&(e.clearcoatRoughness=t.clearcoatRoughness),m&&(e.clearcoatNormalMap=Rt(m)),m||t?.clearcoatNormalScale!==void 0){let M=t?.clearcoatNormalScale??Math.abs(jr(e.userData.baseClearcoatNormalScale).x);e.clearcoatNormalScale.set(M,t?.flipClearcoatNormalY?-M:M)}t?.sheen!==void 0&&(e.sheen=t.sheen),t?.sheenColor&&e.sheenColor.set(t.sheenColor),p&&(e.sheenColorMap=Rt(p,Rl)),t?.sheenRoughness!==void 0&&(e.sheenRoughness=t.sheenRoughness),g&&(e.sheenRoughnessMap=Rt(g)),t?.anisotropy!==void 0&&(e.anisotropy=t.anisotropy),t?.anisotropyRotation!==void 0&&(e.anisotropyRotation=t.anisotropyRotation),y&&(e.anisotropyMap=Rt(y)),t?.transmission!==void 0&&(e.transmission=t.transmission),k&&(e.transmissionMap=Rt(k)),t?.thickness!==void 0&&(e.thickness=t.thickness),w&&(e.thicknessMap=Rt(w)),t?.attenuationColor&&e.attenuationColor.set(t.attenuationColor),t?.attenuationDistance!==void 0&&(e.attenuationDistance=t.attenuationDistance),t?.reflectivity!==void 0&&(e.reflectivity=t.reflectivity),t?.specularIntensity!==void 0&&(e.specularIntensity=t.specularIntensity),S&&(e.specularIntensityMap=Rt(S)),t?.specularColor&&e.specularColor.set(t.specularColor),v&&(e.specularColorMap=Rt(v,Rl)),e.transparent=e.opacity<1||e.transmission>0||e.blending!==xg||!!((s||e.alphaMap)&&e.alphaTest<=0),e.transparent||(e.depthWrite=!0)}function Za(e){return e.material}function wr(e,t){return Array.isArray(e)?e.map(t):t(e,0)}function $n(e,t){Array.isArray(e)?e.forEach(t):t(e,0)}function Bl(e,t){return Array.isArray(e)?e[t]:e}function Xd(e){e.updateMatrixWorld(!0),e.traverse(t=>{let n=t;n.isSkinnedMesh&&(n.skeleton?.update(),n.computeBoundingBox?.(),n.computeBoundingSphere?.())})}import{Matrix4 as kw}from"three";function _w(e){return e.isSkinnedMesh===!0}function Ho(e){let t=[];return e.traverse(n=>{_w(n)&&t.push(n)}),t}var es="reactImmersiveSkinFreeze";function yg(e){return!!e.userData[es]}function Dl(e,t){let n=e.userData,i=new kw().copy(t).invert(),r=n[es];if(r){r.frozenInverse.copy(i),e.bindMatrixInverse.copy(i);return}let o={frozenInverse:i,previousOnBeforeRender:e.onBeforeRender};e.bindMatrixInverse.copy(i),e.onBeforeRender=function(a,s,c,l,u,d){o.previousOnBeforeRender.call(this,a,s,c,l,u,d),e.bindMatrixInverse.copy(o.frozenInverse)},n[es]=o}function Wo(e){let t=e.userData,n=t[es];n&&(e.onBeforeRender=n.previousOnBeforeRender,delete t[es],e.updateMatrixWorld(!0))}import{useCallback as vg,useEffect as Aw,useRef as Ew}from"react";import{useThree as Rw}from"@react-three/fiber";function wg(){let e=Rw(r=>r.gl.domElement),t=Ew(void 0),n=vg(r=>{t.current===void 0&&(t.current=e.style.cursor),e.style.cursor=r},[e]),i=vg(()=>{let r=t.current;r!==void 0&&(e.style.cursor=r,t.current=void 0)},[e]);return Aw(()=>()=>{i()},[i]),{setCanvasCursor:n,restoreCanvasCursor:i}}import{jsx as Cg}from"react/jsx-runtime";function Il(e,t,n){let i=n.get(e);i&&(t?.position?e.position.fromArray(t.position):e.position.copy(i.position),t?.rotation?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2],i.rotation.order):e.rotation.copy(i.rotation),t?.scale?e.scale.fromArray(t.scale):e.scale.copy(i.scale),e.updateMatrix())}function jt(e,t=!1){if(!e||typeof e!="object")return"-";let n=e;return[n.channel??0,t?n.format??"":"",n.isVideoTexture?n.colorSpace??"":""].join(":")}function $o(e){let t=e,n=Number(t.clearcoat)>0,i=Number(t.sheen)>0,r=Number(t.anisotropy)>0,o=Number(t.transmission)>0,a=t.transparent===!1&&t.blending===zw&&t.alphaToCoverage!==!0;return[jt(t.map),jt(t.aoMap),jt(t.lightMap),jt(t.bumpMap),jt(t.normalMap,!0),t.normalMap?t.normalMapType:"",jt(t.displacementMap),jt(t.emissiveMap),jt(t.metalnessMap),jt(t.roughnessMap),r,jt(r?t.anisotropyMap:null),n,jt(n?t.clearcoatMap:null),jt(n?t.clearcoatNormalMap:null,!0),jt(n?t.clearcoatRoughnessMap:null),i,jt(i?t.sheenColorMap:null),jt(i?t.sheenRoughnessMap:null),jt(t.specularColorMap),jt(t.specularIntensityMap),o,jt(o?t.transmissionMap:null),jt(o?t.thicknessMap:null),jt(t.alphaMap),Number(t.alphaTest)>0,!!t.alphaHash,!!t.flatShading,!!t.dithering,t.side,a].join("|")}function Kd({url:e,objectBindings:t,selectedItem:n,itemMaterials:i,onItemClick:r,onItemHover:o,onModelLoaded:a,onAnimationsReady:s,nodeRefsOut:c,onNodeRefsChange:l,materialRefsOut:u,panelHoveredItem:d,sceneConfig:h,zoomOnSelected:b=!0,highlightOnHover:m=!0,decoderConfig:y,modelFormat:k,onLoadProgress:w,explodeFactor:p=0,suspendBindingTransforms:g=!1}){let S=lg(e,y,k,w),v=Bw(O=>O.invalidate),[M,D]=Lw(null),x=nn(null),{setCanvasCursor:C,restoreCanvasCursor:P}=wg();Lt(()=>{m||(D(null),o?.(null),P())},[m,o,P]);let _=bn(()=>Gw.clone(S.scene),[S.scene]),z=bn(()=>Go(_),[_]),L=z.nodesById;Lt(()=>{z.duplicateNames.size!==0&&console.warn("[react-immersive] Duplicate model node names were assigned unique binding IDs.",Object.fromEntries(z.duplicateNames))},[z]);let I=bn(()=>{let O=new WeakMap;return _.traverse(B=>{O.set(B,{position:B.position.clone(),rotation:B.rotation.clone(),scale:B.scale.clone()})}),O},[_]);Lt(()=>{let O=!1,B=null,V=null,J=window,W=Object.entries(L).filter(([,yt])=>Wn(yt)),$=new Ol,re=[],We=0;_.traverse(yt=>{Wn(yt)&&(yt.castShadow=!1,yt.receiveShadow=!0)});let Oe=()=>{if(O)return;let yt=new Set,le=$.getSize(new qi),ht=new qi;for(let{name:pe,box:It}of re)It.getSize(ht),ht.x>le.x*.7&&ht.z>le.z*.7&&ht.y>le.y*.4&&yt.add(pe);_.traverse(pe=>{if(!Wn(pe))return;let It=Ya(pe);pe.castShadow=!It||!yt.has(It),pe.receiveShadow=!0}),v()},Ke=()=>{O||(J.requestIdleCallback?B=J.requestIdleCallback(ue,{timeout:100}):V=window.setTimeout(()=>ue(),0))},ue=yt=>{if(B=null,V=null,O)return;let le=performance.now(),ht=0;for(;We<W.length&&!(ht>0&&!(yt?yt.didTimeout?ht<16:yt.timeRemaining()>1:performance.now()-le<8));){let[pe,It]=W[We];We+=1,ht+=1;let Vn=new Ol().setFromObject(It);Vn.isEmpty()||(re.push({name:pe,box:Vn}),$.union(Vn))}We<W.length?Ke():Oe()};return Ke(),()=>{O=!0,B!==null&&J.cancelIdleCallback?.(B),V!==null&&window.clearTimeout(V)}},[v,L,_]),Lt(()=>{Xd(_)},[_]),Lt(()=>{let O=new AbortController;return ol(_,O.signal),()=>{O.abort(),ja(_)}},[_]);let N=bn(()=>{let O={};for(let[B,V]of Object.entries(t))O[V.modelObjectId??B]=B;return O},[t]),R=bn(()=>Object.entries(t).map(([O,B])=>`${O}${B.modelObjectId??O}`).sort().join(""),[t]),F=bn(()=>Object.entries(t).map(([O,B])=>JSON.stringify([O,B.modelObjectId??O,B.transform??null])).sort().join(""),[t]),G=nn(new Map);Lt(()=>{let O=new Map,B=new Map;for(let[W,$]of Object.entries(t)){if(!$.transform)continue;let re=L[$.modelObjectId??W];re&&(O.set(re,$.transform),B.set(re,Ho(re)))}let V=new Set([...G.current.keys(),...O.keys()]);for(let W of V){Il(W,void 0,I);for(let $ of Ho(W))Wo($)}_.updateMatrixWorld(!0);let J=new Map;for(let W of B.values())for(let $ of W)J.has($)||J.set($,$.matrixWorld.clone());for(let[W,$]of O)Il(W,$,I);G.current=O,_.updateMatrixWorld(!0);for(let[W,$]of J)Dl(W,$);v()},[_,L,I,F,v]),Lt(()=>()=>{for(let O of Ho(_))Wo(O)},[_]);let Z=bn(()=>{let O={};for(let[B,V]of Object.entries(t)){let J=V.modelObjectId??B,W=L[J];if(!Wn(W))continue;let $=Za(W);$&&(O[B]=wr($,re=>{let We=kl(re),Oe=_l(We??new Dw);return Al(Oe),Oe}))}return O},[L,R]);Lt(()=>{u&&(u.current=Z)},[Z,u]),Lt(()=>()=>{for(let O of Object.values(Z))$n(O,B=>B.dispose())},[Z]);let ie=h?.model.shading??"lit",ve=h?.model.renderer??"pbr",He=h?.wireframe.enabled??!1,Dt=h?.wireframe.color??"#93c5fd",pt=h?.wireframe.opacity??1,kt=bn(()=>{let O={};if(ie!=="unlit")return O;for(let[B,V]of Object.entries(Z))O[B]=wr(V,J=>{let W=new Yd;return W.color.copy(J.color),W.map=J.map,W.alphaMap=J.alphaMap,W.alphaTest=J.alphaTest,W.transparent=J.transparent,W.opacity=J.opacity,W.side=J.side,W});return O},[Z,ie]),Re=bn(()=>{let O={};if(ie!=="normals")return O;for(let[B,V]of Object.entries(Z))O[B]=wr(V,()=>new Ow);return O},[Z,ie]),et=bn(()=>{let O={};if(ie!=="lit"||ve!=="matcap")return O;let B=ml();for(let[V,J]of Object.entries(Z))O[V]=wr(J,W=>{let $=new Nw;return $.matcap=B,$.color.copy(W.color),$.alphaMap=W.alphaMap,$.alphaTest=W.alphaTest,$.side=W.side,$});return O},[Z,ie,ve]);Lt(()=>()=>{for(let O of Object.values(kt))$n(O,B=>B.dispose());for(let O of Object.values(Re))$n(O,B=>B.dispose());for(let O of Object.values(et))$n(O,B=>B.dispose())},[kt,Re,et]);let Kt=O=>ie==="normals"?Re[O]:ie==="unlit"?kt[O]:ve==="matcap"?et[O]:Z[O],kn=nn(a);kn.current=a,Lt(()=>{kn.current?.(_)},[_]);let ft=bn(()=>{let O={};for(let[B,V]of Object.entries(t)){let J=V.modelObjectId??B,W=L[J];W&&(O[B]=W)}return O},[L,R]);Lt(()=>(c.current=ft,l?.(),()=>{c.current===ft&&(c.current={})}),[ft,c,l]);let Le=nn({});Lt(()=>()=>{for(let O of Object.values(Le.current))for(let[B,V]of Object.entries(O))V&&Hi(V,Xi(B));Le.current={}},[]);let ee=bn(()=>{let O=new Map;for(let[B,V]of Object.entries(t)){let J=d===V||d?.id===V.id||d?.modelObjectId===V.modelObjectId,W=m&&(M===B||J),$=W||n===B;(W||$)&&O.set(B,{emissive:W,matcap:$})}return O},[t,m,M,n,d]),vn=nn(ee);vn.current=ee,Lt(()=>{let O=new Set;for(let[B,V]of Object.entries(t)){O.add(B);let J=V.modelObjectId??B,W=L[J];if(!Wn(W))continue;W.visible=V.visible!==!1;let $=Z[B];if(!$)continue;if(ve!=="uv-checker"){let le=Kt(B);le&&(W.material=le)}if(V.visible===!1)continue;let re=kt[B],We=et[B],Oe=i[B]??i[V.modelObjectId??B],Ke=V.style?.material,ue=Le.current[B]??{};for(let le of Ja){let ht=mt(Ke,le),pe=ue[le];if(pe===ht)continue;let It=Xi(le);pe&&Hi(pe,It),ht?(hl(ht,It,v),ue[le]=ht):delete ue[le]}Object.keys(ue).length>0?Le.current[B]=ue:delete Le.current[B];let yt=Oe?.hex??Ke?.baseColor;$n($,(le,ht)=>{let pe=$o(le);Ll(le,Ke,yt);let It=le.userData.reactImmersiveConfiguredEmissive;It?.isColor?It.copy(le.emissive):le.userData.reactImmersiveConfiguredEmissive=le.emissive.clone();let Vn=vn.current.get(B);Vn?.emissive&&le.emissive.add(Ha),pe!==$o(le)&&(le.needsUpdate=!0);let mn=Bl(re,ht);if(mn){let nr=$o(mn);mn.color.copy(le.color),mn.map=le.map,mn.alphaMap=le.alphaMap,mn.alphaTest=le.alphaTest,mn.transparent=le.transparent,mn.opacity=le.opacity,mn.side=le.side,nr!==$o(mn)&&(mn.needsUpdate=!0)}let rt=Bl(We,ht);if(rt){let nr=$o(rt);Vn?.matcap?rt.color.set(Ir.color):rt.color.copy(le.color),rt.map=le.map,rt.alphaMap=le.alphaMap,rt.alphaTest=le.alphaTest,rt.transparent=le.transparent,rt.opacity=le.opacity,rt.side=le.side,nr!==$o(rt)&&(rt.needsUpdate=!0)}})}for(let B of Object.keys(Le.current))if(!O.has(B)){for(let[V,J]of Object.entries(Le.current[B]))J&&Hi(J,Xi(V));delete Le.current[B]}v()},[t,L,Z,kt,Re,et,i,ie,ve,v]);let cn=nn(new Map);Lt(()=>{let O=cn.current,B=new Set([...O.keys(),...ee.keys()]),V=!1;for(let J of B){let W=O.get(J),$=ee.get(J),re=!!W?.emissive!=!!$?.emissive,We=!!W?.matcap!=!!$?.matcap;if(!re&&!We)continue;V=!0;let Oe=Z[J],Ke=et[J];Oe&&$n(Oe,(ue,yt)=>{let le=ue.userData.reactImmersiveConfiguredEmissive;re&&le?.isColor&&(ue.emissive.copy(le),$?.emissive&&ue.emissive.add(Ha));let ht=Bl(Ke,yt);We&&ht&&($?.matcap?ht.color.set(Ir.color):ht.color.copy(ue.color))})}cn.current=ee,V&&v()},[ee,Z,et,v]),Lt(()=>{if(ve!=="uv-checker")return;let O=Sm(),B=[];return _.traverse(V=>{if(!Wn(V))return;let J=V.material,W=Array.isArray(J)?J:[J],$=!!V.geometry.getAttribute("uv"),re=W.map((Oe,Ke)=>{let ue=new Yd({color:$?"#ffffff":"#ff00ff",map:$?O:null,side:Oe.side});return ue.name=`${V.name||"mesh"}-uv-checker-${Ke}`,ue.toneMapped=!1,ue}),We=Array.isArray(J)?re:re[0];V.material=We,B.push({node:V,original:J,diagnostic:We})}),v(),()=>{for(let{node:V,original:J,diagnostic:W}of B){V.material=J;let $=Array.isArray(W)?W:[W];for(let re of $)re.dispose()}v()}},[_,ve,v]),Lt(()=>{if(!He)return;let O=[];for(let[B,V]of Object.entries(t)){let J=V.modelObjectId??B,W=L[J];if(!Wn(W))continue;let $=new Yd({color:Dt,wireframe:!0,transparent:!0,opacity:pt,depthTest:!1,depthWrite:!1,side:Iw,toneMapped:!1}),re=W.clone(!1);re.name="",re.position.set(0,0,0),re.quaternion.identity(),re.scale.set(1,1,1),re.matrix.identity(),re.matrixAutoUpdate=!0,re.material=$,re.castShadow=!1,re.receiveShadow=!1,re.frustumCulled=!1,re.renderOrder=1,re.userData={isWireframeOverlay:!0},re.raycast=()=>{},W.morphTargetInfluences&&(re.morphTargetInfluences=W.morphTargetInfluences),W.add(re),O.push({node:W,overlay:re})}return v(),()=>{for(let{node:B,overlay:V}of O)B.remove(V),V.material.dispose()}},[He,Dt,pt,L,t,v]);let tt=bn(()=>ug(S.animations),[S.animations]),Qt=nn(s);Qt.current=s;let Ee=nn(h);Ee.current=h;let Jt=nn(null),_t=nn({}),Fe=nn(null),xt=nn(null),dn=nn(1),ge=nn(new Set),H=nn(0),he=()=>({currentClip:xt.current,isPlaying:Fe.current?.paused===!1,speed:dn.current,time:Fe.current?.time??0,duration:Fe.current?.getClip().duration??0}),ne=()=>{let O=he();ge.current.forEach(B=>B(O))},Se=(O,B)=>{let V=fg(B);O.setLoop(V==="once"?jw:Uw,V==="once"?1:1/0),O.clampWhenFinished=V==="once";let J=Hd(B?.speed??dn.current);dn.current=J,O.setEffectiveTimeScale(J)},Me=()=>{Fe.current?.stop(),Fe.current=null,xt.current=null,ne(),v()},ye=()=>{Fe.current&&(Fe.current.paused=!0,ne(),v())},_e=O=>{let B=Hd(O);dn.current=B,Fe.current?.setEffectiveTimeScale(B),ne()},ce=O=>{let B=Fe.current;if(!B)return;let V=B.getClip().duration;B.time=Math.min(Math.max(O,0),V),Jt.current?.update(0),ne(),v()},qe=O=>{let B=_t.current[O];if(!B)return;let V=Pl(Ee.current,O);if(!V?.hidden){if(Fe.current===B&&B.paused){Se(B,V),B.paused=!1,xt.current=O,ne(),v();return}Fe.current&&Fe.current!==B&&Fe.current.stop(),Se(B,V),B.paused=!1,B.enabled=!0,B.reset().play(),Fe.current=B,xt.current=O,ne(),v()}};Lt(()=>{let O=new Fw(_);Jt.current=O;let B={};for(let{clip:re,sourceName:We}of tt)B[We]=O.clipAction(re);_t.current=B;let V=re=>{re.action&&re.action===Fe.current&&Me()};O.addEventListener("finished",V);let J=()=>{};Qt.current?.({clips:tt.map(({sourceName:re})=>re),clipDetails:tt.map(({sourceName:re,duration:We})=>({sourceName:re,duration:We})),play:tt.length?qe:J,pause:tt.length?ye:J,stop:tt.length?Me:J,setSpeed:tt.length?_e:J,seek:tt.length?ce:J,getState:he,subscribe:re=>(ge.current.add(re),re(he()),()=>{ge.current.delete(re)})}),dn.current=1,ne();let W=Ee.current?.animations.autoplayClip,$=W?Pl(Ee.current,W):void 0;return W&&!$?.hidden&&qe(W),()=>{O.removeEventListener("finished",V),O.stopAllAction(),O.uncacheRoot(_),Jt.current=null,_t.current={},Fe.current=null,xt.current=null,dn.current=1,ne()}},[_,tt]),Lt(()=>{let O=xt.current,B=Fe.current;if(!O||!B||!h?.animations)return;let V=Pl(h,O);if(V?.hidden){Me();return}V&&(Se(B,V),ne())},[h?.animations]),qd((O,B)=>{if(Jt.current&&Fe.current?.paused===!1){if(Jt.current.update(B),!g)for(let[V,J]of G.current)Il(V,J,I);v(),H.current+=B,H.current>=.066&&(H.current=0,ne(),Xd(_))}});let nt=bn(()=>(h?.model.rotation??[0,0,0]).map(O=>O*Math.PI/180),[h?.model.rotation]);qd((O,B)=>{if(!x.current)return;let V=x.current.rotation;V.x=Nl.lerp(V.x,nt[0],1-Math.exp(-5*B)),V.y=Nl.lerp(V.y,nt[1],1-Math.exp(-5*B)),V.z=Nl.lerp(V.z,nt[2],1-Math.exp(-5*B)),Math.abs(V.x-nt[0])<1e-4&&Math.abs(V.y-nt[1])<1e-4&&Math.abs(V.z-nt[2])<1e-4||v()});let Ot=nn([]),Nt=nn(0),Ue=nn(0),Ye=bn(()=>new qi,[]);Lt(()=>{let O=new Map;for(let[Oe,Ke]of Object.entries(t)){let ue=L[Ke.modelObjectId??Oe];ue&&O.set(ue,Ke)}for(let Oe of Ot.current)Il(Oe.node,O.get(Oe.node)?.transform,I);Ue.current=0,_.updateWorldMatrix(!0,!0);let B=new Ol().setFromObject(_),V=B.getCenter(new qi),J=B.getSize(new qi).length()*.5;Nt.current=Number.isFinite(J)?J:0;let W=[...O.keys()],$=new Set(W),re=[],We=new qi;for(let Oe of W){if(!Oe.parent)continue;let Ke=Oe.parent,ue=!1;for(;Ke;){if($.has(Ke)){ue=!0;break}Ke=Ke.parent}if(ue)continue;let yt=new Ol().setFromObject(Oe);if(yt.isEmpty())continue;yt.getCenter(We);let le=We.clone().sub(V);le.lengthSq()<1e-8||(le.normalize(),re.push({node:Oe,restLocalPos:Oe.position.clone(),restWorldPos:Oe.getWorldPosition(new qi),worldDir:le,parentInverse:new Vw().copy(Oe.parent.matrixWorld).invert()}))}Ot.current=re,v()},[_,L,R,F,I,v]),Lt(()=>{v()},[p,v]),qd((O,B)=>{let V=Ot.current;if(V.length===0)return;let J=Math.min(Math.max(p,0),1),W=Ue.current;if(Math.abs(W-J)<1e-4){if(W===J)return;Ue.current=J}else Ue.current=Nl.lerp(W,J,1-Math.exp(-6*B)),v();let $=Ue.current*Nt.current;for(let re of V)Ye.copy(re.worldDir).multiplyScalar($).add(re.restWorldPos).applyMatrix4(re.parentInverse),re.node.position.copy(Ye)});let Zt=O=>{let B=O;for(;B;){let V=Ya(B),J=V?N[V]:void 0;if(J&&t[J])return[J,t[J]];B=B.parent}return null},Tt=O=>{let B=Zt(O.object);if(!B)return;let[,V]=B;V.selectable!==!1&&(O.stopPropagation(),r(V))},hn=O=>{if(!m)return;let B=Zt(O.object);if(!B)return;let[V,J]=B;J.hoverable!==!1&&(O.stopPropagation(),C("pointer"),D(V),o?.(J))},wn=O=>{m&&(O.stopPropagation(),P(),D(null),o?.(null))},At=bn(()=>!Uh(_),[_]);return Cg("group",{ref:x,children:Cg("primitive",{object:_,...At?{onClick:Tt,...m?{onPointerOver:hn,onPointerOut:wn}:{}}:{}})})}import{useCallback as to,useEffect as ui,useMemo as nM,useRef as fn,useState as zu}from"react";import{useFrame as rM,useThree as iM}from"@react-three/fiber";import{Box3 as Rg,BoxGeometry as cC,Group as Ag,Matrix4 as Lg,Mesh as dC,MeshBasicMaterial as uC,Vector3 as Ur}from"three";import{Euler as Hw,Matrix4 as Yi,MeshBasicMaterial as Ww,MeshMatcapMaterial as $w,MeshNormalMaterial as Xw,MeshStandardMaterial as qw,Quaternion as Yw,Vector3 as ts}from"three";function Tg(e){let t={};for(let[n,i]of Object.entries(e))t[i.modelObjectId??n]=n;return t}function Jd(e){let t=e,n=null;for(;t;){let i=t.userData?.ri_name;if(typeof i=="string"&&i)return i;!n&&t.name&&(n=t.name),t=t.parent}return n}function Pg(e,t){return e||(t?t.modelObjectId??t.id:null)}function jl(e,t){let n=Jd(e);if(!n)return null;let i=t.keyByModelObject[n]??n,r=t.objectBindings[i];return r?{key:i,binding:r}:null}var Xo=new ts,Qd=new ts,Kw=new Yi,Sg=new Yi,zl=new Yi,Qw=new Yi,Fl=new Yi,Jw=new Yi,Zw=new Yi,eC=new ts,tC=new ts,oi=new ts,Mg=new Yw,nC=new Hw;function rC(e,t,n,i,r){let o=!!(n?.position||n?.rotation||n?.scale),a=!!(r&&r.factor>0&&r.radius>0);if(!o&&!a){e.matrixAutoUpdate=!0,e.position.copy(t.position),e.rotation.copy(t.rotation),e.scale.copy(t.scale),e.updateMatrix(),e.updateWorldMatrix(!0,!1);return}Sg.compose(t.position,Mg.setFromEuler(t.rotation),t.scale);let s=n?.rotation;zl.compose(eC.fromArray(n?.position??[0,0,0]),Mg.setFromEuler(nC.set(s?.[0]??0,s?.[1]??0,s?.[2]??0)),tC.fromArray(n?.scale??[1,1,1])),zl.premultiply(i).multiply(Qw.copy(i).invert()),e.parent?.updateWorldMatrix(!0,!1);let c=e.parent?.matrixWorld??Kw;if(Fl.multiplyMatrices(c,Sg).premultiply(zl),a&&r){let l=e;for(;l.parent&&!l.userData.ri_name;)l=l.parent;let u=l.userData.ri_center;Array.isArray(u)&&u.length===3?oi.fromArray(u).applyMatrix4(i).applyMatrix4(zl):oi.setFromMatrixPosition(Fl),oi.sub(r.centre),oi.lengthSq()>1e-8&&(oi.normalize().multiplyScalar(r.factor*r.radius),Fl.premultiply(Zw.makeTranslation(oi.x,oi.y,oi.z)))}e.matrixAutoUpdate=!1,e.matrix.multiplyMatrices(Jw.copy(c).invert(),Fl),e.matrixWorldNeedsUpdate=!0,e.updateWorldMatrix(!1,!1)}function Ul(e,t){if(!Wn(e)&&!e.userData.riLogicalObject)return;let n=jl(e,t);if(!n)return;let i=kg(e);if(i.rest??(i.rest={position:e.position.clone(),rotation:e.rotation.clone(),scale:e.scale.clone()}),t.suspendTransforms)return;if(t.placementFrame&&!e.userData.riLogicalObject){rC(e,i.rest,n.binding.transform,t.placementFrame,t.explode);return}let r=i.rest,o=n.binding.transform;o?.position?e.position.fromArray(o.position):e.position.copy(r.position),o?.rotation?e.rotation.set(o.rotation[0],o.rotation[1],o.rotation[2],r.rotation.order):e.rotation.copy(r.rotation),o?.scale?e.scale.fromArray(o.scale):e.scale.copy(r.scale);let a=t.explode;if(a&&a.factor>0&&a.radius>0){e.updateWorldMatrix(!0,!1),Qd.setFromMatrixPosition(e.matrixWorld);let s=e;for(;s.parent&&!s.userData.ri_name;)s=s.parent;let c=s.userData.ri_center;Array.isArray(c)&&c.length===3?Xo.fromArray(c).applyMatrix4(e.matrixWorld).sub(a.centre):Xo.copy(Qd).sub(a.centre),Xo.lengthSq()>1e-8&&(Xo.normalize().multiplyScalar(a.factor*a.radius).add(Qd),e.parent&&e.parent.worldToLocal(Xo),e.position.copy(Xo))}e.updateMatrix(),e.updateWorldMatrix(!0,!1)}function qo(e,t){e.traverse(n=>Ul(n,t))}function kg(e){var t;return(t=e.userData).riVisuals??(t.riVisuals={}),e.userData.riVisuals}function iC(e,t,n,i){return JSON.stringify([e?.style?.material??null,t??null,n.shadingMode,n.rendererMode,i])}function oC(e){if(e.textures){for(let t of Ja){let n=e.textures[t];n&&Hi(n,Xi(t))}e.textures=void 0}}function aC(e,t,n){let i=e.textures??{};for(let r of Ja){let o=mt(t,r),a=i[r];if(a===o)continue;let s=Xi(r);a&&Hi(a,s),o?(hl(o,s,n),i[r]=o):delete i[r]}e.textures=Object.keys(i).length>0?i:void 0}function sC(e,t){if(t.shadingMode==="normals")return wr(e,()=>new Xw);if(t.shadingMode==="unlit")return wr(e,n=>{let i=new Ww;return i.color.copy(n.color),i.map=n.map,i.alphaMap=n.alphaMap,i.alphaTest=n.alphaTest,i.transparent=n.transparent,i.opacity=n.opacity,i.side=n.side,i});if(t.rendererMode==="matcap"){let n=ml();return wr(e,i=>{let r=new $w;return r.matcap=n,r.color.copy(i.color),r.alphaMap=i.alphaMap,r.alphaTest=i.alphaTest,r.side=i.side,r})}return e}function lC(e,t){if(!Wn(e))return;let i=kg(e);i.original??(i.original=Za(e));let r=jl(e,t);if(!r){i.original&&(e.material=i.original),e.visible=!0;return}let{key:o,binding:a}=r;e.visible=a.visible!==!1,Ul(e,t);let s=t.itemMaterials?.[o]?.hex??t.itemMaterials?.[a.modelObjectId??o]?.hex,c=t.highlightOnHover!==!1&&o===t.hoveredKey,l=iC(a,s,t,c);if(i.signature===l&&i.display){e.material=i.display;return}let u=a.style?.material;if(aC(i,u,t.invalidate),!i.physical){let d=i.original??Za(e);if(!d)return;i.physical=wr(d,h=>{let b=kl(h),m=_l(b??new qw);return Al(m),m})}$n(i.physical,d=>{Ll(d,u,s??u?.baseColor),c&&(d.emissive.add(Ha),d.color.lerp(bm,fm)),d.needsUpdate=!0}),i.display&&i.display!==i.physical&&$n(i.display,d=>d.dispose()),i.display=sC(i.physical,t),i.signature=l,e.material=i.display}function _g(e,t){e.traverse(n=>lC(n,t))}function Zd(e){e.traverse(t=>{if(!Wn(t))return;let n=t.userData.riVisuals;n&&(n.rest&&(t.matrixAutoUpdate=!0,t.position.copy(n.rest.position),t.rotation.copy(n.rest.rotation),t.scale.copy(n.rest.scale),t.updateMatrix()),n.original&&(t.material=n.original),n.display&&n.display!==n.physical&&$n(n.display,i=>i.dispose()),n.physical&&$n(n.physical,i=>i.dispose()),oC(n),delete t.userData.riVisuals)})}var Bg=new Lg().makeRotationX(Math.PI/2),Eg=Bg.clone().invert();function pC(e){let t=new Ur(e[0],e[1],e[2]),n=new Ur(Math.abs(e[3])+Math.abs(e[6])+Math.abs(e[9]),Math.abs(e[4])+Math.abs(e[7])+Math.abs(e[10]),Math.abs(e[5])+Math.abs(e[8])+Math.abs(e[11]));return new Rg(t.clone().sub(n),t.clone().add(n))}function hC(e){let t=e.getCenter(new Ur),n=e.getSize(new Ur).multiplyScalar(.5);return[t.x,t.y,t.z,n.x,0,0,0,n.y,0,0,0,n.z]}var Vl=class{constructor(){this.group=new Ag;this.objects=new Map;this.geometry=new cC(1,1,1);this.material=new uC;this.originalBounds=new WeakMap;this.signature="";this.lastContext=null;this.lastEffective=null;this.lastDragging=!1;this.version=0;this.tileVersions=new WeakMap;this.transforms=new Map}setCatalog(t){this.group.clear(),this.objects.clear();for(let n of t){let i=new Rg(new Ur(...n.minimum),new Ur(...n.maximum)).applyMatrix4(Eg),r=new Ag;r.name=n.name,r.userData.ri_name=n.name,r.userData.riLogicalObject=!0,r.userData.ri_center=i.getCenter(new Ur).toArray();let o=new dC(this.geometry,this.material);o.visible=!1,o.raycast=()=>{},o.position.copy(i.getCenter(new Ur)),o.scale.copy(i.getSize(new Ur)),r.add(o),this.group.add(r),this.objects.set(n.name,r)}this.signature="",this.lastContext=null}nodesByBinding(t){let n={};for(let[i,r]of this.objects){let o=t.keyByModelObject[i]??i;t.objectBindings[o]&&(n[o]=r)}return n}sync(t,n,i=!1){if(!i&&!this.lastDragging&&t===this.lastContext&&this.lastEffective)return this.lastEffective;this.lastContext=t,this.lastDragging=i;let r={...t,suspendTransforms:!1},o=n?t.objectBindings[n]:void 0,a=o?this.objects.get(o.modelObjectId??n):void 0;i&&a&&o&&(r={...r,objectBindings:{...t.objectBindings,[n]:{...o,transform:{position:a.position.toArray(),rotation:[a.rotation.x,a.rotation.y,a.rotation.z],scale:a.scale.toArray()}}}});for(let c of this.objects.values())i&&c===a||Ul(c,r);this.group.updateWorldMatrix(!0,!0);let s=[...this.objects].map(([c,l])=>`${c}:${l.matrix.elements.join(",")}`).join(";");if(s!==this.signature){this.signature=s,this.version++,this.transforms.clear();for(let[c,l]of this.objects)l.matrix.equals(new Lg)||this.transforms.set(c,Bg.clone().multiply(l.matrix).multiply(Eg))}return this.lastEffective=r,r}updateBounds(t){if(!t)return;let n=i=>{if(this.tileVersions.get(i)!==this.version){if(i.boundingVolume.box&&this.tileVersions.get(i)!==this.version){let r=this.originalBounds.get(i);r||(r={box:[...i.boundingVolume.box],error:i.geometricError},this.originalBounds.set(i,r));let o=pC(r.box),a=o.clone(),s=1;for(let l of i.extras?.featureIds??[]){let u=this.transforms.get(l);u&&(a.union(o.clone().applyMatrix4(u)),s=Math.max(s,u.getMaxScaleOnAxis()))}let c=hC(a);i.boundingVolume.box=c,i.geometricError=r.error*s,i.engineData?.boundingVolume?.setObbData(c,i.engineData.transform),this.tileVersions.set(i,this.version)}i.children?.forEach(n)}};n(t)}dispose(){this.group.clear(),this.objects.clear(),this.geometry.dispose(),this.material.dispose()}};var eu=Object.freeze({factor:1,loosened:!1,tooFine:0,raisedAt:-1/0,changedAt:-1/0}),ns=16,tu=1.25,mC=1.5,gC=1.25,bC=500,fC=3e3,Dg=5e3,Og=2e3,xC=.9;function Ng(e){return e.full&&(e.wanting||e.usage>1)}function Ig(e){return e.loosened?fC:bC}function zg(e){let t=e.factor/gC;return t<=1+1e-6?1:t}function Fg(e,t){return e.factor>1&&!e.loosened&&!t.full&&!t.wanting&&t.usage<xC&&zg(e)>e.tooFine}function jg(e,t){let{now:n}=t,i=t.moved&&e.tooFine>0?{...e,tooFine:0}:e;if(Ng(t)){if(n-i.changedAt<Ig(i))return i;let r=Math.max(i.tooFine,i.factor);return i.factor>=ns?i.loosened&&i.tooFine===r?i:{...i,loosened:!0,tooFine:r,changedAt:n}:{factor:Math.min(ns,i.factor*mC),loosened:!0,tooFine:r,raisedAt:n,changedAt:n}}return i.loosened&&!t.wanting?{...i,loosened:!1,changedAt:n}:Fg(i,t)&&n-i.raisedAt>=Dg&&n-i.changedAt>=Og?{...i,factor:zg(i),changedAt:n}:i}function Ug(e,t){let{now:n}=t;return Ng(t)?e.factor>=ns&&e.loosened?null:Math.max(0,Ig(e)-(n-e.changedAt)):e.loosened&&!t.wanting?0:Fg(e,t)?Math.max(0,Dg-(n-e.raisedAt),Og-(n-e.changedAt)):null}function Wg(e){try{let t=typeof location<"u"?location.href:void 0;return new URL(e,t).origin}catch{return null}}function nu(e){if(!e)return null;let t=e.length,n=e.indexOf("?"),i=e.indexOf("#");n!==-1&&(t=Math.min(t,n)),i!==-1&&(t=Math.min(t,i));let r=e.lastIndexOf(".",t),o=e.lastIndexOf("/",t),a=e.indexOf("://");return a!==-1&&a+2===o||r===-1||r<o?null:e.substring(r+1,t)||null}var Hl,rs=(Hl=class{static setXRSession(e){e!==this.session&&(this.flushPending(),this.session=e)}static requestAnimationFrame(e){let{session:t,pending:n}=this,i,r=()=>{n.delete(i),e()};return i=t?t.requestAnimationFrame(r):requestAnimationFrame(r),n.set(i,e),i}static cancelAnimationFrame(e){let{pending:t,session:n}=this;t.delete(e),n?n.cancelAnimationFrame(e):cancelAnimationFrame(e)}static flushPending(){this.pending.forEach((e,t)=>{e(),this.cancelAnimationFrame(t)})}},ed(Hl,"pending",new Map),ed(Hl,"session",null),Hl),Vg=2**30,as=class{get unloadPriorityCallback(){return this._unloadPriorityCallback}set unloadPriorityCallback(e){e.length===1?(console.warn('LRUCache: "unloadPriorityCallback" function has been changed to take two arguments.'),this._unloadPriorityCallback=(t,n)=>{let i=e(t),r=e(n);return i<r?-1:+(i>r)}):this._unloadPriorityCallback=e}constructor(){this.minSize=6e3,this.maxSize=8e3,this.minBytesSize=.3*Vg,this.maxBytesSize=.4*Vg,this.unloadPercent=.05,this.autoMarkUnused=!0,this.cachedBytes=0,this.itemSet=new Map,this.itemList=[],this.usedSet=new Set,this.callbacks=new Map,this.unloadingHandle=-1,this.bytesMap=new Map,this.loadedSet=new Set,this._unloadPriorityCallback=null;let e=this.itemSet;this.defaultPriorityCallback=t=>e.get(t)}isFull(){return this.itemSet.size>=this.maxSize||this.cachedBytes>=this.maxBytesSize}getMemoryUsage(e){return this.bytesMap.get(e)||0}setMemoryUsage(e,t){let{bytesMap:n,itemSet:i}=this;i.has(e)&&(this.cachedBytes-=n.get(e)||0,n.set(e,t),this.cachedBytes+=t)}add(e,t){let n=this.itemSet;if(n.has(e)||this.isFull())return!1;let i=this.usedSet,r=this.itemList,o=this.callbacks;return r.push(e),i.add(e),n.set(e,Date.now()),o.set(e,t),!0}has(e){return this.itemSet.has(e)}remove(e){let t=this.usedSet,n=this.itemSet,i=this.itemList,r=this.bytesMap,o=this.callbacks,a=this.loadedSet;if(n.has(e)){this.cachedBytes-=r.get(e)||0,r.delete(e),o.get(e)(e);let s=i.indexOf(e);return i.splice(s,1),t.delete(e),n.delete(e),o.delete(e),a.delete(e),!0}return!1}setLoaded(e,t){let{itemSet:n,loadedSet:i}=this;n.has(e)&&(t===!0?i.add(e):i.delete(e))}markUsed(e){let t=this.itemSet,n=this.usedSet;t.has(e)&&!n.has(e)&&(t.set(e,Date.now()),n.add(e))}markUnused(e){this.usedSet.delete(e)}markAllUnused(){this.usedSet.clear()}isUsed(e){return this.usedSet.has(e)}unloadUnusedContent(){let{unloadPercent:e,minSize:t,maxSize:n,itemList:i,itemSet:r,usedSet:o,loadedSet:a,callbacks:s,bytesMap:c,minBytesSize:l,maxBytesSize:u}=this,d=i.length-o.size,h=i.length-a.size,b=Math.max(Math.min(i.length-t,d),0),m=this.cachedBytes-l,y=this.unloadPriorityCallback||this.defaultPriorityCallback,k=!1,w=b>0&&d>0||h&&i.length>n;if(d&&this.cachedBytes>l||h&&this.cachedBytes>u||w){i.sort((x,C)=>{let P=o.has(x);if(P===o.has(C)){let _=a.has(x);return _===a.has(C)?-y(x,C):_?1:-1}else return P?1:-1});let p=Math.max(t*e,b*e),g=Math.ceil(Math.min(p,d,b)),S=Math.max(e*m,e*l),v=Math.min(S,m),M=0,D=0;for(;this.cachedBytes-D>u||i.length-M>n;){let x=i[M],C=c.get(x)||0;if(o.has(x)&&a.has(x)||this.cachedBytes-D-C<u&&i.length-M<=n)break;D+=C,M++}for(;D<v||M<g;){let x=i[M],C=c.get(x)||0;if(o.has(x)||this.cachedBytes-D-C<l&&M>=g)break;D+=C,M++}i.splice(0,M).forEach(x=>{this.cachedBytes-=c.get(x)||0,s.get(x)(x),c.delete(x),r.delete(x),s.delete(x),a.delete(x),o.delete(x)}),k=M<b||D<m&&M<d,k&&(k=M>0)}k&&(this.unloadingHandle=rs.requestAnimationFrame(()=>this.scheduleUnload()))}scheduleUnload(){rs.cancelAnimationFrame(this.unloadingHandle),this.scheduled||(this.scheduled=!0,queueMicrotask(()=>{this.scheduled=!1,this.unloadUnusedContent()}))}},yC=class extends DOMException{constructor(){super("PriorityQueue: Item removed","AbortError")}},Cr=class{get running(){return this.items.length!==0||this.currJobs!==0}constructor(){this.maxJobs=6,this.items=[],this.callbacks=new Map,this.currJobs=0,this.scheduled=!1,this.autoUpdate=!0,this.priorityCallback=null,this._schedulingCallback=e=>{rs.requestAnimationFrame(e)},this._runjobs=()=>{this.scheduled=!1,this.tryRunJobs()}}sort(){let e=this.priorityCallback,t=this.items;e!==null&&t.sort(e)}has(e){return this.callbacks.has(e)}add(e,t){let n={callback:t,reject:null,resolve:null,promise:null};return n.promise=new Promise((i,r)=>{let o=this.items,a=this.callbacks;n.resolve=i,n.reject=r,o.unshift(e),a.set(e,n),this.autoUpdate&&this.scheduleJobRun()}),n.promise}remove(e){let t=this.items,n=this.callbacks,i=t.indexOf(e);if(i!==-1){let r=n.get(e);r.promise.catch(o=>{if(o.name!=="AbortError")throw o}),r.reject(new yC),t.splice(i,1),n.delete(e)}}removeByFilter(e){let{items:t}=this;for(let n=0;n<t.length;n++){let i=t[n];e(i)&&(this.remove(i),n--)}}tryRunJobs(){this.sort();let e=this.items,t=this.callbacks,n=this.maxJobs,i=0,r=()=>{this.currJobs--,this.autoUpdate&&this.scheduleJobRun()};for(;n>this.currJobs&&e.length>0&&i<n;){this.currJobs++,i++;let o=e.pop(),{callback:a,resolve:s,reject:c}=t.get(o);t.delete(o);let l;try{l=a(o)}catch(u){c(u),r();continue}l instanceof Promise?l.then(s).catch(c).finally(r):(s(l),r())}}flush(e){let{items:t,callbacks:n}=this,i=t.indexOf(e);if(!n.has(e))return;let{callback:r,resolve:o,reject:a}=n.get(e);n.delete(e),t.splice(i,1);let s;try{s=r(e)}catch(c){a(c);return}return s instanceof Promise?s.then(o).catch(a):o(s),s}scheduleJobRun(){this.scheduled||(this.scheduled=(this._schedulingCallback(this._runjobs),!0))}},ql=class{get running(){for(let e of this.originQueues.values())if(e.running)return!0;return!1}get maxJobsPerOrigin(){return this._maxJobsPerOrigin}set maxJobsPerOrigin(e){this._maxJobsPerOrigin=e,this.originQueues.forEach(t=>t.maxJobs=e)}get maxJobs(){return this.maxJobsPerOrigin}set maxJobs(e){console.warn('DownloadPriorityQueue: "maxJobs" is no longer valid and limits jobs per server origin. Use "maxJobsPerOrigin", instead.'),this.maxJobsPerOrigin=e}get priorityCallback(){return this._priorityCallback}set priorityCallback(e){this._priorityCallback=e,this.originQueues.forEach(t=>t.priorityCallback=e)}constructor(){this.originQueues=new Map,this._itemQueues=new WeakMap,this._maxJobsPerOrigin=6,this._priorityCallback=null}add(e,t,n,i=null){this.originQueues.forEach((c,l)=>{c.running||this.originQueues.delete(l)});let r=e===null?null:Wg(e),o=this.originQueues.get(r);o||(o=new Cr,o.maxJobs=this._maxJobsPerOrigin,o.priorityCallback=this._priorityCallback,this.originQueues.set(r,o));let a=this._itemQueues.get(t);if(a&&a!==o&&a.has(t))throw Error("DownloadPriorityQueue: Item is already queued with a different url origin.");this._itemQueues.set(t,o);let s=o.add(t,n);return i!==null&&(i.aborted?this.remove(t):i.addEventListener("abort",()=>this.remove(t),{once:!0})),s}remove(e){let t=this._itemQueues.get(e);t&&(t.remove(e),this._itemQueues.delete(e))}has(e){let t=this._itemQueues.get(e);return!!(t&&t.has(e))}};var Ji=6378137,vC=1/298.257223563,iu=6356752314245179e-9,Gl={inView:!1,error:1/0,distanceFromCamera:1/0};function Yl(e){return e===4||e===-1}function Vr(e,t){return Kl(e)&&e.traversal.lastFrameVisited===t&&e.traversal.used}function Kl(e){return!!e.traversal}function ss(e){let{children:t}=e,n=t.length===0||Kl(t[t.length-1]),i=!e.internal.hasUnrenderableContent||Yl(e.internal.loadingState);return n&&i}function Ki(e){return e.traversal.unconditionallyRefine}function is(e,t){if(Kl(e)&&(t.ensureChildrenArePreprocessed(e),e.traversal.lastFrameVisited!==t.frameCount&&(e.traversal.wasInFrustum=e.traversal.inFrustum,e.traversal.wasSetActive=e.traversal.active,e.traversal.wasSetVisible=e.traversal.visible,e.traversal.usedLastFrame=e.traversal.used,e.traversal.lastFrameVisited=t.frameCount,e.traversal.used=!1,e.traversal.inFrustum=!1,e.traversal.isLeaf=!1,e.traversal.visible=!1,e.traversal.active=!1,e.traversal.error=1/0,e.traversal.distanceFromCamera=1/0,e.traversal.allChildrenReady=!1,e.traversal.allChildrenLoaded=!1,e.traversal.kicked=!1,e.traversal.allUsedChildrenProcessed=!1,t.calculateTileViewErrorWithPlugin(e,Gl),e.traversal.inFrustum=Gl.inView,e.traversal.error=Gl.error,e.traversal.distanceFromCamera=Gl.distanceFromCamera,e.traversal.unconditionallyRefine=e.internal.hasUnrenderableContent,!e.traversal.unconditionallyRefine))){let n=e.parent;for(;n&&n.traversal.unconditionallyRefine;)n=n.parent;n&&n.geometricError<=e.geometricError&&(e.traversal.unconditionallyRefine=!0)}}function ru(e,t,n=!1){if(is(e,t),n?t.markTileUsed(e):Wl(e),Ki(e)&&ss(e)){let i=e.children;for(let r=0,o=i.length;r<o;r++)ru(i[r],t,n)}}function $g(e,t){if(is(e,t),e.traversal.usedLastFrame&&(Wl(e),e.traversal.wasSetActive&&(e.traversal.active=!0),(!e.traversal.active||Ki(e))&&ss(e))){let n=e.children;for(let i=0,r=n.length;i<r;i++)$g(n[i],t)}}function Wl(e){e.traversal.used=!0}function wC(e,t){return!(e.traversal.error<=t.errorTarget&&!Ki(e)||t.maxDepth>0&&e.internal.depth+1>=t.maxDepth||!ss(e))}function Xg(e,t){let{frameCount:n}=t,{children:i}=e;for(let r=0,o=i.length;r<o;r++){let a=i[r];Vr(a,n)&&(a.traversal.active&&(a.traversal.kicked=!0,a.traversal.active=!1),Xg(a,t))}}function Gg(e){return!Ki(e)&&(!e.internal.hasContent||Yl(e.internal.loadingState))}function qg(e,t){if(is(e,t),!e.traversal.inFrustum)return;let n=e.parent;if(n&&n.refine==="ADD"&&e.geometricError>0&&e.traversal.error*(n.geometricError/e.geometricError)<=t.errorTarget)return;if(!wC(e,t)){Wl(e);return}let i=!1,r=!1,o=e.children;for(let a=0,s=o.length;a<s;a++){let c=o[a];qg(c,t),i||(i=Vr(c,t.frameCount)),r||(r=c.traversal.inFrustum)}if(e.refine==="REPLACE"&&!r&&o.length!==0){e.traversal.inFrustum=!1,t.markTileUsed(e);for(let a=0,s=o.length;a<s;a++)ru(o[a],t,!0);return}if(Wl(e),e.refine==="REPLACE"&&i&&(t.loadSiblings||t.loadAncestors))for(let a=0,s=o.length;a<s;a++)ru(o[a],t)}function Yg(e,t){let n=t.frameCount;if(!Vr(e,n))return;let i=e.children,r=!1;for(let a=0,s=i.length;a<s;a++){let c=i[a];r||(r=Vr(c,n))}if(!r)e.traversal.isLeaf=!0;else{for(let s=0,c=i.length;s<c;s++)Yg(i[s],t);let a=!0;for(let s=0,c=i.length;s<c;s++){let l=i[s];if(Vr(l,n)){let u=!Ki(l),d=!l.internal.hasContent||Yl(l.internal.loadingState);u&&d||l.traversal.allChildrenLoaded||(a=!1)}}e.traversal.allChildrenLoaded=a}let o=!0;for(let a=0,s=i.length;a<s;a++){let c=i[a];Vr(c,t.frameCount)&&!c.traversal.allUsedChildrenProcessed&&(o=!1)}e.traversal.allUsedChildrenProcessed=o&&ss(e)}function Kg(e,t){if(!Vr(e,t.frameCount))return;let n=e.children;if(e.refine==="REPLACE"&&t.loadAncestors&&!e.traversal.allChildrenLoaded&&!Ki(e)&&(e.traversal.isLeaf=!0),e.traversal.isLeaf){if(!Ki(e)&&(e.traversal.active=!0,ss(e)&&e.internal.hasContent&&!Yl(e.internal.loadingState)))for(let r=0,o=n.length;r<o;r++)$g(n[r],t);return}let i=n.length>0;for(let r=0,o=n.length;r<o;r++){let a=n[r];Kg(a,t),Vr(a,t.frameCount)&&!(a.traversal.active&&Gg(a))&&!a.traversal.allChildrenReady&&(i=!1)}e.traversal.allChildrenReady=i,e.refine==="REPLACE"&&!i&&e.traversal.wasSetActive&&Gg(e)&&(e.traversal.active=!0,Xg(e,t))}function Qg(e,t){is(e,t);let n=Vr(e,t.frameCount);if(n&&(e.internal.hasUnrenderableContent&&(t.markTileUsed(e),t.queueTileForDownload(e)),e.internal.hasRenderableContent&&e.refine==="ADD"&&(e.traversal.active=!0),(e.traversal.active||e.traversal.kicked)&&e.internal.hasContent&&(t.markTileUsed(e),e.traversal.allUsedChildrenProcessed&&t.queueTileForDownload(e),e.internal.loadingState!==4&&(e.traversal.active=!1)),t.loadAncestors&&e.internal.hasContent&&(t.markTileUsed(e),t.queueTileForDownload(e)),e.internal.virtualChildCount>0&&e.internal.hasContent&&t.markTileUsed(e),e.traversal.visible=e.internal.hasRenderableContent&&e.traversal.active&&e.traversal.inFrustum&&e.internal.loadingState===4,t.stats.used++,e.traversal.inFrustum&&t.stats.inFrustum++),n||Kl(e)&&e.traversal.usedLastFrame){let i=!1,r=!1;n?(i=e.traversal.active,r=t.displayActiveTiles&&e.traversal.active||e.traversal.visible):is(e,t),e.internal.hasRenderableContent&&e.internal.loadingState===4?(i&&t.stats.active++,r&&t.stats.visible++,e.traversal.wasSetActive!==i&&t.invokeOnePlugin(a=>a.setTileActive&&a.setTileActive(e,i)),e.traversal.wasSetVisible!==r&&t.invokeOnePlugin(a=>a.setTileVisible&&a.setTileVisible(e,r))):e.internal.hasRenderableContent||(r=e.traversal.isLeaf,e.traversal.wasSetVisible!==r&&t.invokeOnePlugin(a=>a.setEmptyTileVisible&&a.setEmptyTileVisible(e,r))),e.traversal.visible=r,e.traversal.active=i;let o=e.children;for(let a=0,s=o.length;a<s;a++){let c=o[a];Qg(c,t)}}}function CC(e,t){qg(e,t),Yg(e,t),Kg(e,t),Qg(e,t)}function SC(e){let t=null;return()=>{t===null&&(t=rs.requestAnimationFrame(()=>{t=null,e()}))}}function MC(e,t=null,n=null){let i=[];for(i.push(e),i.push(null),i.push(0);i.length>0;){let r=i.pop(),o=i.pop(),a=i.pop();if(t&&t(a,o,r)){n&&n(a,o,r);return}let s=a.children;if(s)for(let c=s.length-1;c>=0;c--)i.push(s[c]),i.push(a),i.push(r+1);n&&n(a,o,r)}}var Hg=Symbol("PLUGIN_REGISTERED"),ai={inView:!0,error:0,distance:1/0},TC=(e,t)=>{let n=e.priority||0,i=t.priority||0;return n===i?!e.traversal||!t.traversal?0:e.traversal.used===t.traversal.used?e.traversal.error===t.traversal.error?e.traversal.distanceFromCamera===t.traversal.distanceFromCamera?e.internal.depthFromRenderedParent===t.internal.depthFromRenderedParent?0:e.internal.depthFromRenderedParent>t.internal.depthFromRenderedParent?-1:1:e.traversal.distanceFromCamera>t.traversal.distanceFromCamera?-1:1:e.traversal.error>t.traversal.error?1:-1:e.traversal.used?1:-1:n>i?1:-1},PC=(e,t)=>e.traversal.used===t.traversal.used?e.traversal.inFrustum===t.traversal.inFrustum?e.internal.hasUnrenderableContent===t.internal.hasUnrenderableContent?e.traversal.distanceFromCamera===t.traversal.distanceFromCamera?e.internal.depthFromRenderedParent===t.internal.depthFromRenderedParent?0:e.internal.depthFromRenderedParent>t.internal.depthFromRenderedParent?-1:1:e.traversal.distanceFromCamera>t.traversal.distanceFromCamera?-1:1:e.internal.hasUnrenderableContent?1:-1:e.traversal.inFrustum?1:-1:e.traversal.used?1:-1,kC=(e,t)=>e.traversal.lastFrameVisited===t.traversal.lastFrameVisited?e.internal.depthFromRenderedParent===t.internal.depthFromRenderedParent?e.internal.loadingState===t.internal.loadingState?e.internal.hasUnrenderableContent===t.internal.hasUnrenderableContent?e.traversal.error===t.traversal.error?0:e.traversal.error>t.traversal.error?-1:1:e.internal.hasUnrenderableContent?-1:1:e.internal.loadingState>t.internal.loadingState?-1:1:e.internal.depthFromRenderedParent>t.internal.depthFromRenderedParent?1:-1:e.traversal.lastFrameVisited>t.traversal.lastFrameVisited?-1:1,Yo=(e,t)=>{let n=e.priority??1/0,i=t.priority??1/0;if(n!==i)return n>i?1:-1;if(!e.internal||!t.internal)return 0;let r=e.internal.renderer,o=t.internal.renderer,a=!r.loadAncestors,s=!o.loadAncestors;return a&&s?PC(e,t):TC(e,t)},ou=new as;ou.unloadPriorityCallback=kC;var os=new ql;os.maxJobsPerOrigin=25,os.priorityCallback=Yo;var $l=new Cr;$l.maxJobs=5,$l.priorityCallback=Yo;var Xl=new Cr;Xl.maxJobs=25,Xl.priorityCallback=(e,t)=>{let n=e.parent,i=t.parent;return n===i?0:n?i?Yo(n,i):-1:1};var au=class{get root(){let e=this.rootTileset;return e?e.root:null}get loadProgress(){let{stats:e,isLoading:t}=this,n=e.queued+e.downloading+e.parsing,i=e.inCacheSinceLoad+ +!!t;return i===0?1:1-n/i}get downloadQueue(){return this._downloadQueue}set downloadQueue(e){if(e instanceof Cr){console.warn('TilesRenderer: "downloadQueue" is no longer valid as a PriorityQueue. Use a DownloadPriorityQueue, instead.');return}this._downloadQueue=e}constructor(e=null){this.rootLoadingState=0,this.rootTileset=null,this.rootURL=e,this.fetchOptions={},this.plugins=[],this.queuedTiles=[],this.cachedSinceLoadComplete=new Set,this.isLoading=!1,this.processedTiles=new WeakSet,this.visibleTiles=new Set,this.activeTiles=new Set,this.usedSet=new Set,this.loadingTiles=new Set,this.lruCache=ou,this.downloadQueue=os,this.parseQueue=$l,this.processNodeQueue=Xl,this.stats={inCacheSinceLoad:0,inCache:0,queued:0,downloading:0,parsing:0,loaded:0,failed:0,inFrustum:0,used:0,active:0,visible:0,tilesProcessed:0},this.frameCount=0,this._dispatchNeedsUpdateEvent=SC(()=>{this.dispatchEvent({type:"needs-update"})}),this.errorTarget=16,this.errorFalloff=0,this.errorFalloffDensity=2e-4,this.displayActiveTiles=!1,this.maxDepth=1/0,this.loadSiblings=!0,this.loadAncestors=!0,this.maxTilesProcessed=250}registerPlugin(e){if(e[Hg]===!0)throw Error("TilesRendererBase: A plugin can only be registered to a single tileset");let t=this.plugins,n=e.priority||0,i=t.length;for(let r=0;r<t.length;r++)if((t[r].priority||0)>n){i=r;break}t.splice(i,0,e),e[Hg]=!0,e.init&&e.init(this)}unregisterPlugin(e){let t=this.plugins;if(typeof e=="string"&&(e=this.getPluginByName(e)),t.includes(e)){let n=t.indexOf(e);return t.splice(n,1),e.dispose&&e.dispose(),!0}return!1}getPluginByName(e){return this.plugins.find(t=>t.name===e)||null}invokeOnePlugin(e){let t=[...this.plugins,this];for(let n=0;n<t.length;n++){let i=e(t[n]);if(i)return i}return null}invokeAllPlugins(e){let t=[...this.plugins,this],n=[];for(let i=0;i<t.length;i++){let r=e(t[i]);r&&n.push(r)}return n.length===0?null:Promise.all(n)}traverse(e,t,n=!0){this.root&&MC(this.root,(i,...r)=>(n&&this.ensureChildrenArePreprocessed(i,!0),e?e(i,...r):!1),t)}getAttributions(e=[]){return this.invokeAllPlugins(t=>t!==this&&t.getAttributions&&t.getAttributions(e)),e}update(){let{lruCache:e,usedSet:t,stats:n,root:i,downloadQueue:r,parseQueue:o,processNodeQueue:a}=this;if(this.rootLoadingState===0&&(this.rootLoadingState=2,this.invokeOnePlugin(l=>l.loadRootTileset&&l.loadRootTileset()).then(l=>{let u=this.rootURL;u!==null&&this.invokeAllPlugins(d=>u=d.preprocessURL?d.preprocessURL(u,null):u),this.rootLoadingState=4,this.rootTileset=l,this.dispatchEvent({type:"needs-update"}),this.dispatchEvent({type:"load-tileset",tileset:l,url:u}),this.dispatchEvent({type:"load-root-tileset",tileset:l,url:u})}).catch(l=>{this.rootLoadingState=-1,console.error(l),this.rootTileset=null,this.dispatchEvent({type:"load-error",tile:null,error:l,url:this.rootURL})})),!i)return;let s=null;if(this.invokeAllPlugins(l=>{if(l.doTilesNeedUpdate){let u=l.doTilesNeedUpdate();s=s===null?u:!!(s||u)}}),s===!1){this.dispatchEvent({type:"update-before"}),this.dispatchEvent({type:"update-after"});return}this.dispatchEvent({type:"update-before"}),n.inFrustum=0,n.used=0,n.active=0,n.visible=0,n.tilesProcessed=0,this.frameCount++,t.forEach(l=>e.markUnused(l)),t.clear(),this.prepareForTraversal(),CC(i,this),this.removeUnusedPendingTiles();let c=this.queuedTiles;c.sort(e.unloadPriorityCallback);for(let l=0,u=c.length;l<u&&!e.isFull();l++)this.requestTileContents(c[l]);c.length=0,e.scheduleUnload(),(r.running||o.running||a.running)===!1&&this.isLoading===!0&&(this.cachedSinceLoadComplete.clear(),n.inCacheSinceLoad=0,this.dispatchEvent({type:"tiles-load-end"}),this.isLoading=!1),this.dispatchEvent({type:"update-after"})}resetFailedTiles(){this.rootLoadingState===-1&&(this.rootLoadingState=0);let e=this.stats;e.failed!==0&&(this.traverse(t=>{t.internal.loadingState===-1&&(t.internal.loadingState=0)},null,!1),e.failed=0)}calculateTileViewErrorWithPlugin(e,t){this.calculateTileViewError(e,t);let{errorFalloff:n,errorFalloffDensity:i}=this;if(n>0&&Number.isFinite(t.distanceFromCamera)){let s=t.distanceFromCamera*i;t.error-=n*(1-Math.exp(-s*s))}let r=null,o=0,a=1/0;this.invokeAllPlugins(s=>{s!==this&&s.calculateTileViewError&&(ai.inView=!0,ai.error=0,ai.distance=1/0,s.calculateTileViewError(e,ai)&&(r===null&&(r=!0),r&&(r=ai.inView),ai.inView&&(a=Math.min(a,ai.distance),o=Math.max(o,ai.error))))}),t.inView&&r!==!1?(t.error=Math.max(t.error,o),t.distanceFromCamera=Math.min(t.distanceFromCamera,a)):r?(t.inView=!0,t.error=o,t.distanceFromCamera=a):t.inView=!1}dispose(){[...this.plugins].forEach(n=>{this.unregisterPlugin(n)});let e=this.lruCache,t=[];this.traverse(n=>(t.push(n),!1),null,!1);for(let n=0,i=t.length;n<i;n++)e.remove(t[n]);this.stats={queued:0,parsing:0,downloading:0,failed:0,inFrustum:0,traversed:0,used:0,active:0,visible:0},this.frameCount=0,this.loadingTiles.clear()}calculateBytesUsed(e,t){return 0}dispatchEvent(e){}addEventListener(e,t){}removeEventListener(e,t){}parseTile(e,t,n){return null}prepareForTraversal(){}disposeTile(e){e.traversal.visible&&(e.internal.hasRenderableContent?this.invokeOnePlugin(n=>n.setTileVisible&&n.setTileVisible(e,!1)):this.invokeOnePlugin(n=>n.setEmptyTileVisible&&n.setEmptyTileVisible(e,!1)),e.traversal.visible=!1),e.traversal.active&&e.internal.hasRenderableContent&&this.invokeOnePlugin(n=>n.setTileActive&&n.setTileActive(e,!1)),e.traversal.active=!1;let{scene:t}=e.engineData;t&&this.dispatchEvent({type:"dispose-model",scene:t,tile:e})}preprocessNode(e,t,n=null){if(this.processedTiles.add(e),this.stats.tilesProcessed++,e.content&&(!("uri"in e.content)&&"url"in e.content&&(e.content.uri=e.content.url,delete e.content.url),e.content.boundingVolume&&!("box"in e.content.boundingVolume||"sphere"in e.content.boundingVolume||"region"in e.content.boundingVolume)&&delete e.content.boundingVolume),e.parent=n,e.children=e.children||[],e.internal={hasContent:!1,hasRenderableContent:!1,hasUnrenderableContent:!1,loadingState:0,basePath:t,depth:-1,depthFromRenderedParent:-1,isVirtual:!1,virtualChildCount:0,renderer:this,...e.internal},e.content?.uri){let i=nu(e.content.uri),r=!!(i&&/json$/.test(i));e.internal.hasContent=!0,e.internal.hasUnrenderableContent=r,e.internal.hasRenderableContent=!r}else e.internal.hasContent=!1,e.internal.hasUnrenderableContent=!1,e.internal.hasRenderableContent=!1;n?(e.internal.depth=n.internal.depth+1,e.internal.depthFromRenderedParent=n.internal.depthFromRenderedParent+ +!!e.internal.hasRenderableContent):(e.internal.depth=0,e.internal.depthFromRenderedParent=+!!e.internal.hasRenderableContent),e.traversal={distanceFromCamera:1/0,error:1/0,inFrustum:!1,wasInFrustum:!1,isLeaf:!1,used:!1,usedLastFrame:!1,visible:!1,wasSetVisible:!1,active:!1,wasSetActive:!1,allChildrenReady:!1,allChildrenLoaded:!1,kicked:!1,allUsedChildrenProcessed:!1,lastFrameVisited:-1},n===null?e.refine=e.refine||"REPLACE":e.refine=e.refine||n.refine,e.engineData={scene:null,metadata:null,boundingVolume:null},Object.defineProperty(e,"cached",{get(){return console.warn('TilesRenderer: "tile.cached" field has been renamed to "tile.engineData".'),this.engineData},enumerable:!1,configurable:!0}),this.invokeAllPlugins(i=>{i!==this&&i.preprocessNode&&i.preprocessNode(e,t,n)})}setTileActive(e,t){t?this.activeTiles.add(e):this.activeTiles.delete(e)}setTileVisible(e,t){t?this.visibleTiles.add(e):this.visibleTiles.delete(e),this.dispatchEvent({type:"tile-visibility-change",scene:e.engineData.scene,tile:e,visible:t})}calculateTileViewError(e,t){}removeUnusedPendingTiles(){let{lruCache:e,loadingTiles:t}=this,n=[];for(let i of t)!e.isUsed(i)&&i.internal.loadingState===1&&n.push(i);for(let i=0;i<n.length;i++)e.remove(n[i])}queueTileForDownload(e){e.internal.loadingState!==0||this.lruCache.isFull()||this.queuedTiles.push(e)}markTileUsed(e){this.usedSet.add(e),this.lruCache.markUsed(e)}fetchData(e,t){return fetch(e,t)}ensureChildrenArePreprocessed(e,t=this.stats.tilesProcessed<this.maxTilesProcessed){let n=e.children;if(n.length===0||n[n.length-1].traversal)return;let i=r=>{for(let o=0,a=r.length;o<a;o++){let s=r[o];s&&!s.traversal&&this.preprocessNode(s,e.internal.basePath,e)}};t?(this.processNodeQueue.remove(e),i(n)):this.processNodeQueue.has(e)||this.processNodeQueue.add(e,r=>{i(r.children),this._dispatchNeedsUpdateEvent()})}getBytesUsed(e){let t=0;return this.invokeAllPlugins(n=>{n.calculateBytesUsed&&(t+=n.calculateBytesUsed(e,e.engineData.scene)||0)}),t}recalculateBytesUsed(e=null){let{lruCache:t,processedTiles:n}=this;e===null?t.itemSet.forEach(i=>{n.has(i)&&t.setMemoryUsage(i,this.getBytesUsed(i))}):t.setMemoryUsage(e,this.getBytesUsed(e))}preprocessTileset(e,t,n=null){let[i,r]=e.asset.version.split(".").map(a=>parseInt(a));console.assert(i<=1,"TilesRenderer: asset.version is expected to be a 1.x or a compatible version."),i===1&&r>0&&console.warn("TilesRenderer: tiles versions at 1.1 or higher have limited support. Some new extensions and features may not be supported.");let o=t.replace(/\/[^/]*$/,"");o=new URL(o,window.location.href).toString(),this.preprocessNode(e.root,o,n)}loadRootTileset(){let e=this.rootURL;return this.invokeAllPlugins(t=>e=t.preprocessURL?t.preprocessURL(e,null):e),this.invokeOnePlugin(t=>t.fetchData&&t.fetchData(e,this.fetchOptions)).then(t=>{if(!(t instanceof Response))return t;if(t.ok)return t.json();throw Error(`TilesRenderer: Failed to load tileset "${e}" with status ${t.status} : ${t.statusText}`)}).then(t=>(this.preprocessTileset(t,e),t))}requestTileContents(e){if(e.internal.loadingState!==0)return;let t=!1,n=null,i=new URL(e.content.uri,e.internal.basePath+"/").toString();this.invokeAllPlugins(h=>i=h.preprocessURL?h.preprocessURL(i,e):i);let r=this.stats,o=this.lruCache,a=this.downloadQueue,s=this.parseQueue,c=this.loadingTiles,l=nu(i),u=new AbortController,d=u.signal;if(o.add(e,h=>{u.abort(),t?h.children.length=0:this.invokeAllPlugins(b=>{b.disposeTile&&b.disposeTile(h)}),r.inCache--,this.cachedSinceLoadComplete.has(e)&&(this.cachedSinceLoadComplete.delete(e),r.inCacheSinceLoad--),h.internal.loadingState===1?r.queued--:h.internal.loadingState===2?r.downloading--:h.internal.loadingState===3?r.parsing--:h.internal.loadingState===4&&r.loaded--,h.internal.loadingState=0,s.remove(h),a.remove(h),c.delete(h)}))return this.isLoading||(this.isLoading=!0,this.dispatchEvent({type:"tiles-load-start"})),o.setMemoryUsage(e,this.getBytesUsed(e)),this.cachedSinceLoadComplete.add(e),r.inCacheSinceLoad++,r.inCache++,r.queued++,e.internal.loadingState=1,c.add(e),a.add(i,e,h=>{if(d.aborted)return Promise.resolve();e.internal.loadingState=2,r.downloading++,r.queued--;let b=this.invokeOnePlugin(m=>m.fetchData&&m.fetchData(i,{...this.fetchOptions,signal:d}));return this.dispatchEvent({type:"tile-download-start",tile:e,url:i,get uri(){return console.warn('tile-download-start event: "uri" has been renamed to "url".'),this.url}}),b}).then(h=>{if(!d.aborted){if(!(h instanceof Response))return h;if(h.ok)return l==="json"?h.json():h.arrayBuffer();throw Error(`Failed to load model with error code ${h.status}`)}}).then(h=>{if(!d.aborted)return r.downloading--,r.parsing++,e.internal.loadingState=3,s.add(e,b=>d.aborted?Promise.resolve():l==="json"&&h.root?(this.preprocessTileset(h,i,e),e.children.push(h.root),n=h,t=!0,Promise.resolve()):this.invokeOnePlugin(m=>m.parseTile&&m.parseTile(h,b,l,i,d)))}).then(()=>{if(d.aborted)return;r.parsing--,r.loaded++,e.internal.loadingState=4,c.delete(e),o.setLoaded(e,!0);let h=this.getBytesUsed(e);if(o.getMemoryUsage(e)===0&&h>0&&o.isFull()){o.remove(e);return}o.setMemoryUsage(e,h),this.dispatchEvent({type:"needs-update"}),t&&this.dispatchEvent({type:"load-tileset",tileset:n,url:i}),e.engineData.scene&&this.dispatchEvent({type:"load-model",scene:e.engineData.scene,tile:e,url:i})}).catch(h=>{d.aborted||(h.name==="AbortError"?o.remove(e):(s.remove(e),a.remove(e),e.internal.loadingState===1?r.queued--:e.internal.loadingState===2?r.downloading--:e.internal.loadingState===3?r.parsing--:e.internal.loadingState===4&&r.loaded--,r.failed++,console.error(`TilesRenderer : Failed to load tile at url "${e.content.uri}".`),console.error(h),e.internal.loadingState=-1,c.delete(e),o.setLoaded(e,!0),this.dispatchEvent({type:"load-error",tile:e,error:h,url:i})))})}};function Qi(e){if(e===null||e.byteLength<4)return"";let t;if(t=e instanceof DataView?e:new DataView(e),String.fromCharCode(t.getUint8(0))==="{")return null;let n="";for(let i=0;i<4;i++)n+=String.fromCharCode(t.getUint8(i));return n}var _C=new TextDecoder;function Jg(e){return _C.decode(e)}function Ql(e){return e.replace(/[\\/][^\\/]+$/,"")+"/"}var Ko=class{constructor(){this.fetchOptions={},this.workingPath=""}loadAsync(e){return fetch(e,this.fetchOptions).then(t=>{if(!t.ok)throw Error(`Failed to load file "${e}" with status ${t.status} : ${t.statusText}`);return t.arrayBuffer()}).then(t=>(this.workingPath===""&&(this.workingPath=Ql(e)),this.parse(t)))}resolveExternalURL(e){return new URL(e,this.workingPath).href}parse(e){throw Error("LoaderBase: Parse not implemented.")}};function su(e,t,n,i,r,o){let a;switch(i){case"SCALAR":a=1;break;case"VEC2":a=2;break;case"VEC3":a=3;break;case"VEC4":a=4;break;default:throw Error(`FeatureTable : Feature type not provided for "${o}".`)}let s,c=n*a;switch(r){case"BYTE":s=new Int8Array(e,t,c);break;case"UNSIGNED_BYTE":s=new Uint8Array(e,t,c);break;case"SHORT":s=new Int16Array(e,t,c);break;case"UNSIGNED_SHORT":s=new Uint16Array(e,t,c);break;case"INT":s=new Int32Array(e,t,c);break;case"UNSIGNED_INT":s=new Uint32Array(e,t,c);break;case"FLOAT":s=new Float32Array(e,t,c);break;case"DOUBLE":s=new Float64Array(e,t,c);break;default:throw Error(`FeatureTable : Feature component type not provided for "${o}".`)}return s}var ls=class{constructor(e,t,n,i){this.buffer=e,this.binOffset=t+n,this.binLength=i;let r=null;if(n!==0){let o=new Uint8Array(e,t,n);r=JSON.parse(Jg(o))}else r={};this.header=r}getKeys(){return Object.keys(this.header).filter(e=>e!=="extensions")}getData(e,t,n=null,i=null){let r=this.header;if(!(e in r))return null;let o=r[e];if(!(o instanceof Object)||Array.isArray(o))return o;{let{buffer:a,binOffset:s,binLength:c}=this,l=o.byteOffset||0,u=o.type||i,d=o.componentType||n;if("type"in o&&i&&o.type!==i)throw Error("FeatureTable: Specified type does not match expected type.");let h=s+l,b=su(a,h,t,u,d,e);if(h+b.byteLength>s+c)throw Error("FeatureTable: Feature data read outside binary body length.");return b}}getBuffer(e,t){let{buffer:n,binOffset:i}=this;return n.slice(i+e,i+e+t)}},AC=class{constructor(e){this.batchTable=e;let t=e.header.extensions["3DTILES_batch_table_hierarchy"];this.classes=t.classes;for(let i of this.classes){let r=i.instances;for(let o in r)i.instances[o]=this._parseProperty(r[o],i.length,o)}if(this.instancesLength=t.instancesLength,this.classIds=this._parseProperty(t.classIds,this.instancesLength,"classIds"),t.parentCounts?this.parentCounts=this._parseProperty(t.parentCounts,this.instancesLength,"parentCounts"):this.parentCounts=Array(this.instancesLength).fill(1),t.parentIds){let i=this.parentCounts.reduce((r,o)=>r+o,0);this.parentIds=this._parseProperty(t.parentIds,i,"parentIds")}else this.parentIds=null;this.instancesIds=[];let n={};for(let i of this.classIds)n[i]=n[i]??0,this.instancesIds.push(n[i]),n[i]++}_parseProperty(e,t,n){if(Array.isArray(e))return e;{let{buffer:i,binOffset:r}=this.batchTable,o=e.byteOffset,a=e.componentType||"UNSIGNED_SHORT";return su(i,r+o,t,"SCALAR",a,n)}}getDataFromId(e,t={}){let n=this.parentCounts[e];if(this.parentIds&&n>0){let s=0;for(let c=0;c<e;c++)s+=this.parentCounts[c];for(let c=0;c<n;c++){let l=this.parentIds[s+c];l!==e&&this.getDataFromId(l,t)}}let i=this.classIds[e],r=this.classes[i].instances,o=this.classes[i].name,a=this.instancesIds[e];for(let s in r)t[o]=t[o]||{},t[o][s]=r[s][a];return t}},Jl=class extends ls{constructor(e,t,n,i,r){super(e,n,i,r),this.count=t,this.extensions={};let o=this.header.extensions;o&&o["3DTILES_batch_table_hierarchy"]&&(this.extensions["3DTILES_batch_table_hierarchy"]=new AC(this))}getDataFromId(e,t={}){if(e<0||e>=this.count)throw Error(`BatchTable: id value "${e}" out of bounds for "${this.count}" features number.`);for(let n of this.getKeys())t[n]=super.getData(n,this.count)[e];for(let n in this.extensions){let i=this.extensions[n];i.getDataFromId instanceof Function&&(t[n]=t[n]||{},i.getDataFromId(e,t[n]))}return t}getPropertyArray(e){return super.getData(e,this.count)}},lu=class extends Ko{parse(e){let t=new DataView(e),n=Qi(t);console.assert(n==="b3dm");let i=t.getUint32(4,!0);console.assert(i===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),c=t.getUint32(24,!0),l=new ls(e.slice(28,28+o+a),0,o,a),u=28+o+a,d=new Jl(e.slice(u,u+s+c),l.getData("BATCH_LENGTH"),0,s,c),h=u+s+c;return{version:i,featureTable:l,batchTable:d,glbBytes:new Uint8Array(e,h,r-h)}}},cu=class extends Ko{parse(e){let t=new DataView(e),n=Qi(t);console.assert(n==="i3dm");let i=t.getUint32(4,!0);console.assert(i===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),c=t.getUint32(24,!0),l=t.getUint32(28,!0),u=new ls(e.slice(32,32+o+a),0,o,a),d=32+o+a,h=new Jl(e.slice(d,d+s+c),u.getData("INSTANCES_LENGTH"),0,s,c),b=d+s+c,m=new Uint8Array(e,b,r-b),y=null,k=null,w=null;if(l)y=m,k=Promise.resolve();else{let p=this.resolveExternalURL(Jg(m));w=Ql(p),k=fetch(p,this.fetchOptions).then(g=>{if(!g.ok)throw Error(`I3DMLoaderBase : Failed to load file "${p}" with status ${g.status} : ${g.statusText}`);return g.arrayBuffer()}).then(g=>{y=new Uint8Array(g)})}return k.then(()=>({version:i,featureTable:u,batchTable:h,glbBytes:y,gltfWorkingPath:w}))}},du=class extends Ko{parse(e){let t=new DataView(e),n=Qi(t);console.assert(n==="pnts");let i=t.getUint32(4,!0);console.assert(i===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),c=t.getUint32(24,!0),l=new ls(e.slice(28,28+o+a),0,o,a),u=28+o+a,d=new Jl(e.slice(u,u+s+c),l.getData("BATCH_LENGTH")||l.getData("POINTS_LENGTH"),0,s,c);return Promise.resolve({version:i,featureTable:l,batchTable:d})}},uu=class extends Ko{parse(e){let t=new DataView(e),n=Qi(t);console.assert(n==="cmpt",'CMPTLoader: The magic bytes equal "cmpt".');let i=t.getUint32(4,!0);console.assert(i===1,'CMPTLoader: The version listed in the header is "1".');let r=t.getUint32(8,!0);console.assert(r===e.byteLength,"CMPTLoader: The contents buffer length listed in the header matches the file.");let o=t.getUint32(12,!0),a=[],s=16;for(let c=0;c<o;c++){let l=new DataView(e,s,12),u=Qi(l),d=l.getUint32(4,!0),h=l.getUint32(8,!0),b=new Uint8Array(e,s,h);a.push({type:u,buffer:b,version:d}),s+=h}return{version:i,tiles:a}}};import{Box3 as mb,BufferAttribute as Zi,BufferGeometry as EC,Clock as QE,Color as RC,DefaultLoadingManager as lc,Euler as LC,EventDispatcher as Zl,Frustum as BC,Group as wu,InstancedMesh as DC,LoadingManager as OC,MathUtils as gb,Matrix3 as NC,Matrix4 as rn,Mesh as JE,OrthographicCamera as ZE,PerspectiveCamera as eR,Plane as IC,PlaneGeometry as tR,Points as zC,PointsMaterial as FC,Quaternion as bb,Ray as Cu,Raycaster as nR,ShaderMaterial as rR,Sphere as fb,Spherical as jC,TextureUtils as UC,Vector2 as Su,Vector3 as Ae}from"three";import{GLTFLoader as Mu}from"three/addons/loaders/GLTFLoader.js";import{estimateBytesUsed as VC}from"three/addons/utils/BufferGeometryUtils.js";var Tu=class extends lu{constructor(e=lc){super(),this.manager=e,this.adjustmentTransform=new rn}parse(e){let t=super.parse(e),n=t.glbBytes.slice().buffer;return new Promise((i,r)=>{let o=this.manager,a=this.fetchOptions,s=o.getHandler("path.gltf")||new Mu(o);a.credentials==="include"&&a.mode==="cors"&&s.setCrossOrigin("use-credentials"),"credentials"in a&&s.setWithCredentials(a.credentials==="include"),a.headers&&s.setRequestHeader(a.headers);let c=this.workingPath;!/[\\/]$/.test(c)&&c.length&&(c+="/");let l=this.adjustmentTransform;s.parse(n,c,u=>{let{batchTable:d,featureTable:h}=t,{scene:b}=u,m=h.getData("RTC_CENTER",1,"FLOAT","VEC3");m&&(b.position.x+=m[0],b.position.y+=m[1],b.position.z+=m[2]),u.scene.updateMatrix(),u.scene.matrix.multiply(l),u.scene.matrix.decompose(u.scene.position,u.scene.quaternion,u.scene.scale),u.batchTable=d,u.featureTable=h,b.batchTable=d,b.featureTable=h,i(u)},r)})}};function GC(e){let t=e>>11,n=e>>5&63,i=e&31;return[Math.round(t/31*255),Math.round(n/63*255),Math.round(i/31*255)]}var cs=new Su;function HC(e,t,n=new Ae){cs.set(e,t).divideScalar(256).multiplyScalar(2).subScalar(1),n.set(cs.x,cs.y,1-Math.abs(cs.x)-Math.abs(cs.y));let i=gb.clamp(-n.z,0,1);return n.x>=0?n.setX(n.x-i):n.setX(n.x+i),n.y>=0?n.setY(n.y-i):n.setY(n.y+i),n.normalize(),n}var Zg={RGB:"color",POSITION:"position"},Pu=class extends du{constructor(e=lc){super(),this.manager=e}parse(e){return super.parse(e).then(async t=>{let{featureTable:n,batchTable:i}=t,r=new FC,o=n.header.extensions,a=new Ae,s;if(o&&o["3DTILES_draco_point_compression"]){let{byteOffset:u,byteLength:d,properties:h}=o["3DTILES_draco_point_compression"],b=this.manager.getHandler("draco.drc");if(b==null)throw Error("PNTSLoader: dracoLoader not available.");let m={};for(let w in h)if(w in Zg&&w in h){let p=Zg[w];m[p]=h[w]}let y={attributeIDs:m,attributeTypes:{position:"Float32Array",color:"Uint8Array"},useUniqueIDs:!0},k=n.getBuffer(u,d);s=await b.decodeGeometry(k,y),s.attributes.color&&(r.vertexColors=!0)}else{let u=n.getData("POINTS_LENGTH"),d=n.getData("POSITION",u,"FLOAT","VEC3"),h=n.getData("NORMAL",u,"FLOAT","VEC3"),b=n.getData("NORMAL",u,"UNSIGNED_BYTE","VEC2"),m=n.getData("RGB",u,"UNSIGNED_BYTE","VEC3"),y=n.getData("RGBA",u,"UNSIGNED_BYTE","VEC4"),k=n.getData("RGB565",u,"UNSIGNED_SHORT","SCALAR"),w=n.getData("CONSTANT_RGBA",u,"UNSIGNED_BYTE","VEC4"),p=n.getData("POSITION_QUANTIZED",u,"UNSIGNED_SHORT","VEC3"),g=n.getData("QUANTIZED_VOLUME_SCALE",u,"FLOAT","VEC3"),S=n.getData("QUANTIZED_VOLUME_OFFSET",u,"FLOAT","VEC3");if(s=new EC,p){let v=new Float32Array(u*3);for(let M=0;M<u;M++)for(let D=0;D<3;D++){let x=3*M+D;v[x]=p[x]/65535*g[D]}a.x=S[0],a.y=S[1],a.z=S[2],s.setAttribute("position",new Zi(v,3,!1))}else s.setAttribute("position",new Zi(d,3,!1));if(h!==null)s.setAttribute("normal",new Zi(h,3,!1));else if(b!==null){let v=new Float32Array(u*3),M=new Ae;for(let D=0;D<u;D++){let x=b[D*2],C=b[D*2+1],P=HC(x,C,M);v[D*3]=P.x,v[D*3+1]=P.y,v[D*3+2]=P.z}s.setAttribute("normal",new Zi(v,3,!1))}if(y!==null)s.setAttribute("color",new Zi(y,4,!0)),r.vertexColors=!0,r.transparent=!0,r.depthWrite=!1;else if(m!==null)s.setAttribute("color",new Zi(m,3,!0)),r.vertexColors=!0;else if(k!==null){let v=new Uint8Array(u*3);for(let M=0;M<u;M++){let D=GC(k[M]);for(let x=0;x<3;x++){let C=3*M+x;v[C]=D[x]}}s.setAttribute("color",new Zi(v,3,!0)),r.vertexColors=!0}else if(w!==null){r.color=new RC(w[0],w[1],w[2]);let v=w[3]/255;v<1&&(r.opacity=v,r.transparent=!0,r.depthWrite=!1)}}let c=new zC(s,r);c.position.copy(a),t.scene=c,t.scene.featureTable=n,t.scene.batchTable=i;let l=n.getData("RTC_CENTER",1,"FLOAT","VEC3");return l&&(t.scene.position.x+=l[0],t.scene.position.y+=l[1],t.scene.position.z+=l[2]),t})}};function WC(e){let{x:t,y:n,z:i}=e;e.x=i,e.y=t,e.z=n}function $C(e){return-e+Math.PI/2}var eb=new jC,si=new Ae,Cn=new Ae,pu=new Ae,Xn=new rn,Sr=new rn,hu=new fb,Rn=new LC,tb=new Ae,nb=new Ae,rb=new Ae,ds=new Ae,ec=new Cu,XC=1e-12,qC=.1;var ku=class{constructor(e=1,t=1,n=1){this.name="",this.radius=new Ae(e,t,n)}intersectRay(e,t){return Xn.makeScale(...this.radius).invert(),hu.center.set(0,0,0),hu.radius=1,ec.copy(e).applyMatrix4(Xn),ec.intersectSphere(hu,t)?(Xn.makeScale(...this.radius),t.applyMatrix4(Xn),t):null}getEastNorthUpFrame(e,t,n,i){return n.isMatrix4&&(i=n,n=0,console.warn('Ellipsoid: The signature for "getEastNorthUpFrame" has changed.')),this.getEastNorthUpAxes(e,t,tb,nb,rb),this.getCartographicToPosition(e,t,n,ds),i.makeBasis(tb,nb,rb).setPosition(ds)}getOrientedEastNorthUpFrame(e,t,n,i,r,o,a){return this.getObjectFrame(e,t,n,i,r,o,a,0)}getObjectFrame(e,t,n,i,r,o,a,s=2){return this.getEastNorthUpFrame(e,t,n,Xn),Rn.set(r,o,-i,"ZXY"),a.makeRotationFromEuler(Rn).premultiply(Xn),s===1?(Rn.set(Math.PI/2,0,0,"XYZ"),Sr.makeRotationFromEuler(Rn),a.multiply(Sr)):s===2&&(Rn.set(-Math.PI/2,0,Math.PI,"XYZ"),Sr.makeRotationFromEuler(Rn),a.multiply(Sr)),a}getCartographicFromObjectFrame(e,t,n=2){return n===1?(Rn.set(-Math.PI/2,0,0,"XYZ"),Sr.makeRotationFromEuler(Rn).premultiply(e)):n===2?(Rn.set(-Math.PI/2,0,Math.PI,"XYZ"),Sr.makeRotationFromEuler(Rn).premultiply(e)):Sr.copy(e),ds.setFromMatrixPosition(Sr),this.getPositionToCartographic(ds,t),this.getEastNorthUpFrame(t.lat,t.lon,0,Xn).invert(),Sr.premultiply(Xn),Rn.setFromRotationMatrix(Sr,"ZXY"),t.azimuth=-Rn.z,t.elevation=Rn.x,t.roll=Rn.y,t}getEastNorthUpAxes(e,t,n,i,r,o=ds){this.getCartographicToPosition(e,t,0,o),this.getCartographicToNormal(e,t,r),n.set(-o.y,o.x,0).normalize(),i.crossVectors(r,n).normalize()}getCartographicToPosition(e,t,n,i){this.getCartographicToNormal(e,t,si);let r=this.radius;Cn.copy(si),Cn.x*=r.x**2,Cn.y*=r.y**2,Cn.z*=r.z**2;let o=Math.sqrt(si.dot(Cn));return Cn.divideScalar(o),i.copy(Cn).addScaledVector(si,n)}getPositionToCartographic(e,t){this.getPositionToSurfacePoint(e,Cn),this.getPositionToNormal(Cn,si);let n=pu.subVectors(e,Cn);return t.lon=Math.atan2(si.y,si.x),t.lat=Math.asin(si.z),t.height=Math.sign(n.dot(e))*n.length(),t}getCartographicToNormal(e,t,n){return eb.set(1,$C(e),t),n.setFromSpherical(eb).normalize(),WC(n),n}getPositionToNormal(e,t){let n=this.radius;return t.copy(e),t.x/=n.x**2,t.y/=n.y**2,t.z/=n.z**2,t.normalize(),t}getPositionToSurfacePoint(e,t){let n=this.radius,i=1/n.x**2,r=1/n.y**2,o=1/n.z**2,a=e.x*e.x*i,s=e.y*e.y*r,c=e.z*e.z*o,l=a+s+c,u=Math.sqrt(1/l),d=Cn.copy(e).multiplyScalar(u);if(l<qC)return isFinite(u)?t.copy(d):null;let h=pu.set(d.x*i*2,d.y*r*2,d.z*o*2),b=(1-u)*e.length()/(.5*h.length()),m=0,y,k,w,p,g,S,v,M,D,x,C;do{b-=m,w=1/(1+b*i),p=1/(1+b*r),g=1/(1+b*o),S=w*w,v=p*p,M=g*g,D=S*w,x=v*p,C=M*g,y=a*S+s*v+c*M-1,k=a*D*i+s*x*r+c*C*o;let P=-2*k;m=y/P}while(Math.abs(y)>XC);return t.set(e.x*w,e.y*p,e.z*g)}calculateHorizonDistance(e,t){let n=this.calculateEffectiveRadius(e);return Math.sqrt(2*n*t+t**2)}calculateEffectiveRadius(e){let t=this.radius.x,n=1-this.radius.z**2/t**2,i=e*gb.DEG2RAD,r=Math.sin(i)**2;return t/Math.sqrt(1-n*r)}getPositionElevation(e){this.getPositionToSurfacePoint(e,Cn);let t=pu.subVectors(e,Cn);return Math.sign(t.dot(e))*t.length()}closestPointToRayEstimate(e,t){return this.intersectRay(e,t)?t:(Xn.makeScale(...this.radius).invert(),ec.copy(e).applyMatrix4(Xn),Cn.set(0,0,0),ec.closestPointToPoint(Cn,t).normalize(),Xn.makeScale(...this.radius),t.applyMatrix4(Xn))}copy(e){return this.radius.copy(e.radius),this}clone(){return new this.constructor().copy(this)}},gs=new ku(Ji,Ji,iu);gs.name="WGS84 Earth";var tc=new Ae,Qo=new Ae,Jo=new Ae,mu=new Ae,nc=new bb,rc=new Ae,Zo=new rn,ib=new rn,ob=new Ae,ab=new rn,gu=new bb,bu={};function sb(e,t,n,i){if(e=e/n*2-1,t=t/n*2-1,i.x=e,i.y=t,i.z=1-Math.abs(e)-Math.abs(t),i.z<0){let r=i.x;i.x=(1-Math.abs(i.y))*(r>=0?1:-1),i.y=(1-Math.abs(r))*(i.y>=0?1:-1)}return i.normalize(),i}var _u=class extends cu{constructor(e=lc){super(),this.manager=e,this.adjustmentTransform=new rn,this.ellipsoid=gs.clone()}resolveExternalURL(e){return this.manager.resolveURL(super.resolveExternalURL(e))}parse(e){return super.parse(e).then(t=>{let{featureTable:n,batchTable:i}=t,r=t.glbBytes.slice().buffer;return new Promise((o,a)=>{let s=this.fetchOptions,c=this.manager,l=c.getHandler("path.gltf")||new Mu(c);s.credentials==="include"&&s.mode==="cors"&&l.setCrossOrigin("use-credentials"),"credentials"in s&&l.setWithCredentials(s.credentials==="include"),s.headers&&l.setRequestHeader(s.headers);let u=t.gltfWorkingPath??this.workingPath;/[\\/]$/.test(u)||(u+="/");let d=this.adjustmentTransform;l.parse(r,u,h=>{let b=n.getData("INSTANCES_LENGTH"),m=n.getData("POSITION",b,"FLOAT","VEC3"),y=n.getData("POSITION_QUANTIZED",b,"UNSIGNED_SHORT","VEC3"),k=n.getData("QUANTIZED_VOLUME_OFFSET",1,"FLOAT","VEC3"),w=n.getData("QUANTIZED_VOLUME_SCALE",1,"FLOAT","VEC3"),p=n.getData("NORMAL_UP",b,"FLOAT","VEC3"),g=n.getData("NORMAL_RIGHT",b,"FLOAT","VEC3"),S=n.getData("NORMAL_UP_OCT32P",b,"UNSIGNED_SHORT","VEC2"),v=n.getData("NORMAL_RIGHT_OCT32P",b,"UNSIGNED_SHORT","VEC2"),M=n.getData("SCALE_NON_UNIFORM",b,"FLOAT","VEC3"),D=n.getData("SCALE",b,"FLOAT","SCALAR"),x=n.getData("RTC_CENTER",1,"FLOAT","VEC3"),C=n.getData("EAST_NORTH_UP");if(!m&&y){m=new Float32Array(b*3);for(let L=0;L<b;L++)m[L*3+0]=k[0]+y[L*3+0]/65535*w[0],m[L*3+1]=k[1]+y[L*3+1]/65535*w[1],m[L*3+2]=k[2]+y[L*3+2]/65535*w[2]}let P=new Ae;for(let L=0;L<b;L++)P.x+=m[L*3+0]/b,P.y+=m[L*3+1]/b,P.z+=m[L*3+2]/b;let _=[],z=[];h.scene.updateMatrixWorld(),h.scene.traverse(L=>{if(L.isMesh){z.push(L);let{geometry:I,material:N}=L,R=new DC(I,N,b);R.position.copy(P),x&&(R.position.x+=x[0],R.position.y+=x[1],R.position.z+=x[2]),_.push(R)}});for(let L=0;L<b;L++){mu.set(m[L*3+0]-P.x,m[L*3+1]-P.y,m[L*3+2]-P.z),nc.identity(),p&&g?(Qo.set(p[L*3+0],p[L*3+1],p[L*3+2]),Jo.set(g[L*3+0],g[L*3+1],g[L*3+2]),tc.crossVectors(Jo,Qo).normalize(),Zo.makeBasis(Jo,Qo,tc),nc.setFromRotationMatrix(Zo)):S&&v&&(sb(S[L*2+0],S[L*2+1],65535,Qo),sb(v[L*2+0],v[L*2+1],65535,Jo),tc.crossVectors(Jo,Qo).normalize(),Zo.makeBasis(Jo,Qo,tc),nc.setFromRotationMatrix(Zo)),rc.set(1,1,1),M&&rc.set(M[L*3+0],M[L*3+1],M[L*3+2]),D&&rc.multiplyScalar(D[L]);for(let I=0,N=_.length;I<N;I++){let R=_[I];gu.copy(nc),C&&(R.updateMatrixWorld(),ob.copy(mu).applyMatrix4(R.matrixWorld),this.ellipsoid.getPositionToCartographic(ob,bu),this.ellipsoid.getEastNorthUpFrame(bu.lat,bu.lon,ab),gu.setFromRotationMatrix(ab)),Zo.compose(mu,gu,rc).multiply(d);let F=z[I];ib.multiplyMatrices(Zo,F.matrixWorld),R.setMatrixAt(L,ib)}}h.scene.clear(),h.scene.add(..._),h.batchTable=i,h.featureTable=n,h.scene.batchTable=i,h.scene.featureTable=n,o(h)},a)})})}},xb=class extends uu{constructor(e=lc){super(),this.manager=e,this.adjustmentTransform=new rn,this.ellipsoid=gs.clone()}parse(e){let t=super.parse(e),{manager:n,ellipsoid:i,adjustmentTransform:r}=this,o=[];for(let a in t.tiles){let{type:s,buffer:c}=t.tiles[a];switch(s){case"b3dm":{let l=c.slice(),u=new Tu(n);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions,u.adjustmentTransform.copy(r);let d=u.parse(l.buffer);o.push(d);break}case"pnts":{let l=c.slice(),u=new Pu(n);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions;let d=u.parse(l.buffer);o.push(d);break}case"i3dm":{let l=c.slice(),u=new _u(n);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions,u.ellipsoid.copy(i),u.adjustmentTransform.copy(r);let d=u.parse(l.buffer);o.push(d);break}}}return Promise.all(o).then(a=>{let s=new wu;return a.forEach(c=>{s.add(c.scene)}),{tiles:a,scene:s}})}},us=new rn,YC=class extends wu{constructor(e){super(),this.isTilesGroup=!0,this.name="TilesRenderer.TilesGroup",this.tilesRenderer=e,this.matrixWorldInverse=new rn}raycast(e,t){return this.tilesRenderer.raycast(e,t),!1}updateMatrixWorld(e){if(this.matrixAutoUpdate&&this.updateMatrix(),this.matrixWorldNeedsUpdate||e){this.parent===null?us.copy(this.matrix):us.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1;let t=us.elements,n=this.matrixWorld.elements,i=!1;for(let r=0;r<16;r++){let o=t[r],a=n[r];if(Math.abs(o-a)>2**-52){i=!0;break}}if(i){this.matrixWorld.copy(us),this.matrixWorldInverse.copy(us).invert();let r=this.children;for(let c=0,l=r.length;c<l;c++)r[c].updateMatrixWorld();let{tilesRenderer:o}=this,{activeTiles:a,visibleTiles:s}=o;a.forEach(c=>{s.has(c)||c.engineData.scene.updateMatrixWorld(!0)})}}}updateWorldMatrix(e,t){this.parent&&e&&this.parent.updateWorldMatrix(e,!1),this.updateMatrixWorld(!0)}},KC=new Cu;function QC(e,t,n,i){let{scene:r}=e.engineData;n.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(e,r,t,i))||t.intersectObject(r,!0,i)}function JC(e){return"traversal"in e}function yb(e,t,n,i,r=null){if(!JC(t))return;let{group:o,activeTiles:a}=e,{boundingVolume:s}=t.engineData;if(r===null&&(r=KC,r.copy(n.ray).applyMatrix4(o.matrixWorldInverse)),!t.traversal.used||!s.intersectsRay(r))return;a.has(t)&&QC(t,n,e,i);let c=t.children;for(let l=0,u=c.length;l<u;l++)yb(e,c[l],n,i,r)}var ic=new Ae,oc=new Ae,Ln=new Ae,ac=new Cu,yu=class{constructor(e=new mb,t=new rn){this.box=e.clone(),this.transform=t.clone(),this.inverseTransform=new rn,this.points=Array(8).fill().map(()=>new Ae),this.planes=[,,,,,,].fill().map(()=>new IC)}copy(e){return this.box.copy(e.box),this.transform.copy(e.transform),this.update(),this}clone(){return new this.constructor().copy(this)}clampPoint(e,t){return t.copy(e).applyMatrix4(this.inverseTransform).clamp(this.box.min,this.box.max).applyMatrix4(this.transform)}distanceToPoint(e){return this.clampPoint(e,Ln).distanceTo(e)}containsPoint(e){return Ln.copy(e).applyMatrix4(this.inverseTransform),this.box.containsPoint(Ln)}intersectsRay(e){return ac.copy(e).applyMatrix4(this.inverseTransform),ac.intersectsBox(this.box)}intersectRay(e,t){return ac.copy(e).applyMatrix4(this.inverseTransform),ac.intersectBox(this.box,t)?(t.applyMatrix4(this.transform),t):null}update(){let{points:e,inverseTransform:t,transform:n,box:i}=this;t.copy(n).invert();let{min:r,max:o}=i,a=0;for(let s=-1;s<=1;s+=2)for(let c=-1;c<=1;c+=2)for(let l=-1;l<=1;l+=2)e[a].set(s<0?r.x:o.x,c<0?r.y:o.y,l<0?r.z:o.z).applyMatrix4(n),a++;this.updatePlanes()}updatePlanes(){ic.copy(this.box.min).applyMatrix4(this.transform),oc.copy(this.box.max).applyMatrix4(this.transform),Ln.set(0,0,1).transformDirection(this.transform),this.planes[0].setFromNormalAndCoplanarPoint(Ln,ic),this.planes[1].setFromNormalAndCoplanarPoint(Ln,oc).negate(),Ln.set(0,1,0).transformDirection(this.transform),this.planes[2].setFromNormalAndCoplanarPoint(Ln,ic),this.planes[3].setFromNormalAndCoplanarPoint(Ln,oc).negate(),Ln.set(1,0,0).transformDirection(this.transform),this.planes[4].setFromNormalAndCoplanarPoint(Ln,ic),this.planes[5].setFromNormalAndCoplanarPoint(Ln,oc).negate()}intersectsSphere(e){return this.clampPoint(e.center,Ln),Ln.distanceToSquared(e.center)<=e.radius*e.radius}intersectsFrustum(e){return this._intersectsPlaneShape(e.planes,e.points)}intersectsOBB(e){return this._intersectsPlaneShape(e.planes,e.points)}_intersectsPlaneShape(e,t){let n=this.points,i=this.planes;for(let r=0;r<6;r++){let o=e[r],a=-1/0;for(let s=0;s<8;s++){let c=n[s],l=o.distanceToPoint(c);a=a<l?l:a}if(a<0)return!1}for(let r=0;r<6;r++){let o=i[r],a=-1/0;for(let s=0;s<8;s++){let c=t[s],l=o.distanceToPoint(c);a=a<l?l:a}if(a<0)return!1}return!0}},ms=Math.PI,fu=ms/2,ps=new Ae,eo=new Ae,lr=new Ae,me=new Ae,Sn=new rn,ZC=new mb,lb=new rn;function li(e,t){t.radius=Math.max(t.radius,e.distanceToSquared(t.center))}function cb(e){return e.x!==e.y}var vb=class extends ku{constructor(e=1,t=1,n=1,i=-fu,r=fu,o=0,a=2*ms,s=0,c=0){super(e,t,n),this.latStart=i,this.latEnd=r,this.lonStart=o,this.lonEnd=a,this.heightStart=s,this.heightEnd=c}getBoundingBox(e,t){cb(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported.");let{latStart:n,latEnd:i,lonStart:r,lonEnd:o,heightStart:a,heightEnd:s}=this,c=(n+i)*.5,l=(r+o)*.5,u=n>0,d=i<0,h;h=u?n:d?i:0;let{min:b,max:m}=e;b.setScalar(1/0),m.setScalar(-1/0),o-r<=ms?(this.getCartographicToNormal(c,l,lr),eo.set(0,0,1),ps.crossVectors(eo,lr).normalize(),eo.crossVectors(lr,ps).normalize(),t.makeBasis(ps,eo,lr),Sn.copy(t).invert(),this.getCartographicToPosition(h,r,s,me).applyMatrix4(Sn),m.x=Math.abs(me.x),b.x=-m.x,this.getCartographicToPosition(i,r,s,me).applyMatrix4(Sn),m.y=me.y,this.getCartographicToPosition(i,l,s,me).applyMatrix4(Sn),m.y=Math.max(me.y,m.y),this.getCartographicToPosition(n,r,s,me).applyMatrix4(Sn),b.y=me.y,this.getCartographicToPosition(n,l,s,me).applyMatrix4(Sn),b.y=Math.min(me.y,b.y),this.getCartographicToPosition(c,l,s,me).applyMatrix4(Sn),m.z=me.z,this.getCartographicToPosition(n,r,a,me).applyMatrix4(Sn),b.z=me.z,this.getCartographicToPosition(i,r,a,me).applyMatrix4(Sn),b.z=Math.min(me.z,b.z)):(this.getCartographicToPosition(h,l,s,lr),lr.z=0,lr.length()<1e-10?lr.set(1,0,0):lr.normalize(),eo.set(0,0,1),ps.crossVectors(lr,eo).normalize(),t.makeBasis(ps,eo,lr),Sn.copy(t).invert(),this.getCartographicToPosition(h,l+fu,s,me).applyMatrix4(Sn),m.x=Math.abs(me.x),b.x=-m.x,this.getCartographicToPosition(i,0,d?a:s,me).applyMatrix4(Sn),m.y=me.y,this.getCartographicToPosition(n,0,u?a:s,me).applyMatrix4(Sn),b.y=me.y,this.getCartographicToPosition(h,l,s,me).applyMatrix4(Sn),m.z=me.z,this.getCartographicToPosition(h,o,s,me).applyMatrix4(Sn),b.z=me.z),e.getCenter(me),e.min.sub(me).multiplyScalar(1.0000000000001),e.max.sub(me).multiplyScalar(1.0000000000001),me.applyMatrix4(t),t.setPosition(me)}getBoundingSphere(e){cb(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported."),this.getBoundingBox(ZC,lb),e.center.setFromMatrixPosition(lb),e.radius=0;let{latStart:t,latEnd:n,lonStart:i,lonEnd:r,heightStart:o,heightEnd:a}=this,s=(t+n)*.5,c=(i+r)*.5,l=t>0,u=n<0,d;d=l?t:u?n:0,this.getCartographicToPosition(d,i,a,me),li(me,e),this.getCartographicToPosition(n,i,a,me),li(me,e),this.getCartographicToPosition(n,c,a,me),li(me,e),this.getCartographicToPosition(t,i,a,me),li(me,e),this.getCartographicToPosition(t,c,a,me),li(me,e),this.getCartographicToPosition(s,c,a,me),li(me,e),this.getCartographicToPosition(t,i,o,me),li(me,e),r-i>ms&&(this.getCartographicToPosition(d,c+ms,a,me),li(me,e)),e.radius=Math.sqrt(e.radius)*1.0000000000001}},Gr=new Ae,Hr=new Ae,Wr=new Ae,db=new Ae,ub=new Ae,eS=class{constructor(){this.sphere=null,this.obb=null,this.region=null,this.regionObb=null}intersectsRay(e){let t=this.sphere,n=this.obb||this.regionObb;return!(t&&!e.intersectsSphere(t)||n&&!n.intersectsRay(e))}intersectRay(e,t=null){let n=this.sphere,i=this.obb||this.regionObb,r=-1/0,o=-1/0;n&&e.intersectSphere(n,db)&&(r=n.containsPoint(e.origin)?0:e.origin.distanceToSquared(db)),i&&i.intersectRay(e,ub)&&(o=i.containsPoint(e.origin)?0:e.origin.distanceToSquared(ub));let a=Math.max(r,o);return a===-1/0?null:(e.at(Math.sqrt(a),t),t)}distanceToPoint(e){let t=this.sphere,n=this.obb||this.regionObb,i=-1/0,r=-1/0;return t&&(i=Math.max(t.distanceToPoint(e),0)),n&&(r=n.distanceToPoint(e)),i>r?i:r}intersectsFrustum(e){let t=this.obb||this.regionObb,n=this.sphere;return n&&!e.intersectsSphere(n)||t&&!t.intersectsFrustum(e)?!1:!!(n||t)}intersectsSphere(e){let t=this.obb||this.regionObb,n=this.sphere;return n&&!n.intersectsSphere(e)||t&&!t.intersectsSphere(e)?!1:!!(n||t)}intersectsOBB(e){let t=this.obb||this.regionObb,n=this.sphere;return n&&!e.intersectsSphere(n)||t&&!t.intersectsOBB(e)?!1:!!(n||t)}getOBB(e,t){let n=this.obb||this.regionObb;n?(e.copy(n.box),t.copy(n.transform)):(this.getAABB(e),t.identity())}getAABB(e){if(this.sphere)this.sphere.getBoundingBox(e);else{let t=this.obb||this.regionObb;e.copy(t.box).applyMatrix4(t.transform)}}getSphere(e){if(this.sphere)e.copy(this.sphere);else if(this.region)this.region.getBoundingSphere(e);else{let t=this.obb||this.regionObb;t.box.getBoundingSphere(e),e.applyMatrix4(t.transform)}}setObbData(e,t){let n=new yu;Gr.set(e[3],e[4],e[5]),Hr.set(e[6],e[7],e[8]),Wr.set(e[9],e[10],e[11]);let i=Gr.length(),r=Hr.length(),o=Wr.length();Gr.normalize(),Hr.normalize(),Wr.normalize(),i===0&&Gr.crossVectors(Hr,Wr),r===0&&Hr.crossVectors(Gr,Wr),o===0&&Wr.crossVectors(Gr,Hr),n.transform.set(Gr.x,Hr.x,Wr.x,e[0],Gr.y,Hr.y,Wr.y,e[1],Gr.z,Hr.z,Wr.z,e[2],0,0,0,1).premultiply(t),n.box.min.set(-i,-r,-o),n.box.max.set(i,r,o),n.update(),this.obb=n}setSphereData(e,t,n,i,r){let o=new fb;o.center.set(e,t,n),o.radius=i,o.applyMatrix4(r),this.sphere=o}setRegionData(e,t,n,i,r,o,a){let s=new vb(...e.radius,n,r,t,i,o,a),c=new yu;s.getBoundingBox(c.box,c.transform),c.update(),this.region=s,this.regionObb=c}},tS=new NC;function nS(e,t,n,i){let r=tS.set(e.normal.x,e.normal.y,e.normal.z,t.normal.x,t.normal.y,t.normal.z,n.normal.x,n.normal.y,n.normal.z);return i.set(-e.constant,-t.constant,-n.constant),i.applyMatrix3(r.invert()),i}var rS=class extends BC{constructor(){super(),this.points=Array(8).fill().map(()=>new Ae)}setFromProjectionMatrix(...e){return super.setFromProjectionMatrix(...e),this.calculateFrustumPoints(),this}calculateFrustumPoints(){let{planes:e,points:t}=this;[[e[0],e[3],e[4]],[e[1],e[3],e[4]],[e[0],e[2],e[4]],[e[1],e[2],e[4]],[e[0],e[3],e[5]],[e[1],e[3],e[5]],[e[0],e[2],e[5]],[e[1],e[2],e[5]]].forEach((n,i)=>{nS(n[0],n[1],n[2],t[i])})}};var vu=0;function pb(e,t,n,i){try{return UC.getByteLength(e,t,n,i)}catch{return vu}}function iS(e){if(!e)return 0;if(e.isExternalTexture)return e.userData?.byteLength??vu;let{format:t,type:n,image:i,mipmaps:r}=e;if(e.isCompressedTexture&&Array.isArray(r)&&r.length>0){let a=0;for(let s of r)s?.data?.byteLength?a+=s.data.byteLength:a+=pb(s.width,s.height,t,n);return a}if(!i)return vu;let o=pb(i.width,i.height,t,n);return o*=e.generateMipmaps?4/3:1,o}function oS(e){let t=new Set,n=0;return e.traverse(i=>{if(i.geometry&&!t.has(i.geometry)&&(n+=VC(i.geometry),t.add(i.geometry)),i.material){let r=i.material;for(let o in r){let a=r[o];a&&a.isTexture&&!t.has(a)&&(n+=iS(a),t.add(a))}}}),n}var wb=Symbol("INITIAL_FRUSTUM_CULLED"),sc=new rn,hs=new Ae,xu=new Su,aS=new Ae(1,0,0),sS=new Ae(0,1,0),lS=()=>null;function hb(e,t){e.traverse(n=>{n.frustumCulled=n[wb]&&t})}var Au=class extends au{get autoDisableRendererCulling(){return this._autoDisableRendererCulling}set autoDisableRendererCulling(e){this._autoDisableRendererCulling!==e&&(super._autoDisableRendererCulling=e,this.forEachLoadedModel(t=>{hb(t,!e)}))}constructor(...e){super(...e),this.accelerateRaycast=!0,this.group=new YC(this),this.ellipsoid=gs.clone(),this.cameras=[],this.cameraMap=new Map,this.cameraInfo=[],this._upRotationMatrix=new rn,this._bytesUsed=new WeakMap,this._autoDisableRendererCulling=!0,this.manager=new OC,this._listeners={}}addEventListener(e,t){Zl.prototype.addEventListener.call(this,e,t)}hasEventListener(e,t){return Zl.prototype.hasEventListener.call(this,e,t)}removeEventListener(e,t){Zl.prototype.removeEventListener.call(this,e,t)}dispatchEvent(e){Zl.prototype.dispatchEvent.call(this,e)}getBoundingBox(e){if(!this.root)return!1;let t=this.root.engineData.boundingVolume;return t?(t.getAABB(e),!0):!1}getOrientedBoundingBox(e,t){if(!this.root)return!1;let n=this.root.engineData.boundingVolume;return n?(n.getOBB(e,t),!0):!1}getBoundingSphere(e){if(!this.root)return!1;let t=this.root.engineData.boundingVolume;return t?(t.getSphere(e),!0):!1}forEachLoadedModel(e){this.traverse(t=>{let n=t.engineData&&t.engineData.scene;n&&e(n,t)},null,!1)}raycast(e,t){if(this.root)if(this.accelerateRaycast)yb(this,this.root,e,t);else{let n=e.firstHitOnly?[]:t;for(let i of this.activeTiles){let{scene:r}=i.engineData;this.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(i,r,e,n))||e.intersectObject(r,!0,n)}e.firstHitOnly&&n.length>0&&(n.sort((i,r)=>i.distance-r.distance),t.push(n[0]))}}hasCamera(e){return this.cameraMap.has(e)}setCamera(e){let t=this.cameras,n=this.cameraMap;return n.has(e)?!1:(n.set(e,new Su),t.push(e),this.dispatchEvent({type:"add-camera",camera:e}),!0)}setResolution(e,t,n){let i=this.cameraMap;if(!i.has(e))return!1;let r=t.isVector2?t.x:t,o=t.isVector2?t.y:n,a=i.get(e);return(a.width!==r||a.height!==o)&&(a.set(r,o),this.dispatchEvent({type:"camera-resolution-change"})),!0}getResolution(e,t){let n=this.cameraMap.get(e);return n?t.copy(n):null}setResolutionFromRenderer(e,t){return t.getSize(xu),this.setResolution(e,xu.x,xu.y)}deleteCamera(e){let t=this.cameras,n=this.cameraMap;if(n.has(e)){let i=t.indexOf(e);return t.splice(i,1),n.delete(e),this.dispatchEvent({type:"delete-camera",camera:e}),!0}return!1}loadRootTileset(...e){return super.loadRootTileset(...e).then(t=>{let{asset:n,extensions:i={}}=t;switch((n&&n.gltfUpAxis||"y").toLowerCase()){case"x":this._upRotationMatrix.makeRotationAxis(sS,-Math.PI/2);break;case"y":this._upRotationMatrix.makeRotationAxis(aS,Math.PI/2);break}if("3DTILES_ellipsoid"in i){let r=i["3DTILES_ellipsoid"],{ellipsoid:o}=this;o.name=r.body,r.radii?o.radius.set(...r.radii):o.radius.set(1,1,1)}return t})}prepareForTraversal(){let e=this.group,t=this.cameras,n=this.cameraMap,i=this.cameraInfo;for(;i.length>t.length;)i.pop();for(;i.length<t.length;)i.push({frustum:new rS,isOrthographic:!1,sseDenominator:-1,position:new Ae,invScale:-1,pixelSize:0});hs.setFromMatrixScale(e.matrixWorldInverse),Math.abs(Math.max(hs.x-hs.y,hs.x-hs.z))>1e-6&&console.warn("ThreeTilesRenderer : Non uniform scale used for tile which may cause issues when calculating screen space error.");for(let r=0,o=i.length;r<o;r++){let a=t[r],s=i[r],c=s.frustum,l=s.position,u=n.get(a);(u.width===0||u.height===0)&&console.warn("TilesRenderer: resolution for camera error calculation is not set.");let d=a.projectionMatrix.elements;if(s.isOrthographic=d[15]===1,s.isOrthographic){let h=2/d[0],b=2/d[5];s.pixelSize=Math.max(b/u.height,h/u.width)}else s.sseDenominator=2/d[5]/u.height;sc.copy(e.matrixWorld),sc.premultiply(a.matrixWorldInverse),sc.premultiply(a.projectionMatrix),c.setFromProjectionMatrix(sc,a.coordinateSystem,a.reversedDepth),l.set(0,0,0),l.applyMatrix4(a.matrixWorld),l.applyMatrix4(e.matrixWorldInverse)}}update(){if(super.update(),this.cameras.length===0&&this.root){let e=!1;this.invokeAllPlugins(t=>e||(e=!!(t!==this&&t.calculateTileViewError))),e===!1&&console.warn("TilesRenderer: no cameras defined. Cannot update 3d tiles.")}}preprocessNode(e,t,n=null){super.preprocessNode(e,t,n);let i=new rn;if(e.transform){let a=e.transform;for(let s=0;s<16;s++)i.elements[s]=a[s]}n&&i.premultiply(n.engineData.transform);let r=new rn().copy(i).invert(),o=new eS;"sphere"in e.boundingVolume&&o.setSphereData(...e.boundingVolume.sphere,i),"box"in e.boundingVolume&&o.setObbData(e.boundingVolume.box,i),"region"in e.boundingVolume&&o.setRegionData(this.ellipsoid,...e.boundingVolume.region),e.engineData.transform=i,e.engineData.transformInverse=r,e.engineData.boundingVolume=o,e.engineData.geometry=null,e.engineData.materials=null,e.engineData.textures=null,e.toJSON=lS}async parseTile(e,t,n,i,r){let o=t.engineData,a=Ql(i),s=this.fetchOptions,c=this.manager,l=null,u=o.transform,d=this._upRotationMatrix,h=(Qi(e)||n).toLowerCase();switch(h){case"b3dm":{let g=new Tu(c);g.workingPath=a,g.fetchOptions=s,g.adjustmentTransform.copy(d),l=g.parse(e);break}case"pnts":{let g=new Pu(c);g.workingPath=a,g.fetchOptions=s,l=g.parse(e);break}case"i3dm":{let g=new _u(c);g.workingPath=a,g.fetchOptions=s,g.adjustmentTransform.copy(d),g.ellipsoid.copy(this.ellipsoid),l=g.parse(e);break}case"cmpt":{let g=new xb(c);g.workingPath=a,g.fetchOptions=s,g.adjustmentTransform.copy(d),g.ellipsoid.copy(this.ellipsoid),l=g.parse(e).then(S=>S.scene);break}case"gltf":case"glb":{let g=c.getHandler("path.gltf")||c.getHandler("path.glb")||new Mu(c);g.setWithCredentials(s.credentials==="include"),g.setRequestHeader(s.headers||{}),s.credentials==="include"&&s.mode==="cors"&&g.setCrossOrigin("use-credentials");let S=g.resourcePath||g.path||a;!/[\\/]$/.test(S)&&S.length&&(S+="/"),l=g.parseAsync(e,S).then(v=>{v.scene=v.scene||new wu;let{scene:M}=v;return M.updateMatrix(),M.matrix.multiply(d).decompose(M.position,M.quaternion,M.scale),v});break}default:l=this.invokeOnePlugin(g=>g.parseToMesh&&g.parseToMesh(e,t,n,i,r));break}let b=await l;if(b===null)throw Error(`TilesRenderer: Content type "${h}" not supported.`);let m,y;b.isObject3D?(m=b,y=null):(m=b.scene,y=b),m.updateMatrix(),m.matrix.premultiply(u),m.matrix.decompose(m.position,m.quaternion,m.scale),await this.invokeAllPlugins(g=>g.processTileModel&&g.processTileModel(m,t)),m.traverse(g=>{g[wb]=g.frustumCulled,g.userData.tile=t}),hb(m,!this.autoDisableRendererCulling);let k=[],w=[],p=[];if(m.traverse(g=>{if(g.geometry&&w.push(g.geometry),g.material){let S=g.material;k.push(g.material);for(let v in S){let M=S[v];M&&M.isTexture&&p.push(M)}}}),r.aborted){for(let g=0,S=p.length;g<S;g++){let v=p[g];v.image instanceof ImageBitmap&&v.image.close(),v.dispose()}return}o.materials=k,o.geometry=w,o.textures=p,o.scene=m,o.metadata=y}disposeTile(e){super.disposeTile(e);let t=e.engineData;if(t.scene){let n=t.materials,i=t.geometry,r=t.textures,o=t.scene.parent;t.scene.traverse(a=>{a.userData.meshFeatures&&a.userData.meshFeatures.dispose(),a.userData.structuralMetadata&&a.userData.structuralMetadata.dispose()});for(let a=0,s=i.length;a<s;a++)i[a].dispose();for(let a=0,s=n.length;a<s;a++)n[a].dispose();for(let a=0,s=r.length;a<s;a++){let c=r[a];c.image instanceof ImageBitmap&&c.image.close(),c.dispose()}o&&o.remove(t.scene),t.scene=null,t.materials=null,t.textures=null,t.geometry=null,t.metadata=null}}setTileActive(e,t){super.setTileActive(e,t);let n=e.engineData.scene;n&&(t?(n.parent=this.group,n.updateMatrixWorld(!0)):n.parent=null)}setTileVisible(e,t){let n=e.engineData.scene,{activeTiles:i,group:r}=this;n&&(t?r.add(n):(r.remove(n),i.has(e)&&(n.parent=r))),super.setTileVisible(e,t)}calculateBytesUsed(e,t){let n=this._bytesUsed;return!n.has(e)&&t&&n.set(e,oS(t)),n.get(e)??null}calculateTileViewError(e,t){let n=e.engineData,i=this.cameras,r=this.cameraInfo,o=n.boundingVolume,a=!1,s=0,c=1/0,l=0,u=1/0;for(let d=0,h=i.length;d<h;d++){let b=r[d],m,y;if(b.isOrthographic){let w=b.pixelSize;m=e.geometricError/w,y=1/0}else{let w=b.sseDenominator;y=o.distanceToPoint(b.position),m=y===0?1/0:e.geometricError/(y*w)}let k=r[d].frustum;o.intersectsFrustum(k)&&(a=!0,s=Math.max(s,m),c=Math.min(c,y)),l=Math.max(l,m),u=Math.min(u,y)}a?(t.inView=!0,t.error=s,t.distanceFromCamera=c):(t.inView=!1,t.error=l,t.distanceFromCamera=u)}dispose(){super.dispose(),this.group.removeFromParent()}};import{BatchedMesh as UR,Box2 as cS,Box3 as VR,Box3Helper as GR,BoxGeometry as HR,BufferAttribute as Lu,BufferGeometry as WR,CanvasTexture as $R,Color as XR,CustomBlending as dS,DataTexture as uS,DefaultLoadingManager as qR,DoubleSide as YR,EventDispatcher as KR,FileLoader as pS,FloatType as QR,Frustum as JR,GreaterDepth as ZR,Group as eL,LineBasicMaterial as tL,LineSegments as nL,LinearFilter as hS,LinearMipMapLinearFilter as rL,MathUtils as Bu,Matrix2 as mS,Matrix3 as gS,Matrix4 as bS,Mesh as iL,MeshBasicMaterial as fS,MeshLambertMaterial as oL,MeshStandardMaterial as aL,OneFactor as xS,PlaneGeometry as sL,Points as lL,PointsMaterial as cL,Quaternion as dL,REVISION as uL,RGFormat as pL,Ray as hL,Raycaster as mL,RedFormat as gL,SRGBColorSpace as bL,ShaderMaterial as yS,Source as fL,Sphere as xL,SphereGeometry as yL,Texture as vL,TextureUtils as wL,Triangle as CL,UnsignedByteType as SL,Vector2 as cr,Vector3 as Ib,Vector4 as vS,WebGLArrayRenderTarget as ML,WebGLRenderTarget as Cb,WebGLRenderer as wS,ZeroFactor as CS}from"three";import{GLTFLoader as SS}from"three/addons/loaders/GLTFLoader.js";import{FullScreenQuad as zb}from"three/addons/postprocessing/Pass.js";var kL=Object.freeze({fill:"#cccccc",stroke:"transparent",strokeWidth:1,radius:2,order:0,visible:!0});var Sb=new Cr;Sb.maxJobs=10,Sb.priorityCallback=(e,t)=>{let n=e.tile,i=t.tile,r=n.internal.renderer,o=i.internal.renderer,a=r.visibleTiles.has(n);return a===o.visibleTiles.has(i)?Yo(n,i):a?1:-1};var Mb=new Ib;function bs(e,t){if(e.isInterleavedBufferAttribute||e.array instanceof t)return e;let n=t===Int8Array||t===Int16Array||t===Int32Array?-1:0,i=new Lu(new t(e.count*e.itemSize),e.itemSize,!0),r=e.itemSize,o=e.count;for(let a=0;a<o;a++)for(let s=0;s<r;s++){let c=Bu.clamp(e.getComponent(a,s),n,1);i.setComponent(a,s,c)}return i}function MS(e,t=Int16Array){let n=e.geometry,i=n.attributes,r=i.position;if(r.isInterleavedBufferAttribute||r.array instanceof t)return r;let o=new Lu(new t(r.count*r.itemSize),r.itemSize,!1),a=r.itemSize,s=r.count;n.computeBoundingBox();let c=n.boundingBox,{min:l,max:u}=c,d=2**(8*t.BYTES_PER_ELEMENT-1)-1,h=-d;for(let b=0;b<s;b++)for(let m=0;m<a;m++){let y=m===0?"x":m===1?"y":"z",k=l[y],w=u[y],p=Bu.mapLinear(r.getComponent(b,m),k,w,h,d);o.setComponent(b,m,p)}c.getCenter(Mb).multiply(e.scale).applyQuaternion(e.quaternion),e.position.add(Mb),e.scale.x*=.5*(u.x-l.x)/d,e.scale.y*=.5*(u.y-l.y)/d,e.scale.z*=.5*(u.z-l.z)/d,i.position=o,e.geometry.boundingBox=null,e.geometry.boundingSphere=null,e.updateMatrixWorld()}var Du=class{constructor(e){this._options={generateNormals:!1,disableMipmaps:!0,compressIndex:!0,compressNormals:!1,compressUvs:!1,compressPosition:!1,uvType:Int8Array,normalType:Int8Array,positionType:Int16Array,...e},this.name="TILES_COMPRESSION_PLUGIN",this.priority=-100}processTileModel(e,t){let{generateNormals:n,disableMipmaps:i,compressIndex:r,compressUvs:o,compressNormals:a,compressPosition:s,uvType:c,normalType:l,positionType:u}=this._options;e.traverse(d=>{if(d.material&&i){let h=d.material;for(let b in h){let m=h[b];m&&m.isTexture&&m.generateMipmaps&&(m.generateMipmaps=!1,m.minFilter=hS)}}if(d.geometry){let h=d.geometry,b=h.attributes;if(o){let{uv:m,uv1:y,uv2:k,uv3:w}=b;m&&(b.uv=bs(m,c)),y&&(b.uv1=bs(y,c)),k&&(b.uv2=bs(k,c)),w&&(b.uv3=bs(w,c))}if(n&&!b.normals&&h.computeVertexNormals(),a&&b.normals&&(b.normals=bs(b.normals,l)),s&&MS(d,u),r&&h.index){let m=b.position.count,y=h.index,k=m>65535?Uint32Array:m>255?Uint16Array:Uint8Array;if(!(y.array instanceof k)){let w=new k(h.index.count);w.set(y.array);let p=new Lu(w,1);h.setIndex(p)}}}})}};function on(e,t,n){return e&&t in e?e[t]:n}function Fb(e){return e!=="BOOLEAN"&&e!=="STRING"&&e!=="ENUM"}function TS(e){return/^FLOAT/.test(e)}function vs(e){return/^VEC/.test(e)}function ws(e){return/^MAT/.test(e)}function jb(e,t,n,i=null){return ws(n)||vs(n)?i.fromArray(e,t):e[t]}function Eu(e){let{type:t,componentType:n}=e;switch(t){case"SCALAR":return n==="INT64"?0n:0;case"VEC2":return new cr;case"VEC3":return new Ib;case"VEC4":return new vS;case"MAT2":return new mS;case"MAT3":return new gS;case"MAT4":return new bS;case"BOOLEAN":return!1;case"STRING":return"";case"ENUM":return 0}}function Tb(e,t){if(t==null)return!1;switch(e){case"SCALAR":return typeof t=="number"||typeof t=="bigint";case"VEC2":return t.isVector2;case"VEC3":return t.isVector3;case"VEC4":return t.isVector4;case"MAT2":return t.isMatrix2;case"MAT3":return t.isMatrix3;case"MAT4":return t.isMatrix4;case"BOOLEAN":return typeof t=="boolean";case"STRING":return typeof t=="string";case"ENUM":return typeof t=="number"||typeof t=="bigint"}throw Error("ClassProperty: invalid type.")}function ys(e,t=null){switch(e){case"INT8":return Int8Array;case"INT16":return Int16Array;case"INT32":return Int32Array;case"INT64":return BigInt64Array;case"UINT8":return Uint8Array;case"UINT16":return Uint16Array;case"UINT32":return Uint32Array;case"UINT64":return BigUint64Array;case"FLOAT32":return Float32Array;case"FLOAT64":return Float64Array}switch(t){case"BOOLEAN":return Uint8Array;case"STRING":return Uint8Array}throw Error("ClassProperty: invalid type.")}function PS(e,t=null){if(e.array){t=t&&Array.isArray(t)?t:[],t.length=e.count;for(let n=0,i=t.length;n<i;n++)t[n]=cc(e,t[n])}else t=cc(e,t);return t}function cc(e,t=null){let n=e.default,i=e.type;if(t||(t=Eu(e)),n===null){switch(i){case"SCALAR":return 0;case"VEC2":return t.set(0,0);case"VEC3":return t.set(0,0,0);case"VEC4":return t.set(0,0,0,0);case"MAT2":return t.identity();case"MAT3":return t.identity();case"MAT4":return t.identity();case"BOOLEAN":return!1;case"STRING":return"";case"ENUM":return""}throw Error("ClassProperty: invalid type.")}else if(ws(i))t.fromArray(n);else if(vs(i))t.fromArray(n);else return n}function kS(e,t){if(e.noData===null)return t;let n=e.noData,i=e.type;if(Array.isArray(t))for(let a=0,s=t.length;a<s;a++)t[a]=r(t[a]);else t=r(t);return t;function r(a){return o(a)&&(a=cc(e,a)),a}function o(a){if(ws(i)){let s=a.elements;for(let c=0,l=n.length;c<l;c++)if(n[c]!==s[c])return!1;return!0}else if(vs(i)){for(let s=0,c=n.length;s<c;s++)if(n[s]!==a.getComponent(s))return!1;return!0}else return n===a}}function _S(e,t){switch(e){case"INT8":return Math.max(t/127,-1);case"INT16":return Math.max(t,32767,-1);case"INT32":return Math.max(t/2147483647,-1);case"INT64":return Math.max(Number(t)/9223372036854776e3,-1);case"UINT8":return t/255;case"UINT16":return t/65535;case"UINT32":return t/4294967295;case"UINT64":return Number(t)/18446744073709552e3}}function AS(e,t){let{type:n,componentType:i,scale:r,offset:o,normalized:a}=e;if(Array.isArray(t))for(let d=0,h=t.length;d<h;d++)t[d]=s(t[d]);else t=s(t);return t;function s(d){return d=ws(n)?l(d):vs(n)?c(d):u(d),d}function c(d){return d.x=u(d.x),d.y=u(d.y),"z"in d&&(d.z=u(d.z)),"w"in d&&(d.w=u(d.w)),d}function l(d){let h=d.elements;for(let b=0,m=h.length;b<m;b++)h[b]=u(h[b]);return d}function u(d){return a&&(d=_S(i,d)),(a||TS(i))&&(d=d*r+o),d}}function Ou(e,t,n=null){if(e.array){Array.isArray(t)||(t=Array(e.count||0)),t.length=n===null?e.count:n;for(let i=0,r=t.length;i<r;i++)Tb(e.type,t[i])||(t[i]=Eu(e))}else Tb(e.type,t)||(t=Eu(e));return t}function dc(e,t){for(let n in t)n in e||delete t[n];for(let n in e){let i=e[n];t[n]=Ou(i,t[n])}}function ES(e){switch(e){case"ENUM":return 1;case"SCALAR":return 1;case"VEC2":return 2;case"VEC3":return 3;case"VEC4":return 4;case"MAT2":return 4;case"MAT3":return 9;case"MAT4":return 16;case"BOOLEAN":return-1;case"STRING":return-1;default:return-1}}var pc=class{constructor(e,t,n=null){this.name=t.name||null,this.description=t.description||null,this.type=t.type,this.componentType=t.componentType||null,this.enumType=t.enumType||null,this.array=t.array||!1,this.count=t.count||0,this.normalized=t.normalized||!1,this.offset=t.offset||0,this.scale=on(t,"scale",1),this.max=on(t,"max",1/0),this.min=on(t,"min",-1/0),this.required=t.required||!1,this.noData=on(t,"noData",null),this.default=on(t,"default",null),this.semantic=on(t,"semantic",null),this.enumSet=null,this.accessorProperty=n,n&&(this.offset=on(n,"offset",this.offset),this.scale=on(n,"scale",this.scale),this.max=on(n,"max",this.max),this.min=on(n,"min",this.min)),t.type==="ENUM"&&(this.enumSet=e[this.enumType],this.componentType===null&&(this.componentType=on(this.enumSet,"valueType","UINT16")))}shapeToProperty(e,t=null){return Ou(this,e,t)}resolveDefaultElement(e){return cc(this,e)}resolveDefault(e){return PS(this,e)}resolveNoData(e){return kS(this,e)}resolveEnumsToStrings(e){let t=this.enumSet;if(this.type==="ENUM")if(Array.isArray(e))for(let i=0,r=e.length;i<r;i++)e[i]=n(e[i]);else e=n(e);return e;function n(i){let r=t.values.find(o=>o.value===i);return r===null?"":r.name}}adjustValueScaleOffset(e){return Fb(this.type)?AS(this,e):e}},Nu=class{constructor(e,t={},n={},i=null){this.definition=e,this.class=t[e.class],this.className=e.class,this.enums=n,this.data=i,this.name="name"in e?e.name:null,this.properties=null}getPropertyNames(){return Object.keys(this.class.properties)}includesData(e){return!!this.definition.properties[e]}dispose(){}_initProperties(e=pc){let t={};for(let n in this.class.properties)t[n]=new e(this.enums,this.class.properties[n],this.definition.properties[n]);this.properties=t}},RS=class extends pc{constructor(e,t,n=null){super(e,t,n),this.attribute=n?.attribute??null}},LS=class extends Nu{constructor(...e){super(...e),this.isPropertyAttributeAccessor=!0,this._initProperties(RS)}getData(e,t,n={}){let i=this.properties;dc(i,n);for(let r in i)n[r]=this.getPropertyValue(r,e,t,n[r]);return n}getPropertyValue(e,t,n,i=null){if(t>=this.count)throw Error("PropertyAttributeAccessor: Requested index is outside the range of the buffer.");let r=this.properties[e],o=r.type;if(!r)throw Error("PropertyAttributeAccessor: Requested class property does not exist.");if(!this.definition.properties[e])return r.resolveDefault(i);i=r.shapeToProperty(i);let a=n.getAttribute(r.attribute.toLowerCase());if(ws(o)){let s=i.elements;for(let c=s.length;0<c;)s[0]=a.getComponent(t,0)}else if(vs(o))i.fromBufferAttribute(a,t);else if(o==="SCALAR"||o==="ENUM")i=a.getX(t);else throw Error("StructuredMetadata.PropertyAttributeAccessor: BOOLEAN and STRING types are not supported by property attributes.");return i=r.adjustValueScaleOffset(i),i=r.resolveEnumsToStrings(i),i=r.resolveNoData(i),i}},BS=class extends pc{constructor(e,t,n=null){super(e,t,n),this.values=n?.values??null,this.valueLength=ES(this.type),this.arrayOffsets=on(n,"arrayOffsets",null),this.stringOffsets=on(n,"stringOffsets",null),this.arrayOffsetType=on(n,"arrayOffsetType","UINT32"),this.stringOffsetType=on(n,"stringOffsetType","UINT32")}getArrayLengthFromId(e,t){let n=this.count;if(this.arrayOffsets!==null){let{arrayOffsets:i,arrayOffsetType:r}=this,o=new(ys(r))(e[i]);n=o[t+1]-o[t]}return n}getIndexOffsetFromId(e,t){let n=t;if(this.arrayOffsets){let{arrayOffsets:i,arrayOffsetType:r}=this;n=new(ys(r))(e[i])[n]}else this.array&&(n*=this.count);return n}},DS=class extends Nu{constructor(...e){super(...e),this.isPropertyTableAccessor=!0,this.count=this.definition.count,this._initProperties(BS)}getData(e,t={}){let n=this.properties;dc(n,t);for(let i in n)t[i]=this.getPropertyValue(i,e,t[i]);return t}_readValueAtIndex(e,t,n,i=null){let r=this.properties[e],{componentType:o,type:a}=r,s=this.data,c=s[r.values],l=new(ys(o,a))(c),u=r.getIndexOffsetFromId(s,t);if(Fb(a)||a==="ENUM")return jb(l,(u+n)*r.valueLength,a,i);if(a==="STRING"){let d=u+n,h=0;if(r.stringOffsets!==null){let{stringOffsets:m,stringOffsetType:y}=r,k=new(ys(y))(s[m]);h=k[d+1]-k[d],d=k[d]}let b=new Uint8Array(l.buffer,d,h);i=new TextDecoder().decode(b)}else if(a==="BOOLEAN"){let d=u+n,h=Math.floor(d/8),b=d%8;i=(l[h]>>b&1)==1}return i}getPropertyValue(e,t,n=null){if(t>=this.count)throw Error("PropertyTableAccessor: Requested index is outside the range of the table.");let i=this.properties[e];if(!i)throw Error("PropertyTableAccessor: Requested property does not exist.");if(!this.definition.properties[e])return i.resolveDefault(n);let r=i.array,o=this.data,a=i.getArrayLengthFromId(o,t);if(n=i.shapeToProperty(n,a),r)for(let s=0,c=n.length;s<c;s++)n[s]=this._readValueAtIndex(e,t,s,n[s]);else n=this._readValueAtIndex(e,t,0,n);return n=i.adjustValueScaleOffset(n),n=i.resolveEnumsToStrings(n),n=i.resolveNoData(n),n}},fs=new cS,Pb=class{constructor(){this._renderer=new wS,this._target=new Cb(1,1),this._texTarget=new Cb,this._quad=new zb(new yS({blending:dS,blendDst:CS,blendSrc:xS,uniforms:{map:{value:null},pixel:{value:new cr}},vertexShader:`
|
|
10
|
-
void main() {
|
|
11
|
-
|
|
12
|
-
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
`,fragmentShader:`
|
|
16
|
-
uniform sampler2D map;
|
|
17
|
-
uniform ivec2 pixel;
|
|
18
|
-
|
|
19
|
-
void main() {
|
|
20
|
-
|
|
21
|
-
gl_FragColor = texelFetch( map, pixel, 0 );
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
`}))}increaseSizeTo(e){this._target.setSize(Math.max(this._target.width,e),1)}readDataAsync(e){let{_renderer:t,_target:n}=this;return t.readRenderTargetPixelsAsync(n,0,0,e.length/4,1,e)}readData(e){let{_renderer:t,_target:n}=this;t.readRenderTargetPixels(n,0,0,e.length/4,1,e)}renderPixelToTarget(e,t,n){let{_renderer:i,_target:r}=this;fs.min.copy(t),fs.max.copy(t),fs.max.x+=1,fs.max.y+=1,i.initRenderTarget(r),i.copyTextureToTexture(e,r.texture,fs,n,0)}},di=new class{constructor(){let e=null;Object.getOwnPropertyNames(Pb.prototype).forEach(t=>{t!=="constructor"&&(this[t]=(...n)=>(e||(e=new Pb),e[t](...n)))})}},kb=new cr,_b=new cr,Ab=new cr;function OS(e,t){return t===0?e.getAttribute("uv"):e.getAttribute(`uv${t}`)}function Ub(e,t,n=[,,,]){let i=3*t,r=3*t+1,o=3*t+2;return e.index&&(i=e.index.getX(i),r=e.index.getX(r),o=e.index.getX(o)),n[0]=i,n[1]=r,n[2]=o,n}function Vb(e,t,n,i,r){let[o,a,s]=i,c=OS(e,t);kb.fromBufferAttribute(c,o),_b.fromBufferAttribute(c,a),Ab.fromBufferAttribute(c,s),r.set(0,0,0).addScaledVector(kb,n.x).addScaledVector(_b,n.y).addScaledVector(Ab,n.z)}function Gb(e,t,n,i){let r=e.x-Math.floor(e.x),o=e.y-Math.floor(e.y),a=Math.floor(r*t%t),s=Math.floor(o*n%n);return i.set(a,s),i}var Eb=new cr,Rb=new cr,Lb=new cr,NS=class extends pc{constructor(e,t,n=null){super(e,t,n),this.channels=on(n,"channels",[0]),this.index=on(n,"index",null),this.texCoord=on(n,"texCoord",null),this.valueLength=parseInt(this.type.replace(/[^0-9]/g,""))||1}readDataFromBuffer(e,t,n=null){let i=this.type;if(i==="BOOLEAN"||i==="STRING")throw Error("PropertyTextureAccessor: BOOLEAN and STRING types not supported.");return jb(e,t*this.valueLength,i,n)}},IS=class extends Nu{constructor(...e){super(...e),this.isPropertyTextureAccessor=!0,this._asyncRead=!1,this._initProperties(NS)}getData(e,t,n,i={}){let r=this.properties;dc(r,i);let o=Object.keys(r),a=o.map(s=>i[s]);return this.getPropertyValuesAtTexel(o,e,t,n,a),o.forEach((s,c)=>i[s]=a[c]),i}async getDataAsync(e,t,n,i={}){let r=this.properties;dc(r,i);let o=Object.keys(r),a=o.map(s=>i[s]);return await this.getPropertyValuesAtTexelAsync(o,e,t,n,a),o.forEach((s,c)=>i[s]=a[c]),i}getPropertyValuesAtTexelAsync(...e){this._asyncRead=!0;let t=this.getPropertyValuesAtTexel(...e);return this._asyncRead=!1,t}getPropertyValuesAtTexel(e,t,n,i,r=[]){for(;r.length<e.length;)r.push(null);r.length=e.length,di.increaseSizeTo(r.length);let o=this.data,a=this.definition.properties,s=this.properties,c=Ub(i,t);for(let d=0,h=e.length;d<h;d++){let b=e[d];if(!a[b])continue;let m=s[b],y=o[m.index];Vb(i,m.texCoord,n,c,Eb),Gb(Eb,y.image.width,y.image.height,Rb),Lb.set(d,0),di.renderPixelToTarget(y,Rb,Lb)}let l=new Uint8Array(e.length*4);if(this._asyncRead)return di.readDataAsync(l).then(()=>(u.call(this),r));return di.readData(l),u.call(this),r;function u(){for(let d=0,h=e.length;d<h;d++){let b=e[d],m=s[b],y=m.type;if(r[d]=Ou(m,r[d]),!m)throw Error("PropertyTextureAccessor: Requested property does not exist.");if(!a[b]){r[d]=m.resolveDefault(r);continue}let k=m.valueLength*(m.count||1),w=m.channels.map(S=>l[4*d+S]),p=m.componentType,g=new(ys(p,y))(k);if(new Uint8Array(g.buffer).set(w),m.array){let S=r[d];for(let v=0,M=S.length;v<M;v++)S[v]=m.readDataFromBuffer(g,v,S[v])}else r[d]=m.readDataFromBuffer(g,0,r[d]);r[d]=m.adjustValueScaleOffset(r[d]),r[d]=m.resolveEnumsToStrings(r[d]),r[d]=m.resolveNoData(r[d])}}}dispose(){this.data.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},Ru=class{constructor(e,t,n,i=null,r=null){let{schema:o,propertyTables:a=[],propertyTextures:s=[],propertyAttributes:c=[]}=e,{enums:l,classes:u}=o,d=a.map(m=>new DS(m,u,l,n)),h=[],b=[];i&&(i.propertyTextures&&(h=i.propertyTextures.map(m=>new IS(s[m],u,l,t))),i.propertyAttributes&&(b=i.propertyAttributes.map(m=>new LS(c[m],u,l)))),this.schema=o,this.tableAccessors=d,this.textureAccessors=h,this.attributeAccessors=b,this.object=r,this.textures=t,this.nodeMetadata=i}getPropertyTableData(e,t,n=null){if(!Array.isArray(e))n||(n={}),n=this.tableAccessors[e].getData(t,n);else{n||(n=[]);let i=Math.min(e.length,t.length);n.length=i;for(let r=0;r<i;r++){let o=this.tableAccessors[e[r]];n[r]=o.getData(t[r],n[r])}}if(Array.isArray(e)!==Array.isArray(n)||Array.isArray(e)!==Array.isArray(t))throw Error("StructuralMetadata: Scalar and array inputs cannot be mixed.");return n}getPropertyTableInfo(e=null){if(e===null&&(e=this.tableAccessors.map((t,n)=>n)),Array.isArray(e))return e.map(t=>{let n=this.tableAccessors[t];return{name:n.name,className:n.definition.class}});{let t=this.tableAccessors[e];return{name:t.name,className:t.definition.class}}}getPropertyTextureData(e,t,n=[]){let i=this.textureAccessors;n.length=i.length;for(let r=0;r<i.length;r++)n[r]=i[r].getData(e,t,this.object.geometry,n[r]);return n}async getPropertyTextureDataAsync(e,t,n=[]){let i=this.textureAccessors;n.length=i.length;let r=[];for(let o=0;o<i.length;o++){let a=i[o].getDataAsync(e,t,this.object.geometry,n[o]).then(s=>{n[o]=s});r.push(a)}return await Promise.all(r),n}getPropertyTextureInfo(){return this.textureAccessors}getPropertyAttributeData(e,t=[]){let n=this.attributeAccessors;t.length=n.length;for(let i=0;i<n.length;i++)t[i]=n[i].getData(e,this.object.geometry,t[i]);return t}getPropertyAttributeInfo(){return this.attributeAccessors.map(e=>({name:e.name,className:e.definition.class}))}dispose(){this.textureAccessors.forEach(e=>e.dispose()),this.tableAccessors.forEach(e=>e.dispose()),this.attributeAccessors.forEach(e=>e.dispose())}},xs="EXT_structural_metadata";function zS(e,t=[]){let n=e.json.textures?.length||0,i=Array(n).fill(null);return t.forEach(({properties:r})=>{for(let o in r){let{index:a}=r[o];i[a]===null&&(i[a]=e.loadTexture(a))}}),Promise.all(i)}function FS(e,t=[]){let n=e.json.bufferViews?.length||0,i=Array(n).fill(null);return t.forEach(({properties:r})=>{for(let o in r){let{values:a,arrayOffsets:s,stringOffsets:c}=r[o];i[a]===null&&(i[a]=e.getDependency("bufferView",a)),i[s]===null&&(i[s]=e.getDependency("bufferView",s)),i[c]===null&&(i[c]=e.getDependency("bufferView",c))}}),Promise.all(i)}var Hb=class{constructor(e){this.parser=e,this.name=xs}async afterRoot({scene:e,parser:t}){let n=t.json.extensionsUsed;if(!n||!n.includes(xs))return;let i=null,r=t.json.extensions[xs];if(r.schemaUri){let{manager:c,path:l,requestHeader:u,crossOrigin:d}=t.options,h=new URL(r.schemaUri,l).toString(),b=new pS(c);b.setCrossOrigin(d),b.setResponseType("json"),b.setRequestHeader(u),i=b.loadAsync(h).then(m=>{r={...r,schema:m}})}let[o,a]=await Promise.all([zS(t,r.propertyTextures),FS(t,r.propertyTables),i]),s=new Ru(r,o,a);e.userData.structuralMetadata=s,e.traverse(c=>{if(t.associations.has(c)){let{meshes:l,primitives:u}=t.associations.get(c),d=t.json.meshes[l]?.primitives[u];if(d&&d.extensions&&d.extensions[xs]){let h=d.extensions[xs];c.userData.structuralMetadata=new Ru(r,o,a,h,c)}else c.userData.structuralMetadata=s}})}},Bb=new cr,Db=new cr,Ob=new cr;function jS(e){return e.x>e.y&&e.x>e.z?0:e.y>e.z?1:2}var Wb=class{constructor(e,t,n){this.geometry=e,this.textures=t,this.data=n,this._asyncRead=!1,this.featureIds=n.featureIds.map(i=>{let{texture:r,...o}=i,a={label:null,propertyTable:null,nullFeatureId:null,...o};return r&&(a.texture={texCoord:0,channels:[0],...r}),a})}getTextures(){return this.textures}getFeatureInfo(){return this.featureIds}getFeaturesAsync(...e){this._asyncRead=!0;let t=this.getFeatures(...e);return this._asyncRead=!1,t}getFeatures(e,t){let{geometry:n,textures:i,featureIds:r}=this,o=Array(r.length).fill(null),a=r.length;di.increaseSizeTo(a);let s=Ub(n,e),c=s[jS(t)];for(let d=0,h=r.length;d<h;d++){let b=r[d],m="nullFeatureId"in b?b.nullFeatureId:null;if("texture"in b){let y=i[b.texture.index];Vb(n,b.texture.texCoord,t,s,Bb),Gb(Bb,y.image.width,y.image.height,Db),Ob.set(d,0),di.renderPixelToTarget(i[b.texture.index],Db,Ob)}else if("attribute"in b){let y=n.getAttribute(`_feature_id_${b.attribute}`).getX(c);y!==m&&(o[d]=y)}else{let y=c;y!==m&&(o[d]=y)}}let l=new Uint8Array(a*4);if(this._asyncRead)return di.readDataAsync(l).then(()=>(u(),o));return di.readData(l),u(),o;function u(){let d=new Uint32Array(1);for(let h=0,b=r.length;h<b;h++){let m=r[h],y="nullFeatureId"in m?m.nullFeatureId:null;if("texture"in m){let{channels:k}=m.texture,w=k.map(g=>l[4*h+g]);new Uint8Array(d.buffer).set(w);let p=d[0];p!==y&&(o[h]=p)}}}}dispose(){this.textures.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},uc="EXT_mesh_features";function Nb(e,t,n){e.traverse(i=>{if(t.associations.has(i)){let{meshes:r,primitives:o}=t.associations.get(i),a=t.json.meshes[r]?.primitives[o];a&&a.extensions&&a.extensions[uc]&&n(i,a.extensions[uc])}})}var $b=class{constructor(e){this.parser=e,this.name=uc}async afterRoot({scene:e,parser:t}){let n=t.json.extensionsUsed;if(!n||!n.includes(uc))return;let i=t.json.textures?.length||0,r=Array(i).fill(null);Nb(e,t,(a,{featureIds:s})=>{s.forEach(c=>{if(c.texture&&r[c.texture.index]===null){let l=c.texture.index;r[l]=t.loadTexture(l)}})});let o=await Promise.all(r);Nb(e,t,(a,s)=>{a.userData.meshFeatures=new Wb(a.geometry,o,s)})}},Xb=class{constructor(){this.name="CESIUM_RTC"}afterRoot(e){if(e.parser.json.extensions&&e.parser.json.extensions.CESIUM_RTC){let{center:t}=e.parser.json.extensions.CESIUM_RTC;t&&(e.scene.position.x+=t[0],e.scene.position.y+=t[1],e.scene.position.z+=t[2])}}},Iu=class{constructor(e){e={metadata:!0,rtc:!0,plugins:[],dracoLoader:null,ktxLoader:null,meshoptDecoder:null,autoDispose:!0,...e},this.tiles=null,this.metadata=e.metadata,this.rtc=e.rtc,this.plugins=e.plugins,this.dracoLoader=e.dracoLoader,this.ktxLoader=e.ktxLoader,this.meshoptDecoder=e.meshoptDecoder,this._gltfRegex=/\.(gltf|glb)$/g,this._dracoRegex=/\.drc$/g,this._loader=null}init(e){let t=new SS(e.manager);this.dracoLoader&&(t.setDRACOLoader(this.dracoLoader),e.manager.addHandler(this._dracoRegex,this.dracoLoader)),this.ktxLoader&&t.setKTX2Loader(this.ktxLoader),this.meshoptDecoder&&t.setMeshoptDecoder(this.meshoptDecoder),this.rtc&&t.register(()=>new Xb),this.metadata&&(t.register(()=>new Hb),t.register(()=>new $b)),this.plugins.forEach(n=>t.register(n)),e.manager.addHandler(this._gltfRegex,t),this.tiles=e,this._loader=t}dispose(){this.tiles.manager.removeHandler(this._gltfRegex),this.tiles.manager.removeHandler(this._dracoRegex),this.autoDispose&&(this.ktxLoader.dispose(),this.dracoLoader.dispose())}};var{clamp:_L}=Bu;var AL=new zb(new fS),US=new uS(new Uint8Array([255,255,255,255]),1,1);US.needsUpdate=!0;var VS=0,GS=1,HS=2,WS=3,$S=4,XS=5,qS=6,YS=7,KS=8,QS=9,JS=10,ZS=11,EL=Object.freeze({NONE:VS,SCREEN_ERROR:GS,GEOMETRIC_ERROR:HS,DISTANCE:WS,DEPTH:$S,RELATIVE_DEPTH:XS,IS_LEAF:qS,RANDOM_COLOR:YS,RANDOM_NODE_COLOR:KS,CUSTOM_COLOR:QS,LOAD_ORDER:JS,INDEXED_COLOR:ZS});var RL=Math.PI/4,LL=3/5;var ci={NONE:0,NOT_READY:1,NO_FIT:2,DEPTH:3,OCCUPANCY:4,SPACING:5,ANGLE:6,FACING:7};var BL=new class{constructor(){this._cache={}}getColor(...e){let t=e.pop(),n=e.join("_"),{_cache:i}=this;return n in i||(t.setHSL(Math.random(),1,.5),i[n]=t.getHex()),t.set(i[n])}};var DL={[ci.NONE]:16777215,[ci.NOT_READY]:7829367,[ci.NO_FIT]:2250239,[ci.DEPTH]:4473924,[ci.OCCUPANCY]:65535,[ci.SPACING]:16776960,[ci.ANGLE]:16711680,[ci.FACING]:16711935};var OL=Math.PI/180;var NL=Ji*Math.PI*2;var IL=Ji*Math.PI*2;import{DRACOLoader as oM}from"three/examples/jsm/loaders/DRACOLoader.js";import{KTX2Loader as aM}from"three/examples/jsm/loaders/KTX2Loader.js";import{MeshoptDecoder as sM}from"three/examples/jsm/libs/meshopt_decoder.module.js";import{Box3 as lM,DoubleSide as cM,MathUtils as dM,Matrix4 as Qb,Sphere as uM,Vector3 as pM}from"three";import{BufferAttribute as qb,MathUtils as eM}from"three";function Yb(e){return!!e&&!e.isInterleavedBufferAttribute}function Kb(e,t,n,i){for(let r=0;r<e.count;r+=1)for(let o=0;o<e.itemSize;o+=1)t.setComponent(r,o,eM.clamp(e.getComponent(r,o),n,i));return t}function tM(e){for(let t=0;t<e.count;t+=1)for(let n=0;n<e.itemSize;n+=1){let i=e.getComponent(t,n);if(!Number.isFinite(i)||i<0||i>1)return!1}return!0}var hc=class{constructor(){this.name="RI_VERTEX_COMPRESSION_PLUGIN";this.priority=-99}processTileModel(t){t.traverse(n=>{let i=n.geometry;if(!i)return;let r=i.attributes.normal;Yb(r)&&!(r.array instanceof Int16Array)&&(i.attributes.normal=Kb(r,new qb(new Int16Array(r.count*r.itemSize),r.itemSize,!0),-1,1));for(let o of["uv","uv1","uv2","uv3"]){let a=i.attributes[o];!Yb(a)||a.array instanceof Uint16Array||!tM(a)||(i.attributes[o]=Kb(a,new qb(new Uint16Array(a.count*a.itemSize),a.itemSize,!0),0,1))}})}};import{jsx as Zb,jsxs as xM}from"react/jsx-runtime";var hM=0,Jb=4,mM=6,gM=12,bM=4;function fM(e){try{let t=typeof window>"u"?new URL(e):new URL(e,window.location.href);return new URL("objects.json",t).toString()}catch{return null}}function Fu({url:e,rotation:t=[0,0,0],errorTarget:n=64,cacheSize:i=800,memoryBudgetMB:r=800,decoderConfig:o,objectBindings:a,itemMaterials:s,sceneConfig:c,selectedItem:l,panelHoveredItem:u,highlightOnHover:d=!0,onItemClick:h,onItemHover:b,onObjectCatalog:m,onTilesetBounds:y,onModelLoaded:k,onLoadError:w,nodeRefsOut:p,onNodeRefsChange:g,materialRefsOut:S,explodeFactor:v=0,suspendBindingTransforms:M=!1}){let{camera:D,gl:x,invalidate:C}=iM(),P=fn(null),[_,z]=zu(null),L=fn({onItemClick:h,onItemHover:b,onObjectCatalog:m,onTilesetBounds:y,onModelLoaded:k,onLoadError:w,onNodeRefsChange:g});L.current={onItemClick:h,onItemHover:b,onObjectCatalog:m,onTilesetBounds:y,onModelLoaded:k,onLoadError:w,onNodeRefsChange:g};let I=fn(!0),[N,R]=zu(null),F=fn(null);F.current=N;let G=fn([]),Z=fn(!1);ui(()=>{let H=new Vl;return R(H),()=>H.dispose()},[e]);let ie=fn(null),ve=fn(0),He=fn(!1),Dt=r*1024*1024,pt=fn(!1),kt=fn(eu),Re=fn(null),et=fn(null),Kt=fn(null);ui(()=>()=>{Kt.current!==null&&clearTimeout(Kt.current)},[]);let kn=o?.dracoDecoderPath??jd,ft=o?.ktx2TranscoderPath??Ud,Le=o?.meshopt??!0,[ee,vn]=zu(null);ui(()=>{He.current=!1,pt.current=!1;let H=new Au(e);H.loadAncestors=!0;let he=new ql;he.priorityCallback=H.downloadQueue.priorityCallback,he.maxJobsPerOrigin=gM;let ne=new Cr;ne.priorityCallback=H.parseQueue.priorityCallback,ne.maxJobs=mM;let Se=new Cr;Se.priorityCallback=H.processNodeQueue.priorityCallback,Se.maxJobs=H.processNodeQueue.maxJobs;let Me=new as;Me.unloadPriorityCallback=H.lruCache.unloadPriorityCallback,H.downloadQueue=he,H.parseQueue=ne,H.processNodeQueue=Se,H.lruCache=Me;let ye=kn?new oM().setDecoderPath(kn).setWorkerLimit(bM):null,_e=ft?new aM().setTranscoderPath(ft).detectSupport(x):null;return H.registerPlugin(new Iu({dracoLoader:ye,ktxLoader:_e,meshoptDecoder:Le?sM:null,autoDispose:!1})),H.registerPlugin(new Du({disableMipmaps:!1,compressIndex:!0,compressNormals:!1,compressUvs:!1,compressPosition:!0})),H.registerPlugin(new hc),vn(H),window.__riTiles=H,()=>{H.forEachLoadedModel(ce=>ja(ce)),H.dispose(),ye?.dispose(),_e?.dispose(),vn(ce=>ce===H?null:ce)}},[kn,x,ft,Le,e]),ui(()=>{ee&&(kt.current=eu,Re.current=null,ee.errorTarget=n,ee.lruCache.maxSize=i,ee.lruCache.minSize=Math.max(1,Math.floor(i*.75)),ee.lruCache.maxBytesSize=Dt,ee.lruCache.minBytesSize=Dt*.75,C())},[i,n,C,Dt,ee]);let cn=nM(()=>{let H=a??{};return{objectBindings:H,keyByModelObject:Tg(H),itemMaterials:s,shadingMode:c?.model.shading??"lit",rendererMode:c?.model.renderer??"pbr",selectedKey:l??null,hoveredKey:Pg(_,u),highlightOnHover:d,suspendTransforms:M,placementFrame:ee?.group.matrixWorld,invalidate:C}},[_,d,C,s,a,u,c,l,M,ee]),tt=to(()=>{if(!ee)return;let H=_t.current,he=Z.current?F.current?.nodesByBinding(H)??{}:{},ne={};ee.group.traverse(_e=>{if(!_e.isMesh)return;let ce=Jd(_e);if(!ce)return;let qe=H.keyByModelObject[ce]??ce;if(!H.objectBindings[qe])return;he[qe]||(he[qe]=_e);let nt=_e.material;nt&&(ne[qe]=nt)});let Se=p?.current??{},Me=Object.keys(Se),ye=Me.length!==Object.keys(he).length||Me.some(_e=>Se[_e]!==he[_e]);p&&(p.current=he),S&&(S.current=ne),(ye||!p)&&L.current.onNodeRefsChange?.()},[S,p,ee]),Qt=to(H=>jl(H,cn),[cn]),Ee=to(H=>_g(H,cn),[cn]),Jt=fn(Ee);Jt.current=Ee;let _t=fn(cn);_t.current=cn;let Fe=to(()=>{let H=ie.current,he=ve.current;return!H||he<=0?_t.current:{..._t.current,explode:{factor:he,centre:H.centre,radius:H.radius}}},[]);ui(()=>{ee&&(Ee(ee.group),I.current=!0,ee.forEachLoadedModel(H=>{Ee(H),qo(H,Fe())}),C())},[Ee,C,Fe,ee]),ui(()=>{let H=fM(e);if(!H)return;let he=!1;return fetch(H).then(ne=>ne.ok?ne.json():null).then(ne=>{he||!ne?.objects||(G.current=ne.objects,Z.current=ne.bindingFrame==="gltf-identity-v2",Z.current&&F.current?.setCatalog(ne.objects),I.current=!0,L.current.onObjectCatalog?.(ne.objects),C())}).catch(()=>{}),()=>{he=!0}},[e,C,N]),ui(()=>{if(!ee)return;let H=!1,he=()=>C(),ne=ce=>{ce.scene&&(ce.scene.traverse(qe=>{let nt=qe.material;for(let Ot of Array.isArray(nt)?nt:nt?[nt]:[])Ot.transparent&&Ot.side===cM&&(Ot.forceSinglePass=!0)}),Jt.current(ce.scene),qo(ce.scene,Fe()),ol(ce.scene)),I.current=!0,H||(H=!0,L.current.onModelLoaded?.(ee.group)),C()},Se=ce=>{L.current.onLoadError?.(ce.error)},Me=ce=>{ce.scene&&(Zd(ce.scene),ja(ce.scene)),I.current=!0};ee.setCamera(D),ee.setResolutionFromRenderer(D,x),ee.addEventListener("needs-update",he),ee.addEventListener("load-model",ne),ee.addEventListener("load-error",Se),ee.addEventListener("dispose-model",Me);let ye=()=>{I.current=!0,C()};ee.addEventListener("tile-visibility-change",ye);let _e=()=>{let ce=ee.root;ce&&!ce.content?.uri&&ce.refine==="REPLACE"&&(ce.refine="ADD",C())};return ee.addEventListener("load-root-tileset",_e),C(),()=>{ee.removeEventListener("needs-update",he),ee.removeEventListener("load-model",ne),ee.removeEventListener("load-error",Se),ee.removeEventListener("dispose-model",Me),ee.removeEventListener("tile-visibility-change",ye),ee.removeEventListener("load-root-tileset",_e),Zd(ee.group),ee.deleteCamera(D),p&&(p.current={}),S&&(S.current={})}},[D,x,C,S,p,Fe,ee]);let xt=to(H=>{let he=Qt(H.object);he&&(H.stopPropagation(),L.current.onItemClick?.(he.binding))},[Qt,h]),dn=to(H=>{let he=Qt(H.object),ne=he?.key??null;ne!==P.current&&(P.current=ne,z(ne),L.current.onItemHover?.(he?.binding??null))},[Qt]),ge=to(()=>{P.current!==null&&(P.current=null,z(null),L.current.onItemHover?.(null))},[]);return ui(()=>{C()},[C,ee]),rM((H,he)=>{if(!ee)return;if(ee.setResolutionFromRenderer(D,x),Z.current&&N){let At=N.sync(Fe(),l,M);N.updateBounds(ee.root),M&&ee.forEachLoadedModel(O=>qo(O,At))}if(ee.update(),!He.current){let At=new lM;if(ee.getBoundingBox(At)){He.current=!0,ee.group.updateMatrixWorld(),At.applyMatrix4(ee.group.matrixWorld);let O=At.getBoundingSphere(new uM);ie.current={centre:O.center.clone(),radius:At.getSize(new pM).length()*.5},L.current.onTilesetBounds?.(At),C()}}I.current&&(I.current=!1,tt());let ne=Math.min(Math.max(v,0),1),Se=ve.current;Math.abs(Se-ne)>1e-4?(ve.current=dM.lerp(Se,ne,1-Math.exp(-6*he)),qo(ee.group,Fe()),C()):Se!==ne&&(ve.current=ne,qo(ee.group,Fe()),C());let Me=ee,ye=ee.lruCache,_e=ye.isFull(),ce=kt.current,qe=ce.loosened&&Re.current?Re.current:{bytes:ye.maxBytesSize,items:ye.maxSize},nt=0;for(let At of ye.usedSet??[])nt+=ye.bytesMap?.get(At)??0;let Ot=!1,Nt=ee;for(let At of Nt.usedSet??[]){let O=At.internal?.loadingState??Jb;if(At.traversal?.used&&At.internal?.hasContent&&O>=hM&&O<Jb){Ot=!0;break}}let Ue=et.current??(et.current={world:new Qb,projection:new Qb}),Ye=!Ue.world.equals(D.matrixWorld)||!Ue.projection.equals(D.projectionMatrix);Ye&&(Ue.world.copy(D.matrixWorld),Ue.projection.copy(D.projectionMatrix));let Zt={full:_e,wanting:Ot,moved:Ye,usage:Math.max(nt/Math.max(1,qe.bytes),(ye.usedSet?.size??0)/Math.max(1,qe.items)),now:performance.now()},Tt=jg(ce,Zt);Tt!==ce&&(Tt.loosened&&(!ce.loosened||Tt.raisedAt!==ce.raisedAt)?(ce.loosened||(Re.current=qe),ye.maxBytesSize=Math.max(qe.bytes,ye.cachedBytes??0)*tu,ye.maxSize=Math.ceil(Math.max(qe.items,ye.itemSet?.size??0)*tu)):!Tt.loosened&&ce.loosened&&Re.current&&(ye.maxBytesSize=Re.current.bytes,ye.maxSize=Re.current.items,Re.current=null),kt.current=Tt,ee.errorTarget=n*Tt.factor,C()),!pt.current&&_e&&Zt.wanting&&Tt.factor>=ns&&(pt.current=!0,console.warn("[react-immersive] The tile memory budget is full even at the coarsest level of detail, so the model may render incompletely. This usually means the model's textures are too large for streaming \u2014 re-process it with a smaller MAX_TEXTURE_SIZE, or raise memoryBudgetMB."));let hn=Ug(Tt,Zt);hn===0?C():hn!==null&&Kt.current===null&&(Kt.current=setTimeout(()=>{Kt.current=null,C()},hn)),((Me.stats?.downloading??0)>0||(Me.stats?.parsing??0)>0||Me.loadProgress!==void 0&&Me.loadProgress<1&&!_e)&&C()}),ee?xM("group",{rotation:t,children:[N?Zb("primitive",{object:N.group}):null,Zb("primitive",{object:ee.group,onClick:xt,onPointerMove:dn,onPointerOut:ge})]}):null}import{useMemo as ro,useRef as pi,useState as ta,useEffect as no,useCallback as ea}from"react";import{Html as ef}from"@react-three/drei";import{useFrame as tf,useThree as Uu}from"@react-three/fiber";import{MathUtils as ju,Vector3 as Cs}from"three";import{jsx as dr,jsxs as Vu}from"react/jsx-runtime";var yM=.02;function nf(e,t){let n=pi(null),i=Uu(l=>l.scene),r=pi(null),o=ro(()=>new Cs(...e.anchorLocalPosition??e.localPosition??e.worldPosition),[e.anchorLocalPosition,e.localPosition,e.worldPosition]),a=ro(()=>new Cs,[]),s=ro(()=>new Cs,[]),c=ro(()=>new Cs,[]);return no(()=>{r.current=null},[e.anchorNodeName]),tf(({camera:l})=>{let u=n.current,d=u?.parent;if(!u||!d)return;let h=r.current;if(e.anchorNodeName&&(!h||!h.parent)&&(h=zr(i,e.anchorNodeName),r.current=h),h?(h.updateWorldMatrix(!0,!1),a.copy(o).applyMatrix4(h.matrixWorld)):(a.copy(o),d.localToWorld(a)),t){let b=t.current.get(e.id);b||(b=new Cs,t.current.set(e.id,b)),b.copy(a)}c.copy(l.position).sub(a),c.lengthSq()>0?(c.normalize(),s.copy(a).addScaledVector(c,yM)):s.copy(a),d.worldToLocal(s),u.position.copy(s)}),n}function vM({annotation:e,occluders:t,worldPositionsRef:n,onClick:i,onHover:r,showAnnotationOnHover:o}){let[a,s]=ta(!1),c=nf(e,n),[l,u]=ta(!1),[d,h]=ta(1),b=pi(null),m=pi(null),y=pi(null);no(()=>()=>{b.current&&(clearTimeout(b.current),b.current=null),y.current&&(clearTimeout(y.current),y.current=null)},[]);let k=v=>{v.stopPropagation(),v.preventDefault(),b.current&&(clearTimeout(b.current),b.current=null),b.current=window.setTimeout(()=>{i?.(e),b.current=null},10)},w=v=>{v.stopPropagation(),u(!0),h(100),y.current&&(clearTimeout(y.current),y.current=null),r?.(e),o&&i?.(e)},p=v=>{v.stopPropagation(),u(!1),h(1),y.current&&clearTimeout(y.current),y.current=window.setTimeout(()=>{r?.(null),o&&r?.(null),y.current=null},50)},g=v=>{v.stopPropagation();let M=v.currentTarget;M.dataset.pointerX=String(v.clientX),M.dataset.pointerY=String(v.clientY)},S=v=>{v.stopPropagation();let M=v.currentTarget,D=parseFloat(M.dataset.pointerX||"0"),x=parseFloat(M.dataset.pointerY||"0"),C=v.clientX-D,P=v.clientY-x;Math.sqrt(C*C+P*P)<10&&k(v)};return dr("group",{ref:c,children:dr(ef,{center:!0,occlude:t,onOcclude:s,pointerEvents:a?"none":"auto",zIndexRange:[1,200],style:{pointerEvents:a?"none":"auto",zIndex:d},className:"annotation-html-wrapper",transparent:!0,children:dr("div",{ref:m,className:`ri-annotationMarker ${l?"ri-annotationMarker--hovered":""}`,title:e.title,style:{display:a?"none":"flex"},onPointerDown:g,onPointerUp:S,onPointerEnter:w,onPointerLeave:p,onDoubleClick:v=>{v.stopPropagation(),i?.(e)},role:"button",tabIndex:0,"aria-label":`Annotation ${e.id}`,children:dr("span",{className:"ri-annotationMarker-id",children:e.id})})})})}function wM({annotation:e,occluders:t,popupRef:n,onClose:i,hideCloseButton:r=!1}){let[o,a]=ta(!1),s=nf(e),c=Vu("div",{ref:n,className:"ri-viewAnnotationPopup",style:{display:o?"none":"block"},onPointerDown:l=>l.stopPropagation(),onClick:l=>l.stopPropagation(),children:[Vu("div",{className:"ri-viewAnnotationHeader",children:[dr("h4",{className:"ri-viewAnnotationTitle",children:e.title}),!r&&dr("button",{onClick:l=>{l.stopPropagation(),i?.()},className:"ri-viewAnnotationClose","aria-label":"Close annotation",children:"\xD7"})]}),e.description&&dr("p",{className:"ri-viewAnnotationDescription",children:e.description})]});return dr("group",{ref:s,children:dr(ef,{occlude:t,onOcclude:a,pointerEvents:o?"none":"auto",zIndexRange:[1e3,2e3],style:{pointerEvents:o?"none":"auto",zIndex:1e3},transparent:!0,children:c})})}function Gu({annotations:e,sceneConfig:t,activeAnnotation:n,popupRef:i,canvasRootRef:r,worldPositionsRef:o,modelLoaded:a,onAnnotationClick:s,onAnnotationHover:c,onCloseAnnotation:l,hideCloseButton:u=!1,showAnnotationOnHover:d=!1}){let h=Uu(N=>N.invalidate),b=Uu(N=>N.scene),[m,y]=ta(null),[k,w]=ta(!1),p=pi(null),g=pi(null),S=pi(null),v=ro(()=>{let N=[];return b.traverse(R=>{let F=R;F.isMesh&&!F.isSkinnedMesh&&N.push({current:R})}),N},[b,e,a]),M=ea(()=>{h();let N=()=>{h(),g.current=window.requestAnimationFrame(()=>{h(),g.current=null})};g.current=window.requestAnimationFrame(N)},[h]);no(()=>{M()},[e,M]),no(()=>{M()},[n,M]),no(()=>()=>{g.current!==null&&window.cancelAnimationFrame(g.current),S.current&&clearTimeout(S.current)},[]);let D=k?m:n||m,x=ro(()=>D?e.find(N=>N.id===D.id)??D:null,[D,e]),C=ea(N=>{if(k&&m?.id===N.id){w(!1),y(null),l?.();return}w(!0),y(N),s?.(N)},[k,m,s,l]),P=ea(N=>{c?.(N),d&&!k&&(S.current&&(clearTimeout(S.current),S.current=null),N?y(N):S.current=window.setTimeout(()=>{y(null),l?.(),S.current=null},100))},[k,c,d,l]),_=ea(()=>{w(!1),y(null),l?.()},[l]),z=ea(N=>{let R=N.target;if(R.closest?.(".ri-annotationMarker")||R.closest?.(".ri-viewAnnotationPopup")||R.closest?.(".annotation-html-wrapper"))return;let F=r.current;F&&F.contains(R)&&(w(!1),y(null),l?.())},[r,l]),L=ea(N=>{N.key==="Escape"&&k&&(w(!1),y(null),l?.())},[k,l]);no(()=>{let N=r.current;return N&&(N.addEventListener("click",z),N.addEventListener("pointerdown",z)),document.addEventListener("keydown",L),()=>{N&&(N.removeEventListener("click",z),N.removeEventListener("pointerdown",z)),document.removeEventListener("keydown",L)}},[r,z,L]);let I=ro(()=>(t?.model.rotation??[0,0,0]).map(N=>N*Math.PI/180),[t?.model.rotation]);return no(()=>{h()},[h,I]),tf((N,R)=>{if(!p.current)return;p.current.rotation.x=ju.lerp(p.current.rotation.x,I[0],1-Math.exp(-5*R)),p.current.rotation.y=ju.lerp(p.current.rotation.y,I[1],1-Math.exp(-5*R)),p.current.rotation.z=ju.lerp(p.current.rotation.z,I[2],1-Math.exp(-5*R));let{rotation:F}=p.current;Math.abs(F.x-I[0])+Math.abs(F.y-I[1])+Math.abs(F.z-I[2])>1e-4&&h()}),Vu("group",{ref:p,children:[e.map(N=>{let R=`${N.worldPosition.join(",")}-${N.title}-${N.id}`;return dr(vM,{annotation:N,occluders:v,worldPositionsRef:o,onClick:C,onHover:P,showAnnotationOnHover:d},R)}),x?dr(wM,{annotation:x,occluders:v,popupRef:i,onClose:_,hideCloseButton:u},`popup-${x.id}`):null]})}import{useEffect as CM,useMemo as rf}from"react";import{Html as af,Line as SM}from"@react-three/drei";import{BoxGeometry as MM,EdgesGeometry as TM,Vector3 as of}from"three";import{jsx as $r,jsxs as na}from"react/jsx-runtime";var PM="#22d3ee",kM="#facc15";function mc(e,t){let n=e<10?e.toFixed(3):e.toFixed(2);return t?`${n} ${t}`:n}function _M(e,t){return[(e[0]+t[0])/2,(e[1]+t[1])/2,(e[2]+t[2])/2]}function gc({position:e,children:t}){return $r(af,{center:!0,position:e,zIndexRange:[20,0],children:$r("div",{className:"ri-measureLabel",children:t})})}function AM({box:e,unit:t}){let n=rf(()=>[(e.min[0]+e.max[0])/2,(e.min[1]+e.max[1])/2,(e.min[2]+e.max[2])/2],[e.min,e.max]),i=rf(()=>{let[s,c,l]=e.size;return new TM(new MM(s||1e-4,c||1e-4,l||1e-4))},[e.size]);CM(()=>()=>{i.dispose()},[i]);let[r,o,a]=e.size;return na("group",{position:n,children:[$r("lineSegments",{geometry:i,children:$r("lineBasicMaterial",{color:kM})}),na(gc,{position:[0,-o/2,a/2],children:["W ",mc(r,t)]}),na(gc,{position:[-r/2,0,a/2],children:["H ",mc(o,t)]}),na(gc,{position:[r/2,-o/2,0],children:["D ",mc(a,t)]})]})}function Hu({points:e,unit:t,box:n,showDimensions:i}){return na("group",{children:[e.map(r=>$r(af,{center:!0,position:r.position,zIndexRange:[15,0],children:$r("div",{className:"ri-measureDot"})},r.id)),e.slice(1).map((r,o)=>{let a=e[o].position,s=r.position,c=new of(...a).distanceTo(new of(...s));return na("group",{children:[$r(SM,{points:[a,s],color:PM,lineWidth:2}),$r(gc,{position:_M(a,s),children:mc(c,t)})]},`${e[o].id}-${r.id}`)}),i&&n?$r(AM,{box:n,unit:t}):null]})}import{forwardRef as EM,useCallback as Ss,useEffect as sf,useImperativeHandle as RM,useMemo as lf,useRef as xn}from"react";import{useXR as cf,useXRHitTest as LM,useXRInputSourceEvent as BM}from"@react-three/xr";import{useFrame as DM}from"@react-three/fiber";import{Matrix4 as OM,Vector3 as df}from"three";import{Fragment as UM,jsx as Ms,jsxs as mf}from"react/jsx-runtime";var NM=1,uf=1,IM=.1,zM=10;function FM(e,t){let[n,i,r]=e.size,o=(e.min[0]+e.max[0])/2,a=(e.min[2]+e.max[2])/2,s=Math.max(n,i,r)||1;return{scale:t==="real-world"?1:NM/s,offset:[-o,-e.min[1],-a]}}function pf(e){let t=e[0].clientX-e[1].clientX,n=e[0].clientY-e[1].clientY;return Math.hypot(t,n)}function hf(e){let t=e[0].clientX-e[1].clientX,n=e[0].clientY-e[1].clientY;return Math.atan2(n,t)}var jM=EM(function({box:t,scaleMode:n,children:i,onARStateChange:r},o){let a=xn(null),s=xn(null),c=xn(null),l=cf(R=>R.session!=null),u=cf(R=>R.mode==="immersive-ar"),d=lf(()=>t?FM(t,n):null,[t,n]),h=xn(new df(0,0,-uf)),b=xn(1),m=xn(0),y=xn(!0),k=xn(!1),w=lf(()=>new OM,[]),p=xn(new df),g=xn(!1),S=xn(null),v=xn(!1),M=xn(0),D=xn(0),x=xn(1),C=xn(0),P=Ss(()=>{if(!r||!u)return;let R={canPlace:g.current,isPlacementMode:y.current,isModelPlaced:k.current},F=S.current;F&&F.canPlace===R.canPlace&&F.isPlacementMode===R.isPlacementMode&&F.isModelPlaced===R.isModelPlaced||(S.current=R,r(R))},[u,r]),_=Ss(()=>!u||!g.current?!1:(h.current.copy(p.current),k.current=!0,y.current=!1,P(),!0),[P,u]),z=Ss(()=>{u&&(y.current=!0,P())},[P,u]),L=Ss(()=>{let R=_();return!R&&u&&(y.current=!1,P()),R},[P,u,_]),I=Ss(()=>{u&&(y.current=!1,P())},[P,u]);RM(o,()=>({placeCurrent:_,startPlacementMode:z,finishPlacementMode:L,cancelPlacementMode:I}),[I,L,_,z]),sf(()=>{if(!l){h.current.set(0,0,-uf),b.current=1,m.current=0,g.current=!1,v.current=!1,y.current=!0,k.current=!1,S.current=null;return}u&&(g.current=!1,v.current=!1,y.current=!0,k.current=!1,S.current=null,P())},[P,l,u]),LM((R,F)=>{if(!u||R.length===0){g.current&&(g.current=!1,P());return}F(w,R[0])&&(p.current.setFromMatrixPosition(w),g.current||(g.current=!0,P()))},"viewer"),BM("all","select",()=>{!u||v.current||!y.current||_()},[u,_]),sf(()=>{if(!u)return;let R=Z=>{Z.touches.length===2&&(v.current=!0,M.current=pf(Z.touches),D.current=hf(Z.touches),x.current=b.current,C.current=m.current)},F=Z=>{if(!v.current||Z.touches.length!==2)return;Z.preventDefault();let ie=pf(Z.touches);if(M.current>0){let He=ie/M.current;b.current=Math.min(zM,Math.max(IM,x.current*He))}let ve=hf(Z.touches);m.current=C.current-(ve-D.current)},G=Z=>{Z.touches.length===0&&requestAnimationFrame(()=>{v.current=!1})};return window.addEventListener("touchstart",R),window.addEventListener("touchmove",F,{passive:!1}),window.addEventListener("touchend",G),window.addEventListener("touchcancel",G),()=>{window.removeEventListener("touchstart",R),window.removeEventListener("touchmove",F),window.removeEventListener("touchend",G),window.removeEventListener("touchcancel",G)}},[u]),DM(()=>{let R=a.current,F=s.current;if(!R||!F)return;!l||!d?(R.visible=!0,R.position.set(0,0,0),R.rotation.set(0,0,0),F.scale.setScalar(1)):(R.visible=!u||k.current,R.position.copy(h.current),R.rotation.set(0,m.current,0),F.scale.setScalar(d.scale*b.current));let G=c.current;if(G){let Z=u&&y.current&&g.current;G.visible=Z,Z&&G.position.copy(p.current)}});let N=l&&d?d.offset:[0,0,0];return mf(UM,{children:[mf("mesh",{ref:c,visible:!1,rotation:[-Math.PI/2,0,0],children:[Ms("ringGeometry",{args:[.05,.07,32]}),Ms("meshBasicMaterial",{color:"#22d3ee",transparent:!0,opacity:.95})]}),Ms("group",{ref:a,children:Ms("group",{ref:s,children:Ms("group",{position:N,children:i})})})]})}),gf=jM;import{useEffect as bc,useMemo as Mr,useRef as hi}from"react";import{useFrame as VM,useThree as GM}from"@react-three/fiber";import{Box3 as HM,CatmullRomCurve3 as bf,Sphere as WM,Spherical as $M,Vector3 as mi}from"three";var XM=1.2;function Wu({controlsRef:e,sceneRef:t,config:n,playing:i,resetOnPlay:r=!1,onFinished:o,onUserInteract:a,onStop:s}){let c=GM(I=>I.invalidate),l=Mr(()=>n.waypoints??[],[n.waypoints]),u=l.length>=2,d=n.loop??!0,h=Mr(()=>{if(l.length<2)return 24;let I=0;for(let N=0;N<l.length-1;N++)I+=l[N].segmentDuration??3.5;return d&&l.length>1&&(I+=l[l.length-1].segmentDuration??3.5),Math.max(I,4)},[l,d]),b=n.duration??h,m=Mr(()=>l.map(I=>[...I.position,...I.target,I.azimuthAngle??"",I.polarAngle??"",I.segmentDuration??""].join(",")).join(";"),[l]),y=Mr(()=>{let I=[];if(l.length<2)return I;let N=0;for(let R=0;R<l.length-1;R++)N+=l[R].segmentDuration??3.5,I.push(N);return d&&l.length>1&&(N+=l[l.length-1].segmentDuration??3.5,I.push(N)),I},[l,d]),k=Mr(()=>I=>{if(l.length<2||y.length===0)return I/b;let N=y[y.length-1],R=d?I%b:Math.min(I,b),F=b>0?R/b*N:0;for(let G=0;G<y.length;G++)if(F<=y[G]){let Z=G===0?0:y[G-1],ie=y[G]-Z,ve=ie>0?(F-Z)/ie:0,He=d?l.length:l.length-1,Dt=G/He,pt=1/He;return Dt+ve*pt}return 1},[l.length,y,b,d]),w=Mr(()=>u?{position:new bf(l.map(I=>new mi(...I.position)),d,"catmullrom",.5),target:new bf(l.map(I=>new mi(...I.target)),d,"catmullrom",.5)}:null,[m,u,d]),p=Mr(()=>{if(!u||!l.every(N=>Number.isFinite(N.azimuthAngle)&&Number.isFinite(N.polarAngle)))return null;let I=l.map(N=>({azimuth:N.azimuthAngle,polar:N.polarAngle,distance:new mi(...N.position).distanceTo(new mi(...N.target))}));for(let N=1;N<I.length;N+=1){let R=I[N-1].azimuth,F=I[N].azimuth;I[N].azimuth=F+Math.round((R-F)/(Math.PI*2))*Math.PI*2}return I},[m,u]),g=hi(0),S=hi(0),v=hi(new mi),M=hi(new mi),D=hi(!1),x=hi(0),C=hi(!1),P=hi(null),_=Mr(()=>new mi,[]),z=Mr(()=>new mi,[]),L=Mr(()=>new $M,[]);return bc(()=>{g.current=0,x.current=0,S.current=0,C.current=!1},[m,d,b]),bc(()=>{r&&(x.current=0,g.current=0,C.current=!1)},[r]),bc(()=>{if(!i){D.current=!1,g.current>0&&!r?x.current=g.current:r&&(x.current=0),(g.current>0||C.current)&&s?.();return}g.current>=b&&!d&&(g.current=0,x.current=0,C.current=!1);let I=e.current;if(I&&(I.getPosition(v.current),I.getTarget(M.current)),r||C.current||x.current===0?(g.current=0,x.current=0,C.current=!1):x.current>0&&x.current<b?g.current=x.current:(g.current=0,x.current=0),S.current=0,!u){let N=t.current;if(N){let R=new HM().setFromObject(N).getBoundingSphere(new WM);P.current={center:R.center.clone(),radius:R.radius>0?R.radius:1}}}D.current=!0,c()},[i,u,e,t,c,b,d,m,r,s]),bc(()=>{if(!i||!a)return;let I=e.current;if(!I)return;let N=()=>{C.current||a()};return I.addEventListener("controlstart",N),()=>I.removeEventListener("controlstart",N)},[i,e,a]),VM((I,N)=>{if(!i||!D.current)return;let R=e.current;if(!R)return;g.current+=N,S.current+=N;let F=k(g.current),G=!d&&g.current>=b;if(F=d?F%1:Math.min(F,1),w)if(w.target.getPoint(F,z),p){let ie=d?p.length:p.length-1,ve=Math.min(F,1)*ie,He=Math.min(Math.floor(ve),ie-1),Dt=(He+1)%p.length,pt=F>=1?1:ve-He,kt=pt*pt*(3-2*pt),Re=p[He],et=p[Dt],Kt=et.azimuth+Math.round((Re.azimuth-et.azimuth)/(Math.PI*2))*Math.PI*2,kn=Re.azimuth+(Kt-Re.azimuth)*kt,ft=Re.polar+(et.polar-Re.polar)*kt,Le=Re.distance+(et.distance-Re.distance)*kt;L.set(Math.max(Le,1e-6),Math.min(Math.max(ft,1e-6),Math.PI-1e-6),kn),_.setFromSpherical(L).add(z)}else w.position.getPoint(F,_);else{let ie=P.current;if(!ie)return;let ve=F*Math.PI*2,He=ie.radius*2.2;_.set(ie.center.x+Math.cos(ve)*He,ie.center.y+ie.radius*.6,ie.center.z+Math.sin(ve)*He),z.copy(ie.center)}let Z=Math.min(S.current/XM,1);if(Z<1){let ie=Z*Z*(3-2*Z);_.lerpVectors(v.current,_,ie),z.lerpVectors(M.current,z,ie)}if(R.setLookAt(_.x,_.y,_.z,z.x,z.y,z.z,!1),G){D.current=!1,C.current=!0,g.current=0,x.current=0,o?.();return}c()}),null}import{useEffect as JM,useState as ZM}from"react";var qM="ri:license-grant:v1",YM={"260cd89ea13f":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwjr3ofKTkkcxOM0GYl/RlJj9JsuyjSF8sYmCd2YqsHJCEO8EvlNDrO2Kl4agFKo6dRhyR2/oWeiU6P9WIqRbvw=="},ff=new Map;function yf(e){let t=atob(e);return Uint8Array.from(t,n=>n.charCodeAt(0)).buffer}function xf(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");return yf(t.padEnd(Math.ceil(t.length/4)*4,"="))}function KM(e){if(!e||typeof e!="object")return!1;let t=e;return t.version===1&&typeof t.licenseKeyHash=="string"&&typeof t.domain=="string"&&(t.environment==="development"||t.environment==="production")&&typeof t.tier=="string"&&t.tier.length>0&&typeof t.issuedAt=="number"&&Number.isInteger(t.issuedAt)&&typeof t.expiresAt=="number"&&Number.isInteger(t.expiresAt)}async function fc(e){let t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e.trim())),n=String.fromCharCode(...new Uint8Array(t));return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function $u(e,t){return`${qM}:${t}:${e}`}function QM(e,t){let n=ff.get(e);if(n)return n;let i=crypto.subtle.importKey("spki",yf(t),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]);return ff.set(e,i),i}async function Xu(e,t,n){if(!globalThis.crypto?.subtle)return null;try{let[i,r,o,a,...s]=e.split("."),c=YM[r];if(i!=="ri1"||!c||!o||!a||s.length>0)return null;let l=JSON.parse(new TextDecoder().decode(xf(o)));if(!KM(l)||!await crypto.subtle.verify({name:"ECDSA",hash:"SHA-256"},await QM(r,c),xf(a),new TextEncoder().encode(`${i}.${r}.${o}`)))return null;let d=Math.floor(Date.now()/1e3),h=l.expiresAt-l.issuedAt;return l.licenseKeyHash!==t||l.domain!==n||l.expiresAt<=d||l.issuedAt>d+300||h<=0||h>43200?null:{environment:l.environment,tier:l.tier,expiresAt:l.expiresAt}}catch{return null}}async function vf(e,t,n){try{return await Xu(e,await fc(t),n)}catch{return null}}async function wf(e,t,n){try{let i=await fc(t);return await Xu(e,i,n)?(localStorage.setItem($u(i,n),e),!0):!1}catch{return!1}}async function Cf(e,t){try{let n=await fc(e),i=$u(n,t),r=localStorage.getItem(i);if(!r)return null;let o=await Xu(r,n,t);return o||localStorage.removeItem(i),o}catch{return null}}async function qu(e,t){try{let n=await fc(e);localStorage.removeItem($u(n,t))}catch{}}var eT=["localhost","127.0.0.1","0.0.0.0"],tT=e=>eT.includes(e)||e.endsWith(".local")||e.endsWith(".localhost"),Mf="https://react-immersive.liveroom.dev/api/validate-license",nT=()=>typeof window<"u",rT=300*1e3,iT=5e3,oT=400,Ku=new Map,Yu=new Map,gi=class extends Error{},Tf=async(e,t,n)=>{let i=await Cf(e,t);return i?(console.warn("[react-immersive] License server unreachable \u2014 using a previously verified, time-limited offline grant."),{status:"valid",reason:"Previously verified offline grant",environment:i.environment,tier:i.tier,isLocalDomain:n}):null},Sf=async(e,t,n)=>{let i=await Tf(e,t,n);return i||(console.warn("[react-immersive] License server unreachable and no valid offline grant is available \u2014 license validation failed."),{status:"invalid",reason:"Could not reach license server",isLocalDomain:n})},aT=e=>e instanceof gi||e instanceof TypeError,sT=()=>new Promise(e=>setTimeout(e,oT)),lT=e=>e==="development"||e==="production",cT=e=>{if(!e||typeof e!="object")return!1;let t=e;return!(typeof t.valid!="boolean"||t.reason!==void 0&&typeof t.reason!="string"||t.environment!==void 0&&!lT(t.environment)||t.tier!==void 0&&typeof t.tier!="string"||t.offlineGrant!==void 0&&typeof t.offlineGrant!="string")},dT=e=>{if(!e||typeof e!="object")return null;let t=e,n=t.reason??t.error;return typeof n=="string"&&n.trim()?n:null},uT=(e,t,n)=>`${n}::${e}::${t}`,pT=e=>{let t=Ku.get(e);return t?Date.now()-t.timestamp>rT?(Ku.delete(e),null):t.result:null},hT=(e,t)=>({status:e.valid?"valid":"invalid",reason:e.reason,environment:e.environment,tier:e.tier,isLocalDomain:t}),mT=(e,t)=>({status:"invalid",reason:e,isLocalDomain:t});async function gT(e,t,n,i){let r=uT(e,t,i),o=pT(r);if(o)return o;let a=Yu.get(r);if(a)return a;let s=(async()=>{for(let c=0;c<2;c+=1)try{return await bT(e,t,n,r,i)}catch(l){if(!aT(l))throw l;if(c===0){let u=await Tf(e,t,n);if(u)return u;await sT();continue}return Sf(e,t,n)}return Sf(e,t,n)})().finally(()=>{Yu.delete(r)});return Yu.set(r,s),s}async function bT(e,t,n,i,r){let o=new AbortController,a=setTimeout(()=>o.abort(),iT),s;try{s=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},cache:"no-store",signal:o.signal,body:JSON.stringify({licenseKey:e,domain:t})})}catch(u){throw o.signal.aborted?new gi("License validation timed out"):u}finally{clearTimeout(a)}let c;try{c=await s.json()}catch{throw new gi(`License server returned a non-JSON response${s.status?` (${s.status})`:""}`)}if(!s.ok){if(s.status===429||s.status>=500)throw new gi(`License server error (${s.status})`);let u=dT(c)??`License validation failed${s.status?` (${s.status})`:""}`;return await qu(e,t),mT(u,n)}if(!cT(c))throw new gi("License server returned an unexpected payload");let l=hT(c,n);if(l.status==="valid"&&r!==Mf){let u=c.offlineGrant?await vf(c.offlineGrant,e,t):null;if(!u)throw new gi("License validation endpoint did not return a verifiable signed grant");l={...l,environment:u.environment,tier:u.tier}}return l.status==="valid"?(Ku.set(i,{result:l,timestamp:Date.now()}),c.offlineGrant&&(await wf(c.offlineGrant,e,t)||console.warn("[react-immersive] The license server returned an invalid offline grant; it was not cached."))):await qu(e,t),l}var xc=(e,t=Mf)=>{let[n,i]=ZM({status:"checking",isLocalDomain:!1});return JM(()=>{if(!nT())return;let r=!1,o=u=>{r||i(u)},a=e.trim(),s=window.location.hostname.toLowerCase(),c=tT(s);return o({status:"checking",isLocalDomain:c}),a?((async()=>{try{o(await gT(a,s,c,t))}catch(u){let d=u instanceof TypeError?"Could not reach license server":u instanceof Error?u.message:"License validation failed";o({status:"invalid",reason:d,isLocalDomain:c})}})(),()=>{r=!0}):(o({status:"invalid",reason:"No license key provided",isLocalDomain:c}),()=>{r=!0})},[e,t]),n};import{useRef as io,useState as fT,useCallback as Tr,useEffect as xT}from"react";import{jsx as In,jsxs as Qu}from"react/jsx-runtime";var yT={up:{width:38,height:22},down:{width:38,height:22},left:{width:22,height:38},right:{width:22,height:38}},vT={up:"4 16 12 8 20 16",down:"4 8 12 16 20 8",left:"16 4 8 12 16 20",right:"8 4 16 12 8 20"},yc=({direction:e})=>{let t=yT[e],n=vT[e];return Qu("svg",{"aria-hidden":"true",className:"mc__arrow-icon",focusable:"false",viewBox:"0 0 24 24",width:t.width,height:t.height,fill:"none",xmlns:"http://www.w3.org/2000/svg",style:{display:"block",width:`${t.width}px`,height:`${t.height}px`,pointerEvents:"none",padding:0,margin:0,overflow:"visible"},children:[In("polyline",{points:n,stroke:"rgba(0, 0, 0, 0.9)",strokeWidth:"6",strokeLinecap:"round",strokeLinejoin:"round"}),In("polyline",{points:n,stroke:"#2095F2",strokeWidth:"4",strokeLinecap:"round",strokeLinejoin:"round"})]})},Xr=16,wT={"bottom-left":{bottom:Xr,left:Xr,top:"auto",right:"auto",transform:"none"},"bottom-right":{bottom:Xr,right:Xr,top:"auto",left:"auto",transform:"none"},"top-left":{top:Xr,left:Xr,bottom:"auto",right:"auto",transform:"none"},"top-right":{top:Xr,right:Xr,bottom:"auto",left:"auto",transform:"none"},center:{top:"50%",left:"50%",bottom:"auto",right:"auto",transform:"translate(-50%, -50%)"},"center-bottom":{bottom:-10,left:"50%",top:"auto",right:"auto",transform:"translateX(-50%)"},"center-top":{top:Xr,left:"50%",bottom:"auto",right:"auto",transform:"translateX(-50%)"}},CT=({controlsRef:e,enabled:t=!0,opacity:n=.9,moveSensitivity:i=.001,rotateSensitivity:r=.01,position:o="center-bottom"})=>{let a=io(null),[s,c]=fT({x:0,y:0}),l=io(!1),u=io({x:0,y:0}),d=io(),h=io(),b=io(null),m=io(0),y=()=>e.current,k=(L,I,N)=>{let R=Math.hypot(L,I);if(R>N){let F=N/R;return{x:L*F,y:I*F}}return{x:L,y:I}},w=L=>{let N=Math.abs(L);return N<.12?0:Math.sign(L)*((N-.12)/(1-.12))},p=Tr(()=>{let L=()=>{let{x:I,y:N}=u.current,R=w(I),F=w(N);if(t&&(R!==0||F!==0)){let G=y();G&&G.rotate(-R*r,-F*r,!0)}d.current=requestAnimationFrame(L)};d.current=requestAnimationFrame(L)},[t,r]),g=Tr(()=>{d.current&&cancelAnimationFrame(d.current)},[]),S=Tr((L,I)=>{if(!a.current||!l.current)return;let N=a.current.getBoundingClientRect(),R=N.left+N.width/2,F=N.top+N.height/2,G=N.width/2-18,Z=L-R,ie=I-F,ve=k(Z,ie,G);c(ve),u.current={x:ve.x/G,y:ve.y/G}},[]),v=Tr(L=>{if(!t)return;L.preventDefault(),L.stopPropagation(),l.current=!0,p();let I="touches"in L?L.touches[0]:L;S(I.clientX,I.clientY)},[t,p,S]),M=Tr(L=>{if(!l.current)return;L.preventDefault();let I="touches"in L?L.touches[0]:L;S(I.clientX,I.clientY)},[S]),D=Tr(()=>{l.current=!1,c({x:0,y:0}),u.current={x:0,y:0},g()},[g]),x=i*10,C=Tr(L=>{t&&y()?.forward(L*x,!0)},[t,x]),P=Tr(L=>{t&&y()?.truck(L*x,0,!0)},[t,x]),_=Tr((L,I,N)=>{if(!t)return;h.current&&cancelAnimationFrame(h.current),b.current={control:L,amount:I,action:N},m.current=0,N(I);let R=F=>{if(!b.current)return;if(m.current===0){m.current=F,h.current=requestAnimationFrame(R);return}if(F-m.current>200){let{amount:Z,action:ie}=b.current;ie(Z),m.current=F}h.current=requestAnimationFrame(R)};h.current=requestAnimationFrame(R)},[t]),z=Tr(L=>{b.current?.control===L&&(h.current&&(cancelAnimationFrame(h.current),h.current=void 0),b.current=null,m.current=0)},[]);return xT(()=>(window.addEventListener("mousemove",M),window.addEventListener("mouseup",D),window.addEventListener("touchmove",M,{passive:!1}),window.addEventListener("touchend",D),window.addEventListener("touchcancel",D),()=>{window.removeEventListener("mousemove",M),window.removeEventListener("mouseup",D),window.removeEventListener("touchmove",M),window.removeEventListener("touchend",D),window.removeEventListener("touchcancel",D),g(),h.current&&cancelAnimationFrame(h.current)}),[M,D,g]),t?In("div",{className:"mc__wrapper",style:{opacity:n,...wT[o]},children:Qu("div",{className:"mc__dpad",children:[In("button",{"aria-label":"Move forward",className:"mc__arrow mc__arrow--up",onMouseDown:()=>_("up",1,C),onMouseUp:()=>z("up"),onMouseLeave:()=>z("up"),onTouchStart:L=>{L.preventDefault(),_("up",1,C)},onTouchEnd:()=>z("up"),onTouchCancel:()=>z("up"),children:In(yc,{direction:"up"})}),Qu("div",{className:"mc__middle-row",children:[In("button",{"aria-label":"Move left",className:"mc__arrow mc__arrow--left",onMouseDown:()=>_("left",-1,P),onMouseUp:()=>z("left"),onMouseLeave:()=>z("left"),onTouchStart:L=>{L.preventDefault(),_("left",-1,P)},onTouchEnd:()=>z("left"),onTouchCancel:()=>z("left"),children:In(yc,{direction:"left"})}),In("div",{ref:a,className:"mc__joystick",onMouseDown:v,onTouchStart:v,children:In("div",{className:"mc__knob",style:{transform:`translate(${s.x}px, ${s.y}px)`}})}),In("button",{"aria-label":"Move right",className:"mc__arrow mc__arrow--right",onMouseDown:()=>_("right",1,P),onMouseUp:()=>z("right"),onMouseLeave:()=>z("right"),onTouchStart:L=>{L.preventDefault(),_("right",1,P)},onTouchEnd:()=>z("right"),onTouchCancel:()=>z("right"),children:In(yc,{direction:"right"})})]}),In("button",{"aria-label":"Move backward",className:"mc__arrow mc__arrow--down",onMouseDown:()=>_("down",-1,C),onMouseUp:()=>z("down"),onMouseLeave:()=>z("down"),onTouchStart:L=>{L.preventDefault(),_("down",-1,C)},onTouchEnd:()=>z("down"),onTouchCancel:()=>z("down"),children:In(yc,{direction:"down"})})]})}):null},Pf=CT;import{HexColorPicker as ST}from"react-colorful";import{jsx as vc,jsxs as kf}from"react/jsx-runtime";var Ju=({colorPicker:e,onClose:t,itemMaterials:n,setItemMaterials:i,inline:r=!1})=>kf("div",{className:`ri-popover${r?" ri-popover--inline":""}`,style:r?{padding:12}:{left:e.x,top:e.y,width:"min(225px, calc(100vw - 24px))",padding:12},onPointerDown:o=>o.stopPropagation(),children:[vc("p",{className:"ri-popoverLabel",children:"Color"}),vc(ST,{color:n[e.objectId]?.hex??"#ffffff",onChange:o=>i(a=>({...a,[e.objectId]:{...a[e.objectId],hex:o}}))}),kf("div",{className:"ri-inlineRow",children:[vc("span",{className:"ri-colorCode",children:n[e.objectId]?.hex??"#ffffff"}),vc("button",{className:"ri-secondaryButton",onClick:t,children:"Done"})]})]});import{jsx as Pr,jsxs as Zu}from"react/jsx-runtime";var ep=({materialPopup:e,textureUrl:t,triggerFileUpload:n,clearTexture:i,inline:r=!1})=>Zu("div",{className:`ri-popover${r?" ri-popover--inline":""}`,style:r?{overflow:"hidden"}:{left:e.x,top:e.y,width:"min(300px, calc(100vw - 24px))",overflow:"hidden"},onPointerDown:o=>o.stopPropagation(),children:[Pr("div",{className:"ri-popoverHeader",children:Pr("p",{className:"ri-popoverLabel",style:{marginBottom:0},children:"Material"})}),Zu("div",{className:"ri-materialBody",children:[t?Pr("div",{className:"ri-previewFrame",children:Pr("img",{src:t,alt:"texture preview",className:"ri-previewImage"})}):Zu("div",{className:"ri-emptyState",children:[Pr("svg",{width:"24",height:"24",fill:"none",stroke:"currentColor",strokeWidth:1.5,viewBox:"0 0 24 24",children:Pr("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M2.25 15.75l5.159-5.159a2.25 2.25 0 013.182 0l5.159 5.159m-1.5-1.5l1.409-1.409a2.25 2.25 0 013.182 0l2.909 2.909M3 21h18M3 3h18"})}),Pr("span",{style:{fontSize:12},children:"No texture applied"})]}),Pr("button",{onClick:()=>n(e.objectId),className:"ri-uploadButton",children:t?"Replace image":"Upload image"}),t&&Pr("button",{onClick:()=>i(e.objectId),className:"ri-removeButton",children:"Remove texture"}),Pr("p",{className:"ri-formatHint",children:"JPG \xB7 PNG \xB7 WebP"})]})]});import{Fragment as MT,useEffect as tp,useRef as TT,useState as np}from"react";import{Fragment as rp,jsx as an,jsxs as ra}from"react/jsx-runtime";function _f({entries:e}){return an(rp,{children:e.map(([t,n])=>{let i=n!==null&&typeof n=="object",r=i?Object.entries(n):[];return i&&r.length>0?ra("div",{className:"left-panel__data-group",children:[an("span",{className:"left-panel__data-key",children:t}),an("div",{className:"left-panel__data-children",children:an(_f,{entries:r})})]},t):ra("div",{className:"left-panel__data-row",children:[an("span",{className:"left-panel__data-key",children:t}),an("span",{className:`left-panel__data-value left-panel__data-value--${typeof n}`,children:i?Array.isArray(n)?"[]":"{}":String(n)})]},t)})})}function PT({content:e}){let t=e!=null,[n,i]=np(t),[r,o]=np(t),a=TT(e);return t&&(a.current=e),tp(()=>{if(t){i(!0);return}if(n){o(!1);let s=setTimeout(()=>i(!1),300);return()=>clearTimeout(s)}},[t,n]),tp(()=>{if(n&&t){let s=requestAnimationFrame(()=>o(!0));return()=>cancelAnimationFrame(s)}},[n,t]),n?an("div",{className:`left-panel__action-extra${r?" left-panel__action-extra--open":""}`,children:an("div",{className:"left-panel__action-extra-inner",children:e??a.current})}):null}function ip({isOpen:e,selectedObject:t,currentAction:n,onClose:i,onAction:r,renderActionExtra:o}){let[a,s]=np(t);tp(()=>{t&&s(t)},[t]);let c=t??a,l=c?Object.entries(c).filter(([u])=>u!=="actions"):[];return an("div",{className:`left-panel ${e?"left-panel--open":"left-panel--closed"}`,children:c&&ra(rp,{children:[ra("div",{className:"left-panel__header",children:[an("p",{className:"left-panel__title",children:c.label}),an("button",{onClick:i,className:"left-panel__close-btn","aria-label":"Close panel",children:"\u2715"})]}),l.length>0&&an("div",{className:"left-panel__data",children:an(_f,{entries:l})}),an("hr",{className:"left-panel__divider"}),c.actions&&c.actions.length>0&&ra(rp,{children:[an("div",{className:"left-panel__actions-label",children:"Actions"}),an("div",{className:"left-panel__actions-list",children:c.actions.map((u,d)=>{let h=n?.action.id===u.id&&(n.binding===c||n.binding?.id===c.id||n.binding?.modelObjectId===c.modelObjectId||n.objectId===c.id||n.objectId===c.modelObjectId),b=o?.(u.id);return ra(MT,{children:[an("button",{onClick:m=>r({objectId:c.modelObjectId||c.id||"",action:u,binding:c,screenX:m.clientX,screenY:m.clientY}),className:["left-panel__action-btn",`left-panel__action-btn--${u.id}`,h?"left-panel__action-btn--active":""].filter(Boolean).join(" "),"data-action-id":u.id,"data-label":u.label,children:u.label}),an(PT,{content:b})]},d)})})]})]})})}import{useMemo as _T,useState as Ef}from"react";import{Boxes as AT}from"lucide-react";import{useState as kT}from"react";import{jsx as qr,jsxs as Ts}from"react/jsx-runtime";function Af({openButtonLabel:e,openButtonAriaLabel:t,eyebrow:n,title:i,searchValue:r,onSearchChange:o,searchPlaceholder:a,children:s,isOpen:c,onToggle:l,openButtonIcon:u,closeButtonIcon:d,closeButtonAriaLabel:h}){let[b,m]=kT(!1),y=c!==void 0?c:b,k=w=>{c===void 0&&m(w),l?.(w)};return Ts("div",{className:`ri-sidepanel-wrap ${y?"ri-sidepanel-wrap--open":"ri-sidepanel-wrap--closed"}`,children:[!y&&Ts("button",{type:"button",className:"ri-sidepanel__open-btn",onClick:()=>k(!0),"aria-label":t,title:"Open panel",children:[u,e?qr("span",{children:e}):null]}),Ts("div",{className:`ri-sidepanel ${y?"ri-sidepanel--open":"ri-sidepanel--closed"}`,"aria-hidden":!y,children:[Ts("div",{className:"ri-sidepanel__header",children:[Ts("div",{className:"ri-sidepanel__header-top",children:[qr("span",{className:"ri-sidepanel__eyebrow",children:n}),qr("button",{type:"button",className:"ri-sidepanel__close-btn",onClick:()=>k(!1),"aria-label":h,title:"Close",children:d??qr("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:qr("path",{d:"M1 1L11 11M11 1L1 11",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"})})})]}),qr("p",{className:"ri-sidepanel__title",children:i})]}),qr("div",{className:"ri-sidepanel__search-wrap",children:qr("input",{className:"ri-sidepanel__search",type:"text",placeholder:a,value:r,onChange:w=>o(w.target.value)})}),qr("div",{className:"ri-sidepanel__list",children:s})]})]})}import{jsx as oo,jsxs as ET}from"react/jsx-runtime";function op({objectBindings:e,onAction:t,onFocus:n,onHover:i,isOpen:r,onToggle:o}){let[a,s]=Ef(null),[c,l]=Ef(""),u=_T(()=>Object.entries(e).filter(([d,h])=>{let b=c.toLowerCase();return d.toLowerCase().includes(b)||(h.label??"").toLowerCase().includes(b)}),[e,c]);return oo(Af,{openButtonLabel:"",openButtonAriaLabel:"Open scene objects panel",openButtonIcon:oo(AT,{width:16,height:16,"aria-hidden":"true"}),eyebrow:"SCENE OBJECTS",title:`${u.length} visible entries`,searchValue:c,onSearchChange:l,searchPlaceholder:"Search nodes, labels",isOpen:r,onToggle:o,closeButtonAriaLabel:"Close scene objects panel",children:u.map(([d,h])=>{let b=h.visible!==!1,m=a===d;return ET("div",{onClick:()=>n(h),onMouseEnter:()=>{s(d),i?.(h)},onMouseLeave:()=>{s(null),i?.(null)},className:`ri-sidepanel__row${m?" ri-sidepanel__row--hovered":""}`,children:[oo("span",{className:`ri-sidepanel__label${m?" ri-sidepanel__label--hovered":""}`,children:h.label??d}),oo("button",{type:"button",onClick:y=>{y.stopPropagation(),t?.({objectId:d,action:{id:"toggle-visibility",label:"Toggle Visibility",type:"command"},binding:h})},className:"ri-sidepanel__vis-btn",title:b?"Hide":"Show",children:oo("span",{className:`ri-sidepanel__checkbox${b?" ri-sidepanel__checkbox--checked":""}`,children:b&&oo("svg",{width:"9",height:"9",viewBox:"0 0 10 10",fill:"none",children:oo("path",{d:"M1.5 5L4 7.5L8.5 2.5",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})})})})]},d)})})}import{AlertTriangle as xp,Box as Yf,Camera as h2,Download as m2,Eraser as g2,FileImage as b2,RotateCcw as f2,ChevronLeft as x2,Square as Kf,ChevronRight as y2,RectangleGoggles as v2,QrCode as w2,X as yp,Expand as C2,Play as S2,Pause as M2,Smartphone as Qf,PencilRuler as T2,RulerDimensionLine as P2,Grid3X3 as k2,Orbit as _2}from"lucide-react";import{createContext as RT,useContext as LT}from"react";var ap=RT({isInsideEditor:!1,activeTab:"object",activeSubTab:"General",tier:"free"});var qn=()=>LT(ap);import{jsx as sp,jsxs as lp}from"react/jsx-runtime";function wc({visible:e,message:t,tone:n="default",progress:i}){if(!e)return null;let r=typeof i=="number"&&Number.isFinite(i),o=r?Math.min(Math.max(i,0),100):0,a=Math.round(o);return lp("div",{className:"bb-loadingOverlay",role:"status","aria-live":"polite",children:[r&&lp("div",{className:"bb-loadingProgressRow",children:[sp("div",{className:"bb-loadingProgress",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":a,children:sp("div",{className:"bb-loadingProgress__bar",style:{width:`${a}%`}})}),lp("span",{className:"bb-loadingProgress__label",children:[a,"%"]})]}),sp("span",{className:`bb-loadingMessage bb-status--${n}`,children:t})]})}import{useRef as Ut,useEffect as Ps,useMemo as Yn,useCallback as Cc,useSyncExternalStore as NT}from"react";import{useThree as IT,useFrame as zT}from"@react-three/fiber";import{Sphere as FT,PivotControls as jT}from"@react-three/drei";import{Vector3 as ur,Vector2 as UT,AdditiveBlending as cp,TextureLoader as VT,Matrix4 as GT,Quaternion as ia,Euler as Sc}from"three";var Rf="data:image/png;base64,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";var Lf="data:image/png;base64,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";var Bf="data:image/png;base64,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";import{Fragment as JT,jsx as dt,jsxs as Kn}from"react/jsx-runtime";var dp=-100,up=100,Uf=.03,HT=.03,WT=.03,Df=.5,$T=Rf,XT=Lf,qT=Bf,YT=Math.PI/4,Of=.4,oa=64,Nf=Uf*3,pp="#4d7dff",If="#ffcc00",zf=.02,KT=new ur(0,1,0),Mc=32,Ff="#ff9d3d",Tc=4;function hp(e){let t=new Float32Array((oa+1)*3);for(let n=0;n<=oa;n++){let i=n/oa*Math.PI*2,r=Math.cos(i)*Of,o=Math.sin(i)*Of,a=0,s=0,c=0;e==="x"?(s=r,c=o):e==="y"?(a=r,c=o):(a=r,s=o),t[n*3]=a,t[n*3+1]=s,t[n*3+2]=c}return t}function QT(e){let t=Math.abs(e.y)<.99?new ur(0,1,0):new ur(1,0,0),n=new ur().crossVectors(e,t).normalize(),i=new ur().crossVectors(e,n).normalize();return[n,i]}function jf(e,t,n=1e-5){return Math.abs(e[0]-t[0])<n&&Math.abs(e[1]-t[1])<n&&Math.abs(e[2]-t[2])<n}var aa=null,mp=new Set;function ks(e){aa!==e&&(aa=e,mp.forEach(t=>t()))}function gp(e){return mp.add(e),()=>mp.delete(e)}function Pc(){return aa}function Vf({light:e,position:t,rotation:n=[0,0,0],color:i,intensity:r,visible:o,onPositionChange:a,onRotationChange:s,onDraggingChange:c}){let{activeTab:l,activeSubTab:u,setActiveTab:d,setActiveSubTab:h}=qn(),{camera:b,gl:m,raycaster:y,invalidate:k}=IT(),w=Ut(null),p=Ut(null),g=Ut(null),S=Ut(null),v=Ut(null),M=Ut(null),D=Ut(null),x=Ut(null),C=Ut(null),P=Ut(null),_=Ut(null),z=Yn(()=>new GT,[]),L=Yn(()=>new ia,[]),I=Yn(()=>new ur(1,1,1),[]),N=Ut([0,0,0]),R=Ut([0,0,0]),F=Ut(!1),G=Ut(null),Z=Ut(null),ie=Ut(null),ve=Ut(c);Ps(()=>{ve.current=c},[c]);let He=Yn(()=>new ur(t[0],t[1],t[2]),[t]),Dt=Yn(()=>new Sc(n[0],n[1],n[2]),[n]),pt=Yn(()=>new Float32Array(6),[]),kt=Yn(()=>hp("x"),[]),Re=Yn(()=>hp("y"),[]),et=Yn(()=>hp("z"),[]),Kt=Yn(()=>new Float32Array((Mc+1)*3),[]),kn=Yn(()=>new Float32Array(Tc*2*3),[]),ft=e?.type==="point",Le=e?.type==="spot",ee=ft?XT:Le?qT:$T,vn=ft?HT:Le?WT:Uf,cn=Yn(()=>new VT().load(ee),[ee]),tt=NT(gp,Pc,Pc),Qt=!!e&&tt===e.id,Ee=Ut(new ur),Jt=Ut(new Sc);Ps(()=>{F.current||(Ee.current.copy(He),Jt.current.copy(Dt),k())},[He,Dt,k]),Ps(()=>{e&&aa===e.id&&!o&&ks(null)},[e?.id,o]),Ps(()=>()=>{e&&aa===e.id&&ks(null),ie.current!==null&&(cancelAnimationFrame(ie.current),ie.current=null)},[e?.id]);let _t=Cc(()=>{if(F.current||!Qt)return;let ge=Ee.current,H=new ia().setFromEuler(Jt.current);z.compose(ge,H,I)},[z,I,Qt]);zT(()=>{if(w.current&&w.current.position.copy(Ee.current),_t(),g.current){g.current.lookAt(b.position);let ge=b,H;ge.isOrthographicCamera?H=vn/ge.zoom:H=b.position.distanceTo(Ee.current)*vn,g.current.scale.setScalar(H)}if(D.current){let ge=b,H;ge.isOrthographicCamera?H=Nf/ge.zoom:H=b.position.distanceTo(Ee.current)*Nf,D.current.scale.setScalar(H)}if(v.current){let ge=v.current.getAttribute("position"),H=ge.array;H[0]=0,H[1]=0,H[2]=0,H[3]=Ee.current.x,H[4]=Ee.current.y,H[5]=Ee.current.z,ge.needsUpdate=!0,v.current.computeBoundingSphere()}if(M.current){let ge=Ee.current,H=ge.length();M.current.visible=H>Df,H>1e-6&&(M.current.position.copy(ge).multiplyScalar(.5),M.current.scale.set(1,H,1),M.current.quaternion.setFromUnitVectors(KT,ge.clone().normalize()))}if(S.current&&(S.current.visible=Ee.current.length()>Df),Le&&x.current&&C.current&&P.current){let ge=Ee.current,H=ge.length();if(H>1e-6){x.current.visible=!0;let he=ge.clone().negate().normalize(),ne=H,Se=e?.angle??Math.PI/6,Me=ne*Math.tan(Se),ye=ge.clone().add(he.clone().multiplyScalar(ne)),[_e,ce]=QT(he),qe=C.current.getAttribute("position"),nt=qe.array;for(let Ue=0;Ue<=Mc;Ue++){let Ye=Ue/Mc*Math.PI*2,Zt=ye.x+(_e.x*Math.cos(Ye)+ce.x*Math.sin(Ye))*Me,Tt=ye.y+(_e.y*Math.cos(Ye)+ce.y*Math.sin(Ye))*Me,hn=ye.z+(_e.z*Math.cos(Ye)+ce.z*Math.sin(Ye))*Me;nt[Ue*3]=Zt,nt[Ue*3+1]=Tt,nt[Ue*3+2]=hn}qe.needsUpdate=!0,C.current.computeBoundingSphere();let Ot=P.current.getAttribute("position"),Nt=Ot.array;for(let Ue=0;Ue<Tc;Ue++){let Ye=Ue/Tc*Math.PI*2,Zt=ye.x+(_e.x*Math.cos(Ye)+ce.x*Math.sin(Ye))*Me,Tt=ye.y+(_e.y*Math.cos(Ye)+ce.y*Math.sin(Ye))*Me,hn=ye.z+(_e.z*Math.cos(Ye)+ce.z*Math.sin(Ye))*Me,wn=Ue*6;Nt[wn]=ge.x,Nt[wn+1]=ge.y,Nt[wn+2]=ge.z,Nt[wn+3]=Zt,Nt[wn+4]=Tt,Nt[wn+5]=hn}Ot.needsUpdate=!0,P.current.computeBoundingSphere()}else x.current.visible=!1}});let Fe=Cc(()=>{ie.current!==null&&(cancelAnimationFrame(ie.current),ie.current=null),N.current=t,R.current=[n[0],n[1],n[2]],F.current=!0,G.current=null,Z.current=null,ve.current?.(!0)},[t,n]),xt=Cc((ge,H,he,ne)=>{let Se=new ur(N.current[0],N.current[1],N.current[2]),Me=new ur,ye=new ia,_e=new ur;ne.decompose(Me,ye,_e);let ce=Se.clone().applyMatrix4(ne),qe=[Math.min(Math.max(ce.x,dp),up),Math.min(Math.max(ce.y,dp),up),Math.min(Math.max(ce.z,dp),up)],nt=new ia().setFromEuler(new Sc(R.current[0],R.current[1],R.current[2],"XYZ")),Ot=new ia().copy(ye).multiply(nt),Nt=new Sc().setFromQuaternion(Ot,"XYZ"),Ue=[Nt.x,Nt.y,Nt.z];Ee.current.set(qe[0],qe[1],qe[2]),Jt.current.set(Ue[0],Ue[1],Ue[2]),G.current=qe,Z.current=Ue;let Ye=new ia().setFromEuler(Jt.current);z.compose(Ee.current,Ye,I),k()},[z,I,k]),dn=Cc(()=>{F.current=!1;let ge=G.current,H=Z.current;G.current=null,Z.current=null;let he=ge&&!jf(ge,N.current),ne=H&&!jf(H,R.current);he&&a&&a(ge),ne&&s&&s(H),he||ne?ie.current=requestAnimationFrame(()=>{ie.current=null,ve.current?.(!1)}):ve.current?.(!1)},[a,s]);return Ps(()=>{let ge=ne=>{let Se=m.domElement.getBoundingClientRect();return new UT((ne.clientX-Se.left)/Se.width*2-1,-((ne.clientY-Se.top)/Se.height)*2+1)},H=ne=>!!ne.target.closest?.("button, input, textarea, .ri-annotationPopup, .ri-colorPicker, .ri-materialPicker"),he=ne=>{if(H(ne))return;let Se=ge(ne);y.setFromCamera(Se,b);let Me=[];if(p.current&&Me.push(p.current),g.current&&Me.push(g.current),Me.length===0)return;if(y.intersectObjects(Me,!1).length>0){let _e=e?.id??null;aa!==_e&&(ks(_e),d?.("scene"),h?.("Lighting")),ne.preventDefault(),ne.stopPropagation()}};return m.domElement.addEventListener("pointerdown",he),()=>{m.domElement.removeEventListener("pointerdown",he)}},[b,y,m,e,d,h]),l!=="scene"||u!=="Lighting"||!e||!o||e.type==="none"||e.type==="hemisphere"?null:Kn("group",{ref:ge=>{ge&&Hh(ge)},children:[Kn("group",{ref:w,children:[dt("sprite",{ref:g,children:dt("spriteMaterial",{map:cn,transparent:!0,opacity:.9,blending:cp,depthWrite:!1,rotation:Le?YT:0},ee)}),dt(FT,{ref:p,args:[.25,16,16],children:dt("meshBasicMaterial",{transparent:!0,opacity:.01})}),ft&&Kn("group",{ref:D,children:[Kn("lineLoop",{renderOrder:999,children:[dt("bufferGeometry",{children:dt("bufferAttribute",{attach:"attributes-position",args:[kt,3],count:oa+1})}),dt("lineBasicMaterial",{color:pp,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),Kn("lineLoop",{renderOrder:999,children:[dt("bufferGeometry",{children:dt("bufferAttribute",{attach:"attributes-position",args:[Re,3],count:oa+1})}),dt("lineBasicMaterial",{color:pp,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),Kn("lineLoop",{renderOrder:999,children:[dt("bufferGeometry",{children:dt("bufferAttribute",{attach:"attributes-position",args:[et,3],count:oa+1})}),dt("lineBasicMaterial",{color:pp,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]})]})]}),!ft&&!Le&&Kn(JT,{children:[Kn("mesh",{ref:M,children:[dt("cylinderGeometry",{args:[zf,zf,1,8,1,!0]}),dt("meshBasicMaterial",{color:If,transparent:!0,opacity:.05,blending:cp,depthWrite:!1,depthTest:!1})]}),Kn("line",{ref:S,children:[dt("bufferGeometry",{ref:v,children:dt("bufferAttribute",{attach:"attributes-position",args:[pt,3],count:2})}),dt("lineBasicMaterial",{color:If,transparent:!0,opacity:.7,blending:cp})]})]}),Le&&Kn("group",{ref:x,children:[Kn("lineLoop",{renderOrder:999,children:[dt("bufferGeometry",{ref:C,children:dt("bufferAttribute",{attach:"attributes-position",args:[Kt,3],count:Mc+1})}),dt("lineBasicMaterial",{color:Ff,transparent:!0,opacity:.85,depthTest:!1,depthWrite:!1})]}),Kn("lineSegments",{renderOrder:999,children:[dt("bufferGeometry",{ref:P,children:dt("bufferAttribute",{attach:"attributes-position",args:[kn,3],count:Tc*2})}),dt("lineBasicMaterial",{color:Ff,transparent:!0,opacity:.5,depthTest:!1,depthWrite:!1})]})]}),Qt&&a&&dt(jT,{ref:_,matrix:z,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableScaling:!0,onDragStart:Fe,onDrag:xt,onDragEnd:dn})]})}import{useCallback as bp,useLayoutEffect as n2,useMemo as kr,useRef as Yr}from"react";import{PivotControls as r2}from"@react-three/drei";import{useFrame as i2,useThree as o2}from"@react-three/fiber";import{Euler as Xf,Matrix4 as _c,Quaternion as Ac,Vector3 as _s}from"three";import{Box3 as Gf,Euler as ZT,Matrix4 as Hf,Quaternion as e2,Vector3 as bi}from"three";function kc(e){e.updateWorldMatrix(!0,!0);let t=new Hf().copy(e.matrixWorld).invert(),n=new Gf,i=new Gf,r=!1;return e.traverse(o=>{let a=o;if(!a.isMesh||!a.geometry||(a.geometry.boundingBox||a.geometry.computeBoundingBox(),!a.geometry.boundingBox))return;let s=new Hf().multiplyMatrices(t,o.matrixWorld);i.copy(a.geometry.boundingBox).applyMatrix4(s),n.union(i),r=!0}),r?n.getCenter(new bi):new bi}function Wf(e,t="XYZ"){return new e2().setFromEuler(new ZT(e[0],e[1],e[2],t))}function t2(e,t,n,i,r="XYZ"){let a=new bi(...i).multiply(new bi(...n)).applyQuaternion(Wf(t,r)).add(new bi(...e));return[a.x,a.y,a.z]}function $f(e,t,n,i,r,o="XYZ"){let a=new bi(...t2(e,t,i,r,o)),s=new bi(...r).multiply(new bi(...i)).applyQuaternion(Wf(n,o)),c=a.sub(s);return[c.x,c.y,c.z]}import{jsx as qf}from"react/jsx-runtime";function fp({node:e,space:t,onTransformChange:n,onDraggingChange:i}){let r=o2(_=>_.invalidate),o=kr(()=>kc(e),[e]),a=kr(()=>new _c,[]),s=Yr(!1),c=Yr(new _c),l=Yr(new _c),u=Yr(null),d=Yr(0),h=Yr([]),b=Yr(null),m=Yr(i);m.current=i;let y=kr(()=>new _s,[]),k=kr(()=>new Ac,[]),w=kr(()=>new _s,[]),p=kr(()=>new Ac,[]),g=kr(()=>new _s(1,1,1),[]),S=kr(()=>new Ac,[]),v=kr(()=>new _s,[]),M=kr(()=>new _s,[]),D=Yr([0,0,0]),x=bp(()=>{s.current||(e.updateWorldMatrix(!0,!1),y.copy(o).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(k),p.copy(k),t==="world"&&p.identity(),a.compose(y,p,g))},[y,a,p,g,e,o,t,k]);n2(()=>(x(),()=>{let _=b.current!==null;_&&(cancelAnimationFrame(b.current),b.current=null),(s.current||_)&&(s.current=!1,m.current(!1));for(let z of h.current)Wo(z);h.current=[]}),[x]),i2(()=>x());let C=bp(()=>{b.current!==null&&(cancelAnimationFrame(b.current),b.current=null),e.updateWorldMatrix(!0,!0),h.current=[];for(let _ of Ho(e))yg(_)||(Dl(_,_.matrixWorld),h.current.push(_));e.updateWorldMatrix(!0,!1),y.copy(o).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(k),e.getWorldScale(w),c.current.compose(y,k,w),l.current.copy(a),D.current=[e.rotation.x,e.rotation.y,e.rotation.z],u.current=null,s.current=!0,i(!0)},[y,a,e,i,o,k,w]),P=bp((_,z)=>{let L=c.current.clone().premultiply(z),I=l.current.clone().premultiply(z);L.decompose(v,k,M);let N=v.clone();I.decompose(y,p,g),t==="world"&&p.identity(),a.compose(y,p,g),_.decompose(v,S,M);let R=new Xf().setFromQuaternion(S,e.rotation.order),[F,G,Z]=D.current,ie=[F+R.x,G+R.y,Z+R.z],ve=new Ac().setFromEuler(new Xf(ie[0],ie[1],ie[2],e.rotation.order)),Dt=(e.parent?.matrixWorld||new _c).clone().invert(),pt=N.clone().applyMatrix4(Dt),kt=o.clone().multiply(e.scale).applyQuaternion(ve),Re=pt.clone().sub(kt),et=[Re.x,Re.y,Re.z];e.position.set(et[0],et[1],et[2]),e.rotation.set(ie[0],ie[1],ie[2],e.rotation.order),e.updateMatrixWorld(!0),r(),u.current={position:et,rotation:ie}},[y,S,a,p,g,r,e,o,v,M,t,k]);return qf("group",{children:qf(r2,{matrix:a,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableScaling:!0,onDragStart:C,onDrag:(_,z,L,I)=>P(z,I),onDragEnd:()=>{s.current=!1;let _=u.current;if(u.current=null,_)n(_),b.current=requestAnimationFrame(()=>{b.current=null,i(!1)});else if(h.current.length>0){for(let z of h.current)Wo(z);e.updateMatrixWorld(!0),r(),i(!1)}else i(!1);h.current=[]}})})}import{Fragment as ao,jsx as U,jsxs as ke}from"react/jsx-runtime";function A2(e){let t=e.object;if(!t.isSkinnedMesh||!e.face||!t.skeleton)return null;let n=t.geometry,i=n.getAttribute("skinIndex"),r=n.getAttribute("skinWeight"),o=n.getAttribute("position");if(!i||!r||!o)return null;let a=t.worldToLocal(e.point.clone()),s=[e.face.a,e.face.b,e.face.c],c=new Bn,l=s[0],u=1/0;for(let b of s){c.fromBufferAttribute(o,b);let m=c.distanceToSquared(a);m<u&&(u=m,l=b)}let d=i.getComponent(l,0),h=r.getComponent(l,0);for(let b=1;b<4;b++){let m=r.getComponent(l,b);m>h&&(h=m,d=i.getComponent(l,b))}return t.skeleton.bones[d]??null}function E2(e){let t=A2(e)??e.object,n=Ya(t);if(!n)return null;t.updateWorldMatrix(!0,!1);let i=t.worldToLocal(e.point.clone());return{anchorNodeName:n,anchorLocalPosition:[i.x,i.y,i.z]}}function R2(e,t,n){if(!e.anchorNodeName||!e.anchorLocalPosition)return!1;let i=zr(t,e.anchorNodeName);return i?(i.updateWorldMatrix(!0,!1),n.set(...e.anchorLocalPosition).applyMatrix4(i.matrixWorld),!0):!1}function L2({annotation:e,enabled:t,controlsRef:n,offsetRef:i}){let r=e0(h=>h.scene),o=Je(null),a=Je(!1),s=Mn(()=>new Bn,[]),c=Mn(()=>new Bn,[]),l=Mn(()=>new Bn,[]),u=e?.anchorNodeName,d=e?.anchorLocalPosition;return ut(()=>{o.current=null,a.current=!1},[u,e?.id]),Zf(()=>{let h=n.current,b=i.current;if(!t||!h||!b||!u||!d){a.current=!1;return}let m=o.current;if((!m||!m.parent)&&(m=zr(r,u),o.current=m),!m){a.current=!1;return}m.updateWorldMatrix(!0,!1),s.set(d[0],d[1],d[2]).applyMatrix4(m.matrixWorld),!(a.current&&s.distanceToSquared(c)<1e-8)&&(c.copy(s),a.current=!0,l.copy(s).add(b),h.setLookAt(l.x,l.y,l.z,s.x,s.y,s.z,!0))}),null}function B2(e){let t={total:0,missing:0};return e.traverse(n=>{let i=n;!i.isMesh||!i.geometry||(t.total+=1,i.geometry.getAttribute("uv")||(t.missing+=1))}),t}var D2=.2;function O2({enabled:e,speed:t,controlsRef:n}){let i=e0(r=>r.invalidate);return Zf((r,o)=>{!e||!n.current||(n.current.rotate(o*D2*t,0,!1),i())}),null}function N2(e,t,n){let i=t?.camera;if(!(i instanceof t0))return null;let o=(e instanceof sa?e:new sa().setFromObject(e)).getSize(new Bn).length();return!Number.isFinite(o)||o<=0?null:(i.near=o/100,i.far=o*100,i.updateProjectionMatrix(),t&&n===void 0&&(t.maxDistance=o*10),o)}function I2(e,t){let n=e.camera;if(!(n instanceof t0)||!(t>0))return;let i=Math.min(Math.max(e.distance/200,t/1e5),t/100);Math.abs(i-n.near)<=n.near*.01||(n.near=i,n.updateProjectionMatrix())}async function Jf(e,t,n=.6){let i=e.smoothTime;e.smoothTime=n;try{return await t()}finally{e.smoothTime=i}}function vp({modelUrl:e,tilesetUrl:t,tilesErrorTarget:n=8,tilesCacheSize:i=800,onObjectCatalog:r,modelFormat:o,licenseKey:a,licenseValidationUrl:s,objectBindings:c,selectedObject:l,panelHoveredObject:u,onObjectBindingsChange:d,onObjectSelect:h,onObjectHover:b,onObjectEditLeaseChange:m,onModelLoaded:y,onLoadError:k,onProgress:w,onCameraControllerChange:p,cameraControllerType:g,onAction:S,onHiddenObjectsChange:v,onCameraChange:M,onViewerReady:D,onTextureUpload:x,onAnimationsReady:C,onAnnotationsChange:P,activeAnnotation:_,onActiveAnnotationChange:z,lights:L,camera:I,cameraLimits:N,backgroundColor:R,shadows:F=!0,showObjectBindingDataPanel:G=!0,customObjectBindingDataPanel:Z,customSceneObjectsPanel:ie,showSceneObjectsPanel:ve=!0,showDownloadButton:He=!0,downloadFilename:Dt="model",showResetButton:pt=!0,showLoadingOverlay:kt=!0,showMouseController:Re=!1,mouseControllerPosition:et="center-bottom",mouseControllerOpacity:Kt=1,moveSensitivity:kn=.08,zoomSensitivity:ft=1,sceneConfig:Le,onSceneConfigChange:ee,disableZoom:vn=!1,zoomOnSelected:cn=!0,highlightOnHover:tt=!0,enableCameraControls:Qt=!0,onAutoFit:Ee,refitOnResize:Jt=!0,renderMode:_t="demand",maxDpr:Fe=2,preserveDrawingBuffer:xt=!1,performanceProfile:dn="auto",dracoDecoderPath:ge,ktx2TranscoderPath:H,meshopt:he=!0,showMeasureTools:ne=!1,showUvCheckerButton:Se=!1,showExplodeControls:Me=!1,cinematic:ye,measurementUnit:_e="m",enableXR:ce=!1,usdzUrl:qe,arScaleMode:nt="normalized",mobileHandoffUrl:Ot,showAnnotationNavigation:Nt=!0,showAnnotationOnHover:Ue=!1,moveModeEnabled:Ye=!1,objectTransformSpace:Zt="world",enableKeyboardNavigation:Tt=!1,showViewGizmo:hn=!1,autoRotate:wn=!1,autoRotateSpeed:At=1}){let{isInsideEditor:O,activeTab:B,activeSubTab:V}=qn(),J=O&&B==="scene"&&V==="Lighting",W=xc(a,s),$=Mn(()=>Le??Fi,[Le]),[re,We]=Pe(null),Oe=$.model.renderer==="uv-checker",Ke=Se?re??Oe:Oe,ue=Mn(()=>{let f=Ke?"uv-checker":Oe?"pbr":$.model.renderer;return f===$.model.renderer?$:{...$,model:{...$.model,renderer:f}}},[Oe,$,Ke]);ut(()=>{We(null)},[e,$.model.renderer,Se,t]);let yt=Mn(()=>{if(R)return R;let f=$.background;return f.enabled&&f.type==="color"?f.color:"#1c1c1d"},[R,$]),le=Mn(()=>({dracoDecoderPath:ge,ktx2TranscoderPath:H,meshopt:he}),[ge,H,he]),ht=Mn(()=>nm(dn),[dn]),pe=Je(null),[It,Vn]=Pe("orbit"),[mn,rt]=Pe(!1),gn=g!==void 0?g:It,Qr=fe(f=>{rt(!1),f!==gn&&(Vn(f),p?.(f))},[gn,p]),[vi,ma]=Pe(!1);ut(()=>{pe.current&&(pe.current.dollySpeed=Math.max(ft,0))},[ft]),ut(()=>{pe.current&&(pe.current.enabled=Qt&&!vi)},[Qt,vi]);let mr=Je(null),wi=Je(new Map),Ci=Je(null),gr=Je(null),Ze=Je(null),$t=Je({});ut(()=>()=>{for(let f of Object.values($t.current))URL.revokeObjectURL(f)},[]);let en=Je({}),[,yo]=Pe(0),rr=fe(()=>{yo(f=>f+1)},[]),Si=Je({}),Ar=Je(null),je=Je(null),[Mi,Is]=Pe(null),zs=fe(f=>{je.current=f,Is(f)},[]),Er=Je(new Set),Rr=Je(null);ut(()=>{let f=Mi;if(!f||!Tt||!Qt||Ye)return;let A=new Set(["w","a","s","d"," ","c"]),Q=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]),te=0,oe=Ve=>Ve.code==="Space"?" ":Ve.key.toLowerCase(),ct=()=>{Er.current.clear(),te=0,Rr.current!==null&&(cancelAnimationFrame(Rr.current),Rr.current=null)},st=Ve=>{let qt=pe.current,$e=Er.current;if(!qt||$e.size===0){Rr.current=null,te=0;return}let pn=te?Math.min((Ve-te)/1e3,.05):1/60;te=Ve;let Ft=Math.max(qt.distance*.75,.01)*pn;$e.has("w")&&qt.forward(Ft,!1),$e.has("s")&&qt.forward(-Ft,!1),$e.has("a")&&qt.truck(-Ft,0,!1),$e.has("d")&&qt.truck(Ft,0,!1),$e.has(" ")&&qt.truck(0,Ft,!1),$e.has("c")&&qt.truck(0,-Ft,!1),Rr.current=requestAnimationFrame(st)},Xt=Ve=>{if(Ve.target!==f){ct();return}if(Q.has(Ve.key)){let $e=pe.current;if(!$e)return;Ve.preventDefault();let pn=Math.PI/90,Ft=Math.max($e.distance*.05,.01);Ve.key==="ArrowUp"?Ve.shiftKey?$e.forward(Ft,!0):$e.rotate(0,-pn,!0):Ve.key==="ArrowDown"?Ve.shiftKey?$e.forward(-Ft,!0):$e.rotate(0,pn,!0):Ve.key==="ArrowLeft"?$e.rotate(-pn,0,!0):$e.rotate(pn,0,!0);return}let qt=oe(Ve);A.has(qt)&&(Ve.preventDefault(),Er.current.add(qt),Rr.current===null&&(Rr.current=requestAnimationFrame(st)))},zt=Ve=>{Er.current.delete(oe(Ve))};return f.addEventListener("keydown",Xt),f.addEventListener("keyup",zt),f.addEventListener("blur",ct),()=>{f.removeEventListener("keydown",Xt),f.removeEventListener("keyup",zt),f.removeEventListener("blur",ct),ct()}},[Mi,Qt,Tt,Ye]);let ga=Je(null),[Nc,Ti]=Pe(c),[it,Jr]=Pe({}),[ir,ba]=Pe(null),[fa,Fs]=Pe(null),[Pi,xa]=Pe(null),[Zr,vo]=Pe(null),[Pt,js]=Pe(null),[tn,Lr]=Pe(null),un=Je(null),wo=Je(null),ki=Je(0),Co=Je(null),[Ic,zc]=Pe(0),br=Je(!1),_i=Je(!1),ya=Je(!!I);ya.current=!!I;let fr=Je(null),[va,Ai]=Pe(!!e),[wa,Ei]=Pe(!e||!!Ee||!!I),[Br,Ca]=Pe(!1),[Fc,Sa]=Pe(!1),[Us,Ri]=Pe(!1),[Vs,Gs]=Pe(!1),[Hs,jc]=Pe(null),[Uc,Ma]=Pe(!1),[Li,Ws]=Pe({total:0,missing:0}),[Vc,$s]=Pe("Loading model..."),[Gc,Ta]=Pe(null),So=Je({}),Bi=fe(()=>{let f=pe.current;if(!f||fr.current)return;let A=f.getPosition(new Bn),Q=f.getTarget(new Bn);fr.current={position:[A.x,A.y,A.z],target:[Q.x,Q.y,Q.z]}},[]),[Di,Oi]=Pe(!1),[or,Xs]=Pe(0),[Ni,qs]=Pe(!1);ut(()=>{Xs(0),qs(!1)},[e,t]);let Ii=Mn(()=>{let f=$.cinematic,A=f?.enabled?{waypoints:f.waypoints,duration:f.duration,loop:f.loop,autoPlay:f.autoPlay}:null;return ye===void 0?A&&(A.waypoints?.length??0)>=2?A:null:ye===!1?null:ye===!0?A??{}:{...A??{},...ye}},[ye,$]),[T,E]=Pe(!1),[X,Y]=Pe(!1),de=Je(!1);ut(()=>{E(!1),Y(!1),de.current=!1},[e,t]),ut(()=>{!Ii?.autoPlay||de.current||Br&&wa&&!va&&(de.current=!0,E(!0),Y(!1))},[Ii,Br,wa,va]);let{xrStore:be,presenterRef:Qe,arSupported:Te,vrSupported:_n,quickLookSupported:Ys,resolvedMobileHandoffUrl:Ks,isMobileHandoffOpen:Jp,arOverlay:Nx,openMobileHandoff:Ix,closeMobileHandoff:Zp,openQuickLook:zx,handleARStateChange:Fx}=om({enableXR:ce,usdzUrl:qe,mobileHandoffUrl:Ot}),[xr,eh]=Pe(()=>Le?.annotations??[]);ut(()=>{if(xr.length>0){let f=xr.reduce((A,Q)=>Math.max(A,Q.id),0);Zs.current=f}else Zs.current=0},[xr]);let[An,Qs]=Pe(null),[ei,Js]=Pe({title:"",description:""}),Zs=Je(0),[jx,th]=Pe(null),[Gn,Mo]=Pe(-1),[nh,el]=Pe(!1),To=Je(null),Et=Mn(()=>[...xr].sort((f,A)=>f.id-A.id),[xr]),tl=Mn(()=>Gn<0||Gn>=Et.length?null:Et[Gn],[Gn,Et]),yr=fe(f=>{if(_!==void 0){z?.(f);return}th(f?{annotation:f}:null)},[_,z]),Po=fe(f=>{let A=pe.current,Q=un.current;if(!A)return;let te=new Bn,oe=wi.current.get(f.id);oe?te.copy(oe):Q&&R2(f,Q,te)||te.set(f.worldPosition[0],f.worldPosition[1],f.worldPosition[2]),mr.current=null;let ct=A.smoothTime;A.smoothTime=.6;let st=f.worldNormal;if(Q){let Xt=new sa().setFromObject(Q),zt=new Bn;Xt.getCenter(zt);let Ve=new Bn;Xt.getSize(Ve);let qt=Ve.length()*.2,$e;st?$e=new Bn(st[0],st[1],st[2]):$e=te.clone().sub(zt),$e.lengthSq()<1e-6&&$e.set(0,0,1),$e.normalize();let pn=Math.max(qt*.6,.3),Ft=te.clone().add($e.multiplyScalar(pn));A.setPosition(Ft.x,Ft.y,Ft.z,!0),f.anchorNodeName&&f.anchorLocalPosition&&(mr.current=Ft.clone().sub(te))}A.setTarget(te.x,te.y,te.z,!0),To.current&&clearTimeout(To.current),To.current=setTimeout(()=>{A.smoothTime=ct,To.current=null},800),yr(f)},[yr]),Ux=fe(()=>{Et.length!==0&&(Oi(!0),Mo(0),Po(Et[0]))},[Et,Po]),Vx=fe(()=>{if(Et.length===0||Gn<0)return;el(!0);let f=(Gn-1+Et.length)%Et.length;Mo(f),Po(Et[f]),setTimeout(()=>el(!1),500)},[Gn,Et,Po]),Gx=fe(()=>{if(Et.length===0||Gn<0)return;if(Gn===Et.length-1){if(Oi(!1),Mo(-1),yr(null),pe.current&&fr.current){let A=fr.current;pe.current.setLookAt(A.position[0],A.position[1],A.position[2],A.target[0],A.target[1],A.target[2],!0)}return}el(!0);let f=Gn+1;Mo(f),Po(Et[f]),setTimeout(()=>el(!1),500)},[Gn,Et,Po,yr]),Hx=fe(()=>{if(Oi(!1),Mo(-1),yr(null),pe.current&&fr.current){let f=fr.current;pe.current.setLookAt(f.position[0],f.position[1],f.position[2],f.target[0],f.target[1],f.target[2],!0)}},[yr]);ut(()=>{Mo(-1),Oi(!1)},[Et.length]),ut(()=>()=>{To.current&&clearTimeout(To.current)},[]),ut(()=>{tl&&Di&&yr(tl)},[tl,yr,Di]),ut(()=>{if(Le?.annotations===void 0)return;let f=Le.annotations.map(A=>({...A,localPosition:A.localPosition??A.worldPosition}));eh(f)},[Le?.annotations]);let Pa=fe(()=>{if(_!==void 0){z?.(null);return}th(null)},[_,z]),ka=_!==void 0?_:jx?.annotation??null,_a=Mn(()=>ka?xr.find(A=>A.id===ka.id)??null:null,[ka,xr]);ut(()=>{ka&&!_a&&Pa()},[ka,_a,Pa]);let Aa=d!==void 0,at=Aa?c:Nc;So.current=at;let Wx=Mn(()=>Object.entries(at).map(([f,A])=>JSON.stringify([f,A.modelObjectId,A.transform??null])).sort().join(""),[at]),{measureMode:Ea,measureModeRef:$x,measurePoints:rh,showDimensions:Hc,measureBox:ih,modelBounds:Xx,refreshBounds:oh,clearMeasurements:qx,toggleMeasureMode:Yx,toggleDimensions:Kx,handleMeasurePointerDown:Qx,handleMeasureClick:Jx}=em({canvasAreaRef:je,controlsRef:pe,sceneRef:un,modelUrl:e,modelRotation:$.model.rotation,bindingTransformSignature:Wx,modelLoaded:Br}),{isDownloading:Wc,downloadMenuOpen:Zx,uvExportError:ah,toggleDownloadMenu:ey,handleDownloadMesh:ty,handleDownloadScreenshot:ny,handleDownloadUvLayout:ry}=Jh({sceneRef:un,materialRefs:Si,rendererCaptureRef:Ze,objectBindings:at,downloadFilename:Dt}),sh=Mn(()=>Object.fromEntries(Object.entries(at).filter(([,f])=>f.visible===!1).map(([f])=>[f,!0])),[at]),Dr=Mn(()=>{let f=new WeakMap,A=new Map,Q=new Map;for(let[te,oe]of Object.entries(at))f.set(oe,te),A.has(oe.id)||A.set(oe.id,te),Q.has(oe.modelObjectId)||Q.set(oe.modelObjectId,te);return{byReference:f,byId:A,byModelObjectId:Q}},[at]),ti=fe(f=>f?Dr.byReference.get(f)??Dr.byModelObjectId.get(f.modelObjectId)??Dr.byId.get(f.id)??null:null,[Dr]),$c=l!==void 0,Ra=$c?l??null:Zr,ar=ti(Ra),Xc=ar?en.current[ar]??null:null,lh=ti(tt?u??fa??Pi:null),iy=lh?en.current[lh]??null:null,ch=fe(f=>{xa(f),b?.(f)},[b]),dh=G&&Ra!==null&&ar!==null,uh=(ar?at[ar]:null)??Ra;ut(()=>{Aa||Ti(c)},[Aa,c]),ut(()=>{v?.(sh)},[sh,v]);let ko=fe(f=>{if(gn==="pointerLock"){Qr("orbit");return}$c||vo(f),h?.(f)},[gn,Qr,$c,h]),_o=fe(f=>{Aa||Ti(f),d?.(f)},[Aa,d]),oy=fe(f=>{let A=ar;if(!A||!f)return;let Q=So.current[A];Q&&_o({...So.current,[A]:{...Q,transform:{...Q.transform,...f}}})},[_o,ar]),Or=fe((f,A)=>at[f]?f:A?ti(A):Dr.byId.get(f)??Dr.byModelObjectId.get(f)??null,[at,ti,Dr]),La=fe((f,A)=>{let Q=Or(f),te=Q?at[Q]:void 0;!Q||!te||_o({...at,[Q]:{...te,style:A(te.style)}})},[Or,at,_o]),Hn=fe(()=>{if(Pt){let f=it[Pt.objectId]?.hex;f!==void 0&&(La(Pt.objectId,A=>({...A,material:{...A?.material,baseColor:f}})),Jr(A=>({...A,[Pt.objectId]:{}})))}js(null)},[Pt,it,La]),ph=fe(()=>{ko(null),ba(null),Hn(),Lr(null)},[ko,Hn]),qc=fe((f,A,Q,te,oe)=>{let ct=Ar.current,st=je.current,Xt=pe.current?.camera;if(!ct)return{objectId:f,x:24,y:24};let zt=ct.getBoundingClientRect(),Ve=12,qt=zt.width-A-Ve,$e=zt.height-Q-Ve,pn=Math.max(Ve,(zt.width-A)/2),Ft=Math.max(Ve,(zt.height-Q)/2),Eo=Or(f,te),Oa=Eo?en.current[Eo]:null,vr=(Ro,zi)=>zi<=Ve?Ve:Math.min(Math.max(Ro,Ve),zi);if(st&&Xt&&Oa){let Ro=st.getBoundingClientRect(),zi=new Bn;new sa().setFromObject(Oa).getCenter(zi),zi.project(Xt);let wy=(zi.x+1)/2*Ro.width+(Ro.left-zt.left),Cy=(1-zi.y)/2*Ro.height+(Ro.top-zt.top);return{objectId:f,x:vr(wy+24,qt),y:vr(Cy-Q/2,$e)}}let Jc=typeof oe?.screenX=="number"?oe.screenX-zt.left:pn,Zc=typeof oe?.screenY=="number"?oe.screenY-zt.top:Ft;return{objectId:f,x:vr(Jc,qt),y:vr(Zc,$e)}},[Or]),nl=fe(f=>{let{objectId:A,action:Q,binding:te}=f;switch(ba(f),Q.id){case"toggle-visibility":{let oe=A;te?.modelObjectId&&(oe=Dr.byModelObjectId.get(te.modelObjectId)??oe);let ct=at[oe],st=ct?.visible===!1;ct&&_o({...at,[oe]:{...ct,visible:st}});break}case"change-color":Hn(),Lr(null),Jr(oe=>{let ct=Or(A,te)??A,st=oe[A]?.hex,Xt=at[ct]?.style?.material?.baseColor;return{...oe,[A]:{...oe[A],hex:st??Xt??"#ffffff"}}}),js(qc(A,225,250,te,f));break;case"change-material":Hn(),Lr(qc(A,300,320,te,f));break;default:break}S?.(f)},[_o,at,qc,S,Hn,Or,Dr]);ut(()=>{if(Pt)return window.addEventListener("pointerdown",Hn),()=>window.removeEventListener("pointerdown",Hn)},[Pt,Hn]),ut(()=>{if(!tn)return;let f=()=>Lr(null);return window.addEventListener("pointerdown",f),()=>window.removeEventListener("pointerdown",f)},[tn]),ut(()=>{if(!_a)return;let f=A=>{if(ga.current&&!ga.current.contains(A.target)){if(A.target.closest?.(".ri-annotationMarker"))return;Pa()}};return document.addEventListener("mousedown",f),document.addEventListener("touchstart",f),()=>{document.removeEventListener("mousedown",f),document.removeEventListener("touchstart",f)}},[_a,Pa]),ut(()=>{if(!An)return;let f=A=>{let Q=A.target;if(Q.closest?.(".ri-annotationPopup")||Q.closest?.("button, input, textarea, .ri-measureTools, .ri-xrTools, .ri-buttonContainer"))return;let te=je.current;!te||!te.contains(Q)||(Qs(null),Js({title:"",description:""}))};return document.addEventListener("mousedown",f,!0),document.addEventListener("touchstart",f,!0),()=>{document.removeEventListener("mousedown",f,!0),document.removeEventListener("touchstart",f,!0)}},[An]);let hh=fe((f,A)=>{let Q=$t.current[f];Q&&URL.revokeObjectURL(Q),A.startsWith("blob:")?$t.current[f]=A:delete $t.current[f],La(f,te=>({...te,material:{...te?.material,texture:{path:A}}}))},[La]),ay=f=>{let A=f.target.files?.[0],Q=gr.current;if(!A||!Q)return;let te=Or(Q);te&&(x?x(A,te).then(oe=>hh(te,oe),oe=>console.error("onTextureUpload failed:",oe)):hh(te,URL.createObjectURL(A)),f.target.value="")},mh=f=>{gr.current=f,Ci.current?.click()},gh=f=>{let A=Or(f);if(!A)return;La(A,te=>te?.material?.texture?{...te,material:{...te.material,texture:void 0}}:te);let Q=$t.current[A];Q&&(URL.revokeObjectURL(Q),delete $t.current[A])},Yc=Je(D);Yc.current=D;let sr=fe(()=>{let f=pe.current;!f||!Yc.current||Yc.current({controls:f,scene:un.current,objectBindings:So.current,nodeRefs:en.current,homeCameraState:fr.current,captureImage:A=>ll(Ze.current,A),invalidate:()=>Ze.current?.invalidate()})},[]),Ao=fe(async(f=!1)=>{let A=pe.current,Q=wo.current??un.current;if(!A||!Q)return!1;try{if(f){let te=(Q instanceof sa?Q:new sa().setFromObject(Q)).getBoundingSphere(new u2),oe=te.center.clone(),st=A.getPosition(new Bn).clone().sub(A.getTarget(new Bn));st.lengthSq()<1e-6&&st.set(0,0,1),st.normalize();let Xt=Math.max(te.radius*10,20),zt=oe.clone().add(st.multiplyScalar(Xt));await A.setLookAt(zt.x,zt.y,zt.z,oe.x,oe.y,oe.z,!1)}return Ei(!0),await Jf(A,()=>A.fitToBox(Q,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),await new Promise(te=>{let oe=performance.now(),ct=()=>{A.active===!1||performance.now()-oe>8e3?(A.dispatchEvent({type:"update"}),Ze.current?.invalidate(),te()):(Ze.current?.invalidate(),setTimeout(ct,100))};setTimeout(ct,100)}),br.current=!0,Bi(),sr(),!0}catch(te){return console.error("Fit scene error:",te),!1}},[Bi,sr]);ut(()=>{if(br.current=!1,_i.current=!1,fr.current=null,un.current=null,wo.current=null,Ca(!1),Sa(!1),Ri(!1),Ws({total:0,missing:0}),$s("Loading model..."),Ta(null),!e){Ai(!1),Ei(!0);return}Ai(!0),Ei(!!Ee||ya.current);let f=!1,A=null,Q=oe=>{A=setTimeout(te,oe)},te=()=>{if(f||br.current||_i.current)return;let oe=wo.current??un.current;if(!pe.current||!oe){Q(100);return}if(ki.current=N2(oe,pe.current,N?.maxDistance)??ki.current,Lh(pe.current)){br.current=!0,Bi(),sr(),Ai(!1),Ei(!0),Ze.current?.invalidate();return}_i.current=!0,(Ee?Ee():ya.current?Promise.resolve(!0):Ao(!0)).then(st=>{br.current=st!==!1,br.current?(Bi(),sr(),Ai(!1)):f||Q(100)}).catch(()=>{br.current=!1,f||Q(100)}).finally(()=>{_i.current=!1})};return Q(50),()=>{f=!0,A&&clearTimeout(A)}},[Bi,N?.maxDistance,Ao,e,sr,Ee,t]),ut(()=>{if(!Jt)return;let f=Mi;if(!f)return;let A=null,Q=new ResizeObserver(()=>{!br.current||_i.current||(A&&clearTimeout(A),A=setTimeout(()=>{Ao()},150))});return Q.observe(f),()=>{Q.disconnect(),A&&clearTimeout(A)}},[Mi,Ao,Jt]);let bh=fe(f=>{if($x.current||(E(!1),Hn(),Lr(null),ba(null),ko(f),vn||!cn))return;let A=pe.current,Q=ti(f),te=Q?en.current[Q]:null;A&&f.cameraState?.position&&f.cameraState?.target?(A.setPosition(f.cameraState.position[0],f.cameraState.position[1],f.cameraState.position[2],!0),A.setTarget(f.cameraState.target[0],f.cameraState.target[1],f.cameraState.target[2],!0)):A&&te&&A.fitToBox(te,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[ko,Hn,ti,vn,cn]),fh=fe(f=>{if(ko(f),vn)return;let A=pe.current,Q=ti(f),te=Q?en.current[Q]:null;if(!A||!te)return;let oe=f.cameraState;oe?.position&&oe?.target?(A.setPosition(oe.position[0],oe.position[1],oe.position[2],!0),A.setTarget(oe.target[0],oe.target[1],oe.target[2],!0)):A.fitToBox(te,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[ko,ti,vn]);ut(()=>{sr()},[sr]);let xh=fe((f,A)=>{I2(A,ki.current),M?.(f,A),sr()},[sr,M]),sy=fe(f=>{Co.current=new Set(f.map(A=>A.name)),zc(A=>A+1),r?.(f)},[r]),ly=fe(f=>{wo.current=f,Ze.current?.invalidate()},[]),yh=fe(f=>{un.current=f,oh(f),Ws(B2(f));let A=nd(f);jc(A>Fa?A:null),Ma(!1),Ta(null),A>Fa&&$s(`Preparing large model (${Math.round(A/1e6)}M triangles) \u2014 the first display can take a while on this device...`),Ca(!0),Sa(!1),Gs(!1),y?.(f),sr()},[sr,y,oh]),vh=fe(f=>{Ai(!1),Ei(!0),Sa(!0),k?.(f)},[k]),cy=fe(f=>{f.lengthComputable&&f.total>0&&Ta(f.loaded/f.total*100),w?.(f)},[w]),wh=fe((f,A,Q)=>{if(!ee)return;let te={...$,lighting:{...$.lighting,lights:$.lighting.lights.map(oe=>oe.id===f?{...oe,position:A,...Q?{rotation:Q}:{}}:oe)}};ee(te)},[$,ee]);ut(()=>{let f=un.current;if(!Br||!f){Ri(!1);return}let A=Object.entries(at);if(A.length===0){Ri(!1);return}let Q=t?Co.current:new Set(Object.keys(Go(f).nodesById));if(!Q||Q.size===0){Ri(!1);return}let te=A.some(([oe,ct])=>!Q.has(ct.modelObjectId??oe));Ri(te)},[Br,at,Ic,t]);let Kc=fe(async()=>{if(Ee){await Ee();return}let f=pe.current;if(!f)return;let A=fr.current;try{A?await Jf(f,()=>f.setLookAt(A.position[0],A.position[1],A.position[2],A.target[0],A.target[1],A.target[2],!0)):await Ao()}catch(Q){console.error("Reset camera error:",Q)}},[Ee,Ao]),jk=fe(()=>{Y(!1),E(!0)},[]),Uk=fe(()=>{E(!1)},[]),dy=fe(()=>{E(!1),Y(!0),setTimeout(()=>{Kc()},100)},[Kc]),uy=fe((f,A)=>{xh(f,A)},[xh]),py=fe(f=>{let A=B==="scene"&&V==="Annotations";if(f.target.closest("button, input, textarea, .ri-colorPicker, .ri-materialPicker, .ri-annotationPopup, .ri-annotationMarker, .ri-viewAnnotationPopup"))return;let te=je.current,oe=pe.current,ct=oe?.camera,st=un.current;if(!te||!oe||!ct||!st||!A&&!oe.enabled)return;let Xt=te.getBoundingClientRect(),zt=(f.clientX-Xt.left)/Xt.width*2-1,Ve=-((f.clientY-Xt.top)/Xt.height)*2+1,qt=new d2;qt.setFromCamera(new p2(zt,Ve),ct);let $e=qt.intersectObject(st,!0);if($e.length===0)return;if(!A){let{x:vr,y:Jc,z:Zc}=$e[0].point;oe.setOrbitPoint(vr,Jc,Zc);return}let pn=$e[0],Ft=pn.point,Eo=st.worldToLocal(pn.point.clone()),Oa=[0,0,1];if(pn.face){let vr=pn.face.normal.clone().transformDirection(pn.object.matrixWorld).normalize();Oa=[vr.x,vr.y,vr.z]}Qs({worldPosition:[Ft.x,Ft.y,Ft.z],localPosition:[Eo.x,Eo.y,Eo.z],worldNormal:Oa,anchor:E2(pn),screenX:f.clientX-Xt.left,screenY:f.clientY-Xt.top}),Js({title:"",description:""})},[B,V]),Ch=fe(()=>{if(!An||!ei.title.trim())return;Zs.current+=1;let A={id:Zs.current,worldPosition:An.worldPosition,localPosition:An.localPosition,worldNormal:An.worldNormal,anchorNodeName:An.anchor?.anchorNodeName,anchorLocalPosition:An.anchor?.anchorLocalPosition,title:ei.title.trim(),description:ei.description},Q=[...xr,A];eh(Q),P?.(Q),Qs(null)},[An,ei,xr,P]),Qc=fe(()=>Qs(null),[]),hy=fe(f=>{yr(f)},[yr]);if(W.status==="checking")return U("div",{className:"ri-viewer ri-viewer--license-checking",children:U(Ui,{title:"Verifying License",message:"Checking your license key..."})});if(W.status==="invalid")return U("div",{className:"ri-viewer ri-viewer--license-invalid",children:U(Ui,{tone:"error",title:"Invalid License",message:W.isLocalDomain?W.reason??"License has been revoked or has expired":"Failed to load. Please contact the site administrator."})});let Sh=tn?Or(tn.objectId):null,Mh=Sh?at[Sh]?.style?.material?.texture?.path:void 0,my=je.current?.offsetWidth??600,gy=je.current?.offsetHeight??400,by=350,fy=290,xy=An?Math.min(An.screenX+12,my-by-8):0,yy=An?Math.min(An.screenY,gy-fy-8):0,vy=kt&&!!e&&!Fc&&!Br,Ba=ce&&(be&&(Te||_n)||Ys||!!Ks),Da=f=>16+f*42;return ke("div",{className:"ri-viewer",style:{background:yt},children:[ke("div",{className:"ri-viewerLeft",ref:Ar,children:[Z?Z({isOpen:dh,selectedObject:uh,currentAction:ir,onClose:ph,onAction:nl}):U(ip,{isOpen:dh,selectedObject:uh,currentAction:ir,onClose:ph,onAction:nl,renderActionExtra:f=>f==="change-color"&&Pt?U(Ju,{inline:!0,colorPicker:Pt,onClose:Hn,itemMaterials:it,setItemMaterials:Jr}):f==="change-material"&&tn?U(ep,{inline:!0,triggerFileUpload:mh,materialPopup:tn,textureUrl:Mh,clearTexture:gh}):null}),ke("div",{className:`ri-canvasArea ${Ea?"ri-canvasArea--measuring":""} ${wa?"":"ri-canvasArea--positioning"} ${Ye?"ri-canvasArea--moveMode":""}`,ref:zs,tabIndex:Tt?0:void 0,onDoubleClick:py,onPointerDown:f=>{Tt&&je.current?.focus({preventScroll:!0}),Qx(f)},onClick:Jx,children:[Us&&!Vs&&ke("div",{className:"ri-bindingsMismatchBanner",children:[U(xp,{size:14,className:"ri-bindingsMismatchBanner__icon"}),U("span",{children:"Object bindings data don't match this model"}),U("button",{type:"button",className:"ri-bindingsMismatchBanner__dismiss",onClick:f=>{f.stopPropagation(),Gs(!0)},"aria-label":"Dismiss",children:U(yp,{size:12})})]}),Hs!==null&&!Uc&&ke("div",{className:`ri-largeModelBanner ${Us&&!Vs?"ri-largeModelBanner--offset":""}`,children:[U(xp,{size:14,className:"ri-largeModelBanner__icon"}),ke("span",{children:["Very large model (",Math.round(Hs/1e6),"M triangles) \u2014 it may render and move slowly on this device, and click/hover selection on the model is disabled. Use the objects panel to select parts."]}),U("button",{type:"button",className:"ri-largeModelBanner__dismiss",onClick:f=>{f.stopPropagation(),Ma(!0)},"aria-label":"Dismiss",children:U(yp,{size:12})})]}),ue.model.renderer==="uv-checker"&&Li.missing>0&&ke("div",{className:"ri-uvCheckerBanner",role:"status",children:[U(xp,{size:14,className:"ri-uvCheckerBanner__icon"}),ke("span",{children:[Li.missing===Li.total?"UV Checker: this model has no UV0 coordinates.":`UV Checker: ${Li.missing} of ${Li.total} meshes have no UV0 coordinates.`," ","Missing UVs are shown in magenta."]})]}),U("input",{ref:Ci,type:"file",accept:"image/png,image/jpeg,image/webp",className:"ri-hiddenInput",onChange:ay}),ke(Ed,{camera:I,backgroundColor:R,shadows:F&&$.shadows.enabled,sceneConfig:ue,selectedObjectRef:Xc,hoveredObjectRef:iy,highlightOnHover:tt,renderMode:_t,maxDpr:Fe,reduceGpuLoad:ht,xrStore:be,rendererCaptureRef:Ze,preserveDrawingBuffer:xt,children:[L??ke(ao,{children:[U(Dd,{lightingConfig:$.lighting,shadowConfig:$.shadows,shadowsEnabled:F,environmentRotation:$.environment.rotation,environmentConfig:$.environment,modelBounds:Xx,objectBindings:at,nodeRefs:en}),J&&$.lighting.lights.map(f=>!f.visible||f.type==="none"||f.type==="hemisphere"||f.attachment?null:U(Vf,{light:f,position:f.position,rotation:f.rotation,color:f.color,intensity:f.intensity,visible:f.visible,onPositionChange:A=>wh(f.id,A,f.rotation),onRotationChange:A=>wh(f.id,f.position,A),onDraggingChange:ma},f.id))]}),U(Rd,{controlsRef:pe,onCameraChange:uy,cameraLimits:N,controllerType:gn,onPointerLockExit:()=>Qr("orbit")}),U(O2,{enabled:gn==="pointerLock"?!1:$.model.autoRotate??wn??!1,speed:$.model.autoRotateSpeed??At??1,controlsRef:pe}),hn&&U(s2,{alignment:"top-right",margin:[80,80],renderPriority:2,onUpdate:()=>{pe.current?.update(0),Ze.current?.invalidate()},children:U(l2,{axisColors:["#ff3653","#8adb00","#2c8fff"],labelColor:"white"})}),Ye&&Xc&&ar&&U(fp,{node:Xc,space:Zt,onTransformChange:oy,onDraggingChange:f=>{ma(f),Ra&&m?.(Ra,f)}},ar),U(sl,{onLoadError:vh,children:U(a2,{fallback:null,children:(()=>{let f=ke(ao,{children:[t?U(Fu,{url:t,rotation:ue.model.rotation,errorTarget:n,cacheSize:i,decoderConfig:le,objectBindings:at,itemMaterials:it,sceneConfig:ue,selectedItem:ar,panelHoveredItem:u??fa,highlightOnHover:tt,onItemClick:bh,onItemHover:ch,onObjectCatalog:sy,onTilesetBounds:ly,onModelLoaded:yh,onLoadError:vh,nodeRefsOut:en,onNodeRefsChange:rr,materialRefsOut:Si,explodeFactor:or,suspendBindingTransforms:vi}):U(Kd,{url:e,modelFormat:o,objectBindings:at,selectedItem:ar,itemMaterials:it,onItemClick:bh,onItemHover:ch,onModelLoaded:yh,onAnimationsReady:C,nodeRefsOut:en,onNodeRefsChange:rr,materialRefsOut:Si,panelHoveredItem:u??fa,sceneConfig:ue,zoomOnSelected:cn,highlightOnHover:tt,decoderConfig:le,onLoadProgress:cy,explodeFactor:or,suspendBindingTransforms:vi}),U(Gu,{annotations:xr,sceneConfig:$,activeAnnotation:_a,popupRef:ga,canvasRootRef:je,worldPositionsRef:wi,modelLoaded:Br,onAnnotationClick:hy,onCloseAnnotation:Pa,hideCloseButton:Di,showAnnotationOnHover:Ue}),U(L2,{annotation:tl,enabled:Di,controlsRef:pe,offsetRef:mr}),Ii&&U(Wu,{controlsRef:pe,sceneRef:un,config:Ii,playing:T,resetOnPlay:X,onFinished:()=>{E(!1),Y(!1)},onUserInteract:()=>{E(!1)}}),ne&&U(Hu,{points:rh,unit:_e,box:ih,showDimensions:Hc})]});return be?U(gf,{ref:Qe,box:ih,scaleMode:nt,onARStateChange:Fx,children:f}):f})()})},t??e)]}),U(wc,{visible:vy,message:Vc,progress:Gc??void 0}),Ba&&ke("div",{className:"ri-xrTools",style:{top:`${Da(0)}px`},children:[!Te&&Ys&&ke("button",{type:"button",className:"ri-xrButton",onClick:zx,title:"View this model in AR with Apple Quick Look",children:[U(Yf,{size:16}),"View in AR"]}),Ks&&ke("button",{type:"button",className:"ri-xrButton",onClick:Ix,title:"Open this experience on a phone for AR","aria-haspopup":"dialog","aria-expanded":Jp,children:[U(w2,{size:16}),U("span",{children:"Open on phone"})]}),be&&Te&&ke("button",{type:"button",className:"ri-xrButton",onClick:()=>be.enterAR().catch(f=>{console.error("Failed to enter AR session:",f)}),title:"View this model in your space",children:[U(Qf,{size:16}),U("span",{className:"ri-xrButtonPrefix",children:"Enter"}),U("span",{children:"AR"})]}),be&&_n&&ke("button",{type:"button",className:"ri-xrButton",onClick:()=>be.enterVR().catch(f=>{console.error("Failed to enter VR session:",f)}),title:"View this model in VR",children:[U(v2,{size:16}),U("span",{className:"ri-xrButtonPrefix",children:"Enter"}),U("span",{children:"VR"})]})]}),Nx,Jp&&Ks&&U("div",{className:"ri-mobileHandoffBackdrop",onMouseDown:f=>{f.target===f.currentTarget&&Zp()},children:ke("section",{className:"ri-mobileHandoffDialog",role:"dialog","aria-modal":"true","aria-labelledby":"ri-mobileHandoffTitle",children:[U("button",{type:"button",className:"ri-mobileHandoffClose",onClick:Zp,"aria-label":"Close phone handoff",children:U(yp,{size:18})}),U(Qf,{size:22,"aria-hidden":"true"}),U("h2",{id:"ri-mobileHandoffTitle",children:"View in AR"}),U("p",{children:"Scan the code and choose AR."}),U("div",{className:"ri-mobileHandoffQr",children:U(c2,{value:Ks,size:208,level:"M",marginSize:4,title:"QR code to open this model on a phone"})})]})}),Se&&U("div",{className:"ri-uvCheckerTools",style:{top:`${Da(Ba?1:0)}px`},children:U("button",{type:"button",className:`ri-measureButton ${Ke?"ri-measureButton--active":""}`,onClick:()=>We(f=>!(f??Oe)),title:Ke?"Disable UV checker":"Enable UV checker","aria-label":Ke?"Disable UV checker":"Enable UV checker","aria-pressed":Ke,children:U(k2,{size:16})})}),ne&&ke("div",{className:"ri-measureTools",style:{top:`${Da((Ba?1:0)+(Se?1:0))}px`},children:[U("button",{type:"button",className:`ri-measureButton ${Ea?"ri-measureButton--active":""}`,onClick:Yx,title:Ea?"Stop measuring":"Measure distance","aria-pressed":Ea,children:U(T2,{size:16})}),U("button",{type:"button",className:`ri-measureButton ${Hc?"ri-measureButton--active":""}`,onClick:Kx,title:"Toggle bounding dimensions","aria-pressed":Hc,children:U(P2,{size:16})}),rh.length>0&&U("button",{type:"button",className:"ri-measureButton",onClick:qx,title:"Clear measurements",children:U(g2,{size:16})}),Ea&&U("span",{className:"ri-measureHint",children:"Click points on the model to measure"})]}),Me&&ke("div",{className:"ri-explodeTools",style:{top:`${Da((Ba?1:0)+(Se?1:0)+(ne?1:0))}px`},children:[U("button",{type:"button",className:`ri-measureButton ${Ni||or>0?"ri-measureButton--active":""}`,onClick:()=>qs(f=>!f),title:"Exploded view","aria-pressed":Ni,children:U(C2,{size:16})}),Ni&&U("div",{className:"ri-explodeSlider",onPointerDown:f=>f.stopPropagation(),children:U("input",{type:"range",min:0,max:100,value:Math.round(or*100),onChange:f=>Xs(Number(f.target.value)/100),"aria-label":"Explode amount"})})]}),Ii&&ke("div",{className:"ri-cinematicTools",style:{top:`${Da((Ba?1:0)+(Se?1:0)+(ne?1:0)+(Me?1:0))}px`},children:[U("button",{type:"button",className:`ri-measureButton ${T?"ri-measureButton--active":""}`,onClick:()=>{T?E(!1):(Y(!1),E(!0))},title:T?"Pause cinematic":"Play cinematic","aria-pressed":T,children:T?U(M2,{size:16}):U(S2,{size:16})}),T&&U("button",{type:"button",className:"ri-measureButton ri-measureButton--stop",onClick:dy,title:"Stop cinematic and reset camera",children:U(Kf,{size:16})})]}),(pt||He||Nt&&Et.length>0)&&ke("div",{className:"ri-buttonContainer",children:[U("div",{className:"ri-tourControls",children:Nt&&Et.length>0&&U(ao,{children:Di?ke(ao,{children:[ke("button",{className:"ri-tourButton",onClick:Vx,disabled:nh||Et.length===0||Gn<=0,title:"Previous annotation",children:[U(x2,{size:16}),U("span",{children:"Prev"})]}),U("button",{className:"ri-tourButton ri-tourButton--stop",onClick:Hx,title:"Stop guided tour",children:U(Kf,{size:16})}),ke("button",{className:"ri-tourButton ri-tourButton--next",onClick:Gx,disabled:nh||Et.length===0,title:"Next annotation",children:[U("span",{children:"Next"}),U(y2,{size:16})]})]}):U("button",{className:"ri-navButtonSingle",onClick:Ux,disabled:Et.length===0,title:"Start guided tour",children:"Guided Tour"})})}),ke("div",{className:"mv-rightControls",children:[pt&&U("button",{className:"mv-resetButton",onClick:Kc,title:"Reset camera view",children:U(f2,{})}),ke("div",{className:"mv-controllersWrapper",onPointerDown:f=>f.stopPropagation(),children:[mn&&ke("div",{className:"mv-controllersMenu",children:[U("button",{type:"button",className:`mv-controllersMenuItem ${gn==="orbit"?"mv-controllersMenuItem--active":""}`,onClick:()=>Qr("orbit"),children:"Orbit Control"}),U("button",{type:"button",className:`mv-controllersMenuItem ${gn==="pointerLock"?"mv-controllersMenuItem--active":""}`,onClick:()=>Qr("pointerLock"),children:"Point Lock"})]}),U("button",{className:"mv-controllersButton",onClick:()=>rt(f=>!f),title:"Camera controller","aria-label":"Camera controller settings",children:U(_2,{size:15})})]}),He&&ke("div",{className:"mv-downloadWrapper",onPointerDown:f=>f.stopPropagation(),children:[Zx&&ke("div",{className:"mv-downloadMenu",children:[ke("button",{className:"mv-downloadMenuItem",onClick:ty,disabled:Wc||!un.current,children:[U(Yf,{size:14}),"Download GLB"]}),U("div",{className:"mv-downloadMenuDivider"}),xt&&ke(ao,{children:[ke("button",{className:"mv-downloadMenuItem",onClick:ny,disabled:!un.current,children:[U(h2,{size:14}),"Download PNG"]}),U("div",{className:"mv-downloadMenuDivider"})]}),ke("button",{className:"mv-downloadMenuItem",onClick:ry,disabled:!un.current,children:[U(b2,{size:14}),"Download UV Layout"]}),ah&&U("div",{className:"mv-downloadMenuNotice",role:"status","aria-live":"polite",children:ah})]}),U("button",{className:"mv-downloadButton",onClick:ey,disabled:Wc||!un.current,title:"Download options",children:Wc?ke(ao,{children:[U("span",{className:"mv-downloadButton__spinner"}),"Exporting\u2026"]}):ke(ao,{children:[U(m2,{size:15}),"Download"]})})]})]})]}),An&&ke("div",{className:"ri-annotationPopup",style:{left:xy,top:yy},onPointerDown:f=>f.stopPropagation(),onClick:f=>f.stopPropagation(),children:[U("input",{autoFocus:!0,className:"ri-annotationInput",placeholder:"Title *",value:ei.title,onChange:f=>Js(A=>({...A,title:f.target.value})),onKeyDown:f=>{f.key==="Enter"&&Ch(),f.key==="Escape"&&Qc()}}),U("textarea",{className:"ri-annotationTextarea",placeholder:"Description",value:ei.description,onChange:f=>Js(A=>({...A,description:f.target.value})),onKeyDown:f=>{f.key==="Escape"&&Qc()},rows:5}),ke("div",{className:"ri-annotationActions",children:[U("button",{onClick:Ch,className:`ri-annotationOkBtn ${ei.title.trim()?"":"disabled"}`,disabled:!ei.title.trim(),children:"OK"}),U("button",{onClick:Qc,className:"ri-annotationCancelBtn",children:"Cancel"}),U("div",{className:"ri-annotationIcons"})]})]})]}),Z&&Pt&&U(Ju,{colorPicker:Pt,onClose:Hn,itemMaterials:it,setItemMaterials:Jr}),Z&&tn&&U(ep,{triggerFileUpload:mh,materialPopup:tn,textureUrl:Mh,clearTexture:gh})]}),ve&&U("div",{className:"ri-viewerRight",children:ie?ie({objectBindings:at,onAction:nl,onFocus:fh,onHover:Fs}):U(op,{objectBindings:at,onAction:nl,onFocus:fh,onHover:Fs})}),Re&&U(Pf,{controlsRef:pe,enabled:!0,opacity:Kt,moveSensitivity:kn,position:et})]})}var z2="react-immersive:binding-builder";var la="session",lo="model",As="current";var so=null;function r0(){return so||(so=new Promise((e,t)=>{if(typeof indexedDB>"u"){t(new Error("IndexedDB is not available in this environment."));return}let n=indexedDB.open(z2,1);n.onupgradeneeded=()=>{let i=n.result;i.objectStoreNames.contains(la)||i.createObjectStore(la),i.objectStoreNames.contains(lo)||i.createObjectStore(lo)},n.onsuccess=()=>{let i=n.result;i.onversionchange=()=>{i.close(),so=null},e(i)},n.onerror=()=>t(n.error??new Error("Failed to open IndexedDB."))}),so.catch(()=>{so=null}),so)}function i0(e){return new Promise((t,n)=>{e.oncomplete=()=>t(),e.onerror=()=>n(e.error??new Error("IndexedDB transaction failed.")),e.onabort=()=>n(e.error??new Error("IndexedDB transaction aborted."))})}function n0(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error??new Error("IndexedDB request failed."))})}function Ec(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function F2(e){if(!Ec(e)||e.version!==1)return!1;let t=e.model;return typeof e.savedAt=="number"&&Ec(e.bindings)&&Ec(e.sceneConfig)&&Ec(t)&&typeof t.name=="string"&&(t.kind==="file"&&typeof t.key=="string"||t.kind==="url"&&typeof t.url=="string")}async function o0(e,t){let n=await r0(),i={...e,version:1,savedAt:Date.now()},r=n.transaction([la,lo],"readwrite"),o=i0(r);if(r.objectStore(la).put(i,As),i.model.kind==="file"&&t){let a={key:i.model.key,blob:t,name:t.name,type:t.type,lastModified:t.lastModified};r.objectStore(lo).put(a,As)}else i.model.kind==="url"&&r.objectStore(lo).delete(As);return await o,i}async function a0(){let t=(await r0()).transaction([la,lo],"readonly"),n=i0(t),[i,r]=await Promise.all([n0(t.objectStore(la).get(As)),n0(t.objectStore(lo).get(As))]);return await n,F2(i)?i.model.kind==="url"?{session:i,file:null}:!r||r.key!==i.model.key?null:{session:i,file:new File([r.blob],r.name,{type:r.type,lastModified:r.lastModified})}:null}import{useState as OP,useEffect as NP}from"react";import{useState as Y2}from"react";import{ChevronDown as K2,ChevronLeft as Q2,ChevronRight as J2,RotateCcw as Z2}from"lucide-react";import{HexColorInput as eP,HexColorPicker as tP}from"react-colorful";import{useLayoutEffect as l0,useRef as wp,useState as Cp}from"react";import{createPortal as U2}from"react-dom";import{ChevronDown as V2,Info as G2}from"lucide-react";import{HexColorInput as H2,HexColorPicker as W2}from"react-colorful";function ca(e){let t=e.replace("#","").match(/.{2}/g).map(i=>parseInt(i,16)/255).map(i=>i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4));return .2126*t[0]+.7152*t[1]+.0722*t[2]>.179?"#000":"#fff"}import{useEffect as j2}from"react";function s0(e,t,n){j2(()=>{if(!n)return;let i=Array.isArray(e)?e:[e],r=o=>{let a=o.target;i.some(c=>c.current?.contains(a))||t()};return document.addEventListener("pointerdown",r,!0),()=>{document.removeEventListener("pointerdown",r,!0)}},[e,t,n])}import{jsx as Ne,jsxs as Tn}from"react/jsx-runtime";function Sp({anchorRef:e,onClose:t,children:n}){let i=wp(null),[r,o]=Cp(null);return s0([i,e],t,!0),l0(()=>{let a=e.current;if(!a)return;let s=a.getBoundingClientRect(),c=222,l=8,u=Math.min(Math.max(s.right-c,l),window.innerWidth-c-l),d=Math.min(s.bottom+6,window.innerHeight-200);o({top:d,left:u})},[e]),r?U2(Ne("div",{ref:i,className:"se-colorPickerPopover",style:{position:"fixed",top:r.top,left:r.left},children:n}),document.body):null}function $2(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").replace(/\s+/g," ").trim().replace(/\b\w/g,t=>t.toUpperCase())}function co({title:e,children:t}){return Tn("section",{className:"se-section",children:[Ne("h3",{className:"se-sectionTitle",children:e}),Ne("div",{className:"se-sectionBody",children:t})]})}function Ie({title:e,open:t,onToggle:n,trailing:i,children:r,disabled:o,tooltip:a}){let s=a?`${a}`:e;return Tn("section",{className:"se-panel",children:[Tn("button",{type:"button",className:"se-panelHeader",onClick:n,"aria-expanded":t,title:s,children:[Tn("span",{className:"se-panelHeaderMain",children:[Ne(V2,{size:16,className:`se-panelChevron ${t?"se-panelChevron--open":""}`}),Ne("span",{className:"se-panelTitle",children:e}),a?Ne("span",{className:"se-panelHelp",title:s,"aria-label":s,role:"img",onClick:c=>c.stopPropagation(),children:Ne(G2,{size:13})}):null]}),i?Ne("span",{className:"se-panelTrailing",onClick:c=>c.stopPropagation(),children:i}):null]}),t?Ne("div",{className:"se-panelBody",style:o?{opacity:.45,pointerEvents:"none"}:void 0,children:r}):null]})}function Ge({checked:e,onChange:t,label:n}){return Tn("label",{className:"se-switch","aria-label":n,children:[Ne("input",{type:"checkbox",checked:e,onChange:i=>t(i.target.checked)}),Ne("span",{className:"se-switchTrack",children:Ne("span",{className:"se-switchThumb"})})]})}function j({label:e,value:t,min:n,max:i,step:r,formatValue:o,onChange:a,disabled:s=!1}){return Tn("label",{className:`se-field ${s?"se-field--disabled":""}`,children:[Tn("span",{className:"se-fieldLabel",children:[e,Ne("span",{className:"se-fieldValue",children:o?o(t):t})]}),Ne("input",{className:"se-slider",type:"range",min:n,max:i,step:r,value:t,onChange:c=>a(Number(c.target.value)),disabled:s})]})}function Xe({label:e,checked:t,onChange:n}){return Tn("label",{className:"se-field se-fieldInline",children:[Ne("span",{className:"se-fieldLabel",children:e}),Ne("input",{type:"checkbox",className:"se-checkbox",checked:t,onChange:i=>n(i.target.checked)})]})}function zn({label:e,value:t,options:n,onChange:i}){return Tn("label",{className:"se-field se-fieldInline",children:[Ne("span",{className:"se-fieldLabel",children:e}),Ne("select",{className:"se-select",value:t,onChange:r=>i(r.target.value),children:n.map(r=>Ne("option",{value:r,children:$2(r)},r))})]})}function Qn({label:e,value:t,onChange:n}){let[i,r]=Cp(!1),o=wp(null);return Tn("div",{className:"se-field",children:[Tn("div",{className:"se-fieldInline",children:[Ne("span",{className:"se-fieldLabel",children:e}),Ne("span",{ref:o,style:{display:"inline-flex"},children:Ne(H2,{prefixed:!0,className:"se-swatch",onClick:()=>r(a=>!a),style:{background:t,color:ca(t)},color:t,onChange:n})})]}),i?Ne(Sp,{anchorRef:o,onClose:()=>r(!1),children:Ne(W2,{color:t,onChange:n})}):null]})}function c0({value:e,min:t,max:n,step:i,onChange:r}){let[o,a]=Cp(String(e)),s=wp(!1);return l0(()=>{s.current||a(String(e))},[e]),Ne("input",{type:"number",className:"se-numberInput",min:t,max:n,step:i,value:o,onFocus:()=>{s.current=!0},onChange:c=>{let l=c.target.value;a(l),l!==""&&l!=="-"&&!Number.isNaN(Number(l))&&r(Number(l))},onBlur:()=>{s.current=!1,a(String(e))}})}function fi({label:e,value:t,min:n,max:i,step:r,onChange:o}){return Tn("div",{className:"se-field",children:[Ne("span",{className:"se-fieldLabel",children:e}),Ne("div",{className:"se-vectorRow",children:["X","Y","Z"].map((s,c)=>Tn("label",{className:"se-vectorAxis",children:[Ne("span",{children:s}),Ne(c0,{value:t[c],min:n,max:i,step:r,onChange:l=>{let u=[...t];u[c]=l,o(u)}})]},s))})]})}function uo({label:e,value:t,min:n,max:i,step:r,onChange:o}){return Tn("div",{className:"se-field",children:[Ne("span",{className:"se-fieldLabel",children:e}),Ne("div",{className:"se-vectorRow",children:["X","Y"].map((s,c)=>Tn("label",{className:"se-vectorAxis",children:[Ne("span",{children:s}),Ne(c0,{value:t[c],min:n,max:i,step:r,onChange:l=>{let u=[...t];u[c]=l,o(u)}})]},s))})]})}var d0={free:0,starter:1,growth:2};function u0(e){return e==="starter"||e==="growth"||e==="scale"?e==="scale"?"growth":e:"free"}function Kr(e,t){return d0[e]>=d0[t]}var p0={free:"Free",starter:"Starter",growth:"Growth"};import{Lock as X2}from"lucide-react";import{jsx as q2,jsxs as h0}from"react/jsx-runtime";function Dn({requiredTier:e,feature:t}){return h0("div",{className:"bb-tierLock",children:[q2(X2,{size:16}),h0("p",{className:"bb-tierLockMessage",children:[t," requires the ",p0[e]," plan or higher."]})]})}import{Fragment as Mp,jsx as ae,jsxs as Bt}from"react/jsx-runtime";var nP=["lit","unlit","normals"],rP=["color","image","environment"];function m0(e){let t=e%360;return t<0?t+360:t}function Es({title:e,open:t,onToggle:n,children:i,trailing:r}){return Bt("section",{className:"se-panel",children:[Bt("button",{type:"button",className:"se-panelHeader",onClick:n,"aria-expanded":t,children:[Bt("span",{className:"se-panelHeaderMain",children:[ae(K2,{size:16,className:`se-panelChevron ${t?"se-panelChevron--open":""}`}),ae("span",{className:"se-panelTitle",children:e})]}),r?ae("span",{className:"se-panelTrailing",onClick:o=>o.stopPropagation(),children:r}):null]}),t?ae("div",{className:"se-panelBody",children:i}):null]})}function Tp({config:e,onChange:t}){let{model:n,camera:i,wireframe:r,background:o,environment:a}=e,{tier:s}=qn(),c=Kr(s,"starter"),[l,u]=Y2({general:!0,camera:!0,autoRotate:!1,wireframe:!1,background:!1}),d=p=>u(g=>({...g,[p]:!g[p]})),h=p=>t({...e,model:p}),b=p=>t({...e,camera:p}),m=p=>t({...e,wireframe:p}),y=p=>t({...e,background:p}),k=p=>t({...e,environment:p}),w=p=>{k({...a,source:"preset",preset:p})};return Bt("div",{className:"se-generalContent",children:[Bt(Es,{title:"General",open:l.general,onToggle:()=>d("general"),children:[Bt("div",{className:"se-field",children:[Bt("div",{className:"se-fieldLabel",children:[ae("span",{children:"Straighten model"}),ae("button",{type:"button",className:"se-iconButton",onClick:()=>h({...n,rotation:[0,0,0]}),"aria-label":"Reset model rotation",children:ae(Z2,{size:16})})]}),ae("div",{className:"se-axisStepperGrid",children:["X","Y","Z"].map((p,g)=>Bt("div",{className:"se-axisStepper",children:[ae("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let S=[...n.rotation];S[g]=m0(S[g]-90),h({...n,rotation:S})},"aria-label":`Rotate ${p} axis backward`,children:ae(Q2,{size:16})}),ae("span",{className:"se-axisStepperLabel",children:p}),ae("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let S=[...n.rotation];S[g]=m0(S[g]+90),h({...n,rotation:S})},"aria-label":`Rotate ${p} axis forward`,children:ae(J2,{size:16})})]},p))})]}),ae(fi,{label:"Rotation",value:n.rotation,min:0,max:360,step:1,onChange:p=>h({...n,rotation:p})}),Bt("div",{className:"se-field",children:[ae("span",{className:"se-fieldLabel",children:"Renderer"}),ae("div",{className:"se-segmentedControl se-segmentedControl--renderer",children:Ph.map(p=>ae("button",{type:"button",className:`se-segmentedOption ${n.renderer===p?"se-segmentedOption--active":""}`,onClick:()=>h({...n,renderer:p}),children:p==="uv-checker"?"UV CHECKER":p.toUpperCase()},p))})]}),ae(zn,{label:"Shading",value:n.shading,options:nP,onChange:p=>h({...n,shading:p})})]}),ae(Es,{title:"Camera",open:l.camera,onToggle:()=>d("camera"),children:ae(j,{label:"Field Of View",value:i.fieldOfView,min:20,max:100,step:.1,formatValue:p=>`${p.toFixed(3)}\xB0`,onChange:p=>b({...i,fieldOfView:p})})}),ae(Es,{title:"Auto Rotate",open:l.autoRotate,onToggle:()=>d("autoRotate"),trailing:Bt("label",{className:"se-switch","aria-label":"Toggle auto rotate",children:[ae("input",{type:"checkbox",checked:n.autoRotate??!1,onChange:p=>h({...n,autoRotate:p.target.checked})}),ae("span",{className:"se-switchTrack",children:ae("span",{className:"se-switchThumb"})})]}),children:n.autoRotate?ae(j,{label:"Rotation Speed",value:n.autoRotateSpeed??1,min:.1,max:3,step:.1,formatValue:p=>`${p.toFixed(1)}x`,onChange:p=>h({...n,autoRotateSpeed:p})}):ae("div",{className:"se-placeholder",children:"Enable auto rotate to adjust its speed."})}),ae(Es,{title:"Wireframe",open:l.wireframe,onToggle:()=>d("wireframe"),trailing:Bt("label",{className:"se-switch","aria-label":"Toggle wireframe preview",children:[ae("input",{type:"checkbox",checked:c&&r.enabled,disabled:!c,onChange:p=>m({...r,enabled:p.target.checked})}),ae("span",{className:"se-switchTrack",children:ae("span",{className:"se-switchThumb"})})]}),children:c?Bt(Mp,{children:[ae(j,{label:"Opacity",value:r.opacity,min:0,max:1,step:.01,onChange:p=>m({...r,opacity:p})}),ae(Qn,{label:"Wire color",value:r.color,onChange:p=>m({...r,color:p})})]}):ae(Dn,{requiredTier:"starter",feature:"Wireframe preview"})}),ae(Es,{title:"Background",open:l.background,onToggle:()=>d("background"),trailing:Bt("label",{className:"se-switch","aria-label":"Toggle scene background",children:[ae("input",{type:"checkbox",checked:o.enabled,onChange:p=>y({...o,enabled:p.target.checked})}),ae("span",{className:"se-switchTrack",children:ae("span",{className:"se-switchThumb"})})]}),children:o.enabled?Bt(Mp,{children:[Bt("div",{className:"se-field",children:[ae("span",{className:"se-fieldLabel",children:"Background type"}),ae("div",{className:"se-segmentedControl",children:rP.map(p=>ae("button",{type:"button",className:`se-segmentedOption ${o.type===p?"se-segmentedOption--active":""}`,onClick:()=>y({...o,type:p}),children:p},p))})]}),o.type==="environment"?c?Bt(Mp,{children:[Bt("div",{className:"se-field",children:[ae("span",{className:"se-fieldLabel",children:"Environment source"}),Bt("div",{className:"se-segmentedControl",children:[ae("button",{type:"button",className:`se-segmentedOption ${a.source==="preset"?"se-segmentedOption--active":""}`,onClick:()=>k({...a,source:"preset"}),children:"PRESET"}),ae("button",{type:"button",className:`se-segmentedOption ${a.source==="custom"?"se-segmentedOption--active":""}`,onClick:()=>k({...a,source:"custom"}),children:"CUSTOM"})]})]}),a.source==="preset"?ae(zn,{label:"Environment preset",value:a.preset,options:kh,onChange:w}):Bt("label",{className:"se-field",children:[ae("span",{className:"se-fieldLabel",children:"Custom environment URL"}),ae("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/environment.hdr",value:a.customEnvironmentUrl,onChange:p=>k({...a,customEnvironmentUrl:p.target.value})}),ae("span",{className:"bb-note",children:"Enter a HDR, EXR, JPG, JPEG, PNG, or WEBP URL."}),a.customEnvironmentUrl.trim()&&!rl(a.customEnvironmentUrl)?ae("span",{className:"bb-note",style:{color:"#fca5a5"},children:"Invalid image/HDRI URL."}):null]}),ae(j,{label:"Environment intensity",value:a.intensity,min:0,max:3,step:.05,onChange:p=>k({...a,intensity:p})})]}):ae(Dn,{requiredTier:"starter",feature:"Environment backgrounds"}):null,o.type==="image"?Bt("label",{className:"se-field",children:[ae("span",{className:"se-fieldLabel",children:"Background image URL"}),ae("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/background.jpg",value:o.imageUrl,onChange:p=>y({...o,imageUrl:p.target.value})})]}):null,o.type==="color"?Bt("div",{className:"se-field",children:[ae("span",{className:"se-fieldLabel",children:"Background color"}),ae("div",{className:"se-inlineColorPicker",children:ae(tP,{color:o.color,onChange:p=>y({...o,color:p})})}),ae("div",{className:"se-fieldInline",children:ae(eP,{prefixed:!0,className:"se-swatch",style:{background:o.color,color:ca(o.color)},color:o.color,onChange:p=>y({...o,color:p})})})]}):null]}):ae("div",{className:"se-placeholder",children:"Background rendering is disabled for this scene preset."})})]})}import{useState as oP}from"react";import{jsx as se,jsxs as Rs}from"react/jsx-runtime";function g0({pp:e,set:t,open:n,toggle:i}){let{ssao:r}=e;return Rs(Ie,{title:"SSAO",tooltip:"Adds soft contact shadows in corners, creases, and tight spaces.",open:n.ssao,onToggle:()=>i("ssao"),disabled:!r.enabled,trailing:se(Ge,{checked:r.enabled,onChange:o=>t("ssao",{...r,enabled:o}),label:"Toggle SSAO"}),children:[se(j,{label:"Samples",value:r.samples,min:1,max:64,step:1,onChange:o=>t("ssao",{...r,samples:o})}),se(j,{label:"Rings",value:r.rings,min:1,max:12,step:1,onChange:o=>t("ssao",{...r,rings:o})}),se(j,{label:"Intensity",value:r.intensity,min:0,max:20,step:.5,onChange:o=>t("ssao",{...r,intensity:o})}),se(j,{label:"Radius",value:r.radius,min:.01,max:1,step:.01,onChange:o=>t("ssao",{...r,radius:o})}),se(j,{label:"Bias",value:r.bias,min:0,max:.1,step:.001,onChange:o=>t("ssao",{...r,bias:o})}),se(j,{label:"Luminance Influence",value:r.luminanceInfluence,min:0,max:1,step:.01,onChange:o=>t("ssao",{...r,luminanceInfluence:o})}),se(j,{label:"Fade",value:r.fade,min:0,max:.1,step:.001,onChange:o=>t("ssao",{...r,fade:o})}),se(j,{label:"Min Radius Scale",value:r.minRadiusScale,min:0,max:1,step:.01,onChange:o=>t("ssao",{...r,minRadiusScale:o})}),se(j,{label:"World Distance Threshold",value:r.worldDistanceThreshold,min:0,max:100,step:.1,onChange:o=>t("ssao",{...r,worldDistanceThreshold:o})}),se(j,{label:"World Distance Falloff",value:r.worldDistanceFalloff,min:0,max:20,step:.1,onChange:o=>t("ssao",{...r,worldDistanceFalloff:o})}),se(j,{label:"World Proximity Threshold",value:r.worldProximityThreshold,min:0,max:100,step:.1,onChange:o=>t("ssao",{...r,worldProximityThreshold:o})}),se(j,{label:"World Proximity Falloff",value:r.worldProximityFalloff,min:0,max:20,step:.1,onChange:o=>t("ssao",{...r,worldProximityFalloff:o})})]})}function b0({pp:e,set:t,open:n,toggle:i}){let{autofocus:r}=e;return Rs(Ie,{title:"Auto focus",tooltip:"Keeps the focus plane tracking a subject so the image stays sharp where you want it.",open:n.autofocus,onToggle:()=>i("autofocus"),disabled:!r.enabled,trailing:se(Ge,{checked:r.enabled,onChange:o=>t("autofocus",{...r,enabled:o}),label:"Toggle Autofocus"}),children:[se(j,{label:"Focus Distance",value:r.focusDistance,min:0,max:50,step:.1,onChange:o=>t("autofocus",{...r,focusDistance:o})}),se(j,{label:"Focus Range",value:r.focusRange,min:.1,max:50,step:.1,onChange:o=>t("autofocus",{...r,focusRange:o})}),se(j,{label:"Focal Length",value:r.focalLength,min:0,max:1,step:.01,onChange:o=>t("autofocus",{...r,focalLength:o})}),se(j,{label:"Bokeh Scale",value:r.bokehScale,min:0,max:20,step:.1,onChange:o=>t("autofocus",{...r,bokehScale:o})}),se(fi,{label:"Target",value:r.target,min:-100,max:100,step:.1,onChange:o=>t("autofocus",{...r,target:o})}),se(Xe,{label:"Mouse Follow",checked:r.mouse,onChange:o=>t("autofocus",{...r,mouse:o})}),se(Xe,{label:"Manual Update",checked:r.manual,onChange:o=>t("autofocus",{...r,manual:o})}),se(j,{label:"Debug",value:r.debug,min:0,max:1,step:.01,onChange:o=>t("autofocus",{...r,debug:o})}),se(j,{label:"Smooth Time",value:r.smoothTime,min:0,max:2,step:.01,onChange:o=>t("autofocus",{...r,smoothTime:o})})]})}function f0({pp:e,set:t,open:n,toggle:i}){let{godRays:r}=e;return Rs(Ie,{title:"God Rays",tooltip:"Creates light shafts that streak outward from a bright sun or light source.",open:n.godRays,onToggle:()=>i("godRays"),disabled:!r.enabled,trailing:se(Ge,{checked:r.enabled,onChange:o=>t("godRays",{...r,enabled:o}),label:"Toggle GodRays"}),children:[se(fi,{label:"Sun Position",value:r.sunPosition,min:-100,max:100,step:.1,onChange:o=>t("godRays",{...r,sunPosition:o})}),se(j,{label:"Samples",value:r.samples,min:1,max:128,step:1,onChange:o=>t("godRays",{...r,samples:o})}),se(j,{label:"Density",value:r.density,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,density:o})}),se(j,{label:"Decay",value:r.decay,min:0,max:1,step:.01,onChange:o=>t("godRays",{...r,decay:o})}),se(j,{label:"Weight",value:r.weight,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,weight:o})}),se(j,{label:"Exposure",value:r.exposure,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,exposure:o})}),se(j,{label:"Clamp Max",value:r.clampMax,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,clampMax:o})}),se(Xe,{label:"Blur",checked:r.blur,onChange:o=>t("godRays",{...r,blur:o})}),se(zn,{label:"Kernel Size",value:r.kernelSize,options:Na,onChange:o=>t("godRays",{...r,kernelSize:o})})]})}function x0({pp:e,set:t,open:n,toggle:i}){let{lensflare:r}=e;return Rs(Ie,{title:"Lens Flare",tooltip:"Adds camera flare artifacts and glow from a bright light source.",open:n.lensflare,onToggle:()=>i("lensflare"),disabled:!r.enabled,trailing:se(Ge,{checked:r.enabled,onChange:o=>t("lensflare",{...r,enabled:o}),label:"Toggle Lensflare"}),children:[se(fi,{label:"Lens Position",value:r.lensPosition,min:-100,max:100,step:.1,onChange:o=>t("lensflare",{...r,lensPosition:o})}),se(j,{label:"Smooth Time",value:r.smoothTime,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,smoothTime:o})}),se(j,{label:"Glare Size",value:r.glareSize,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,glareSize:o})}),se(j,{label:"Flare Size",value:r.flareSize,min:0,max:.1,step:.001,onChange:o=>t("lensflare",{...r,flareSize:o})}),se(j,{label:"Flare Speed",value:r.flareSpeed,min:0,max:.2,step:.001,onChange:o=>t("lensflare",{...r,flareSpeed:o})}),se(j,{label:"Flare Shape",value:r.flareShape,min:0,max:.2,step:.001,onChange:o=>t("lensflare",{...r,flareShape:o})}),se(Xe,{label:"Animated",checked:r.animated,onChange:o=>t("lensflare",{...r,animated:o})}),se(Xe,{label:"Anamorphic",checked:r.anamorphic,onChange:o=>t("lensflare",{...r,anamorphic:o})}),se(Qn,{label:"Color Gain",value:r.colorGain,onChange:o=>t("lensflare",{...r,colorGain:o})}),se(j,{label:"Halo Scale",value:r.haloScale,min:0,max:2,step:.01,onChange:o=>t("lensflare",{...r,haloScale:o})}),se(Xe,{label:"Secondary Ghosts",checked:r.secondaryGhosts,onChange:o=>t("lensflare",{...r,secondaryGhosts:o})}),se(Xe,{label:"Additional Streaks",checked:r.aditionalStreaks,onChange:o=>t("lensflare",{...r,aditionalStreaks:o})}),se(j,{label:"Ghost Scale",value:r.ghostScale,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,ghostScale:o})}),se(j,{label:"Opacity",value:r.opacity,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,opacity:o})}),se(Xe,{label:"Star Burst",checked:r.starBurst,onChange:o=>t("lensflare",{...r,starBurst:o})})]})}function y0({pp:e,set:t,open:n,toggle:i}){let{depthOfField:r}=e;return Rs(Ie,{title:"Depth Of Field",tooltip:"Blurs areas that sit away from the focal plane for a camera-like look.",open:n.depthOfField,onToggle:()=>i("depthOfField"),disabled:!r.enabled,trailing:se(Ge,{checked:r.enabled,onChange:o=>t("depthOfField",{...r,enabled:o}),label:"Toggle DepthOfField"}),children:[se(j,{label:"Focus Distance",value:r.focusDistance,min:0,max:50,step:.1,onChange:o=>t("depthOfField",{...r,focusDistance:o})}),se(j,{label:"Focus Range",value:r.focusRange,min:.1,max:50,step:.1,onChange:o=>t("depthOfField",{...r,focusRange:o})}),se(j,{label:"Focal Length",value:r.focalLength,min:0,max:1,step:.01,onChange:o=>t("depthOfField",{...r,focalLength:o})}),se(j,{label:"Bokeh Scale",value:r.bokehScale,min:0,max:20,step:.1,onChange:o=>t("depthOfField",{...r,bokehScale:o})})]})}import{jsx as Be,jsxs as da}from"react/jsx-runtime";var iP=["linear","reinhard","aces"];function v0({pp:e,set:t,open:n,toggle:i}){let{colorAverage:r}=e;return Be(Ie,{title:"Color Average",tooltip:"Blends the frame toward a single average color for a washed-out stylized look.",open:n.colorAverage,onToggle:()=>i("colorAverage"),disabled:!r.enabled,trailing:Be(Ge,{checked:r.enabled,onChange:o=>t("colorAverage",{...r,enabled:o}),label:"Toggle ColorAverage"}),children:Be("div",{className:"se-placeholder",children:"Averages the frame color using the docs default blend mode."})})}function w0({pp:e,set:t,open:n,toggle:i}){let{brightnessContrast:r}=e;return da(Ie,{title:"Brightness Contrast",tooltip:"Raises or lowers overall brightness and contrast across the scene.",open:n.brightnessContrast,onToggle:()=>i("brightnessContrast"),disabled:!r.enabled,trailing:Be(Ge,{checked:r.enabled,onChange:o=>t("brightnessContrast",{...r,enabled:o}),label:"Toggle BrightnessContrast"}),children:[Be(j,{label:"Brightness",value:r.brightness,min:-1,max:1,step:.01,onChange:o=>t("brightnessContrast",{...r,brightness:o})}),Be(j,{label:"Contrast",value:r.contrast,min:-1,max:1,step:.01,onChange:o=>t("brightnessContrast",{...r,contrast:o})})]})}function C0({pp:e,set:t,open:n,toggle:i}){let{hueSaturation:r}=e;return da(Ie,{title:"Hue Saturation",tooltip:"Shifts the hue and saturation to tint the whole image.",open:n.hueSaturation,onToggle:()=>i("hueSaturation"),disabled:!r.enabled,trailing:Be(Ge,{checked:r.enabled,onChange:o=>t("hueSaturation",{...r,enabled:o}),label:"Toggle HueSaturation"}),children:[Be(j,{label:"Hue",value:r.hue,min:-Math.PI,max:Math.PI,step:.01,formatValue:o=>`${o.toFixed(2)} rad`,onChange:o=>t("hueSaturation",{...r,hue:o})}),Be(j,{label:"Saturation",value:r.saturation,min:-1,max:1,step:.01,onChange:o=>t("hueSaturation",{...r,saturation:o})})]})}function S0({pp:e,set:t,open:n,toggle:i}){let{vignette:r}=e;return da(Ie,{title:"Vignette",tooltip:"Darkens the edges of the screen so the center feels more focused.",open:n.vignette,onToggle:()=>i("vignette"),disabled:!r.enabled,trailing:Be(Ge,{checked:r.enabled,onChange:o=>t("vignette",{...r,enabled:o}),label:"Toggle Vignette"}),children:[Be(j,{label:"Offset",value:r.offset,min:0,max:1,step:.01,onChange:o=>t("vignette",{...r,offset:o})}),Be(j,{label:"Darkness",value:r.darkness,min:0,max:1,step:.01,onChange:o=>t("vignette",{...r,darkness:o})}),Be(Xe,{label:"Eskil",checked:r.eskil,onChange:o=>t("vignette",{...r,eskil:o})})]})}function M0({pp:e,set:t,open:n,toggle:i}){let{bloom:r}=e;return da(Ie,{title:"Bloom",tooltip:"Makes bright areas glow and bleed softly into nearby pixels.",open:n.bloom,onToggle:()=>i("bloom"),disabled:!r.enabled,trailing:Be(Ge,{checked:r.enabled,onChange:o=>t("bloom",{...r,enabled:o}),label:"Toggle Bloom"}),children:[Be(j,{label:"Threshold",value:r.luminanceThreshold,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,luminanceThreshold:o})}),Be(j,{label:"Smoothing",value:r.luminanceSmoothing,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,luminanceSmoothing:o})}),Be(j,{label:"Intensity",value:r.intensity,min:0,max:3,step:.05,onChange:o=>t("bloom",{...r,intensity:o})}),Be(Xe,{label:"Mipmap Blur",checked:r.mipmapBlur,onChange:o=>t("bloom",{...r,mipmapBlur:o})}),Be(j,{label:"Radius",value:r.radius,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,radius:o})}),Be(j,{label:"Levels",value:r.levels,min:1,max:16,step:1,onChange:o=>t("bloom",{...r,levels:o})})]})}function T0({pp:e,set:t,open:n,toggle:i}){let{toneMapping:r}=e;return da(Ie,{title:"Tone Mapping",tooltip:"Remaps HDR lighting to screen output and controls exposure style.",open:n.toneMapping,onToggle:()=>i("toneMapping"),disabled:!r.enabled,trailing:Be(Ge,{checked:r.enabled,onChange:o=>t("toneMapping",{...r,enabled:o}),label:"Toggle ToneMapping"}),children:[da("div",{className:"se-field",children:[Be("span",{className:"se-fieldLabel",children:"Mode"}),Be("div",{className:"se-segmentedControl",children:iP.map(o=>Be("button",{type:"button",className:`se-segmentedOption ${r.mode===o?"se-segmentedOption--active":""}`,onClick:()=>t("toneMapping",{...r,mode:o}),children:o==="aces"?"Filmic":o.charAt(0).toUpperCase()+o.slice(1)},o))})]}),Be(j,{label:"Resolution",value:r.resolution,min:64,max:4096,step:64,onChange:o=>t("toneMapping",{...r,resolution:o})}),Be(j,{label:"White Point",value:r.whitePoint,min:0,max:16,step:.01,onChange:o=>t("toneMapping",{...r,whitePoint:o})}),Be(j,{label:"Middle Grey",value:r.middleGrey,min:0,max:1,step:.01,onChange:o=>t("toneMapping",{...r,middleGrey:o})}),Be(j,{label:"Min Luminance",value:r.minLuminance,min:0,max:1,step:.01,onChange:o=>t("toneMapping",{...r,minLuminance:o})}),Be(j,{label:"Average Luminance",value:r.averageLuminance,min:0,max:4,step:.01,onChange:o=>t("toneMapping",{...r,averageLuminance:o})}),Be(j,{label:"Adaptation Rate",value:r.adaptationRate,min:0,max:10,step:.01,onChange:o=>t("toneMapping",{...r,adaptationRate:o})}),Be(j,{label:"Exposure",value:r.exposure,min:0,max:3,step:.01,onChange:o=>t("toneMapping",{...r,exposure:o})})]})}function P0({pp:e,set:t,open:n,toggle:i}){let{sepia:r}=e;return Be(Ie,{title:"Sepia",tooltip:"Adds a warm vintage brown tint to the entire image.",open:n.sepia,onToggle:()=>i("sepia"),disabled:!r.enabled,trailing:Be(Ge,{checked:r.enabled,onChange:o=>t("sepia",{...r,enabled:o}),label:"Toggle Sepia"}),children:Be(j,{label:"Intensity",value:r.intensity,min:0,max:1,step:.01,onChange:o=>t("sepia",{...r,intensity:o})})})}import{jsx as we,jsxs as ua}from"react/jsx-runtime";function k0({pp:e,set:t,open:n,toggle:i}){let{dotScreen:r}=e;return ua(Ie,{title:"Dot Screen",tooltip:"Overlays a halftone dot pattern for a printed or retro look.",open:n.dotScreen,onToggle:()=>i("dotScreen"),disabled:!r.enabled,trailing:we(Ge,{checked:r.enabled,onChange:o=>t("dotScreen",{...r,enabled:o}),label:"Toggle DotScreen"}),children:[we(j,{label:"Angle",value:r.angle,min:0,max:Math.PI*2,step:.01,formatValue:o=>`${o.toFixed(2)} rad`,onChange:o=>t("dotScreen",{...r,angle:o})}),we(j,{label:"Scale",value:r.scale,min:.1,max:10,step:.05,onChange:o=>t("dotScreen",{...r,scale:o})})]})}function _0({pp:e,set:t,open:n,toggle:i}){let{glitch:r}=e;return ua(Ie,{title:"Glitch",tooltip:"Introduces digital distortion, tearing, and scan noise.",open:n.glitch,onToggle:()=>i("glitch"),disabled:!r.enabled,trailing:we(Ge,{checked:r.enabled,onChange:o=>t("glitch",{...r,enabled:o}),label:"Toggle Glitch"}),children:[we(zn,{label:"Mode",value:r.mode,options:_h,onChange:o=>t("glitch",{...r,mode:o})}),we(uo,{label:"Delay",value:r.delay,min:0,max:10,step:.01,onChange:o=>t("glitch",{...r,delay:o})}),we(uo,{label:"Duration",value:r.duration,min:0,max:5,step:.01,onChange:o=>t("glitch",{...r,duration:o})}),we(uo,{label:"Strength",value:r.strength,min:0,max:2,step:.01,onChange:o=>t("glitch",{...r,strength:o})}),we(uo,{label:"Chromatic Aberration Offset",value:r.chromaticAberrationOffset,min:0,max:.02,step:1e-4,onChange:o=>t("glitch",{...r,chromaticAberrationOffset:o})}),we(j,{label:"Columns",value:r.columns,min:0,max:.5,step:.001,onChange:o=>t("glitch",{...r,columns:o})}),we(j,{label:"Ratio",value:r.ratio,min:0,max:1,step:.01,onChange:o=>t("glitch",{...r,ratio:o})})]})}function A0({pp:e,set:t,open:n,toggle:i}){let{grid:r}=e;return ua(Ie,{title:"Grid",tooltip:"Adds a visual grid overlay that feels retro or debug-like.",open:n.grid,onToggle:()=>i("grid"),disabled:!r.enabled,trailing:we(Ge,{checked:r.enabled,onChange:o=>t("grid",{...r,enabled:o}),label:"Toggle Grid"}),children:[we(j,{label:"Scale",value:r.scale,min:.1,max:10,step:.05,onChange:o=>t("grid",{...r,scale:o})}),we(j,{label:"Line Width",value:r.lineWidth,min:0,max:1,step:.01,onChange:o=>t("grid",{...r,lineWidth:o})})]})}function E0({pp:e,set:t,open:n,toggle:i}){let{chromaticAberration:r}=e;return ua(Ie,{title:"Chromatic Aberration",tooltip:"Separates color channels slightly to mimic lens fringing.",open:n.chromaticAberration,onToggle:()=>i("chromaticAberration"),disabled:!r.enabled,trailing:we(Ge,{checked:r.enabled,onChange:o=>t("chromaticAberration",{...r,enabled:o}),label:"Toggle ChromaticAberration"}),children:[we(j,{label:"Offset X",value:r.offsetX,min:0,max:.02,step:1e-4,onChange:o=>t("chromaticAberration",{...r,offsetX:o})}),we(j,{label:"Offset Y",value:r.offsetY,min:0,max:.02,step:1e-4,onChange:o=>t("chromaticAberration",{...r,offsetY:o})}),we(Xe,{label:"Radial Modulation",checked:r.radialModulation,onChange:o=>t("chromaticAberration",{...r,radialModulation:o})}),we(j,{label:"Modulation Offset",value:r.modulationOffset,min:0,max:1,step:.01,onChange:o=>t("chromaticAberration",{...r,modulationOffset:o})})]})}function R0({pp:e,set:t,open:n,toggle:i}){let{noise:r}=e;return ua(Ie,{title:"Noise",tooltip:"Adds film grain or static noise to the rendered image.",open:n.noise,onToggle:()=>i("noise"),disabled:!r.enabled,trailing:we(Ge,{checked:r.enabled,onChange:o=>t("noise",{...r,enabled:o}),label:"Toggle Noise"}),children:[we(j,{label:"Amount",value:r.opacity,min:0,max:1,step:.01,onChange:o=>t("noise",{...r,opacity:o})}),we(Xe,{label:"Premultiply",checked:r.premultiply,onChange:o=>t("noise",{...r,premultiply:o})})]})}function L0({pp:e,set:t,open:n,toggle:i}){let{scanline:r}=e;return we(Ie,{title:"Scan Line",tooltip:"Draws horizontal CRT-style scan lines over the frame.",open:n.scanline,onToggle:()=>i("scanline"),disabled:!r.enabled,trailing:we(Ge,{checked:r.enabled,onChange:o=>t("scanline",{...r,enabled:o}),label:"Toggle Scanline"}),children:we(j,{label:"Density",value:r.density,min:0,max:10,step:.25,onChange:o=>t("scanline",{...r,density:o})})})}function B0({pp:e,set:t,open:n,toggle:i}){let{pixelation:r}=e;return we(Ie,{title:"Pixelation",tooltip:"Reduces detail into larger pixels for a blocky stylized effect.",open:n.pixelation,onToggle:()=>i("pixelation"),disabled:!r.enabled,trailing:we(Ge,{checked:r.enabled,onChange:o=>t("pixelation",{...r,enabled:o}),label:"Toggle Pixelation"}),children:we(j,{label:"Granularity",value:r.granularity,min:0,max:20,step:1,onChange:o=>t("pixelation",{...r,granularity:o})})})}function D0({pp:e,set:t,open:n,toggle:i}){let{ramp:r}=e;return ua(Ie,{title:"Ramp",tooltip:"Adds a screen-space color gradient, or masks effects earlier in the stack.",open:n.ramp,onToggle:()=>i("ramp"),disabled:!r.enabled,trailing:we(Ge,{checked:r.enabled,onChange:o=>t("ramp",{...r,enabled:o}),label:"Toggle Ramp"}),children:[we(zn,{label:"Ramp Type",value:r.rampType,options:Ah,onChange:o=>t("ramp",{...r,rampType:o})}),we(uo,{label:"Ramp Start",value:r.rampStart,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampStart:o})}),we(uo,{label:"Ramp End",value:r.rampEnd,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampEnd:o})}),we(Qn,{label:"Start Color",value:r.startColor,onChange:o=>t("ramp",{...r,startColor:o})}),we(Qn,{label:"End Color",value:r.endColor,onChange:o=>t("ramp",{...r,endColor:o})}),!r.rampMask&&we(j,{label:"Gradient Opacity",value:r.opacity??.5,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,opacity:o})}),we(j,{label:"Bias",value:r.rampBias,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampBias:o})}),we(j,{label:"Gain",value:r.rampGain,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampGain:o})}),we(Xe,{label:"Mask Earlier Effects",checked:r.rampMask,onChange:o=>t("ramp",{...r,rampMask:o})}),we(Xe,{label:"Invert",checked:r.rampInvert,onChange:o=>t("ramp",{...r,rampInvert:o})})]})}import{jsx as vt,jsxs as z0}from"react/jsx-runtime";function O0({pp:e,set:t,open:n,toggle:i}){let{outline:r}=e;return z0(Ie,{title:"Outline",tooltip:"Draws a visible edge around the selected object binding.",open:n.outline,onToggle:()=>i("outline"),disabled:!r.enabled,trailing:vt(Ge,{checked:r.enabled,onChange:o=>t("outline",{...r,enabled:o}),label:"Toggle Outline"}),children:[vt("div",{className:"se-placeholder",children:"Outlines the currently selected object binding in the model editor."}),vt(j,{label:"Selection Layer",value:r.selectionLayer,min:0,max:20,step:1,onChange:o=>t("outline",{...r,selectionLayer:o})}),vt(j,{label:"Edge Strength",value:r.edgeStrength,min:0,max:10,step:.1,onChange:o=>t("outline",{...r,edgeStrength:o})}),vt(j,{label:"Pulse Speed",value:r.pulseSpeed,min:0,max:10,step:.1,onChange:o=>t("outline",{...r,pulseSpeed:o})}),vt(Qn,{label:"Visible Edge Color",value:r.visibleEdgeColor,onChange:o=>t("outline",{...r,visibleEdgeColor:o})}),vt(Qn,{label:"Hidden Edge Color",value:r.hiddenEdgeColor,onChange:o=>t("outline",{...r,hiddenEdgeColor:o})}),vt(zn,{label:"Kernel Size",value:r.kernelSize,options:Na,onChange:o=>t("outline",{...r,kernelSize:o})}),vt(Xe,{label:"Blur",checked:r.blur,onChange:o=>t("outline",{...r,blur:o})}),vt(Xe,{label:"X-Ray",checked:r.xRay,onChange:o=>t("outline",{...r,xRay:o})})]})}function N0({pp:e,set:t,open:n,toggle:i}){let{selectiveBloom:r}=e;return z0(Ie,{title:"Selective Bloom",tooltip:"Applies bloom only to objects assigned to the selected layer.",open:n.selectiveBloom,onToggle:()=>i("selectiveBloom"),disabled:!r.enabled,trailing:vt(Ge,{checked:r.enabled,onChange:o=>t("selectiveBloom",{...r,enabled:o}),label:"Toggle SelectiveBloom"}),children:[vt("div",{className:"se-placeholder",children:"Applies bloom to the currently selected object binding."}),vt(j,{label:"Selection Layer",value:r.selectionLayer,min:0,max:20,step:1,onChange:o=>t("selectiveBloom",{...r,selectionLayer:o})}),vt(j,{label:"Intensity",value:r.intensity,min:0,max:5,step:.05,onChange:o=>t("selectiveBloom",{...r,intensity:o})}),vt(j,{label:"Threshold",value:r.luminanceThreshold,min:0,max:1,step:.01,onChange:o=>t("selectiveBloom",{...r,luminanceThreshold:o})}),vt(j,{label:"Smoothing",value:r.luminanceSmoothing,min:0,max:1,step:.01,onChange:o=>t("selectiveBloom",{...r,luminanceSmoothing:o})}),vt(zn,{label:"Kernel Size",value:r.kernelSize,options:Na,onChange:o=>t("selectiveBloom",{...r,kernelSize:o})}),vt(Xe,{label:"Mipmap Blur",checked:r.mipmapBlur,onChange:o=>t("selectiveBloom",{...r,mipmapBlur:o})}),vt(Xe,{label:"Inverted",checked:r.inverted,onChange:o=>t("selectiveBloom",{...r,inverted:o})}),vt(Xe,{label:"Ignore Background",checked:r.ignoreBackground,onChange:o=>t("selectiveBloom",{...r,ignoreBackground:o})})]})}function I0({pp:e,set:t,open:n,toggle:i}){let{smaa:r}=e;return vt(Ie,{title:"SMAA",tooltip:"Reduces jagged edges with subpixel anti-aliasing.",open:n.smaa,onToggle:()=>i("smaa"),trailing:vt(Ge,{checked:r.enabled,onChange:o=>t("smaa",{...r,enabled:o}),label:"Toggle SMAA"}),children:vt("div",{className:"se-placeholder",children:"Subpixel Morphological Anti-Aliasing smooths jagged edges in post-process."})})}import{jsx as wt,jsxs as aP}from"react/jsx-runtime";function Pp({config:e,onChange:t}){let[n,i]=oP({autofocus:!1,colorAverage:!1,dotScreen:!1,glitch:!1,godRays:!1,grid:!1,lensflare:!1,outline:!1,selectiveBloom:!1,ramp:!1,ssao:!1,brightnessContrast:!1,hueSaturation:!1,depthOfField:!1,chromaticAberration:!1,vignette:!1,bloom:!1,toneMapping:!1,noise:!1,sepia:!1,scanline:!1,pixelation:!1,smaa:!1}),r=c=>i(l=>({...l,[c]:!l[c]})),o=e.postProcessing,s={pp:o,set:(c,l)=>t({...e,postProcessing:{...o,[c]:l}}),open:n,toggle:r};return aP("div",{className:"se-generalContent",children:[wt(g0,{...s}),wt(b0,{...s}),wt(v0,{...s}),wt(k0,{...s}),wt(_0,{...s}),wt(f0,{...s}),wt(A0,{...s}),wt(x0,{...s}),wt(O0,{...s}),wt(N0,{...s}),wt(w0,{...s}),wt(C0,{...s}),wt(y0,{...s}),wt(E0,{...s}),wt(S0,{...s}),wt(M0,{...s}),wt(T0,{...s}),wt(R0,{...s}),wt(P0,{...s}),wt(L0,{...s}),wt(B0,{...s}),wt(D0,{...s}),wt(I0,{...s})]})}import{useState as F0,useSyncExternalStore as sP}from"react";import{Eye as lP,EyeOff as cP,Plus as dP,Trash2 as uP}from"lucide-react";import{Fragment as j0,jsx as xe,jsxs as Fn}from"react/jsx-runtime";var pP=["512","1024","2048","4096"],U0={none:"None",directional:"Direction",point:"Point",spot:"Spot",hemisphere:"Hemi"};function hP({index:e,light:t,selected:n,onSelect:i,onToggleVisible:r}){return Fn("div",{className:`se-lightRow ${n?"se-lightRow--active":""}`,onClick:i,children:[Fn("span",{className:"se-lightRowLabel",children:[e+1,": ",U0[t.type]]}),xe("button",{type:"button",className:"se-iconButton","aria-label":t.visible?"Hide light":"Show light",onClick:o=>{o.stopPropagation(),r()},children:t.visible?xe(lP,{size:14}):xe(cP,{size:14})})]})}function mP(){return{id:crypto.randomUUID(),type:"directional",color:"#ffffff",intensity:1,position:[5,10,5],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0}}function kp({config:e,onChange:t}){let[n,i]=F0({lights:!0,shadows:!1,groundShadows:!1,environment:!1,envShadow:!1}),r=sP(gp,Pc),[o,a]=F0(e.lighting.lights[0]?.id??null),s=r??o,c=x=>{a(x),ks(x)},l=x=>i(C=>({...C,[x]:!C[x]})),{tier:u}=qn(),d=Kr(u,"starter"),{lighting:h,shadows:b,groundShadows:m,environment:y}=e,k=x=>t({...e,lighting:x}),w=x=>t({...e,shadows:x}),p=x=>t({...e,groundShadows:x}),g=x=>t({...e,environment:x}),S=(x,C)=>{k({...h,lights:h.lights.map(P=>P.id===x?{...P,...C}:P)})},v=h.lights.find(x=>x.id===s)??null,M=()=>{let x=mP();k({...h,lights:[...h.lights,x]}),c(x.id)},D=()=>{if(!v)return;let x=h.lights.filter(C=>C.id!==v.id);k({...h,lights:x}),c(x[0]?.id??null)};return Fn("div",{className:"se-generalContent",children:[Fn(Ie,{title:"Lights",open:n.lights,onToggle:()=>l("lights"),children:[xe("div",{className:"se-lightList",children:h.lights.map((x,C)=>xe(hP,{index:C,light:x,selected:x.id===s,onSelect:()=>c(x.id),onToggleVisible:()=>S(x.id,{visible:!x.visible})},x.id))}),Fn("div",{className:"se-lightActions",children:[xe("button",{type:"button",className:"se-iconButton",onClick:M,title:"Add light",children:xe(dP,{size:14})}),v&&h.lights.length>1&&xe("button",{type:"button",className:"se-iconButton",onClick:D,title:"Remove selected light",children:xe(uP,{size:14})})]}),v?Fn("div",{className:"se-lightProps",children:[Fn("div",{className:"se-field",children:[xe("span",{className:"se-fieldLabel",children:"Type"}),xe("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:Th.map(x=>xe("button",{type:"button",className:`se-segmentedOption ${v.type===x?"se-segmentedOption--active":""}`,onClick:()=>S(v.id,{type:x}),children:U0[x]},x))})]}),xe(Qn,{label:"Color",value:v.color,onChange:x=>S(v.id,{color:x})}),xe(j,{label:"Intensity",value:v.intensity,min:0,max:10,step:.1,onChange:x=>S(v.id,{intensity:x})}),v.type!=="hemisphere"&&v.type!=="none"&&xe(fi,{label:"Position",value:v.position,min:-100,max:100,step:.05,onChange:x=>S(v.id,{position:x})}),v.type==="spot"&&Fn(j0,{children:[xe(j,{label:"Angle",value:v.angle??Math.PI/6,min:0,max:Math.PI/2,step:.01,formatValue:x=>`${Math.round(x*180/Math.PI)}\xB0`,onChange:x=>S(v.id,{angle:x})}),xe(j,{label:"Penumbra",value:v.penumbra??.2,min:0,max:1,step:.01,onChange:x=>S(v.id,{penumbra:x})}),xe(j,{label:"Distance",value:v.distance??0,min:0,max:100,step:.5,onChange:x=>S(v.id,{distance:x})}),xe(j,{label:"Decay",value:v.decay??2,min:0,max:4,step:.1,onChange:x=>S(v.id,{decay:x})})]}),xe(Xe,{label:"Attached to camera",checked:v.attachedToCamera,onChange:x=>S(v.id,{attachedToCamera:x})}),xe(Xe,{label:"Cast shadows",checked:v.castShadow,onChange:x=>S(v.id,{castShadow:x})}),xe(j,{label:"Shadow bias",value:v.shadowBias,min:-.01,max:.01,step:1e-4,onChange:x=>S(v.id,{shadowBias:x})})]}):null]}),Fn(Ie,{title:"Shadows",open:n.shadows,onToggle:()=>l("shadows"),disabled:!b.enabled,trailing:xe(Ge,{checked:b.enabled,onChange:x=>w({...b,enabled:x}),label:"Toggle shadows"}),children:[xe(zn,{label:"Map size",value:String(b.mapSize),options:pP,onChange:x=>w({...b,mapSize:Number(x)})}),xe(j,{label:"Bias",value:b.bias,min:-.01,max:.01,step:1e-4,onChange:x=>w({...b,bias:x})}),xe(j,{label:"Normal bias",value:b.normalBias,min:0,max:.2,step:.01,onChange:x=>w({...b,normalBias:x})}),xe(j,{label:"Radius (softness)",value:b.radius,min:0,max:20,step:.5,onChange:x=>w({...b,radius:x})})]}),Fn(Ie,{title:"Ground Shadows",open:n.groundShadows,onToggle:()=>l("groundShadows"),disabled:!m.enabled,trailing:xe(Ge,{checked:m.enabled,onChange:x=>p({...m,enabled:x}),label:"Toggle ground shadows"}),children:[Fn("div",{className:"se-field",children:[xe("span",{className:"se-fieldLabel",children:"Mode"}),xe("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:["shadowCatcher"].map(x=>xe("button",{type:"button",className:`se-segmentedOption ${m.mode===x?"se-segmentedOption--active":""}`,onClick:()=>p({...m,mode:x}),children:x==="shadowCatcher"?"Shadow Catcher":"Baked AO"},x))})]}),m.mode==="bakedAO"&&xe("div",{className:"se-placeholder",children:"Requires pre-baked AO textures \u2014 not yet available."}),xe(j,{label:"Intensity",value:m.intensity,min:0,max:1,step:.01,onChange:x=>p({...m,intensity:x})}),xe(j,{label:"Border fade",value:m.borderFade,min:0,max:10,step:.1,onChange:x=>p({...m,borderFade:x})}),xe(j,{label:"Height",value:m.height,min:-5,max:5,step:.1,onChange:x=>p({...m,height:x})}),xe(j,{label:"Size",value:m.size,min:1,max:50,step:.5,onChange:x=>p({...m,size:x})})]}),xe(Ie,{title:"Environment",open:n.environment,onToggle:()=>l("environment"),children:d?Fn(j0,{children:[xe(j,{label:"Orientation",value:y.rotation,min:0,max:360,step:1,formatValue:x=>`${x}\xB0`,onChange:x=>g({...y,rotation:x})}),xe(j,{label:"Brightness",value:y.intensity,min:0,max:3,step:.05,onChange:x=>g({...y,intensity:x})}),Fn(Ie,{title:"Shadow",open:n.envShadow,onToggle:()=>l("envShadow"),trailing:xe(Ge,{checked:y.shadowLight.enabled,onChange:x=>g({...y,shadowLight:{...y.shadowLight,enabled:x}}),label:"Toggle environment shadow light"}),disabled:!y.shadowLight.enabled,children:[xe(j,{label:"Light intensity",value:y.shadowLight.intensity,min:0,max:20,step:.1,onChange:x=>g({...y,shadowLight:{...y.shadowLight,intensity:x}})}),xe(j,{label:"Shadow bias",value:y.shadowLight.bias,min:-.01,max:.01,step:1e-4,onChange:x=>g({...y,shadowLight:{...y.shadowLight,bias:x}})})]})]}):xe(Dn,{requiredTier:"starter",feature:"Environment lighting"})})]})}import{useMemo as gP,useState as bP}from"react";import{ChevronDown as fP,Pause as xP,Play as yP,Square as vP,Trash2 as wP}from"lucide-react";import{jsx as ze,jsxs as Ct}from"react/jsx-runtime";function CP(e){if(!Number.isFinite(e)||e<=0)return"Unknown duration";let t=Math.round(e*10)/10;if(t<60)return`${t.toFixed(1)}s`;let n=Math.floor(t/60),i=(t%60).toFixed(1).padStart(4,"0");return`${n}:${i}`}function V0(e){let t=Number.isFinite(e)&&e>0?e:0;if(t<60)return`${t.toFixed(1)}s`;let n=Math.floor(t/60),i=(t%60).toFixed(1).padStart(4,"0");return`${n}:${i}`}function SP(e){return Number.isFinite(e)?Math.min(3,Math.max(.1,Number(e.toFixed(2)))):1}function _p({config:e,onChange:t,clipDetails:n,currentClip:i,isPlaying:r,time:o,play:a,pause:s,stop:c,setSpeed:l,seek:u}){let[d,h]=bP(!1),b=gP(()=>new Map(n.map(x=>[x.sourceName,x.duration])),[n]),m=e.animations.clips.filter(x=>!x.hidden),y=e.animations.clips.filter(x=>x.hidden),k=(x,C=e.animations.autoplayClip)=>{t({...e,animations:{clips:x(e.animations.clips),autoplayClip:C}})},w=(x,C)=>{k(P=>P.map(_=>_.sourceName===x?C(_):_))},p=(x,C)=>{w(x,P=>({...P,loopMode:C}))},g=(x,C)=>{let P=SP(C);w(x,_=>({..._,speed:P})),i===x&&l(P)},S=(x,C)=>{w(x,P=>({...P,displayName:C}))},v=x=>{let C=e.animations.autoplayClip===x?null:x;t({...e,animations:{...e.animations,autoplayClip:C}})},M=x=>{k(C=>C.map(P=>P.sourceName===x?{...P,hidden:!0}:P),e.animations.autoplayClip===x?null:e.animations.autoplayClip),i===x&&c()},D=x=>{k(C=>C.map(P=>P.sourceName===x?{...P,hidden:!1}:P))};return e.animations.clips.length===0?ze(co,{title:"Animations",children:ze("div",{className:"se-helperCard",children:"Upload a model with embedded animations to manage playback, naming, autoplay, and per-clip speed here."})}):Ct(co,{title:"Animations",children:[m.length===0&&ze("div",{className:"se-helperCard",children:ze("span",{children:"Preview clips directly in the viewer, choose one optional autoplay animation, and use soft delete to hide clips without modifying the GLB."})}),m.length===0?ze("div",{className:"se-placeholder",children:"All animations are currently removed. Restore a clip below to make it available again."}):ze("div",{className:"se-animationList",children:m.map(x=>{let C=i===x.sourceName,P=b.get(x.sourceName)??0;return Ct("article",{className:`se-animationCard ${C?"se-animationCard--active":""}`,children:[Ct("div",{className:"se-animationHeader",children:[Ct("div",{className:"se-animationHeading",children:[Ct("div",{className:"se-animationTitleRow",children:[ze("span",{className:"se-animationStatus",children:C?r?"Playing":"Paused":"Ready"}),e.animations.autoplayClip===x.sourceName?ze("span",{className:"se-animationBadge",children:"Autoplay"}):null]}),ze("div",{className:"se-animationSource",children:x.sourceName})]}),ze("button",{type:"button",className:"se-animationDangerButton",onClick:()=>M(x.sourceName),title:"Remove animation",children:ze(wP,{size:16})})]}),Ct("div",{className:"se-field",children:[ze("span",{className:"se-fieldLabel",children:"Display name"}),ze("input",{className:"se-textInput",value:x.displayName,onChange:z=>S(x.sourceName,z.target.value),placeholder:"Animation name"})]}),Ct("div",{className:"se-animationMeta",children:[ze("span",{children:CP(P)}),ze("span",{children:x.loopMode==="once"?"Play once":"Looping"}),Ct("span",{children:[x.speed.toFixed(2),"x"]})]}),Ct("div",{className:"se-animationButtonRow",children:[(()=>{let z=C&&r;return ze("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:()=>z?s():a(x.sourceName),"aria-label":z?"Pause":"Play",title:z?"Pause":"Play",children:z?ze(xP,{size:16}):ze(yP,{size:16})})})(),ze("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:c,disabled:!C,"aria-label":"Stop",title:"Stop",children:ze(vP,{size:16})})]}),Ct("div",{className:"se-animationSeekRow",children:[ze("input",{className:"se-slider se-animationSeek",type:"range",min:0,max:Math.max(P,.001),step:.01,value:C?Math.min(o,P):0,disabled:!C||P<=0,onChange:z=>u(Number(z.target.value)),"aria-label":"Seek"}),Ct("span",{className:"se-animationSeekTime",children:[V0(C?Math.min(o,P):0)," / ",V0(P)]})]}),Ct("div",{className:"se-animationGrid",children:[Ct("label",{className:"se-field",children:[ze("span",{className:"se-fieldLabel",children:"Loop mode"}),Ct("select",{className:"se-select",value:x.loopMode,onChange:z=>p(x.sourceName,z.target.value),children:[ze("option",{value:"repeat",children:"Loop"}),ze("option",{value:"once",children:"Play Once"})]})]}),Ct("label",{className:"se-field",children:[Ct("span",{className:"se-fieldLabel",children:["Speed",Ct("span",{className:"se-fieldValue",children:[x.speed.toFixed(2),"x"]})]}),Ct("div",{className:"se-animationSpeedRow",children:[ze("input",{className:"se-slider",type:"range",min:.1,max:3,step:.1,value:x.speed,onChange:z=>g(x.sourceName,Number(z.target.value))}),ze("input",{className:"se-numberInput se-animationSpeedInput",type:"number",min:.1,max:3,step:.1,value:x.speed,onChange:z=>g(x.sourceName,Number(z.target.value))})]})]})]}),ze("button",{type:"button",className:`se-animationAutoplayButton ${e.animations.autoplayClip===x.sourceName?"se-animationAutoplayButton--active":""}`,onClick:()=>v(x.sourceName),children:e.animations.autoplayClip===x.sourceName?"Disable autoplay":"Set as autoplay"})]},x.sourceName)})}),y.length>0?Ct("section",{className:"se-removedAnimations",children:[ze("button",{type:"button",className:"se-panelHeader",onClick:()=>h(x=>!x),children:Ct("span",{className:"se-panelHeaderMain",children:[ze(fP,{size:16,className:`se-panelChevron ${d?"se-panelChevron--open":""}`}),Ct("span",{className:"se-panelTitle",children:["Removed Animations (",y.length,")"]})]})}),d?ze("div",{className:"se-removedAnimationList",children:y.map(x=>Ct("div",{className:"se-removedAnimationRow",children:[Ct("div",{children:[ze("div",{className:"se-removedAnimationName",children:x.displayName||x.sourceName}),ze("div",{className:"se-animationSource",children:x.sourceName})]}),ze("button",{type:"button",className:"se-animationButton",onClick:()=>D(x.sourceName),children:"Restore"})]},x.sourceName))}):null]}):null]})}import{useState as G0}from"react";import{Pencil as MP,Trash2 as TP}from"lucide-react";import{jsx as sn,jsxs as Jn}from"react/jsx-runtime";function Ap({config:e,onChange:t}){let[n,i]=G0(null),[r,o]=G0({title:"",description:""}),a=e.annotations,s=d=>{i(d),o({title:d.title,description:d.description||""})},c=()=>{if(!n||!r.title.trim())return;let d=a.map(h=>h.id===n.id?{...h,title:r.title.trim(),description:r.description||""}:h);t({...e,annotations:d}),i(null),o({title:"",description:""})},l=d=>{if(window.confirm("Delete this annotation?")){let b=a.filter(m=>m.id!==d).map((m,y)=>({...m,id:y+1}));t({...e,annotations:b}),i(null),o({title:"",description:""})}},u=()=>{i(null),o({title:"",description:""})};return Jn(co,{title:"Annotations",children:[e.annotations.length===0?sn("div",{className:"bb-emptyAnnotations",children:"No annotations yet. Double-click on the model to add one."}):sn("div",{className:"bb-annotationsList",children:e.annotations.map(d=>Jn("div",{className:"bb-annotationCard",children:[Jn("div",{className:"bb-annotationHeader",children:[Jn("div",{className:"bb-annotationBadge",children:["#",d.id]}),Jn("div",{className:"bb-annotationActions",children:[sn("button",{className:"bb-annotationAction bb-annotationAction--edit",onClick:()=>s(d),title:"Edit annotation",children:sn(MP,{size:16})}),sn("button",{className:"bb-annotationAction bb-annotationAction--delete",onClick:()=>l(d.id),title:"Delete annotation",children:sn(TP,{size:16})})]})]}),sn("div",{className:"bb-annotationTitle",children:d.title}),d.description&&sn("div",{className:"bb-annotationDescription",children:d.description}),Jn("div",{className:"bb-annotationPosition",children:["Position: [",d.worldPosition[0].toFixed(2),","," ",d.worldPosition[1].toFixed(2),","," ",d.worldPosition[2].toFixed(2),"]"]})]},d.id))}),n&&sn("div",{className:"bb-editAnnotationOverlay",onClick:u,children:Jn("div",{className:"bb-editAnnotationPopup",onClick:d=>d.stopPropagation(),children:[Jn("div",{className:"bb-editAnnotationHeader",children:[sn("h3",{className:"bb-editAnnotationTitle",children:"Edit Annotation"}),sn("button",{className:"bb-editAnnotationClose",onClick:u,children:"\xD7"})]}),Jn("div",{className:"bb-editAnnotationBody",children:[Jn("div",{className:"bb-field",children:[sn("label",{className:"bb-label",children:"Title"}),sn("input",{className:"bb-input",value:r.title,onChange:d=>o({...r,title:d.target.value}),placeholder:"Enter annotation title"})]}),Jn("div",{className:"bb-field",children:[sn("label",{className:"bb-label",children:"Description"}),sn("textarea",{className:"bb-textarea",value:r.description,onChange:d=>o({...r,description:d.target.value}),placeholder:"Enter annotation description",rows:3})]}),Jn("div",{className:"bb-editAnnotationActions",children:[sn("button",{className:"bb-button",onClick:u,children:"Cancel"}),sn("button",{className:"bb-button bb-button--primary",onClick:c,disabled:!r.title.trim(),children:"Save"}),sn("button",{className:"bb-button bb-button--danger",onClick:()=>l(n.id),children:"Delete"})]})]})]})})]})}import{useState as PP,useCallback as po}from"react";import{ArrowDown as kP,ArrowUp as _P,MapPin as AP,Plus as EP,Trash2 as RP,Settings as LP}from"lucide-react";import{Fragment as DP,jsx as lt,jsxs as Vt}from"react/jsx-runtime";var BP={enabled:!0,waypoints:[],loop:!0,autoPlay:!1},ho=3.5;function Ep({config:e,onChange:t,cameraState:n,onPreviewWaypoint:i}){let r=e.cinematic??BP,{waypoints:o}=r,a=po((w,p)=>{if(w.length<2)return 0;let g=0;for(let S=0;S<w.length-1;S++){let v=w[S].segmentDuration??ho;g+=v}return p&&w.length>1&&(g+=w[w.length-1].segmentDuration??ho),Math.max(g,0)},[]),s=po(w=>{t({...e,cinematic:{...r,...w}})},[e,r,t]),c=po(()=>{if(!n)return;let w={position:[...n.position],target:[...n.target],...n.azimuthAngle!=null?{azimuthAngle:n.azimuthAngle}:{},...n.polarAngle!=null?{polarAngle:n.polarAngle}:{},segmentDuration:ho},p=[...o,w],g=a(p,r.loop);s({waypoints:p,duration:g})},[n,o,r.loop,a,s]),l=po(w=>{let p=o.filter((S,v)=>v!==w),g=a(p,r.loop);s({waypoints:p,duration:g})},[o,r.loop,a,s]),u=po((w,p)=>{let g=w+p;if(g<0||g>=o.length)return;let S=[...o];[S[w],S[g]]=[S[g],S[w]];let v=a(S,r.loop);s({waypoints:S,duration:v})},[o,r.loop,a,s]),d=po((w,p)=>{let g=o.map((v,M)=>M===w?{...v,...p}:v),S=a(g,r.loop);s({waypoints:g,duration:S})},[o,r.loop,a,s]),[h,b]=PP(!1),m=o.some(w=>w.segmentDuration!==void 0),y=po(w=>w>=o.length-1?ho:o[w]?.segmentDuration??ho,[o]),k=o.length>=2;return Vt(co,{title:"Cinematic Camera",children:[lt("p",{className:"se-cinematicHint",children:"Frame the model in the viewer, then capture it as a waypoint. The camera glides through the waypoints in order \u2014 enable and press play in the viewer to preview."}),Vt("button",{type:"button",className:"bb-button bb-button--primary se-cinematicAdd",onClick:c,disabled:!n,title:"Capture the current camera view as a waypoint",children:[lt(EP,{size:15}),"Add waypoint from current view"]}),Vt("div",{className:"se-customizeToggle",children:[Vt("label",{className:"se-toggleLabel",children:[lt("input",{type:"checkbox",checked:h,onChange:w=>b(w.target.checked)}),lt(LP,{size:14}),lt("span",{children:"Customize durations between waypoints"})]}),h&&Vt("span",{className:"se-toggleHint",children:["Set duration for each segment between waypoints: 1\u21922, 2\u21923, etc. Default: ",ho,"s"]})]}),o.length===0?lt("div",{className:"bb-emptyAnnotations",children:"No waypoints yet. Position the camera and add your first one."}):Vt(DP,{children:[lt("div",{className:"se-waypointList",children:o.map((w,p)=>{let g=y(p),S=p===o.length-1,v=w.segmentDuration!==void 0&&w.segmentDuration!==ho;return Vt("div",{children:[Vt("div",{className:"se-waypointCard",children:[lt("div",{className:"se-waypointBadge",children:p+1}),Vt("div",{className:"se-waypointBody",children:[Vt("div",{className:"se-waypointCoords",children:["pos [",w.position.map(M=>M.toFixed(1)).join(", "),"]"]}),Vt("div",{className:"se-waypointCoords",children:["look [",w.target.map(M=>M.toFixed(1)).join(", "),"]"]}),h&&!S&&Vt("div",{className:`se-customBadge ${v?"se-customBadge--custom":"se-customBadge--default"}`,children:[g.toFixed(1),"s",!v&&" (default)"]})]}),Vt("div",{className:"se-waypointActions",children:[lt("button",{className:"se-waypointAction",onClick:()=>i?.(w),title:"Fly camera to this waypoint",disabled:!i,children:lt(AP,{size:15})}),lt("button",{className:"se-waypointAction",onClick:()=>u(p,-1),title:"Move up",disabled:p===0,children:lt(_P,{size:15})}),lt("button",{className:"se-waypointAction",onClick:()=>u(p,1),title:"Move down",disabled:S,children:lt(kP,{size:15})}),lt("button",{className:"se-waypointAction se-waypointAction--delete",onClick:()=>l(p),title:"Delete waypoint",children:lt(RP,{size:15})})]})]}),h&&!S&&Vt("div",{className:"se-segmentBetween",children:[Vt("div",{className:"se-segmentLabel",children:[p+1," \u2192 ",p+2,!w.segmentDuration&&" (default)"]}),Vt("div",{className:"se-segmentControls",children:[lt("span",{className:"se-durationLabel",children:"Duration:"}),lt("input",{type:"range",className:"se-segmentSlider",min:1,max:20,step:.5,value:g,onChange:M=>{let D=parseFloat(M.target.value);d(p,{segmentDuration:D})}}),Vt("span",{className:"se-segmentValue",children:[g.toFixed(1),"s"]}),Vt("div",{className:"se-presetButtons",children:[[2,4,6,8].map(M=>Vt("button",{className:"se-presetButton",onClick:()=>d(p,{segmentDuration:M}),children:[M,"s"]},`preset-${p}-${M}`)),lt("button",{className:"se-presetButton se-presetButton--default",onClick:()=>{let M=o.map((x,C)=>{if(C===p){let{segmentDuration:P,..._}=x;return _}return x}),D=a(M,r.loop);s({waypoints:M,duration:D})},children:"Reset"})]})]})]})]},`waypoint-wrapper-${p}`)})}),Vt("div",{className:"se-totalDuration",children:[lt("span",{className:"se-totalLabel",children:"Total duration:"}),lt("span",{className:"se-totalValue",children:k?(r.duration??a(o,r.loop)).toFixed(1)+"s":"-"}),!k&<("span",{className:"se-totalHint",children:"(need at least 2 waypoints)"})]})]}),lt(Xe,{label:"Enable cinematic camera",checked:r.enabled,onChange:w=>s({enabled:w})}),lt(Xe,{label:"Loop",checked:r.loop,onChange:w=>{let p=w,g=a(o,p);s({loop:p,duration:g})}}),lt(Xe,{label:"Auto-play on load",checked:r.autoPlay,onChange:w=>s({autoPlay:w})}),!h&&k&<(j,{label:"Duration",value:r.duration??a(o,r.loop),min:4,max:120,step:1,formatValue:w=>`${w}s`,onChange:w=>s({duration:w})})]})}import{Box as IP,Clapperboard as zP,MessageSquareText as FP,Sparkles as jP,Spotlight as UP,Video as VP}from"lucide-react";import{jsx as ln,jsxs as HP}from"react/jsx-runtime";var GP=[{label:"General",icon:ln(IP,{})},{label:"Lighting",icon:ln(UP,{})},{label:"Animations",icon:ln(zP,{})},{label:"Post Processing",icon:ln(jP,{})},{label:"Annotations",icon:ln(FP,{})},{label:"Cinematic",icon:ln(VP,{})}],H0={currentClip:null,isPlaying:!1,time:0,duration:0,play:()=>{},pause:()=>{},stop:()=>{},setSpeed:()=>{},seek:()=>{}};function Rp({config:e,onChange:t,activeSubTab:n,onActiveSubTabChange:i,cameraState:r=null,onPreviewWaypoint:o,animationClipDetails:a=[],animationPlayback:s=H0}){let[c,l]=OP("General"),u=n??c,d=s??H0,{tier:h}=qn(),b=Kr(h,"starter"),m=Kr(h,"growth");NP(()=>{n!==void 0&&l(n)},[n]);let y=k=>{n===void 0&&l(k),i?.(k)};return HP("div",{className:"se-tabContent",children:[ln("div",{className:"se-subTabRow",children:GP.map(k=>ln("button",{type:"button",title:k.label,className:`se-subTab ${u===k.label?"se-subTab--active":""}`,onClick:()=>y(k.label),children:k.icon},k.label))}),u==="General"&&ln(Tp,{config:e,onChange:t}),u==="Lighting"&&ln(kp,{config:e,onChange:t}),u==="Animations"&&(b?ln(_p,{config:e,onChange:t,clipDetails:a,currentClip:d.currentClip,isPlaying:d.isPlaying,time:d.time,duration:d.duration,play:d.play,pause:d.pause,stop:d.stop,setSpeed:d.setSpeed,seek:d.seek}):ln(Dn,{requiredTier:"starter",feature:"Animation configuration"})),u==="Post Processing"&&(m?ln(Pp,{config:e,onChange:t}):ln(Dn,{requiredTier:"growth",feature:"Post-processing effects"})),u==="Annotations"&&(b?ln(Ap,{config:e,onChange:t}):ln(Dn,{requiredTier:"starter",feature:"Annotations"})),u==="Cinematic"&&(b?ln(Ep,{config:e,onChange:t,cameraState:r,onPreviewWaypoint:o}):ln(Dn,{requiredTier:"starter",feature:"Cinematic camera"}))]})}import{ChevronDown as W0,Info as $0}from"lucide-react";import{jsx as Pn,jsxs as mo}from"react/jsx-runtime";function X0({title:e,trailing:t,children:n,disabled:i,open:r,onToggle:o,tooltip:a}){let s=a?`${a}`:e;return mo("div",{className:"bb-materialPanel",children:[mo("button",{type:"button",className:"bb-materialPanelHeader",onClick:o,"aria-expanded":r,title:s,children:[mo("div",{className:"bb-materialPanelTitleWrap",children:[Pn(W0,{size:14,className:`bb-materialPanelChevron ${r?"bb-materialPanelChevron--open":""}`}),Pn("span",{className:"bb-materialPanelTitle",children:e}),a?Pn("span",{className:"bb-materialPanelHelp",title:s,"aria-label":s,role:"img",onClick:c=>c.stopPropagation(),children:Pn($0,{size:12})}):null]}),t?Pn("div",{onClick:c=>c.stopPropagation(),children:t}):null]}),r?Pn("div",{className:"bb-materialPanelBody",style:i?{opacity:.45,pointerEvents:"none"}:void 0,children:n}):null]})}function On({title:e,open:t,onToggle:n,trailing:i,children:r,tooltip:o}){let a=o?`${e}: ${o}`:e;return mo("div",{className:"bb-section",children:[mo("button",{type:"button",className:"bb-sectionHeaderButton",onClick:n,"aria-expanded":t,title:a,children:[mo("span",{className:"bb-sectionHeaderMain",children:[Pn(W0,{size:15,className:`bb-sectionChevron ${t?"bb-sectionChevron--open":""}`}),Pn("h2",{className:"bb-sectionTitle",children:e}),o?Pn("span",{className:"bb-sectionHelp",title:a,"aria-label":a,role:"img",onClick:s=>s.stopPropagation(),children:Pn($0,{size:13})}):null]}),i?Pn("span",{onClick:s=>s.stopPropagation(),children:i}):null]}),t?Pn("div",{className:"bb-sectionBody",children:r}):null]})}function q0({checked:e,onChange:t,label:n}){return mo("label",{className:"se-switch","aria-label":n,children:[Pn("input",{type:"checkbox",checked:e,onChange:i=>t(i.target.checked)}),Pn("span",{className:"se-switchTrack",children:Pn("span",{className:"se-switchThumb"})})]})}import{useState as Q0}from"react";import{jsx as Lp}from"react/jsx-runtime";function jn({panelKey:e,title:t,tooltip:n,toggleLabel:i,controls:r,children:o,requiredTier:a}){let{openMaterialPanels:s,materialPanelEnabled:c,onToggleMaterialPanel:l,onSetMaterialPanelState:u}=r,d=a?.locked??!1;return Lp(X0,{title:t,tooltip:n,disabled:d||!c[e],open:s[e],onToggle:()=>l(e),trailing:Lp(q0,{checked:!d&&c[e],onChange:d?()=>{}:h=>u(e,h),label:i??`Toggle ${t}`}),children:d&&a?Lp(Dn,{requiredTier:a.tier,feature:t}):o})}import{useRef as Y0,useState as WP}from"react";import{HexColorInput as $P,HexColorPicker as XP}from"react-colorful";import{FileUp as qP}from"lucide-react";import{jsx as Gt,jsxs as xi}from"react/jsx-runtime";function Ht({label:e,value:t,placeholder:n,onChange:i}){let r=Y0(null);return xi("div",{className:"bb-field bb-field--full",children:[Gt("label",{className:"bb-label",children:e}),xi("div",{className:"bb-fileField",children:[Gt("input",{className:"bb-input bb-fileField-input",placeholder:n,value:t,onChange:o=>{let a=o.target.value;!a&&t&&wd(t),i(a)}}),Gt("button",{type:"button",className:"bb-fileFieldButton",onClick:()=>r.current?.click(),"aria-label":`Select file for ${e}`,title:`Select file for ${e}`,children:Gt(qP,{size:20})}),Gt("input",{ref:r,type:"file",accept:"image/png,image/jpeg,image/webp,image/avif",className:"bb-hiddenInput",onChange:o=>{let a=o.target.files?.[0];if(!a)return;let s=xm(a);t&&t!==s&&wd(t),Cm(s,URL.createObjectURL(a)),i(s),o.target.value=""}})]})]})}function go({label:e,value:t,fallback:n="#ffffff",onChange:i}){let[r,o]=WP(!1),a=t||n,s=Y0(null);return xi("div",{className:"bb-field",children:[Gt("span",{className:"bb-label",children:e}),Gt("div",{className:"se-fieldInline",children:Gt("span",{ref:s,style:{display:"inline-flex"},children:Gt($P,{prefixed:!0,className:"se-swatch",onClick:()=>o(c=>!c),style:{background:a,color:ca(a)},color:a,onChange:i})})}),r?Gt(Sp,{anchorRef:s,onClose:()=>o(!1),children:Gt(XP,{color:a,onChange:i})}):null]})}function Ls({label:e,checked:t,onChange:n}){return xi("label",{className:"bb-checkbox",children:[Gt("input",{type:"checkbox",checked:t,onChange:i=>n(i.target.checked)}),e]})}function K0({label:e,value:t,min:n,max:i,step:r,placeholder:o,onChange:a}){return xi("div",{className:"bb-field",children:[Gt("label",{className:"bb-label",children:e}),Gt("input",{className:"bb-input",type:"number",min:n,max:i,step:r,placeholder:o,value:t??"",onChange:s=>a(s.target.value===""?void 0:Number(s.target.value))})]})}function pa({label:e,value:t,options:n,onChange:i}){return xi("div",{className:"bb-field",children:[Gt("label",{className:"bb-label",children:e}),Gt("select",{className:"bb-select",value:t,onChange:r=>i(r.target.value),children:n.map(r=>Gt("option",{value:r,children:r},r))})]})}function gt({label:e,value:t,min:n,max:i,step:r,onChange:o}){return xi("div",{className:"bb-field bb-field--full",children:[Gt("label",{className:"bb-label",children:e}),xi("div",{className:"bb-sliderField",children:[Gt("input",{className:`bb-slider ${t===void 0?"bb-slider--unset":""}`,type:"range",min:n,max:i,step:r,value:t??n,onChange:s=>o(Number(s.target.value))}),Gt("input",{className:"bb-input bb-input--compact",type:"number",min:n,max:i,step:r,value:t??"",onChange:s=>o(s.target.value===""?void 0:Number(s.target.value))})]})]})}import{Fragment as Bp,jsx as K,jsxs as Yt}from"react/jsx-runtime";function J0({selectedItem:e,selectedMaterial:t,pbrWorkflow:n,onPbrWorkflowChange:i,openMaterialPanels:r,materialPanelEnabled:o,onToggleMaterialPanel:a,onSetMaterialPanelState:s,updateSelectedMaterial:c,setSelectedTexturePath:l}){let u={openMaterialPanels:r,materialPanelEnabled:o,onToggleMaterialPanel:a,onSetMaterialPanelState:s},{tier:d}=qn(),h=Kr(d,"starter"),b={tier:"starter",locked:!h},[m,y]=Q0("roughness"),[k,w]=Q0("factor");return Yt(Bp,{children:[K(jn,{panelKey:"pbr",title:"PBR Maps",tooltip:"Controls the base color and workflow used for physically based shading.",controls:u,children:h?Yt("div",{className:"bb-grid",children:[K(pa,{label:"Workflow",value:n,options:["metalness","specular"],onChange:i}),K("div",{className:"bb-field bb-field--full",children:K("p",{className:"bb-note",style:{margin:0},children:n==="metalness"?"Metalness workflow maps directly to the underlying physical material.":"Specular workflow exposes the same physical material with non-metal specular controls; it does not switch to a separate spec/gloss shader."})}),K(Ht,{label:n==="specular"?"Albedo texture path":"Base color texture path",placeholder:"materials/oak-wood.jpg",value:t?.texture?.path??"",onChange:p=>l(e,"texture",p)}),K(go,{label:n==="specular"?"Albedo color":"Base color",value:t?.baseColor??"#ffffff",onChange:p=>c(e,g=>({...g,baseColor:p}))}),n==="metalness"?Yt(Bp,{children:[K(gt,{label:"Metalness",value:t?.metalness,min:0,max:1,step:.01,onChange:p=>c(e,g=>({...g,metalness:p}))}),K(Ht,{label:"Metalness map path",placeholder:"materials/body-metalness.jpg",value:t?.metalnessMap?.path??"",onChange:p=>l(e,"metalnessMap",p)})]}):Yt(Bp,{children:[K(gt,{label:"Specular intensity",value:t?.specularIntensity,min:0,max:1,step:.01,onChange:p=>c(e,g=>({...g,specularIntensity:p}))}),K(go,{label:"Specular color",value:t?.specularColor??"#ffffff",onChange:p=>c(e,g=>({...g,specularColor:p}))}),K(Ht,{label:"Specular intensity map path",placeholder:"materials/body-specular-intensity.jpg",value:t?.specularIntensityMap?.path??"",onChange:p=>l(e,"specularIntensityMap",p)}),K(Ht,{label:"Specular color map path",placeholder:"materials/body-specular-color.jpg",value:t?.specularColorMap?.path??"",onChange:p=>l(e,"specularColorMap",p)})]}),K(gt,{label:"Specular F0 / reflectivity",value:t?.reflectivity,min:0,max:1,step:.01,onChange:p=>c(e,g=>({...g,reflectivity:p}))})]}):Yt("div",{className:"bb-grid",children:[K(go,{label:"Base color",value:t?.baseColor??"#ffffff",onChange:p=>c(e,g=>({...g,baseColor:p}))}),K(gt,{label:"Metalness",value:t?.metalness,min:0,max:1,step:.01,onChange:p=>c(e,g=>({...g,metalness:p}))}),K("div",{className:"bb-field bb-field--full",children:K(Dn,{requiredTier:"starter",feature:"Texture maps, the specular workflow, and reflectivity"})})]})}),K(jn,{panelKey:"roughness",requiredTier:b,title:"Roughness / Glossiness",tooltip:"Adjusts how matte or shiny the surface appears.",toggleLabel:"Toggle Roughness and Glossiness",controls:u,children:Yt("div",{className:"bb-grid",children:[K(pa,{label:"Mode",value:m,options:["roughness","glossiness"],onChange:y}),K("div",{className:"bb-field bb-field--full",children:K("p",{className:"bb-note",style:{margin:0},children:m==="roughness"?"Roughness: 0 is glossy, 1 is matte.":"Glossiness is the inverse of roughness (glossiness = 1 \u2212 roughness)"})}),m==="roughness"?K(gt,{label:"Roughness",value:t?.roughness,min:0,max:1,step:.01,onChange:p=>c(e,g=>({...g,roughness:p}))}):K(gt,{label:"Glossiness",value:t?.roughness===void 0?void 0:1-t.roughness,min:0,max:1,step:.01,onChange:p=>c(e,g=>({...g,roughness:p===void 0?void 0:1-p}))}),K(Ht,{label:m==="glossiness"?"Glossiness map path (applied as roughness)":"Roughness map path",placeholder:"materials/body-roughness.jpg",value:t?.roughnessMap?.path??"",onChange:p=>l(e,"roughnessMap",p)})]})}),K(jn,{panelKey:"emission",requiredTier:b,title:"Emission",tooltip:"Makes the material self-illuminated with emissive color and intensity.",controls:u,children:Yt("div",{className:"bb-grid",children:[K(go,{label:"Emissive color",value:t?.emissive??"#000000",fallback:"#000000",onChange:p=>c(e,g=>({...g,emissive:p}))}),K(gt,{label:"Emissive intensity",value:t?.emissiveIntensity,min:0,max:10,step:.1,onChange:p=>c(e,g=>({...g,emissiveIntensity:p}))}),K(Ht,{label:"Emissive map path",placeholder:"materials/body-emissive.jpg",value:t?.emissiveMap?.path??"",onChange:p=>l(e,"emissiveMap",p)})]})}),K(jn,{panelKey:"opacity",requiredTier:b,title:"Opacity",tooltip:"Controls transparency, alpha testing, and blending behavior.",controls:u,children:Yt("div",{className:"bb-grid",children:[K(gt,{label:"Opacity",value:t?.opacity,min:0,max:1,step:.01,onChange:p=>c(e,g=>({...g,opacity:p}))}),K(gt,{label:"Alpha test",value:t?.alphaTest,min:0,max:1,step:.01,onChange:p=>c(e,g=>({...g,alphaTest:p}))}),K(Ht,{label:"Alpha map path",placeholder:"materials/body-alpha.png",value:t?.alphaMap?.path??"",onChange:p=>l(e,"alphaMap",p)}),K(pa,{label:"Blending mode",value:t?.blendingMode??"normal",options:Rh,onChange:p=>c(e,g=>({...g,blendingMode:p}))}),Yt("div",{className:"bb-field",children:[K("label",{className:"bb-label",children:"Alpha hash"}),K("div",{className:"bb-checkboxRow",children:K(Ls,{label:"Use alpha hash",checked:t?.alphaHash??!1,onChange:p=>c(e,g=>({...g,alphaHash:p}))})})]}),Yt("div",{className:"bb-field",children:[K("label",{className:"bb-label",children:"Dithering"}),K("div",{className:"bb-checkboxRow",children:K(Ls,{label:"Use dithering",checked:t?.dithering??!1,onChange:p=>c(e,g=>({...g,dithering:p}))})})]})]})}),Yt(jn,{panelKey:"normalBump",requiredTier:b,title:"Normal & Bump",tooltip:"Adds surface detail without changing the actual mesh shape.",toggleLabel:"Toggle Normal and Bump",controls:u,children:[Yt("div",{className:"bb-grid",children:[K(Ht,{label:"Normal map path",placeholder:"materials/body-normal.jpg",value:t?.normalMap?.path??"",onChange:p=>l(e,"normalMap",p)}),K(gt,{label:"Normal scale",value:t?.normalScale,min:0,max:5,step:.01,onChange:p=>c(e,g=>({...g,normalScale:p}))}),K(Ht,{label:"Bump map path",placeholder:"materials/body-bump.jpg",value:t?.bumpMap?.path??"",onChange:p=>l(e,"bumpMap",p)}),K(gt,{label:"Bump scale",value:t?.bumpScale,min:0,max:5,step:.01,onChange:p=>c(e,g=>({...g,bumpScale:p}))})]}),K("div",{className:"bb-checkboxRow",style:{marginTop:12},children:K(Ls,{label:"Flip normal Y",checked:t?.flipNormalY??!1,onChange:p=>c(e,g=>({...g,flipNormalY:p}))})})]}),K(jn,{panelKey:"displacement",requiredTier:b,title:"Displacement",tooltip:"Offsets geometry using a texture to create real surface height.",controls:u,children:Yt("div",{className:"bb-grid",children:[K(Ht,{label:"Displacement map path",placeholder:"materials/body-displacement.jpg",value:t?.displacementMap?.path??"",onChange:p=>l(e,"displacementMap",p)}),K(gt,{label:"Displacement scale",value:t?.displacementScale,min:-5,max:5,step:.01,onChange:p=>c(e,g=>({...g,displacementScale:p}))}),K(gt,{label:"Displacement bias",value:t?.displacementBias,min:-5,max:5,step:.01,onChange:p=>c(e,g=>({...g,displacementBias:p}))})]})}),K(jn,{panelKey:"ao",requiredTier:b,title:"Ambient Occlusion",tooltip:"Darkens creases and contact areas to add depth.",controls:u,children:Yt("div",{className:"bb-grid",children:[K(Ht,{label:"AO map path",placeholder:"materials/body-ao.jpg",value:t?.aoMap?.path??"",onChange:p=>l(e,"aoMap",p)}),K(gt,{label:"AO intensity",value:t?.aoMapIntensity,min:0,max:5,step:.01,onChange:p=>c(e,g=>({...g,aoMapIntensity:p}))})]})}),Yt(jn,{panelKey:"clearcoat",requiredTier:b,title:"Clearcoat",tooltip:"Adds a glossy protective layer on top of the base material.",controls:u,children:[Yt("div",{className:"bb-grid",children:[K(Ht,{label:"Clearcoat map path",placeholder:"materials/body-clearcoat.jpg",value:t?.clearcoatMap?.path??"",onChange:p=>l(e,"clearcoatMap",p)}),K(gt,{label:"Clearcoat",value:t?.clearcoat,min:0,max:1,step:.01,onChange:p=>c(e,g=>({...g,clearcoat:p}))}),K(Ht,{label:"Clearcoat roughness map path",placeholder:"materials/body-clearcoat-roughness.jpg",value:t?.clearcoatRoughnessMap?.path??"",onChange:p=>l(e,"clearcoatRoughnessMap",p)}),K(gt,{label:"Clearcoat roughness",value:t?.clearcoatRoughness,min:0,max:1,step:.01,onChange:p=>c(e,g=>({...g,clearcoatRoughness:p}))}),K(Ht,{label:"Clearcoat normal map path",placeholder:"materials/body-clearcoat-normal.jpg",value:t?.clearcoatNormalMap?.path??"",onChange:p=>l(e,"clearcoatNormalMap",p)}),K(gt,{label:"Clearcoat normal scale",value:t?.clearcoatNormalScale,min:0,max:5,step:.01,onChange:p=>c(e,g=>({...g,clearcoatNormalScale:p}))})]}),K("div",{className:"bb-checkboxRow",style:{marginTop:12},children:K(Ls,{label:"Flip clearcoat normal Y",checked:t?.flipClearcoatNormalY??!1,onChange:p=>c(e,g=>({...g,flipClearcoatNormalY:p}))})})]}),K(jn,{panelKey:"sheen",requiredTier:b,title:"Sheen",tooltip:"Adds a soft fabric-like sheen on grazing angles.",controls:u,children:Yt("div",{className:"bb-grid",children:[K(gt,{label:"Sheen",value:t?.sheen,min:0,max:1,step:.01,onChange:p=>c(e,g=>({...g,sheen:p}))}),K(go,{label:"Sheen color",value:t?.sheenColor??"#ffffff",onChange:p=>c(e,g=>({...g,sheenColor:p}))}),K(Ht,{label:"Sheen color map path",placeholder:"materials/body-sheen-color.jpg",value:t?.sheenColorMap?.path??"",onChange:p=>l(e,"sheenColorMap",p)}),K(gt,{label:"Sheen roughness",value:t?.sheenRoughness,min:0,max:1,step:.01,onChange:p=>c(e,g=>({...g,sheenRoughness:p}))}),K(Ht,{label:"Sheen roughness map path",placeholder:"materials/body-sheen-roughness.jpg",value:t?.sheenRoughnessMap?.path??"",onChange:p=>l(e,"sheenRoughnessMap",p)})]})}),K(jn,{panelKey:"anisotropy",requiredTier:b,title:"Anisotropy",tooltip:"Stretches reflections in one direction for brushed or fiber-like surfaces.",controls:u,children:Yt("div",{className:"bb-grid",children:[K(gt,{label:"Intensity",value:t?.anisotropy,min:0,max:1,step:.01,onChange:p=>c(e,g=>({...g,anisotropy:p}))}),K(pa,{label:"Tilt direction",value:k,options:["factor","texture"],onChange:w}),k==="factor"?K(gt,{label:"Rotation (rad)",value:t?.anisotropyRotation,min:0,max:6.28,step:.01,onChange:p=>c(e,g=>({...g,anisotropyRotation:p}))}):K(Ht,{label:"Anisotropy map path",placeholder:"materials/body-anisotropy.jpg",value:t?.anisotropyMap?.path??"",onChange:p=>l(e,"anisotropyMap",p)})]})}),K(jn,{panelKey:"transmission",requiredTier:b,title:"Transmission & Volume",tooltip:"Controls glass-like transmission and how light travels through volume.",toggleLabel:"Toggle Transmission and Volume",controls:u,children:Yt("div",{className:"bb-grid",children:[K(gt,{label:"Transmission",value:t?.transmission,min:0,max:1,step:.01,onChange:p=>c(e,g=>({...g,transmission:p}))}),K(Ht,{label:"Transmission map path",placeholder:"materials/body-transmission.jpg",value:t?.transmissionMap?.path??"",onChange:p=>l(e,"transmissionMap",p)}),K(gt,{label:"Thickness",value:t?.thickness,min:0,max:5,step:.01,onChange:p=>c(e,g=>({...g,thickness:p}))}),K(Ht,{label:"Thickness map path",placeholder:"materials/body-thickness.jpg",value:t?.thicknessMap?.path??"",onChange:p=>l(e,"thicknessMap",p)}),K(go,{label:"Volume tint",value:t?.attenuationColor??"#ffffff",onChange:p=>c(e,g=>({...g,attenuationColor:p}))}),K(K0,{label:"Attenuation distance",value:t?.attenuationDistance,min:0,step:.01,placeholder:"Infinity when unset",onChange:p=>c(e,g=>({...g,attenuationDistance:p}))})]})}),K(jn,{panelKey:"faces",requiredTier:b,title:"Faces Rendering",tooltip:"Chooses which side of the mesh renders and how backfaces are handled.",controls:u,children:K("div",{className:"bb-grid",children:K(pa,{label:"Side",value:t?.side??"front",options:Eh,onChange:p=>c(e,g=>({...g,side:p}))})})})]})}var Z0=[{id:"wood",label:"Wood",swatch:"#8b5a2b",material:{baseColor:"#8b5a2b",metalness:0,roughness:.75,reflectivity:.04}},{id:"brushed-metal",label:"Brushed Metal",swatch:"linear-gradient(135deg, #cfcfcf, #8a8a8a)",material:{baseColor:"#c8c8c8",metalness:1,roughness:.35}},{id:"chrome",label:"Polished Chrome",swatch:"linear-gradient(135deg, #ffffff, #9aa0a6)",material:{baseColor:"#e8e8e8",metalness:1,roughness:.05}},{id:"gold",label:"Gold",swatch:"linear-gradient(135deg, #ffe9a8, #c89b2c)",material:{baseColor:"#e6b325",metalness:1,roughness:.2}},{id:"copper",label:"Copper",swatch:"linear-gradient(135deg, #e3a576, #8a4a26)",material:{baseColor:"#b87333",metalness:1,roughness:.3}},{id:"glass",label:"Glass",swatch:"linear-gradient(135deg, rgba(255,255,255,0.9), rgba(180,210,230,0.4))",material:{baseColor:"#ffffff",metalness:0,roughness:.02,reflectivity:.5,opacity:1,transmission:1,thickness:.5,attenuationColor:"#ffffff",attenuationDistance:1}},{id:"frosted-glass",label:"Frosted Glass",swatch:"linear-gradient(135deg, rgba(255,255,255,0.85), rgba(210,225,235,0.6))",material:{baseColor:"#ffffff",metalness:0,roughness:.4,reflectivity:.3,opacity:1,transmission:.9,thickness:.5}},{id:"plastic-glossy",label:"Glossy Plastic",swatch:"#dadada",material:{baseColor:"#dadada",metalness:0,roughness:.25,reflectivity:.5,clearcoat:.3,clearcoatRoughness:.1}},{id:"plastic-matte",label:"Matte Plastic",swatch:"#9a9a9a",material:{baseColor:"#9a9a9a",metalness:0,roughness:.85,reflectivity:.04}},{id:"rubber",label:"Rubber",swatch:"#1a1a1a",material:{baseColor:"#1a1a1a",metalness:0,roughness:.9,reflectivity:.02}},{id:"fabric",label:"Fabric",swatch:"#9c8a6b",material:{baseColor:"#9c8a6b",metalness:0,roughness:.95,sheen:.4,sheenColor:"#ffffff",sheenRoughness:.6}},{id:"ceramic",label:"Ceramic",swatch:"#f5f5f0",material:{baseColor:"#f5f5f0",metalness:0,roughness:.15,clearcoat:.6,clearcoatRoughness:.1}},{id:"concrete",label:"Concrete",swatch:"#9b9b93",material:{baseColor:"#9b9b93",metalness:0,roughness:.95,reflectivity:.03}}];import{jsx as Dp,jsxs as YP}from"react/jsx-runtime";function ex({disabled:e,onApply:t}){return Dp("div",{className:"bb-presetGallery",children:Z0.map(n=>YP("button",{type:"button",className:"bb-presetSwatch",disabled:e,title:`Apply ${n.label} preset`,onClick:()=>t(n.material),children:[Dp("span",{className:"bb-presetSwatchColor",style:{background:n.swatch}}),Dp("span",{className:"bb-presetSwatchLabel",children:n.label})]},n.id))})}import{useEffect as KP,useRef as QP,useState as JP}from"react";import{ChevronDown as ZP,Download as ek,FileCode2 as tk,FileJson as nk}from"lucide-react";import{jsx as Rc,jsxs as Bs}from"react/jsx-runtime";function Op({disabled:e,exporting:t,onExportJson:n,onExportTs:i}){let[r,o]=JP(!1),a=QP(null);return KP(()=>{if(!r)return;let s=c=>{a.current?.contains(c.target)||o(!1)};return window.addEventListener("pointerdown",s),()=>window.removeEventListener("pointerdown",s)},[r]),Bs("div",{className:"bb-exportMenuWrapper",ref:a,children:[Bs("button",{type:"button",className:"bb-button bb-button--ghost",disabled:e||t,onClick:()=>o(s=>!s),title:"Export",children:[Rc(ek,{size:14}),t?"Exporting\u2026":"Export",Rc(ZP,{size:12})]}),r&&Bs("div",{className:"bb-exportMenu",children:[Bs("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{o(!1),n()},children:[Rc(nk,{size:14}),"JSON"]}),Bs("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{o(!1),i()},children:[Rc(tk,{size:14}),"TypeScript"]})]})]})}import{jsx as bo,jsxs as Np}from"react/jsx-runtime";function tx({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r,idError:o}){return bo(On,{title:"Identity",open:n,onToggle:i,children:Np("div",{className:"bb-grid",children:[Np("div",{className:"bb-field bb-field--full",children:[bo("label",{className:"bb-label",children:"Model Node ID"}),bo("span",{className:"bb-note",children:"This is the exact mesh name from the imported model and stays locked."}),bo("input",{className:"bb-input bb-readonly",value:t.modelObjectId,readOnly:!0})]}),Np("div",{className:"bb-field bb-field--full",children:[bo("label",{className:"bb-label",children:"ID"}),bo("input",{className:`bb-input ${o?"bb-input--error":""}`,value:t.id,onChange:a=>r(e,s=>({...s,id:a.target.value}))}),o?bo("span",{className:"bb-status bb-status--error",children:o}):null]})]})})}import{useEffect as rk,useState as ix}from"react";var nx=["other","body","light","wheel","glass","interior","floor","wall","door","furniture","decor","electronics","seat","table","chair","window","sofa","bed","engine","headlight"],rx=["normal","hidden","selected","disabled"];import{jsx as yn,jsxs as pr}from"react/jsx-runtime";function ox({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r}){let[o,a]=ix(t.group??""),[s,c]=ix(t.tags?.join(", ")??"");rk(()=>{a(t.group??""),c(t.tags?.join(", ")??"")},[e,t.group,t.tags]);let l=()=>{r(e,d=>({...d,group:o.trim()||void 0}))},u=()=>{let d=[...new Set(s.split(",").map(h=>h.trim()).filter(Boolean))];r(e,h=>({...h,tags:d.length>0?d:void 0}))};return pr(On,{title:"Basics",open:n,onToggle:i,children:[pr("div",{className:"bb-grid",children:[pr("div",{className:"bb-field",children:[yn("label",{className:"bb-label",children:"Label"}),yn("input",{className:"bb-input",value:t.label??"",onChange:d=>r(e,h=>({...h,label:d.target.value}))})]}),pr("div",{className:"bb-field",children:[yn("label",{className:"bb-label",children:"Type"}),yn("input",{className:"bb-input",list:"binding-type-suggestions",value:t.type,onChange:d=>r(e,h=>({...h,type:d.target.value}))}),yn("datalist",{id:"binding-type-suggestions",children:nx.map(d=>yn("option",{value:d},d))})]}),pr("div",{className:"bb-field",children:[yn("label",{className:"bb-label",children:"Status"}),yn("select",{className:"bb-select",value:t.status??"normal",onChange:d=>r(e,h=>({...h,status:d.target.value})),children:rx.map(d=>yn("option",{value:d,children:d},d))})]}),pr("div",{className:"bb-field",children:[yn("label",{className:"bb-label",children:"Group"}),yn("input",{className:"bb-input",placeholder:"paint",value:o,onChange:d=>a(d.target.value),onBlur:l,onKeyDown:d=>{d.key==="Enter"&&d.currentTarget.blur()}})]}),pr("div",{className:"bb-field",children:[yn("label",{className:"bb-label",children:"Tags"}),yn("input",{className:"bb-input",placeholder:"exterior, configurable",value:s,onChange:d=>c(d.target.value),onBlur:u,onKeyDown:d=>{d.key==="Enter"&&d.currentTarget.blur()}})]})]}),pr("div",{className:"bb-checkboxRow",style:{marginTop:12},children:[pr("label",{className:"bb-checkbox",children:[yn("input",{type:"checkbox",checked:t.selectable??!1,onChange:d=>r(e,h=>({...h,selectable:d.target.checked}))}),"selectable"]}),pr("label",{className:"bb-checkbox",children:[yn("input",{type:"checkbox",checked:t.hoverable??!1,onChange:d=>r(e,h=>({...h,hoverable:d.target.checked}))}),"hoverable"]}),pr("label",{className:"bb-checkbox",children:[yn("input",{type:"checkbox",checked:t.visible??!1,onChange:d=>r(e,h=>({...h,visible:d.target.checked}))}),"visible"]})]})]})}import{useEffect as ok,useState as ak}from"react";var fo=[{id:"change-color",label:"Change Color",handling:"viewer",description:"Opens a color picker docked under the action and commits the result to style.material.baseColor."},{id:"change-material",label:"Change Material",handling:"viewer",description:"Opens the material picker so the viewer can swap the object's texture."},{id:"toggle-visibility",label:"Toggle Visibility",handling:"viewer",description:"Flips the binding's visible flag."},{id:"toggle-light",label:"Toggle Light",handling:"host",description:"Seeded on light bindings. Add declarative effects for useViewerActions, or handle it in onAction."},{id:"change-light-color",label:"Change Light Color",handling:"host",description:"Seeded on light bindings. Add declarative effects for useViewerActions, or handle it in onAction."},{id:"set-brightness",label:"Set Brightness",handling:"host",description:"Seeded on light bindings. Add declarative effects for useViewerActions, or handle it in onAction."}],Lc="__custom__";function Ds(e){return fo.find(t=>t.id===e)}var Sz=fo.filter(e=>e.handling==="viewer").map(e=>e.id),ik=new Set(["","New Action",...fo.map(e=>e.label)]);function Ip(e){return ik.has(e.trim())}function ax(e,t){let n=Array.from({length:t.length+1},(i,r)=>r);for(let i=1;i<=e.length;i+=1){let r=[i];for(let o=1;o<=t.length;o+=1){let a=n[o-1]+(e[i-1]===t[o-1]?0:1);r[o]=Math.min(r[o-1]+1,n[o]+1,a)}n=r}return n[t.length]}function sx(e){if(Ds(e))return null;let t=e.trim().toLowerCase();if(!t)return null;let n=t.replace(/[^a-z0-9]/g,""),i=null;for(let r of fo){let o=Math.min(ax(t,r.id),ax(n,r.id.replace(/[^a-z0-9]/g,"")));(!i||o<i.distance)&&(i={id:r.id,distance:o})}return i&&i.distance<=2?i.id:null}import{Fragment as lk,jsx as Wt,jsxs as Zn}from"react/jsx-runtime";var lx=fo.filter(e=>e.handling==="viewer"),sk=fo.filter(e=>e.handling==="host");function cx({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r}){let[o,a]=ak(new Set);ok(()=>{a(new Set)},[e]);let s=t.actions??[],c=(d,h)=>r(e,b=>({...b,actions:(b.actions??[]).map((m,y)=>y===d?h(m):m)})),l=d=>{r(e,h=>({...h,actions:(h.actions??[]).filter((b,m)=>m!==d)})),a(h=>{let b=new Set;return h.forEach(m=>{m<d?b.add(m):m>d&&b.add(m-1)}),b})},u=(d,h)=>a(b=>{let m=new Set(b);return h?m.add(d):m.delete(d),m});return Zn(On,{title:"Actions",open:n,onToggle:i,children:[Wt("div",{className:"bb-actionList",children:s.map((d,h)=>{let b=Ds(d.id),m=o.has(h)||!b,y=d.id.trim(),k=b?null:sx(d.id),w=y.length>0&&s.some((p,g)=>g!==h&&p.id.trim()===y);return Zn("div",{className:"bb-actionCard",children:[Zn("div",{className:"bb-actionCardHeader",children:[Zn("div",{className:"bb-actionCardTitle",children:["Action ",h+1]}),Wt("div",{className:"bb-actionCardMeta",children:d.type})]}),Zn("div",{className:"bb-actionGrid",children:[Zn("div",{className:"bb-field",children:[Wt("label",{className:"bb-label",children:"Action ID"}),Zn("select",{className:"bb-select",value:m?Lc:d.id,onChange:p=>{let g=p.target.value;if(g===Lc){u(h,!0);return}u(h,!1);let S=Ds(g);c(h,v=>({...v,id:g,label:S&&Ip(v.label)?S.label:v.label}))},children:[Wt("optgroup",{label:"Handled by the viewer",children:lx.map(p=>Wt("option",{value:p.id,children:p.id},p.id))}),Wt("optgroup",{label:"Handled by your app",children:sk.map(p=>Wt("option",{value:p.id,children:p.id},p.id))}),Wt("option",{value:Lc,children:"Custom\u2026"})]})]}),m?Zn("div",{className:"bb-field",children:[Wt("label",{className:"bb-label",children:"Custom action ID"}),Wt("input",{className:"bb-input",value:d.id,placeholder:"open-datasheet",onChange:p=>{u(h,!0),c(h,g=>({...g,id:p.target.value}))}})]}):null,Zn("div",{className:"bb-field",children:[Wt("label",{className:"bb-label",children:"Label"}),Wt("input",{className:"bb-input",value:d.label,onChange:p=>c(h,g=>({...g,label:p.target.value}))})]}),b?Wt("span",{className:"bb-note",children:b.description}):y.length===0?Wt("span",{className:"bb-note",style:{color:"#fca5a5"},children:"An action ID is required, the button renders but can never be identified in onAction."}):Zn("span",{className:"bb-note",style:{color:"#fcd34d"},children:["Unrecognised ID, the viewer has no built-in behavior for it. Add declarative effects and execute them with useViewerActions, or handle it in onAction.",k?Zn(lk,{children:[" Did you mean ",Wt("button",{type:"button",className:"bb-linkButton",onClick:()=>{u(h,!1);let p=Ds(k);c(h,g=>({...g,id:k,label:p&&Ip(g.label)?p.label:g.label}))},children:k}),"?"]}):null]}),d.effects?.length?Zn("span",{className:"bb-note",children:[d.effects.length," declarative effect",d.effects.length===1?"":"s",", execute with useViewerActions."]}):null,w?Wt("span",{className:"bb-note",style:{color:"#fcd34d"},children:"Another action on this binding uses the same ID, they will render as two identical buttons."}):null]}),Wt("div",{className:"bb-actionFooter",children:Wt("button",{type:"button",className:"bb-button bb-button--ghost bb-actionRemove",onClick:()=>l(h),children:"Remove Action"})})]},h)})}),Wt("div",{style:{marginTop:10},children:Wt("button",{type:"button",className:"bb-button",onClick:()=>{let d=lx.find(h=>!s.some(b=>b.id===h.id));r(e,h=>({...h,actions:[...h.actions??[],{id:d?.id??"",label:d?.label??"New Action",type:"command"}]})),d||u(s.length,!0)},children:"Add Action"})})]})}import{MapPin as ck,Trash2 as dk}from"lucide-react";import{Fragment as uk,jsx as er,jsxs as Un}from"react/jsx-runtime";function dx({selectedBinding:e,open:t,onToggle:n,cameraState:i,formattedCameraState:r,savedCameraPosition:o,onSaveCameraPosition:a,onGoToSavedCamera:s,onClearSavedCamera:c,onResetView:l,onFitScene:u}){return Un(On,{title:"Camera Position",open:t,onToggle:n,children:[Un("div",{className:"se-waypointCard bb-cameraWaypoint",children:[er("span",{className:"bb-cameraLiveBadge",children:"LIVE"}),Un("div",{className:"se-waypointBody",children:[er("div",{className:"bb-cameraWaypointLabel",children:"Current view"}),i?Un(uk,{children:[Un("div",{className:"se-waypointCoords",children:["pos ",r?.position]}),Un("div",{className:"se-waypointCoords",children:["look ",r?.target]})]}):er("div",{className:"se-waypointCoords",children:"Move the camera to see live position"})]})]}),Un("div",{className:"bb-cameraControls bb-cameraControls--centered",children:[er("button",{type:"button",className:"bb-button bb-button--primary",onClick:a,disabled:!i,children:"Save"}),er("button",{type:"button",className:"bb-button bb-button--ghost",onClick:l,children:"Reset View"}),er("button",{type:"button",className:"bb-button bb-button--ghost",onClick:u,children:"Fit Scene"})]}),o?.position&&o?.target&&Un("div",{className:"se-waypointCard bb-cameraWaypoint",children:[er("span",{className:"bb-cameraSavedBadge",children:"SAVED"}),Un("div",{className:"se-waypointBody",children:[Un("div",{className:"bb-cameraWaypointLabel",children:["For ",e.label]}),Un("div",{className:"se-waypointCoords",children:["pos [",o.position.map(d=>d.toFixed(1)).join(", "),"]"]}),Un("div",{className:"se-waypointCoords",children:["look [",o.target.map(d=>d.toFixed(1)).join(", "),"]"]})]}),Un("div",{className:"se-waypointActions",children:[er("button",{className:"se-waypointAction",onClick:s,title:"Fly camera to the saved position",children:er(ck,{size:15})}),er("button",{className:"se-waypointAction se-waypointAction--delete",onClick:c,title:"Delete saved position",children:er(dk,{size:15})})]})]}),er("span",{className:"bb-note",children:'Tip: Position the camera how you want, then click "Save" to store this position for the selected object. The camera position updates in real-time as you navigate.'})]})}import{useLayoutEffect as pk,useRef as hk,useState as mk}from"react";import{Move3d as gk,RotateCcw as bk}from"lucide-react";import{jsx as bt,jsxs as hr}from"react/jsx-runtime";var ux=["X","Y","Z"];var fk=.1;function zp(e){let t=e%360;return t<0?t+360:t}function px(e){return zp(e*180/Math.PI)}function hx(e){return e*Math.PI/180}function xk(e,t,n){let i=[...e],r=px(e[t]);return i[t]=hx(zp(r+n)),i}function mx({value:e,min:t=-1/0,max:n=1/0,step:i=.1,disabled:r=!1,onChange:o,formatValue:a=l=>Number(l.toFixed(3)),ariaLabel:s,className:c}){let l=a(e),[u,d]=mk(String(l)),h=hk(!1);return pk(()=>{h.current||d(String(l))},[l]),bt("input",{type:"number",className:c,step:i,min:t===-1/0?void 0:t,max:n===1/0?void 0:n,value:u,disabled:r,"aria-label":s,onFocus:()=>{h.current=!0},onChange:b=>{let m=b.target.value;if(d(m),m===""||m==="-")return;let y=Number(m);if(Number.isFinite(y)){let k=Math.max(t,Math.min(n,y));o(k)}},onBlur:()=>{h.current=!1,d(String(a(e)))}})}function yk({value:e,min:t=-1/0,max:n=1/0,step:i=.1,disabled:r=!1,onChange:o,formatValue:a=c=>Number(c.toFixed(3)),label:s}){return bt("div",{className:"bb-transformAxesGrid",children:ux.map((c,l)=>hr("div",{className:"bb-transformAxis",children:[bt("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:c}),bt("div",{className:"bb-transformAxisControl",children:bt(mx,{className:"se-numberInput bb-transformNumberInput",step:i,min:t,max:n,value:e[l],disabled:r,formatValue:a,ariaLabel:`${c} ${s?.toLowerCase()||""}`,onChange:u=>{let d=[...e];d[l]=u,o(d)}})})]},c))})}function gx({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r,moveModeEnabled:o,onToggleMoveMode:a,transformSpace:s,onTransformSpaceChange:c,originalTransform:l}){let u=t.transform?.rotation??l?.rotation??[0,0,0],d=t.transform?.position??l?.position??[0,0,0],h=(p,g)=>{let S=p.transform?.rotation??l?.rotation??[0,0,0],v=p.transform?.position??l?.position??[0,0,0],M=p.transform?.scale??l?.scale??[1,1,1],D=l?.pivotLocal??[0,0,0],x=$f(v,S,g,M,D,l?.rotationOrder??"XYZ");return{...p,transform:{...p.transform,position:x,rotation:g}}},b=(p,g)=>{e&&r(e,S=>{let v=S.transform?.rotation??l?.rotation??[0,0,0],M=xk(v,p,g);return h(S,M)})},m=(p,g)=>{e&&r(e,S=>{let M=[...S.transform?.rotation??l?.rotation??[0,0,0]];return M[p]=hx(zp(g)),h(S,M)})},y=(p,g)=>{e&&r(e,S=>{let M=[...S.transform?.position??l?.position??[0,0,0]];return M[p]=g,{...S,transform:{...S.transform,position:M}}})},k=(p,g)=>{e&&y(p,d[p]+g)},w=()=>{!e||!l||r(e,p=>{let g={...p.transform};return delete g.position,delete g.rotation,{...p,transform:Object.keys(g).length>0?g:void 0}})};return hr(On,{title:"Move & Rotate",open:n,onToggle:i,tooltip:"Enable the transform gizmo to move or rotate the selected mesh on any axis. Rotation uses the object's visible center while exported position and rotation remain local GLTF transforms.",children:[hr("div",{className:"se-field",children:[hr("div",{className:"se-fieldLabel",children:[hr("span",{children:[bt(gk,{size:14,style:{marginRight:6,verticalAlign:"-2px"}}),"Transform gizmo"]}),hr("label",{className:"se-switch","aria-label":"Toggle move mode",children:[bt("input",{type:"checkbox",checked:o,onChange:p=>a(p.target.checked)}),bt("span",{className:"se-switchTrack",children:bt("span",{className:"se-switchThumb"})})]})]}),bt("span",{className:"bb-note",children:"Select a mesh \xB7 drag the colored arrows or planes to move"})]}),hr("div",{className:"se-field",style:{marginTop:10},children:[bt("div",{className:"se-fieldLabel",children:bt("span",{children:"Axis space"})}),bt("div",{className:"se-segmentedControl",children:["world","local"].map(p=>bt("button",{type:"button",className:`se-segmentedOption ${s===p?"se-segmentedOption--active":""}`,onClick:()=>c(p),children:p},p))})]}),hr("div",{className:"se-field",style:{marginTop:10},children:[bt("div",{className:"se-fieldLabel",children:bt("span",{children:"Rotation (degrees)"})}),bt("div",{className:"bb-transformAxesGrid",children:ux.map((p,g)=>{let S=Math.round(px(u[g]));return hr("div",{className:"bb-transformAxis",children:[bt("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:p}),bt("div",{className:"bb-transformAxisControl",children:bt(mx,{className:"se-numberInput bb-transformNumberInput",step:1,min:0,max:359,value:S,disabled:!e,formatValue:v=>Math.round(v),ariaLabel:`${p} rotation in degrees`,onChange:v=>m(g,v)})})]},p)})})]}),hr("div",{className:"se-field",style:{marginTop:10},children:[bt("div",{className:"se-fieldLabel",children:bt("span",{children:"Position"})}),bt(yk,{value:d,min:-1/0,max:1/0,step:fk,disabled:!e,label:"position",onChange:p=>{e&&r(e,g=>({...g,transform:{...g.transform,position:p}}))}})]}),hr("button",{type:"button",className:"bb-button bb-button--ghost",style:{marginTop:10,display:"inline-flex",alignItems:"center",gap:6},disabled:!e||!l,onClick:w,title:"Restore this node's position and rotation to what they were in the original model",children:[bt(bk,{size:14}),"Restore original position & rotation"]})]})}import{memo as Mk,useMemo as bx,useState as Tk}from"react";function vk(e){return e.trim().replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/[_\s]+/g,"-").replace(/[^a-zA-Z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").toLowerCase()}function Fp(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").replace(/\s+/g," ").trim().replace(/\b\w/g,t=>t.toUpperCase())}function wk(e){let t=e.toLowerCase();return t.includes("light")?"light":t.includes("wheel")||t.includes("rim")||t.includes("tire")?"wheel":t.includes("glass")||t.includes("window")||t.includes("windshield")||t.includes("sunroof")?"glass":t.includes("seat")||t.includes("dashboard")||t.includes("console")||t.includes("doorpanel")?"interior":t.includes("floor")?"floor":t.includes("wall")?"wall":t.includes("door")?"door":t.includes("chair")||t.includes("table")||t.includes("sofa")||t.includes("bed")?"furniture":"other"}function Ck(e){return e==="light"||e.endsWith("light")?[{id:"toggle-light",label:"Toggle Light",type:"command"},{id:"change-light-color",label:"Change Light Color",type:"command"},{id:"set-brightness",label:"Set Brightness",type:"command"}]:[{id:"change-color",label:"Change Color",type:"command"},{id:"change-material",label:"Change Material",type:"command"},{id:"toggle-visibility",label:"Toggle Visibility",type:"command"}]}function Sk(e){let t=wk(e);return{id:vk(e),modelObjectId:e,type:t,label:Fp(e),status:"normal",selectable:!0,hoverable:!0,visible:!0,style:{},actions:Ck(t),metrics:{},metadata:{}}}function Bc(e){return Object.fromEntries(e.map(t=>[t,Sk(t)]))}function jp(e){let{nodesById:t}=Go(e),n=[];for(let[i,r]of Object.entries(t)){let o=r;o.isMesh&&o.geometry&&r.name&&n.push(i)}return n.sort((i,r)=>i.localeCompare(r))}import{Fragment as kk,jsx as xo,jsxs as yi}from"react/jsx-runtime";var fx=Mk(Pk);function Pk({bindings:e,selectedItem:t,onSelect:n,onHover:i,isOpen:r=!0,onToggle:o}){let[a,s]=Tk(""),c=bx(()=>Object.keys(e),[e]),l=bx(()=>{let u=a.trim().toLowerCase();return u?c.filter(d=>{let h=e[d];return d.toLowerCase().includes(u)||h.label?.toLowerCase().includes(u)||h.type.toLowerCase().includes(u)}):c},[e,c,a]);return yi("aside",{className:`bb-sidebar bb-sidebar--right ${r?"":"bb-sidebar--collapsed"}`,children:[yi("div",{className:"bb-header bb-header--sidebar",children:[!r&&xo("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>o?.(!0),"aria-label":"Open scene nodes sidebar",title:"Open scene nodes",children:"\u2190"}),r&&yi(kk,{children:[yi("div",{children:[xo("div",{className:"bb-sectionKicker",children:"Scene Nodes"}),yi("div",{className:"bb-sectionHeading",children:[l.length," visible entries"]})]}),xo("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>o?.(!1),"aria-label":"Close scene nodes sidebar",title:"Close scene nodes",children:"\u2192"})]})]}),r&&yi("section",{className:"bb-nodeList",children:[xo("div",{className:"bb-search",children:xo("input",{className:"bb-input",placeholder:"Search nodes, labels, or types",value:a,onChange:u=>s(u.target.value)})}),xo("div",{className:"bb-nodeItems",children:l.map(u=>{let d=e[u];return yi("button",{type:"button",className:`bb-nodeButton ${u===t?"bb-nodeButton--active":""}`,onClick:()=>n(u),onMouseEnter:()=>i?.(u),onMouseLeave:()=>i?.(null),children:[xo("span",{className:"bb-nodeName",children:u}),yi("span",{className:"bb-nodeMeta",children:[d.type,d.label===Fp(u)?"":d.label||"\xB7 Untitled"]})]},u)})})]})]})}import{jsx as Dc,jsxs as xx}from"react/jsx-runtime";function Up({title:e,label:t,open:n,onToggle:i,draft:r,error:o,example:a,onDraftChange:s,onCommit:c}){return Dc(On,{title:e,open:n,onToggle:i,children:xx("div",{className:"bb-field",children:[Dc("label",{className:"bb-label",children:t}),Dc("textarea",{className:"bb-textarea",value:r,onChange:l=>s(l.target.value),onBlur:c}),o?Dc("span",{className:"bb-status bb-status--error",children:o}):xx("span",{className:"bb-note",children:["Use a JSON object like ",a,"."]})]})})}function yx(e,t){let n=new Map(e.animations.clips.map(o=>[o.sourceName,o])),i=t.map(({sourceName:o})=>n.get(o)??{sourceName:o,displayName:o,hidden:!1,loopMode:"repeat",speed:1}),r=e.animations.autoplayClip&&i.some(o=>o.sourceName===e.animations.autoplayClip&&!o.hidden)?e.animations.autoplayClip:null;return{clips:i,autoplayClip:r}}import{useCallback as Os,useReducer as _k,useRef as Ak}from"react";var Ek=100;function Rk(e,t){switch(t.type){case"set":{let n=typeof t.updater=="function"?t.updater(e.present):t.updater;if(n===e.present)return e;let i=t.track?e.edits+1:e.edits;return t.coalesce?{...e,present:n,future:[],edits:i}:{past:[...e.past,e.present].slice(-Ek),present:n,future:[],edits:i}}case"undo":{if(e.past.length===0)return e;let n=e.past[e.past.length-1];return{past:e.past.slice(0,-1),present:n,future:[e.present,...e.future],edits:e.edits+1}}case"redo":{if(e.future.length===0)return e;let[n,...i]=e.future;return{past:[...e.past,e.present],present:n,future:i,edits:e.edits+1}}case"reset":return{past:[],present:t.value,future:[],edits:t.track?e.edits+1:0}}}function Vp(e,t=600){let[n,i]=_k(Rk,{past:[],present:e,future:[],edits:0}),r=Ak(0),o=Os(u=>{let d=Date.now(),h=d-r.current<t;r.current=d,i({type:"set",updater:u,coalesce:h,track:!0})},[t]),a=Os(u=>{let d=Date.now()-r.current<t;i({type:"set",updater:u,coalesce:d,track:!1})},[t]),s=Os(()=>{r.current=0,i({type:"undo"})},[]),c=Os(()=>{r.current=0,i({type:"redo"})},[]),l=Os((u,d)=>{r.current=0,i({type:"reset",value:u,track:d?.asEdit??!1})},[]);return{value:n.present,setValue:o,setValueUntracked:a,undo:s,redo:c,reset:l,canUndo:n.past.length>0,canRedo:n.future.length>0,edits:n.edits}}import{strToU8 as Lk}from"fflate";function vx(e){return JSON.stringify(e,null,2)}function wx(e){return['import { defineObjectBindings } from "@liveroom-tech/react-immersive/utils";',"",`export const objectBindings = defineObjectBindings(${JSON.stringify(e,null,2)});`,""].join(`
|
|
25
|
-
`)}function Cx(e){return JSON.stringify(e,null,2)}function Sx(e){return['import type { SceneConfig } from "@liveroom-tech/react-immersive/utils";',"",`export const sceneConfig: SceneConfig = ${JSON.stringify(e,null,2)};`,""].join(`
|
|
26
|
-
`)}function Ns(e,t,n){Nr(new Blob([t],{type:n}),e)}function Gp(e){return JSON.stringify(e??{},null,2)}function Hp(e){return`[${e[0].toFixed(3)}, ${e[1].toFixed(3)}, ${e[2].toFixed(3)}]`}function Bk(e){let t=e.style?.material;return t?Object.values(t).filter(n=>!!n&&typeof n=="object"&&typeof n.path=="string"&&n.path.trim().length>0).map(n=>n.path):[]}async function Mx(e){let t=new Set;for(let r of Object.values(e))for(let o of Bk(r))t.add(o);let n=[],i=[];return await Promise.all(Array.from(t).map(async r=>{let o=ym(r);if(o)try{let a=await fetch(o);if(!a.ok)throw new Error(String(a.status));n.push({path:r,blob:await a.blob()})}catch{i.push(r)}})),{assets:n,failedPaths:i}}async function Wp(e,t,n,i,r){if(r.length===0){Ns(e,t,n);return}let o={[e]:Lk(t)};for(let s of r)o[s.path]=new Uint8Array(await s.blob.arrayBuffer());let a=await cl(o);Nr(new Blob([a],{type:"application/zip"}),i)}var $p={pbr:["texture","baseColor","metalness","metalnessMap","specularIntensity","specularIntensityMap","specularColor","specularColorMap","reflectivity"],roughness:["roughness","roughnessMap"],emission:["emissive","emissiveIntensity","emissiveMap"],opacity:["opacity","alphaMap","alphaTest","alphaHash","dithering","blendingMode"],normalBump:["normalMap","normalScale","flipNormalY","bumpMap","bumpScale"],displacement:["displacementMap","displacementScale","displacementBias"],ao:["aoMap","aoMapIntensity"],clearcoat:["clearcoat","clearcoatMap","clearcoatRoughness","clearcoatRoughnessMap","clearcoatNormalMap","clearcoatNormalScale","flipClearcoatNormalY"],sheen:["sheen","sheenColor","sheenColorMap","sheenRoughness","sheenRoughnessMap"],anisotropy:["anisotropy","anisotropyRotation","anisotropyMap"],transmission:["transmission","transmissionMap","thickness","thicknessMap","attenuationColor","attenuationDistance"],faces:["side"]},Tx=Object.keys($p);function Px(e){if(e==null)return!1;if(typeof e=="string")return e.trim().length>0;if(typeof e=="number")return Number.isFinite(e);if(typeof e=="boolean")return e;if(typeof e=="object"&&"path"in e){let t=e.path;return typeof t=="string"&&t.trim().length>0}return!1}function Xp(e){if(e)return Object.values(e).some(Px)?e:void 0}function tr(e,t){return e?$p[t].some(n=>Px(e[n])):!1}function qp(e){return{pbr:tr(e,"pbr"),roughness:tr(e,"roughness"),emission:tr(e,"emission"),opacity:tr(e,"opacity"),normalBump:tr(e,"normalBump"),displacement:tr(e,"displacement"),ao:tr(e,"ao"),clearcoat:tr(e,"clearcoat"),sheen:tr(e,"sheen"),anisotropy:tr(e,"anisotropy"),transmission:tr(e,"transmission"),faces:tr(e,"faces")}}function Yp(e,t){if(t)return{...e,style:{...e.style,material:t}};if(!e.style)return e;let{material:n,...i}=e.style;return{...e,style:Object.keys(i).length>0?i:void 0}}function kx(e,t){if(!e)return;let n={...e};for(let i of $p[t])delete n[i];return n}import{Fragment as ha,jsx as q,jsxs as Ce}from"react/jsx-runtime";var Dx="/room.glb",Ok=500;function Nk(){return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}function Ox(e){return`Couldn't reload ${e} from your last session. It's still saved in this browser.`}function Ik(e){let t=new Date(e);return t.toDateString()===new Date().toDateString()?`today at ${t.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})}`:t.toLocaleString([],{dateStyle:"medium",timeStyle:"short"})}function Oc(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Qp(e,t){if(!Oc(e)||!Oc(t))return t??e;let n={...e};for(let[i,r]of Object.entries(t)){let o=n[i];n[i]=Oc(o)&&Oc(r)?Qp(o,r):r}return n}function zk({licenseKey:e,licenseValidationUrl:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,project:o,onProjectChange:a,projectChangeDebounceMs:s=350,onModelUpload:c,onEditLeaseChange:l,allowModelChange:u=!0}){let d=Mt(null),h=Mt(null),b=Mt(null),[m,y]=De(o?.model.url??null),[k,w]=De(o?.model.name??""),[p,g]=De(o?.model??null),[S,v]=De(null),M=Vp(o?.objectBindings??{}),D=M.value,x=M.setValue,[C,P]=De(!1),[_,z]=De(null),[L,I]=De(!1),[N,R]=De("Load the demo model or upload a GLB, GLTF, OBJ, FBX, or USDZ model to generate bindings."),[F,G]=De("default"),[Z,ie]=De(!1),[ve,He]=De("{}"),[Dt,pt]=De("{}"),[kt,Re]=De(null),[et,Kt]=De(null),[kn,ft]=De(!1),[Le,ee]=De(!1),[vn,cn]=De(!1),[tt,Qt]=De({identity:!0,basics:!0,material:!1,actions:!1,camera:!1,transform:!1,metrics:!1,metadata:!1}),[Ee,Jt]=De({pbr:!0,roughness:!1,emission:!1,opacity:!1,normalBump:!1,displacement:!1,ao:!1,clearcoat:!1,sheen:!1,anisotropy:!1,transmission:!1,faces:!1}),_t=T=>Qt(E=>({...E,[T]:!E[T]})),Fe=T=>Jt(E=>({...E,[T]:!E[T]})),[xt,dn]=De("object"),[ge,H]=De("General"),[he,ne]=De("metalness"),[Se,Me]=De(qp()),ye=Mt(null),[_e,ce]=De(!1),[qe,nt]=De(!0),[Ot,Nt]=De(!0),[Ue,Ye]=De(!1),[Zt,Tt]=De(null),[hn,wn]=De(null),[At,O]=De(!1),[B,V]=De("world"),J=Mt({}),W=Vp(o?.sceneConfig??Fi),$=W.value,re=W.setValue,We=W.setValueUntracked,[Oe,Ke]=De("orbit"),ue=Oe==="pointerLock",[yt,le]=De(null),[ht,pe]=De(null),It=xc(e,t),Vn=u0(It.tier),mn=Kp(()=>({isInsideEditor:!0,activeTab:xt,activeSubTab:ge,tier:Vn,setActiveTab:dn,setActiveSubTab:H}),[xt,ge,Vn]),rt=Mt(null),nr=Mt(0),gn=Mt(0),Qr=Mt(o?`${o.id}:${o.revision}`:null),vi=Mt(null),ma=Mt(!1),mr=Mt(!1),wi=Mt(o?{modelUrl:o.model.url,bindings:o.objectBindings,sceneConfig:o.sceneConfig}:null),Ci=Mt(void 0),gr=Mt(0),Ze=Mt(null),$t=Mt(o?{requestId:0,modelName:o.model.name??"model",modelUrl:o.model.url,storedBindings:o.objectBindings,streaming:!!o.model.tilesetUrl}:null),en=Mt(null),yo=Mt(null),rr=Mt(null),Si=Mt(!1),Ar=Mt(null),{cameraState:je,resetView:Mi,focusObject:Is,fitScene:zs,setCameraState:Er,handleCameraChange:Rr,handleViewerReady:ga}=Nh(),Nc=St(T=>{ue||Er({position:T.position,target:T.target,fov:je?.fov??null,zoom:je?.zoom??1,azimuthAngle:T.azimuthAngle,polarAngle:T.polarAngle},!0)},[ue,Er,je]),Ti=zh(),it=S?D[S]??null:null,Jr=it?.style?.material,ir=it?.cameraState,ba=je?{position:Hp(je.position),target:Hp(je.target)}:null,fa=St(T=>{re(E=>{let X=E.annotations.map(de=>de.id).join(","),Y=T.map(de=>de.id).join(",");return X===Y?E:{...E,annotations:T}})},[]),Fs=St(T=>{le(T?{annotation:T}:null)},[]);_r(()=>{if(!it){He("{}"),pt("{}"),Re(null),Kt(null);return}He(Gp(it.metrics)),pt(Gp(it.metadata)),Re(null),Kt(null)},[it]),_r(()=>{let T=qp(Jr);if(ye.current!==S){ye.current=S,Me(T);return}Me(E=>{let X=!1,Y={...E};for(let de of Tx)T[de]&&!E[de]&&(Y[de]=!0,X=!0);return X?Y:E})},[S,Jr]),_r(()=>()=>{rt.current?.cleanup(),Ze.current&&clearTimeout(Ze.current)},[]);let Pi=St((T,E)=>{let X=Bc(T);if(E){let Y=new Map(Object.values(E).map(de=>[de.modelObjectId,de]));for(let de of T){let be=Y.get(de);be&&(X[de]=be)}}return X},[]);_r(()=>{if(!o)return;let T=`${o.id}:${o.revision}`;if(Qr.current===T)return;Qr.current=T;let E=m!==o.model.url||p?.tilesetUrl!==o.model.tilesetUrl||p?.assetVersion!==o.model.assetVersion,X=D!==o.objectBindings,Y=$!==o.sceneConfig;(E||X||Y)&&(mr.current=!0),g(o.model),w(o.model.name??"model");let de=o.objectBindings;if(X){let be=vi.current;de=be?Pi(be,o.objectBindings):o.objectBindings,M.reset(de)}if(Y&&W.reset(o.sceneConfig),E){let be=++gn.current;$t.current={requestId:be,modelName:o.model.name??"model",modelUrl:o.model.url,storedBindings:o.objectBindings,streaming:!!o.model.tilesetUrl},Ar.current=null,v(null),P(!0),y(o.model.url)}wi.current={modelUrl:o.model.url,bindings:de,sceneConfig:o.sceneConfig}},[D,Pi,o,m,$,p,M,W]);let xa=Mt(a);xa.current=a,_r(()=>{if(!o||!xa.current||!m)return;if(!ma.current){ma.current=!0;return}let T=wi.current;if(m===o.model.url&&D===o.objectBindings&&$===o.sceneConfig||T!==null&&m===T.modelUrl&&D===T.bindings&&$===T.sceneConfig){mr.current=!1;return}if($t.current)return;if(mr.current){mr.current=!1;return}let E=window.setTimeout(()=>{xa.current?.({projectId:o.id,baseRevision:o.revision,model:{...p??o.model,url:m,name:k||o.model.name},objectBindings:D,sceneConfig:$},"local")},s);return()=>window.clearTimeout(E)},[D,k,m,o,s,p,$]),_r(()=>{let T=E=>{if(E.key.toLowerCase()!=="z"||!(E.metaKey||E.ctrlKey))return;let X=E.target,Y=X?.tagName;if(Y==="INPUT"||Y==="TEXTAREA"||X?.isContentEditable)return;E.preventDefault();let de=xt==="scene"?W:M;E.shiftKey?de.redo():de.undo()};return window.addEventListener("keydown",T),()=>window.removeEventListener("keydown",T)},[xt,M,W]);let Zr=!o&&u,vo=M.edits>0||W.edits>0;_r(()=>{if(!Zr||!vo||!m)return;let T=en.current;if(!T)return;let E=()=>{if(rr.current===E&&(rr.current=null),$t.current)return;let{model:Y,file:de}=T,be=Y.kind==="file"&&yo.current!==Y.key?de:void 0;o0({model:Y,bindings:D,sceneConfig:$},be).then(()=>{yo.current=Y.kind==="file"?Y.key:null,Si.current=!1}).catch(Qe=>{console.warn("[BindingBuilder] Autosave failed:",Qe),!Si.current&&(Si.current=!0,R("Couldn't autosave this session \u2014 the browser refused to store it, possibly for lack of space. Export your work to keep it."),G("error"))})};rr.current=E;let X=window.setTimeout(E,Ok);return()=>window.clearTimeout(X)},[Zr,vo,m,D,$]),_r(()=>{if(!Zr)return;let T=()=>rr.current?.(),E=()=>{document.visibilityState==="hidden"&&T()};return window.addEventListener("pagehide",T),document.addEventListener("visibilitychange",E),()=>{window.removeEventListener("pagehide",T),document.removeEventListener("visibilitychange",E),T()}},[Zr]),_r(()=>{if(!Zr||!m||!vo)return;let T=E=>{rr.current?.(),E.preventDefault(),E.returnValue=""};return window.addEventListener("beforeunload",T),()=>window.removeEventListener("beforeunload",T)},[Zr,m,vo]),_r(()=>{if(C||F==="default"||F==="success")return;ie(!0);let T=window.setTimeout(()=>ie(!1),4e3);return()=>window.clearTimeout(T)},[N,F,C]);let Pt=Kp(()=>Object.keys(D),[D]),js=Kp(()=>!S||!it?null:it.id.trim()?Object.entries(D).some(([X,Y])=>X!==S&&Y.id===it.id)?"Another binding already uses this ID.":null:"ID is required.",[D,S,it]),tn=(T,E)=>{x(X=>({...X,[T]:E(X[T])}))},Lr=(T,E)=>{tn(T,X=>{let Y=Xp(E(X.style?.material));return Yp(X,Y)})},un=(T,E,X)=>{Lr(T,Y=>({...Y,[E]:X?{path:X}:void 0}))},wo=(T,E)=>{Me(X=>({...X,[T]:E})),!E&&S&&tn(S,X=>{let Y=Xp(kx(X.style?.material,T));return Yp(X,Y)})},ki=St((T,E,X)=>{let Y=jp(T),de=Bc(Y);if(X){let Qe=new Map(Object.values(X).map(Te=>[Te.modelObjectId,Te]));for(let Te of Y){let _n=Qe.get(Te);_n&&(de[Te]=_n)}}T.updateMatrixWorld(!0);let be={};for(let Qe of Y){let Te=zr(T,Qe);if(!Te){be[Qe]={position:[0,0,0],rotation:[0,0,0],scale:[1,1,1],pivotLocal:[0,0,0],rotationOrder:"XYZ"};continue}let _n=kc(Te);be[Qe]={position:[Te.position.x,Te.position.y,Te.position.z],rotation:[Te.rotation.x,Te.rotation.y,Te.rotation.z],scale:[Te.scale.x,Te.scale.y,Te.scale.z],pivotLocal:[_n.x,_n.y,_n.z],rotationOrder:Te.rotation.order}}J.current=be,M.reset(de),v(Y[0]??null),X||We(Qe=>({...Qe,annotations:[]})),R(`Generated ${Y.length} bindings from ${E}.`),G("success"),gr.current=100,z(100),Ze.current&&clearTimeout(Ze.current),Ze.current=setTimeout(()=>{Ze.current=null,P(!1),z(null)},400)},[M,We]),Co=(T,E,X,Y)=>{rr.current?.();let de=++gn.current;P(!0),z(null),gr.current=0,Ze.current&&(clearTimeout(Ze.current),Ze.current=null),Ci.current=X;let be=X?X/1048576:0;R(be>=100?`Reading ${E} (${Math.round(be)}MB \u2014 large file, this can take a while)...`:`Reading ${E} and generating starter bindings...`),G("default"),w(E),g(Y??{url:T,name:E}),le(null);let Qe=Ar.current;if(T===m&&Qe?.url===T){$t.current=null,ki(Qe.scene,E);return}$t.current={requestId:de,modelName:E,modelUrl:T,streaming:!!Y?.tilesetUrl},y(T),M.reset({}),v(null)},Ic=St(T=>{let E=$t.current;if(!(!E||E.requestId!==gn.current)){if($t.current=null,Ar.current={url:E.modelUrl,scene:T},E.streaming){R(`Streaming ${E.modelName}.`),G("success"),P(!1);return}E.storedBindings&&(mr.current=!0),ki(T,E.modelName,E.storedBindings),E.restoring&&R(`Restored your last session with ${E.modelName}.`)}},[ki]),zc=St(T=>{let E=T.map(Y=>Y.name);if(E.length===0)return;vi.current=E,mr.current=!0;let X=Pi(E,o?.objectBindings);if(M.reset(X),o){let Y=wi.current;wi.current={modelUrl:Y?.modelUrl??o.model.url,bindings:X,sceneConfig:Y?.sceneConfig??o.sceneConfig}}v(Y=>Y??E[0]??null),R(`Streaming ${E.length} bindable objects.`),G("success"),P(!1)},[Pi,M,o]),br=St(T=>{let E=$t.current;!E||E.requestId!==gn.current||($t.current=null,console.error(T),E.restoring?(en.current=null,y(null),R(Ox(E.modelName))):R(`Could not read ${E.modelName}. Make sure the file is a valid GLB, GLTF, OBJ, FBX, or USDZ asset.`),G("error"),Ze.current&&(clearTimeout(Ze.current),Ze.current=null),gr.current=0,P(!1),z(null))},[]),_i=St(T=>{let E=null;if(T.lengthComputable&&T.total>0)E=T.loaded/T.total*100;else{let Y=Ci.current;Y&&Y>0&&(E=T.loaded/Y*100)}if(E===null)return;let X=Math.min(90,Math.floor(E/10)*10);X>gr.current&&(gr.current=X,z(X)),E>=99.5&&R(Y=>Y.startsWith("Finalizing")?Y:"Finalizing model \u2014 parsing geometry and textures (large files can take a moment here)...")},[]),ya=St(T=>{Ti.handleAnimationsReady(T);let E=T.clipDetails??T.clips.map(X=>({sourceName:X,duration:0}));We(X=>({...X,animations:yx(X,E)}))},[Ti,We]),fr=async()=>{rt.current?.cleanup(),rt.current=null,en.current={model:{kind:"url",url:Dx,name:"room.glb"}},await Co(Dx,"room.glb")},va=async T=>{if(!u)return;if(c){try{P(!0),R(`Uploading ${T.name}...`),G("default");let X=await c(T);en.current={model:{kind:"url",url:X.url,name:X.name??T.name}},await Co(X.url,X.name??T.name,T.size,X)}catch(X){P(!1),R(X instanceof Error?X.message:`Could not upload ${T.name}.`),G("error")}return}let E;try{E=await Id(T)}catch(X){R(X instanceof Error?X.message:"Could not read model file. Upload a .glb, .gltf, .obj, .fbx, .usdz, or .zip asset."),G("error");return}rt.current?.cleanup(),rt.current=E,en.current={model:{kind:"file",key:Nk(),name:E.name},file:T},await Co(E.url,E.name,T.size,{url:E.url,name:E.name})},Ai=async T=>{let E=T.target.files?.[0];E&&(await va(E),T.target.value="")},wa=()=>{rr.current?.(),rt.current?.cleanup(),rt.current=null,Ar.current=null,$t.current=null,en.current=null,J.current={},nr.current=0,ft(!1),Ze.current&&(clearTimeout(Ze.current),Ze.current=null),gr.current=0,z(null),Ci.current=void 0,y(null),w(""),g(null),v(null),le(null),M.reset({}),He("{}"),pt("{}"),Re(null),Kt(null),pe(null),O(!1),We(T=>({...T,animations:Fi.animations,annotations:[]})),R("Load the demo model or upload a GLB, GLTF, OBJ, FBX, or USDZ model to generate bindings."),G("default")},Ei=()=>{d.current?.click()},Br=()=>{h.current?.click()},Ca=async T=>{I(!0);try{let{assets:E,failedPaths:X}=await Mx(D);T==="json"?await Wp("objectBindings.json",vx(D),"application/json","objectBindings.zip",E):await Wp("objectBindings.ts",wx(D),"text/typescript","objectBindings-ts.zip",E),X.length>0?(R(`Exported, but ${X.length} uploaded image${X.length===1?"":"s"} couldn't be bundled: ${X.join(", ")}.`),G("error")):E.length>0&&(R(`Exported with ${E.length} uploaded image${E.length===1?"":"s"} bundled into the zip.`),G("success"))}catch(E){let X=E instanceof Error?E.message:"Unknown export error.";R(`Failed to export bindings: ${X}`),G("error")}finally{I(!1)}},Fc=async T=>{if(!Pt.length){R("Load a model before importing bindings."),G("error");return}let E;try{E=JSON.parse(await T.text())}catch{R(`${T.name} is not valid JSON.`),G("error");return}if(E===null||typeof E!="object"||Array.isArray(E)){R("Expected a JSON object mapping object IDs to bindings."),G("error");return}let X=new Map;for(let Qe of Object.values(E))if(Qe!==null&&typeof Qe=="object"&&typeof Qe.id=="string"&&typeof Qe.type=="string"&&typeof Qe.modelObjectId=="string"){let Te=Qe;X.set(Te.modelObjectId,Te)}if(X.size===0){R(`${T.name} doesn't look like an exported bindings file.`),G("error");return}let Y={...D},de=0;for(let Qe of Object.keys(Y)){let Te=X.get(Qe);Te&&(Y[Qe]=Te,de++)}if(de===0){R(`None of the object IDs in ${T.name} match this model \u2014 nothing imported.`),G("error");return}x(Y);let be=X.size-de;R(be>0?`Imported ${de} binding${de===1?"":"s"} from ${T.name} (${be} skipped \u2014 not in this model).`:`Imported ${de} binding${de===1?"":"s"} from ${T.name}.`),G("success")},Sa=async T=>{let E=T.target.files?.[0];E&&(await Fc(E),T.target.value="")},Us=()=>{b.current?.click()},Ri=async T=>{let E;try{E=JSON.parse(await T.text())}catch{R(`${T.name} is not valid JSON.`),G("error");return}if(E===null||typeof E!="object"||Array.isArray(E)){R("Expected a JSON object with scene config sections."),G("error");return}let X=["model","camera","lighting","wireframe","shadows","environment","background","groundShadows","postProcessing","animations","annotations","cinematic"],Y=E,de=X.filter(be=>Y[be]!==void 0);if(de.length===0){R(`${T.name} doesn't look like an exported scene config file.`),G("error");return}re(be=>{let Qe={...be};for(let Te of de)Qe[Te]=Qp(be[Te],Y[Te]);return Qe}),R(`Imported ${de.length} section${de.length===1?"":"s"} from ${T.name}.`),G("success")},Vs=async T=>{let E=T.target.files?.[0];E&&(await Ri(E),T.target.value="")},Gs=T=>{T.preventDefault(),T.stopPropagation(),!(C||m)&&(nr.current+=1,ft(!0))},Hs=T=>{T.preventDefault(),T.stopPropagation(),!(C||m)&&(T.dataTransfer.dropEffect="copy",ft(!0))},jc=T=>{T.preventDefault(),T.stopPropagation(),!(C||m)&&(nr.current=Math.max(0,nr.current-1),nr.current===0&&ft(!1))},Uc=async T=>{if(T.preventDefault(),T.stopPropagation(),nr.current=0,ft(!1),C||m)return;let E=T.dataTransfer.files?.[0];E&&await va(E)},Ma=(T,E,X)=>{if(!S)return;let Y;try{Y=JSON.parse(E)}catch{X("Invalid JSON");return}if(Y===null||typeof Y!="object"||Array.isArray(Y)){X("Expected a JSON object");return}if(T==="metrics"&&Object.values(Y).some(be=>typeof be!="number"||!Number.isFinite(be))){X("Metrics values must be numbers");return}tn(S,de=>({...de,[T]:Y})),X(null)},Li=St(T=>{if(ue){Ke("orbit");return}if(!T){v(null);return}let E=Object.entries(D).find(([X,Y])=>Y===T||X===T.modelObjectId||Y.modelObjectId===T.modelObjectId)?.[0]??null;v(E)},[ue,D]),Ws=St(async T=>{if(ue){Ke("orbit");return}v(T),pe(null),await Is(T)},[ue,Is]),Vc=St(T=>{pe(T?D[T]??null:null)},[D]),$s=St(T=>cn(!T),[]),Gc=St(()=>{if(ue){R("Camera positions aren't available while Pointer Lock is the active camera controller."),G("error");return}if(!S||!je)return;let T={position:je.position,target:je.target,...je.fov!=null?{fov:je.fov}:{},zoom:je.zoom};tn(S,E=>({...E,cameraState:T}))},[ue,S,je]),Ta=St(()=>{if(ue){R("Camera positions aren't available while Pointer Lock is the active camera controller."),G("error");return}!ir?.position||!ir?.target||Er({position:ir.position,target:ir.target,fov:ir.fov??je?.fov??null,zoom:ir.zoom??je?.zoom??1},!0)},[ue,ir,Er,je]),So=St(()=>{ue||S&&tn(S,T=>({...T,cameraState:void 0}))},[ue,S]),Bi=St(async()=>{if(ue){R("Reset View isn't available while Pointer Lock is the active camera controller."),G("error");return}await Mi()},[ue,Mi]),Di=St(async()=>{if(ue){R("Fit Scene isn't available while Pointer Lock is the active camera controller."),G("error");return}await zs()},[ue,zs]),Oi=St(T=>{Tt(T),Ye(!0)},[]),or=St(()=>{Ye(!1),Tt(null)},[]),Xs=St(()=>{if(Zt==="bindings"){if(!Pt.length){or();return}let T=Bc(Pt);M.reset(T,{asEdit:!0}),v(Pt[0]??null),R("Object bindings reset to default values."),G("success")}else Zt==="scene"&&(W.reset(Fi,{asEdit:!0}),R("Scene config reset to default values."),G("success"));or()},[Zt,Pt,M,W,or]),Ni=St(()=>{wn(null)},[]),qs=async()=>{let T;try{T=await a0()}catch(E){console.warn("[BindingBuilder] Could not read the saved session:",E),R("Couldn't read the saved session from this browser."),G("error");return}if(!T){R("No saved session in this browser yet \u2014 one is saved as soon as you edit a model."),G("error");return}wn(T)},Ii=async()=>{let T=hn;if(wn(null),!T)return;let{session:E,file:X}=T,{model:Y}=E;rr.current=null;let de=Qp(Fi,E.sceneConfig),be;if(Y.kind==="file"){if(!X)return;let Te=gn.current,_n;try{_n=await Id(X)}catch(Ys){console.warn("[BindingBuilder] Could not read the saved model:",Ys),R(Ox(Y.name)),G("error");return}if(gn.current!==Te){_n.cleanup();return}rt.current?.cleanup(),rt.current=_n,be=_n.url}else{be=Y.url;let Te=Ar.current;if(be===m&&Te?.url===be&&!$t.current){en.current={model:Y},yo.current=null,M.reset(Pi(jp(Te.scene),E.bindings)),W.reset(de),R(`Restored your last session with ${Y.name}.`),G("success");return}rt.current?.cleanup(),rt.current=null}en.current={model:Y,file:X??void 0},yo.current=Y.kind==="file"?Y.key:null;let Qe=++gn.current;P(!0),z(null),gr.current=0,Ze.current&&(clearTimeout(Ze.current),Ze.current=null),Ci.current=X?.size,R(`Restoring your last session with ${Y.name}...`),G("default"),w(Y.name),g({url:be,name:Y.name}),le(null),v(null),Ar.current=null,M.reset({}),W.reset(de),$t.current={requestId:Qe,modelName:Y.name,modelUrl:be,storedBindings:E.bindings,restoring:!0},y(be)};return It.status==="checking"?q("div",{className:"bb-root bb-root--licenseChecking",children:q(Ui,{title:"Verifying License",message:"Checking your license key..."})}):It.status==="invalid"?q("div",{className:"bb-root bb-root--licenseInvalid",children:q(Ui,{tone:"error",title:"Invalid License",message:It.isLocalDomain?It.reason??"License has been revoked or has expired":"Failed to load. Please contact the site administrator."})}):Ce(ap.Provider,{value:mn,children:[Ce("div",{className:"bb-root",children:[q("input",{ref:d,type:"file",accept:Zm,className:"bb-hiddenInput",onChange:Ai,disabled:C}),q("input",{ref:h,type:"file",accept:".json,application/json",className:"bb-hiddenInput",onChange:Sa,disabled:C}),q("input",{ref:b,type:"file",accept:".json,application/json",className:"bb-hiddenInput",onChange:Vs,disabled:C}),Ce("aside",{className:`bb-sidebar bb-sidebar--left ${Le?"bb-sidebar--collapsed":""}`,children:[Ce("div",{className:"bb-header bb-header--sidebar",children:[!Le&&q("h1",{className:"bb-title",children:"Binding Builder"}),q("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>ee(T=>!T),"aria-label":Le?"Open editor sidebar":"Collapse editor sidebar",title:Le?"Open editor":"Collapse editor",children:Le?"\u2192":"\u2190"})]}),!Le&&Ce(ha,{children:[Ce("div",{className:"bb-tabRow",children:[q("button",{type:"button",className:`bb-tab ${xt==="object"?"bb-tab--active":""}`,onClick:()=>dn("object"),children:"Object"}),q("button",{type:"button",className:`bb-tab ${xt==="scene"?"bb-tab--active":""}`,onClick:()=>dn("scene"),children:"Scene"})]}),q("section",{className:"bb-editor",children:xt==="scene"?q(ha,{children:m?q(Rp,{config:$,onChange:re,activeSubTab:ge,onActiveSubTabChange:H,cameraState:ge==="Cinematic"&&je?{position:je.position,target:je.target,azimuthAngle:je.azimuthAngle,polarAngle:je.polarAngle}:null,onPreviewWaypoint:Nc,animationClipDetails:Ti.clipDetails,animationPlayback:Ti}):q("div",{className:"bb-emptyEditor",children:"Upload a model to edit its scene settings."})}):!it||!S?q("div",{className:"bb-emptyEditor",children:"Select a generated node binding to edit its values."}):Ce(ha,{children:[q("div",{className:"bb-editorHeader",children:Ce("div",{children:[q("div",{className:"bb-sectionKicker",children:"Editing Binding"}),q("h2",{className:"bb-editorTitle",children:it.label||S}),Ce("div",{className:"bb-editorMeta",children:[q("span",{children:it.type}),q("span",{children:it.modelObjectId})]})]})}),q(tx,{selectedItem:S,selectedBinding:it,open:tt.identity,onToggle:()=>_t("identity"),updateBinding:tn,idError:js}),q(ox,{selectedItem:S,selectedBinding:it,open:tt.basics,onToggle:()=>_t("basics"),updateBinding:tn}),Ce(On,{title:"Material",open:tt.material,onToggle:()=>_t("material"),tooltip:"Edit the selected object's base material, textures, and surface properties.",children:[q(ex,{disabled:!S,onApply:T=>S&&Lr(S,E=>({...E,...T}))}),q(J0,{selectedItem:S,selectedMaterial:Jr,pbrWorkflow:he,onPbrWorkflowChange:ne,openMaterialPanels:Ee,materialPanelEnabled:Se,onToggleMaterialPanel:Fe,onSetMaterialPanelState:wo,updateSelectedMaterial:Lr,setSelectedTexturePath:un})]}),q(cx,{selectedItem:S,selectedBinding:it,open:tt.actions,onToggle:()=>_t("actions"),updateBinding:tn}),q(dx,{selectedBinding:it,open:tt.camera,onToggle:()=>_t("camera"),cameraState:je,formattedCameraState:ba,savedCameraPosition:ir,onSaveCameraPosition:Gc,onGoToSavedCamera:Ta,onClearSavedCamera:So,onResetView:Bi,onFitScene:Di}),q(gx,{selectedItem:S,selectedBinding:it,open:tt.transform,onToggle:()=>_t("transform"),updateBinding:tn,moveModeEnabled:At,onToggleMoveMode:O,transformSpace:B,onTransformSpaceChange:V,originalTransform:J.current[S]??null}),q(Up,{title:"Metrics",label:"Metrics JSON",open:tt.metrics,onToggle:()=>_t("metrics"),draft:ve,error:kt,example:'{"area": 42}',onDraftChange:He,onCommit:()=>Ma("metrics",ve,Re)}),q(Up,{title:"Metadata",label:"Metadata JSON",open:tt.metadata,onToggle:()=>_t("metadata"),draft:Dt,error:et,example:'{"room": "kitchen"}',onDraftChange:pt,onCommit:()=>Ma("metadata",Dt,Kt)})]})}),xt==="object"&&Ce("div",{className:"bb-toolbar",children:[Ce("div",{className:"bb-toolbarGroup",children:[q("button",{type:"button",className:"bb-iconButton",disabled:!M.canUndo,onClick:M.undo,title:"Undo (Cmd/Ctrl+Z)",children:q(Ax,{size:16})}),q("button",{type:"button",className:"bb-iconButton",disabled:!Pt.length,onClick:()=>Oi("bindings"),title:"Reset object bindings to default",children:q(Rx,{size:16})}),q("button",{type:"button",className:"bb-iconButton",disabled:!M.canRedo,onClick:M.redo,title:"Redo (Cmd/Ctrl+Shift+Z)",children:q(_x,{size:16})})]}),q("div",{className:"bb-toolbarDivider"}),Ce("button",{type:"button",className:"bb-button bb-button--ghost",disabled:!Pt.length||C,onClick:Br,title:"Re-apply a previously exported objectBindings.json onto this model",children:[q(Ex,{size:14}),"Import"]}),q("div",{className:"bb-toolbarDivider"}),q(Op,{disabled:!Pt.length||L,exporting:L,onExportJson:()=>Ca("json"),onExportTs:()=>Ca("ts")})]}),xt==="scene"&&Ce("div",{className:"bb-toolbar",children:[Ce("div",{className:"bb-toolbarGroup",children:[q("button",{type:"button",className:"bb-iconButton",disabled:!W.canUndo,onClick:W.undo,title:"Undo (Cmd/Ctrl+Z)",children:q(Ax,{size:16})}),q("button",{type:"button",className:"bb-iconButton",onClick:()=>Oi("scene"),title:"Reset scene config to default",children:q(Rx,{size:16})}),q("button",{type:"button",className:"bb-iconButton",disabled:!W.canRedo,onClick:W.redo,title:"Redo (Cmd/Ctrl+Shift+Z)",children:q(_x,{size:16})})]}),q("div",{className:"bb-toolbarDivider"}),Ce("button",{type:"button",className:"bb-button bb-button--ghost",disabled:!Pt.length||C,onClick:Us,title:"Re-apply a previously exported sceneConfig.json",children:[q(Ex,{size:14}),"Import"]}),q("div",{className:"bb-toolbarDivider"}),q(Op,{disabled:!Pt.length||C,onExportJson:()=>Ns("sceneConfig.json",Cx($),"application/json"),onExportTs:()=>Ns("sceneConfig.ts",Sx($),"text/typescript")})]})]})]}),Ce("main",{className:"bb-previewShell",children:[Ce("div",{className:"bb-previewHeader",children:[Ce("div",{className:"bb-previewToggles",children:[Ce("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[q("input",{type:"checkbox",checked:_e,onChange:T=>ce(T.target.checked)}),"Zoom on selected"]}),Ce("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[q("input",{type:"checkbox",checked:qe,onChange:T=>nt(T.target.checked)}),"Highlight on hover"]}),Ce("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[q("input",{type:"checkbox",checked:Ot,onChange:T=>Nt(T.target.checked)}),"Camera controller"]})]}),Ce("div",{className:"bb-previewControlsColumn",children:[Ce("div",{className:"bb-previewControls",children:[q("div",{className:"bb-previewMeta",children:q("span",{children:S?`Focused: ${S}`:"Select a node to inspect it"})}),u&&!o&&q("button",{type:"button",className:"bb-restoreSessionButton",disabled:C,onClick:qs,title:"Restore your last session \u2014 the model, its object bindings, and scene settings saved in this browser","aria-label":"Restore last session",children:q(Lx,{size:14})}),m&&u&&!o&&q("button",{type:"button",className:"bb-button bb-button--ghost bb-removeModelButton",onClick:wa,children:"Remove model"})]}),m&&q("div",{className:"bb-moveHint",children:ue?q(ha,{children:"Click the preview to look around \xB7 Esc to release"}):At?q(ha,{children:"Select a mesh \xB7 drag the colored arrows, planes, or rings"}):Ce(ha,{children:[q("kbd",{children:"W"}),q("kbd",{children:"A"}),q("kbd",{children:"S"}),q("kbd",{children:"D"})," move \xB7 ",q("kbd",{children:"Space"}),"/",q("kbd",{children:"C"})," up \xB7 down \xB7 drag to look"]})})]})]}),Ce("div",{className:"bb-preview",children:[q(wc,{visible:C||Z,message:N,tone:F,progress:_??void 0}),m?q(vp,{modelUrl:m,tilesetUrl:p?.tilesetUrl,objectBindings:D,selectedObject:it,onObjectSelect:Li,onObjectBindingsChange:x,onObjectEditLeaseChange:(T,E)=>l?.(T.modelObjectId||T.id,E),showObjectBindingDataPanel:!1,showSceneObjectsPanel:!1,onCameraChange:Rr,onViewerReady:ga,onAnnotationsChange:fa,activeAnnotation:yt?.annotation??null,onActiveAnnotationChange:Fs,onAnimationsReady:ya,onModelLoaded:Ic,onLoadError:br,onObjectCatalog:zc,onProgress:_i,onCameraControllerChange:Ke,cameraControllerType:Oe,licenseKey:e,licenseValidationUrl:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,sceneConfig:$,onSceneConfigChange:re,preserveDrawingBuffer:!0,disableZoom:!1,zoomOnSelected:_e,highlightOnHover:qe,enableCameraControls:Ot,moveModeEnabled:At,objectTransformSpace:B,enableKeyboardNavigation:!0,showViewGizmo:!0,panelHoveredObject:qe?ht:null,showLoadingOverlay:!1,autoRotate:ue?!1:$.model.autoRotate??!1,autoRotateSpeed:$.model.autoRotateSpeed??1}):q("div",{className:`bb-previewPlaceholder ${kn?"bb-previewPlaceholder--dragActive":""}`,onDragEnter:Gs,onDragOver:Hs,onDragLeave:jc,onDrop:Uc,children:Ce("div",{children:[q("div",{children:"Upload a GLB, GLTF, OBJ, FBX, or USDZ model, or drag a supported model/ZIP bundle here to generate editable object bindings."}),u?q("button",{type:"button",className:"bb-previewPlaceholderButton",onClick:Ei,disabled:C,children:"Upload"}):null]})})]})]}),q(fx,{bindings:D,selectedItem:S,onSelect:Ws,onHover:Vc,isOpen:!vn,onToggle:$s})]}),Ue&&q("div",{className:"bb-reset-overlay",onClick:or,children:Ce("div",{className:"bb-reset-dialog",onClick:T=>T.stopPropagation(),children:[Ce("div",{className:"bb-reset-header",children:[Ce("h3",{className:"bb-reset-title",children:[q(Dk,{size:20,className:"bb-icon-warning"}),"Confirm Reset"]}),q("button",{className:"bb-reset-close",onClick:or,children:q(Bx,{size:20})})]}),Ce("div",{className:"bb-reset-body",children:[Ce("p",{className:"bb-reset-message",children:["Are you sure you want to reset"," ",q("strong",{children:Zt==="bindings"?"Object Bindings":"Scene Config"}),"?"]}),q("p",{className:"bb-reset-details",children:Zt==="bindings"?"This will remove all your custom changes to object properties, groups, tags, transforms, materials, actions, camera positions, metrics, and metadata.":"This will restore all scene settings (camera, lighting, environment, background, animations, annotations, etc.) to their default values."}),q("p",{className:"bb-reset-warning",children:"This action cannot be undone!"})]}),Ce("div",{className:"bb-reset-footer",children:[q("button",{className:"bb-reset-btn",onClick:or,children:"Cancel"}),q("button",{className:"bb-reset-btn-danger",onClick:Xs,children:"Reset"})]})]})}),hn&&q("div",{className:"bb-reset-overlay",onClick:Ni,children:Ce("div",{className:"bb-reset-dialog",onClick:T=>T.stopPropagation(),children:[Ce("div",{className:"bb-reset-header",children:[Ce("h3",{className:"bb-reset-title",children:[q(Lx,{size:20,className:"bb-icon-restore"}),"Restore Last Session"]}),q("button",{className:"bb-reset-close",onClick:Ni,children:q(Bx,{size:20})})]}),Ce("div",{className:"bb-reset-body",children:[Ce("p",{className:"bb-reset-message",children:["Restore ",q("strong",{children:hn.session.model.name}),", saved ",Ik(hn.session.savedAt),"?"]}),q("p",{className:"bb-reset-details",children:"This reloads that model with its object bindings and scene settings, replacing what's in the editor now."})]}),Ce("div",{className:"bb-reset-footer",children:[q("button",{className:"bb-reset-btn",onClick:Ni,children:"Cancel"}),q("button",{className:"bb-reset-btn-restore",onClick:Ii,children:"Restore"})]})]})})]})}export{Fa as a,Uh as b,nd as c,ol as d,ja as e,zr as f,Zm as g,Id as h,lg as i,kl as j,Xd as k,wg as l,wc as m,vp as n,Nh as o,zh as p,zk as q};
|