@liveroom-tech/react-immersive 5.0.2 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +580 -38
  2. package/dist/{ModelViewer-DOexHkJC.d.ts → ModelViewer-Bj-KjiDL.d.mts} +91 -42
  3. package/dist/{ModelViewer-CbbJT85n.d.mts → ModelViewer-BkQ73y6N.d.ts} +91 -42
  4. package/dist/binding-builder.css +1 -1
  5. package/dist/binding-builder.js +13 -12
  6. package/dist/binding-builder.mjs +1 -1
  7. package/dist/chunk-32WCLPTZ.mjs +1 -0
  8. package/dist/chunk-CSGNL4XU.mjs +3 -0
  9. package/dist/chunk-F2ILTIPG.mjs +28 -0
  10. package/dist/chunk-V6GALFL5.mjs +1 -0
  11. package/dist/chunk-WN6GMMHF.mjs +1 -0
  12. package/dist/hosted.css +1 -1
  13. package/dist/hosted.d.mts +3 -3
  14. package/dist/hosted.d.ts +3 -3
  15. package/dist/hosted.js +12 -11
  16. package/dist/hosted.mjs +1 -1
  17. package/dist/index.css +1 -1
  18. package/dist/index.d.mts +54 -10
  19. package/dist/index.d.ts +54 -10
  20. package/dist/index.js +11 -10
  21. package/dist/index.mjs +1 -1
  22. package/dist/{modelInfo-CEmmvVCH.d.mts → modelInfo-DnkmTGMd.d.mts} +6 -0
  23. package/dist/{modelInfo-CEmmvVCH.d.ts → modelInfo-DnkmTGMd.d.ts} +6 -0
  24. package/dist/{objectCatalog-5W8n5xNQ.d.ts → objectCatalog-BIeXURoq.d.mts} +276 -5
  25. package/dist/{objectCatalog-5W8n5xNQ.d.mts → objectCatalog-BIeXURoq.d.ts} +276 -5
  26. package/dist/simple-model-viewer.d.mts +2 -2
  27. package/dist/simple-model-viewer.d.ts +2 -2
  28. package/dist/simple-model-viewer.js +3 -3
  29. package/dist/simple-model-viewer.mjs +1 -1
  30. package/dist/utils.d.mts +2 -2
  31. package/dist/utils.d.ts +2 -2
  32. package/dist/utils.js +1 -1
  33. package/dist/utils.mjs +1 -1
  34. package/package.json +1 -1
  35. package/dist/chunk-3GX7DOGS.mjs +0 -3
  36. package/dist/chunk-AH5NAZWX.mjs +0 -27
  37. package/dist/chunk-BGYK4Y2Y.mjs +0 -1
  38. package/dist/chunk-WFEYRUZC.mjs +0 -1
  39. package/dist/chunk-XTLSAYAQ.mjs +0 -1
@@ -0,0 +1,28 @@
1
+ import{A as Xh,B as $h,C as cs,D as us,E as ds,F as Lc,G as qh,H as Yh,I as Zh,a as kc,b as Ah,c as Rh,d as as,e as Vo,g as kh,i as _t,j as gn,k as ss,l as xr,m as $e,n as Dh,o as Lh,p as Oh,q as Ih,r as Bh,s as Fo,t as ls,u as zh,v as Nh,w as Uh,x as Gh,y as Hh,z as Wh}from"./chunk-V6GALFL5.mjs";import{A as Jh,F as em,G as tm,d as Dc,g as Li,h as jh,o as Vh,p as Uo,q as Fh,r as Oi,s as Go,t as Gn,y as Kh,z as Qh}from"./chunk-32WCLPTZ.mjs";import{a as Rc}from"./chunk-JR557W27.mjs";var rm={showObjectBindingDataPanel:!1,showSceneObjectsPanel:!1,showDownloadButton:!1,showResetButton:!1,showAnnotationNavigation:!1,showMaterialVariants:!1},Jx=Object.freeze({minimal:Object.freeze({...rm}),showcase:Object.freeze({...rm,autoRotate:!0}),configurator:Object.freeze({showObjectBindingDataPanel:!0,showSceneObjectsPanel:!1,showDownloadButton:!1,showResetButton:!0,showMaterialVariants:!0}),inspector:Object.freeze({showObjectBindingDataPanel:!0,showSceneObjectsPanel:!0,showDownloadButton:!0,showResetButton:!0,showViewGizmo:!0,showMeasureTools:!0,showUvCheckerButton:!0,showExplodeControls:!0,showSectionTools:!0,showIsolateControls:!0,enableKeyboardNavigation:!0})}),Zx=["preset","ui","tools","controls","perf","tiles","xr","decoders"];function nm(e){let t={};for(let r of Object.keys(e))e[r]!==void 0&&(t[r]=e[r]);return t}function e0({ui:e,tools:t,controls:r,perf:n,tiles:i,xr:o,decoders:a}){let s=e?.download,c=e?.mouseController,l=t?.measure,p=r?.autoRotate;return{showObjectBindingDataPanel:e?.objectPanel,showSceneObjectsPanel:e?.sceneObjects,showDownloadButton:s===void 0?void 0:s!==!1,downloadFilename:typeof s=="string"?s:void 0,showResetButton:e?.reset,showFullscreenButton:e?.fullscreen,showLoadingOverlay:e?.loadingOverlay,showViewGizmo:e?.viewGizmo,showMouseController:c===void 0?void 0:c!==!1,mouseControllerPosition:typeof c=="object"?c.position:void 0,mouseControllerOpacity:typeof c=="object"?c.opacity:void 0,showAnnotationNavigation:e?.annotationNavigation,showAnnotationOnHover:e?.annotationOnHover,highlightOnHover:e?.highlightOnHover,showMaterialVariants:e?.materialVariants,showMeasureTools:l===void 0?void 0:l!==!1,measurementUnit:typeof l=="object"?l.unit:void 0,showUvCheckerButton:t?.uvChecker,showExplodeControls:t?.explode,showSectionTools:t?.section,showIsolateControls:t?.isolate,texturePositioning:t?.texturePositioning,enableCameraControls:r?.enabled,enableKeyboardNavigation:r?.keyboard,disableZoom:r?.zoom===void 0?void 0:!r.zoom,zoomOnSelected:r?.zoomOnSelect,autoRotate:p===void 0?void 0:p!==!1,autoRotateSpeed:typeof p=="number"?p:void 0,refitOnResize:r?.refitOnResize,cameraLimits:r?.limits,moveSensitivity:r?.moveSensitivity,zoomSensitivity:r?.zoomSensitivity,renderMode:n?.renderMode,maxDpr:n?.maxDpr,performanceProfile:n?.profile,preserveDrawingBuffer:n?.preserveDrawingBuffer,tilesetUrl:i?.url,tilesErrorTarget:i?.errorTarget,tilesCacheSize:i?.cacheSize,enableXR:o?.enabled,usdzUrl:o?.usdzUrl,arScaleMode:o?.scaleMode,mobileHandoffUrl:o?.mobileHandoffUrl,dracoDecoderPath:a?.draco,ktx2TranscoderPath:a?.ktx2,meshopt:a?.meshopt}}function im(e){let t={...e};for(let r of Zx)delete t[r];return{...e.preset?Jx[e.preset]:void 0,...nm(t),...nm(e0(e))}}import{useCallback as Ut,useRef as Bi,useState as am}from"react";import{Vector3 as sm}from"three";var Oc=new WeakSet;function Ii(e){Oc.add(e)}function om(e){let t=Oc.has(e);return t&&Oc.delete(e),t}function lm(e){return[e.x,e.y,e.z]}function Hr(e,t){let r=new sm,n=new sm;return t.getPosition(r),t.getTarget(n),{position:lm(r),target:lm(n),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 t0(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 Ho(e,t,r=.6){let n=e.smoothTime;e.smoothTime=r;try{return await t()}finally{e.smoothTime=n}}function WP(e={}){let t=Bi(e);t.current=e;let r=Bi(null),[n,i]=am(null),[o,a]=am(()=>({...e.presets})),s=Bi(o);s.current=o;let c=Ut(P=>{i(T=>t0(T,P)?T:P)},[]),l=Ut(P=>{c(P)},[c]),p=Bi(null),d=Bi(null),m=Bi(null),h=Ut(P=>{r.current=P;let T=Hr(P.raw.controls.camera,P.raw.controls);c(T),P.raw.scene!==d.current&&(d.current=P.raw.scene,p.current=null,m.current=null),P.homeCameraState&&!p.current&&(p.current=P.homeCameraState);let{initialPosition:w,initialTarget:A,initialTransition:k=!1}=t.current;if((w||A)&&P.raw.scene&&(w||P.homeCameraState)&&m.current!==P.raw.controls){m.current=P.raw.controls,P.homeCameraState||Ii(P.raw.controls);let V=w??T.position,F=A??T.target;P.raw.controls.setLookAt(V[0],V[1],V[2],F[0],F[1],F[2],k).then(()=>{if(r.current?.raw.controls!==P.raw.controls)return;let z=Hr(P.raw.controls.camera,P.raw.controls);p.current={position:z.position,target:z.target},c(z)}).catch(()=>{})}},[c]),f=Ut(async()=>{let P=r.current,T=P?.raw.controls;if(!T)return!1;try{let w=p.current;return w?await Ho(T,()=>T.setLookAt(w.position[0],w.position[1],w.position[2],w.target[0],w.target[1],w.target[2],!0)):P?.raw.scene?await Ho(T,()=>T.fitToBox(P.raw.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})):await Ho(T,()=>T.reset(!0)),!0}catch{return!1}},[]),g=Ut(async()=>{let P=r.current;if(!P?.raw.controls||!P.raw.scene)return!1;try{return await Ho(P.raw.controls,()=>P.raw.controls.fitToBox(P.raw.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),y=Ut(async P=>{let T=r.current;if(!T?.raw.controls)return!1;let w=Li(T.objectBindings,P);if(!w)return!1;let A=T.raw.nodes[w];if(!A)return!1;try{return await Ho(T.raw.controls,()=>T.raw.controls.fitToBox(A,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),x=Ut(async(P,T=!0)=>{let w=r.current?.raw.controls;if(!w)return!1;try{return r.current?.homeCameraState||Ii(w),await w.setTarget(P[0],P[1],P[2],T),c(Hr(w.camera,w)),!0}catch{return!1}},[c]),C=Ut(async(P,T=!0)=>{let w=r.current?.raw.controls;if(!w)return!1;try{r.current?.homeCameraState||Ii(w);let A=[w.setLookAt(P.position[0],P.position[1],P.position[2],P.target[0],P.target[1],P.target[2],T)];P.azimuthAngle!=null&&P.polarAngle!=null&&A.push(w.rotateTo(P.azimuthAngle,P.polarAngle,T)),await Promise.all(A);let k=w.camera,V=!1;return P.fov!=null&&"fov"in k&&typeof k.fov=="number"&&(k.fov=P.fov,V=!0),P.zoom!=null&&"zoom"in k&&typeof k.zoom=="number"&&(k.zoom=P.zoom,V=!0),V&&"updateProjectionMatrix"in k&&k.updateProjectionMatrix(),c(Hr(k,w)),!0}catch{return!1}},[c]),v=Ut((P,T=!0)=>C(P,T),[C]),N=Ut((P,T,w=!0)=>C({position:P,target:T},w),[C]),M=Ut(async(P,T,w=!0)=>{let A=r.current?.raw.controls;if(!A)return!1;try{return r.current?.homeCameraState||Ii(A),await A.rotateTo(P*Math.PI/180,T*Math.PI/180,w),c(Hr(A.camera,A)),!0}catch{return!1}},[c]),S=Ut(async(P,T=!0)=>{let w=r.current?.raw.controls;if(!w)return!1;try{return r.current?.homeCameraState||Ii(w),await w.dollyTo(P,T),c(Hr(w.camera,w)),!0}catch{return!1}},[c]),O=Ut(P=>{let T=r.current?.raw.controls,w=P.trim();if(!T||!w)return null;let A=Hr(T.camera,T);return s.current={...s.current,[w]:A},a(k=>({...k,[w]:A})),c(A),A},[c]),R=Ut((P,T=!0)=>{let w=s.current[P];return w?C(w,T):Promise.resolve(!1)},[C]);return{cameraState:n,cameraPresets:o,resetView:f,focusObject:y,fitScene:g,setCameraTarget:x,setCameraState:v,lookAt:N,orbitTo:M,dollyTo:S,savePreset:O,goToPreset:R,handleCameraChange:l,handleViewerReady:h}}import{useCallback as Hn,useEffect as r0,useRef as cm,useState as Ic}from"react";var um={currentClip:null,isPlaying:!1,speed:1,time:0,duration:0,active:[]};function qP(){let e=cm(null),t=cm(null),[r,n]=Ic([]),[i,o]=Ic([]),[a,s]=Ic(um);r0(()=>()=>{t.current?.()},[]);let c=Hn(g=>{t.current?.(),e.current=g,n(g.clips),o(g.clipDetails??g.clips.map(y=>({sourceName:y,duration:0}))),s(g.getState?.()??um),t.current=g.subscribe?.(s)??null},[]),l=Hn(g=>{let y=e.current;y&&(g(y),!y.subscribe&&y.getState&&s(y.getState()))},[]),p=Hn((g,y)=>l(x=>x.play(g,y)),[l]),d=Hn(g=>l(y=>y.pause(g)),[l]),m=Hn(g=>l(y=>y.stop(g)),[l]),h=Hn((g,y)=>l(x=>x.setSpeed(g,y)),[l]),f=Hn((g,y)=>l(x=>x.seek?.(g,y)),[l]);return{clips:r,clipDetails:i,...a,play:p,pause:d,stop:m,setSpeed:h,seek:f,handleAnimationsReady:c}}import{AlertTriangle as n0}from"lucide-react";import{jsx as ps,jsxs as dm}from"react/jsx-runtime";function hs({title:e,message:t,tone:r="default"}){return dm("div",{className:`ri-license-overlay${r==="error"?" ri-license-overlay--error":""}`,children:[dm("div",{className:"ri-license-overlay__header",children:[r==="error"?ps(n0,{size:16,className:"ri-license-overlay__icon","aria-hidden":"true"}):ps("span",{className:"ri-license-overlay__statusDot","aria-hidden":"true"}),ps("span",{className:"ri-license-overlay__title",children:e})]}),ps("p",{className:"ri-license-overlay__message",children:t})]})}import{CanvasTexture as pm,Color as hm,ImageLoader as i0,NoColorSpace as fs,RepeatWrapping as ms,SRGBColorSpace as jc,Texture as o0}from"three";var zi=new Map,Wr={color:"#93c5fd",intensity:.07},Wn=new hm(Wr.color).multiplyScalar(Wr.intensity),mm=new hm(Wr.color),fm=.28,Ni=new Map,Nc=new Map;function a0(e){return`${e.name}|${e.size}|${e.lastModified}`}function n2(e){let t=a0(e),r=e.name.lastIndexOf("."),n=r>0?e.name.slice(0,r):e.name,i=r>0?e.name.slice(r):"",o=`materials/${e.name}`,a=2;for(;;){let s=Nc.get(o);if(s===void 0||s===t)return Nc.set(o,t),o;o=`materials/${n}-${a}${i}`,a+=1}}function gm(e){return Ni.get(e)}function bm(e,t){let r=++e.loadGeneration;e.loaded=!1;let n=()=>{if(e.loadGeneration!==r)return;e.loaded=!0;let i=e.pending;e.pending=[];for(let o of i)o()};new i0().load(t,i=>{e.loadGeneration===r&&(e.texture.image=i,e.texture.needsUpdate=!0,n())},void 0,()=>{e.loadGeneration===r&&(console.warn(`Failed to load texture: ${t}`),n())})}function ym(e,t){for(let r of[jc,fs]){let n=zi.get(Wo(e,r));n&&bm(n,t)}}function i2(e,t){let r=Ni.get(e);r&&r!==t&&r.startsWith("blob:")&&URL.revokeObjectURL(r),Ni.set(e,t),ym(e,t)}function o2(e){let t=Ni.get(e);t&&(t.startsWith("blob:")&&URL.revokeObjectURL(t),Ni.delete(e),Nc.delete(e),ym(e,e))}function Wo(e,t){return`${t}|${e}`}function Xo(e,t=fs,r){let n=Wo(e,t),i=zi.get(n);if(i)return r&&!i.loaded&&i.pending.push(r),i.texture;let o=Ni.get(e)??e,a={texture:new o0,refCount:0,loaded:!1,pending:r?[r]:[],loadGeneration:0};return a.texture.flipY=!1,a.texture.colorSpace=t,zi.set(n,a),bm(a,o),a.texture}function ji(e,t=fs,r){let n=Xo(e,t,r);return zi.get(Wo(e,t)).refCount+=1,n}function Xr(e,t=fs){let r=zi.get(Wo(e,t));r&&(r.refCount-=1,r.refCount<=0&&(r.loadGeneration+=1,r.pending=[],r.texture.dispose(),zi.delete(Wo(e,t))))}function gs(e,t,r,n,i,o=1,a=0){let s=e.offsetTextures??(e.offsetTextures={}),c=s[t],l=c;if(!l||l.sourcePath!==n||l.base!==r){c?.texture.dispose();let d=r.clone();d.wrapS=ms,d.wrapT=ms,d.center.set(.5,.5),d.needsUpdate=!0,l={texture:d,sourcePath:n,base:r},s[t]=l}let p=o>0?o:1;return l.texture.offset.set(i[0],i[1]),l.texture.repeat.set(1/p,1/p),l.texture.rotation=a,l.texture}function bs(e,t){let r=e.offsetTextures,n=r?.[t];n&&(n.texture.dispose(),delete r[t])}function vm(e){let t=e.offsetTextures;if(t){for(let r of Object.values(t))r.texture.dispose();delete e.offsetTextures}}var Bc=null;function ys(){if(Bc)return Bc;let e=256,t=document.createElement("canvas");t.width=e,t.height=e;let r=t.getContext("2d"),n=r.createRadialGradient(e*.35,e*.35,e*.02,e*.5,e*.5,e*.55);n.addColorStop(0,"#ffffff"),n.addColorStop(.4,"#b5b5b5"),n.addColorStop(1,"#3a3a3a"),r.fillStyle=n,r.fillRect(0,0,e,e);let i=new pm(t);return i.colorSpace=jc,Bc=i,i}var zc=null;function xm(){if(zc)return zc;let e=1024,t=8,r=e/t,n=["#ef4444","#f59e0b","#22c55e","#6366f1"],i=document.createElement("canvas");i.width=e,i.height=e;let o=i.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*r,p=s*r,d=(Math.floor(c/2)+Math.floor(s/2))%4;o.fillStyle=n[d],o.fillRect(l,p,r,r),o.strokeStyle="rgba(0, 0, 0, 0.28)",o.lineWidth=2;for(let C=1;C<4;C+=1){let v=C*r/4;o.beginPath(),o.moveTo(l+v,p),o.lineTo(l+v,p+r),o.moveTo(l,p+v),o.lineTo(l+r,p+v),o.stroke()}o.strokeStyle="#09090b",o.lineWidth=7,o.strokeRect(l,p,r,r);let m=l+r*.23,h=p+r*.72,f=l+r*.72,g=p+r*.23;o.lineCap="round",o.lineJoin="round",o.beginPath(),o.moveTo(m,h),o.lineTo(f,g),o.lineTo(f-r*.2,g),o.moveTo(f,g),o.lineTo(f,g+r*.2),o.stroke();let y=s*t+c+1;o.font=`700 ${Math.round(r*.2)}px ui-monospace, SFMono-Regular, Menlo, monospace`,o.fillStyle="#ffffff",o.strokeStyle="rgba(0, 0, 0, 0.85)",o.lineWidth=6;let x=String(y).padStart(2,"0");o.strokeText(x,l+r/2,p+r*.82),o.fillText(x,l+r/2,p+r*.82)}let a=new pm(i);return a.colorSpace=jc,a.wrapS=ms,a.wrapT=ms,a.flipY=!1,a.anisotropy=8,a.needsUpdate=!0,zc=a,a}import{Box3 as m0,Mesh as f0,Raycaster as g0,Triangle as b0,Vector3 as Dr}from"three";import{Matrix4 as s0}from"three";function wr(e){return e.isSkinnedMesh===!0}function Fi(e){let t=[];return e.traverse(r=>{wr(r)&&t.push(r)}),t}var Vi="reactImmersiveSkinFreeze";function wm(e){return!!e.userData[Vi]}function vs(e,t){let r=e.userData,n=new s0().copy(t).invert(),i=r[Vi];if(i){i.frozenInverse.copy(n),e.bindMatrixInverse.copy(n);return}let o={frozenInverse:n,previousOnBeforeRender:e.onBeforeRender};e.bindMatrixInverse.copy(n),e.onBeforeRender=function(a,s,c,l,p,d){o.previousOnBeforeRender.call(this,a,s,c,l,p,d),e.bindMatrixInverse.copy(o.frozenInverse)},r[Vi]=o}function Mm(e){return e.userData[Vi]?.frozenInverse??null}function Ui(e){let t=e.userData,r=t[Vi];r&&(e.onBeforeRender=r.previousOnBeforeRender,delete t[Vi],e.updateMatrixWorld(!0))}import{useCallback as xs,useEffect as l0,useRef as ws}from"react";import{Matrix4 as c0,Triangle as Sm,Vector3 as $o}from"three";var u0=500,d0=10,p0=5;function Ms(e,t,r){let n=ws({resolve:e,onContextMenu:t,anchorOf:r});n.current={resolve:e,onContextMenu:t,anchorOf:r};let i=ws(null),o=ws(!1),a=ws(null),s=xs(()=>{let d=i.current;d?.timer&&clearTimeout(d.timer),i.current=null,a.current?.(),a.current=null},[]),c=xs(()=>{let d=i.current;d&&(s(),d.kind==="touch"&&(o.current=!0,setTimeout(()=>o.current=!1,800)),n.current.onContextMenu?.(d.target,d.pointer))},[s]),l=xs(d=>{let m=d.nativeEvent,h=m.pointerType!=="touch"&&m.button===2,f=m.pointerType==="touch"&&m.button===0;if(!n.current.onContextMenu||!h&&!f)return;let g=n.current.resolve(d.object);if(g===null)return;s();let y={target:g,kind:h?"right":"touch",pointerId:m.pointerId,pointer:Gi(d,n.current.anchorOf?.(d.object)),timer:f?setTimeout(c,u0):null};i.current=y;let x=h?p0:d0,C=S=>Math.hypot(S.clientX-y.pointer.clientX,S.clientY-y.pointer.clientY)>x,v=S=>{S.pointerId===y.pointerId&&C(S)&&s()},N=S=>{S.pointerId===y.pointerId&&(y.kind==="right"&&!C(S)?c():s())},M=S=>{S.pointerId!==y.pointerId&&s()};window.addEventListener("pointermove",v),window.addEventListener("pointerup",N),window.addEventListener("pointercancel",s),window.addEventListener("pointerdown",M),a.current=()=>{window.removeEventListener("pointermove",v),window.removeEventListener("pointerup",N),window.removeEventListener("pointercancel",s),window.removeEventListener("pointerdown",M)}},[s,c]);l0(()=>s,[s]);let p=xs(()=>o.current?(o.current=!1,!0):!1,[]);return{onPointerDown:l,consumeClick:p}}function h0(e,t){let r=e.face,n=t.geometry.getAttribute("position");if(!r||!n)return null;let i=e.barycoord??null;if(!i){let[d,m,h]=[r.a,r.b,r.c].map(f=>t.getVertexPosition(f,new $o));if(i=Sm.getBarycoord(t.worldToLocal(e.point.clone()),d,m,h,new $o),!i)return null}let[o,a,s]=[r.a,r.b,r.c].map(d=>new $o().fromBufferAttribute(n,d)),c=new $o().addScaledVector(o,i.x).addScaledVector(a,i.y).addScaledVector(s,i.z),l=new Sm(o,a,s).getNormal(new $o);return r.normal.clone().transformDirection(t.matrixWorld).dot(e.ray.direction)>0&&l.negate(),{position:[c.x,c.y,c.z],normal:[l.x,l.y,l.z]}}function Xn(e,t){if(t.updateWorldMatrix(!0,!1),e.object===t&&t.isSkinnedMesh===!0){let i=h0(e,t);if(i)return i}let r=t.worldToLocal(e.point.clone()),n=e.face?e.face.normal.clone().transformDirection(e.object.matrixWorld):e.ray.direction.clone().negate();return n.dot(e.ray.direction)>0&&n.negate(),n.transformDirection(new c0().copy(t.matrixWorld).invert()),{position:[r.x,r.y,r.z],normal:[n.x,n.y,n.z]}}function Gi(e,t){let r=e.nativeEvent;return{clientX:r.clientX,clientY:r.clientY,pointerType:"pointerType"in r?r.pointerType:"mouse",...t?{surface:Xn(e,t)}:{}}}function Cm(e,t){if(!(e instanceof f0)||!t)return null;let r=e.geometry.getAttribute("position");if(!r?.count)return null;e.updateWorldMatrix(!0,!1),t.updateWorldMatrix(!0,!1);let n=new m0,i=new Dr;if(wr(e)){let S=e;S.computeBoundingBox(),S.computeBoundingSphere();for(let O=0;O<r.count;O++)n.expandByPoint(e.getVertexPosition(O,i))}else e.geometry.boundingBox||e.geometry.computeBoundingBox(),n.copy(e.geometry.boundingBox);if(n.applyMatrix4(e.matrixWorld),n.isEmpty())return null;let o=n.getCenter(new Dr),a=t.getWorldPosition(new Dr),s=t.getWorldDirection(new Dr),c=t.isOrthographicCamera,l=new g0,p=S=>{if(c){let R=a.distanceTo(o)+n.getSize(i).length()+1;l.set(S.clone().addScaledVector(s,-R),s)}else l.set(a,S.clone().sub(a).normalize());let O=l.intersectObject(e,!1)[0];return O?Xn({...O,ray:l.ray},e):null},d=p(o);if(d)return d;let m=e.geometry.index,h=m?.count??r.count,f=new Dr,g=new Dr,y=new Dr,x=new Dr,C=new Dr,v=new Dr,N=null,M=1/0;for(let S=0;S+2<h;S+=3){if(e.getVertexPosition(m?m.getX(S):S,f).applyMatrix4(e.matrixWorld),e.getVertexPosition(m?m.getX(S+1):S+1,g).applyMatrix4(e.matrixWorld),e.getVertexPosition(m?m.getX(S+2):S+2,y).applyMatrix4(e.matrixWorld),x.copy(f).add(g).add(y).multiplyScalar(1/3),b0.getNormal(f,g,y,C),c?v.copy(s).negate():v.copy(a).sub(x),C.dot(v)<=0)continue;let O=x.distanceToSquared(o);O<M&&(M=O,N=x.clone())}return N?p(N):null}import{Mesh as y0,Raycaster as v0,Triangle as x0,Vector2 as Tm,Vector3 as $r}from"three";function _m(e,t,r,n){if(!(e instanceof y0)||!t)return null;e.updateWorldMatrix(!0,!1),t.updateWorldMatrix(!0,!1);let i=new $r().fromArray(r.position);if(wr(e)){let l=e;l.computeBoundingBox(),l.computeBoundingSphere();let p=l.geometry.getAttribute("position");if(!p)return null;let d=l.geometry.index,m=d?.count??p.count,h=new x0,f=new $r,g=new $r,y=1/0,x=null;for(let C=0;C+2<m;C+=3){let v=[0,1,2].map(M=>d?d.getX(C+M):C+M);h.a.fromBufferAttribute(p,v[0]),h.b.fromBufferAttribute(p,v[1]),h.c.fromBufferAttribute(p,v[2]),h.closestPointToPoint(i,f);let N=f.distanceToSquared(i);if(!(N>=y||!h.getBarycoord(f,g))&&(y=N,x=new $r().addScaledVector(l.getVertexPosition(v[0],new $r),g.x).addScaledVector(l.getVertexPosition(v[1],new $r),g.y).addScaledVector(l.getVertexPosition(v[2],new $r),g.z),y<1e-12))break}if(!x)return null;i.copy(x)}if(i.applyMatrix4(e.matrixWorld).project(t),!Number.isFinite(i.x)||i.z<-1||i.z>1)return null;let o=new Tm(n==="left"?-.0035:n==="right"?.0035:0,n==="down"?-.0035:n==="up"?.0035:0),a=new v0,s=r.size*.01,c=new $r().fromArray(r.position);for(let l=1;l>=1/1024;l/=2){a.setFromCamera(new Tm(i.x,i.y).addScaledVector(o,l),t);let p=a.intersectObject(e,!1)[0];if(p){let d=Xn({...p,ray:a.ray},e);if(new $r().fromArray(d.position).distanceTo(c)<=s)return d}}return null}import{useEffect as T0,useState as _0}from"react";var w0="ri:license-grant:v1",M0={"260cd89ea13f":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwjr3ofKTkkcxOM0GYl/RlJj9JsuyjSF8sYmCd2YqsHJCEO8EvlNDrO2Kl4agFKo6dRhyR2/oWeiU6P9WIqRbvw=="},Pm=new Map;function Am(e){let t=atob(e);return Uint8Array.from(t,r=>r.charCodeAt(0)).buffer}function Em(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");return Am(t.padEnd(Math.ceil(t.length/4)*4,"="))}function S0(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 Ss(e){let t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e.trim())),r=String.fromCharCode(...new Uint8Array(t));return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function Vc(e,t){return`${w0}:${t}:${e}`}function C0(e,t){let r=Pm.get(e);if(r)return r;let n=crypto.subtle.importKey("spki",Am(t),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]);return Pm.set(e,n),n}async function Fc(e,t,r){if(!globalThis.crypto?.subtle)return null;try{let[n,i,o,a,...s]=e.split("."),c=M0[i];if(n!=="ri1"||!c||!o||!a||s.length>0)return null;let l=JSON.parse(new TextDecoder().decode(Em(o)));if(!S0(l)||!await crypto.subtle.verify({name:"ECDSA",hash:"SHA-256"},await C0(i,c),Em(a),new TextEncoder().encode(`${n}.${i}.${o}`)))return null;let d=Math.floor(Date.now()/1e3),m=l.expiresAt-l.issuedAt;return l.licenseKeyHash!==t||l.domain!==r||l.expiresAt<=d||l.issuedAt>d+300||m<=0||m>43200?null:{environment:l.environment,tier:l.tier,expiresAt:l.expiresAt}}catch{return null}}async function Rm(e,t,r){try{return await Fc(e,await Ss(t),r)}catch{return null}}async function km(e,t,r){try{let n=await Ss(t);return await Fc(e,n,r)?(localStorage.setItem(Vc(n,r),e),!0):!1}catch{return!1}}async function Dm(e,t){try{let r=await Ss(e),n=Vc(r,t),i=localStorage.getItem(n);if(!i)return null;let o=await Fc(i,r,t);return o||localStorage.removeItem(n),o}catch{return null}}async function Uc(e,t){try{let r=await Ss(e);localStorage.removeItem(Vc(r,t))}catch{}}var P0=["localhost","127.0.0.1","0.0.0.0"],E0=e=>P0.includes(e)||e.endsWith(".local")||e.endsWith(".localhost"),Om="https://react-immersive.liveroom.dev/api/validate-license",A0=()=>typeof window<"u",R0=300*1e3,k0=5e3,D0=400,Hc=new Map,Gc=new Map,bn=class extends Error{},Im=async(e,t,r)=>{let n=await Dm(e,t);return n?(console.warn("[react-immersive] License server unreachable \u2014 using a previously verified, time-limited offline grant."),{status:"valid",reason:"Previously verified offline grant",environment:n.environment,tier:n.tier,isLocalDomain:r}):null},Lm=async(e,t,r)=>{let n=await Im(e,t,r);return n||(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:r})},L0=e=>e instanceof bn||e instanceof TypeError,O0=()=>new Promise(e=>setTimeout(e,D0)),I0=e=>e==="development"||e==="production",B0=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&&!I0(t.environment)||t.tier!==void 0&&typeof t.tier!="string"||t.offlineGrant!==void 0&&typeof t.offlineGrant!="string")},z0=e=>{if(!e||typeof e!="object")return null;let t=e,r=t.reason??t.error;return typeof r=="string"&&r.trim()?r:null},N0=(e,t,r)=>`${r}::${e}::${t}`,j0=e=>{let t=Hc.get(e);return t?Date.now()-t.timestamp>R0?(Hc.delete(e),null):t.result:null},V0=(e,t)=>({status:e.valid?"valid":"invalid",reason:e.reason,environment:e.environment,tier:e.tier,isLocalDomain:t}),F0=(e,t)=>({status:"invalid",reason:e,isLocalDomain:t});async function U0(e,t,r,n){let i=N0(e,t,n),o=j0(i);if(o)return o;let a=Gc.get(i);if(a)return a;let s=(async()=>{for(let c=0;c<2;c+=1)try{return await G0(e,t,r,i,n)}catch(l){if(!L0(l))throw l;if(c===0){let p=await Im(e,t,r);if(p)return p;await O0();continue}return Lm(e,t,r)}return Lm(e,t,r)})().finally(()=>{Gc.delete(i)});return Gc.set(i,s),s}async function G0(e,t,r,n,i){let o=new AbortController,a=setTimeout(()=>o.abort(),k0),s;try{s=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},cache:"no-store",signal:o.signal,body:JSON.stringify({licenseKey:e,domain:t})})}catch(p){throw o.signal.aborted?new bn("License validation timed out"):p}finally{clearTimeout(a)}let c;try{c=await s.json()}catch{throw new bn(`License server returned a non-JSON response${s.status?` (${s.status})`:""}`)}if(!s.ok){if(s.status===429||s.status>=500)throw new bn(`License server error (${s.status})`);let p=z0(c)??`License validation failed${s.status?` (${s.status})`:""}`;return await Uc(e,t),F0(p,r)}if(!B0(c))throw new bn("License server returned an unexpected payload");let l=V0(c,r);if(l.status==="valid"&&i!==Om){let p=c.offlineGrant?await Rm(c.offlineGrant,e,t):null;if(!p)throw new bn("License validation endpoint did not return a verifiable signed grant");l={...l,environment:p.environment,tier:p.tier}}return l.status==="valid"?(Hc.set(n,{result:l,timestamp:Date.now()}),c.offlineGrant&&(await km(c.offlineGrant,e,t)||console.warn("[react-immersive] The license server returned an invalid offline grant; it was not cached."))):await Uc(e,t),l}var Bm=(e,t=Om)=>{let[r,n]=_0({status:"checking",isLocalDomain:!1});return T0(()=>{if(!A0())return;let i=!1,o=p=>{i||n(p)},a=e.trim(),s=window.location.hostname.toLowerCase(),c=E0(s);return o({status:"checking",isLocalDomain:c}),a?((async()=>{try{o(await U0(a,s,c,t))}catch(p){let d=p instanceof TypeError?"Could not reach license server":p instanceof Error?p.message:"License validation failed";o({status:"invalid",reason:d,isLocalDomain:c})}})(),()=>{i=!0}):(o({status:"invalid",reason:"No license key provided",isLocalDomain:c}),()=>{i=!0})},[e,t]),r};import{createContext as H0,useContext as W0}from"react";var X0=H0({isInsideEditor:!1,activeTab:"object",activeSubTab:"General",tier:"free"});var Cs=()=>W0(X0);import{Box3 as zm,Euler as $0,Matrix4 as Nm,Quaternion as q0,Vector3 as yn}from"three";function jm(e){e.updateWorldMatrix(!0,!0);let t=new Nm().copy(e.matrixWorld).invert(),r=new zm,n=new zm,i=!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 Nm().multiplyMatrices(t,o.matrixWorld);n.copy(a.geometry.boundingBox).applyMatrix4(s),r.union(n),i=!0}),i?r.getCenter(new yn):new yn}function Vm(e,t="XYZ"){return new q0().setFromEuler(new $0(e[0],e[1],e[2],t))}function Y0(e,t,r,n,i="XYZ"){let a=new yn(...n).multiply(new yn(...r)).applyQuaternion(Vm(t,i)).add(new yn(...e));return[a.x,a.y,a.z]}function A2(e,t,r,n,i,o="XYZ"){let a=new yn(...Y0(e,t,n,i,o)),s=new yn(...i).multiply(new yn(...n)).applyQuaternion(Vm(r,o)),c=a.sub(s);return[c.x,c.y,c.z]}import{useRef as de,useState as ie,useEffect as ge,useCallback as Y,useMemo as ut,Suspense as Qy}from"react";import{GizmoHelper as tP,GizmoViewport as rP}from"@react-three/drei";import{useFrame as iv,useThree as ov}from"@react-three/fiber";import{QRCodeSVG as nP}from"qrcode.react";import{Box3 as mo,PerspectiveCamera as av,Raycaster as iP,Sphere as oP,Vector2 as aP,Vector3 as Nt}from"three";import{Component as K0}from"react";var Ts=class extends K0{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(r,n){this.props.onLoadError?.(r)}render(){return this.state.hasError?null:this.props.children}};import{PerspectiveCamera as Wc,Vector2 as Q0}from"three";var Fm="riEditorGizmo";function _s(e){return e.userData[Fm]=!0,e}function Ps(e){let t=[];return e.traverse(r=>{r.visible&&r.userData[Fm]&&(r.visible=!1,t.push(r))}),()=>{for(let r of t)r.visible=!0}}function Es(e,t={}){if(!e)return Promise.reject(new Error("Viewer not ready"));let{gl:r,scene:n,camera:i,invalidate:o}=e;if(!r.getContextAttributes().preserveDrawingBuffer)return Promise.reject(new Error("Screenshot capture is disabled. Set preserveDrawingBuffer on ModelViewer to enable it."));let{transparent:a=!1}=t,s=r.getSize(new Q0),c=r.getPixelRatio(),l=i instanceof Wc?i.aspect:null,p=n.background,d=t.width??s.x,m=t.height??s.y,h=d!==s.x||m!==s.y,f=Ps(n);return a&&(n.background=null),h&&(r.setPixelRatio(1),r.setSize(d,m,!1),i instanceof Wc&&(i.aspect=d/m,i.updateProjectionMatrix())),o(),new Promise((g,y)=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{let x,C;try{x=r.domElement.toDataURL("image/png")}catch(v){C=v}f(),a&&(n.background=p),h&&(r.setPixelRatio(c),r.setSize(s.x,s.y,!1),i instanceof Wc&&l!==null&&(i.aspect=l,i.updateProjectionMatrix())),o(),C?y(C):g(x)})})})}var Xc={webm:["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"],mp4:["video/mp4;codecs=avc1.42E01E","video/mp4"]};function $n(e="auto"){return typeof MediaRecorder>"u"?null:(e==="auto"?[...Xc.webm,...Xc.mp4]:Xc[e]).find(r=>MediaRecorder.isTypeSupported(r))??null}function Um(e,t={}){let{fps:r=30,videoBitsPerSecond:n=8e6,signal:i}=t;if(!Number.isFinite(r)||r<1||r>60)throw new Error("Video frame rate must be between 1 and 60.");if(!Number.isFinite(n)||n<=0)throw new Error("Video bitrate must be a positive number.");if(i?.aborted)throw new DOMException("Video export cancelled.","AbortError");let o=$n(t.format);if(!o||typeof e.captureStream!="function"){let S=t.format&&t.format!=="auto"?` as ${t.format.toUpperCase()}`:"";throw new Error(`Video recording${S} is not supported in this browser.`)}let a,s,c=!1,l=!1,p,d,m,h=[],f,g,y=new Promise((S,O)=>{f=S,g=O}),x=()=>{clearTimeout(p),d!==void 0&&cancelAnimationFrame(d),m!==void 0&&cancelAnimationFrame(m),i?.removeEventListener("abort",v),e.removeEventListener("webglcontextlost",N),s&&(s.ondataavailable=null,s.onstop=null,s.onerror=null),a?.getTracks().forEach(S=>S.stop())},C=(S=new DOMException("Video export cancelled.","AbortError"))=>{if(!c){if(c=!0,x(),s&&s.state!=="inactive")try{s.stop()}catch{}g(S)}},v=()=>C(),N=()=>C(new Error("Video export stopped because the WebGL context was lost.")),M=()=>C(new Error("Video export timed out. Keep the viewer tab visible while recording."));return i?.addEventListener("abort",v,{once:!0}),e.addEventListener("webglcontextlost",N),p=setTimeout(M,3e4),{result:y,cancel:C,start(S){c||d!==void 0||(d=requestAnimationFrame(()=>{if(!c)try{a=e.captureStream(r);let O=new MediaRecorder(a,{mimeType:o,videoBitsPerSecond:n});s=O,O.ondataavailable=({data:R})=>{R.size>0&&h.push(R)},O.onerror=()=>C(new Error("The browser could not encode the video.")),O.onstop=()=>{if(c)return;c=!0,x();let R=new Blob(h,{type:O.mimeType||o});R.size===0?g(new Error("The browser produced an empty video.")):f(R)},O.start(1e3),clearTimeout(p),p=setTimeout(M,(S+30)*1e3)}catch(O){C(O)}}))},finish(){c||l||(l=!0,m=requestAnimationFrame(()=>{if(!c)try{if(!s)throw new Error("Video recording did not start.");s.stop()}catch(S){C(S)}}))}}}import{useCallback as ks,useEffect as iw,useRef as Hm,useState as Wm}from"react";import{Vector3 as Xm}from"three";import{useEffect as As,useMemo as qr,useRef as Yr}from"react";import{useFrame as J0,useThree as Z0}from"@react-three/fiber";import{Box3 as ew,CatmullRomCurve3 as Gm,Sphere as tw,Spherical as rw,Vector3 as vn}from"three";function $c(e){if(e.duration!==void 0)return e.duration;let t=e.waypoints??[];if(t.length<2)return 24;let r=e.loop===!1?t.slice(0,-1):t;return Math.max(r.reduce((n,i)=>n+(i.segmentDuration??3.5),0),4)}var nw=1.2;function Rs({controlsRef:e,sceneRef:t,config:r,playing:n,resetOnPlay:i=!1,onFinished:o,onUserInteract:a,onStop:s,playOnce:c=!1,startAtPath:l=!1,onStarted:p,onProgress:d}){let m=Z0(E=>E.invalidate),h=qr(()=>r.waypoints??[],[r.waypoints]),f=h.length>=2,g=r.loop??!0,y=$c(r),x=qr(()=>h.map(E=>[...E.position,...E.target,E.azimuthAngle??"",E.polarAngle??"",E.segmentDuration??""].join(",")).join(";"),[h]),C=qr(()=>{let E=[];if(h.length<2)return E;let G=0;for(let K=0;K<h.length-1;K++)G+=h[K].segmentDuration??3.5,E.push(G);return g&&h.length>1&&(G+=h[h.length-1].segmentDuration??3.5,E.push(G)),E},[h,g]),v=qr(()=>E=>{if(h.length<2||C.length===0)return E/y;let G=C[C.length-1],K=g?E%y:Math.min(E,y),Ce=y>0?K/y*G:0;for(let Z=0;Z<C.length;Z++)if(Ce<=C[Z]){let Te=Z===0?0:C[Z-1],Ne=C[Z]-Te,pe=Ne>0?(Ce-Te)/Ne:0,Ue=g?h.length:h.length-1,Ee=Z/Ue,Ke=1/Ue;return Ee+pe*Ke}return 1},[h.length,C,y,g]),N=qr(()=>f?{position:new Gm(h.map(E=>new vn(...E.position)),g,"catmullrom",.5),target:new Gm(h.map(E=>new vn(...E.target)),g,"catmullrom",.5)}:null,[x,f,g]),M=qr(()=>{if(!f||!h.every(G=>Number.isFinite(G.azimuthAngle)&&Number.isFinite(G.polarAngle)))return null;let E=h.map(G=>({azimuth:G.azimuthAngle,polar:G.polarAngle,distance:new vn(...G.position).distanceTo(new vn(...G.target))}));for(let G=1;G<E.length;G+=1){let K=E[G-1].azimuth,Ce=E[G].azimuth;E[G].azimuth=Ce+Math.round((K-Ce)/(Math.PI*2))*Math.PI*2}return E},[x,f]),S=Yr(0),O=Yr(0),R=Yr(new vn),P=Yr(new vn),T=Yr(!1),w=Yr(!0),A=Yr(0),k=Yr(!1),V=Yr(null),F=qr(()=>new vn,[]),z=qr(()=>new vn,[]),H=qr(()=>new rw,[]);return As(()=>{S.current=0,A.current=0,O.current=0,k.current=!1},[x,g,y]),As(()=>{i&&(A.current=0,S.current=0,k.current=!1)},[i]),As(()=>{if(!n){T.current=!1,S.current>0&&!i?A.current=S.current:i&&(A.current=0),(S.current>0||k.current)&&s?.();return}S.current>=y&&!g&&(S.current=0,A.current=0,k.current=!1);let E=e.current;if(E&&(E.getPosition(R.current),E.getTarget(P.current)),i||k.current||A.current===0?(S.current=0,A.current=0,k.current=!1):A.current>0&&A.current<y?S.current=A.current:(S.current=0,A.current=0),O.current=0,!f){let G=t.current;if(G){let K=new ew().setFromObject(G).getBoundingSphere(new tw);V.current={center:K.center.clone(),radius:K.radius>0?K.radius:1}}}T.current=!0,w.current=!0,m()},[n,f,e,t,m,y,g,x,i,s]),As(()=>{if(!n||!a)return;let E=e.current;if(!E)return;let G=()=>{k.current||a()};return E.addEventListener("controlstart",G),()=>E.removeEventListener("controlstart",G)},[n,e,a]),J0((E,G)=>{if(!n||!T.current)return;let K=e.current;if(!K)return;let Ce=w.current;w.current=!1,(!Ce||!l)&&(S.current+=G,O.current+=G);let Z=(!g||c)&&S.current>=y,Te=Z&&g?0:v(S.current);if(Te=g?Te%1:Math.min(Te,1),N)if(N.target.getPoint(Te,z),M){let pe=g?M.length:M.length-1,Ue=Math.min(Te,1)*pe,Ee=Math.min(Math.floor(Ue),pe-1),Ke=(Ee+1)%M.length,dt=Te>=1?1:Ue-Ee,fe=dt*dt*(3-2*dt),Ie=M[Ee],Xe=M[Ke],Qt=Xe.azimuth+Math.round((Ie.azimuth-Xe.azimuth)/(Math.PI*2))*Math.PI*2,J=Ie.azimuth+(Qt-Ie.azimuth)*fe,cr=Ie.polar+(Xe.polar-Ie.polar)*fe,et=Ie.distance+(Xe.distance-Ie.distance)*fe;H.set(Math.max(et,1e-6),Math.min(Math.max(cr,1e-6),Math.PI-1e-6),J),F.setFromSpherical(H).add(z)}else N.position.getPoint(Te,F);else{let pe=V.current;if(!pe)return;let Ue=Te*Math.PI*2,Ee=pe.radius*2.2;F.set(pe.center.x+Math.cos(Ue)*Ee,pe.center.y+pe.radius*.6,pe.center.z+Math.sin(Ue)*Ee),z.copy(pe.center)}let Ne=l?1:Math.min(O.current/nw,1);if(Ne<1){let pe=Ne*Ne*(3-2*Ne);F.lerpVectors(R.current,F,pe),z.lerpVectors(P.current,z,pe)}if(K.setLookAt(F.x,F.y,F.z,z.x,z.y,z.z,!1),Ce&&p?.(),d?.(Math.min(S.current/y,1)),Z){T.current=!1,k.current=!0,S.current=0,A.current=0,o?.();return}m()}),null}function $m(e){let t=Hm(e);t.current=e;let r=Hm(null),[n,i]=Wm(null),[o,a]=Wm(0),s=ks(()=>r.current?.cancel(),[]),c=ks(()=>r.current!==null,[]);iw(()=>s,[e.modelUrl,s]);let l=ks(async(d={})=>{let{rendererCaptureRef:m,controlsRef:h,cinematicConfig:f,ready:g,onCaptureStart:y}=t.current,x=m.current,C=h.current;if(!g||!x||!C)throw new Error("Viewer not ready for video export.");if(x.gl.xr.isPresenting)throw new Error("Exit the XR session before recording a video.");if(r.current)throw new Error("A video export is already in progress.");let v=d.mode??(f?"cinematic":"turntable");if(v==="cinematic"&&!f)throw new Error("Enable a cinematic camera path before recording it.");let N=v==="cinematic"?f:{loop:!0},M=d.duration??$c(N);if(!Number.isFinite(M)||M<=0||M>300)throw new Error("Video duration must be greater than 0 and at most 300 seconds.");let S=Um(x.gl.domElement,d);r.current=S;let O=C.getPosition(new Xm),R=C.getTarget(new Xm),P=C.enabled,T=Ps(x.scene);C.stop(),C.enabled=!1,a(0),y(),i({config:{...N,duration:M,autoPlay:!1},onStarted:()=>S.start(M),onFinished:S.finish});try{return await S.result}finally{T(),C.enabled=P,C.setLookAt(O.x,O.y,O.z,R.x,R.y,R.z,!1),x.invalidate(),r.current=null,i(null)}},[]),p=ks(d=>{let m=Math.floor(d*100);a(h=>h===m?h:m)},[]);return{captureVideo:l,cancelVideo:s,isRecording:c,recording:n,progress:o,onProgress:p}}import{useCallback as ow,useEffect as aw,useRef as sw,useState as qo}from"react";function qm(e){let[t,r]=qo(null),[n,i]=qo(!1),[o,a]=qo(!1),[s,c]=qo(!1),[l,p]=qo(null),d=sw(!1);aw(()=>{if(!t||!e){i(!1),a(!1),p(null);return}let h=t.ownerDocument;i(h.fullscreenEnabled===!0&&typeof t.requestFullscreen=="function"&&typeof h.exitFullscreen=="function");let f=()=>{a(h.fullscreenElement===t),p(null)};return f(),h.addEventListener("fullscreenchange",f),()=>h.removeEventListener("fullscreenchange",f)},[t,e]);let m=ow(async()=>{if(!t||!e||!n||d.current)return;let h=t.ownerDocument,f=h.fullscreenElement===t;d.current=!0,c(!0),p(null);try{f?await h.exitFullscreen():await t.requestFullscreen(),a(h.fullscreenElement===t)}catch{p(f?"Could not exit fullscreen. Press Escape to exit.":"Could not enter fullscreen. Check your browser or iframe fullscreen permissions and try again.")}finally{d.current=!1,c(!1)}},[t,e,n]);return{rootRef:r,supported:n,active:o,pending:s,error:l,toggle:m}}import{useCallback as qc,useEffect as Km,useRef as Ds,useState as Yc}from"react";function Ym(e,{onLost:t,onRestored:r,initiallyLost:n=!1}){let i=n,o=s=>{s.preventDefault(),!i&&(i=!0,t())},a=()=>{i&&(i=!1,r())};return e.addEventListener("webglcontextlost",o),e.addEventListener("webglcontextrestored",a),n&&t(),()=>{e.removeEventListener("webglcontextlost",o),e.removeEventListener("webglcontextrestored",a)}}function Qm(){let[e,t]=Yc(null),[r,n]=Yc(0),[i,o]=Yc("ready"),a=Ds(null),s=Ds(!1),c=Ds(null),l=Ds(null),p=qc(h=>{l.current?.dispose(),l.current=null,c.current=h,t(h)},[]),d=qc(()=>{s.current||(s.current=!0,a.current?.(),a.current=null,c.current&&(l.current=c.current),c.current=null,t(null),o("rebuilding"),n(h=>h+1))},[]),m=qc(()=>{s.current=!1,o("lost")},[]);return Km(()=>()=>{l.current?.dispose(),l.current=null},[]),Km(()=>{if(!e)return;s.current=!1,o("ready");let h=Ym(e.domElement,{initiallyLost:e.getContext().isContextLost(),onLost:m,onRestored:d});return a.current=h,()=>{h(),a.current===h&&(a.current=null)}},[e,m,d]),{generation:r,status:i,reload:d,fail:m,onRendererCreated:p}}import{Component as lw}from"react";var Hi=class extends lw{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(r,n){this.props.onError?.(r)}render(){return this.state.hasError?this.props.fallback??null:this.props.children}};import{useEffect as cw,useMemo as uw,useRef as dw}from"react";function Jm({modelUrl:e,tilesetUrl:t=null,getOptions:r,now:n=()=>performance.now(),timestamp:i=()=>new Date().toISOString(),sessionId:o=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`viewer-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`,log:a=c=>console.info("[react-immersive engagement]",c),warn:s=c=>console.warn("[react-immersive] onEngagement callback failed:",c)}){let c=n(),l=()=>{let w=r();return!!(w.onEngagement||w.debugEngagement)},p=w=>Math.max(0,Math.round(n()-w)),d=w=>{let{onEngagement:A,debugEngagement:k}=r();if(!A&&!k)return;let V={...w,sessionId:o,timestamp:i(),elapsedMs:p(c),modelUrl:e,tilesetUrl:t};k&&a(V);try{Promise.resolve(A?.(V)).catch(s)}catch(F){s(F)}},m=null,h=null,f=null,g=null,y=null,x=w=>{m=w},C=w=>{!l()||m===w.objectKey||(m=w.objectKey,d({type:"part-viewed",...w}))},v=(w,A)=>{let k=JSON.stringify([A,w]);!l()||w===A||k===h||(h=k,d({type:"variant-chosen",variant:w,previousVariant:A}))},N=w=>{w!==f&&(f=w,h=null)},M=()=>{!l()||g!==null||(g=n(),d({type:"ar-started"}))},S=(w="session-ended")=>{if(g===null)return;let A=p(g);g=null,d({type:"ar-ended",durationMs:A,reason:w})},O=(w="stopped")=>{if(!y)return;let{startedAt:A,annotationCount:k}=y;y=null,d({type:"tour-stopped",annotationCount:k,durationMs:p(A),reason:w})};return{setSelectedPart:x,viewPart:C,setMaterialVariant:N,chooseVariant:v,startAR:M,endAR:S,startTour:w=>{!l()||w<=0||(O("restarted"),y={startedAt:n(),annotationCount:w},d({type:"tour-started",annotationCount:w}))},stopTour:O,completeTour:()=>{if(!y)return;let{startedAt:w,annotationCount:A}=y;y=null,d({type:"tour-completed",annotationCount:A,durationMs:p(w)})},interrupt:()=>{S("interrupted"),O("interrupted")},requestARLaunch:w=>d({type:"ar-launch-requested",channel:w})}}function Zm(e){let t=dw(e);t.current=e;let r=!!(e.onEngagement||e.debugEngagement),n=uw(()=>Jm({modelUrl:e.modelUrl,tilesetUrl:e.tilesetUrl,getOptions:()=>t.current}),[e.modelUrl,e.tilesetUrl,r]);return cw(()=>()=>n.interrupt(),[n]),n}var pw={glb:"GLB",gltf:"glTF",obj:"OBJ",fbx:"FBX",usdz:"USDZ"},hw=/\.(glb|gltf|obj|fbx|usdz|zip)$/i;function mw(e,t){let r=e?.response?.status;if(typeof r=="number")return r;let n=/responded with (\d{3})/.exec(t);return n?Number(n[1]):null}function ef(e,t,r){let n=e instanceof Error?e.message:e==null?"":String(e),i="This model couldn't be loaded",o=n||null,a=mw(e,n);if(a===404||a===410)return{title:i,detail:`Nothing was found at this address (${a}). Check that modelUrl points to the file.`,technical:o};if(a===401||a===403)return{title:i,detail:`The server refused access to the file (${a}). Check that the file is public, or that a signed URL hasn't expired.`,technical:o};if(a!==null)return{title:i,detail:`The server responded with ${a} when the file was requested.`,technical:o};if(/failed to fetch|networkerror|load failed|network error/i.test(n))return{title:i,detail:"The download was blocked or failed. Check that the URL is correct and, if the file is on another domain, that its server allows cross-origin requests (CORS) from this site.",technical:o};if(/<!doctype|<html/i.test(n))return{title:i,detail:"The server sent back a web page instead of a model. There's probably no file at this path: many servers answer a missing file with their index.html.",technical:o};let s=t.split(/[?#]/,1)[0],c=pw[r??kh(t)],l=hw.test(s);return{title:i,detail:l||r?`The file couldn't be read as ${c}. Check that it's a valid ${c} file${r?" and that modelFormat matches it":""}.`:`The file couldn't be read as ${c}. The URL has no file extension, so set modelFormat to the file's format.`,technical:o}}import{Color as fw}from"three";function tf(e,t,r){let n=t[r]?.modelObjectId;return e.lighting.lights.filter(i=>{let o=i.attachment?.objectId;return o?Li(t,o)===r||o===n:!1})}function Kc(e,t){return e.lighting.lights.some(r=>t[r.id])?{...e,lighting:{...e.lighting,lights:e.lighting.lights.map(r=>t[r.id]?{...r,...t[r.id]}:r)}}:e}function rf(e){let t=null;if(e?.traverse(i=>{if(t)return;let o=i.material;for(let a of Array.isArray(o)?o:o?[o]:[])if(a.emissive instanceof fw){t=a;return}}),!t)return{color:"#000000",intensity:0,on:!1};let r=`#${t.emissive.getHexString()}`,n=t.emissiveIntensity??1;return{color:r,intensity:n,on:r!=="#000000"&&n>0}}import{HexColorPicker as gw}from"react-colorful";import{Fragment as nf,jsx as xn,jsxs as Yo}from"react/jsx-runtime";function of({kind:e,color:t,brightness:r,onColorChange:n,onBrightnessChange:i,onClose:o}){return xn("div",{className:"ri-popover ri-popover--inline",style:{padding:12},onPointerDown:a=>a.stopPropagation(),children:e==="change-light-color"?Yo(nf,{children:[xn("p",{className:"ri-popoverLabel",children:"Light color"}),xn(gw,{color:t,onChange:n}),Yo("div",{className:"ri-inlineRow",children:[xn("span",{className:"ri-colorCode",children:t}),xn("button",{className:"ri-secondaryButton",onClick:o,children:"Done"})]})]}):Yo(nf,{children:[xn("p",{className:"ri-popoverLabel",children:"Brightness"}),xn("input",{type:"range",min:0,max:200,step:1,value:r,"aria-label":"Brightness",style:{width:"100%"},onChange:a=>i(Number(a.target.value))}),Yo("div",{className:"ri-inlineRow",children:[Yo("span",{className:"ri-colorCode",children:[r,"%"]}),xn("button",{className:"ri-secondaryButton",onClick:o,children:"Done"})]})]})})}import{useRef as Mw,useState as cf}from"react";import{ArrowDown as bw,ArrowLeft as yw,ArrowRight as vw,ArrowUp as xw}from"lucide-react";import{useEffect as ww,useRef as Qc}from"react";function af(e){let t=!1,r,n=()=>{t||(e(),t||(r=setTimeout(n,70)))};return e(),r=setTimeout(n,300),()=>{t=!0,clearTimeout(r)}}import{jsx as Ko,jsxs as sf}from"react/jsx-runtime";function lf({onNudge:e}){let t=Qc(e);t.current=e;let r=Qc(null),n=Qc(null),i=()=>{r.current?.(),r.current=null,n.current=null};return ww(()=>{let o=s=>{s.pointerId===n.current&&i()},a=s=>{s.key==="Escape"&&i()};return window.addEventListener("pointerup",o,!0),window.addEventListener("pointercancel",o,!0),window.addEventListener("blur",i),window.addEventListener("keydown",a),()=>{i(),window.removeEventListener("pointerup",o,!0),window.removeEventListener("pointercancel",o,!0),window.removeEventListener("blur",i),window.removeEventListener("keydown",a)}},[]),sf("div",{className:"ri-decalPosition",children:[sf("div",{children:[Ko("div",{className:"ri-decalPosition__label",children:"Position"}),Ko("div",{className:"ri-decalPosition__hint",children:"Click to fine-tune \xB7 Hold to move"})]}),Ko("div",{className:"ri-decalPosition__pad",role:"group","aria-label":"Move decal in small steps",children:[["up",xw],["left",yw],["right",vw],["down",bw]].map(([o,a])=>Ko("button",{type:"button",className:`ri-decalPosition__button ri-decalPosition__button--${o}`,"aria-label":`Move decal ${o}`,title:`Move ${o} on the visible surface`,onPointerDown:s=>{s.button===0&&(s.preventDefault(),s.currentTarget.focus({preventScroll:!0}),i(),n.current=s.pointerId,r.current=af(()=>t.current(o)))},onClick:s=>{s.detail===0&&t.current(o)},children:Ko(a,{size:16})},o))})]})}import{Fragment as uf,jsx as nt,jsxs as Lr}from"react/jsx-runtime";var Sw=e=>Math.round(e*180/Math.PI);function df({kind:e,decals:t,activeId:r,error:n,moving:i,defaultSize:o,onSelect:a,onAddText:s,onAddImage:c,onChange:l,onMove:p,onNudge:d,onRemove:m,onClose:h}){let[f,g]=cf(""),[y,x]=cf("#ffffff"),C=Mw(null),v=t.find(M=>M.id===r)??null;return Lr("div",{className:"ri-popover ri-popover--inline ri-decalControl",onPointerDown:M=>M.stopPropagation(),children:[e==="add-text"?Lr(uf,{children:[nt("p",{className:"ri-popoverLabel",children:"Text"}),Lr("div",{className:"ri-decalControl__row",children:[nt("input",{className:"ri-decalControl__input",value:f,placeholder:"Your text","aria-label":"Text to add",onChange:M=>g(M.target.value)}),nt("input",{type:"color",className:"ri-decalControl__color",value:y,"aria-label":"Text colour",onChange:M=>x(M.target.value)})]}),nt("button",{type:"button",className:"ri-uploadButton",disabled:!f.trim(),onClick:()=>{s(f.trim(),y)&&g("")},children:"Add text"})]}):Lr(uf,{children:[nt("p",{className:"ri-popoverLabel",children:"Image"}),nt("button",{type:"button",className:"ri-uploadButton",onClick:()=>C.current?.click(),children:"Choose image"}),nt("input",{ref:C,type:"file",accept:"image/png,image/jpeg,image/webp,image/svg+xml",className:"ri-hiddenInput","aria-label":"Image to add",onChange:M=>{let S=M.target.files?.[0];M.target.value="",S&&c(S)}})]}),n?nt("div",{className:"ri-decalControl__hint",role:"alert",children:n}):null,t.length>0?nt("div",{className:"ri-decalControl__list",role:"group","aria-label":"Added",children:t.map((M,S)=>nt("button",{type:"button",className:`ri-decalControl__chip ${M.id===r?"ri-decalControl__chip--active":""}`,"aria-pressed":M.id===r,onClick:()=>a(M.id),children:M.image?`Image ${S+1}`:M.text||`Text ${S+1}`},M.id))}):null,v?Lr("div",{className:"ri-decalControl__editor",children:[nt(lf,{onNudge:M=>d(v.id,M)}),v.image?null:Lr("div",{className:"ri-decalControl__row",children:[nt("input",{className:"ri-decalControl__input",value:v.text??"","aria-label":"Text",onChange:M=>l(v.id,{text:M.target.value})}),nt("input",{type:"color",className:"ri-decalControl__color",value:v.color??"#ffffff","aria-label":"Colour",onChange:M=>l(v.id,{color:M.target.value})})]}),Lr("label",{className:"ri-decalControl__slider",children:[nt("span",{children:"Size"}),nt("input",{type:"range",min:o/10,max:o*4,step:o/50,value:v.size,"aria-label":"Size",onChange:M=>l(v.id,{size:Number(M.target.value)})})]}),Lr("label",{className:"ri-decalControl__slider",children:[nt("span",{children:"Turn"}),nt("input",{type:"range",min:-180,max:180,step:1,value:Sw(v.rotation??0),"aria-label":"Rotation",onChange:M=>l(v.id,{rotation:Number(M.target.value)*Math.PI/180})})]}),Lr("div",{className:"ri-inlineRow",children:[nt("button",{type:"button",className:"ri-secondaryButton","aria-pressed":i,title:"Drag the decal across the object's surface",onClick:()=>p(v.id),children:"Move"}),nt("button",{type:"button",className:"ri-removeButton",onClick:()=>m(v.id),children:"Remove"})]})]}):null,Lr("div",{className:"ri-inlineRow",children:[nt("span",{className:"ri-colorCode",children:t.length===0?"None added yet":`${t.length} added`}),nt("button",{type:"button",className:"ri-secondaryButton",onClick:h,children:"Done"})]})]})}import{useEffect as Uw,useRef as Gw}from"react";import{useThree as Hw}from"@react-three/fiber";import{Mesh as Ww,Raycaster as Xw,Vector2 as ru,Vector3 as wf}from"three";import{BufferGeometry as Cw,CanvasTexture as Tw,Float32BufferAttribute as Ls,Matrix4 as _w,Object3D as Pw,SRGBColorSpace as Ew,Uint16BufferAttribute as Aw,Vector3 as Kr}from"three";var Rw=.5,Qo=4;function kw(e,t=0){let r=new Kr(...e);r.lengthSq()<1e-12&&r.set(0,0,1),r.normalize();let n=new Pw;return Math.abs(r.y)>.999&&n.up.set(0,0,-Math.sign(r.y)),n.lookAt(r),n.rotateZ(t),n.rotation.clone()}function Dw(e,t,r){let n=null;if(e.bones&&t.bones){n=new Map;for(let[i,o]of e.bones)n.set(i,o*(1-r));for(let[i,o]of t.bones)n.set(i,(n.get(i)??0)+o*r)}return{position:e.position.clone().lerp(t.position,r),normal:e.normal.clone().lerp(t.normal,r),bones:n}}function pf(e,t,r,n){let i=a=>n?a.position[t]<=r:a.position[t]>=r,o=[];for(let a=0;a<e.length;a++){let s=e[a],c=e[(a+1)%e.length],l=i(s);if(l&&o.push(s),l!==i(c)){let p=c.position[t]-s.position[t];o.push(Dw(s,c,(r-s.position[t])/p))}}return o}function Os(e,t,r){let n=e.geometry,i=n.getAttribute("position");if(!i)return null;let o=n.getAttribute("normal"),a=n.getAttribute("skinIndex"),s=n.getAttribute("skinWeight"),c=!!(a&&s),l=n.getIndex(),p=Math.max(t.size,1e-6),d=p/(r>0&&Number.isFinite(r)?r:1),m=Math.max(p,d)*Rw,h={x:p/2,y:d/2,z:m/2},f=new _w().makeRotationFromEuler(kw(t.normal,t.rotation)).setPosition(...t.position),g=f.clone().invert(),y=(F,z)=>{let H=null;if(c){H=new Map;for(let E=0;E<Qo;E++){let G=s.getComponent(F,E);if(G<=0)continue;let K=a.getComponent(F,E);H.set(K,(H.get(K)??0)+G)}}return{position:z.clone(),normal:o?new Kr().fromBufferAttribute(o,F):new Kr,bones:H}},x=[],C=[],v=[],N=[],M=[],S=new Kr,O=new Kr,R=new Kr,P=F=>{if(v.push(.5+F.position.x/p,.5-F.position.y/d),S.copy(F.position).applyMatrix4(f),x.push(S.x,S.y,S.z),C.push(F.normal.x,F.normal.y,F.normal.z),!F.bones)return;let z=[...F.bones].sort((E,G)=>G[1]-E[1]).slice(0,Qo),H=z.reduce((E,[,G])=>E+G,0)||1;for(let E=0;E<Qo;E++)N.push(z[E]?.[0]??0),M.push((z[E]?.[1]??0)/H)},T=["x","y","z"],w=[new Kr,new Kr,new Kr],A=[0,0,0],k=(l?l.count:i.count)/3;for(let F=0;F<k;F++){for(let E=0;E<3;E++){let G=F*3+E;A[E]=l?l.getX(G):G,w[E].fromBufferAttribute(i,A[E]).applyMatrix4(g)}if(T.some(E=>w[0][E]>h[E]&&w[1][E]>h[E]&&w[2][E]>h[E]||w[0][E]<-h[E]&&w[1][E]<-h[E]&&w[2][E]<-h[E]))continue;let z=w.map((E,G)=>y(A[G],E));if(!o){O.copy(z[1].position).sub(z[0].position),R.copy(z[2].position).sub(z[0].position);let E=O.cross(R).transformDirection(f);for(let G of z)G.normal.copy(E)}let H=z;for(let E of T)if(H=pf(H,E,h[E],!0),H=pf(H,E,-h[E],!1),H.length<3)break;for(let E=1;E+1<H.length;E++)P(H[0]),P(H[E]),P(H[E+1])}if(x.length===0)return null;let V=new Cw;return V.setAttribute("position",new Ls(x,3)),V.setAttribute("normal",new Ls(C,3)),V.setAttribute("uv",new Ls(v,2)),c&&(V.setAttribute("skinIndex",new Aw(N,Qo)),V.setAttribute("skinWeight",new Ls(M,Qo))),V}function mf(e){return JSON.stringify([e.image??null,e.image?null:[e.text??"",e.color,e.fontFamily,e.fontWeight],e.position,e.normal,e.size,e.rotation??0])}var hf=256,Jc=24;function ff(e){let t=`${e.fontWeight??"bold"} ${hf-Jc*2}px ${e.fontFamily||"sans-serif"}`,r=document.createElement("canvas"),n=r.getContext("2d");n.font=t;let i=e.text||" ";r.width=Math.min(Math.max(Math.ceil(n.measureText(i).width)+Jc*2,8),4096),r.height=hf,n.font=t,n.textAlign="center",n.textBaseline="middle",n.fillStyle=e.color??"#ffffff",n.fillText(i,r.width/2,r.height/2,r.width-Jc);let o=new Tw(r);return o.flipY=!1,o.colorSpace=Ew,{texture:o,aspect:r.width/r.height}}import{useEffect as gf,useRef as Lw}from"react";import{BufferGeometry as Ow,Float32BufferAttribute as Iw,Mesh as Bw,MeshStandardMaterial as zw,SkinnedMesh as Nw,SRGBColorSpace as yf}from"three";var qn="riDecal",tu="riDecalId";function Zc(){return new Ow().setAttribute("position",new Iw([],3))}function bf(e){let t=e.image;return t?.width&&t.height?t.width/t.height:1}function eu(e){e.disposed=!0,e.node.remove(e.mesh),e.mesh.geometry.dispose(),e.mesh.material.dispose(),e.imagePath&&Xr(e.imagePath,yf),e.ownTexture?.dispose()}function jw(e,t,r,n){let i=new zw({transparent:!0,polygonOffset:!0,polygonOffsetFactor:-4,depthWrite:!1,metalness:0,roughness:.7}),o=wr(e)&&e.skeleton?e:null,a=o?new Nw(Zc(),i):new Bw(Zc(),i);if(o){let l=a;l.bind(o.skeleton,o.bindMatrix),l.frustumCulled=!1,l.onBeforeRender=()=>{let p=Mm(o);p&&l.bindMatrixInverse.copy(p)}}a.userData[qn]=!0,a.userData[tu]=t.id,a.raycast=()=>{},a.castShadow=!1,a.receiveShadow=!0,a.renderOrder=1;let s={node:e,mesh:a,signature:r,disposed:!1},c=l=>{let p=Os(e,t,l);a.geometry.dispose(),a.geometry=p??Zc(),a.visible=p!==null};if(t.image){s.imagePath=t.image;let l=ji(t.image,yf,()=>{s.disposed||(c(bf(l)),i.needsUpdate=!0,n())});i.map=l,c(bf(l))}else{let{texture:l,aspect:p}=ff(t);s.ownTexture=l,i.map=l,c(p)}return e.add(a),s}function vf({objectBindings:e,nodeMap:t,invalidate:r}){let n=Lw(new Map);gf(()=>{let i=n.current,o=new Set;for(let[a,s]of Object.entries(e)){if(!s.decals?.length)continue;let c=t[s.modelObjectId??a];if(_t(c))for(let l of s.decals){if(!l.image&&!l.text)continue;let p=`${a}
2
+ ${l.id}`,d=mf(l),m=i.get(p);m&&(m.node!==c||m.signature!==d)&&(eu(m),m=void 0),m||(m=jw(c,l,d,r),i.set(p,m)),m.mesh.material.opacity=(l.opacity??1)*(s.style?.material?.opacity??1),o.add(p)}}for(let[a,s]of i)o.has(a)||(eu(s),i.delete(a));r()},[e,t,r]),gf(()=>{let i=n.current;return()=>{for(let o of i.values())eu(o);i.clear()}},[])}import{Mesh as Vw,SkinnedMesh as Fw}from"three";function xf(e,t){let r=[];if(wr(e)){let n=e;n.computeBoundingSphere(),n.computeBoundingBox(),Fw.prototype.raycast.call(n,t,r)}else Vw.prototype.raycast.call(e,t,r);return r.sort((n,i)=>n.distance-i.distance)[0]}function Mf({target:e,nodes:t,controls:r}){let{camera:n,gl:i,invalidate:o}=Hw(),a=Gw(e);return a.current=e,Uw(()=>{let s=i.domElement,c=new Xw,l=new ru,p=s.style.cursor,d=s.style.touchAction;s.style.cursor="grab",s.style.touchAction="none";let m=0,h=null,f=null,g=(O,R=new ru)=>{let P=s.getBoundingClientRect();l.set((O.clientX-P.left-R.x)/P.width*2-1,-((O.clientY-P.top-R.y)/P.height)*2+1),c.setFromCamera(l,n)},y=O=>{if(!f)return;g(O,f.offset),f.node.updateWorldMatrix(!0,!1);let R=c.intersectObject(f.node,!1)[0];if(!R)return;let P=Xn({...R,ray:c.ray},f.node),T=Os(f.node,{...f.decal,...P},f.aspect);T&&(f.mesh.geometry!==f.geometry&&f.mesh.geometry.dispose(),f.mesh.geometry=T,f.surface=P,o())},x=O=>{if(!f)return;cancelAnimationFrame(m),m=0,h=null;let R=f;f=null,R.mesh.geometry!==R.geometry&&(O&&R.surface?R.geometry.dispose():(R.mesh.geometry.dispose(),R.mesh.geometry=R.geometry)),R.controller&&(R.controller.enabled=R.controlsEnabled),s.hasPointerCapture(R.pointerId)&&s.releasePointerCapture(R.pointerId),s.style.cursor="grab",o();let P=()=>{window.removeEventListener("click",T,!0),window.removeEventListener("pointerdown",P,!0),clearTimeout(w)},T=A=>{A.target===s&&(A.preventDefault(),A.stopImmediatePropagation()),P()},w=setTimeout(P,300);window.addEventListener("click",T,!0),window.addEventListener("pointerdown",P,!0),O&&R.surface&&a.current.onCommit(R.surface)},C=O=>{if(O.button!==0||f)return;let R=a.current,P=t.current[R.objectId];if(!(P instanceof Ww)||!P.visible)return;let T=P.children.find(E=>E.userData[qn]&&E.userData[tu]===R.decal.id);if(!T?.visible)return;P.updateWorldMatrix(!0,!0),g(O);let w=xf(T,c),A=c.intersectObject(P,!1)[0];if(!w||!A||w.distance>A.distance+1e-4)return;let k=new wf;if(wr(T)){let E=new wf,G=T.geometry.getAttribute("position").count;if(!G)return;for(let K=0;K<G;K++)k.add(T.getVertexPosition(K,E));k.divideScalar(G).applyMatrix4(T.matrixWorld)}else k.fromArray(R.decal.position).applyMatrix4(P.matrixWorld);k.project(n);let V=s.getBoundingClientRect(),F=new ru(O.clientX-(V.left+(k.x+1)/2*V.width),O.clientY-(V.top+(1-k.y)/2*V.height)),z=T.material.map?.image,H=r.current;f={pointerId:O.pointerId,node:P,mesh:T,geometry:T.geometry,decal:R.decal,surface:null,offset:F,aspect:z?.width&&z.height?z.width/z.height:1,controller:H,controlsEnabled:H?.enabled??!1},H&&(H.enabled=!1),O.preventDefault(),O.stopImmediatePropagation(),s.setPointerCapture(O.pointerId),s.style.cursor="grabbing"},v=O=>{!f||O.pointerId!==f.pointerId||(O.preventDefault(),O.stopImmediatePropagation(),h=O,m||(m=requestAnimationFrame(()=>{m=0,h&&y(h)})))},N=O=>{!f||O.pointerId!==f.pointerId||(O.preventDefault(),O.stopImmediatePropagation(),h&&y(h),x(!0))},M=()=>x(!1),S=O=>{O.key==="Escape"&&(x(!1),a.current.onCancel())};return s.addEventListener("pointerdown",C,!0),window.addEventListener("pointermove",v,{capture:!0,passive:!1}),window.addEventListener("pointerup",N,!0),window.addEventListener("pointercancel",M),window.addEventListener("blur",M),window.addEventListener("keydown",S),s.addEventListener("lostpointercapture",M),()=>{x(!1),s.style.cursor=p,s.style.touchAction=d,s.removeEventListener("pointerdown",C,!0),window.removeEventListener("pointermove",v,!0),window.removeEventListener("pointerup",N,!0),window.removeEventListener("pointercancel",M),window.removeEventListener("blur",M),window.removeEventListener("keydown",S),s.removeEventListener("lostpointercapture",M)}},[n,i,o,t,r,e.objectId,e.decal]),null}import{useCallback as ea,useEffect as n1,useState as ta}from"react";import{GLTFExporter as $w}from"three-stdlib";function Jo(e,t){let r=URL.createObjectURL(e),n=document.createElement("a");n.href=r,n.download=t,n.style.display="none";try{document.body.appendChild(n),n.click()}finally{n.remove(),window.setTimeout(()=>{URL.revokeObjectURL(r)},1e3)}}function Sf({scene:e,objectBindings:t,matRefs:r,downloadFilename:n,onComplete:i}){import("three").then(({Group:o,Mesh:a})=>{let s=new o,c=new Map;for(let[d,m]of Object.entries(t))c.set(m.modelObjectId??d,d);let l=d=>{let m=d;for(;m;){let h=m.name||m.uuid,f=c.get(h)??h,g=t[f];if(g?g.visible===!1:m.visible===!1)return!1;m=m.parent}return!0};e.traverse(d=>{let m=d;if(!m.isMesh||!m.geometry||!l(m))return;let h=m.name||m.uuid,f=c.get(h)??h,g=r[f]??m.material;if(!g)return;let y=new a(m.geometry,g);y.name=h,y.applyMatrix4(m.matrixWorld),s.add(y)}),new $w().parse(s,d=>{let m=d instanceof ArrayBuffer?new Blob([d],{type:"model/gltf-binary"}):new Blob([JSON.stringify(d)],{type:"model/gltf+json"}),h=d instanceof ArrayBuffer?".glb":".gltf";Jo(m,`${n}${h}`),i()},d=>{console.error("GLTFExporter error:",d),i()},{binary:!0})})}import{strToU8 as Yw}from"fflate";import{zip as qw}from"fflate";function Cf(e,t=6){return new Promise((r,n)=>{qw(e,{level:t},(i,o)=>{i?n(i):r(o)})})}var Zo=2048,Tf=["#00e5ff","#ff4fd8","#ffe45e","#7cff6b","#ff784f","#a78bfa","#38bdf8","#fb7185"];function _f(e){return e.split("&").join("&amp;").split("<").join("&lt;").split(">").join("&gt;").split('"').join("&quot;").split("'").join("&apos;")}function ou(e,t){return e.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||t}function Ef(e){return ou(e,"model")}function nu(e,t){return e.index?Math.round(e.index.getX(t)):t}function Kw(e,t,r){let n=nu(e,r),i=nu(e,r+1),o=nu(e,r+2);if(n>=t.count||i>=t.count||o>=t.count)return null;let a=[{index:n,u:t.getX(n),v:t.getY(n)},{index:i,u:t.getX(i),v:t.getY(i)},{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 Pf(e){return`${e.u.toFixed(6)},${e.v.toFixed(6)}`}function iu(e,t,r,n){let i,o;n?(i=t.index,o=r.index):(i=Pf(t),o=Pf(r));let a=i<o?`${i}|${o}`:`${o}|${i}`,s=e.get(a);s?s.count+=1:e.set(a,{count:1,start:t,end:r})}function Qw(e,t,r){iu(e,t[0],t[1],r),iu(e,t[1],t[2],r),iu(e,t[2],t[0],r)}function Jw(e,t){return Array.isArray(e)?e[t]??null:e}function Zw(e){let t=new Map,r=0,n=0,i=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;r+=1;let l=a.name||`Mesh ${r}`,p=s.index?.count??c.count,d=s.groups.length>0?s.groups:[{start:0,count:p,materialIndex:0}];for(let m of d){let h=m.materialIndex??0,f=Jw(a.material,h);if(!f)continue;let g=t.get(f.uuid);g||(n+=1,g={name:f.name||`Material ${n}`,layers:new Map},t.set(f.uuid,g));let y=g.layers.get(a.uuid);y||(y={name:l,color:Tf[i%Tf.length],edges:new Map},i+=1,g.layers.set(a.uuid,y));let x=Math.max(0,m.start),C=Math.min(p,x+m.count);for(let v=x;v+2<C;v+=3){let N=Kw(s,c,v);N&&Qw(y.edges,N,!!s.index)}}}),[...t.values()].filter(o=>[...o.layers.values()].some(a=>a.edges.size>0))}function Is(e){return(e*Zo).toFixed(2)}function e1(e){return`M${Is(e.start.u)} ${Is(1-e.start.v)}L${Is(e.end.u)} ${Is(1-e.end.v)}`}function t1(e){let t=_f(e.name),r=[...e.layers.values()].filter(n=>n.edges.size>0).map((n,i)=>{let o=_f(n.name),a=`${ou(n.name,"mesh")}-${i+1}`,s=[...n.edges.values()],c=s.filter(d=>d.count===1),p=(c.length>0?c:s).map(e1).join("");return[` <g id="${a}" data-mesh="${o}" fill="none" stroke="${n.color}"`,' stroke-width="1" stroke-linejoin="round" vector-effect="non-scaling-stroke">',` <title>${o}</title>`,` <path d="${p}"/>`," </g>"].join(`
3
+ `)}).join(`
4
+ `);return['<?xml version="1.0" encoding="UTF-8"?>',`<svg xmlns="http://www.w3.org/2000/svg" width="${Zo}" height="${Zo}" viewBox="0 0 ${Zo} ${Zo}">`,` <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"/>',r,"</svg>"].join(`
5
+ `)}function r1(e,t="model"){let r=Zw(e),n=Ef(t);return r.map((i,o)=>{let a=ou(i.name,`material-${o+1}`);return{filename:r.length===1?`${n}-uv-layout.svg`:`${n}-uv-${a}-${o+1}.svg`,materialName:i.name,meshCount:[...i.layers.values()].filter(c=>c.edges.size>0).length,svg:t1(i)}})}async function Af(e,t="model"){let r=r1(e,t);if(r.length===0)return r;if(r.length===1)return Jo(new Blob([r[0].svg],{type:"image/svg+xml;charset=utf-8"}),r[0].filename),r;let n=Object.fromEntries(r.map(o=>[o.filename,Yw(o.svg)])),i=await Cf(n);return Jo(new Blob([i],{type:"application/zip"}),`${Ef(t)}-uv-layouts.zip`),r}function Rf({sceneRef:e,materialRefs:t,rendererCaptureRef:r,objectBindings:n,downloadFilename:i,captureVideo:o}){let[a,s]=ta(!1),[c,l]=ta(!1),[p,d]=ta(null),[m,h]=ta(null),[f,g]=ta("auto");n1(()=>{if(!c)return;let M=()=>l(!1);return window.addEventListener("pointerdown",M),()=>window.removeEventListener("pointerdown",M)},[c]);let y=ea(()=>{d(null),h(null),l(M=>!M)},[]),x=ea(()=>{let M=e.current;M&&(l(!1),s(!0),Sf({scene:M,objectBindings:n,matRefs:t.current,downloadFilename:i,onComplete:()=>s(!1)}))},[i,t,n,e]),C=ea(()=>{l(!1),Es(r.current).then(M=>{let S=document.createElement("a");S.href=M,S.download=`${i}.png`,document.body.appendChild(S),S.click(),document.body.removeChild(S)}).catch(M=>{console.error("Screenshot failed:",M)})},[i,r]),v=ea(async()=>{let M=e.current;if(M)try{if((await Af(M,i)).length===0){d("This model does not contain UV coordinates.");return}d(null),l(!1)}catch(S){console.error("UV layout export failed:",S),d("Could not create the UV layout archive.")}},[i,e]),N=ea(async M=>{l(!1),h(null);try{let S=await o({mode:M,format:f}),O=S.type.startsWith("video/mp4")?"mp4":"webm",R=URL.createObjectURL(S),P=document.createElement("a");P.href=R,P.download=`${i}-${M}.${O}`,document.body.appendChild(P);try{P.click()}finally{P.remove(),setTimeout(()=>URL.revokeObjectURL(R),1e3)}}catch(S){if(S instanceof DOMException&&S.name==="AbortError")return;h(S instanceof Error?S.message:"Could not export the video."),l(!0)}},[o,i,f]);return{isDownloading:a,downloadMenuOpen:c,uvExportError:p,toggleDownloadMenu:y,handleDownloadMesh:x,handleDownloadScreenshot:C,handleDownloadUvLayout:v,handleDownloadVideo:N,videoFormat:f,setVideoFormat:g,videoExportError:m}}import{useCallback as ir,useEffect as ra,useRef as js,useReducer as l1,useState as Wi}from"react";import{Box3 as Nf,Raycaster as c1,Vector2 as zf,Vector3 as au}from"three";import{Matrix4 as i1,Mesh as kf,ShapeUtils as o1,Vector2 as Df,Vector3 as Mr,Vector4 as a1}from"three";function Bs(e){if(e.length!==3)return null;let t=new Mr(...e[0]).sub(new Mr(...e[1])),r=new Mr(...e[2]).sub(new Mr(...e[1]));return t.lengthSq()===0||r.lengthSq()===0?null:Math.acos(Math.max(-1,Math.min(1,t.normalize().dot(r.normalize()))))*180/Math.PI}function Lf(e,t){if(!e.normal)return null;let r=new Mr(...e.normal);if(r.lengthSq()===0)return null;r.normalize();let n=new Mr(...t),i=n.clone().sub(new Mr(...e.position)).dot(r);return{distance:Math.abs(i),projection:n.addScaledVector(r,-i).toArray()}}function zs(e){if(e.length<3)return{error:"Pick at least three points to finish the area."};let t=new Mr(...e[0]),r=e.map(y=>new Mr(...y).sub(t)),n=Math.max(...r.map(y=>y.length()));if(n===0)return{error:"Area points must be distinct."};let i=new Mr;for(let y=1;y<r.length-1;y+=1){let x=r[y].clone().cross(r[y+1]);x.lengthSq()>i.lengthSq()&&i.copy(x)}if(i.length()<=n*n*1e-10)return{error:"Area points must not lie on one straight line."};i.normalize();let o=Math.max(n*1e-5,Number.EPSILON*Math.max(...e.flat().map(Math.abs))*32);if(r.some(y=>Math.abs(y.dot(i))>o))return{error:"Area points must lie on one plane."};let a=r.find(y=>y.length()>n*1e-10).clone().normalize(),s=i.clone().cross(a).normalize(),c=r.map(y=>new Df(y.dot(a),y.dot(s))),l=(y,x,C)=>(x.x-y.x)*(C.y-y.y)-(x.y-y.y)*(C.x-y.x),p=n*n*1e-10,d=(y,x,C)=>Math.abs(l(y,x,C))<=p&&C.x>=Math.min(y.x,x.x)-n*1e-10&&C.x<=Math.max(y.x,x.x)+n*1e-10&&C.y>=Math.min(y.y,x.y)-n*1e-10&&C.y<=Math.max(y.y,x.y)+n*1e-10;for(let y=0;y<c.length;y+=1){let x=c[y],C=c[(y+1)%c.length];if(x.distanceTo(C)<=n*1e-10)return{error:"Area points must be distinct."};for(let v=y+1;v<c.length;v+=1){if(v===y+1||y===0&&v===c.length-1)continue;let N=c[v],M=c[(v+1)%c.length],S=l(x,C,N),O=l(x,C,M),R=l(N,M,x),P=l(N,M,C);if(S*O<0&&R*P<0||d(x,C,N)||d(x,C,M)||d(N,M,x)||d(N,M,C))return{error:"Area edges must not cross or touch each other."}}}let m=0,h=0,f=0;for(let y=0;y<c.length;y+=1){let x=c[y],C=c[(y+1)%c.length],v=x.x*C.y-C.x*x.y;m+=v,h+=(x.x+C.x)*v,f+=(x.y+C.y)*v}if(Math.abs(m)<=p)return{error:"The polygon has no measurable area."};let g=t.clone().addScaledVector(a,h/(3*m)).addScaledVector(s,f/(3*m));return{area:Math.abs(m)/2,center:g.toArray(),triangles:o1.triangulateShape(c,[])}}function s1(e){if(!(e.object instanceof kf)||!e.face)return null;let t=e.object,r=t.matrixWorld.clone();if(e.instanceId!==void 0&&"getMatrixAt"in t){let n=new i1;t.getMatrixAt(e.instanceId,n),r.multiply(n)}return[e.face.a,e.face.b,e.face.c].map(n=>t.getVertexPosition(n,new Mr).applyMatrix4(r))}function Of(e){if(!(e.object instanceof kf))return!1;for(let r=e.object;r;r=r.parent)if(!r.visible||r.userData.riEditorGizmo||r.userData.riDecal)return!1;return(Array.isArray(e.object.material)?e.object.material:[e.object.material])[e.face?.materialIndex??0]?.visible!==!1}function If(e,t,r,n,i,o=12){let a=s1(e),s=a?a[1].clone().sub(a[0]).cross(a[2].clone().sub(a[0])).normalize():null,c={position:e.point.toArray(),...s&&s.lengthSq()>0?{normal:s.toArray()}:{},...a?{faceVertices:a.map(m=>m.toArray())}:{}};if(!a||i==="none")return c;let l=m=>{let h=new a1(m.x,m.y,m.z,1).applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix);return h.w<=0||h.z/h.w<-1||h.z/h.w>1?null:{screen:new Df((h.x/h.w+1)*n.width/2,(1-h.y/h.w)*n.height/2),w:h.w}},p=a.map(l),d=o;if((i==="vertex"||i==="auto")&&(p.forEach((m,h)=>{let f=m?.screen.distanceTo(r)??1/0;f<=d&&(d=f,c.position=a[h].toArray(),c.snapped="vertex")}),c.snapped))return c;if(i==="edge"||i==="auto")for(let m=0;m<3;m+=1){let h=(m+1)%3,f=p[m],g=p[h];if(!f||!g)continue;let y=g.screen.clone().sub(f.screen);if(y.lengthSq()===0)continue;let x=Math.max(0,Math.min(1,r.clone().sub(f.screen).dot(y)/y.lengthSq())),C=f.screen.clone().addScaledVector(y,x).distanceTo(r);if(C<=d){d=C;let v=x*f.w/((1-x)*g.w+x*f.w);c.position=a[m].clone().lerp(a[h],v).toArray(),c.snapped="edge"}}return c}var Ns={tool:"distance",points:[],areaClosed:!1,error:null};function Bf(e,t){if(t.type==="tool")return{...Ns,tool:t.tool};if(t.type==="clear")return{...Ns,tool:e.tool};if(t.type==="undo")return{...e,points:e.points.slice(0,-1),areaClosed:!1,error:null};if(t.type==="finishArea"){if(e.tool!=="area")return e;let o=zs(e.points.map(a=>a.position));return"error"in o?{...e,error:o.error}:{...e,areaClosed:!0,error:null}}if(t.type!=="place")return e;let n=e.areaClosed||e.tool==="angle"&&e.points.length===3||e.tool==="pointToPlane"&&e.points.length===2?[]:e.points;if(e.tool==="pointToPlane"&&n.length===0&&!t.point.normal)return{...e,error:"Pick a triangle face to define the reference plane."};if(n.length>=256)return{...e,error:"Finish or clear this measurement before adding more points."};let i=[...n,t.point];return e.tool==="angle"&&i.length===3&&Bs(i.map(o=>o.position))===null?{...e,error:"Pick a point away from the angle's vertex."}:{...e,points:i,areaClosed:!1,error:null}}function u1(e){let t=new Nf().setFromObject(e),r=new au;return t.getSize(r),{min:[t.min.x,t.min.y,t.min.z],max:[t.max.x,t.max.y,t.max.z],size:[r.x,r.y,r.z]}}function d1(e){let t=new Nf().setFromObject(e);if(t.isEmpty())return null;let r=t.getCenter(new au),n=t.getSize(new au).length()/2;return!Number.isFinite(n)||n<=0?null:{center:[r.x,r.y,r.z],radius:n}}function jf({canvasAreaRef:e,controlsRef:t,sceneRef:r,modelUrl:n,modelRotation:i,bindingTransformSignature:o,modelLoaded:a,enabled:s}){let[c,l]=Wi(!1),[p,d]=l1(Bf,Ns),[m,h]=Wi("none"),[f,g]=Wi(null),[y,x]=Wi(!1),[C,v]=Wi(null),[N,M]=Wi(null),S=js(!1),O=js(0),R=js(null),P=js(null);S.current=c&&s;let T=ir(Z=>{Z.updateMatrixWorld(!0),v(u1(Z)),M(d1(Z))},[]),w=ir(()=>{d({type:"clear"}),g(null)},[]),A=ir(Z=>{d({type:"tool",tool:Z}),g(null)},[]),k=ir(()=>d({type:"undo"}),[]),V=ir(()=>d({type:"finishArea"}),[]),F=ir(()=>l(Z=>!Z),[]),z=ir(()=>x(Z=>!Z),[]),H=ir(Z=>{!S.current||Z.button!==0||(R.current={x:Z.clientX,y:Z.clientY})},[]),E=ir((Z,Te)=>{let Ne=e.current,pe=t.current?.camera,Ue=r.current;if(!Ne||!pe||!Ue)return null;let Ee=Ne.getBoundingClientRect();if(!Ee.width||!Ee.height)return null;Ue.updateMatrixWorld(!0),pe.updateMatrixWorld(!0);let Ke=new zf(Z-Ee.left,Te-Ee.top),dt=new c1;dt.setFromCamera(new zf(Ke.x/Ee.width*2-1,1-Ke.y/Ee.height*2),pe);let fe=dt.intersectObject(Ue,!0).find(Of);return fe?If(fe,pe,Ke,Ee,m):null},[e,t,r,m]),G=ir(()=>{P.current!==null&&cancelAnimationFrame(P.current),P.current=null,g(null)},[]),K=ir(Z=>{if(!S.current||m==="none"||Z.buttons!==0||Z.target.closest("button, input, select, label, textarea, .ri-measureTools")){G();return}P.current!==null&&cancelAnimationFrame(P.current);let{clientX:Te,clientY:Ne}=Z;P.current=requestAnimationFrame(()=>{P.current=null;let pe=E(Te,Ne);g(pe?.snapped?pe:null)})},[G,E,m]),Ce=ir(Z=>{if(!S.current)return;let Te=R.current;if(R.current=null,Te&&Math.hypot(Z.clientX-Te.x,Z.clientY-Te.y)>6||Z.target.closest("button, input, select, label, textarea, .ri-measureTools"))return;let pe=E(Z.clientX,Z.clientY);pe&&(O.current+=1,d({type:"place",point:{...pe,id:O.current}}))},[E]);return ra(()=>{w(),v(null),M(null)},[n,w]),ra(()=>{w()},[i,o,w]),ra(()=>(G(),G),[G,c,m]),ra(()=>{s||(l(!1),G())},[s,G]),ra(()=>{let Z=r.current;!a||!Z||T(Z)},[o,a,T,r]),{measureMode:c,measureModeRef:S,measurePoints:p.points,measurementTool:p.tool,areaClosed:p.areaClosed,measurementError:p.error,selectMeasurementTool:A,undoMeasurementPoint:k,finishMeasureArea:V,snapMode:m,setSnapMode:h,snapPreview:f,handleMeasurePointerMove:K,clearSnapPreview:G,showDimensions:y,measureBox:C,modelBounds:N,refreshBounds:T,clearMeasurements:w,toggleMeasureMode:F,toggleDimensions:z,handleMeasurePointerDown:H,handleMeasureClick:Ce}}import{createPortal as h1}from"react-dom";import{createXRStore as m1}from"@react-three/xr";import{MapPin as f1}from"lucide-react";import{useCallback as Yn,useEffect as Kn,useMemo as Gf,useRef as g1,useState as wn}from"react";function Vf(e,t){let r=null,n=o=>{let a=o.mode==="immersive-ar"?o.session??null:null;a!==r&&(r&&t.endAR(),r=a,r&&t.startAR())},i=e.subscribe(n);return n(e.getState()),()=>{i(),r&&t.endAR("interrupted"),r=null}}function su(){return typeof navigator>"u"?!1:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function lu(){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 Ff(){return su()||lu()}function p1(){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)"),r=e("(hover: none)")||e("(any-hover: none)"),n=navigator.maxTouchPoints>0,i=typeof window.screen<"u"&&Math.min(window.screen.width,window.screen.height)<=1024,o=su();return t||o||n&&r||n&&i}function cu(){if(!p1())return!1;if(su())return!0;let e=navigator.deviceMemory;return!(typeof e=="number"&&e>=8)}function Uf(e="auto"){switch(e){case"high":return!1;case"low":return!0;default:return cu()}}import{Fragment as b1,jsx as Xi,jsxs as uu}from"react/jsx-runtime";var Hf={canPlace:!1,isPlacementMode:!0,isModelPlaced:!1};function Wf({enableXR:e,usdzUrl:t,mobileHandoffUrl:r,engagement:n}){let i=g1(null),o=Gf(()=>{if(!e||typeof navigator>"u")return null;let E=navigator.xr;if(!E||typeof E.isSessionSupported!="function"||typeof E.addEventListener!="function")return null;try{return m1({emulate:!1})}catch{return null}},[e]),[a,s]=wn(!1),[c,l]=wn(!1),[p,d]=wn(!0),[m,h]=wn(null),[f,g]=wn(!1),[y,x]=wn(!1),[C,v]=wn(Hf),[N,M]=wn(!1),S=Gf(()=>e&&!!t?.trim()&&lu(),[e,t]);Kn(()=>{d(Ff())},[]);let O=Yn(()=>{if(typeof window>"u")return null;try{let E=new URL(r?.trim()||window.location.href,window.location.href);return E.protocol==="http:"||E.protocol==="https:"?E.toString():null}catch{return null}},[r]);Kn(()=>{if(!e||p){h(null),g(!1);return}h(O())},[e,p,O]),Kn(()=>{if(o)return o.subscribe(E=>x(E.session!=null&&E.mode==="immersive-ar"))},[o]),Kn(()=>{if(o)return Vf(o,n)},[o,n]),Kn(()=>{M(!1),v(Hf)},[y]),Kn(()=>{if(!e||typeof navigator>"u")return;let E=navigator.xr;if(!E?.isSessionSupported)return;let G=!1;return E.isSessionSupported("immersive-ar").then(K=>!G&&s(K)).catch(()=>{}),E.isSessionSupported("immersive-vr").then(K=>!G&&l(K)).catch(()=>{}),()=>{G=!0}},[e]);let R=Yn(()=>{let E=O();E&&(n.requestARLaunch("mobile-handoff"),h(E),g(!0))},[O,n]),P=Yn(()=>g(!1),[]),T=Yn(()=>{let E=t?.trim();if(!E)return;n.requestARLaunch("quick-look");let G=document.createElement("a");G.setAttribute("rel","ar"),G.href=E,G.style.display="none";let K=document.createElement("img");K.alt="",K.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",G.appendChild(K),document.body.appendChild(G),G.click(),G.remove()},[t,n]),w=Yn(E=>{v(E),E.isPlacementMode||M(!1)},[]),A=Yn(E=>{M(!1),E?i.current?.finishPlacementMode():i.current?.cancelPlacementMode()},[]),k=Yn(E=>{E.preventDefault(),M(!0),i.current?.startPlacementMode()},[]);Kn(()=>{if(!N)return;let E=()=>A(!0),G=()=>A(!1);return window.addEventListener("pointerup",E),window.addEventListener("pointercancel",G),()=>{window.removeEventListener("pointerup",E),window.removeEventListener("pointercancel",G)}},[A,N]);let V=C.isModelPlaced?C.isPlacementMode?C.canPlace?"Release to place":"Move your device over a flat surface":null:C.canPlace?null:"Move your device over a flat surface",F=C.isModelPlaced&&!C.isPlacementMode?"Pinch to resize \xB7 Twist to rotate":null,z=o?.getState().domOverlayRoot??null,H=y&&z?h1(uu(b1,{children:[F&&Xi("div",{className:"ri-arHintOverlay",children:Xi("div",{className:"ri-arHint",children:F})}),Xi("div",{className:"ri-arOverlay",children:uu("div",{className:"ri-arControls",children:[V&&Xi("div",{className:"ri-arStatus",children:V}),C.isModelPlaced&&uu("button",{type:"button",className:`ri-arActionButton ${N?"ri-arActionButton--active":""}`,onPointerDown:E=>k(E.nativeEvent),"aria-pressed":N,children:[Xi(f1,{size:14}),"Relocate"]}),!C.isModelPlaced&&C.canPlace&&Xi("button",{type:"button",className:"ri-arActionButton ri-arActionButton--primary",onClick:()=>i.current?.placeCurrent(),children:"Tap to place"})]})})]}),z):null;return{xrStore:o,presenterRef:i,arSupported:a,vrSupported:c,quickLookSupported:S,resolvedMobileHandoffUrl:m,isMobileHandoffOpen:f,arOverlay:H,openMobileHandoff:R,closeMobileHandoff:P,openQuickLook:T,handleARStateChange:w}}import{Canvas as mM,useThree as fM}from"@react-three/fiber";import{ContactShadows as gM,Environment as bM}from"@react-three/drei";import{XR as yM}from"@react-three/xr";import{NoToneMapping as vM}from"three";import{Suspense as xM,useEffect as wM,useMemo as Ws,useState as MM}from"react";import{useFrame as pu,useThree as Qn}from"@react-three/fiber";import{useXR as Xf}from"@react-three/xr";import{Color as y1,PerspectiveCamera as v1}from"three";import{useEffect as $i,useLayoutEffect as x1,useRef as du}from"react";function $f({renderMode:e,suspended:t=!1}){let{scene:r}=Qn(),n=Qn(s=>s.setFrameloop),i=Xf(s=>s.session!=null),o=Xf(s=>s.mode==="immersive-ar"),a=du(void 0);return $i(()=>{n(t?"never":i?"always":e)},[i,e,t,n]),$i(()=>{o?(a.current=r.background,r.background=null):a.current!==void 0&&(r.background=a.current,a.current=void 0)},[o,r]),pu(()=>{o&&r.background!==null&&(r.background=null)}),null}function qf({onPresentingChange:e}){let t=Qn(i=>i.gl),r=du(null);$i(()=>{let i=t.xr;if(!i)return;let o=c=>{c?(r.current=t.shadowMap.enabled,t.shadowMap.enabled=!1):r.current!==null&&(t.shadowMap.enabled=r.current,r.current=null),e(c)},a=()=>o(!0),s=()=>o(!1);return i.addEventListener("sessionstart",a),i.addEventListener("sessionend",s),o(i.isPresenting),()=>{i.removeEventListener("sessionstart",a),i.removeEventListener("sessionend",s)}},[t,e]);let n=du(0);return pu(()=>{if(!t.xr.isPresenting)return;let i=performance.now();if(i-n.current<1e3)return;n.current=i;let o=t.xr}),null}function Yf({active:e}){let t=Qn(r=>r.invalidate);return $i(()=>{e&&t()},[e,t]),pu(()=>{e&&t()}),null}function Kf({color:e}){let{scene:t}=Qn();return $i(()=>{let r=t.background;return t.background=e?new y1(e):null,()=>{t.background=r}},[t,e]),null}function Qf({rotation:e}){let{scene:t}=Qn();return x1(()=>{let r=e*Math.PI/180;t.environmentRotation.set(0,r,0),t.backgroundRotation.set(0,r,0)}),null}function Jf({cameraConfig:e}){let{camera:t}=Qn();return $i(()=>{if(!(t instanceof v1))return;let r=e?.fov;typeof r=="number"&&t.fov!==r&&(t.fov=r,t.updateProjectionMatrix())},[t,e]),null}import{useThree as Gs}from"@react-three/fiber";import{Autofocus as z1,Bloom as N1,BrightnessContrast as j1,ChromaticAberration as V1,ColorAverage as F1,DepthOfField as U1,DotScreen as G1,EffectComposer as H1,Glitch as W1,GodRays as X1,Grid as $1,HueSaturation as q1,Noise as Y1,Outline as K1,Pixelation as Q1,Ramp as J1,Scanline as Z1,SelectiveBloom as eM,Sepia as tM,SMAA as rM,SSAO as nM,ToneMapping as iM,Vignette as oM}from"@react-three/postprocessing";import{BlendFunction as na,KernelSize as aM}from"postprocessing";import{Color as Hs,Vector2 as ia}from"three";import{memo as sM,useCallback as lM,useEffect as lg,useMemo as oa,useRef as cg,useState as ug}from"react";import{forwardRef as w1,useImperativeHandle as M1,useMemo as S1}from"react";import{BlendFunction as C1,Effect as T1}from"postprocessing";import{Uniform as _1}from"three";import{jsx as E1}from"react/jsx-runtime";var P1=`
6
+ uniform float exposure;
7
+ void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
8
+ outputColor = vec4(inputColor.rgb * exposure, inputColor.a);
9
+ }
10
+ `,hu=class extends T1{constructor(t=1){super("ExposureEffect",P1,{blendFunction:C1.NORMAL,uniforms:new Map([["exposure",new _1(t)]])})}set exposure(t){this.uniforms.get("exposure").value=t}},Zf=w1(function({exposure:t},r){let n=S1(()=>new hu(t),[]);return n.exposure=t,M1(r,()=>n,[n]),E1("primitive",{object:n,dispose:null})});import{useFrame as A1,useThree as Vs}from"@react-three/fiber";import*as ng from"@react-three/postprocessing";import{BlendFunction as R1}from"postprocessing";import{Color as k1,MathUtils as D1,Mesh as L1,Vector2 as eg,Vector3 as tg}from"three";import{useEffect as rg,useMemo as Fs,useRef as mu}from"react";import{jsx as I1}from"react/jsx-runtime";var O1=ng.LensFlareEffect;function ig({config:e}){let t=Vs(m=>m.camera),r=Vs(m=>m.raycaster),n=Vs(m=>m.scene),i=Vs(m=>m.viewport),o=mu(null),a=mu(new tg),s=mu(new eg),c=Fs(()=>new tg(...e.lensPosition),[e.lensPosition]),l=Fs(()=>new k1(e.colorGain??"#141414"),[e.colorGain]),p=Fs(()=>new eg(0,0),[]),d=Fs(()=>new O1({blendFunction:R1.NORMAL,enabled:!0,glareSize:e.glareSize,lensPosition:c,screenRes:p,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,p]);return rg(()=>(o.current=d,()=>{d.dispose(),o.current=null}),[d]),rg(()=>{let m=d.uniforms.get("screenRes");m&&(m.value.x=i.width,m.value.y=i.height)},[d,i]),A1((m,h)=>{let f=o.current;if(!f)return;let g=f.uniforms.get("lensPosition"),y=f.uniforms.get("opacity");if(!g||!y)return;let x=1;if(a.current.copy(c).project(t),a.current.z>1)return;g.value.x=a.current.x,g.value.y=a.current.y,s.current.x=a.current.x,s.current.y=a.current.y,r.setFromCamera(s.current,t);let C=r.intersectObjects(n.children,!0),{object:v}=C[0]||{};v&&(v.userData?.lensflare==="no-occlusion"?x=0:v instanceof L1&&(v.material.uniforms?._transmission?.value>.2||v.material._transmission&&v.material._transmission>.2?x=.2:v.material.transparent&&(x=v.material.opacity))),y.value=D1.damp(y.value,x,12,h)}),I1("primitive",{object:d,dispose:null})}import{RampType as fu}from"@react-three/postprocessing";import{GlitchMode as gu,KernelSize as qi,ToneMappingMode as bu}from"postprocessing";import{Color as B1}from"three";function og(e){return e==="linear"?bu.LINEAR:e==="reinhard"?bu.REINHARD:bu.ACES_FILMIC}function Us(e){switch(e){case"verySmall":return qi.VERY_SMALL;case"small":return qi.SMALL;case"medium":return qi.MEDIUM;case"large":return qi.LARGE;case"veryLarge":return qi.VERY_LARGE;case"huge":return qi.HUGE}}function ag(e){switch(e){case"constantMild":return gu.CONSTANT_MILD;case"constantWild":return gu.CONSTANT_WILD;default:return gu.SPORADIC}}function yu(e){let t=new B1(e);return[t.r,t.g,t.b,1]}function sg(e){return e==="radial"?fu.Radial:e==="mirroredLinear"?fu.MirroredLinear:fu.Linear}import{Fragment as hM,jsx as Fe,jsxs as vu}from"react/jsx-runtime";var Jn={edgeStrength:1,pulseSpeed:0,visibleEdgeColor:new Hs(Wr.color).getHex(),hiddenEdgeColor:new Hs(Wr.color).multiplyScalar(.35).getHex(),kernelSize:aM.VERY_SMALL,blur:!1,xRay:!1};function cM(e){let t=[];return e.traverse(r=>{r.isMesh&&t.push(r)}),t}var xu=[],uM=sM(function({sceneConfig:t,selectedObjectRef:r,highlightOnHover:n=!1,disabled:i=!1,onOutlineEffect:o}){let a=Gs(M=>M.scene),s=Gs(M=>M.gl),c=cg(null),l=t?.postProcessing,p=r??null,d=l?.outline.enabled===!0,m=d||n,[h,f]=ug(()=>s.xr?.isPresenting??!1);lg(()=>{let M=s.xr;if(!M)return;let S=()=>f(!0),O=()=>f(!1);return M.addEventListener("sessionstart",S),M.addEventListener("sessionend",O),f(M.isPresenting),()=>{M.removeEventListener("sessionstart",S),M.removeEventListener("sessionend",O)}},[s]);let g=a.children.filter(M=>M.isLight),y=oa(()=>new ia(l?.chromaticAberration.offsetX??.002,l?.chromaticAberration.offsetY??.002),[l?.chromaticAberration.offsetX,l?.chromaticAberration.offsetY]),x=oa(()=>new Hs(l?.outline.visibleEdgeColor??"#ffffff").getHex(),[l?.outline.visibleEdgeColor]),C=oa(()=>new Hs(l?.outline.hiddenEdgeColor??"#22090a").getHex(),[l?.outline.hiddenEdgeColor]),v=oa(()=>yu(l?.ramp.startColor??"#000000"),[l?.ramp.startColor]),N=oa(()=>yu(l?.ramp.endColor??"#ffffff"),[l?.ramp.endColor]);return!l||h||i?null:vu(hM,{children:[l.godRays.enabled===!0&&vu("mesh",{ref:c,position:l.godRays.sunPosition,visible:!1,frustumCulled:!1,children:[Fe("sphereGeometry",{args:[.1,8,8]}),Fe("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),vu(H1,{multisampling:0,enableNormalPass:l.ssao.enabled===!0,autoClear:!1,children:[l.smaa.enabled===!0&&Fe(rM,{}),l.ssao.enabled===!0&&Fe(nM,{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&&Fe(z1,{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&&Fe(U1,{focusDistance:l.depthOfField.focusDistance,focusRange:l.depthOfField.focusRange,focalLength:l.depthOfField.focalLength,bokehScale:l.depthOfField.bokehScale}),l.bloom.enabled===!0&&Fe(N1,{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&&Fe(eM,{selection:p??void 0,lights:g,selectionLayer:l.selectiveBloom.selectionLayer,intensity:l.selectiveBloom.intensity,luminanceThreshold:l.selectiveBloom.luminanceThreshold,luminanceSmoothing:l.selectiveBloom.luminanceSmoothing,kernelSize:Us(l.selectiveBloom.kernelSize),mipmapBlur:l.selectiveBloom.mipmapBlur,inverted:l.selectiveBloom.inverted,ignoreBackground:l.selectiveBloom.ignoreBackground}),m&&Fe(K1,{ref:o,selection:xu,selectionLayer:l.outline.selectionLayer,blendFunction:na.SCREEN,edgeStrength:d?l.outline.edgeStrength:Jn.edgeStrength,pulseSpeed:d?l.outline.pulseSpeed:Jn.pulseSpeed,visibleEdgeColor:d?x:Jn.visibleEdgeColor,hiddenEdgeColor:d?C:Jn.hiddenEdgeColor,kernelSize:d?Us(l.outline.kernelSize):Jn.kernelSize,blur:d?l.outline.blur:Jn.blur,xRay:d?l.outline.xRay:Jn.xRay}),l.chromaticAberration.enabled===!0&&Fe(V1,{offset:y,radialModulation:l.chromaticAberration.radialModulation,modulationOffset:l.chromaticAberration.modulationOffset}),l.colorAverage.enabled===!0&&Fe(F1,{}),l.dotScreen.enabled===!0&&Fe(G1,{angle:l.dotScreen.angle,scale:l.dotScreen.scale}),l.glitch.enabled===!0&&Fe(W1,{mode:ag(l.glitch.mode),delay:new ia(l.glitch.delay[0],l.glitch.delay[1]),duration:new ia(l.glitch.duration[0],l.glitch.duration[1]),strength:new ia(l.glitch.strength[0],l.glitch.strength[1]),chromaticAberrationOffset:new ia(l.glitch.chromaticAberrationOffset[0],l.glitch.chromaticAberrationOffset[1]),columns:l.glitch.columns,ratio:l.glitch.ratio,active:!0}),l.grid.enabled===!0&&Fe($1,{scale:l.grid.scale,lineWidth:l.grid.lineWidth}),l.lensflare.enabled===!0&&Fe(ig,{config:l.lensflare}),l.godRays.enabled===!0&&Fe(X1,{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:Us(l.godRays.kernelSize)}),l.noise.enabled===!0&&Fe(Y1,{premultiply:l.noise.premultiply,opacity:l.noise.opacity,blendFunction:na.ADD}),l.brightnessContrast.enabled===!0&&Fe(j1,{brightness:l.brightnessContrast.brightness,contrast:l.brightnessContrast.contrast}),l.hueSaturation.enabled===!0&&Fe(q1,{hue:l.hueSaturation.hue,saturation:l.hueSaturation.saturation}),l.toneMapping.enabled===!0&&Fe(Zf,{exposure:l.toneMapping.exposure}),l.vignette.enabled===!0&&Fe(oM,{eskil:l.vignette.eskil,offset:l.vignette.offset,darkness:l.vignette.darkness,blendFunction:na.NORMAL}),l.toneMapping.enabled===!0&&Fe(iM,{mode:og(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&&Fe(tM,{intensity:l.sepia.intensity,blendFunction:na.NORMAL}),l.scanline.enabled===!0&&Fe(Z1,{density:l.scanline.density,blendFunction:na.OVERLAY}),l.pixelation.enabled===!0&&Fe(Q1,{granularity:l.pixelation.granularity}),l.ramp.enabled===!0&&Fe(J1,{rampType:sg(l.ramp.rampType),rampStart:l.ramp.rampStart,rampEnd:l.ramp.rampEnd,startColor:v,endColor:N,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 dM(e){let t=[e];for(;t.length>0;){let r=t.pop();if(r.visible){if(r.isMesh)return!0;t.push(...r.children)}}return!1}function pM(e,t){return e.length===t.length&&e.every((r,n)=>r===t[n])}function dg({hoveredObjectRef:e,...t}){let r=Gs(c=>c.scene),n=Gs(c=>c.invalidate),[i,o]=ug(null),a=lM(c=>o(c),[]),s=cg({effect:null,objects:xu});return lg(()=>{if(!i)return;let l=t.sceneConfig?.postProcessing?.outline.enabled===!0?cM(r):e&&dM(e)?[e]:xu;s.current.effect===i&&pM(s.current.objects,l)||(s.current={effect:i,objects:l},i.selection.set(l),n())}),Fe(uM,{...t,onOutlineEffect:a})}import{Fragment as TM,jsx as Yt,jsxs as pg}from"react/jsx-runtime";var SM=1.5;function CM({captureRef:e}){let{gl:t,scene:r,camera:n,invalidate:i}=fM();return wM(()=>{if(e)return e.current={gl:t,scene:r,camera:n,invalidate:i},()=>{e.current=null}},[e,t,r,n,i]),null}function wu({children:e,camera:t,backgroundColor:r,shadows:n=!0,sceneConfig:i,selectedObjectRef:o,hoveredObjectRef:a,highlightOnHover:s,renderMode:c="demand",maxDpr:l=2,xrStore:p,rendererCaptureRef:d,preserveDrawingBuffer:m=!1,reduceGpuLoad:h,suspended:f=!1,onRendererCreated:g}){let y=h??cu(),x=y?Math.min(l,SM):l,C=n&&!y,v=Ws(()=>r?{background:r}:i?.background.enabled?i.background.type==="color"?{background:i.background.color}:i.background.type==="image"&&i.background.imageUrl.trim()?{backgroundImage:`url("${i.background.imageUrl}")`,backgroundPosition:"center",backgroundRepeat:"no-repeat",backgroundSize:"cover"}:{background:"linear-gradient(180deg, #3a3a3c 0%, #1c1c1d 100%)"}:{background:"transparent"},[r,i]),N=Ws(()=>{if(r)return r;let A=i?.background;if(A?.enabled){if(A.type==="color")return A.color;if(A.type==="image"&&A.imageUrl.trim()||A.type==="environment")return null}return"#1c1c1d"},[r,i]),M=Ws(()=>{let A=i?.postProcessing;return A?!!(A.glitch.enabled||A.noise.enabled||A.lensflare.enabled&&A.lensflare.animated):!1},[i?.postProcessing]),[S,O]=MM(!1),R=i?.environment,P=i?.groundShadows,T=Ws(()=>{if(!R)return null;if(R.source==="custom"){let A=R.customEnvironmentUrl.trim();return jh(A)?{files:A}:null}return{preset:R.preset}},[R]),w=pg(TM,{children:[Yt(CM,{captureRef:d}),Yt(Jf,{cameraConfig:t}),Yt(Yf,{active:M}),Yt(Kf,{color:N}),T?Yt(Hi,{onError:A=>console.warn("Failed to load environment map:",A),children:Yt(xM,{fallback:null,children:Yt(bM,{...T,environmentIntensity:R?.intensity??.25,backgroundIntensity:R?.intensity??.25,background:i?.background.enabled===!0&&i.background.type==="environment"})})}):null,Yt(Qf,{rotation:R?.rotation??0}),p&&Yt(qf,{onPresentingChange:O}),P?.enabled&&P.mode==="shadowCatcher"&&!S&&Yt(gM,{position:[0,P.height,0],scale:P.size,opacity:P.intensity,blur:P.borderFade,far:15,resolution:1024,color:"#000000"}),e,Yt(dg,{sceneConfig:i,selectedObjectRef:o,hoveredObjectRef:a,highlightOnHover:s,disabled:y})]});return Yt(mM,{frameloop:f?"never":c,onCreated:({gl:A})=>g?.(A),dpr:[1,x],shadows:C?"soft":!1,resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:v,camera:t??{fov:50},gl:{preserveDrawingBuffer:m,toneMapping:vM,toneMappingExposure:1},children:p?pg(yM,{store:p,children:[Yt($f,{renderMode:c,suspended:f}),w]}):w})}import{CameraControls as _M,PointerLockControls as PM}from"@react-three/drei";import{Box3 as EM,Vector3 as mg}from"three";import{useEffect as aa,useRef as AM}from"react";var Xs=e=>e*Math.PI/180;function hg(e){return{minDistance:e?.minDistance??0,maxDistance:e?.maxDistance??1/0,minPolarAngle:Xs(e?.minPolarAngle??0),maxPolarAngle:Xs(e?.maxPolarAngle??180),minAzimuthAngle:Xs(e?.minAzimuthAngle??-1/0),maxAzimuthAngle:Xs(e?.maxAzimuthAngle??1/0),boundaryEnclosesCamera:e?.boundaryEnclosesCamera??!1,boundaryFriction:e?.boundaryFriction??0,panBoundary:e?.panBoundary}}import{jsx as fg}from"react/jsx-runtime";function Mu({controlsRef:e,onCameraChange:t,cameraLimits:r,controllerType:n="orbit",onPointerLockExit:i}){let o=n==="orbit",a=AM(null);return aa(()=>{if(!o)return a.current?.lock(),()=>{a.current?.unlock()}},[o]),aa(()=>{o&&document.pointerLockElement&&document.exitPointerLock()},[o]),aa(()=>{if(o)return;let s=()=>{document.pointerLockElement||i?.()};return document.addEventListener("pointerlockchange",s),()=>{document.removeEventListener("pointerlockchange",s)}},[o,i]),aa(()=>{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]),aa(()=>{if(!o||!e||typeof e!="object"||!("current"in e))return;let s=e.current;if(!s)return;let c=hg(r);s.minDistance=c.minDistance,s.maxDistance=c.maxDistance,s.minPolarAngle=c.minPolarAngle,s.maxPolarAngle=c.maxPolarAngle,s.minAzimuthAngle=c.minAzimuthAngle,s.maxAzimuthAngle=c.maxAzimuthAngle,s.boundaryEnclosesCamera=c.boundaryEnclosesCamera,s.boundaryFriction=c.boundaryFriction,s.setBoundary(c.panBoundary?new EM(new mg(...c.panBoundary[0]),new mg(...c.panBoundary[1])):void 0)},[o,e,r?.minDistance,r?.maxDistance,r?.minPolarAngle,r?.maxPolarAngle,r?.minAzimuthAngle,r?.maxAzimuthAngle,r?.boundaryEnclosesCamera,r?.boundaryFriction,r?.panBoundary]),o?fg(_M,{ref:e,makeDefault:!0,smoothTime:.3,dollyToCursor:!0}):fg(PM,{ref:a,makeDefault:!0,selector:"[data-ri-pointer-lock-trigger]"})}import{useRef as Su,useMemo as $s,useEffect as RM}from"react";import{useFrame as kM,useThree as gg}from"@react-three/fiber";import{Vector3 as DM}from"three";import{Fragment as NM,jsx as Zn,jsxs as jM}from"react/jsx-runtime";function yg(e,t){if(!t)return e;let r=t*Math.PI/180,n=Math.cos(r),i=Math.sin(r);return[e[0]*n+e[2]*i,e[1],-e[0]*i+e[2]*n]}function LM(e,t){let[r,n,i]=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:[r+s[0]*c,n+s[1]*c,i+s[2]*c],target:e.center,extent:o,near:Math.max(o/100,.001),far:c+o*2}}function OM(e,t){let r=t[0]-e.center[0],n=t[1]-e.center[1],i=t[2]-e.center[2],o=Math.hypot(r,n,i);return{near:Math.max(o-e.radius,o*.01,.001),far:o+e.radius*2}}function IM(e,t,r){return t&&r&&!e.attachedToCamera?r.center:[0,0,0]}var BM={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}]},zM={enabled:!0,mapSize:2048,bias:-5e-4,normalBias:.02,radius:3};function bg({light:e,shadows:t,shadowsEnabled:r,environmentRotation:n,modelBounds:i,objectBindings:o,nodeRefs:a}){let s=Su(null),c=Su(null),l=Su(null),p=gg(x=>x.camera),d=gg(x=>x.scene),m=$s(()=>new DM,[]),h=$s(()=>e.attachedToCamera||e.attachment?e.position:yg(e.position,n),[e.position,e.attachedToCamera,e.attachment,n]);kM(()=>{let x=s.current??c.current??l.current;if(!x)return;if(e.attachedToCamera){x.position.copy(p.position);return}let C=e.attachment;if(!C)return;let v=o?Li(o,C.objectId):null,M=(v?o?.[v]:void 0)?.modelObjectId??C.objectId,S=(v?a?.current[v]:void 0)??Gn(d,M);S&&(m.fromArray(C.offset),S.localToWorld(m),x.position.copy(m))});let f=r&&t.enabled&&e.castShadow,g=$s(()=>e.type==="directional"&&f&&i&&!e.attachedToCamera?LM(i,h):null,[e.type,e.attachedToCamera,f,i,h]),y=$s(()=>e.type==="spot"&&f&&i&&!e.attachedToCamera?OM(i,h):null,[e.type,e.attachedToCamera,f,i,h]);return RM(()=>{let x=s.current??l.current;if(!x)return;let[C,v,N]=IM(e,f,i);x.target.position.set(C,v,N),x.target.updateMatrixWorld()},[e,f,i]),!e.visible||e.type==="none"?null:e.type==="directional"?Zn("directionalLight",{ref:s,color:e.color,intensity:e.intensity,position:g?.position??h,castShadow:f,"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":g?.near??.5,"shadow-camera-far":g?.far??40,"shadow-camera-left":-(g?.extent??8),"shadow-camera-right":g?.extent??8,"shadow-camera-top":g?.extent??8,"shadow-camera-bottom":-(g?.extent??8)}):e.type==="point"?Zn("pointLight",{ref:c,color:e.color,intensity:e.intensity,position:h,distance:e.distance,decay:e.decay,castShadow:f,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias}):e.type==="spot"?Zn("spotLight",{ref:l,color:e.color,intensity:e.intensity,position:h,angle:e.angle??Math.PI/6,penumbra:e.penumbra??.2,distance:e.distance,decay:e.decay,castShadow:f,"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}):e.type==="hemisphere"?Zn("hemisphereLight",{color:e.color,groundColor:"#444444",intensity:e.intensity}):null}function Cu({lightingConfig:e,shadowConfig:t,shadowsEnabled:r=!0,environmentRotation:n=0,environmentConfig:i,modelBounds:o,objectBindings:a,nodeRefs:s}){let c=e??BM,l=t??zM,p=i?.shadowLight,d=yg([5,10,5],n);return jM(NM,{children:[Zn("ambientLight",{intensity:c.ambient.intensity,color:c.ambient.color}),c.lights.map(m=>Zn(bg,{light:m,shadows:l,shadowsEnabled:r,environmentRotation:n,modelBounds:o,objectBindings:a,nodeRefs:s},m.id)),p?.enabled&&Zn(bg,{light:{id:"light-env-shadow",type:"directional",color:"#ffffff",intensity:p.intensity,position:d,attachedToCamera:!1,castShadow:!0,shadowBias:p.bias,visible:!0},shadows:l,shadowsEnabled:r,environmentRotation:0,modelBounds:o,objectBindings:a,nodeRefs:s})]})}import{useState as Tg,useEffect as qe,useRef as It,useMemo as yt}from"react";import{useFrame as Qs,useThree as WM}from"@react-three/fiber";import{Color as XM,MeshStandardMaterial as $M,MeshBasicMaterial as Tu,MeshNormalMaterial as qM,MeshMatcapMaterial as YM,DoubleSide as KM,NormalBlending as QM,Box3 as Js,Vector3 as ei,Matrix4 as JM,MathUtils as Zs}from"three";import{SkeletonUtils as ZM}from"three-stdlib";function vg(e){let t=new Map;return e.map((r,n)=>{let o=r.name.trim()||`Animation ${n+1}`,a=t.get(o)??0;return t.set(o,a+1),{clip:r,sourceName:a===0?o:`${o} (${a+1})`,duration:r.duration}})}import{AnimationMixer as VM,LoopOnce as FM,LoopPingPong as xg,LoopRepeat as UM}from"three";function wg(e){let t=e._loopCount;return e.loop===xg&&(t&1)===1}function GM(e){return wg(e)?e.getClip().duration-e.time:e.time}function Mg({root:e,clips:t,getClipConfig:r,onChange:n}){let i=new VM(e),o=new Map;for(let{clip:T,sourceName:w}of t)o.set(w,i.clipAction(T));let a=new Map,s=new Set,c=new Map,l=1,p=T=>typeof T=="string",d=T=>p(T)?a.has(T)?[T]:[]:[...a.keys()],m=(T,w)=>{let A=Nh(r(w));A==="once"?T.setLoop(FM,1):A==="ping-pong"?T.setLoop(xg,1/0):T.setLoop(UM,1/0),T.clampWhenFinished=A==="once"},h=T=>{T.action.setEffectiveTimeScale(T.reverse?-T.speed:T.speed)},f=T=>{let w=a.get(T);w&&(w.action.stop(),a.delete(T))},g=(T,w={})=>{let A=o.get(T);if(!A||r(T)?.hidden)return;let k=Number.isFinite(w.fade)&&w.fade>0?w.fade:0,V=w.reverse??!1;if(!w.alongside)for(let[E,G]of[...a])E!==T&&(k>0?(a.delete(E),G.action.fadeOut(k),s.add(G.action)):f(E));s.delete(A)&&A.stop();let F=A.getClip().duration,z=a.get(T),H=()=>{A.reset(),V&&(A.time=F),A.play()};if(!z)H(),k>0&&A.fadeIn(k);else{let E=V?A.time<=0:A.time>=F;z.finished&&E&&H(),A.paused=!1,A.enabled=!0,a.delete(T)}m(A,T),z={action:A,speed:r(T)?.speed??c.get(T)??l,reverse:V,finished:!1},z.speed=ls(z.speed),h(z),a.set(T,z),n()},y=T=>{for(let w of d(T))a.get(w).action.paused=!0;n()},x=T=>{for(let w of d(T))f(w);if(!p(T)){for(let w of s)w.stop();s.clear()}n()},C=(T,w)=>{let A=ls(T);p(w)?c.set(w,A):l=A;for(let k of d(w)){let V=a.get(k);c.set(k,A),V.speed=A,h(V)}n()},v=(T,w)=>{for(let A of d(w)){let k=a.get(A),V=k.action.getClip().duration,F=Math.min(Math.max(T,0),V);k.action.time=wg(k.action)?V-F:F,k.finished&&(k.finished=!1,k.action.paused=!0)}i.update(0),n()},N=()=>{for(let[T,w]of[...a]){let A=r(T);if(A?.hidden){f(T);continue}m(w.action,T),A?.speed!==void 0&&(w.speed=ls(A.speed),h(w))}n()},M=T=>{for(let w of a.values())w.action===T.action&&(w.finished=!0);n()};return i.addEventListener("finished",M),{play:g,pause:y,stop:x,setSpeed:C,seek:v,getState:()=>{let T=[...a].map(([A,k])=>({clip:A,status:k.finished?"finished":k.action.paused?"paused":"playing",time:GM(k.action),duration:k.action.getClip().duration,speed:k.speed,reverse:k.reverse})),w=T[T.length-1];return{currentClip:w?.clip??null,isPlaying:T.some(A=>A.status==="playing"),speed:w?.speed??l,time:w?.time??0,duration:w?.duration??0,active:T}},applyClipConfigs:N,isRunning:()=>{if(s.size>0)return!0;for(let{action:T}of a.values())if(!T.paused&&T.enabled)return!0;return!1},update:T=>{i.update(T);for(let w of s)(!w.enabled||w.getEffectiveWeight()<=0)&&(w.stop(),s.delete(w))},dispose:()=>{i.removeEventListener("finished",M),i.stopAllAction(),i.uncacheRoot(e),a.clear(),s.clear()}}}import{Color as qs,FrontSide as HM,NormalBlending as Sg}from"three";function Cg(e,t,r,n){let i=xr(t),o=Xo(r,i),a=Dh(n,t),s=Lh(n,t),c=Oh(n,t);return a||s||c?gs(e.userData,t,o,r,a??[0,0],s??1,c??0):(bs(e.userData,t),o)}function bt(e,t,r,n){if(!r){bs(e.userData,t);return}let i=ss[t];e[i]=Cg(e,t,r,n)}function Ys(e,t,r){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 qs(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??Sg,e.depthWrite=e.userData.baseDepthWrite??!0,e.side=e.userData.baseSide??HM,e.normalMap=e.userData.baseNormalMap??null,e.normalScale.copy(Fo(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(Fo(e.userData.baseClearcoatNormalScale)),e.sheen=e.userData.baseSheen??e.sheen,e.sheenColor.copy(e.userData.baseSheenColor??new qs(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 qs("#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 qs("#ffffff")),e.specularColorMap=e.userData.baseSpecularColorMap??null,e.flatShading=e.userData.baseFlatShading??e.flatShading,e.envMapIntensity=e.userData.baseEnvMapIntensity??e.envMapIntensity;let n=$e(t,"texture"),i=$e(t,"metalnessMap"),o=$e(t,"roughnessMap"),a=$e(t,"emissiveMap"),s=$e(t,"alphaMap"),c=$e(t,"normalMap"),l=$e(t,"bumpMap"),p=$e(t,"aoMap"),d=$e(t,"displacementMap"),m=$e(t,"clearcoatMap"),h=$e(t,"clearcoatRoughnessMap"),f=$e(t,"clearcoatNormalMap"),g=$e(t,"anisotropyMap"),y=$e(t,"transmissionMap"),x=$e(t,"thicknessMap"),C=$e(t,"sheenColorMap"),v=$e(t,"sheenRoughnessMap"),N=$e(t,"specularIntensityMap"),M=$e(t,"specularColorMap");if(n?(e.map=Cg(e,"texture",n,t),e.color.set(r??"#ffffff")):(bs(e.userData,"texture"),r&&(e.map=null,e.color.set(r))),bt(e,"metalnessMap",i,t),t?.metalness!==void 0&&(e.metalness=t.metalness),bt(e,"roughnessMap",o,t),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),bt(e,"emissiveMap",a,t),t?.opacity!==void 0&&(e.opacity=t.opacity),bt(e,"alphaMap",s,t),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=Bh(t.blendingMode),e.depthWrite=t.blendingMode!=="additive"),t?.side&&(e.side=Ih(t.side)),bt(e,"normalMap",c,t),c||t?.normalScale!==void 0){let S=t?.normalScale??Math.abs(Fo(e.userData.baseNormalScale).x);e.normalScale.set(S,t?.flipNormalY?-S:S)}if(bt(e,"bumpMap",l,t),t?.bumpScale!==void 0&&(e.bumpScale=t.bumpScale),bt(e,"aoMap",p,t),t?.aoMapIntensity!==void 0&&(e.aoMapIntensity=t.aoMapIntensity),bt(e,"displacementMap",d,t),t?.displacementScale!==void 0&&(e.displacementScale=t.displacementScale),t?.displacementBias!==void 0&&(e.displacementBias=t.displacementBias),bt(e,"clearcoatMap",m,t),t?.clearcoat!==void 0&&(e.clearcoat=t.clearcoat),bt(e,"clearcoatRoughnessMap",h,t),t?.clearcoatRoughness!==void 0&&(e.clearcoatRoughness=t.clearcoatRoughness),bt(e,"clearcoatNormalMap",f,t),f||t?.clearcoatNormalScale!==void 0){let S=t?.clearcoatNormalScale??Math.abs(Fo(e.userData.baseClearcoatNormalScale).x);e.clearcoatNormalScale.set(S,t?.flipClearcoatNormalY?-S:S)}t?.sheen!==void 0&&(e.sheen=t.sheen),t?.sheenColor&&e.sheenColor.set(t.sheenColor),bt(e,"sheenColorMap",C,t),t?.sheenRoughness!==void 0&&(e.sheenRoughness=t.sheenRoughness),bt(e,"sheenRoughnessMap",v,t),t?.anisotropy!==void 0&&(e.anisotropy=t.anisotropy),t?.anisotropyRotation!==void 0&&(e.anisotropyRotation=t.anisotropyRotation),bt(e,"anisotropyMap",g,t),t?.transmission!==void 0&&(e.transmission=t.transmission),bt(e,"transmissionMap",y,t),t?.thickness!==void 0&&(e.thickness=t.thickness),bt(e,"thicknessMap",x,t),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),bt(e,"specularIntensityMap",N,t),t?.specularColor&&e.specularColor.set(t.specularColor),bt(e,"specularColorMap",M,t),e.transparent=e.opacity<1||e.transmission>0||e.blending!==Sg||!!((s||e.alphaMap)&&e.alphaTest<=0),e.transparent||(e.depthWrite=!0)}function sa(e){return e.material}function Or(e,t){return Array.isArray(e)?e.map(t):t(e,0)}function Gt(e,t){Array.isArray(e)?e.forEach(t):t(e,0)}function Ks(e,t){return Array.isArray(e)?e[t]:e}import{jsx as _g}from"react/jsx-runtime";function el(e,t,r){let n=r.get(e);n&&(t?.position?e.position.fromArray(t.position):e.position.copy(n.position),t?.rotation?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2],n.rotation.order):e.rotation.copy(n.rotation),t?.scale?e.scale.fromArray(t.scale):e.scale.copy(n.scale),e.updateMatrix())}function st(e,t=!1){if(!e||typeof e!="object")return"-";let r=e;return[r.channel??0,t?r.format??"":"",r.isVideoTexture?r.colorSpace??"":""].join(":")}function Yi(e){let t=e,r=Number(t.clearcoat)>0,n=Number(t.sheen)>0,i=Number(t.anisotropy)>0,o=Number(t.transmission)>0,a=t.transparent===!1&&t.blending===QM&&t.alphaToCoverage!==!0;return[st(t.map),st(t.aoMap),st(t.lightMap),st(t.bumpMap),st(t.normalMap,!0),t.normalMap?t.normalMapType:"",st(t.displacementMap),st(t.emissiveMap),st(t.metalnessMap),st(t.roughnessMap),i,st(i?t.anisotropyMap:null),r,st(r?t.clearcoatMap:null),st(r?t.clearcoatNormalMap:null,!0),st(r?t.clearcoatRoughnessMap:null),n,st(n?t.sheenColorMap:null),st(n?t.sheenRoughnessMap:null),st(t.specularColorMap),st(t.specularIntensityMap),o,st(o?t.transmissionMap:null),st(o?t.thicknessMap:null),st(t.alphaMap),Number(t.alphaTest)>0,!!t.alphaHash,!!t.flatShading,!!t.dithering,t.side,a].join("|")}var eS={};function _u({url:e,objectBindings:t,selectedItem:r,itemMaterials:n,onItemClick:i,onItemHover:o,onItemDoubleClick:a,onItemContextMenu:s,onModelLoaded:c,onAnimationsReady:l,nodeRefsOut:p,onNodeRefsChange:d,materialRefsOut:m,panelHoveredItem:h,sceneConfig:f,zoomOnSelected:g=!0,highlightOnHover:y=!0,decoderConfig:x,modelFormat:C,onLoadProgress:v,explodeFactor:N=0,suspendBindingTransforms:M=!1,pulses:S=eS}){let O=$h(e,x,C,v),R=WM(I=>I.invalidate),[P,T]=Tg(null),w=It(null),{setCanvasCursor:A,restoreCanvasCursor:k}=qh();qe(()=>{y||(T(null),o?.(null),k())},[y,o,k]);let V=yt(()=>ZM.clone(O.scene),[O.scene]),F=yt(()=>Oi(V),[V]),z=F.nodesById,H=yt(()=>{let I=new WeakMap;return V.traverse(j=>{_t(j)&&I.set(j,j.material)}),I},[V]),E=O.materialVariants,G=f?.model.materialVariant??null,K=G&&E?E.names.indexOf(G):-1,[Ce,Z]=Tg(null);qe(()=>{if(G&&K<0&&console.warn(`[react-immersive] The model has no material variant "${G}".`+(E?` Its variants are: ${E.names.join(", ")}.`:" It has no material variants.")),!E||K<0){Z(null);return}let I=!1,j=[];return V.traverse(U=>{if(!_t(U)||!H.has(U))return;let W=Wh(Hh(U),K);W!==null&&j.push(E.resolveMaterial(W,U).then($=>[U,$]))}),Promise.all(j).then(U=>{I||Z({scene:V,materials:new Map(U)})}).catch(U=>{I||console.warn(`[react-immersive] Material variant "${G}" failed to load.`,U)}),()=>{I=!0}},[V,H,E,K,G]);let Te=Ce?.scene===V?Ce.materials:void 0,Ne=I=>Te?.get(I)??H.get(I)??sa(I);qe(()=>{F.duplicateNames.size!==0&&console.warn("[react-immersive] Duplicate model node names were assigned unique binding IDs.",Object.fromEntries(F.duplicateNames))},[F]);let pe=yt(()=>{let I=new WeakMap;return V.traverse(j=>{I.set(j,{position:j.position.clone(),rotation:j.rotation.clone(),scale:j.scale.clone()})}),I},[V]);qe(()=>{let I=!1,j=null,U=null,W=window,$=Object.entries(z).filter(([,Je])=>_t(Je)),ee=new Js,se=[],tt=0;V.traverse(Je=>{!_t(Je)||Je.userData[qn]||(Je.castShadow=!1,Je.receiveShadow=!0)});let Oe=()=>{if(I)return;let Je=new Set,ae=ee.getSize(new ei),He=new ei;for(let{name:mt,box:Pt}of se)Pt.getSize(He),He.x>ae.x*.7&&He.z>ae.z*.7&&He.y>ae.y*.4&&Je.add(mt);V.traverse(mt=>{if(!_t(mt)||mt.userData[qn])return;let Pt=Go(mt);mt.castShadow=!Pt||!Je.has(Pt),mt.receiveShadow=!0}),R()},Ge=()=>{I||(W.requestIdleCallback?j=W.requestIdleCallback(je,{timeout:100}):U=window.setTimeout(()=>je(),0))},je=Je=>{if(j=null,U=null,I)return;let ae=performance.now(),He=0;for(;tt<$.length&&!(He>0&&!(Je?Je.didTimeout?He<16:Je.timeRemaining()>1:performance.now()-ae<8));){let[mt,Pt]=$[tt];tt+=1,He+=1;let dr=new Js().setFromObject(Pt);dr.isEmpty()||(se.push({name:mt,box:dr}),ee.union(dr))}tt<$.length?Ge():Oe()};return Ge(),()=>{I=!0,j!==null&&W.cancelIdleCallback?.(j),U!==null&&window.clearTimeout(U)}},[R,z,V]),qe(()=>{Lc(V)},[V]),qe(()=>{let I=new AbortController;return as(V,I.signal),()=>{I.abort(),Vo(V)}},[V]);let Ue=yt(()=>{let I={};for(let[j,U]of Object.entries(t))I[U.modelObjectId??j]=j;return I},[t]),Ee=yt(()=>Object.entries(t).map(([I,j])=>`${I}${j.modelObjectId??I}`).sort().join(""),[t]),Ke=yt(()=>Object.entries(t).map(([I,j])=>JSON.stringify([I,j.modelObjectId??I,j.transform??null])).sort().join(""),[t]),dt=It(new Map);qe(()=>{let I=new Map,j=new Map;for(let[$,ee]of Object.entries(t)){if(!ee.transform)continue;let se=z[ee.modelObjectId??$];se&&(I.set(se,ee.transform),j.set(se,Fi(se)))}let U=new Set([...dt.current.keys(),...I.keys()]);for(let $ of U){el($,void 0,pe);for(let ee of Fi($))Ui(ee)}V.updateMatrixWorld(!0);let W=new Map;for(let $ of j.values())for(let ee of $)W.has(ee)||W.set(ee,ee.matrixWorld.clone());for(let[$,ee]of I)el($,ee,pe);dt.current=I,V.updateMatrixWorld(!0);for(let[$,ee]of W)vs($,ee);R()},[V,z,pe,Ke,R]),qe(()=>()=>{for(let I of Fi(V))Ui(I)},[V]);let fe=yt(()=>{let I={};for(let[j,U]of Object.entries(t)){let W=U.modelObjectId??j,$=z[W];if(!_t($))continue;let ee=Ne($);ee&&(I[j]=Or(ee,se=>{let tt=cs(se),Oe=us(tt??new $M);return ds(Oe),Oe}))}return I},[z,Ee,H,Te]);qe(()=>{m&&(m.current=fe)},[fe,m]),qe(()=>()=>{for(let I of Object.values(fe))Gt(I,j=>{vm(j.userData),j.dispose()})},[fe]);let Ie=f?.model.shading??"lit",Xe=f?.model.renderer??"pbr",Qt=f?.wireframe.enabled??!1,J=f?.wireframe.color??"#93c5fd",cr=f?.wireframe.opacity??1,et=yt(()=>{let I={};if(Ie!=="unlit")return I;for(let[j,U]of Object.entries(fe))I[j]=Or(U,W=>{let $=new Tu;return $.color.copy(W.color),$.map=W.map,$.alphaMap=W.alphaMap,$.alphaTest=W.alphaTest,$.transparent=W.transparent,$.opacity=W.opacity,$.side=W.side,$});return I},[fe,Ie]),ze=yt(()=>{let I={};if(Ie!=="normals")return I;for(let[j,U]of Object.entries(fe))I[j]=Or(U,()=>new qM);return I},[fe,Ie]),ke=yt(()=>{let I={};if(Ie!=="lit"||Xe!=="matcap")return I;let j=ys();for(let[U,W]of Object.entries(fe))I[U]=Or(W,$=>{let ee=new YM;return ee.matcap=j,ee.color.copy($.color),ee.alphaMap=$.alphaMap,ee.alphaTest=$.alphaTest,ee.side=$.side,ee});return I},[fe,Ie,Xe]);qe(()=>()=>{for(let I of Object.values(et))Gt(I,j=>j.dispose());for(let I of Object.values(ze))Gt(I,j=>j.dispose());for(let I of Object.values(ke))Gt(I,j=>j.dispose())},[et,ze,ke]);let jt=I=>Ie==="normals"?ze[I]:Ie==="unlit"?et[I]:Xe==="matcap"?ke[I]:fe[I],ur=It(c);ur.current=c,qe(()=>{ur.current?.(V)},[V]);let St=yt(()=>{let I={};for(let[j,U]of Object.entries(t)){let W=U.modelObjectId??j,$=z[W];$&&(I[j]=$)}return I},[z,Ee]);qe(()=>(p.current=St,d?.(),()=>{p.current===St&&(p.current={})}),[St,p,d]);let Qe=It({});qe(()=>()=>{for(let I of Object.values(Qe.current))for(let[j,U]of Object.entries(I))U&&Xr(U,xr(j));Qe.current={}},[]);let ne=yt(()=>{let I=new Map;for(let[j,U]of Object.entries(t)){let W=h===U||h?.id===U.id||h?.modelObjectId===U.modelObjectId,$=y&&(P===j||W),ee=$||r===j;($||ee)&&I.set(j,{emissive:$,matcap:ee})}return I},[t,y,P,r,h]),be=It(ne);be.current=ne,qe(()=>{let I=new Set;for(let[j,U]of Object.entries(t)){I.add(j);let W=U.modelObjectId??j,$=z[W];if(!_t($))continue;$.visible=U.visible!==!1;let ee=fe[j];if(!ee)continue;if(Xe!=="uv-checker"){let ae=jt(j);ae&&($.material=ae)}if(U.visible===!1)continue;let se=et[j],tt=ke[j],Oe=n[j]??n[U.modelObjectId??j],Ge=U.style?.material,je=Qe.current[j]??{};for(let ae of gn){let He=$e(Ge,ae),mt=je[ae];if(mt===He)continue;let Pt=xr(ae);mt&&Xr(mt,Pt),He?(ji(He,Pt,R),je[ae]=He):delete je[ae]}Object.keys(je).length>0?Qe.current[j]=je:delete Qe.current[j];let Je=Oe?.hex??Ge?.baseColor;Gt(ee,(ae,He)=>{let mt=Yi(ae);Ys(ae,Ge,Je);let Pt=ae.userData.reactImmersiveConfiguredEmissive;Pt?.isColor?Pt.copy(ae.emissive):ae.userData.reactImmersiveConfiguredEmissive=ae.emissive.clone();let dr=be.current.get(j);dr?.emissive&&ae.emissive.add(Wn),mt!==Yi(ae)&&(ae.needsUpdate=!0);let Vt=Ks(se,He);if(Vt){let di=Yi(Vt);Vt.color.copy(ae.color),Vt.map=ae.map,Vt.alphaMap=ae.alphaMap,Vt.alphaTest=ae.alphaTest,Vt.transparent=ae.transparent,Vt.opacity=ae.opacity,Vt.side=ae.side,di!==Yi(Vt)&&(Vt.needsUpdate=!0)}let Ct=Ks(tt,He);if(Ct){let di=Yi(Ct);dr?.matcap?Ct.color.set(Wr.color):Ct.color.copy(ae.color),Ct.map=ae.map,Ct.alphaMap=ae.alphaMap,Ct.alphaTest=ae.alphaTest,Ct.transparent=ae.transparent,Ct.opacity=ae.opacity,Ct.side=ae.side,di!==Yi(Ct)&&(Ct.needsUpdate=!0)}})}for(let j of Object.keys(Qe.current))if(!I.has(j)){for(let[U,W]of Object.entries(Qe.current[j]))W&&Xr(W,xr(U));delete Qe.current[j]}R()},[t,z,fe,et,ze,ke,n,Ie,Xe,R]);let ft=It(new Map);qe(()=>{let I=ft.current,j=new Set([...I.keys(),...ne.keys()]),U=!1;for(let W of j){let $=I.get(W),ee=ne.get(W),se=!!$?.emissive!=!!ee?.emissive,tt=!!$?.matcap!=!!ee?.matcap;if(!se&&!tt)continue;U=!0;let Oe=fe[W],Ge=ke[W];Oe&&Gt(Oe,(je,Je)=>{let ae=je.userData.reactImmersiveConfiguredEmissive;se&&ae?.isColor&&(je.emissive.copy(ae),ee?.emissive&&je.emissive.add(Wn));let He=Ks(Ge,Je);tt&&He&&(ee?.matcap?He.color.set(Wr.color):He.color.copy(je.color))})}ft.current=ne,U&&R()},[ne,fe,ke,R]),vf({objectBindings:t,nodeMap:z,invalidate:R});let Ve=yt(()=>Object.entries(S).map(([I,j])=>({key:I,color:new XM(j.color),speed:j.speed})),[S]),pt=It(new Set);qe(()=>{let I=new Set(Ve.map(({key:j})=>j));for(let j of pt.current){if(I.has(j)||!fe[j])continue;let U=be.current.get(j)?.emissive;Gt(fe[j],W=>{let $=W.userData.reactImmersiveConfiguredEmissive;$?.isColor&&(W.emissive.copy($),U&&W.emissive.add(Wn))})}pt.current=I,R()},[Ve,fe,R]),Qs(({clock:I})=>{if(Ve.length===0)return;let j=I.getElapsedTime();for(let{key:U,color:W,speed:$}of Ve){let ee=fe[U];if(!ee)continue;let se=(1-Math.cos(2*Math.PI*$*j))/2,tt=be.current.get(U)?.emissive;Gt(ee,Oe=>{let Ge=Oe.userData.reactImmersiveConfiguredEmissive;Ge?.isColor&&(Oe.emissive.copy(Ge).lerp(W,se),tt&&Oe.emissive.add(Wn))})}R()}),qe(()=>{if(Xe==="uv-checker")return;let I=new Set(Object.values(St)),j=!1;V.traverse(U=>{if(!_t(U)||I.has(U)||!H.has(U))return;let W=Te?.get(U)??H.get(U);U.material!==W&&(U.material=W,j=!0)}),j&&R()},[V,St,H,Te,Xe,R]),qe(()=>{if(Xe!=="uv-checker")return;let I=xm(),j=[];return V.traverse(U=>{if(!_t(U)||U.userData[qn])return;let W=U.material,$=Array.isArray(W)?W:[W],ee=!!U.geometry.getAttribute("uv"),se=$.map((Oe,Ge)=>{let je=new Tu({color:ee?"#ffffff":"#ff00ff",map:ee?I:null,side:Oe.side});return je.name=`${U.name||"mesh"}-uv-checker-${Ge}`,je.toneMapped=!1,je}),tt=Array.isArray(W)?se:se[0];U.material=tt,j.push({node:U,original:W,diagnostic:tt})}),R(),()=>{for(let{node:U,original:W,diagnostic:$}of j){U.material=W;let ee=Array.isArray($)?$:[$];for(let se of ee)se.dispose()}R()}},[V,Xe,R]),qe(()=>{if(!Qt)return;let I=[];for(let[j,U]of Object.entries(t)){let W=U.modelObjectId??j,$=z[W];if(!_t($))continue;let ee=new Tu({color:J,wireframe:!0,transparent:!0,opacity:cr,depthTest:!1,depthWrite:!1,side:KM,toneMapped:!1}),se=$.clone(!1);se.name="",se.position.set(0,0,0),se.quaternion.identity(),se.scale.set(1,1,1),se.matrix.identity(),se.matrixAutoUpdate=!0,se.material=ee,se.castShadow=!1,se.receiveShadow=!1,se.frustumCulled=!1,se.renderOrder=1,se.userData={isWireframeOverlay:!0},se.raycast=()=>{},$.morphTargetInfluences&&(se.morphTargetInfluences=$.morphTargetInfluences),$.add(se),I.push({node:$,overlay:se})}return R(),()=>{for(let{node:j,overlay:U}of I)j.remove(U),U.material.dispose()}},[Qt,J,cr,z,t,R]);let X=yt(()=>vg(O.animations),[O.animations]),ue=It(l);ue.current=l;let le=It(f);le.current=f;let Le=It(null),De=It(new Set),Me=It(0),Be=I=>{De.current.forEach(j=>j(I))};qe(()=>{let I=Mg({root:V,clips:X,getClipConfig:U=>zh(le.current,U),onChange:()=>{Be(I.getState()),R()}});Le.current=I,ue.current?.({clips:X.map(({sourceName:U})=>U),clipDetails:X.map(({sourceName:U,duration:W})=>({sourceName:U,duration:W})),play:I.play,pause:I.pause,stop:I.stop,setSpeed:I.setSpeed,seek:I.seek,getState:I.getState,subscribe:U=>(De.current.add(U),U(I.getState()),()=>{De.current.delete(U)})}),Be(I.getState());let j=le.current?.animations.autoplayClip;return j&&I.play(j),()=>{I.dispose(),Le.current=null,Be(I.getState())}},[V,X]),qe(()=>{f?.animations&&Le.current?.applyClipConfigs()},[f?.animations]),Qs((I,j)=>{let U=Le.current;if(U?.isRunning()){if(U.update(j),!M)for(let[W,$]of dt.current)el(W,$,pe);R(),Me.current+=j,Me.current>=.066&&(Me.current=0,Be(U.getState()),Lc(V))}});let re=yt(()=>(f?.model.rotation??[0,0,0]).map(I=>I*Math.PI/180),[f?.model.rotation]);Qs((I,j)=>{if(!w.current)return;let U=w.current.rotation;U.x=Zs.lerp(U.x,re[0],1-Math.exp(-5*j)),U.y=Zs.lerp(U.y,re[1],1-Math.exp(-5*j)),U.z=Zs.lerp(U.z,re[2],1-Math.exp(-5*j)),Math.abs(U.x-re[0])<1e-4&&Math.abs(U.y-re[1])<1e-4&&Math.abs(U.z-re[2])<1e-4||R()});let Se=It([]),Ae=It(0),ht=It(0),Jt=yt(()=>new ei,[]);qe(()=>{let I=new Map;for(let[Oe,Ge]of Object.entries(t)){let je=z[Ge.modelObjectId??Oe];je&&I.set(je,Ge)}for(let Oe of Se.current)el(Oe.node,I.get(Oe.node)?.transform,pe);ht.current=0,V.updateWorldMatrix(!0,!0);let j=new Js().setFromObject(V),U=j.getCenter(new ei),W=j.getSize(new ei).length()*.5;Ae.current=Number.isFinite(W)?W:0;let $=[...I.keys()],ee=new Set($),se=[],tt=new ei;for(let Oe of $){if(!Oe.parent)continue;let Ge=Oe.parent,je=!1;for(;Ge;){if(ee.has(Ge)){je=!0;break}Ge=Ge.parent}if(je)continue;let Je=new Js().setFromObject(Oe);if(Je.isEmpty())continue;Je.getCenter(tt);let ae=tt.clone().sub(U);ae.lengthSq()<1e-8||(ae.normalize(),se.push({node:Oe,restLocalPos:Oe.position.clone(),restWorldPos:Oe.getWorldPosition(new ei),worldDir:ae,parentInverse:new JM().copy(Oe.parent.matrixWorld).invert()}))}Se.current=se,R()},[V,z,Ee,Ke,pe,R]),qe(()=>{R()},[N,R]),Qs((I,j)=>{let U=Se.current;if(U.length===0)return;let W=Math.min(Math.max(N,0),1),$=ht.current;if(Math.abs($-W)<1e-4){if($===W)return;ht.current=W}else ht.current=Zs.lerp($,W,1-Math.exp(-6*j)),R();let ee=ht.current*Ae.current;for(let se of U)Jt.copy(se.worldDir).multiplyScalar(ee).add(se.restWorldPos).applyMatrix4(se.parentInverse),se.node.position.copy(Jt)});let it=I=>{let j=I;for(;j;){let U=Go(j),W=U?Ue[U]:void 0;if(W&&t[W])return[W,t[W]];j=j.parent}return null},kt=I=>{let j=it(I);if(!j)return null;let[U,W]=j;return z[W.modelObjectId??U]??null},jr=Ms(I=>{let j=it(I);return j&&j[1].selectable!==!1?j[1]:null},s,kt),Zt=I=>{if(jr.consumeClick())return;let j=it(I.object);if(!j)return;let[,U]=j;U.selectable!==!1&&(I.stopPropagation(),i(U,Gi(I,kt(I.object))))},Dn=I=>{let j=it(I.object);if(!j)return;let[,U]=j;if(U.selectable===!1)return;a?.(U,Gi(I,kt(I.object)))&&I.stopPropagation()},za=I=>{if(!y)return;let j=it(I.object);if(!j)return;let[U,W]=j;W.hoverable!==!1&&(I.stopPropagation(),A("pointer"),T(U),o?.(W))},gt=I=>{y&&(I.stopPropagation(),k(),T(null),o?.(null))},Pr=yt(()=>!Ah(V),[V]);return _g("group",{ref:w,children:_g("primitive",{object:V,...Pr?{onClick:Zt,onDoubleClick:Dn,...s?{onPointerDown:jr.onPointerDown}:{},...y?{onPointerOver:za,onPointerOut:gt}:{}}:{}})})}import{useCallback as En,useEffect as An,useMemo as hT,useRef as At,useState as md}from"react";import{useFrame as mT,useThree as fT}from"@react-three/fiber";import{Box3 as Ig,BoxGeometry as xS,Group as Lg,Matrix4 as Bg,Mesh as wS,MeshBasicMaterial as MS,Vector3 as Qr}from"three";import{Euler as tS,Matrix4 as ti,MeshBasicMaterial as rS,MeshMatcapMaterial as nS,MeshNormalMaterial as iS,MeshStandardMaterial as oS,Quaternion as aS,Vector3 as la}from"three";function Ag(e){let t={};for(let[r,n]of Object.entries(e))t[n.modelObjectId??r]=r;return t}function Eu(e){let t=e,r=null;for(;t;){let n=t.userData?.ri_name;if(typeof n=="string"&&n)return n;!r&&t.name&&(r=t.name),t=t.parent}return r}function Rg(e,t){return e||(t?t.modelObjectId??t.id:null)}function nl(e,t){let r=Eu(e);if(!r)return null;let n=t.keyByModelObject[r]??r,i=t.objectBindings[n];return i?{key:n,binding:i}:null}var Ki=new la,Pu=new la,sS=new ti,Pg=new ti,tl=new ti,lS=new ti,rl=new ti,cS=new ti,uS=new ti,dS=new la,pS=new la,Mn=new la,Eg=new aS,hS=new tS;function mS(e,t,r,n,i){let o=!!(r?.position||r?.rotation||r?.scale),a=!!(i&&i.factor>0&&i.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}Pg.compose(t.position,Eg.setFromEuler(t.rotation),t.scale);let s=r?.rotation;tl.compose(dS.fromArray(r?.position??[0,0,0]),Eg.setFromEuler(hS.set(s?.[0]??0,s?.[1]??0,s?.[2]??0)),pS.fromArray(r?.scale??[1,1,1])),tl.premultiply(n).multiply(lS.copy(n).invert()),e.parent?.updateWorldMatrix(!0,!1);let c=e.parent?.matrixWorld??sS;if(rl.multiplyMatrices(c,Pg).premultiply(tl),a&&i){let l=e;for(;l.parent&&!l.userData.ri_name;)l=l.parent;let p=l.userData.ri_center;Array.isArray(p)&&p.length===3?Mn.fromArray(p).applyMatrix4(n).applyMatrix4(tl):Mn.setFromMatrixPosition(rl),Mn.sub(i.centre),Mn.lengthSq()>1e-8&&(Mn.normalize().multiplyScalar(i.factor*i.radius),rl.premultiply(uS.makeTranslation(Mn.x,Mn.y,Mn.z)))}e.matrixAutoUpdate=!1,e.matrix.multiplyMatrices(cS.copy(c).invert(),rl),e.matrixWorldNeedsUpdate=!0,e.updateWorldMatrix(!1,!1)}function il(e,t){if(!_t(e)&&!e.userData.riLogicalObject)return;let r=nl(e,t);if(!r)return;let n=kg(e);if(n.rest??(n.rest={position:e.position.clone(),rotation:e.rotation.clone(),scale:e.scale.clone()}),t.suspendTransforms)return;if(t.placementFrame&&!e.userData.riLogicalObject){mS(e,n.rest,r.binding.transform,t.placementFrame,t.explode);return}let i=n.rest,o=r.binding.transform;o?.position?e.position.fromArray(o.position):e.position.copy(i.position),o?.rotation?e.rotation.set(o.rotation[0],o.rotation[1],o.rotation[2],i.rotation.order):e.rotation.copy(i.rotation),o?.scale?e.scale.fromArray(o.scale):e.scale.copy(i.scale);let a=t.explode;if(a&&a.factor>0&&a.radius>0){e.updateWorldMatrix(!0,!1),Pu.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?Ki.fromArray(c).applyMatrix4(e.matrixWorld).sub(a.centre):Ki.copy(Pu).sub(a.centre),Ki.lengthSq()>1e-8&&(Ki.normalize().multiplyScalar(a.factor*a.radius).add(Pu),e.parent&&e.parent.worldToLocal(Ki),e.position.copy(Ki))}e.updateMatrix(),e.updateWorldMatrix(!0,!1)}function Qi(e,t){e.traverse(r=>il(r,t))}function kg(e){var t;return(t=e.userData).riVisuals??(t.riVisuals={}),e.userData.riVisuals}function fS(e,t,r,n){return JSON.stringify([e?.style?.material??null,t??null,r.shadingMode,r.rendererMode,n])}function gS(e){if(e.textures){for(let t of gn){let r=e.textures[t];r&&Xr(r,xr(t))}e.textures=void 0}}function bS(e,t,r){let n=e.textures??{};for(let i of gn){let o=$e(t,i),a=n[i];if(a===o)continue;let s=xr(i);a&&Xr(a,s),o?(ji(o,s,r),n[i]=o):delete n[i]}e.textures=Object.keys(n).length>0?n:void 0}function yS(e,t){if(t.shadingMode==="normals")return Or(e,()=>new iS);if(t.shadingMode==="unlit")return Or(e,r=>{let n=new rS;return n.color.copy(r.color),n.map=r.map,n.alphaMap=r.alphaMap,n.alphaTest=r.alphaTest,n.transparent=r.transparent,n.opacity=r.opacity,n.side=r.side,n});if(t.rendererMode==="matcap"){let r=ys();return Or(e,n=>{let i=new nS;return i.matcap=r,i.color.copy(n.color),i.alphaMap=n.alphaMap,i.alphaTest=n.alphaTest,i.side=n.side,i})}return e}function vS(e,t){if(!_t(e))return;let n=kg(e);n.original??(n.original=sa(e));let i=nl(e,t);if(!i){n.original&&(e.material=n.original),e.visible=!0;return}let{key:o,binding:a}=i;e.visible=a.visible!==!1,il(e,t);let s=t.itemMaterials?.[o]?.hex??t.itemMaterials?.[a.modelObjectId??o]?.hex,c=t.highlightOnHover!==!1&&o===t.hoveredKey,l=fS(a,s,t,c);if(n.signature===l&&n.display){e.material=n.display;return}let p=a.style?.material;if(bS(n,p,t.invalidate),!n.physical){let d=n.original??sa(e);if(!d)return;n.physical=Or(d,m=>{let h=cs(m),f=us(h??new oS);return ds(f),f})}Gt(n.physical,d=>{Ys(d,p,s??p?.baseColor),c&&(d.emissive.add(Wn),d.color.lerp(mm,fm)),d.needsUpdate=!0}),n.display&&n.display!==n.physical&&Gt(n.display,d=>d.dispose()),n.display=yS(n.physical,t),n.signature=l,e.material=n.display}function Dg(e,t){e.traverse(r=>vS(r,t))}function Au(e){e.traverse(t=>{if(!_t(t))return;let r=t.userData.riVisuals;r&&(r.rest&&(t.matrixAutoUpdate=!0,t.position.copy(r.rest.position),t.rotation.copy(r.rest.rotation),t.scale.copy(r.rest.scale),t.updateMatrix()),r.original&&(t.material=r.original),r.display&&r.display!==r.physical&&Gt(r.display,n=>n.dispose()),r.physical&&Gt(r.physical,n=>n.dispose()),gS(r),delete t.userData.riVisuals)})}var zg=new Bg().makeRotationX(Math.PI/2),Og=zg.clone().invert();function SS(e){let t=new Qr(e[0],e[1],e[2]),r=new Qr(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 Ig(t.clone().sub(r),t.clone().add(r))}function CS(e){let t=e.getCenter(new Qr),r=e.getSize(new Qr).multiplyScalar(.5);return[t.x,t.y,t.z,r.x,0,0,0,r.y,0,0,0,r.z]}var ol=class{constructor(){this.group=new Lg;this.objects=new Map;this.geometry=new xS(1,1,1);this.material=new MS;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 r of t){let n=new Ig(new Qr(...r.minimum),new Qr(...r.maximum)).applyMatrix4(Og),i=new Lg;i.name=r.name,i.userData.ri_name=r.name,i.userData.riLogicalObject=!0,i.userData.ri_center=n.getCenter(new Qr).toArray();let o=new wS(this.geometry,this.material);o.visible=!1,o.raycast=()=>{},o.position.copy(n.getCenter(new Qr)),o.scale.copy(n.getSize(new Qr)),i.add(o),this.group.add(i),this.objects.set(r.name,i)}this.signature="",this.lastContext=null}nodesByBinding(t){let r={};for(let[n,i]of this.objects){let o=t.keyByModelObject[n]??n;t.objectBindings[o]&&(r[o]=i)}return r}sync(t,r,n=!1){if(!n&&!this.lastDragging&&t===this.lastContext&&this.lastEffective)return this.lastEffective;this.lastContext=t,this.lastDragging=n;let i={...t,suspendTransforms:!1},o=r?t.objectBindings[r]:void 0,a=o?this.objects.get(o.modelObjectId??r):void 0;n&&a&&o&&(i={...i,objectBindings:{...t.objectBindings,[r]:{...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())n&&c===a||il(c,i);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 Bg)||this.transforms.set(c,zg.clone().multiply(l.matrix).multiply(Og))}return this.lastEffective=i,i}updateBounds(t){if(!t)return;let r=n=>{if(this.tileVersions.get(n)!==this.version){if(n.boundingVolume.box&&this.tileVersions.get(n)!==this.version){let i=this.originalBounds.get(n);i||(i={box:[...n.boundingVolume.box],error:n.geometricError},this.originalBounds.set(n,i));let o=SS(i.box),a=o.clone(),s=1;for(let l of n.extras?.featureIds??[]){let p=this.transforms.get(l);p&&(a.union(o.clone().applyMatrix4(p)),s=Math.max(s,p.getMaxScaleOnAxis()))}let c=CS(a);n.boundingVolume.box=c,n.geometricError=i.error*s,n.engineData?.boundingVolume?.setObbData(c,n.engineData.transform),this.tileVersions.set(n,this.version)}n.children?.forEach(r)}};r(t)}dispose(){this.group.clear(),this.objects.clear(),this.geometry.dispose(),this.material.dispose()}};var Ru=Object.freeze({factor:1,loosened:!1,tooFine:0,raisedAt:-1/0,changedAt:-1/0}),ca=16,ku=1.25,TS=1.5,_S=1.25,PS=500,ES=3e3,Ng=5e3,jg=2e3,AS=.9;function Vg(e){return e.full&&(e.wanting||e.usage>1)}function Fg(e){return e.loosened?ES:PS}function Ug(e){let t=e.factor/_S;return t<=1+1e-6?1:t}function Gg(e,t){return e.factor>1&&!e.loosened&&!t.full&&!t.wanting&&t.usage<AS&&Ug(e)>e.tooFine}function Hg(e,t){let{now:r}=t,n=t.moved&&e.tooFine>0?{...e,tooFine:0}:e;if(Vg(t)){if(r-n.changedAt<Fg(n))return n;let i=Math.max(n.tooFine,n.factor);return n.factor>=ca?n.loosened&&n.tooFine===i?n:{...n,loosened:!0,tooFine:i,changedAt:r}:{factor:Math.min(ca,n.factor*TS),loosened:!0,tooFine:i,raisedAt:r,changedAt:r}}return n.loosened&&!t.wanting?{...n,loosened:!1,changedAt:r}:Gg(n,t)&&r-n.raisedAt>=Ng&&r-n.changedAt>=jg?{...n,factor:Ug(n),changedAt:r}:n}function Wg(e,t){let{now:r}=t;return Vg(t)?e.factor>=ca&&e.loosened?null:Math.max(0,Fg(e)-(r-e.changedAt)):e.loosened&&!t.wanting?0:Gg(e,t)?Math.max(0,Ng-(r-e.raisedAt),jg-(r-e.changedAt)):null}function Yg(e){try{let t=typeof location<"u"?location.href:void 0;return new URL(e,t).origin}catch{return null}}function Du(e){if(!e)return null;let t=e.length,r=e.indexOf("?"),n=e.indexOf("#");r!==-1&&(t=Math.min(t,r)),n!==-1&&(t=Math.min(t,n));let i=e.lastIndexOf(".",t),o=e.lastIndexOf("/",t),a=e.indexOf("://");return a!==-1&&a+2===o||i===-1||i<o?null:e.substring(i+1,t)||null}var sl,ua=(sl=class{static setXRSession(e){e!==this.session&&(this.flushPending(),this.session=e)}static requestAnimationFrame(e){let{session:t,pending:r}=this,n,i=()=>{r.delete(n),e()};return n=t?t.requestAnimationFrame(i):requestAnimationFrame(i),r.set(n,e),n}static cancelAnimationFrame(e){let{pending:t,session:r}=this;t.delete(e),r?r.cancelAnimationFrame(e):cancelAnimationFrame(e)}static flushPending(){this.pending.forEach((e,t)=>{e(),this.cancelAnimationFrame(t)})}},Rc(sl,"pending",new Map),Rc(sl,"session",null),sl),Xg=2**30,ha=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,r)=>{let n=e(t),i=e(r);return n<i?-1:+(n>i)}):this._unloadPriorityCallback=e}constructor(){this.minSize=6e3,this.maxSize=8e3,this.minBytesSize=.3*Xg,this.maxBytesSize=.4*Xg,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:r,itemSet:n}=this;n.has(e)&&(this.cachedBytes-=r.get(e)||0,r.set(e,t),this.cachedBytes+=t)}add(e,t){let r=this.itemSet;if(r.has(e)||this.isFull())return!1;let n=this.usedSet,i=this.itemList,o=this.callbacks;return i.push(e),n.add(e),r.set(e,Date.now()),o.set(e,t),!0}has(e){return this.itemSet.has(e)}remove(e){let t=this.usedSet,r=this.itemSet,n=this.itemList,i=this.bytesMap,o=this.callbacks,a=this.loadedSet;if(r.has(e)){this.cachedBytes-=i.get(e)||0,i.delete(e),o.get(e)(e);let s=n.indexOf(e);return n.splice(s,1),t.delete(e),r.delete(e),o.delete(e),a.delete(e),!0}return!1}setLoaded(e,t){let{itemSet:r,loadedSet:n}=this;r.has(e)&&(t===!0?n.add(e):n.delete(e))}markUsed(e){let t=this.itemSet,r=this.usedSet;t.has(e)&&!r.has(e)&&(t.set(e,Date.now()),r.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:r,itemList:n,itemSet:i,usedSet:o,loadedSet:a,callbacks:s,bytesMap:c,minBytesSize:l,maxBytesSize:p}=this,d=n.length-o.size,m=n.length-a.size,h=Math.max(Math.min(n.length-t,d),0),f=this.cachedBytes-l,g=this.unloadPriorityCallback||this.defaultPriorityCallback,y=!1,x=h>0&&d>0||m&&n.length>r;if(d&&this.cachedBytes>l||m&&this.cachedBytes>p||x){n.sort((R,P)=>{let T=o.has(R);if(T===o.has(P)){let w=a.has(R);return w===a.has(P)?-g(R,P):w?1:-1}else return T?1:-1});let C=Math.max(t*e,h*e),v=Math.ceil(Math.min(C,d,h)),N=Math.max(e*f,e*l),M=Math.min(N,f),S=0,O=0;for(;this.cachedBytes-O>p||n.length-S>r;){let R=n[S],P=c.get(R)||0;if(o.has(R)&&a.has(R)||this.cachedBytes-O-P<p&&n.length-S<=r)break;O+=P,S++}for(;O<M||S<v;){let R=n[S],P=c.get(R)||0;if(o.has(R)||this.cachedBytes-O-P<l&&S>=v)break;O+=P,S++}n.splice(0,S).forEach(R=>{this.cachedBytes-=c.get(R)||0,s.get(R)(R),c.delete(R),i.delete(R),s.delete(R),a.delete(R),o.delete(R)}),y=S<h||O<f&&S<d,y&&(y=S>0)}y&&(this.unloadingHandle=ua.requestAnimationFrame(()=>this.scheduleUnload()))}scheduleUnload(){ua.cancelAnimationFrame(this.unloadingHandle),this.scheduled||(this.scheduled=!0,queueMicrotask(()=>{this.scheduled=!1,this.unloadUnusedContent()}))}},RS=class extends DOMException{constructor(){super("PriorityQueue: Item removed","AbortError")}},Ir=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=>{ua.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 r={callback:t,reject:null,resolve:null,promise:null};return r.promise=new Promise((n,i)=>{let o=this.items,a=this.callbacks;r.resolve=n,r.reject=i,o.unshift(e),a.set(e,r),this.autoUpdate&&this.scheduleJobRun()}),r.promise}remove(e){let t=this.items,r=this.callbacks,n=t.indexOf(e);if(n!==-1){let i=r.get(e);i.promise.catch(o=>{if(o.name!=="AbortError")throw o}),i.reject(new RS),t.splice(n,1),r.delete(e)}}removeByFilter(e){let{items:t}=this;for(let r=0;r<t.length;r++){let n=t[r];e(n)&&(this.remove(n),r--)}}tryRunJobs(){this.sort();let e=this.items,t=this.callbacks,r=this.maxJobs,n=0,i=()=>{this.currJobs--,this.autoUpdate&&this.scheduleJobRun()};for(;r>this.currJobs&&e.length>0&&n<r;){this.currJobs++,n++;let o=e.pop(),{callback:a,resolve:s,reject:c}=t.get(o);t.delete(o);let l;try{l=a(o)}catch(p){c(p),i();continue}l instanceof Promise?l.then(s).catch(c).finally(i):(s(l),i())}}flush(e){let{items:t,callbacks:r}=this,n=t.indexOf(e);if(!r.has(e))return;let{callback:i,resolve:o,reject:a}=r.get(e);r.delete(e),t.splice(n,1);let s;try{s=i(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))}},dl=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,r,n=null){this.originQueues.forEach((c,l)=>{c.running||this.originQueues.delete(l)});let i=e===null?null:Yg(e),o=this.originQueues.get(i);o||(o=new Ir,o.maxJobs=this._maxJobsPerOrigin,o.priorityCallback=this._priorityCallback,this.originQueues.set(i,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,r);return n!==null&&(n.aborted?this.remove(t):n.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 ii=6378137,kS=1/298.257223563,Ou=6356752314245179e-9,al={inView:!1,error:1/0,distanceFromCamera:1/0};function pl(e){return e===4||e===-1}function Jr(e,t){return hl(e)&&e.traversal.lastFrameVisited===t&&e.traversal.used}function hl(e){return!!e.traversal}function ma(e){let{children:t}=e,r=t.length===0||hl(t[t.length-1]),n=!e.internal.hasUnrenderableContent||pl(e.internal.loadingState);return r&&n}function ri(e){return e.traversal.unconditionallyRefine}function da(e,t){if(hl(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,al),e.traversal.inFrustum=al.inView,e.traversal.error=al.error,e.traversal.distanceFromCamera=al.distanceFromCamera,e.traversal.unconditionallyRefine=e.internal.hasUnrenderableContent,!e.traversal.unconditionallyRefine))){let r=e.parent;for(;r&&r.traversal.unconditionallyRefine;)r=r.parent;r&&r.geometricError<=e.geometricError&&(e.traversal.unconditionallyRefine=!0)}}function Lu(e,t,r=!1){if(da(e,t),r?t.markTileUsed(e):ll(e),ri(e)&&ma(e)){let n=e.children;for(let i=0,o=n.length;i<o;i++)Lu(n[i],t,r)}}function Kg(e,t){if(da(e,t),e.traversal.usedLastFrame&&(ll(e),e.traversal.wasSetActive&&(e.traversal.active=!0),(!e.traversal.active||ri(e))&&ma(e))){let r=e.children;for(let n=0,i=r.length;n<i;n++)Kg(r[n],t)}}function ll(e){e.traversal.used=!0}function DS(e,t){return!(e.traversal.error<=t.errorTarget&&!ri(e)||t.maxDepth>0&&e.internal.depth+1>=t.maxDepth||!ma(e))}function Qg(e,t){let{frameCount:r}=t,{children:n}=e;for(let i=0,o=n.length;i<o;i++){let a=n[i];Jr(a,r)&&(a.traversal.active&&(a.traversal.kicked=!0,a.traversal.active=!1),Qg(a,t))}}function $g(e){return!ri(e)&&(!e.internal.hasContent||pl(e.internal.loadingState))}function Jg(e,t){if(da(e,t),!e.traversal.inFrustum)return;let r=e.parent;if(r&&r.refine==="ADD"&&e.geometricError>0&&e.traversal.error*(r.geometricError/e.geometricError)<=t.errorTarget)return;if(!DS(e,t)){ll(e);return}let n=!1,i=!1,o=e.children;for(let a=0,s=o.length;a<s;a++){let c=o[a];Jg(c,t),n||(n=Jr(c,t.frameCount)),i||(i=c.traversal.inFrustum)}if(e.refine==="REPLACE"&&!i&&o.length!==0){e.traversal.inFrustum=!1,t.markTileUsed(e);for(let a=0,s=o.length;a<s;a++)Lu(o[a],t,!0);return}if(ll(e),e.refine==="REPLACE"&&n&&(t.loadSiblings||t.loadAncestors))for(let a=0,s=o.length;a<s;a++)Lu(o[a],t)}function Zg(e,t){let r=t.frameCount;if(!Jr(e,r))return;let n=e.children,i=!1;for(let a=0,s=n.length;a<s;a++){let c=n[a];i||(i=Jr(c,r))}if(!i)e.traversal.isLeaf=!0;else{for(let s=0,c=n.length;s<c;s++)Zg(n[s],t);let a=!0;for(let s=0,c=n.length;s<c;s++){let l=n[s];if(Jr(l,r)){let p=!ri(l),d=!l.internal.hasContent||pl(l.internal.loadingState);p&&d||l.traversal.allChildrenLoaded||(a=!1)}}e.traversal.allChildrenLoaded=a}let o=!0;for(let a=0,s=n.length;a<s;a++){let c=n[a];Jr(c,t.frameCount)&&!c.traversal.allUsedChildrenProcessed&&(o=!1)}e.traversal.allUsedChildrenProcessed=o&&ma(e)}function eb(e,t){if(!Jr(e,t.frameCount))return;let r=e.children;if(e.refine==="REPLACE"&&t.loadAncestors&&!e.traversal.allChildrenLoaded&&!ri(e)&&(e.traversal.isLeaf=!0),e.traversal.isLeaf){if(!ri(e)&&(e.traversal.active=!0,ma(e)&&e.internal.hasContent&&!pl(e.internal.loadingState)))for(let i=0,o=r.length;i<o;i++)Kg(r[i],t);return}let n=r.length>0;for(let i=0,o=r.length;i<o;i++){let a=r[i];eb(a,t),Jr(a,t.frameCount)&&!(a.traversal.active&&$g(a))&&!a.traversal.allChildrenReady&&(n=!1)}e.traversal.allChildrenReady=n,e.refine==="REPLACE"&&!n&&e.traversal.wasSetActive&&$g(e)&&(e.traversal.active=!0,Qg(e,t))}function tb(e,t){da(e,t);let r=Jr(e,t.frameCount);if(r&&(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++),r||hl(e)&&e.traversal.usedLastFrame){let n=!1,i=!1;r?(n=e.traversal.active,i=t.displayActiveTiles&&e.traversal.active||e.traversal.visible):da(e,t),e.internal.hasRenderableContent&&e.internal.loadingState===4?(n&&t.stats.active++,i&&t.stats.visible++,e.traversal.wasSetActive!==n&&t.invokeOnePlugin(a=>a.setTileActive&&a.setTileActive(e,n)),e.traversal.wasSetVisible!==i&&t.invokeOnePlugin(a=>a.setTileVisible&&a.setTileVisible(e,i))):e.internal.hasRenderableContent||(i=e.traversal.isLeaf,e.traversal.wasSetVisible!==i&&t.invokeOnePlugin(a=>a.setEmptyTileVisible&&a.setEmptyTileVisible(e,i))),e.traversal.visible=i,e.traversal.active=n;let o=e.children;for(let a=0,s=o.length;a<s;a++){let c=o[a];tb(c,t)}}}function LS(e,t){Jg(e,t),Zg(e,t),eb(e,t),tb(e,t)}function OS(e){let t=null;return()=>{t===null&&(t=ua.requestAnimationFrame(()=>{t=null,e()}))}}function IS(e,t=null,r=null){let n=[];for(n.push(e),n.push(null),n.push(0);n.length>0;){let i=n.pop(),o=n.pop(),a=n.pop();if(t&&t(a,o,i)){r&&r(a,o,i);return}let s=a.children;if(s)for(let c=s.length-1;c>=0;c--)n.push(s[c]),n.push(a),n.push(i+1);r&&r(a,o,i)}}var qg=Symbol("PLUGIN_REGISTERED"),Sn={inView:!0,error:0,distance:1/0},BS=(e,t)=>{let r=e.priority||0,n=t.priority||0;return r===n?!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:r>n?1:-1},zS=(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,NS=(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,Ji=(e,t)=>{let r=e.priority??1/0,n=t.priority??1/0;if(r!==n)return r>n?1:-1;if(!e.internal||!t.internal)return 0;let i=e.internal.renderer,o=t.internal.renderer,a=!i.loadAncestors,s=!o.loadAncestors;return a&&s?zS(e,t):BS(e,t)},Iu=new ha;Iu.unloadPriorityCallback=NS;var pa=new dl;pa.maxJobsPerOrigin=25,pa.priorityCallback=Ji;var cl=new Ir;cl.maxJobs=5,cl.priorityCallback=Ji;var ul=new Ir;ul.maxJobs=25,ul.priorityCallback=(e,t)=>{let r=e.parent,n=t.parent;return r===n?0:r?n?Ji(r,n):-1:1};var Bu=class{get root(){let e=this.rootTileset;return e?e.root:null}get loadProgress(){let{stats:e,isLoading:t}=this,r=e.queued+e.downloading+e.parsing,n=e.inCacheSinceLoad+ +!!t;return n===0?1:1-r/n}get downloadQueue(){return this._downloadQueue}set downloadQueue(e){if(e instanceof Ir){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=Iu,this.downloadQueue=pa,this.parseQueue=cl,this.processNodeQueue=ul,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=OS(()=>{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[qg]===!0)throw Error("TilesRendererBase: A plugin can only be registered to a single tileset");let t=this.plugins,r=e.priority||0,n=t.length;for(let i=0;i<t.length;i++)if((t[i].priority||0)>r){n=i;break}t.splice(n,0,e),e[qg]=!0,e.init&&e.init(this)}unregisterPlugin(e){let t=this.plugins;if(typeof e=="string"&&(e=this.getPluginByName(e)),t.includes(e)){let r=t.indexOf(e);return t.splice(r,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 r=0;r<t.length;r++){let n=e(t[r]);if(n)return n}return null}invokeAllPlugins(e){let t=[...this.plugins,this],r=[];for(let n=0;n<t.length;n++){let i=e(t[n]);i&&r.push(i)}return r.length===0?null:Promise.all(r)}traverse(e,t,r=!0){this.root&&IS(this.root,(n,...i)=>(r&&this.ensureChildrenArePreprocessed(n,!0),e?e(n,...i):!1),t)}getAttributions(e=[]){return this.invokeAllPlugins(t=>t!==this&&t.getAttributions&&t.getAttributions(e)),e}update(){let{lruCache:e,usedSet:t,stats:r,root:n,downloadQueue:i,parseQueue:o,processNodeQueue:a}=this;if(this.rootLoadingState===0&&(this.rootLoadingState=2,this.invokeOnePlugin(l=>l.loadRootTileset&&l.loadRootTileset()).then(l=>{let p=this.rootURL;p!==null&&this.invokeAllPlugins(d=>p=d.preprocessURL?d.preprocessURL(p,null):p),this.rootLoadingState=4,this.rootTileset=l,this.dispatchEvent({type:"needs-update"}),this.dispatchEvent({type:"load-tileset",tileset:l,url:p}),this.dispatchEvent({type:"load-root-tileset",tileset:l,url:p})}).catch(l=>{this.rootLoadingState=-1,console.error(l),this.rootTileset=null,this.dispatchEvent({type:"load-error",tile:null,error:l,url:this.rootURL})})),!n)return;let s=null;if(this.invokeAllPlugins(l=>{if(l.doTilesNeedUpdate){let p=l.doTilesNeedUpdate();s=s===null?p:!!(s||p)}}),s===!1){this.dispatchEvent({type:"update-before"}),this.dispatchEvent({type:"update-after"});return}this.dispatchEvent({type:"update-before"}),r.inFrustum=0,r.used=0,r.active=0,r.visible=0,r.tilesProcessed=0,this.frameCount++,t.forEach(l=>e.markUnused(l)),t.clear(),this.prepareForTraversal(),LS(n,this),this.removeUnusedPendingTiles();let c=this.queuedTiles;c.sort(e.unloadPriorityCallback);for(let l=0,p=c.length;l<p&&!e.isFull();l++)this.requestTileContents(c[l]);c.length=0,e.scheduleUnload(),(i.running||o.running||a.running)===!1&&this.isLoading===!0&&(this.cachedSinceLoadComplete.clear(),r.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:r,errorFalloffDensity:n}=this;if(r>0&&Number.isFinite(t.distanceFromCamera)){let s=t.distanceFromCamera*n;t.error-=r*(1-Math.exp(-s*s))}let i=null,o=0,a=1/0;this.invokeAllPlugins(s=>{s!==this&&s.calculateTileViewError&&(Sn.inView=!0,Sn.error=0,Sn.distance=1/0,s.calculateTileViewError(e,Sn)&&(i===null&&(i=!0),i&&(i=Sn.inView),Sn.inView&&(a=Math.min(a,Sn.distance),o=Math.max(o,Sn.error))))}),t.inView&&i!==!1?(t.error=Math.max(t.error,o),t.distanceFromCamera=Math.min(t.distanceFromCamera,a)):i?(t.inView=!0,t.error=o,t.distanceFromCamera=a):t.inView=!1}dispose(){[...this.plugins].forEach(r=>{this.unregisterPlugin(r)});let e=this.lruCache,t=[];this.traverse(r=>(t.push(r),!1),null,!1);for(let r=0,n=t.length;r<n;r++)e.remove(t[r]);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,r){return null}prepareForTraversal(){}disposeTile(e){e.traversal.visible&&(e.internal.hasRenderableContent?this.invokeOnePlugin(r=>r.setTileVisible&&r.setTileVisible(e,!1)):this.invokeOnePlugin(r=>r.setEmptyTileVisible&&r.setEmptyTileVisible(e,!1)),e.traversal.visible=!1),e.traversal.active&&e.internal.hasRenderableContent&&this.invokeOnePlugin(r=>r.setTileActive&&r.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,r=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=r,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 n=Du(e.content.uri),i=!!(n&&/json$/.test(n));e.internal.hasContent=!0,e.internal.hasUnrenderableContent=i,e.internal.hasRenderableContent=!i}else e.internal.hasContent=!1,e.internal.hasUnrenderableContent=!1,e.internal.hasRenderableContent=!1;r?(e.internal.depth=r.internal.depth+1,e.internal.depthFromRenderedParent=r.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},r===null?e.refine=e.refine||"REPLACE":e.refine=e.refine||r.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(n=>{n!==this&&n.preprocessNode&&n.preprocessNode(e,t,r)})}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,r=[];for(let n of t)!e.isUsed(n)&&n.internal.loadingState===1&&r.push(n);for(let n=0;n<r.length;n++)e.remove(r[n])}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 r=e.children;if(r.length===0||r[r.length-1].traversal)return;let n=i=>{for(let o=0,a=i.length;o<a;o++){let s=i[o];s&&!s.traversal&&this.preprocessNode(s,e.internal.basePath,e)}};t?(this.processNodeQueue.remove(e),n(r)):this.processNodeQueue.has(e)||this.processNodeQueue.add(e,i=>{n(i.children),this._dispatchNeedsUpdateEvent()})}getBytesUsed(e){let t=0;return this.invokeAllPlugins(r=>{r.calculateBytesUsed&&(t+=r.calculateBytesUsed(e,e.engineData.scene)||0)}),t}recalculateBytesUsed(e=null){let{lruCache:t,processedTiles:r}=this;e===null?t.itemSet.forEach(n=>{r.has(n)&&t.setMemoryUsage(n,this.getBytesUsed(n))}):t.setMemoryUsage(e,this.getBytesUsed(e))}preprocessTileset(e,t,r=null){let[n,i]=e.asset.version.split(".").map(a=>parseInt(a));console.assert(n<=1,"TilesRenderer: asset.version is expected to be a 1.x or a compatible version."),n===1&&i>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,r)}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,r=null,n=new URL(e.content.uri,e.internal.basePath+"/").toString();this.invokeAllPlugins(m=>n=m.preprocessURL?m.preprocessURL(n,e):n);let i=this.stats,o=this.lruCache,a=this.downloadQueue,s=this.parseQueue,c=this.loadingTiles,l=Du(n),p=new AbortController,d=p.signal;if(o.add(e,m=>{p.abort(),t?m.children.length=0:this.invokeAllPlugins(h=>{h.disposeTile&&h.disposeTile(m)}),i.inCache--,this.cachedSinceLoadComplete.has(e)&&(this.cachedSinceLoadComplete.delete(e),i.inCacheSinceLoad--),m.internal.loadingState===1?i.queued--:m.internal.loadingState===2?i.downloading--:m.internal.loadingState===3?i.parsing--:m.internal.loadingState===4&&i.loaded--,m.internal.loadingState=0,s.remove(m),a.remove(m),c.delete(m)}))return this.isLoading||(this.isLoading=!0,this.dispatchEvent({type:"tiles-load-start"})),o.setMemoryUsage(e,this.getBytesUsed(e)),this.cachedSinceLoadComplete.add(e),i.inCacheSinceLoad++,i.inCache++,i.queued++,e.internal.loadingState=1,c.add(e),a.add(n,e,m=>{if(d.aborted)return Promise.resolve();e.internal.loadingState=2,i.downloading++,i.queued--;let h=this.invokeOnePlugin(f=>f.fetchData&&f.fetchData(n,{...this.fetchOptions,signal:d}));return this.dispatchEvent({type:"tile-download-start",tile:e,url:n,get uri(){return console.warn('tile-download-start event: "uri" has been renamed to "url".'),this.url}}),h}).then(m=>{if(!d.aborted){if(!(m instanceof Response))return m;if(m.ok)return l==="json"?m.json():m.arrayBuffer();throw Error(`Failed to load model with error code ${m.status}`)}}).then(m=>{if(!d.aborted)return i.downloading--,i.parsing++,e.internal.loadingState=3,s.add(e,h=>d.aborted?Promise.resolve():l==="json"&&m.root?(this.preprocessTileset(m,n,e),e.children.push(m.root),r=m,t=!0,Promise.resolve()):this.invokeOnePlugin(f=>f.parseTile&&f.parseTile(m,h,l,n,d)))}).then(()=>{if(d.aborted)return;i.parsing--,i.loaded++,e.internal.loadingState=4,c.delete(e),o.setLoaded(e,!0);let m=this.getBytesUsed(e);if(o.getMemoryUsage(e)===0&&m>0&&o.isFull()){o.remove(e);return}o.setMemoryUsage(e,m),this.dispatchEvent({type:"needs-update"}),t&&this.dispatchEvent({type:"load-tileset",tileset:r,url:n}),e.engineData.scene&&this.dispatchEvent({type:"load-model",scene:e.engineData.scene,tile:e,url:n})}).catch(m=>{d.aborted||(m.name==="AbortError"?o.remove(e):(s.remove(e),a.remove(e),e.internal.loadingState===1?i.queued--:e.internal.loadingState===2?i.downloading--:e.internal.loadingState===3?i.parsing--:e.internal.loadingState===4&&i.loaded--,i.failed++,console.error(`TilesRenderer : Failed to load tile at url "${e.content.uri}".`),console.error(m),e.internal.loadingState=-1,c.delete(e),o.setLoaded(e,!0),this.dispatchEvent({type:"load-error",tile:e,error:m,url:n})))})}};function ni(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 r="";for(let n=0;n<4;n++)r+=String.fromCharCode(t.getUint8(n));return r}var jS=new TextDecoder;function rb(e){return jS.decode(e)}function ml(e){return e.replace(/[\\/][^\\/]+$/,"")+"/"}var Zi=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=ml(e)),this.parse(t)))}resolveExternalURL(e){return new URL(e,this.workingPath).href}parse(e){throw Error("LoaderBase: Parse not implemented.")}};function zu(e,t,r,n,i,o){let a;switch(n){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=r*a;switch(i){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 fa=class{constructor(e,t,r,n){this.buffer=e,this.binOffset=t+r,this.binLength=n;let i=null;if(r!==0){let o=new Uint8Array(e,t,r);i=JSON.parse(rb(o))}else i={};this.header=i}getKeys(){return Object.keys(this.header).filter(e=>e!=="extensions")}getData(e,t,r=null,n=null){let i=this.header;if(!(e in i))return null;let o=i[e];if(!(o instanceof Object)||Array.isArray(o))return o;{let{buffer:a,binOffset:s,binLength:c}=this,l=o.byteOffset||0,p=o.type||n,d=o.componentType||r;if("type"in o&&n&&o.type!==n)throw Error("FeatureTable: Specified type does not match expected type.");let m=s+l,h=zu(a,m,t,p,d,e);if(m+h.byteLength>s+c)throw Error("FeatureTable: Feature data read outside binary body length.");return h}}getBuffer(e,t){let{buffer:r,binOffset:n}=this;return r.slice(n+e,n+e+t)}},VS=class{constructor(e){this.batchTable=e;let t=e.header.extensions["3DTILES_batch_table_hierarchy"];this.classes=t.classes;for(let n of this.classes){let i=n.instances;for(let o in i)n.instances[o]=this._parseProperty(i[o],n.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 n=this.parentCounts.reduce((i,o)=>i+o,0);this.parentIds=this._parseProperty(t.parentIds,n,"parentIds")}else this.parentIds=null;this.instancesIds=[];let r={};for(let n of this.classIds)r[n]=r[n]??0,this.instancesIds.push(r[n]),r[n]++}_parseProperty(e,t,r){if(Array.isArray(e))return e;{let{buffer:n,binOffset:i}=this.batchTable,o=e.byteOffset,a=e.componentType||"UNSIGNED_SHORT";return zu(n,i+o,t,"SCALAR",a,r)}}getDataFromId(e,t={}){let r=this.parentCounts[e];if(this.parentIds&&r>0){let s=0;for(let c=0;c<e;c++)s+=this.parentCounts[c];for(let c=0;c<r;c++){let l=this.parentIds[s+c];l!==e&&this.getDataFromId(l,t)}}let n=this.classIds[e],i=this.classes[n].instances,o=this.classes[n].name,a=this.instancesIds[e];for(let s in i)t[o]=t[o]||{},t[o][s]=i[s][a];return t}},fl=class extends fa{constructor(e,t,r,n,i){super(e,r,n,i),this.count=t,this.extensions={};let o=this.header.extensions;o&&o["3DTILES_batch_table_hierarchy"]&&(this.extensions["3DTILES_batch_table_hierarchy"]=new VS(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 r of this.getKeys())t[r]=super.getData(r,this.count)[e];for(let r in this.extensions){let n=this.extensions[r];n.getDataFromId instanceof Function&&(t[r]=t[r]||{},n.getDataFromId(e,t[r]))}return t}getPropertyArray(e){return super.getData(e,this.count)}},Nu=class extends Zi{parse(e){let t=new DataView(e),r=ni(t);console.assert(r==="b3dm");let n=t.getUint32(4,!0);console.assert(n===1);let i=t.getUint32(8,!0);console.assert(i===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 fa(e.slice(28,28+o+a),0,o,a),p=28+o+a,d=new fl(e.slice(p,p+s+c),l.getData("BATCH_LENGTH"),0,s,c),m=p+s+c;return{version:n,featureTable:l,batchTable:d,glbBytes:new Uint8Array(e,m,i-m)}}},ju=class extends Zi{parse(e){let t=new DataView(e),r=ni(t);console.assert(r==="i3dm");let n=t.getUint32(4,!0);console.assert(n===1);let i=t.getUint32(8,!0);console.assert(i===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),p=new fa(e.slice(32,32+o+a),0,o,a),d=32+o+a,m=new fl(e.slice(d,d+s+c),p.getData("INSTANCES_LENGTH"),0,s,c),h=d+s+c,f=new Uint8Array(e,h,i-h),g=null,y=null,x=null;if(l)g=f,y=Promise.resolve();else{let C=this.resolveExternalURL(rb(f));x=ml(C),y=fetch(C,this.fetchOptions).then(v=>{if(!v.ok)throw Error(`I3DMLoaderBase : Failed to load file "${C}" with status ${v.status} : ${v.statusText}`);return v.arrayBuffer()}).then(v=>{g=new Uint8Array(v)})}return y.then(()=>({version:n,featureTable:p,batchTable:m,glbBytes:g,gltfWorkingPath:x}))}},Vu=class extends Zi{parse(e){let t=new DataView(e),r=ni(t);console.assert(r==="pnts");let n=t.getUint32(4,!0);console.assert(n===1);let i=t.getUint32(8,!0);console.assert(i===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 fa(e.slice(28,28+o+a),0,o,a),p=28+o+a,d=new fl(e.slice(p,p+s+c),l.getData("BATCH_LENGTH")||l.getData("POINTS_LENGTH"),0,s,c);return Promise.resolve({version:n,featureTable:l,batchTable:d})}},Fu=class extends Zi{parse(e){let t=new DataView(e),r=ni(t);console.assert(r==="cmpt",'CMPTLoader: The magic bytes equal "cmpt".');let n=t.getUint32(4,!0);console.assert(n===1,'CMPTLoader: The version listed in the header is "1".');let i=t.getUint32(8,!0);console.assert(i===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),p=ni(l),d=l.getUint32(4,!0),m=l.getUint32(8,!0),h=new Uint8Array(e,s,m);a.push({type:p,buffer:h,version:d}),s+=m}return{version:n,tiles:a}}};import{Box3 as yb,BufferAttribute as oi,BufferGeometry as FS,Clock as rD,Color as US,DefaultLoadingManager as Tl,Euler as GS,EventDispatcher as gl,Frustum as HS,Group as Qu,InstancedMesh as WS,LoadingManager as XS,MathUtils as vb,Matrix3 as $S,Matrix4 as vt,Mesh as nD,OrthographicCamera as iD,PerspectiveCamera as oD,Plane as qS,PlaneGeometry as aD,Points as YS,PointsMaterial as KS,Quaternion as xb,Ray as Ju,Raycaster as sD,ShaderMaterial as lD,Sphere as wb,Spherical as QS,TextureUtils as JS,Vector2 as Zu,Vector3 as _e}from"three";import{GLTFLoader as ed}from"three/addons/loaders/GLTFLoader.js";import{estimateBytesUsed as ZS}from"three/addons/utils/BufferGeometryUtils.js";var td=class extends Nu{constructor(e=Tl){super(),this.manager=e,this.adjustmentTransform=new vt}parse(e){let t=super.parse(e),r=t.glbBytes.slice().buffer;return new Promise((n,i)=>{let o=this.manager,a=this.fetchOptions,s=o.getHandler("path.gltf")||new ed(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(r,c,p=>{let{batchTable:d,featureTable:m}=t,{scene:h}=p,f=m.getData("RTC_CENTER",1,"FLOAT","VEC3");f&&(h.position.x+=f[0],h.position.y+=f[1],h.position.z+=f[2]),p.scene.updateMatrix(),p.scene.matrix.multiply(l),p.scene.matrix.decompose(p.scene.position,p.scene.quaternion,p.scene.scale),p.batchTable=d,p.featureTable=m,h.batchTable=d,h.featureTable=m,n(p)},i)})}};function eC(e){let t=e>>11,r=e>>5&63,n=e&31;return[Math.round(t/31*255),Math.round(r/63*255),Math.round(n/31*255)]}var ga=new Zu;function tC(e,t,r=new _e){ga.set(e,t).divideScalar(256).multiplyScalar(2).subScalar(1),r.set(ga.x,ga.y,1-Math.abs(ga.x)-Math.abs(ga.y));let n=vb.clamp(-r.z,0,1);return r.x>=0?r.setX(r.x-n):r.setX(r.x+n),r.y>=0?r.setY(r.y-n):r.setY(r.y+n),r.normalize(),r}var nb={RGB:"color",POSITION:"position"},rd=class extends Vu{constructor(e=Tl){super(),this.manager=e}parse(e){return super.parse(e).then(async t=>{let{featureTable:r,batchTable:n}=t,i=new KS,o=r.header.extensions,a=new _e,s;if(o&&o["3DTILES_draco_point_compression"]){let{byteOffset:p,byteLength:d,properties:m}=o["3DTILES_draco_point_compression"],h=this.manager.getHandler("draco.drc");if(h==null)throw Error("PNTSLoader: dracoLoader not available.");let f={};for(let x in m)if(x in nb&&x in m){let C=nb[x];f[C]=m[x]}let g={attributeIDs:f,attributeTypes:{position:"Float32Array",color:"Uint8Array"},useUniqueIDs:!0},y=r.getBuffer(p,d);s=await h.decodeGeometry(y,g),s.attributes.color&&(i.vertexColors=!0)}else{let p=r.getData("POINTS_LENGTH"),d=r.getData("POSITION",p,"FLOAT","VEC3"),m=r.getData("NORMAL",p,"FLOAT","VEC3"),h=r.getData("NORMAL",p,"UNSIGNED_BYTE","VEC2"),f=r.getData("RGB",p,"UNSIGNED_BYTE","VEC3"),g=r.getData("RGBA",p,"UNSIGNED_BYTE","VEC4"),y=r.getData("RGB565",p,"UNSIGNED_SHORT","SCALAR"),x=r.getData("CONSTANT_RGBA",p,"UNSIGNED_BYTE","VEC4"),C=r.getData("POSITION_QUANTIZED",p,"UNSIGNED_SHORT","VEC3"),v=r.getData("QUANTIZED_VOLUME_SCALE",p,"FLOAT","VEC3"),N=r.getData("QUANTIZED_VOLUME_OFFSET",p,"FLOAT","VEC3");if(s=new FS,C){let M=new Float32Array(p*3);for(let S=0;S<p;S++)for(let O=0;O<3;O++){let R=3*S+O;M[R]=C[R]/65535*v[O]}a.x=N[0],a.y=N[1],a.z=N[2],s.setAttribute("position",new oi(M,3,!1))}else s.setAttribute("position",new oi(d,3,!1));if(m!==null)s.setAttribute("normal",new oi(m,3,!1));else if(h!==null){let M=new Float32Array(p*3),S=new _e;for(let O=0;O<p;O++){let R=h[O*2],P=h[O*2+1],T=tC(R,P,S);M[O*3]=T.x,M[O*3+1]=T.y,M[O*3+2]=T.z}s.setAttribute("normal",new oi(M,3,!1))}if(g!==null)s.setAttribute("color",new oi(g,4,!0)),i.vertexColors=!0,i.transparent=!0,i.depthWrite=!1;else if(f!==null)s.setAttribute("color",new oi(f,3,!0)),i.vertexColors=!0;else if(y!==null){let M=new Uint8Array(p*3);for(let S=0;S<p;S++){let O=eC(y[S]);for(let R=0;R<3;R++){let P=3*S+R;M[P]=O[R]}}s.setAttribute("color",new oi(M,3,!0)),i.vertexColors=!0}else if(x!==null){i.color=new US(x[0],x[1],x[2]);let M=x[3]/255;M<1&&(i.opacity=M,i.transparent=!0,i.depthWrite=!1)}}let c=new YS(s,i);c.position.copy(a),t.scene=c,t.scene.featureTable=r,t.scene.batchTable=n;let l=r.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 rC(e){let{x:t,y:r,z:n}=e;e.x=n,e.y=t,e.z=r}function nC(e){return-e+Math.PI/2}var ib=new QS,Cn=new _e,Bt=new _e,Uu=new _e,or=new vt,Br=new vt,Gu=new wb,Ht=new GS,ob=new _e,ab=new _e,sb=new _e,ba=new _e,bl=new Ju,iC=1e-12,oC=.1;var nd=class{constructor(e=1,t=1,r=1){this.name="",this.radius=new _e(e,t,r)}intersectRay(e,t){return or.makeScale(...this.radius).invert(),Gu.center.set(0,0,0),Gu.radius=1,bl.copy(e).applyMatrix4(or),bl.intersectSphere(Gu,t)?(or.makeScale(...this.radius),t.applyMatrix4(or),t):null}getEastNorthUpFrame(e,t,r,n){return r.isMatrix4&&(n=r,r=0,console.warn('Ellipsoid: The signature for "getEastNorthUpFrame" has changed.')),this.getEastNorthUpAxes(e,t,ob,ab,sb),this.getCartographicToPosition(e,t,r,ba),n.makeBasis(ob,ab,sb).setPosition(ba)}getOrientedEastNorthUpFrame(e,t,r,n,i,o,a){return this.getObjectFrame(e,t,r,n,i,o,a,0)}getObjectFrame(e,t,r,n,i,o,a,s=2){return this.getEastNorthUpFrame(e,t,r,or),Ht.set(i,o,-n,"ZXY"),a.makeRotationFromEuler(Ht).premultiply(or),s===1?(Ht.set(Math.PI/2,0,0,"XYZ"),Br.makeRotationFromEuler(Ht),a.multiply(Br)):s===2&&(Ht.set(-Math.PI/2,0,Math.PI,"XYZ"),Br.makeRotationFromEuler(Ht),a.multiply(Br)),a}getCartographicFromObjectFrame(e,t,r=2){return r===1?(Ht.set(-Math.PI/2,0,0,"XYZ"),Br.makeRotationFromEuler(Ht).premultiply(e)):r===2?(Ht.set(-Math.PI/2,0,Math.PI,"XYZ"),Br.makeRotationFromEuler(Ht).premultiply(e)):Br.copy(e),ba.setFromMatrixPosition(Br),this.getPositionToCartographic(ba,t),this.getEastNorthUpFrame(t.lat,t.lon,0,or).invert(),Br.premultiply(or),Ht.setFromRotationMatrix(Br,"ZXY"),t.azimuth=-Ht.z,t.elevation=Ht.x,t.roll=Ht.y,t}getEastNorthUpAxes(e,t,r,n,i,o=ba){this.getCartographicToPosition(e,t,0,o),this.getCartographicToNormal(e,t,i),r.set(-o.y,o.x,0).normalize(),n.crossVectors(i,r).normalize()}getCartographicToPosition(e,t,r,n){this.getCartographicToNormal(e,t,Cn);let i=this.radius;Bt.copy(Cn),Bt.x*=i.x**2,Bt.y*=i.y**2,Bt.z*=i.z**2;let o=Math.sqrt(Cn.dot(Bt));return Bt.divideScalar(o),n.copy(Bt).addScaledVector(Cn,r)}getPositionToCartographic(e,t){this.getPositionToSurfacePoint(e,Bt),this.getPositionToNormal(Bt,Cn);let r=Uu.subVectors(e,Bt);return t.lon=Math.atan2(Cn.y,Cn.x),t.lat=Math.asin(Cn.z),t.height=Math.sign(r.dot(e))*r.length(),t}getCartographicToNormal(e,t,r){return ib.set(1,nC(e),t),r.setFromSpherical(ib).normalize(),rC(r),r}getPositionToNormal(e,t){let r=this.radius;return t.copy(e),t.x/=r.x**2,t.y/=r.y**2,t.z/=r.z**2,t.normalize(),t}getPositionToSurfacePoint(e,t){let r=this.radius,n=1/r.x**2,i=1/r.y**2,o=1/r.z**2,a=e.x*e.x*n,s=e.y*e.y*i,c=e.z*e.z*o,l=a+s+c,p=Math.sqrt(1/l),d=Bt.copy(e).multiplyScalar(p);if(l<oC)return isFinite(p)?t.copy(d):null;let m=Uu.set(d.x*n*2,d.y*i*2,d.z*o*2),h=(1-p)*e.length()/(.5*m.length()),f=0,g,y,x,C,v,N,M,S,O,R,P;do{h-=f,x=1/(1+h*n),C=1/(1+h*i),v=1/(1+h*o),N=x*x,M=C*C,S=v*v,O=N*x,R=M*C,P=S*v,g=a*N+s*M+c*S-1,y=a*O*n+s*R*i+c*P*o;let T=-2*y;f=g/T}while(Math.abs(g)>iC);return t.set(e.x*x,e.y*C,e.z*v)}calculateHorizonDistance(e,t){let r=this.calculateEffectiveRadius(e);return Math.sqrt(2*r*t+t**2)}calculateEffectiveRadius(e){let t=this.radius.x,r=1-this.radius.z**2/t**2,n=e*vb.DEG2RAD,i=Math.sin(n)**2;return t/Math.sqrt(1-r*i)}getPositionElevation(e){this.getPositionToSurfacePoint(e,Bt);let t=Uu.subVectors(e,Bt);return Math.sign(t.dot(e))*t.length()}closestPointToRayEstimate(e,t){return this.intersectRay(e,t)?t:(or.makeScale(...this.radius).invert(),bl.copy(e).applyMatrix4(or),Bt.set(0,0,0),bl.closestPointToPoint(Bt,t).normalize(),or.makeScale(...this.radius),t.applyMatrix4(or))}copy(e){return this.radius.copy(e.radius),this}clone(){return new this.constructor().copy(this)}},Ma=new nd(ii,ii,Ou);Ma.name="WGS84 Earth";var yl=new _e,eo=new _e,to=new _e,Hu=new _e,vl=new xb,xl=new _e,ro=new vt,lb=new vt,cb=new _e,ub=new vt,Wu=new xb,Xu={};function db(e,t,r,n){if(e=e/r*2-1,t=t/r*2-1,n.x=e,n.y=t,n.z=1-Math.abs(e)-Math.abs(t),n.z<0){let i=n.x;n.x=(1-Math.abs(n.y))*(i>=0?1:-1),n.y=(1-Math.abs(i))*(n.y>=0?1:-1)}return n.normalize(),n}var id=class extends ju{constructor(e=Tl){super(),this.manager=e,this.adjustmentTransform=new vt,this.ellipsoid=Ma.clone()}resolveExternalURL(e){return this.manager.resolveURL(super.resolveExternalURL(e))}parse(e){return super.parse(e).then(t=>{let{featureTable:r,batchTable:n}=t,i=t.glbBytes.slice().buffer;return new Promise((o,a)=>{let s=this.fetchOptions,c=this.manager,l=c.getHandler("path.gltf")||new ed(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 p=t.gltfWorkingPath??this.workingPath;/[\\/]$/.test(p)||(p+="/");let d=this.adjustmentTransform;l.parse(i,p,m=>{let h=r.getData("INSTANCES_LENGTH"),f=r.getData("POSITION",h,"FLOAT","VEC3"),g=r.getData("POSITION_QUANTIZED",h,"UNSIGNED_SHORT","VEC3"),y=r.getData("QUANTIZED_VOLUME_OFFSET",1,"FLOAT","VEC3"),x=r.getData("QUANTIZED_VOLUME_SCALE",1,"FLOAT","VEC3"),C=r.getData("NORMAL_UP",h,"FLOAT","VEC3"),v=r.getData("NORMAL_RIGHT",h,"FLOAT","VEC3"),N=r.getData("NORMAL_UP_OCT32P",h,"UNSIGNED_SHORT","VEC2"),M=r.getData("NORMAL_RIGHT_OCT32P",h,"UNSIGNED_SHORT","VEC2"),S=r.getData("SCALE_NON_UNIFORM",h,"FLOAT","VEC3"),O=r.getData("SCALE",h,"FLOAT","SCALAR"),R=r.getData("RTC_CENTER",1,"FLOAT","VEC3"),P=r.getData("EAST_NORTH_UP");if(!f&&g){f=new Float32Array(h*3);for(let k=0;k<h;k++)f[k*3+0]=y[0]+g[k*3+0]/65535*x[0],f[k*3+1]=y[1]+g[k*3+1]/65535*x[1],f[k*3+2]=y[2]+g[k*3+2]/65535*x[2]}let T=new _e;for(let k=0;k<h;k++)T.x+=f[k*3+0]/h,T.y+=f[k*3+1]/h,T.z+=f[k*3+2]/h;let w=[],A=[];m.scene.updateMatrixWorld(),m.scene.traverse(k=>{if(k.isMesh){A.push(k);let{geometry:V,material:F}=k,z=new WS(V,F,h);z.position.copy(T),R&&(z.position.x+=R[0],z.position.y+=R[1],z.position.z+=R[2]),w.push(z)}});for(let k=0;k<h;k++){Hu.set(f[k*3+0]-T.x,f[k*3+1]-T.y,f[k*3+2]-T.z),vl.identity(),C&&v?(eo.set(C[k*3+0],C[k*3+1],C[k*3+2]),to.set(v[k*3+0],v[k*3+1],v[k*3+2]),yl.crossVectors(to,eo).normalize(),ro.makeBasis(to,eo,yl),vl.setFromRotationMatrix(ro)):N&&M&&(db(N[k*2+0],N[k*2+1],65535,eo),db(M[k*2+0],M[k*2+1],65535,to),yl.crossVectors(to,eo).normalize(),ro.makeBasis(to,eo,yl),vl.setFromRotationMatrix(ro)),xl.set(1,1,1),S&&xl.set(S[k*3+0],S[k*3+1],S[k*3+2]),O&&xl.multiplyScalar(O[k]);for(let V=0,F=w.length;V<F;V++){let z=w[V];Wu.copy(vl),P&&(z.updateMatrixWorld(),cb.copy(Hu).applyMatrix4(z.matrixWorld),this.ellipsoid.getPositionToCartographic(cb,Xu),this.ellipsoid.getEastNorthUpFrame(Xu.lat,Xu.lon,ub),Wu.setFromRotationMatrix(ub)),ro.compose(Hu,Wu,xl).multiply(d);let H=A[V];lb.multiplyMatrices(ro,H.matrixWorld),z.setMatrixAt(k,lb)}}m.scene.clear(),m.scene.add(...w),m.batchTable=n,m.featureTable=r,m.scene.batchTable=n,m.scene.featureTable=r,o(m)},a)})})}},Mb=class extends Fu{constructor(e=Tl){super(),this.manager=e,this.adjustmentTransform=new vt,this.ellipsoid=Ma.clone()}parse(e){let t=super.parse(e),{manager:r,ellipsoid:n,adjustmentTransform:i}=this,o=[];for(let a in t.tiles){let{type:s,buffer:c}=t.tiles[a];switch(s){case"b3dm":{let l=c.slice(),p=new td(r);p.workingPath=this.workingPath,p.fetchOptions=this.fetchOptions,p.adjustmentTransform.copy(i);let d=p.parse(l.buffer);o.push(d);break}case"pnts":{let l=c.slice(),p=new rd(r);p.workingPath=this.workingPath,p.fetchOptions=this.fetchOptions;let d=p.parse(l.buffer);o.push(d);break}case"i3dm":{let l=c.slice(),p=new id(r);p.workingPath=this.workingPath,p.fetchOptions=this.fetchOptions,p.ellipsoid.copy(n),p.adjustmentTransform.copy(i);let d=p.parse(l.buffer);o.push(d);break}}}return Promise.all(o).then(a=>{let s=new Qu;return a.forEach(c=>{s.add(c.scene)}),{tiles:a,scene:s}})}},ya=new vt,aC=class extends Qu{constructor(e){super(),this.isTilesGroup=!0,this.name="TilesRenderer.TilesGroup",this.tilesRenderer=e,this.matrixWorldInverse=new vt}raycast(e,t){return this.tilesRenderer.raycast(e,t),!1}updateMatrixWorld(e){if(this.matrixAutoUpdate&&this.updateMatrix(),this.matrixWorldNeedsUpdate||e){this.parent===null?ya.copy(this.matrix):ya.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1;let t=ya.elements,r=this.matrixWorld.elements,n=!1;for(let i=0;i<16;i++){let o=t[i],a=r[i];if(Math.abs(o-a)>2**-52){n=!0;break}}if(n){this.matrixWorld.copy(ya),this.matrixWorldInverse.copy(ya).invert();let i=this.children;for(let c=0,l=i.length;c<l;c++)i[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)}},sC=new Ju;function lC(e,t,r,n){let{scene:i}=e.engineData;r.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(e,i,t,n))||t.intersectObject(i,!0,n)}function cC(e){return"traversal"in e}function Sb(e,t,r,n,i=null){if(!cC(t))return;let{group:o,activeTiles:a}=e,{boundingVolume:s}=t.engineData;if(i===null&&(i=sC,i.copy(r.ray).applyMatrix4(o.matrixWorldInverse)),!t.traversal.used||!s.intersectsRay(i))return;a.has(t)&&lC(t,r,e,n);let c=t.children;for(let l=0,p=c.length;l<p;l++)Sb(e,c[l],r,n,i)}var wl=new _e,Ml=new _e,Wt=new _e,Sl=new Ju,Yu=class{constructor(e=new yb,t=new vt){this.box=e.clone(),this.transform=t.clone(),this.inverseTransform=new vt,this.points=Array(8).fill().map(()=>new _e),this.planes=[,,,,,,].fill().map(()=>new qS)}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,Wt).distanceTo(e)}containsPoint(e){return Wt.copy(e).applyMatrix4(this.inverseTransform),this.box.containsPoint(Wt)}intersectsRay(e){return Sl.copy(e).applyMatrix4(this.inverseTransform),Sl.intersectsBox(this.box)}intersectRay(e,t){return Sl.copy(e).applyMatrix4(this.inverseTransform),Sl.intersectBox(this.box,t)?(t.applyMatrix4(this.transform),t):null}update(){let{points:e,inverseTransform:t,transform:r,box:n}=this;t.copy(r).invert();let{min:i,max:o}=n,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?i.x:o.x,c<0?i.y:o.y,l<0?i.z:o.z).applyMatrix4(r),a++;this.updatePlanes()}updatePlanes(){wl.copy(this.box.min).applyMatrix4(this.transform),Ml.copy(this.box.max).applyMatrix4(this.transform),Wt.set(0,0,1).transformDirection(this.transform),this.planes[0].setFromNormalAndCoplanarPoint(Wt,wl),this.planes[1].setFromNormalAndCoplanarPoint(Wt,Ml).negate(),Wt.set(0,1,0).transformDirection(this.transform),this.planes[2].setFromNormalAndCoplanarPoint(Wt,wl),this.planes[3].setFromNormalAndCoplanarPoint(Wt,Ml).negate(),Wt.set(1,0,0).transformDirection(this.transform),this.planes[4].setFromNormalAndCoplanarPoint(Wt,wl),this.planes[5].setFromNormalAndCoplanarPoint(Wt,Ml).negate()}intersectsSphere(e){return this.clampPoint(e.center,Wt),Wt.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 r=this.points,n=this.planes;for(let i=0;i<6;i++){let o=e[i],a=-1/0;for(let s=0;s<8;s++){let c=r[s],l=o.distanceToPoint(c);a=a<l?l:a}if(a<0)return!1}for(let i=0;i<6;i++){let o=n[i],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}},wa=Math.PI,$u=wa/2,va=new _e,ai=new _e,Sr=new _e,ce=new _e,zt=new vt,uC=new yb,pb=new vt;function Tn(e,t){t.radius=Math.max(t.radius,e.distanceToSquared(t.center))}function hb(e){return e.x!==e.y}var Cb=class extends nd{constructor(e=1,t=1,r=1,n=-$u,i=$u,o=0,a=2*wa,s=0,c=0){super(e,t,r),this.latStart=n,this.latEnd=i,this.lonStart=o,this.lonEnd=a,this.heightStart=s,this.heightEnd=c}getBoundingBox(e,t){hb(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported.");let{latStart:r,latEnd:n,lonStart:i,lonEnd:o,heightStart:a,heightEnd:s}=this,c=(r+n)*.5,l=(i+o)*.5,p=r>0,d=n<0,m;m=p?r:d?n:0;let{min:h,max:f}=e;h.setScalar(1/0),f.setScalar(-1/0),o-i<=wa?(this.getCartographicToNormal(c,l,Sr),ai.set(0,0,1),va.crossVectors(ai,Sr).normalize(),ai.crossVectors(Sr,va).normalize(),t.makeBasis(va,ai,Sr),zt.copy(t).invert(),this.getCartographicToPosition(m,i,s,ce).applyMatrix4(zt),f.x=Math.abs(ce.x),h.x=-f.x,this.getCartographicToPosition(n,i,s,ce).applyMatrix4(zt),f.y=ce.y,this.getCartographicToPosition(n,l,s,ce).applyMatrix4(zt),f.y=Math.max(ce.y,f.y),this.getCartographicToPosition(r,i,s,ce).applyMatrix4(zt),h.y=ce.y,this.getCartographicToPosition(r,l,s,ce).applyMatrix4(zt),h.y=Math.min(ce.y,h.y),this.getCartographicToPosition(c,l,s,ce).applyMatrix4(zt),f.z=ce.z,this.getCartographicToPosition(r,i,a,ce).applyMatrix4(zt),h.z=ce.z,this.getCartographicToPosition(n,i,a,ce).applyMatrix4(zt),h.z=Math.min(ce.z,h.z)):(this.getCartographicToPosition(m,l,s,Sr),Sr.z=0,Sr.length()<1e-10?Sr.set(1,0,0):Sr.normalize(),ai.set(0,0,1),va.crossVectors(Sr,ai).normalize(),t.makeBasis(va,ai,Sr),zt.copy(t).invert(),this.getCartographicToPosition(m,l+$u,s,ce).applyMatrix4(zt),f.x=Math.abs(ce.x),h.x=-f.x,this.getCartographicToPosition(n,0,d?a:s,ce).applyMatrix4(zt),f.y=ce.y,this.getCartographicToPosition(r,0,p?a:s,ce).applyMatrix4(zt),h.y=ce.y,this.getCartographicToPosition(m,l,s,ce).applyMatrix4(zt),f.z=ce.z,this.getCartographicToPosition(m,o,s,ce).applyMatrix4(zt),h.z=ce.z),e.getCenter(ce),e.min.sub(ce).multiplyScalar(1.0000000000001),e.max.sub(ce).multiplyScalar(1.0000000000001),ce.applyMatrix4(t),t.setPosition(ce)}getBoundingSphere(e){hb(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported."),this.getBoundingBox(uC,pb),e.center.setFromMatrixPosition(pb),e.radius=0;let{latStart:t,latEnd:r,lonStart:n,lonEnd:i,heightStart:o,heightEnd:a}=this,s=(t+r)*.5,c=(n+i)*.5,l=t>0,p=r<0,d;d=l?t:p?r:0,this.getCartographicToPosition(d,n,a,ce),Tn(ce,e),this.getCartographicToPosition(r,n,a,ce),Tn(ce,e),this.getCartographicToPosition(r,c,a,ce),Tn(ce,e),this.getCartographicToPosition(t,n,a,ce),Tn(ce,e),this.getCartographicToPosition(t,c,a,ce),Tn(ce,e),this.getCartographicToPosition(s,c,a,ce),Tn(ce,e),this.getCartographicToPosition(t,n,o,ce),Tn(ce,e),i-n>wa&&(this.getCartographicToPosition(d,c+wa,a,ce),Tn(ce,e)),e.radius=Math.sqrt(e.radius)*1.0000000000001}},Zr=new _e,en=new _e,tn=new _e,mb=new _e,fb=new _e,dC=class{constructor(){this.sphere=null,this.obb=null,this.region=null,this.regionObb=null}intersectsRay(e){let t=this.sphere,r=this.obb||this.regionObb;return!(t&&!e.intersectsSphere(t)||r&&!r.intersectsRay(e))}intersectRay(e,t=null){let r=this.sphere,n=this.obb||this.regionObb,i=-1/0,o=-1/0;r&&e.intersectSphere(r,mb)&&(i=r.containsPoint(e.origin)?0:e.origin.distanceToSquared(mb)),n&&n.intersectRay(e,fb)&&(o=n.containsPoint(e.origin)?0:e.origin.distanceToSquared(fb));let a=Math.max(i,o);return a===-1/0?null:(e.at(Math.sqrt(a),t),t)}distanceToPoint(e){let t=this.sphere,r=this.obb||this.regionObb,n=-1/0,i=-1/0;return t&&(n=Math.max(t.distanceToPoint(e),0)),r&&(i=r.distanceToPoint(e)),n>i?n:i}intersectsFrustum(e){let t=this.obb||this.regionObb,r=this.sphere;return r&&!e.intersectsSphere(r)||t&&!t.intersectsFrustum(e)?!1:!!(r||t)}intersectsSphere(e){let t=this.obb||this.regionObb,r=this.sphere;return r&&!r.intersectsSphere(e)||t&&!t.intersectsSphere(e)?!1:!!(r||t)}intersectsOBB(e){let t=this.obb||this.regionObb,r=this.sphere;return r&&!e.intersectsSphere(r)||t&&!t.intersectsOBB(e)?!1:!!(r||t)}getOBB(e,t){let r=this.obb||this.regionObb;r?(e.copy(r.box),t.copy(r.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 r=new Yu;Zr.set(e[3],e[4],e[5]),en.set(e[6],e[7],e[8]),tn.set(e[9],e[10],e[11]);let n=Zr.length(),i=en.length(),o=tn.length();Zr.normalize(),en.normalize(),tn.normalize(),n===0&&Zr.crossVectors(en,tn),i===0&&en.crossVectors(Zr,tn),o===0&&tn.crossVectors(Zr,en),r.transform.set(Zr.x,en.x,tn.x,e[0],Zr.y,en.y,tn.y,e[1],Zr.z,en.z,tn.z,e[2],0,0,0,1).premultiply(t),r.box.min.set(-n,-i,-o),r.box.max.set(n,i,o),r.update(),this.obb=r}setSphereData(e,t,r,n,i){let o=new wb;o.center.set(e,t,r),o.radius=n,o.applyMatrix4(i),this.sphere=o}setRegionData(e,t,r,n,i,o,a){let s=new Cb(...e.radius,r,i,t,n,o,a),c=new Yu;s.getBoundingBox(c.box,c.transform),c.update(),this.region=s,this.regionObb=c}},pC=new $S;function hC(e,t,r,n){let i=pC.set(e.normal.x,e.normal.y,e.normal.z,t.normal.x,t.normal.y,t.normal.z,r.normal.x,r.normal.y,r.normal.z);return n.set(-e.constant,-t.constant,-r.constant),n.applyMatrix3(i.invert()),n}var mC=class extends HS{constructor(){super(),this.points=Array(8).fill().map(()=>new _e)}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((r,n)=>{hC(r[0],r[1],r[2],t[n])})}};var Ku=0;function gb(e,t,r,n){try{return JS.getByteLength(e,t,r,n)}catch{return Ku}}function fC(e){if(!e)return 0;if(e.isExternalTexture)return e.userData?.byteLength??Ku;let{format:t,type:r,image:n,mipmaps:i}=e;if(e.isCompressedTexture&&Array.isArray(i)&&i.length>0){let a=0;for(let s of i)s?.data?.byteLength?a+=s.data.byteLength:a+=gb(s.width,s.height,t,r);return a}if(!n)return Ku;let o=gb(n.width,n.height,t,r);return o*=e.generateMipmaps?4/3:1,o}function gC(e){let t=new Set,r=0;return e.traverse(n=>{if(n.geometry&&!t.has(n.geometry)&&(r+=ZS(n.geometry),t.add(n.geometry)),n.material){let i=n.material;for(let o in i){let a=i[o];a&&a.isTexture&&!t.has(a)&&(r+=fC(a),t.add(a))}}}),r}var Tb=Symbol("INITIAL_FRUSTUM_CULLED"),Cl=new vt,xa=new _e,qu=new Zu,bC=new _e(1,0,0),yC=new _e(0,1,0),vC=()=>null;function bb(e,t){e.traverse(r=>{r.frustumCulled=r[Tb]&&t})}var od=class extends Bu{get autoDisableRendererCulling(){return this._autoDisableRendererCulling}set autoDisableRendererCulling(e){this._autoDisableRendererCulling!==e&&(super._autoDisableRendererCulling=e,this.forEachLoadedModel(t=>{bb(t,!e)}))}constructor(...e){super(...e),this.accelerateRaycast=!0,this.group=new aC(this),this.ellipsoid=Ma.clone(),this.cameras=[],this.cameraMap=new Map,this.cameraInfo=[],this._upRotationMatrix=new vt,this._bytesUsed=new WeakMap,this._autoDisableRendererCulling=!0,this.manager=new XS,this._listeners={}}addEventListener(e,t){gl.prototype.addEventListener.call(this,e,t)}hasEventListener(e,t){return gl.prototype.hasEventListener.call(this,e,t)}removeEventListener(e,t){gl.prototype.removeEventListener.call(this,e,t)}dispatchEvent(e){gl.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 r=this.root.engineData.boundingVolume;return r?(r.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 r=t.engineData&&t.engineData.scene;r&&e(r,t)},null,!1)}raycast(e,t){if(this.root)if(this.accelerateRaycast)Sb(this,this.root,e,t);else{let r=e.firstHitOnly?[]:t;for(let n of this.activeTiles){let{scene:i}=n.engineData;this.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(n,i,e,r))||e.intersectObject(i,!0,r)}e.firstHitOnly&&r.length>0&&(r.sort((n,i)=>n.distance-i.distance),t.push(r[0]))}}hasCamera(e){return this.cameraMap.has(e)}setCamera(e){let t=this.cameras,r=this.cameraMap;return r.has(e)?!1:(r.set(e,new Zu),t.push(e),this.dispatchEvent({type:"add-camera",camera:e}),!0)}setResolution(e,t,r){let n=this.cameraMap;if(!n.has(e))return!1;let i=t.isVector2?t.x:t,o=t.isVector2?t.y:r,a=n.get(e);return(a.width!==i||a.height!==o)&&(a.set(i,o),this.dispatchEvent({type:"camera-resolution-change"})),!0}getResolution(e,t){let r=this.cameraMap.get(e);return r?t.copy(r):null}setResolutionFromRenderer(e,t){return t.getSize(qu),this.setResolution(e,qu.x,qu.y)}deleteCamera(e){let t=this.cameras,r=this.cameraMap;if(r.has(e)){let n=t.indexOf(e);return t.splice(n,1),r.delete(e),this.dispatchEvent({type:"delete-camera",camera:e}),!0}return!1}loadRootTileset(...e){return super.loadRootTileset(...e).then(t=>{let{asset:r,extensions:n={}}=t;switch((r&&r.gltfUpAxis||"y").toLowerCase()){case"x":this._upRotationMatrix.makeRotationAxis(yC,-Math.PI/2);break;case"y":this._upRotationMatrix.makeRotationAxis(bC,Math.PI/2);break}if("3DTILES_ellipsoid"in n){let i=n["3DTILES_ellipsoid"],{ellipsoid:o}=this;o.name=i.body,i.radii?o.radius.set(...i.radii):o.radius.set(1,1,1)}return t})}prepareForTraversal(){let e=this.group,t=this.cameras,r=this.cameraMap,n=this.cameraInfo;for(;n.length>t.length;)n.pop();for(;n.length<t.length;)n.push({frustum:new mC,isOrthographic:!1,sseDenominator:-1,position:new _e,invScale:-1,pixelSize:0});xa.setFromMatrixScale(e.matrixWorldInverse),Math.abs(Math.max(xa.x-xa.y,xa.x-xa.z))>1e-6&&console.warn("ThreeTilesRenderer : Non uniform scale used for tile which may cause issues when calculating screen space error.");for(let i=0,o=n.length;i<o;i++){let a=t[i],s=n[i],c=s.frustum,l=s.position,p=r.get(a);(p.width===0||p.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 m=2/d[0],h=2/d[5];s.pixelSize=Math.max(h/p.height,m/p.width)}else s.sseDenominator=2/d[5]/p.height;Cl.copy(e.matrixWorld),Cl.premultiply(a.matrixWorldInverse),Cl.premultiply(a.projectionMatrix),c.setFromProjectionMatrix(Cl,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,r=null){super.preprocessNode(e,t,r);let n=new vt;if(e.transform){let a=e.transform;for(let s=0;s<16;s++)n.elements[s]=a[s]}r&&n.premultiply(r.engineData.transform);let i=new vt().copy(n).invert(),o=new dC;"sphere"in e.boundingVolume&&o.setSphereData(...e.boundingVolume.sphere,n),"box"in e.boundingVolume&&o.setObbData(e.boundingVolume.box,n),"region"in e.boundingVolume&&o.setRegionData(this.ellipsoid,...e.boundingVolume.region),e.engineData.transform=n,e.engineData.transformInverse=i,e.engineData.boundingVolume=o,e.engineData.geometry=null,e.engineData.materials=null,e.engineData.textures=null,e.toJSON=vC}async parseTile(e,t,r,n,i){let o=t.engineData,a=ml(n),s=this.fetchOptions,c=this.manager,l=null,p=o.transform,d=this._upRotationMatrix,m=(ni(e)||r).toLowerCase();switch(m){case"b3dm":{let v=new td(c);v.workingPath=a,v.fetchOptions=s,v.adjustmentTransform.copy(d),l=v.parse(e);break}case"pnts":{let v=new rd(c);v.workingPath=a,v.fetchOptions=s,l=v.parse(e);break}case"i3dm":{let v=new id(c);v.workingPath=a,v.fetchOptions=s,v.adjustmentTransform.copy(d),v.ellipsoid.copy(this.ellipsoid),l=v.parse(e);break}case"cmpt":{let v=new Mb(c);v.workingPath=a,v.fetchOptions=s,v.adjustmentTransform.copy(d),v.ellipsoid.copy(this.ellipsoid),l=v.parse(e).then(N=>N.scene);break}case"gltf":case"glb":{let v=c.getHandler("path.gltf")||c.getHandler("path.glb")||new ed(c);v.setWithCredentials(s.credentials==="include"),v.setRequestHeader(s.headers||{}),s.credentials==="include"&&s.mode==="cors"&&v.setCrossOrigin("use-credentials");let N=v.resourcePath||v.path||a;!/[\\/]$/.test(N)&&N.length&&(N+="/"),l=v.parseAsync(e,N).then(M=>{M.scene=M.scene||new Qu;let{scene:S}=M;return S.updateMatrix(),S.matrix.multiply(d).decompose(S.position,S.quaternion,S.scale),M});break}default:l=this.invokeOnePlugin(v=>v.parseToMesh&&v.parseToMesh(e,t,r,n,i));break}let h=await l;if(h===null)throw Error(`TilesRenderer: Content type "${m}" not supported.`);let f,g;h.isObject3D?(f=h,g=null):(f=h.scene,g=h),f.updateMatrix(),f.matrix.premultiply(p),f.matrix.decompose(f.position,f.quaternion,f.scale),await this.invokeAllPlugins(v=>v.processTileModel&&v.processTileModel(f,t)),f.traverse(v=>{v[Tb]=v.frustumCulled,v.userData.tile=t}),bb(f,!this.autoDisableRendererCulling);let y=[],x=[],C=[];if(f.traverse(v=>{if(v.geometry&&x.push(v.geometry),v.material){let N=v.material;y.push(v.material);for(let M in N){let S=N[M];S&&S.isTexture&&C.push(S)}}}),i.aborted){for(let v=0,N=C.length;v<N;v++){let M=C[v];M.image instanceof ImageBitmap&&M.image.close(),M.dispose()}return}o.materials=y,o.geometry=x,o.textures=C,o.scene=f,o.metadata=g}disposeTile(e){super.disposeTile(e);let t=e.engineData;if(t.scene){let r=t.materials,n=t.geometry,i=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=n.length;a<s;a++)n[a].dispose();for(let a=0,s=r.length;a<s;a++)r[a].dispose();for(let a=0,s=i.length;a<s;a++){let c=i[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 r=e.engineData.scene;r&&(t?(r.parent=this.group,r.updateMatrixWorld(!0)):r.parent=null)}setTileVisible(e,t){let r=e.engineData.scene,{activeTiles:n,group:i}=this;r&&(t?i.add(r):(i.remove(r),n.has(e)&&(r.parent=i))),super.setTileVisible(e,t)}calculateBytesUsed(e,t){let r=this._bytesUsed;return!r.has(e)&&t&&r.set(e,gC(t)),r.get(e)??null}calculateTileViewError(e,t){let r=e.engineData,n=this.cameras,i=this.cameraInfo,o=r.boundingVolume,a=!1,s=0,c=1/0,l=0,p=1/0;for(let d=0,m=n.length;d<m;d++){let h=i[d],f,g;if(h.isOrthographic){let x=h.pixelSize;f=e.geometricError/x,g=1/0}else{let x=h.sseDenominator;g=o.distanceToPoint(h.position),f=g===0?1/0:e.geometricError/(g*x)}let y=i[d].frustum;o.intersectsFrustum(y)&&(a=!0,s=Math.max(s,f),c=Math.min(c,g)),l=Math.max(l,f),p=Math.min(p,g)}a?(t.inView=!0,t.error=s,t.distanceFromCamera=c):(t.inView=!1,t.error=l,t.distanceFromCamera=p)}dispose(){super.dispose(),this.group.removeFromParent()}};import{BatchedMesh as XD,Box2 as xC,Box3 as $D,Box3Helper as qD,BoxGeometry as YD,BufferAttribute as ld,BufferGeometry as KD,CanvasTexture as QD,Color as JD,CustomBlending as wC,DataTexture as MC,DefaultLoadingManager as ZD,DoubleSide as eL,EventDispatcher as tL,FileLoader as SC,FloatType as rL,Frustum as nL,GreaterDepth as iL,Group as oL,LineBasicMaterial as aL,LineSegments as sL,LinearFilter as CC,LinearMipMapLinearFilter as lL,MathUtils as cd,Matrix2 as TC,Matrix3 as _C,Matrix4 as PC,Mesh as cL,MeshBasicMaterial as EC,MeshLambertMaterial as uL,MeshStandardMaterial as dL,OneFactor as AC,PlaneGeometry as pL,Points as hL,PointsMaterial as mL,Quaternion as fL,REVISION as gL,RGFormat as bL,Ray as yL,Raycaster as vL,RedFormat as xL,SRGBColorSpace as wL,ShaderMaterial as RC,Source as ML,Sphere as SL,SphereGeometry as CL,Texture as TL,TextureUtils as _L,Triangle as PL,UnsignedByteType as EL,Vector2 as Cr,Vector3 as Fb,Vector4 as kC,WebGLArrayRenderTarget as AL,WebGLRenderTarget as _b,WebGLRenderer as DC,ZeroFactor as LC}from"three";import{GLTFLoader as OC}from"three/addons/loaders/GLTFLoader.js";import{FullScreenQuad as Ub}from"three/addons/postprocessing/Pass.js";var DL=Object.freeze({fill:"#cccccc",stroke:"transparent",strokeWidth:1,radius:2,order:0,visible:!0});var Pb=new Ir;Pb.maxJobs=10,Pb.priorityCallback=(e,t)=>{let r=e.tile,n=t.tile,i=r.internal.renderer,o=n.internal.renderer,a=i.visibleTiles.has(r);return a===o.visibleTiles.has(n)?Ji(r,n):a?1:-1};var Eb=new Fb;function Sa(e,t){if(e.isInterleavedBufferAttribute||e.array instanceof t)return e;let r=t===Int8Array||t===Int16Array||t===Int32Array?-1:0,n=new ld(new t(e.count*e.itemSize),e.itemSize,!0),i=e.itemSize,o=e.count;for(let a=0;a<o;a++)for(let s=0;s<i;s++){let c=cd.clamp(e.getComponent(a,s),r,1);n.setComponent(a,s,c)}return n}function IC(e,t=Int16Array){let r=e.geometry,n=r.attributes,i=n.position;if(i.isInterleavedBufferAttribute||i.array instanceof t)return i;let o=new ld(new t(i.count*i.itemSize),i.itemSize,!1),a=i.itemSize,s=i.count;r.computeBoundingBox();let c=r.boundingBox,{min:l,max:p}=c,d=2**(8*t.BYTES_PER_ELEMENT-1)-1,m=-d;for(let h=0;h<s;h++)for(let f=0;f<a;f++){let g=f===0?"x":f===1?"y":"z",y=l[g],x=p[g],C=cd.mapLinear(i.getComponent(h,f),y,x,m,d);o.setComponent(h,f,C)}c.getCenter(Eb).multiply(e.scale).applyQuaternion(e.quaternion),e.position.add(Eb),e.scale.x*=.5*(p.x-l.x)/d,e.scale.y*=.5*(p.y-l.y)/d,e.scale.z*=.5*(p.z-l.z)/d,n.position=o,e.geometry.boundingBox=null,e.geometry.boundingSphere=null,e.updateMatrixWorld()}var ud=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:r,disableMipmaps:n,compressIndex:i,compressUvs:o,compressNormals:a,compressPosition:s,uvType:c,normalType:l,positionType:p}=this._options;e.traverse(d=>{if(d.material&&n){let m=d.material;for(let h in m){let f=m[h];f&&f.isTexture&&f.generateMipmaps&&(f.generateMipmaps=!1,f.minFilter=CC)}}if(d.geometry){let m=d.geometry,h=m.attributes;if(o){let{uv:f,uv1:g,uv2:y,uv3:x}=h;f&&(h.uv=Sa(f,c)),g&&(h.uv1=Sa(g,c)),y&&(h.uv2=Sa(y,c)),x&&(h.uv3=Sa(x,c))}if(r&&!h.normals&&m.computeVertexNormals(),a&&h.normals&&(h.normals=Sa(h.normals,l)),s&&IC(d,p),i&&m.index){let f=h.position.count,g=m.index,y=f>65535?Uint32Array:f>255?Uint16Array:Uint8Array;if(!(g.array instanceof y)){let x=new y(m.index.count);x.set(g.array);let C=new ld(x,1);m.setIndex(C)}}}})}};function xt(e,t,r){return e&&t in e?e[t]:r}function Gb(e){return e!=="BOOLEAN"&&e!=="STRING"&&e!=="ENUM"}function BC(e){return/^FLOAT/.test(e)}function Pa(e){return/^VEC/.test(e)}function Ea(e){return/^MAT/.test(e)}function Hb(e,t,r,n=null){return Ea(r)||Pa(r)?n.fromArray(e,t):e[t]}function ad(e){let{type:t,componentType:r}=e;switch(t){case"SCALAR":return r==="INT64"?0n:0;case"VEC2":return new Cr;case"VEC3":return new Fb;case"VEC4":return new kC;case"MAT2":return new TC;case"MAT3":return new _C;case"MAT4":return new PC;case"BOOLEAN":return!1;case"STRING":return"";case"ENUM":return 0}}function Ab(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 _a(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 zC(e,t=null){if(e.array){t=t&&Array.isArray(t)?t:[],t.length=e.count;for(let r=0,n=t.length;r<n;r++)t[r]=_l(e,t[r])}else t=_l(e,t);return t}function _l(e,t=null){let r=e.default,n=e.type;if(t||(t=ad(e)),r===null){switch(n){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(Ea(n))t.fromArray(r);else if(Pa(n))t.fromArray(r);else return r}function NC(e,t){if(e.noData===null)return t;let r=e.noData,n=e.type;if(Array.isArray(t))for(let a=0,s=t.length;a<s;a++)t[a]=i(t[a]);else t=i(t);return t;function i(a){return o(a)&&(a=_l(e,a)),a}function o(a){if(Ea(n)){let s=a.elements;for(let c=0,l=r.length;c<l;c++)if(r[c]!==s[c])return!1;return!0}else if(Pa(n)){for(let s=0,c=r.length;s<c;s++)if(r[s]!==a.getComponent(s))return!1;return!0}else return r===a}}function jC(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 VC(e,t){let{type:r,componentType:n,scale:i,offset:o,normalized:a}=e;if(Array.isArray(t))for(let d=0,m=t.length;d<m;d++)t[d]=s(t[d]);else t=s(t);return t;function s(d){return d=Ea(r)?l(d):Pa(r)?c(d):p(d),d}function c(d){return d.x=p(d.x),d.y=p(d.y),"z"in d&&(d.z=p(d.z)),"w"in d&&(d.w=p(d.w)),d}function l(d){let m=d.elements;for(let h=0,f=m.length;h<f;h++)m[h]=p(m[h]);return d}function p(d){return a&&(d=jC(n,d)),(a||BC(n))&&(d=d*i+o),d}}function dd(e,t,r=null){if(e.array){Array.isArray(t)||(t=Array(e.count||0)),t.length=r===null?e.count:r;for(let n=0,i=t.length;n<i;n++)Ab(e.type,t[n])||(t[n]=ad(e))}else Ab(e.type,t)||(t=ad(e));return t}function Pl(e,t){for(let r in t)r in e||delete t[r];for(let r in e){let n=e[r];t[r]=dd(n,t[r])}}function FC(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 Al=class{constructor(e,t,r=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=xt(t,"scale",1),this.max=xt(t,"max",1/0),this.min=xt(t,"min",-1/0),this.required=t.required||!1,this.noData=xt(t,"noData",null),this.default=xt(t,"default",null),this.semantic=xt(t,"semantic",null),this.enumSet=null,this.accessorProperty=r,r&&(this.offset=xt(r,"offset",this.offset),this.scale=xt(r,"scale",this.scale),this.max=xt(r,"max",this.max),this.min=xt(r,"min",this.min)),t.type==="ENUM"&&(this.enumSet=e[this.enumType],this.componentType===null&&(this.componentType=xt(this.enumSet,"valueType","UINT16")))}shapeToProperty(e,t=null){return dd(this,e,t)}resolveDefaultElement(e){return _l(this,e)}resolveDefault(e){return zC(this,e)}resolveNoData(e){return NC(this,e)}resolveEnumsToStrings(e){let t=this.enumSet;if(this.type==="ENUM")if(Array.isArray(e))for(let n=0,i=e.length;n<i;n++)e[n]=r(e[n]);else e=r(e);return e;function r(n){let i=t.values.find(o=>o.value===n);return i===null?"":i.name}}adjustValueScaleOffset(e){return Gb(this.type)?VC(this,e):e}},pd=class{constructor(e,t={},r={},n=null){this.definition=e,this.class=t[e.class],this.className=e.class,this.enums=r,this.data=n,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=Al){let t={};for(let r in this.class.properties)t[r]=new e(this.enums,this.class.properties[r],this.definition.properties[r]);this.properties=t}},UC=class extends Al{constructor(e,t,r=null){super(e,t,r),this.attribute=r?.attribute??null}},GC=class extends pd{constructor(...e){super(...e),this.isPropertyAttributeAccessor=!0,this._initProperties(UC)}getData(e,t,r={}){let n=this.properties;Pl(n,r);for(let i in n)r[i]=this.getPropertyValue(i,e,t,r[i]);return r}getPropertyValue(e,t,r,n=null){if(t>=this.count)throw Error("PropertyAttributeAccessor: Requested index is outside the range of the buffer.");let i=this.properties[e],o=i.type;if(!i)throw Error("PropertyAttributeAccessor: Requested class property does not exist.");if(!this.definition.properties[e])return i.resolveDefault(n);n=i.shapeToProperty(n);let a=r.getAttribute(i.attribute.toLowerCase());if(Ea(o)){let s=n.elements;for(let c=s.length;0<c;)s[0]=a.getComponent(t,0)}else if(Pa(o))n.fromBufferAttribute(a,t);else if(o==="SCALAR"||o==="ENUM")n=a.getX(t);else throw Error("StructuredMetadata.PropertyAttributeAccessor: BOOLEAN and STRING types are not supported by property attributes.");return n=i.adjustValueScaleOffset(n),n=i.resolveEnumsToStrings(n),n=i.resolveNoData(n),n}},HC=class extends Al{constructor(e,t,r=null){super(e,t,r),this.values=r?.values??null,this.valueLength=FC(this.type),this.arrayOffsets=xt(r,"arrayOffsets",null),this.stringOffsets=xt(r,"stringOffsets",null),this.arrayOffsetType=xt(r,"arrayOffsetType","UINT32"),this.stringOffsetType=xt(r,"stringOffsetType","UINT32")}getArrayLengthFromId(e,t){let r=this.count;if(this.arrayOffsets!==null){let{arrayOffsets:n,arrayOffsetType:i}=this,o=new(_a(i))(e[n]);r=o[t+1]-o[t]}return r}getIndexOffsetFromId(e,t){let r=t;if(this.arrayOffsets){let{arrayOffsets:n,arrayOffsetType:i}=this;r=new(_a(i))(e[n])[r]}else this.array&&(r*=this.count);return r}},WC=class extends pd{constructor(...e){super(...e),this.isPropertyTableAccessor=!0,this.count=this.definition.count,this._initProperties(HC)}getData(e,t={}){let r=this.properties;Pl(r,t);for(let n in r)t[n]=this.getPropertyValue(n,e,t[n]);return t}_readValueAtIndex(e,t,r,n=null){let i=this.properties[e],{componentType:o,type:a}=i,s=this.data,c=s[i.values],l=new(_a(o,a))(c),p=i.getIndexOffsetFromId(s,t);if(Gb(a)||a==="ENUM")return Hb(l,(p+r)*i.valueLength,a,n);if(a==="STRING"){let d=p+r,m=0;if(i.stringOffsets!==null){let{stringOffsets:f,stringOffsetType:g}=i,y=new(_a(g))(s[f]);m=y[d+1]-y[d],d=y[d]}let h=new Uint8Array(l.buffer,d,m);n=new TextDecoder().decode(h)}else if(a==="BOOLEAN"){let d=p+r,m=Math.floor(d/8),h=d%8;n=(l[m]>>h&1)==1}return n}getPropertyValue(e,t,r=null){if(t>=this.count)throw Error("PropertyTableAccessor: Requested index is outside the range of the table.");let n=this.properties[e];if(!n)throw Error("PropertyTableAccessor: Requested property does not exist.");if(!this.definition.properties[e])return n.resolveDefault(r);let i=n.array,o=this.data,a=n.getArrayLengthFromId(o,t);if(r=n.shapeToProperty(r,a),i)for(let s=0,c=r.length;s<c;s++)r[s]=this._readValueAtIndex(e,t,s,r[s]);else r=this._readValueAtIndex(e,t,0,r);return r=n.adjustValueScaleOffset(r),r=n.resolveEnumsToStrings(r),r=n.resolveNoData(r),r}},Ca=new xC,Rb=class{constructor(){this._renderer=new DC,this._target=new _b(1,1),this._texTarget=new _b,this._quad=new Ub(new RC({blending:wC,blendDst:LC,blendSrc:AC,uniforms:{map:{value:null},pixel:{value:new Cr}},vertexShader:`
11
+ void main() {
12
+
13
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
14
+
15
+ }
16
+ `,fragmentShader:`
17
+ uniform sampler2D map;
18
+ uniform ivec2 pixel;
19
+
20
+ void main() {
21
+
22
+ gl_FragColor = texelFetch( map, pixel, 0 );
23
+
24
+ }
25
+ `}))}increaseSizeTo(e){this._target.setSize(Math.max(this._target.width,e),1)}readDataAsync(e){let{_renderer:t,_target:r}=this;return t.readRenderTargetPixelsAsync(r,0,0,e.length/4,1,e)}readData(e){let{_renderer:t,_target:r}=this;t.readRenderTargetPixels(r,0,0,e.length/4,1,e)}renderPixelToTarget(e,t,r){let{_renderer:n,_target:i}=this;Ca.min.copy(t),Ca.max.copy(t),Ca.max.x+=1,Ca.max.y+=1,n.initRenderTarget(i),n.copyTextureToTexture(e,i.texture,Ca,r,0)}},Pn=new class{constructor(){let e=null;Object.getOwnPropertyNames(Rb.prototype).forEach(t=>{t!=="constructor"&&(this[t]=(...r)=>(e||(e=new Rb),e[t](...r)))})}},kb=new Cr,Db=new Cr,Lb=new Cr;function XC(e,t){return t===0?e.getAttribute("uv"):e.getAttribute(`uv${t}`)}function Wb(e,t,r=[,,,]){let n=3*t,i=3*t+1,o=3*t+2;return e.index&&(n=e.index.getX(n),i=e.index.getX(i),o=e.index.getX(o)),r[0]=n,r[1]=i,r[2]=o,r}function Xb(e,t,r,n,i){let[o,a,s]=n,c=XC(e,t);kb.fromBufferAttribute(c,o),Db.fromBufferAttribute(c,a),Lb.fromBufferAttribute(c,s),i.set(0,0,0).addScaledVector(kb,r.x).addScaledVector(Db,r.y).addScaledVector(Lb,r.z)}function $b(e,t,r,n){let i=e.x-Math.floor(e.x),o=e.y-Math.floor(e.y),a=Math.floor(i*t%t),s=Math.floor(o*r%r);return n.set(a,s),n}var Ob=new Cr,Ib=new Cr,Bb=new Cr,$C=class extends Al{constructor(e,t,r=null){super(e,t,r),this.channels=xt(r,"channels",[0]),this.index=xt(r,"index",null),this.texCoord=xt(r,"texCoord",null),this.valueLength=parseInt(this.type.replace(/[^0-9]/g,""))||1}readDataFromBuffer(e,t,r=null){let n=this.type;if(n==="BOOLEAN"||n==="STRING")throw Error("PropertyTextureAccessor: BOOLEAN and STRING types not supported.");return Hb(e,t*this.valueLength,n,r)}},qC=class extends pd{constructor(...e){super(...e),this.isPropertyTextureAccessor=!0,this._asyncRead=!1,this._initProperties($C)}getData(e,t,r,n={}){let i=this.properties;Pl(i,n);let o=Object.keys(i),a=o.map(s=>n[s]);return this.getPropertyValuesAtTexel(o,e,t,r,a),o.forEach((s,c)=>n[s]=a[c]),n}async getDataAsync(e,t,r,n={}){let i=this.properties;Pl(i,n);let o=Object.keys(i),a=o.map(s=>n[s]);return await this.getPropertyValuesAtTexelAsync(o,e,t,r,a),o.forEach((s,c)=>n[s]=a[c]),n}getPropertyValuesAtTexelAsync(...e){this._asyncRead=!0;let t=this.getPropertyValuesAtTexel(...e);return this._asyncRead=!1,t}getPropertyValuesAtTexel(e,t,r,n,i=[]){for(;i.length<e.length;)i.push(null);i.length=e.length,Pn.increaseSizeTo(i.length);let o=this.data,a=this.definition.properties,s=this.properties,c=Wb(n,t);for(let d=0,m=e.length;d<m;d++){let h=e[d];if(!a[h])continue;let f=s[h],g=o[f.index];Xb(n,f.texCoord,r,c,Ob),$b(Ob,g.image.width,g.image.height,Ib),Bb.set(d,0),Pn.renderPixelToTarget(g,Ib,Bb)}let l=new Uint8Array(e.length*4);if(this._asyncRead)return Pn.readDataAsync(l).then(()=>(p.call(this),i));return Pn.readData(l),p.call(this),i;function p(){for(let d=0,m=e.length;d<m;d++){let h=e[d],f=s[h],g=f.type;if(i[d]=dd(f,i[d]),!f)throw Error("PropertyTextureAccessor: Requested property does not exist.");if(!a[h]){i[d]=f.resolveDefault(i);continue}let y=f.valueLength*(f.count||1),x=f.channels.map(N=>l[4*d+N]),C=f.componentType,v=new(_a(C,g))(y);if(new Uint8Array(v.buffer).set(x),f.array){let N=i[d];for(let M=0,S=N.length;M<S;M++)N[M]=f.readDataFromBuffer(v,M,N[M])}else i[d]=f.readDataFromBuffer(v,0,i[d]);i[d]=f.adjustValueScaleOffset(i[d]),i[d]=f.resolveEnumsToStrings(i[d]),i[d]=f.resolveNoData(i[d])}}}dispose(){this.data.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},sd=class{constructor(e,t,r,n=null,i=null){let{schema:o,propertyTables:a=[],propertyTextures:s=[],propertyAttributes:c=[]}=e,{enums:l,classes:p}=o,d=a.map(f=>new WC(f,p,l,r)),m=[],h=[];n&&(n.propertyTextures&&(m=n.propertyTextures.map(f=>new qC(s[f],p,l,t))),n.propertyAttributes&&(h=n.propertyAttributes.map(f=>new GC(c[f],p,l)))),this.schema=o,this.tableAccessors=d,this.textureAccessors=m,this.attributeAccessors=h,this.object=i,this.textures=t,this.nodeMetadata=n}getPropertyTableData(e,t,r=null){if(!Array.isArray(e))r||(r={}),r=this.tableAccessors[e].getData(t,r);else{r||(r=[]);let n=Math.min(e.length,t.length);r.length=n;for(let i=0;i<n;i++){let o=this.tableAccessors[e[i]];r[i]=o.getData(t[i],r[i])}}if(Array.isArray(e)!==Array.isArray(r)||Array.isArray(e)!==Array.isArray(t))throw Error("StructuralMetadata: Scalar and array inputs cannot be mixed.");return r}getPropertyTableInfo(e=null){if(e===null&&(e=this.tableAccessors.map((t,r)=>r)),Array.isArray(e))return e.map(t=>{let r=this.tableAccessors[t];return{name:r.name,className:r.definition.class}});{let t=this.tableAccessors[e];return{name:t.name,className:t.definition.class}}}getPropertyTextureData(e,t,r=[]){let n=this.textureAccessors;r.length=n.length;for(let i=0;i<n.length;i++)r[i]=n[i].getData(e,t,this.object.geometry,r[i]);return r}async getPropertyTextureDataAsync(e,t,r=[]){let n=this.textureAccessors;r.length=n.length;let i=[];for(let o=0;o<n.length;o++){let a=n[o].getDataAsync(e,t,this.object.geometry,r[o]).then(s=>{r[o]=s});i.push(a)}return await Promise.all(i),r}getPropertyTextureInfo(){return this.textureAccessors}getPropertyAttributeData(e,t=[]){let r=this.attributeAccessors;t.length=r.length;for(let n=0;n<r.length;n++)t[n]=r[n].getData(e,this.object.geometry,t[n]);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())}},Ta="EXT_structural_metadata";function YC(e,t=[]){let r=e.json.textures?.length||0,n=Array(r).fill(null);return t.forEach(({properties:i})=>{for(let o in i){let{index:a}=i[o];n[a]===null&&(n[a]=e.loadTexture(a))}}),Promise.all(n)}function KC(e,t=[]){let r=e.json.bufferViews?.length||0,n=Array(r).fill(null);return t.forEach(({properties:i})=>{for(let o in i){let{values:a,arrayOffsets:s,stringOffsets:c}=i[o];n[a]===null&&(n[a]=e.getDependency("bufferView",a)),n[s]===null&&(n[s]=e.getDependency("bufferView",s)),n[c]===null&&(n[c]=e.getDependency("bufferView",c))}}),Promise.all(n)}var qb=class{constructor(e){this.parser=e,this.name=Ta}async afterRoot({scene:e,parser:t}){let r=t.json.extensionsUsed;if(!r||!r.includes(Ta))return;let n=null,i=t.json.extensions[Ta];if(i.schemaUri){let{manager:c,path:l,requestHeader:p,crossOrigin:d}=t.options,m=new URL(i.schemaUri,l).toString(),h=new SC(c);h.setCrossOrigin(d),h.setResponseType("json"),h.setRequestHeader(p),n=h.loadAsync(m).then(f=>{i={...i,schema:f}})}let[o,a]=await Promise.all([YC(t,i.propertyTextures),KC(t,i.propertyTables),n]),s=new sd(i,o,a);e.userData.structuralMetadata=s,e.traverse(c=>{if(t.associations.has(c)){let{meshes:l,primitives:p}=t.associations.get(c),d=t.json.meshes[l]?.primitives[p];if(d&&d.extensions&&d.extensions[Ta]){let m=d.extensions[Ta];c.userData.structuralMetadata=new sd(i,o,a,m,c)}else c.userData.structuralMetadata=s}})}},zb=new Cr,Nb=new Cr,jb=new Cr;function QC(e){return e.x>e.y&&e.x>e.z?0:e.y>e.z?1:2}var Yb=class{constructor(e,t,r){this.geometry=e,this.textures=t,this.data=r,this._asyncRead=!1,this.featureIds=r.featureIds.map(n=>{let{texture:i,...o}=n,a={label:null,propertyTable:null,nullFeatureId:null,...o};return i&&(a.texture={texCoord:0,channels:[0],...i}),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:r,textures:n,featureIds:i}=this,o=Array(i.length).fill(null),a=i.length;Pn.increaseSizeTo(a);let s=Wb(r,e),c=s[QC(t)];for(let d=0,m=i.length;d<m;d++){let h=i[d],f="nullFeatureId"in h?h.nullFeatureId:null;if("texture"in h){let g=n[h.texture.index];Xb(r,h.texture.texCoord,t,s,zb),$b(zb,g.image.width,g.image.height,Nb),jb.set(d,0),Pn.renderPixelToTarget(n[h.texture.index],Nb,jb)}else if("attribute"in h){let g=r.getAttribute(`_feature_id_${h.attribute}`).getX(c);g!==f&&(o[d]=g)}else{let g=c;g!==f&&(o[d]=g)}}let l=new Uint8Array(a*4);if(this._asyncRead)return Pn.readDataAsync(l).then(()=>(p(),o));return Pn.readData(l),p(),o;function p(){let d=new Uint32Array(1);for(let m=0,h=i.length;m<h;m++){let f=i[m],g="nullFeatureId"in f?f.nullFeatureId:null;if("texture"in f){let{channels:y}=f.texture,x=y.map(v=>l[4*m+v]);new Uint8Array(d.buffer).set(x);let C=d[0];C!==g&&(o[m]=C)}}}}dispose(){this.textures.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},El="EXT_mesh_features";function Vb(e,t,r){e.traverse(n=>{if(t.associations.has(n)){let{meshes:i,primitives:o}=t.associations.get(n),a=t.json.meshes[i]?.primitives[o];a&&a.extensions&&a.extensions[El]&&r(n,a.extensions[El])}})}var Kb=class{constructor(e){this.parser=e,this.name=El}async afterRoot({scene:e,parser:t}){let r=t.json.extensionsUsed;if(!r||!r.includes(El))return;let n=t.json.textures?.length||0,i=Array(n).fill(null);Vb(e,t,(a,{featureIds:s})=>{s.forEach(c=>{if(c.texture&&i[c.texture.index]===null){let l=c.texture.index;i[l]=t.loadTexture(l)}})});let o=await Promise.all(i);Vb(e,t,(a,s)=>{a.userData.meshFeatures=new Yb(a.geometry,o,s)})}},Qb=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])}}},hd=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 OC(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 Qb),this.metadata&&(t.register(()=>new qb),t.register(()=>new Kb)),this.plugins.forEach(r=>t.register(r)),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:LL}=cd;var OL=new Ub(new EC),JC=new MC(new Uint8Array([255,255,255,255]),1,1);JC.needsUpdate=!0;var ZC=0,eT=1,tT=2,rT=3,nT=4,iT=5,oT=6,aT=7,sT=8,lT=9,cT=10,uT=11,IL=Object.freeze({NONE:ZC,SCREEN_ERROR:eT,GEOMETRIC_ERROR:tT,DISTANCE:rT,DEPTH:nT,RELATIVE_DEPTH:iT,IS_LEAF:oT,RANDOM_COLOR:aT,RANDOM_NODE_COLOR:sT,CUSTOM_COLOR:lT,LOAD_ORDER:cT,INDEXED_COLOR:uT});var BL=Math.PI/4,zL=3/5;var _n={NONE:0,NOT_READY:1,NO_FIT:2,DEPTH:3,OCCUPANCY:4,SPACING:5,ANGLE:6,FACING:7};var NL=new class{constructor(){this._cache={}}getColor(...e){let t=e.pop(),r=e.join("_"),{_cache:n}=this;return r in n||(t.setHSL(Math.random(),1,.5),n[r]=t.getHex()),t.set(n[r])}};var jL={[_n.NONE]:16777215,[_n.NOT_READY]:7829367,[_n.NO_FIT]:2250239,[_n.DEPTH]:4473924,[_n.OCCUPANCY]:65535,[_n.SPACING]:16776960,[_n.ANGLE]:16711680,[_n.FACING]:16711935};var VL=Math.PI/180;var FL=ii*Math.PI*2;var UL=ii*Math.PI*2;import{DRACOLoader as gT}from"three/examples/jsm/loaders/DRACOLoader.js";import{KTX2Loader as bT}from"three/examples/jsm/loaders/KTX2Loader.js";import{MeshoptDecoder as yT}from"three/examples/jsm/libs/meshopt_decoder.module.js";import{Box3 as vT,DoubleSide as xT,MathUtils as wT,Matrix4 as ty,Sphere as MT,Vector3 as ST}from"three";import{BufferAttribute as Jb,MathUtils as dT}from"three";function Zb(e){return!!e&&!e.isInterleavedBufferAttribute}function ey(e,t,r,n){for(let i=0;i<e.count;i+=1)for(let o=0;o<e.itemSize;o+=1)t.setComponent(i,o,dT.clamp(e.getComponent(i,o),r,n));return t}function pT(e){for(let t=0;t<e.count;t+=1)for(let r=0;r<e.itemSize;r+=1){let n=e.getComponent(t,r);if(!Number.isFinite(n)||n<0||n>1)return!1}return!0}var Rl=class{constructor(){this.name="RI_VERTEX_COMPRESSION_PLUGIN";this.priority=-99}processTileModel(t){t.traverse(r=>{let n=r.geometry;if(!n)return;let i=n.attributes.normal;Zb(i)&&!(i.array instanceof Int16Array)&&(n.attributes.normal=ey(i,new Jb(new Int16Array(i.count*i.itemSize),i.itemSize,!0),-1,1));for(let o of["uv","uv1","uv2","uv3"]){let a=n.attributes[o];!Zb(a)||a.array instanceof Uint16Array||!pT(a)||(n.attributes[o]=ey(a,new Jb(new Uint16Array(a.count*a.itemSize),a.itemSize,!0),0,1))}})}};import{jsx as ny,jsxs as AT}from"react/jsx-runtime";var CT=0,ry=4,TT=6,_T=12,PT=4;function ET(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 fd({url:e,rotation:t=[0,0,0],errorTarget:r=64,cacheSize:n=800,memoryBudgetMB:i=800,decoderConfig:o,objectBindings:a,itemMaterials:s,sceneConfig:c,selectedItem:l,panelHoveredItem:p,highlightOnHover:d=!0,onItemClick:m,onItemHover:h,onItemDoubleClick:f,onItemContextMenu:g,onObjectCatalog:y,onTilesetBounds:x,onModelLoaded:C,onLoadError:v,nodeRefsOut:N,onNodeRefsChange:M,materialRefsOut:S,explodeFactor:O=0,suspendBindingTransforms:R=!1}){let{camera:P,gl:T,invalidate:w}=fT(),A=At(null),[k,V]=md(null),F=At({onItemClick:m,onItemHover:h,onItemDoubleClick:f,onObjectCatalog:y,onTilesetBounds:x,onModelLoaded:C,onLoadError:v,onNodeRefsChange:M});F.current={onItemClick:m,onItemHover:h,onItemDoubleClick:f,onObjectCatalog:y,onTilesetBounds:x,onModelLoaded:C,onLoadError:v,onNodeRefsChange:M};let z=At(!0),[H,E]=md(null),G=At(null);G.current=H;let K=At([]),Ce=At(!1);An(()=>{let X=new ol;return E(X),()=>X.dispose()},[e]);let Z=At(null),Te=At(0),Ne=At(!1),pe=i*1024*1024,Ue=At(!1),Ee=At(Ru),Ke=At(null),dt=At(null),fe=At(null);An(()=>()=>{fe.current!==null&&clearTimeout(fe.current)},[]);let Ie=o?.dracoDecoderPath??Uh,Xe=o?.ktx2TranscoderPath??Gh,Qt=o?.meshopt??!0,[J,cr]=md(null);An(()=>{Ne.current=!1,Ue.current=!1;let X=new od(e);X.loadAncestors=!0;let ue=new dl;ue.priorityCallback=X.downloadQueue.priorityCallback,ue.maxJobsPerOrigin=_T;let le=new Ir;le.priorityCallback=X.parseQueue.priorityCallback,le.maxJobs=TT;let Le=new Ir;Le.priorityCallback=X.processNodeQueue.priorityCallback,Le.maxJobs=X.processNodeQueue.maxJobs;let De=new ha;De.unloadPriorityCallback=X.lruCache.unloadPriorityCallback,X.downloadQueue=ue,X.parseQueue=le,X.processNodeQueue=Le,X.lruCache=De;let Me=Ie?new gT().setDecoderPath(Ie).setWorkerLimit(PT):null,Be=Xe?new bT().setTranscoderPath(Xe).detectSupport(T):null;return X.registerPlugin(new hd({dracoLoader:Me,ktxLoader:Be,meshoptDecoder:Qt?yT:null,autoDispose:!1})),X.registerPlugin(new ud({disableMipmaps:!1,compressIndex:!0,compressNormals:!1,compressUvs:!1,compressPosition:!0})),X.registerPlugin(new Rl),cr(X),window.__riTiles=X,()=>{X.forEachLoadedModel(re=>Vo(re)),X.dispose(),Me?.dispose(),Be?.dispose(),cr(re=>re===X?null:re)}},[Ie,T,Xe,Qt,e]),An(()=>{J&&(Ee.current=Ru,Ke.current=null,J.errorTarget=r,J.lruCache.maxSize=n,J.lruCache.minSize=Math.max(1,Math.floor(n*.75)),J.lruCache.maxBytesSize=pe,J.lruCache.minBytesSize=pe*.75,w())},[n,r,w,pe,J]);let et=hT(()=>{let X=a??{};return{objectBindings:X,keyByModelObject:Ag(X),itemMaterials:s,shadingMode:c?.model.shading??"lit",rendererMode:c?.model.renderer??"pbr",selectedKey:l??null,hoveredKey:Rg(k,p),highlightOnHover:d,suspendTransforms:R,placementFrame:J?.group.matrixWorld,invalidate:w}},[k,d,w,s,a,p,c,l,R,J]),ze=En(()=>{if(!J)return;let X=St.current,ue=Ce.current?G.current?.nodesByBinding(X)??{}:{},le={};J.group.traverse(Be=>{if(!Be.isMesh)return;let re=Eu(Be);if(!re)return;let Se=X.keyByModelObject[re]??re;if(!X.objectBindings[Se])return;ue[Se]||(ue[Se]=Be);let Ae=Be.material;Ae&&(le[Se]=Ae)});let Le=N?.current??{},De=Object.keys(Le),Me=De.length!==Object.keys(ue).length||De.some(Be=>Le[Be]!==ue[Be]);N&&(N.current=ue),S&&(S.current=le),(Me||!N)&&F.current.onNodeRefsChange?.()},[S,N,J]),ke=En(X=>nl(X,et),[et]),jt=En(X=>Dg(X,et),[et]),ur=At(jt);ur.current=jt;let St=At(et);St.current=et;let Qe=En(()=>{let X=Z.current,ue=Te.current;return!X||ue<=0?St.current:{...St.current,explode:{factor:ue,centre:X.centre,radius:X.radius}}},[]);An(()=>{J&&(jt(J.group),z.current=!0,J.forEachLoadedModel(X=>{jt(X),Qi(X,Qe())}),w())},[jt,w,Qe,J]),An(()=>{let X=ET(e);if(!X)return;let ue=!1;return fetch(X).then(le=>le.ok?le.json():null).then(le=>{ue||!le?.objects||(K.current=le.objects,Ce.current=le.bindingFrame==="gltf-identity-v2",Ce.current&&G.current?.setCatalog(le.objects),z.current=!0,F.current.onObjectCatalog?.(le.objects),w())}).catch(()=>{}),()=>{ue=!0}},[e,w,H]),An(()=>{if(!J)return;let X=!1,ue=()=>w(),le=re=>{re.scene&&(re.scene.traverse(Se=>{let Ae=Se.material;for(let ht of Array.isArray(Ae)?Ae:Ae?[Ae]:[])ht.transparent&&ht.side===xT&&(ht.forceSinglePass=!0)}),ur.current(re.scene),Qi(re.scene,Qe()),as(re.scene)),z.current=!0,X||(X=!0,F.current.onModelLoaded?.(J.group)),w()},Le=re=>{F.current.onLoadError?.(re.error)},De=re=>{re.scene&&(Au(re.scene),Vo(re.scene)),z.current=!0};J.setCamera(P),J.setResolutionFromRenderer(P,T),J.addEventListener("needs-update",ue),J.addEventListener("load-model",le),J.addEventListener("load-error",Le),J.addEventListener("dispose-model",De);let Me=()=>{z.current=!0,w()};J.addEventListener("tile-visibility-change",Me);let Be=()=>{let re=J.root;re&&!re.content?.uri&&re.refine==="REPLACE"&&(re.refine="ADD",w())};return J.addEventListener("load-root-tileset",Be),w(),()=>{J.removeEventListener("needs-update",ue),J.removeEventListener("load-model",le),J.removeEventListener("load-error",Le),J.removeEventListener("dispose-model",De),J.removeEventListener("tile-visibility-change",Me),J.removeEventListener("load-root-tileset",Be),Au(J.group),J.deleteCamera(P),N&&(N.current={}),S&&(S.current={})}},[P,T,w,S,N,Qe,J]);let ne=Ms(X=>ke(X)?.binding??null,g),be=En(X=>{if(ne.consumeClick())return;let ue=ke(X.object);ue&&(X.stopPropagation(),F.current.onItemClick?.(ue.binding))},[ke,ne,m]),ft=En(X=>{let ue=ke(X.object);if(!ue)return;F.current.onItemDoubleClick?.(ue.binding,Gi(X))&&X.stopPropagation()},[ke]),Ve=En(X=>{let ue=ke(X.object),le=ue?.key??null;le!==A.current&&(A.current=le,V(le),F.current.onItemHover?.(ue?.binding??null))},[ke]),pt=En(()=>{A.current!==null&&(A.current=null,V(null),F.current.onItemHover?.(null))},[]);return An(()=>{w()},[w,J]),mT((X,ue)=>{if(!J)return;if(J.setResolutionFromRenderer(P,T),Ce.current&&H){let gt=H.sync(Qe(),l,R);H.updateBounds(J.root),R&&J.forEachLoadedModel(Pr=>Qi(Pr,gt))}if(J.update(),!Ne.current){let gt=new vT;if(J.getBoundingBox(gt)){Ne.current=!0,J.group.updateMatrixWorld(),gt.applyMatrix4(J.group.matrixWorld);let Pr=gt.getBoundingSphere(new MT);Z.current={centre:Pr.center.clone(),radius:gt.getSize(new ST).length()*.5},F.current.onTilesetBounds?.(gt),w()}}z.current&&(z.current=!1,ze());let le=Math.min(Math.max(O,0),1),Le=Te.current;Math.abs(Le-le)>1e-4?(Te.current=wT.lerp(Le,le,1-Math.exp(-6*ue)),Qi(J.group,Qe()),w()):Le!==le&&(Te.current=le,Qi(J.group,Qe()),w());let De=J,Me=J.lruCache,Be=Me.isFull(),re=Ee.current,Se=re.loosened&&Ke.current?Ke.current:{bytes:Me.maxBytesSize,items:Me.maxSize},Ae=0;for(let gt of Me.usedSet??[])Ae+=Me.bytesMap?.get(gt)??0;let ht=!1,Jt=J;for(let gt of Jt.usedSet??[]){let Pr=gt.internal?.loadingState??ry;if(gt.traversal?.used&&gt.internal?.hasContent&&Pr>=CT&&Pr<ry){ht=!0;break}}let it=dt.current??(dt.current={world:new ty,projection:new ty}),kt=!it.world.equals(P.matrixWorld)||!it.projection.equals(P.projectionMatrix);kt&&(it.world.copy(P.matrixWorld),it.projection.copy(P.projectionMatrix));let jr={full:Be,wanting:ht,moved:kt,usage:Math.max(Ae/Math.max(1,Se.bytes),(Me.usedSet?.size??0)/Math.max(1,Se.items)),now:performance.now()},Zt=Hg(re,jr);Zt!==re&&(Zt.loosened&&(!re.loosened||Zt.raisedAt!==re.raisedAt)?(re.loosened||(Ke.current=Se),Me.maxBytesSize=Math.max(Se.bytes,Me.cachedBytes??0)*ku,Me.maxSize=Math.ceil(Math.max(Se.items,Me.itemSet?.size??0)*ku)):!Zt.loosened&&re.loosened&&Ke.current&&(Me.maxBytesSize=Ke.current.bytes,Me.maxSize=Ke.current.items,Ke.current=null),Ee.current=Zt,J.errorTarget=r*Zt.factor,w()),!Ue.current&&Be&&jr.wanting&&Zt.factor>=ca&&(Ue.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 Dn=Wg(Zt,jr);Dn===0?w():Dn!==null&&fe.current===null&&(fe.current=setTimeout(()=>{fe.current=null,w()},Dn)),((De.stats?.downloading??0)>0||(De.stats?.parsing??0)>0||De.loadProgress!==void 0&&De.loadProgress<1&&!Be)&&w()}),J?AT("group",{rotation:t,children:[H?ny("primitive",{object:H.group}):null,ny("primitive",{object:J.group,onClick:be,onDoubleClick:ft,onPointerDown:g?ne.onPointerDown:void 0,onPointerMove:Ve,onPointerOut:pt})]}):null}import{Matrix4 as gd}from"three";var RT=new gd().makeRotationX(Math.PI/2);function iy(e){e.updateMatrixWorld(!0);let t=new gd().copy(e.matrixWorld).invert().premultiply(RT),r=new gd,n=[];for(let[i,o]of Object.entries(Oi(e).nodesById)){let a=o;if(!a.isMesh||!a.geometry||!o.name)continue;let s=a.geometry;s.boundingBox||s.computeBoundingBox();let c=s.boundingBox.clone().applyMatrix4(r.multiplyMatrices(t,o.matrixWorld)),l=s.index?s.index.count:s.getAttribute("position")?.count??0;n.push({name:i,triangles:Math.floor(l/3),minimum:c.min.toArray(),maximum:c.max.toArray()})}return n.sort((i,o)=>i.name.localeCompare(o.name))}import{useMemo as li,useRef as Rn,useState as io,useEffect as si,useCallback as no}from"react";import{Html as oy}from"@react-three/drei";import{useFrame as ay,useThree as yd}from"@react-three/fiber";import{MathUtils as bd,Vector3 as Aa}from"three";import{jsx as Tr,jsxs as vd}from"react/jsx-runtime";var kT=.02;function sy(e,t){let r=Rn(null),n=yd(l=>l.scene),i=Rn(null),o=li(()=>new Aa(...e.anchorLocalPosition??e.localPosition??e.worldPosition),[e.anchorLocalPosition,e.localPosition,e.worldPosition]),a=li(()=>new Aa,[]),s=li(()=>new Aa,[]),c=li(()=>new Aa,[]);return si(()=>{i.current=null},[e.anchorNodeName]),ay(({camera:l})=>{let p=r.current,d=p?.parent;if(!p||!d)return;let m=i.current;if(e.anchorNodeName&&(!m||!m.parent)&&(m=Gn(n,e.anchorNodeName),i.current=m),m?(m.updateWorldMatrix(!0,!1),a.copy(o).applyMatrix4(m.matrixWorld)):(a.copy(o),d.localToWorld(a)),t){let h=t.current.get(e.id);h||(h=new Aa,t.current.set(e.id,h)),h.copy(a)}c.copy(l.position).sub(a),c.lengthSq()>0?(c.normalize(),s.copy(a).addScaledVector(c,kT)):s.copy(a),d.worldToLocal(s),p.position.copy(s)}),r}function DT({annotation:e,occluders:t,worldPositionsRef:r,onClick:n,onHover:i,showAnnotationOnHover:o}){let[a,s]=io(!1),c=sy(e,r),[l,p]=io(!1),[d,m]=io(1),h=Rn(null),f=Rn(null),g=Rn(null);si(()=>()=>{h.current&&(clearTimeout(h.current),h.current=null),g.current&&(clearTimeout(g.current),g.current=null)},[]);let y=M=>{M.stopPropagation(),M.preventDefault(),h.current&&(clearTimeout(h.current),h.current=null),h.current=window.setTimeout(()=>{n?.(e),h.current=null},10)},x=M=>{M.stopPropagation(),p(!0),m(100),g.current&&(clearTimeout(g.current),g.current=null),i?.(e),o&&n?.(e)},C=M=>{M.stopPropagation(),p(!1),m(1),g.current&&clearTimeout(g.current),g.current=window.setTimeout(()=>{i?.(null),o&&i?.(null),g.current=null},50)},v=M=>{M.stopPropagation();let S=M.currentTarget;S.dataset.pointerX=String(M.clientX),S.dataset.pointerY=String(M.clientY)},N=M=>{M.stopPropagation();let S=M.currentTarget,O=parseFloat(S.dataset.pointerX||"0"),R=parseFloat(S.dataset.pointerY||"0"),P=M.clientX-O,T=M.clientY-R;Math.sqrt(P*P+T*T)<10&&y(M)};return Tr("group",{ref:c,children:Tr(oy,{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:Tr("div",{ref:f,className:`ri-annotationMarker ${l?"ri-annotationMarker--hovered":""}`,title:e.title,style:{display:a?"none":"flex"},onPointerDown:v,onPointerUp:N,onPointerEnter:x,onPointerLeave:C,onDoubleClick:M=>{M.stopPropagation(),n?.(e)},role:"button",tabIndex:0,"aria-label":`Annotation ${e.id}`,children:Tr("span",{className:"ri-annotationMarker-id",children:e.id})})})})}function LT({annotation:e,occluders:t,popupRef:r,onClose:n,hideCloseButton:i=!1}){let[o,a]=io(!1),s=sy(e),c=vd("div",{ref:r,className:"ri-viewAnnotationPopup",style:{display:o?"none":"block"},onPointerDown:l=>l.stopPropagation(),onClick:l=>l.stopPropagation(),children:[vd("div",{className:"ri-viewAnnotationHeader",children:[Tr("h4",{className:"ri-viewAnnotationTitle",children:e.title}),!i&&Tr("button",{onClick:l=>{l.stopPropagation(),n?.()},className:"ri-viewAnnotationClose","aria-label":"Close annotation",children:"\xD7"})]}),e.description&&Tr("p",{className:"ri-viewAnnotationDescription",children:e.description})]});return Tr("group",{ref:s,children:Tr(oy,{occlude:t,onOcclude:a,pointerEvents:o?"none":"auto",zIndexRange:[1e3,2e3],style:{pointerEvents:o?"none":"auto",zIndex:1e3},transparent:!0,children:c})})}function xd({annotations:e,sceneConfig:t,activeAnnotation:r,popupRef:n,canvasRootRef:i,worldPositionsRef:o,modelLoaded:a,onAnnotationClick:s,onAnnotationHover:c,onCloseAnnotation:l,hideCloseButton:p=!1,showAnnotationOnHover:d=!1}){let m=yd(F=>F.invalidate),h=yd(F=>F.scene),[f,g]=io(null),[y,x]=io(!1),C=Rn(null),v=Rn(null),N=Rn(null),M=li(()=>{let F=[];return h.traverse(z=>{let H=z;H.isMesh&&!H.isSkinnedMesh&&F.push({current:z})}),F},[h,e,a]),S=no(()=>{m();let F=()=>{m(),v.current=window.requestAnimationFrame(()=>{m(),v.current=null})};v.current=window.requestAnimationFrame(F)},[m]);si(()=>{S()},[e,S]),si(()=>{S()},[r,S]),si(()=>()=>{v.current!==null&&window.cancelAnimationFrame(v.current),N.current&&clearTimeout(N.current)},[]);let O=y?f:r||f,R=li(()=>O?e.find(F=>F.id===O.id)??O:null,[O,e]),P=no(F=>{if(y&&f?.id===F.id){x(!1),g(null),l?.();return}x(!0),g(F),s?.(F)},[y,f,s,l]),T=no(F=>{c?.(F),d&&!y&&(N.current&&(clearTimeout(N.current),N.current=null),F?g(F):N.current=window.setTimeout(()=>{g(null),l?.(),N.current=null},100))},[y,c,d,l]),w=no(()=>{x(!1),g(null),l?.()},[l]),A=no(F=>{let z=F.target;if(z.closest?.(".ri-annotationMarker")||z.closest?.(".ri-viewAnnotationPopup")||z.closest?.(".annotation-html-wrapper"))return;let H=i.current;H&&H.contains(z)&&(x(!1),g(null),l?.())},[i,l]),k=no(F=>{F.key==="Escape"&&y&&(x(!1),g(null),l?.())},[y,l]);si(()=>{let F=i.current;return F&&(F.addEventListener("click",A),F.addEventListener("pointerdown",A)),document.addEventListener("keydown",k),()=>{F&&(F.removeEventListener("click",A),F.removeEventListener("pointerdown",A)),document.removeEventListener("keydown",k)}},[i,A,k]);let V=li(()=>(t?.model.rotation??[0,0,0]).map(F=>F*Math.PI/180),[t?.model.rotation]);return si(()=>{m()},[m,V]),ay((F,z)=>{if(!C.current)return;C.current.rotation.x=bd.lerp(C.current.rotation.x,V[0],1-Math.exp(-5*z)),C.current.rotation.y=bd.lerp(C.current.rotation.y,V[1],1-Math.exp(-5*z)),C.current.rotation.z=bd.lerp(C.current.rotation.z,V[2],1-Math.exp(-5*z));let{rotation:H}=C.current;Math.abs(H.x-V[0])+Math.abs(H.y-V[1])+Math.abs(H.z-V[2])>1e-4&&m()}),vd("group",{ref:C,children:[e.map(F=>{let z=`${F.worldPosition.join(",")}-${F.title}-${F.id}`;return Tr(DT,{annotation:F,occluders:M,worldPositionsRef:o,onClick:P,onHover:T,showAnnotationOnHover:d},z)}),R?Tr(LT,{annotation:R,occluders:M,popupRef:n,onClose:w,hideCloseButton:p},`popup-${R.id}`):null]})}import{useEffect as uy,useMemo as Ra}from"react";import{Html as wd,Line as oo}from"@react-three/drei";import{BoxGeometry as OT,BufferGeometry as IT,DoubleSide as BT,EdgesGeometry as zT,Float32BufferAttribute as NT,Vector3 as rn}from"three";import{Fragment as kl,jsx as Ye,jsxs as ar}from"react/jsx-runtime";var ci="#22d3ee",jT="#facc15";function ao(e,t){let r=e<10?e.toFixed(3):e.toFixed(2);return t?`${r} ${t}`:r}function ly(e,t){return[(e[0]+t[0])/2,(e[1]+t[1])/2,(e[2]+t[2])/2]}function kn({position:e,children:t}){return Ye(wd,{center:!0,position:e,zIndexRange:[20,0],style:{pointerEvents:"none"},children:Ye("div",{className:"ri-measureLabel",children:t})})}function cy({positions:e,triangles:t}){let r=Ra(()=>{let n=new rn(...e[0]),i=new IT;return i.setAttribute("position",new NT(e.flatMap(o=>new rn(...o).sub(n).toArray()),3)),i.setIndex(t.flat()),i},[e,t]);return uy(()=>()=>r.dispose(),[r]),Ye("mesh",{position:e[0],geometry:r,raycast:()=>{},renderOrder:100,children:Ye("meshBasicMaterial",{color:ci,side:BT,transparent:!0,opacity:.18,depthWrite:!1})})}var VT=[[0,1,2]];function FT({positions:e}){let t=Bs(e);if(t===null)return null;let r=new rn(...e[1]),n=new rn(...e[0]).sub(r),i=new rn(...e[2]).sub(r),o=Math.min(n.length(),i.length())*.22;n.normalize(),i.normalize();let a=n.clone().cross(i);a.lengthSq()<1e-12&&a.copy(n).cross(Math.abs(n.y)<.9?new rn(0,1,0):new rn(1,0,0)),a.normalize();let s=t*Math.PI/180,c=Array.from({length:33},(p,d)=>n.clone().applyAxisAngle(a,s*d/32).multiplyScalar(o).add(r).toArray()),l=n.clone().applyAxisAngle(a,s/2).multiplyScalar(o*1.4).add(r).toArray();return ar(kl,{children:[Ye(oo,{points:c,color:ci,lineWidth:2}),ar(kn,{position:l,children:[t.toFixed(2),"\xB0"]})]})}function UT({box:e,unit:t}){let r=Ra(()=>[(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]),n=Ra(()=>{let[s,c,l]=e.size,p=new OT(s||1e-4,c||1e-4,l||1e-4),d=new zT(p);return p.dispose(),d},[e.size]);uy(()=>()=>{n.dispose()},[n]);let[i,o,a]=e.size;return ar("group",{position:r,children:[Ye("lineSegments",{geometry:n,children:Ye("lineBasicMaterial",{color:jT})}),ar(kn,{position:[0,-o/2,a/2],children:["W ",ao(i,t)]}),ar(kn,{position:[-i/2,0,a/2],children:["H ",ao(o,t)]}),ar(kn,{position:[i/2,-o/2,0],children:["D ",ao(a,t)]})]})}function Md({points:e,unit:t,box:r,showDimensions:n,tool:i="distance",areaClosed:o=!1,snapPreview:a}){let s=Ra(()=>e.map(p=>p.position),[e]),c=Ra(()=>i==="area"&&o?zs(s):null,[i,o,s]),l=i==="pointToPlane"&&e.length===2?Lf(e[0],e[1].position):null;return ar("group",{children:[e.map(p=>Ye(wd,{center:!0,position:p.position,zIndexRange:[15,0],style:{pointerEvents:"none"},children:Ye("div",{className:`ri-measureDot${p.snapped?" ri-measureDot--snapped":""}`})},p.id)),i==="distance"&&e.slice(1).map((p,d)=>{let m=e[d].position,h=p.position,f=new rn(...m).distanceTo(new rn(...h));return ar("group",{children:[Ye(oo,{points:[m,h],color:ci,lineWidth:2}),Ye(kn,{position:ly(m,h),children:ao(f,t)})]},`${e[d].id}-${p.id}`)}),(i==="angle"||i==="area")&&s.length>=2&&Ye(oo,{points:o?[...s,s[0]]:s,color:ci,lineWidth:2}),i==="angle"&&Ye(FT,{positions:s}),c&&!("error"in c)&&ar(kl,{children:[Ye(cy,{positions:s,triangles:c.triangles}),Ye(kn,{position:c.center,children:ao(c.area,t?`${t}\xB2`:"")})]}),i==="pointToPlane"&&e[0]?.faceVertices&&ar(kl,{children:[Ye(cy,{positions:e[0].faceVertices,triangles:VT}),Ye(oo,{points:[...e[0].faceVertices,e[0].faceVertices[0]],color:ci,lineWidth:1}),e.length===1&&Ye(kn,{position:e[0].position,children:"Reference plane"})]}),l&&ar(kl,{children:[Ye(oo,{points:[e[1].position,l.projection],color:ci,lineWidth:2}),Ye(oo,{points:[e[0].position,l.projection],color:ci,lineWidth:1,dashed:!0}),Ye(kn,{position:ly(e[1].position,l.projection),children:ao(l.distance,t)})]}),a&&ar(wd,{center:!0,position:a.position,zIndexRange:[20,0],style:{pointerEvents:"none"},children:[Ye("div",{className:"ri-measureSnapTarget"}),Ye("div",{className:"ri-measureSnapLabel",children:a.snapped==="vertex"?"Vertex":"Edge"})]}),n&&r?Ye(UT,{box:r,unit:t}):null]})}import{Eraser as GT,PencilRuler as HT,RulerDimensionLine as WT,Undo2 as XT}from"lucide-react";import{useLayoutEffect as $T,useRef as qT}from"react";import{Fragment as dy,jsx as wt,jsxs as so}from"react/jsx-runtime";function Sd(e){let t=qT(null);$T(()=>{if(!t.current)return;let a=()=>e.onHeight(t.current?.getBoundingClientRect().height??34),s=new ResizeObserver(a);return s.observe(t.current),a(),()=>s.disconnect()},[e.onHeight]);let{tool:r,pointCount:n,areaClosed:i}=e,o=r==="angle"?["Pick the first arm","Pick the angle's vertex","Pick the second arm","Pick a point to start a new angle"][n]:r==="area"?i?"Pick a point to start a new area":"Pick polygon corners in order, then Finish area":r==="pointToPlane"?["Pick the reference face","Pick a point to measure its perpendicular distance","Pick a face to start a new measurement"][n]:"Pick points on the model to measure distances";return so("div",{ref:t,className:"ri-measureTools",style:{top:e.top},children:[so("div",{className:"ri-measureToolbarRow",children:[wt("button",{type:"button",className:`ri-measureButton ${e.active?"ri-measureButton--active":""}`,disabled:e.disabled,onClick:e.onToggle,title:e.active?"Stop measuring":"Start measuring","aria-pressed":e.active,children:wt(HT,{size:16})}),wt("button",{type:"button",className:`ri-measureButton ${e.showDimensions?"ri-measureButton--active":""}`,disabled:e.disabled,onClick:e.onDimensions,title:"Toggle bounding dimensions","aria-pressed":e.showDimensions,children:wt(WT,{size:16})}),e.active&&so(dy,{children:[so("select",{className:"ri-measureSelect","aria-label":"Measurement tool",value:r,disabled:e.disabled,onChange:a=>e.onTool(a.target.value),children:[wt("option",{value:"distance",children:"Distance"}),wt("option",{value:"angle",children:"Angle"}),wt("option",{value:"area",children:"Area"}),wt("option",{value:"pointToPlane",children:"Point to plane"})]}),so("select",{className:"ri-measureSelect","aria-label":"Measurement snapping",value:e.snap,disabled:e.disabled,onChange:a=>e.onSnap(a.target.value),children:[wt("option",{value:"none",children:"No snapping"}),wt("option",{value:"auto",children:"Snap: auto"}),wt("option",{value:"vertex",children:"Snap: vertex"}),wt("option",{value:"edge",children:"Snap: edge"})]})]}),n>0&&so(dy,{children:[wt("button",{type:"button",className:"ri-measureButton",onClick:e.onUndo,disabled:e.disabled,title:"Undo measurement point",children:wt(XT,{size:16})}),wt("button",{type:"button",className:"ri-measureButton",onClick:e.onClear,disabled:e.disabled,title:"Clear measurements",children:wt(GT,{size:16})})]}),e.active&&r==="area"&&!i&&wt("button",{type:"button",className:"ri-measureFinish",onClick:e.onFinishArea,disabled:e.disabled||n<3,children:"Finish area"})]}),e.active&&wt("div",{className:`ri-measureHint${e.error?" ri-measureHint--error":""}`,role:"status",children:e.error??o})]})}import{forwardRef as YT,useCallback as ka,useEffect as py,useImperativeHandle as KT,useMemo as hy,useRef as Rt}from"react";import{useXR as my,useXRHitTest as QT,useXRInputSourceEvent as JT}from"@react-three/xr";import{useFrame as ZT}from"@react-three/fiber";import{Matrix4 as e_,Vector3 as fy}from"three";import{Fragment as a_,jsx as Da,jsxs as vy}from"react/jsx-runtime";var t_=1,gy=1,r_=.1,n_=10;function i_(e,t){let[r,n,i]=e.size,o=(e.min[0]+e.max[0])/2,a=(e.min[2]+e.max[2])/2,s=Math.max(r,n,i)||1;return{scale:t==="real-world"?1:t_/s,offset:[-o,-e.min[1],-a]}}function by(e){let t=e[0].clientX-e[1].clientX,r=e[0].clientY-e[1].clientY;return Math.hypot(t,r)}function yy(e){let t=e[0].clientX-e[1].clientX,r=e[0].clientY-e[1].clientY;return Math.atan2(r,t)}var o_=YT(function({box:t,scaleMode:r,children:n,onARStateChange:i},o){let a=Rt(null),s=Rt(null),c=Rt(null),l=my(z=>z.session!=null),p=my(z=>z.mode==="immersive-ar"),d=hy(()=>t?i_(t,r):null,[t,r]),m=Rt(new fy(0,0,-gy)),h=Rt(1),f=Rt(0),g=Rt(!0),y=Rt(!1),x=hy(()=>new e_,[]),C=Rt(new fy),v=Rt(!1),N=Rt(null),M=Rt(!1),S=Rt(0),O=Rt(0),R=Rt(1),P=Rt(0),T=ka(()=>{if(!i||!p)return;let z={canPlace:v.current,isPlacementMode:g.current,isModelPlaced:y.current},H=N.current;H&&H.canPlace===z.canPlace&&H.isPlacementMode===z.isPlacementMode&&H.isModelPlaced===z.isModelPlaced||(N.current=z,i(z))},[p,i]),w=ka(()=>!p||!v.current?!1:(m.current.copy(C.current),y.current=!0,g.current=!1,T(),!0),[T,p]),A=ka(()=>{p&&(g.current=!0,T())},[T,p]),k=ka(()=>{let z=w();return!z&&p&&(g.current=!1,T()),z},[T,p,w]),V=ka(()=>{p&&(g.current=!1,T())},[T,p]);KT(o,()=>({placeCurrent:w,startPlacementMode:A,finishPlacementMode:k,cancelPlacementMode:V}),[V,k,w,A]),py(()=>{if(!l){m.current.set(0,0,-gy),h.current=1,f.current=0,v.current=!1,M.current=!1,g.current=!0,y.current=!1,N.current=null;return}p&&(v.current=!1,M.current=!1,g.current=!0,y.current=!1,N.current=null,T())},[T,l,p]),QT((z,H)=>{if(!p||z.length===0){v.current&&(v.current=!1,T());return}H(x,z[0])&&(C.current.setFromMatrixPosition(x),v.current||(v.current=!0,T()))},"viewer"),JT("all","select",()=>{!p||M.current||!g.current||w()},[p,w]),py(()=>{if(!p)return;let z=G=>{G.touches.length===2&&(M.current=!0,S.current=by(G.touches),O.current=yy(G.touches),R.current=h.current,P.current=f.current)},H=G=>{if(!M.current||G.touches.length!==2)return;G.preventDefault();let K=by(G.touches);if(S.current>0){let Z=K/S.current;h.current=Math.min(n_,Math.max(r_,R.current*Z))}let Ce=yy(G.touches);f.current=P.current-(Ce-O.current)},E=G=>{G.touches.length===0&&requestAnimationFrame(()=>{M.current=!1})};return window.addEventListener("touchstart",z),window.addEventListener("touchmove",H,{passive:!1}),window.addEventListener("touchend",E),window.addEventListener("touchcancel",E),()=>{window.removeEventListener("touchstart",z),window.removeEventListener("touchmove",H),window.removeEventListener("touchend",E),window.removeEventListener("touchcancel",E)}},[p]),ZT(()=>{let z=a.current,H=s.current;if(!z||!H)return;!l||!d?(z.visible=!0,z.position.set(0,0,0),z.rotation.set(0,0,0),H.scale.setScalar(1)):(z.visible=!p||y.current,z.position.copy(m.current),z.rotation.set(0,f.current,0),H.scale.setScalar(d.scale*h.current));let E=c.current;if(E){let G=p&&g.current&&v.current;E.visible=G,G&&E.position.copy(C.current)}});let F=l&&d?d.offset:[0,0,0];return vy(a_,{children:[vy("mesh",{ref:c,visible:!1,rotation:[-Math.PI/2,0,0],children:[Da("ringGeometry",{args:[.05,.07,32]}),Da("meshBasicMaterial",{color:"#22d3ee",transparent:!0,opacity:.95})]}),Da("group",{ref:a,children:Da("group",{ref:s,children:Da("group",{position:F,children:n})})})]})}),xy=o_;import{useRef as ui,useState as s_,useCallback as zr,useEffect as l_}from"react";import{jsx as Kt,jsxs as Cd}from"react/jsx-runtime";var c_={up:{width:38,height:22},down:{width:38,height:22},left:{width:22,height:38},right:{width:22,height:38}},u_={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"},Dl=({direction:e})=>{let t=c_[e],r=u_[e];return Cd("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:[Kt("polyline",{points:r,stroke:"rgba(0, 0, 0, 0.9)",strokeWidth:"6",strokeLinecap:"round",strokeLinejoin:"round"}),Kt("polyline",{points:r,stroke:"#2095F2",strokeWidth:"4",strokeLinecap:"round",strokeLinejoin:"round"})]})},nn=16,d_={"bottom-left":{bottom:nn,left:nn,top:"auto",right:"auto",transform:"none"},"bottom-right":{bottom:nn,right:nn,top:"auto",left:"auto",transform:"none"},"top-left":{top:nn,left:nn,bottom:"auto",right:"auto",transform:"none"},"top-right":{top:nn,right:nn,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:nn,left:"50%",bottom:"auto",right:"auto",transform:"translateX(-50%)"}},p_=({controlsRef:e,enabled:t=!0,opacity:r=.9,moveSensitivity:n=.001,rotateSensitivity:i=.01,position:o="center-bottom"})=>{let a=ui(null),[s,c]=s_({x:0,y:0}),l=ui(!1),p=ui({x:0,y:0}),d=ui(void 0),m=ui(void 0),h=ui(null),f=ui(0),g=()=>e.current,y=(k,V,F)=>{let z=Math.hypot(k,V);if(z>F){let H=F/z;return{x:k*H,y:V*H}}return{x:k,y:V}},x=k=>{let F=Math.abs(k);return F<.12?0:Math.sign(k)*((F-.12)/(1-.12))},C=zr(()=>{let k=()=>{let{x:V,y:F}=p.current,z=x(V),H=x(F);if(t&&(z!==0||H!==0)){let E=g();E&&E.rotate(-z*i,-H*i,!0)}d.current=requestAnimationFrame(k)};d.current=requestAnimationFrame(k)},[t,i]),v=zr(()=>{d.current&&cancelAnimationFrame(d.current)},[]),N=zr((k,V)=>{if(!a.current||!l.current)return;let F=a.current.getBoundingClientRect(),z=F.left+F.width/2,H=F.top+F.height/2,E=F.width/2-18,G=k-z,K=V-H,Ce=y(G,K,E);c(Ce),p.current={x:Ce.x/E,y:Ce.y/E}},[]),M=zr(k=>{if(!t)return;k.preventDefault(),k.stopPropagation(),l.current=!0,C();let V="touches"in k?k.touches[0]:k;N(V.clientX,V.clientY)},[t,C,N]),S=zr(k=>{if(!l.current)return;k.preventDefault();let V="touches"in k?k.touches[0]:k;N(V.clientX,V.clientY)},[N]),O=zr(()=>{l.current=!1,c({x:0,y:0}),p.current={x:0,y:0},v()},[v]),R=n*10,P=zr(k=>{t&&g()?.forward(k*R,!0)},[t,R]),T=zr(k=>{t&&g()?.truck(k*R,0,!0)},[t,R]),w=zr((k,V,F)=>{if(!t)return;m.current&&cancelAnimationFrame(m.current),h.current={control:k,amount:V,action:F},f.current=0,F(V);let z=H=>{if(!h.current)return;if(f.current===0){f.current=H,m.current=requestAnimationFrame(z);return}if(H-f.current>200){let{amount:G,action:K}=h.current;K(G),f.current=H}m.current=requestAnimationFrame(z)};m.current=requestAnimationFrame(z)},[t]),A=zr(k=>{h.current?.control===k&&(m.current&&(cancelAnimationFrame(m.current),m.current=void 0),h.current=null,f.current=0)},[]);return l_(()=>(window.addEventListener("mousemove",S),window.addEventListener("mouseup",O),window.addEventListener("touchmove",S,{passive:!1}),window.addEventListener("touchend",O),window.addEventListener("touchcancel",O),()=>{window.removeEventListener("mousemove",S),window.removeEventListener("mouseup",O),window.removeEventListener("touchmove",S),window.removeEventListener("touchend",O),window.removeEventListener("touchcancel",O),v(),m.current&&cancelAnimationFrame(m.current)}),[S,O,v]),t?Kt("div",{className:"mc__wrapper",style:{opacity:r,...d_[o]},children:Cd("div",{className:"mc__dpad",children:[Kt("button",{"aria-label":"Move forward",className:"mc__arrow mc__arrow--up",onMouseDown:()=>w("up",1,P),onMouseUp:()=>A("up"),onMouseLeave:()=>A("up"),onTouchStart:k=>{k.preventDefault(),w("up",1,P)},onTouchEnd:()=>A("up"),onTouchCancel:()=>A("up"),children:Kt(Dl,{direction:"up"})}),Cd("div",{className:"mc__middle-row",children:[Kt("button",{"aria-label":"Move left",className:"mc__arrow mc__arrow--left",onMouseDown:()=>w("left",-1,T),onMouseUp:()=>A("left"),onMouseLeave:()=>A("left"),onTouchStart:k=>{k.preventDefault(),w("left",-1,T)},onTouchEnd:()=>A("left"),onTouchCancel:()=>A("left"),children:Kt(Dl,{direction:"left"})}),Kt("div",{ref:a,className:"mc__joystick",onMouseDown:M,onTouchStart:M,children:Kt("div",{className:"mc__knob",style:{transform:`translate(${s.x}px, ${s.y}px)`}})}),Kt("button",{"aria-label":"Move right",className:"mc__arrow mc__arrow--right",onMouseDown:()=>w("right",1,T),onMouseUp:()=>A("right"),onMouseLeave:()=>A("right"),onTouchStart:k=>{k.preventDefault(),w("right",1,T)},onTouchEnd:()=>A("right"),onTouchCancel:()=>A("right"),children:Kt(Dl,{direction:"right"})})]}),Kt("button",{"aria-label":"Move backward",className:"mc__arrow mc__arrow--down",onMouseDown:()=>w("down",-1,P),onMouseUp:()=>A("down"),onMouseLeave:()=>A("down"),onTouchStart:k=>{k.preventDefault(),w("down",-1,P)},onTouchEnd:()=>A("down"),onTouchCancel:()=>A("down"),children:Kt(Dl,{direction:"down"})})]})}):null},wy=p_;import{useMemo as m_}from"react";import{useEffect as h_}from"react";import{useThree as My}from"@react-three/fiber";var Sy=new WeakMap;function Ll(e){let t=My(n=>n.get),r=My(n=>n.setEvents);h_(()=>{if(!e)return;let n=Sy.get(t);if(!n){let o=new Set;n=o,Sy.set(t,o);let a=t().events.filter;r({filter:(s,c)=>{let l=a?a(s,c):s;return o.size===0?l:l.filter(p=>{for(let d of o)if(!d(p))return!1;return!0})}})}n.add(e);let i=n;return()=>{i.delete(e)}},[e,t,r])}function Td({setAside:e,nodeRefs:t}){let r=m_(()=>{if(e.size===0)return null;let n={refs:null,bound:new Map};return i=>{let o=t.current??{};if(n.refs!==o){let s=new Map;for(let[c,l]of Object.entries(o))s.set(l,e.has(c));n={refs:o,bound:s}}let{bound:a}=n;for(let s=i.object;s;s=s.parent){let c=a.get(s);if(c!==void 0)return!c}return!0}},[e,t]);return Ll(r),null}import{useEffect as Pd,useMemo as Ed,useRef as ky,useState as Ay}from"react";import{Edges as f_}from"@react-three/drei";import{useFrame as g_,useThree as Ad}from"@react-three/fiber";import{DoubleSide as Il,Plane as b_}from"three";import{Vector3 as Cy}from"three";var Ol={x:0,y:1,z:2},Ty=e=>Math.min(Math.max(e,0),1);function _d(e,t){let r=Ol[t.axis],n=e.min[r],i=e.max[r];if(!Number.isFinite(n)||!Number.isFinite(i)||i<n)return null;let o=Number.isFinite(t.position)?t.position:.5;return n+(i-n)*Ty(o)}function _y(e,t,r){let n=_d(t,r);if(n===null)return!1;let i=new Cy;return i.setComponent(Ol[r.axis],r.flip?1:-1),e.normal.copy(i),e.constant=r.flip?-n:n,!0}function Py(e,t,r,n){let i=Ol[n],o=new Cy().setComponent(i,1),a=r.clone().addScaledVector(o,-r.dot(o));if(a.lengthSq()<1e-8)return null;a.normalize();let s=e.direction.dot(a);if(Math.abs(s)<1e-8)return null;let c=t.clone().sub(e.origin).dot(a)/s;return Number.isFinite(c)?e.origin.getComponent(i)+e.direction.getComponent(i)*c:null}function Ey(e,t,r){let n=Ol[t],i=e.max[n]-e.min[n];return i>0?Ty((r-e.min[n])/i):null}import{jsx as Bl,jsxs as x_}from"react/jsx-runtime";var y_={x:0,y:1,z:2},Ry="#22d3ee";function Rd({section:e,box:t,modelRef:r,showHandle:n,onPositionChange:i,onDraggingChange:o}){let a=Ad(g=>g.gl),s=Ad(g=>g.raycaster),c=Ad(g=>g.invalidate),l=Ed(()=>new b_,[]),p=Ed(()=>[l],[l]),d=e.enabled&&t!==null&&_y(l,t,e),m=ky(new Map),h=()=>{for(let[g,y]of m.current)g.clippingPlanes=y.clippingPlanes,g.side=y.side,g.needsUpdate=!0;m.current.clear()};Pd(()=>{if(d)return a.localClippingEnabled=!0,c(),()=>{h(),c()}},[d,a,c]),Pd(()=>{d&&c()},[d,e.axis,e.position,e.flip,t,c]),g_(()=>{let g=r.current;if(!d||!g)return;let y=m.current;g.traverse(x=>{let C=x.material;if(C)for(let v of Array.isArray(C)?C:[C]){let N=y.get(v);if(v.clippingPlanes===p&&v.side===Il)continue;let M=v.side===Il&&N?N.side:v.side;y.set(v,{clippingPlanes:N?N.clippingPlanes:v.clippingPlanes,side:M}),v.clippingPlanes=p,v.clipShadows=!0,v.side=Il,v.needsUpdate=!0}})});let f=Ed(()=>d?g=>!!g.object.userData.riSectionHandle||l.distanceToPoint(g.point)>=-1e-4:null,[d,l]);return Ll(f),Pd(()=>{if(!d)return;let g=s,y=g.firstHitOnly;return g.firstHitOnly=!1,()=>{g.firstHitOnly=y}},[d,s]),!d||!n||!t?null:Bl(v_,{section:e,box:t,onPositionChange:i,onDraggingChange:o})}function v_({section:e,box:t,onPositionChange:r,onDraggingChange:n}){let[i,o]=Ay(!1),[a,s]=Ay(!1),c=ky(null),l=y_[e.axis],p=_d(t,e)??0,d=[0,1,2].map(x=>(t.max[x]-t.min[x])*1.08||.01),m=[0,1,2].map(x=>(t.min[x]+t.max[x])/2);m[l]=p;let[h,f]=e.axis==="x"?[d[2],d[1]]:e.axis==="y"?[d[0],d[2]]:[d[0],d[1]],g=e.axis==="x"?[0,Math.PI/2,0]:e.axis==="y"?[-Math.PI/2,0,0]:[0,0,0],y=x=>{a&&(x.target?.releasePointerCapture?.(x.pointerId),c.current=null,s(!1),n(!1))};return x_("mesh",{ref:x=>{x&&(_s(x),x.userData.riSectionHandle=!0)},position:m,rotation:g,renderOrder:2,onPointerOver:x=>{x.stopPropagation(),o(!0)},onPointerOut:()=>o(!1),onPointerDown:x=>{x.stopPropagation(),x.target?.setPointerCapture?.(x.pointerId),c.current={point:x.point.clone(),direction:x.ray.direction.clone(),coordinate:x.point.getComponent(l),cut:p},s(!0),n(!0)},onPointerMove:x=>{let C=c.current;if(!a||!C)return;x.stopPropagation();let v=Py(x.ray,C.point,C.direction,e.axis);if(v===null)return;let N=Ey(t,e.axis,C.cut+(v-C.coordinate));N!==null&&r(N)},onPointerUp:y,onPointerCancel:y,onClick:x=>x.stopPropagation(),children:[Bl("planeGeometry",{args:[h,f]}),Bl("meshBasicMaterial",{color:Ry,transparent:!0,opacity:a?.22:i?.16:.08,side:Il,depthWrite:!1,toneMapped:!1}),Bl(f_,{color:Ry,renderOrder:3})]})}import{HexColorPicker as w_}from"react-colorful";import{jsx as zl,jsxs as Dy}from"react/jsx-runtime";var kd=({colorPicker:e,onClose:t,itemMaterials:r,setItemMaterials:n,inline:i=!1})=>Dy("div",{className:`ri-popover${i?" ri-popover--inline":""}`,style:i?{padding:12}:{left:e.x,top:e.y,width:"min(225px, calc(100vw - 24px))",padding:12},onPointerDown:o=>o.stopPropagation(),children:[zl("p",{className:"ri-popoverLabel",children:"Color"}),zl(w_,{color:r[e.objectId]?.hex??"#ffffff",onChange:o=>n(a=>({...a,[e.objectId]:{...a[e.objectId],hex:o}}))}),Dy("div",{className:"ri-inlineRow",children:[zl("span",{className:"ri-colorCode",children:r[e.objectId]?.hex??"#ffffff"}),zl("button",{className:"ri-secondaryButton",onClick:t,children:"Done"})]})]});import{jsx as lt,jsxs as on}from"react/jsx-runtime";var Dd=({materialPopup:e,textureUrl:t,triggerFileUpload:r,clearTexture:n,inline:i=!1,offset:o,rotationDegrees:a,onOffsetChange:s,onRotationChange:c,isPositioning:l=!1,onEndPositioning:p})=>on("div",{className:`ri-popover${i?" ri-popover--inline":""}`,style:i?{overflow:"hidden"}:{left:e.x,top:e.y,width:"min(300px, calc(100vw - 24px))",overflow:"hidden"},onPointerDown:d=>d.stopPropagation(),children:[lt("div",{className:"ri-popoverHeader",children:lt("p",{className:"ri-popoverLabel",style:{marginBottom:0},children:"Material"})}),on("div",{className:"ri-materialBody",children:[t?lt("div",{className:"ri-previewFrame",children:lt("img",{src:t,alt:"texture preview",className:"ri-previewImage"})}):on("div",{className:"ri-emptyState",children:[lt("svg",{width:"24",height:"24",fill:"none",stroke:"currentColor",strokeWidth:1.5,viewBox:"0 0 24 24",children:lt("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"})}),lt("span",{style:{fontSize:12},children:"No texture applied"})]}),lt("button",{onClick:()=>r(e.objectId),className:"ri-uploadButton",children:t?"Replace image":"Upload image"}),t&&lt("button",{onClick:()=>n(e.objectId),className:"ri-removeButton",children:"Remove texture"}),lt("p",{className:"ri-formatHint",children:"JPG \xB7 PNG \xB7 WebP"}),t&&(s||c)&&on("div",{className:"ri-texturePosition",children:[lt("p",{className:"ri-texturePositionLabel",children:"Texture position"}),on("div",{className:"ri-texturePositionGrid",children:[on("label",{className:"ri-texturePositionField",children:[lt("span",{children:"Offset X"}),lt("input",{type:"number",step:.01,value:o?.[0]??0,onChange:d=>s?.(e.objectId,0,Number(d.target.value))})]}),on("label",{className:"ri-texturePositionField",children:[lt("span",{children:"Offset Y"}),lt("input",{type:"number",step:.01,value:o?.[1]??0,onChange:d=>s?.(e.objectId,1,Number(d.target.value))})]})]}),on("label",{className:"ri-texturePositionField ri-texturePositionField--full",children:[lt("span",{children:"Rotation"}),on("div",{className:"ri-texturePositionSliderRow",children:[lt("input",{type:"range",min:0,max:360,step:1,value:a??0,onChange:d=>c?.(e.objectId,Number(d.target.value))}),lt("input",{type:"number",min:0,max:360,step:1,value:Math.round(a??0),onChange:d=>c?.(e.objectId,Number(d.target.value))})]})]}),l?lt("button",{type:"button",className:"ri-uploadButton",onClick:p,title:"Confirm this texture position and exit positioning mode",children:"Done positioning"}):lt("p",{className:"ri-texturePositionHint",children:"Double-click the object in the preview to drag its texture directly (scroll to zoom), or edit its offset numerically."})]})]})]});import{Fragment as M_,useEffect as Ld,useRef as S_,useState as Od}from"react";import{Fragment as Id,jsx as Mt,jsxs as lo}from"react/jsx-runtime";function Ly({entries:e}){return Mt(Id,{children:e.map(([t,r])=>{let n=r!==null&&typeof r=="object",i=n?Object.entries(r):[];return n&&i.length>0?lo("div",{className:"left-panel__data-group",children:[Mt("span",{className:"left-panel__data-key",children:t}),Mt("div",{className:"left-panel__data-children",children:Mt(Ly,{entries:i})})]},t):lo("div",{className:"left-panel__data-row",children:[Mt("span",{className:"left-panel__data-key",children:t}),Mt("span",{className:`left-panel__data-value left-panel__data-value--${typeof r}`,children:n?Array.isArray(r)?"[]":"{}":String(r)})]},t)})})}function C_({content:e}){let t=e!=null,[r,n]=Od(t),[i,o]=Od(t),a=S_(e);return t&&(a.current=e),Ld(()=>{if(t){n(!0);return}if(r){o(!1);let s=setTimeout(()=>n(!1),300);return()=>clearTimeout(s)}},[t,r]),Ld(()=>{if(r&&t){let s=requestAnimationFrame(()=>o(!0));return()=>cancelAnimationFrame(s)}},[r,t]),r?Mt("div",{className:`left-panel__action-extra${i?" left-panel__action-extra--open":""}`,children:Mt("div",{className:"left-panel__action-extra-inner",children:e??a.current})}):null}function Bd({isOpen:e,selectedObject:t,currentAction:r,onClose:n,onAction:i,renderActionExtra:o}){let[a,s]=Od(t);Ld(()=>{t&&s(t)},[t]);let c=t??a,l=c?Object.entries(c).filter(([p])=>p!=="actions"&&p!=="decals"):[];return Mt("div",{className:`left-panel ${e?"left-panel--open":"left-panel--closed"}`,children:c&&lo(Id,{children:[lo("div",{className:"left-panel__header",children:[Mt("p",{className:"left-panel__title",children:c.label}),Mt("button",{onClick:n,className:"left-panel__close-btn","aria-label":"Close panel",children:"\u2715"})]}),l.length>0&&Mt("div",{className:"left-panel__data",children:Mt(Ly,{entries:l})}),Mt("hr",{className:"left-panel__divider"}),c.actions&&c.actions.length>0&&lo(Id,{children:[Mt("div",{className:"left-panel__actions-label",children:"Actions"}),Mt("div",{className:"left-panel__actions-list",children:c.actions.map((p,d)=>{let m=r?.action.id===p.id&&(r.binding===c||r.binding?.id===c.id||r.binding?.modelObjectId===c.modelObjectId||r.objectId===c.id||r.objectId===c.modelObjectId),h=o?.(p.id);return lo(M_,{children:[Mt("button",{onClick:f=>i({objectId:c.modelObjectId||c.id||"",action:p,binding:c,screenX:f.clientX,screenY:f.clientY}),className:["left-panel__action-btn",`left-panel__action-btn--${p.id}`,m?"left-panel__action-btn--active":""].filter(Boolean).join(" "),"data-action-id":p.id,"data-label":p.label,children:p.label}),Mt(C_,{content:h})]},d)})})]})]})})}import{useMemo as __,useState as Iy}from"react";import{Boxes as P_,Focus as E_}from"lucide-react";import{useState as T_}from"react";import{jsx as an,jsxs as La}from"react/jsx-runtime";function Oy({openButtonLabel:e,openButtonAriaLabel:t,eyebrow:r,title:n,searchValue:i,onSearchChange:o,searchPlaceholder:a,children:s,isOpen:c,onToggle:l,openButtonIcon:p,closeButtonIcon:d,closeButtonAriaLabel:m}){let[h,f]=T_(!1),g=c!==void 0?c:h,y=x=>{c===void 0&&f(x),l?.(x)};return La("div",{className:`ri-sidepanel-wrap ${g?"ri-sidepanel-wrap--open":"ri-sidepanel-wrap--closed"}`,children:[!g&&La("button",{type:"button",className:"ri-sidepanel__open-btn",onClick:()=>y(!0),"aria-label":t,title:"Open panel",children:[p,e?an("span",{children:e}):null]}),La("div",{className:`ri-sidepanel ${g?"ri-sidepanel--open":"ri-sidepanel--closed"}`,"aria-hidden":!g,children:[La("div",{className:"ri-sidepanel__header",children:[La("div",{className:"ri-sidepanel__header-top",children:[an("span",{className:"ri-sidepanel__eyebrow",children:r}),an("button",{type:"button",className:"ri-sidepanel__close-btn",onClick:()=>y(!1),"aria-label":m,title:"Close",children:d??an("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:an("path",{d:"M1 1L11 11M11 1L1 11",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"})})})]}),an("p",{className:"ri-sidepanel__title",children:n})]}),an("div",{className:"ri-sidepanel__search-wrap",children:an("input",{className:"ri-sidepanel__search",type:"text",placeholder:a,value:i,onChange:x=>o(x.target.value)})}),an("div",{className:"ri-sidepanel__list",children:s})]})]})}import{jsx as sn,jsxs as A_}from"react/jsx-runtime";function zd({objectBindings:e,onAction:t,onFocus:r,onHover:n,isOpen:i,onToggle:o,isolatedKeys:a=null,onIsolate:s}){let[c,l]=Iy(null),[p,d]=Iy(""),m=__(()=>Object.entries(e).filter(([h,f])=>{let g=p.toLowerCase();return h.toLowerCase().includes(g)||(f.label??"").toLowerCase().includes(g)}),[e,p]);return sn(Oy,{openButtonLabel:"",openButtonAriaLabel:"Open scene objects panel",openButtonIcon:sn(P_,{width:16,height:16,"aria-hidden":"true"}),eyebrow:"SCENE OBJECTS",title:`${m.length} visible entries`,searchValue:p,onSearchChange:d,searchPlaceholder:"Search nodes, labels",isOpen:i,onToggle:o,closeButtonAriaLabel:"Close scene objects panel",children:m.map(([h,f])=>{let g=f.visible!==!1,y=c===h,x=a?.has(h)??!1;return A_("div",{onClick:()=>r(f),onMouseEnter:()=>{l(h),n?.(f)},onMouseLeave:()=>{l(null),n?.(null)},className:`ri-sidepanel__row${y?" ri-sidepanel__row--hovered":""}${a!==null&&!x?" ri-sidepanel__row--setAside":""}`,children:[sn("span",{className:`ri-sidepanel__label${y?" ri-sidepanel__label--hovered":""}`,children:f.label??h}),s?sn("button",{type:"button",onClick:v=>{v.stopPropagation(),s(f)},className:`ri-sidepanel__isolate-btn${x?" ri-sidepanel__isolate-btn--active":""}`,title:x?"Show all":"Isolate","aria-label":`${x?"Show all":"Isolate"} ${f.label??h}`,"aria-pressed":x,children:sn(E_,{width:14,height:14,"aria-hidden":"true"})}):null,sn("button",{type:"button",onClick:v=>{v.stopPropagation(),t?.({objectId:h,action:{id:"toggle-visibility",label:"Toggle Visibility",type:"command"},binding:f})},className:"ri-sidepanel__vis-btn",title:g?"Hide":"Show",children:sn("span",{className:`ri-sidepanel__checkbox${g?" ri-sidepanel__checkbox--checked":""}`,children:g&&sn("svg",{width:"9",height:"9",viewBox:"0 0 10 10",fill:"none",children:sn("path",{d:"M1.5 5L4 7.5L8.5 2.5",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})})})})]},h)})})}import{AlertTriangle as Ba,Box as Jy,Camera as sP,Download as lP,FileImage as cP,RotateCcw as Zy,Maximize as uP,Minimize as dP,ChevronLeft as pP,Square as ev,ChevronRight as hP,RectangleGoggles as mP,QrCode as fP,X as $d,Expand as gP,FlipVertical2 as bP,Slice as yP,Play as qd,Pause as vP,Smartphone as tv,Grid3X3 as xP,Orbit as wP}from"lucide-react";import{useRef as ct,useEffect as Oa,useMemo as sr,useCallback as Nl,useSyncExternalStore as L_}from"react";import{useThree as O_,useFrame as I_}from"@react-three/fiber";import{Sphere as B_,PivotControls as z_}from"@react-three/drei";import{Vector3 as _r,Vector2 as N_,AdditiveBlending as Nd,TextureLoader as j_,Matrix4 as V_,Quaternion as co,Euler as jl}from"three";var By="data:image/png;base64,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";var zy="data:image/png;base64,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";var Ny="data:image/png;base64,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";import{Fragment as K_,jsx as We,jsxs as lr}from"react/jsx-runtime";var jd=-100,Vd=100,$y=.03,F_=.03,U_=.03,jy=.5,G_=By,H_=zy,W_=Ny,X_=Math.PI/4,Vy=.4,uo=64,Fy=$y*3,Fd="#4d7dff",Uy="#ffcc00",Gy=.02,$_=new _r(0,1,0),Vl=32,Hy="#ff9d3d",Fl=4;function Ud(e){let t=new Float32Array((uo+1)*3);for(let r=0;r<=uo;r++){let n=r/uo*Math.PI*2,i=Math.cos(n)*Vy,o=Math.sin(n)*Vy,a=0,s=0,c=0;e==="x"?(s=i,c=o):e==="y"?(a=i,c=o):(a=i,s=o),t[r*3]=a,t[r*3+1]=s,t[r*3+2]=c}return t}function q_(e){let t=Math.abs(e.y)<.99?new _r(0,1,0):new _r(1,0,0),r=new _r().crossVectors(e,t).normalize(),n=new _r().crossVectors(e,r).normalize();return[r,n]}function Wy(e,t,r=1e-5){return Math.abs(e[0]-t[0])<r&&Math.abs(e[1]-t[1])<r&&Math.abs(e[2]-t[2])<r}var po=null,Hd=new Set;function Gd(e){po!==e&&(po=e,Hd.forEach(t=>t()))}function Y_(e){return Hd.add(e),()=>Hd.delete(e)}function Xy(){return po}function qy({light:e,position:t,rotation:r=[0,0,0],color:n,intensity:i,visible:o,onPositionChange:a,onRotationChange:s,onDraggingChange:c}){let{activeTab:l,activeSubTab:p,setActiveTab:d,setActiveSubTab:m}=Cs(),{camera:h,gl:f,raycaster:g,invalidate:y}=O_(),x=ct(null),C=ct(null),v=ct(null),N=ct(null),M=ct(null),S=ct(null),O=ct(null),R=ct(null),P=ct(null),T=ct(null),w=ct(null),A=sr(()=>new V_,[]),k=sr(()=>new co,[]),V=sr(()=>new _r(1,1,1),[]),F=ct([0,0,0]),z=ct([0,0,0]),H=ct(!1),E=ct(null),G=ct(null),K=ct(null),Ce=ct(c);Oa(()=>{Ce.current=c},[c]);let Z=sr(()=>new _r(t[0],t[1],t[2]),[t]),Te=sr(()=>new jl(r[0],r[1],r[2]),[r]),Ne=sr(()=>new Float32Array(6),[]),pe=sr(()=>Ud("x"),[]),Ue=sr(()=>Ud("y"),[]),Ee=sr(()=>Ud("z"),[]),Ke=sr(()=>new Float32Array((Vl+1)*3),[]),dt=sr(()=>new Float32Array(Fl*2*3),[]),fe=e?.type==="point",Ie=e?.type==="spot",Xe=fe?H_:Ie?W_:G_,Qt=fe?F_:Ie?U_:$y,J=sr(()=>new j_().load(Xe),[Xe]),cr=L_(Y_,Xy,Xy),et=!!e&&cr===e.id,ze=ct(new _r),ke=ct(new jl);Oa(()=>{H.current||(ze.current.copy(Z),ke.current.copy(Te),y())},[Z,Te,y]),Oa(()=>{e&&po===e.id&&!o&&Gd(null)},[e?.id,o]),Oa(()=>()=>{e&&po===e.id&&Gd(null),K.current!==null&&(cancelAnimationFrame(K.current),K.current=null)},[e?.id]);let jt=Nl(()=>{if(H.current||!et)return;let ne=ze.current,be=new co().setFromEuler(ke.current);A.compose(ne,be,V)},[A,V,et]);I_(()=>{if(x.current&&x.current.position.copy(ze.current),jt(),v.current){v.current.lookAt(h.position);let ne=h,be;ne.isOrthographicCamera?be=Qt/ne.zoom:be=h.position.distanceTo(ze.current)*Qt,v.current.scale.setScalar(be)}if(O.current){let ne=h,be;ne.isOrthographicCamera?be=Fy/ne.zoom:be=h.position.distanceTo(ze.current)*Fy,O.current.scale.setScalar(be)}if(M.current){let ne=M.current.getAttribute("position"),be=ne.array;be[0]=0,be[1]=0,be[2]=0,be[3]=ze.current.x,be[4]=ze.current.y,be[5]=ze.current.z,ne.needsUpdate=!0,M.current.computeBoundingSphere()}if(S.current){let ne=ze.current,be=ne.length();S.current.visible=be>jy,be>1e-6&&(S.current.position.copy(ne).multiplyScalar(.5),S.current.scale.set(1,be,1),S.current.quaternion.setFromUnitVectors($_,ne.clone().normalize()))}if(N.current&&(N.current.visible=ze.current.length()>jy),Ie&&R.current&&P.current&&T.current){let ne=ze.current,be=ne.length();if(be>1e-6){R.current.visible=!0;let ft=ne.clone().negate().normalize(),Ve=be,pt=e?.angle??Math.PI/6,X=Ve*Math.tan(pt),ue=ne.clone().add(ft.clone().multiplyScalar(Ve)),[le,Le]=q_(ft),De=P.current.getAttribute("position"),Me=De.array;for(let Se=0;Se<=Vl;Se++){let Ae=Se/Vl*Math.PI*2,ht=ue.x+(le.x*Math.cos(Ae)+Le.x*Math.sin(Ae))*X,Jt=ue.y+(le.y*Math.cos(Ae)+Le.y*Math.sin(Ae))*X,it=ue.z+(le.z*Math.cos(Ae)+Le.z*Math.sin(Ae))*X;Me[Se*3]=ht,Me[Se*3+1]=Jt,Me[Se*3+2]=it}De.needsUpdate=!0,P.current.computeBoundingSphere();let Be=T.current.getAttribute("position"),re=Be.array;for(let Se=0;Se<Fl;Se++){let Ae=Se/Fl*Math.PI*2,ht=ue.x+(le.x*Math.cos(Ae)+Le.x*Math.sin(Ae))*X,Jt=ue.y+(le.y*Math.cos(Ae)+Le.y*Math.sin(Ae))*X,it=ue.z+(le.z*Math.cos(Ae)+Le.z*Math.sin(Ae))*X,kt=Se*6;re[kt]=ne.x,re[kt+1]=ne.y,re[kt+2]=ne.z,re[kt+3]=ht,re[kt+4]=Jt,re[kt+5]=it}Be.needsUpdate=!0,T.current.computeBoundingSphere()}else R.current.visible=!1}});let ur=Nl(()=>{K.current!==null&&(cancelAnimationFrame(K.current),K.current=null),F.current=t,z.current=[r[0],r[1],r[2]],H.current=!0,E.current=null,G.current=null,Ce.current?.(!0)},[t,r]),St=Nl((ne,be,ft,Ve)=>{let pt=new _r(F.current[0],F.current[1],F.current[2]),X=new _r,ue=new co,le=new _r;Ve.decompose(X,ue,le);let Le=pt.clone().applyMatrix4(Ve),De=[Math.min(Math.max(Le.x,jd),Vd),Math.min(Math.max(Le.y,jd),Vd),Math.min(Math.max(Le.z,jd),Vd)],Me=new co().setFromEuler(new jl(z.current[0],z.current[1],z.current[2],"XYZ")),Be=new co().copy(ue).multiply(Me),re=new jl().setFromQuaternion(Be,"XYZ"),Se=[re.x,re.y,re.z];ze.current.set(De[0],De[1],De[2]),ke.current.set(Se[0],Se[1],Se[2]),E.current=De,G.current=Se;let Ae=new co().setFromEuler(ke.current);A.compose(ze.current,Ae,V),y()},[A,V,y]),Qe=Nl(()=>{H.current=!1;let ne=E.current,be=G.current;E.current=null,G.current=null;let ft=ne&&!Wy(ne,F.current),Ve=be&&!Wy(be,z.current);ft&&a&&a(ne),Ve&&s&&s(be),ft||Ve?K.current=requestAnimationFrame(()=>{K.current=null,Ce.current?.(!1)}):Ce.current?.(!1)},[a,s]);return Oa(()=>{let ne=Ve=>{let pt=f.domElement.getBoundingClientRect();return new N_((Ve.clientX-pt.left)/pt.width*2-1,-((Ve.clientY-pt.top)/pt.height)*2+1)},be=Ve=>!!Ve.target.closest?.("button, input, textarea, .ri-annotationPopup, .ri-colorPicker, .ri-materialPicker"),ft=Ve=>{if(be(Ve))return;let pt=ne(Ve);g.setFromCamera(pt,h);let X=[];if(C.current&&X.push(C.current),v.current&&X.push(v.current),X.length===0)return;if(g.intersectObjects(X,!1).length>0){let le=e?.id??null;po!==le&&(Gd(le),d?.("scene"),m?.("Lighting")),Ve.preventDefault(),Ve.stopPropagation()}};return f.domElement.addEventListener("pointerdown",ft),()=>{f.domElement.removeEventListener("pointerdown",ft)}},[h,g,f,e,d,m]),l!=="scene"||p!=="Lighting"||!e||!o||e.type==="none"||e.type==="hemisphere"?null:lr("group",{ref:ne=>{ne&&_s(ne)},children:[lr("group",{ref:x,children:[We("sprite",{ref:v,children:We("spriteMaterial",{map:J,transparent:!0,opacity:.9,blending:Nd,depthWrite:!1,rotation:Ie?X_:0},Xe)}),We(B_,{ref:C,args:[.25,16,16],children:We("meshBasicMaterial",{transparent:!0,opacity:.01})}),fe&&lr("group",{ref:O,children:[lr("lineLoop",{renderOrder:999,children:[We("bufferGeometry",{children:We("bufferAttribute",{attach:"attributes-position",args:[pe,3],count:uo+1})}),We("lineBasicMaterial",{color:Fd,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),lr("lineLoop",{renderOrder:999,children:[We("bufferGeometry",{children:We("bufferAttribute",{attach:"attributes-position",args:[Ue,3],count:uo+1})}),We("lineBasicMaterial",{color:Fd,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),lr("lineLoop",{renderOrder:999,children:[We("bufferGeometry",{children:We("bufferAttribute",{attach:"attributes-position",args:[Ee,3],count:uo+1})}),We("lineBasicMaterial",{color:Fd,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]})]})]}),!fe&&!Ie&&lr(K_,{children:[lr("mesh",{ref:S,children:[We("cylinderGeometry",{args:[Gy,Gy,1,8,1,!0]}),We("meshBasicMaterial",{color:Uy,transparent:!0,opacity:.05,blending:Nd,depthWrite:!1,depthTest:!1})]}),lr("line",{ref:N,children:[We("bufferGeometry",{ref:M,children:We("bufferAttribute",{attach:"attributes-position",args:[Ne,3],count:2})}),We("lineBasicMaterial",{color:Uy,transparent:!0,opacity:.7,blending:Nd})]})]}),Ie&&lr("group",{ref:R,children:[lr("lineLoop",{renderOrder:999,children:[We("bufferGeometry",{ref:P,children:We("bufferAttribute",{attach:"attributes-position",args:[Ke,3],count:Vl+1})}),We("lineBasicMaterial",{color:Hy,transparent:!0,opacity:.85,depthTest:!1,depthWrite:!1})]}),lr("lineSegments",{renderOrder:999,children:[We("bufferGeometry",{ref:T,children:We("bufferAttribute",{attach:"attributes-position",args:[dt,3],count:Fl*2})}),We("lineBasicMaterial",{color:Hy,transparent:!0,opacity:.5,depthTest:!1,depthWrite:!1})]})]}),et&&a&&We(z_,{ref:w,matrix:A,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableScaling:!0,onDragStart:ur,onDrag:St,onDragEnd:Qe})]})}import{useCallback as Wd,useLayoutEffect as Q_,useMemo as Nr,useRef as ln}from"react";import{PivotControls as J_}from"@react-three/drei";import{useFrame as Z_,useThree as eP}from"@react-three/fiber";import{Euler as Yy,Matrix4 as Ul,Quaternion as Gl,Vector3 as Ia}from"three";import{jsx as Ky}from"react/jsx-runtime";function Xd({node:e,space:t,onTransformChange:r,onDraggingChange:n}){let i=eP(w=>w.invalidate),o=Nr(()=>jm(e),[e]),a=Nr(()=>new Ul,[]),s=ln(!1),c=ln(new Ul),l=ln(new Ul),p=ln(null),d=ln(0),m=ln([]),h=ln(null),f=ln(n);f.current=n;let g=Nr(()=>new Ia,[]),y=Nr(()=>new Gl,[]),x=Nr(()=>new Ia,[]),C=Nr(()=>new Gl,[]),v=Nr(()=>new Ia(1,1,1),[]),N=Nr(()=>new Gl,[]),M=Nr(()=>new Ia,[]),S=Nr(()=>new Ia,[]),O=ln([0,0,0]),R=Wd(()=>{s.current||(e.updateWorldMatrix(!0,!1),g.copy(o).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(y),C.copy(y),t==="world"&&C.identity(),a.compose(g,C,v))},[g,a,C,v,e,o,t,y]);Q_(()=>(R(),()=>{let w=h.current!==null;w&&(cancelAnimationFrame(h.current),h.current=null),(s.current||w)&&(s.current=!1,f.current(!1));for(let A of m.current)Ui(A);m.current=[]}),[R]),Z_(()=>R());let P=Wd(()=>{h.current!==null&&(cancelAnimationFrame(h.current),h.current=null),e.updateWorldMatrix(!0,!0),m.current=[];for(let w of Fi(e))wm(w)||(vs(w,w.matrixWorld),m.current.push(w));e.updateWorldMatrix(!0,!1),g.copy(o).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(y),e.getWorldScale(x),c.current.compose(g,y,x),l.current.copy(a),O.current=[e.rotation.x,e.rotation.y,e.rotation.z],p.current=null,s.current=!0,n(!0)},[g,a,e,n,o,y,x]),T=Wd((w,A)=>{let k=c.current.clone().premultiply(A),V=l.current.clone().premultiply(A);k.decompose(M,y,S);let F=M.clone();V.decompose(g,C,v),t==="world"&&C.identity(),a.compose(g,C,v),w.decompose(M,N,S);let z=new Yy().setFromQuaternion(N,e.rotation.order),[H,E,G]=O.current,K=[H+z.x,E+z.y,G+z.z],Ce=new Gl().setFromEuler(new Yy(K[0],K[1],K[2],e.rotation.order)),Te=(e.parent?.matrixWorld||new Ul).clone().invert(),Ne=F.clone().applyMatrix4(Te),pe=o.clone().multiply(e.scale).applyQuaternion(Ce),Ue=Ne.clone().sub(pe),Ee=[Ue.x,Ue.y,Ue.z];e.position.set(Ee[0],Ee[1],Ee[2]),e.rotation.set(K[0],K[1],K[2],e.rotation.order),e.updateMatrixWorld(!0),i(),p.current={position:Ee,rotation:K}},[g,N,a,C,v,i,e,o,M,S,t,y]);return Ky("group",{children:Ky(J_,{matrix:a,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableScaling:!0,onDragStart:P,onDrag:(w,A,k,V)=>T(A,V),onDragEnd:()=>{s.current=!1;let w=p.current;if(p.current=null,w)r(w),h.current=requestAnimationFrame(()=>{h.current=null,n(!1)});else if(m.current.length>0){for(let A of m.current)Ui(A);e.updateMatrixWorld(!0),i(),n(!1)}else n(!1);m.current=[]}})})}import{Fragment as ho,jsx as B,jsxs as oe}from"react/jsx-runtime";function MP(e){let t=e.object;if(!t.isSkinnedMesh||!e.face||!t.skeleton)return null;let r=t.geometry,n=r.getAttribute("skinIndex"),i=r.getAttribute("skinWeight"),o=r.getAttribute("position");if(!n||!i||!o)return null;let a=t.worldToLocal(e.point.clone()),s=[e.face.a,e.face.b,e.face.c],c=new Nt,l=s[0],p=1/0;for(let h of s){c.fromBufferAttribute(o,h);let f=c.distanceToSquared(a);f<p&&(p=f,l=h)}let d=n.getComponent(l,0),m=i.getComponent(l,0);for(let h=1;h<4;h++){let f=i.getComponent(l,h);f>m&&(m=f,d=n.getComponent(l,h))}return t.skeleton.bones[d]??null}function SP(e){let t=MP(e)??e.object,r=Go(t);if(!r)return null;t.updateWorldMatrix(!0,!1);let n=t.worldToLocal(e.point.clone());return{anchorNodeName:r,anchorLocalPosition:[n.x,n.y,n.z]}}function CP(e,t,r){if(!e.anchorNodeName||!e.anchorLocalPosition)return!1;let n=Gn(t,e.anchorNodeName);return n?(n.updateWorldMatrix(!0,!1),r.set(...e.anchorLocalPosition).applyMatrix4(n.matrixWorld),!0):!1}function TP({annotation:e,enabled:t,controlsRef:r,offsetRef:n}){let i=ov(m=>m.scene),o=de(null),a=de(!1),s=ut(()=>new Nt,[]),c=ut(()=>new Nt,[]),l=ut(()=>new Nt,[]),p=e?.anchorNodeName,d=e?.anchorLocalPosition;return ge(()=>{o.current=null,a.current=!1},[p,e?.id]),iv(()=>{let m=r.current,h=n.current;if(!t||!m||!h||!p||!d){a.current=!1;return}let f=o.current;if((!f||!f.parent)&&(f=Gn(i,p),o.current=f),!f){a.current=!1;return}f.updateWorldMatrix(!0,!1),s.set(d[0],d[1],d[2]).applyMatrix4(f.matrixWorld),!(a.current&&s.distanceToSquared(c)<1e-8)&&(c.copy(s),a.current=!0,l.copy(s).add(h),m.setLookAt(l.x,l.y,l.z,s.x,s.y,s.z,!0))}),null}function _P(e){let t={total:0,missing:0};return e.traverse(r=>{let n=r;!n.isMesh||!n.geometry||(t.total+=1,n.geometry.getAttribute("uv")||(t.missing+=1))}),t}var PP=.2,rv=Object.freeze({});function EP({enabled:e,speed:t,controlsRef:r}){let n=ov(i=>i.invalidate);return iv((i,o)=>{!e||!r.current||(r.current.rotate(o*PP*t,0,!1),n())}),null}function AP(e,t,r){let n=t?.camera;if(!(n instanceof av))return null;let o=(e instanceof mo?e:new mo().setFromObject(e)).getSize(new Nt).length();return!Number.isFinite(o)||o<=0?null:(n.near=o/100,n.far=o*100,n.updateProjectionMatrix(),t&&r===void 0&&(t.maxDistance=o*10),o)}function RP(e,t){let r=e.camera;if(!(r instanceof av)||!(t>0))return;let n=Math.min(Math.max(e.distance/200,t/1e5),t/100);Math.abs(n-r.near)<=r.near*.01||(r.near=n,r.updateProjectionMatrix())}async function nv(e,t,r=.6){let n=e.smoothTime;e.smoothTime=r;try{return await t()}finally{e.smoothTime=n}}function kP(e){let t=Qm(),r=Zm(e);return B(DP,{...im(e),contextRecovery:t,engagement:r},t.generation)}function DP({contextRecovery:e,engagement:t,modelUrl:r,tilesetUrl:n,tilesErrorTarget:i=8,tilesCacheSize:o=800,onObjectCatalog:a,modelFormat:s,licenseKey:c,licenseValidationUrl:l,objectBindings:p="auto",selectedObject:d,panelHoveredObject:m,onObjectBindingsChange:h,onObjectSelect:f,onObjectHover:g,onObjectDoubleClick:y,onObjectContextMenu:x,decalMove:C,onObjectEditLeaseChange:v,onSceneLoaded:N,onModelLoaded:M,onLoadError:S,onProgress:O,onCameraControllerChange:R,cameraControllerType:P,onAction:T,onHiddenObjectsChange:w,onCameraChange:A,onViewerReady:k,onTextureUpload:V,onAnimationsReady:F,onAnnotationsChange:z,activeAnnotation:H,onActiveAnnotationChange:E,camera:G,cameraLimits:K,backgroundColor:Ce,shadows:Z=!0,showObjectBindingDataPanel:Te=!0,customObjectBindingDataPanel:Ne,customSceneObjectsPanel:pe,showSceneObjectsPanel:Ue=!0,showDownloadButton:Ee=!0,downloadFilename:Ke="model",showResetButton:dt=!0,showFullscreenButton:fe=!1,showLoadingOverlay:Ie=!0,showMouseController:Xe=!1,mouseControllerPosition:Qt="center-bottom",mouseControllerOpacity:J=1,moveSensitivity:cr=.08,zoomSensitivity:et=1,sceneConfig:ze,onSceneConfigChange:ke,disableZoom:jt=!1,zoomOnSelected:ur=!0,highlightOnHover:St=!0,enableCameraControls:Qe=!0,onAutoFit:ne,refitOnResize:be=!0,renderMode:ft="demand",maxDpr:Ve=2,preserveDrawingBuffer:pt=!1,performanceProfile:X="auto",dracoDecoderPath:ue,ktx2TranscoderPath:le,meshopt:Le=!0,showMeasureTools:De=!1,showUvCheckerButton:Me=!1,showExplodeControls:Be=!1,showMaterialVariants:re=!0,showSectionTools:Se=!1,isolation:Ae,onIsolationChange:ht,showIsolateControls:Jt=!1,cinematic:it,measurementUnit:kt="m",enableXR:jr=!1,usdzUrl:Zt,arScaleMode:Dn="normalized",mobileHandoffUrl:za,showAnnotationNavigation:gt=!0,showAnnotationOnHover:Pr=!1,moveModeEnabled:I=!1,objectTransformSpace:j="world",enableKeyboardNavigation:U=!1,showViewGizmo:W=!1,overlay:$,unsafe_sceneChildren:ee,autoRotate:se,autoRotateSpeed:tt,onTexturePositioningChange:Oe,endTexturePositioningRef:Ge,texturePositioning:je}){ge(()=>()=>t.interrupt(),[t]);let Je=de(t);Je.current=t;let ae=p==="auto",He=ae?rv:p,{isInsideEditor:mt,activeTab:Pt,activeSubTab:dr}=Cs(),Vt=mt&&Pt==="scene"&&dr==="Lighting",Ct=Bm(c,l),[di,sv]=ie({}),[Hl,Yd]=ie(void 0),[Wl,Kd]=ie(void 0),Re=ut(()=>{let u=Kc(ze??Fh,di);return Hl!==void 0&&(u={...u,model:{...u.model,materialVariant:Hl}}),Wl!==void 0&&(u={...u,section:{...Uo,...u.section,...Wl}}),u},[ze,di,Hl,Wl]),pi=de(Re);pi.current=Re,ge(()=>{t.setMaterialVariant(Re.model.materialVariant??null)},[Re.model.materialVariant,t]);let lv=ze?.model.materialVariant;ge(()=>{Yd(void 0)},[lv,r]);let cv=JSON.stringify(ze?.section??null);ge(()=>{Kd(void 0)},[cv,r]);let fo=Y(u=>{if(ke){let b=pi.current;ke({...b,section:{...Uo,...b.section,...u}});return}Kd(b=>({...b,...u}))},[ke]),[Qd,uv]=ie(!1),dv=Y(u=>{if(t.chooseVariant(u,pi.current.model.materialVariant??null),ke){let b=pi.current;ke({...b,model:{...b.model,materialVariant:u}});return}Yd(u)},[ke,t]),Na=Y(u=>{if(ke){ke(Kc(pi.current,u));return}sv(b=>{let _={...b};for(let[L,D]of Object.entries(u))_[L]={...b[L],...D};return _})},[ke]),[Xl,$l]=ie(null),[ql,go]=ie(null),[pv,Vr]=ie(null),cn=de(0),[bo,pr]=ie(null),[hv,Jd]=ie(null),yo=Re.model.renderer==="uv-checker",hi=Me?hv??yo:yo,Ln=ut(()=>{let u=hi?"uv-checker":yo?"pbr":Re.model.renderer;return u===Re.model.renderer?Re:{...Re,model:{...Re.model,renderer:u}}},[yo,Re,hi]);ge(()=>{Jd(null)},[r,Re.model.renderer,Me,n]);let mv=ut(()=>{if(Ce)return Ce;let u=Re.background;return u.enabled&&u.type==="color"?u.color:"#1c1c1d"},[Ce,Re]),Zd=ut(()=>({dracoDecoderPath:ue,ktx2TranscoderPath:le,meshopt:Le}),[ue,le,Le]),fv=ut(()=>Uf(X),[X]),Pe=de(null),[gv,bv]=ie("orbit"),[yv,ep]=ie(!1),un=P!==void 0?P:gv,vo=Y(u=>{ep(!1),u!==un&&(bv(u),R?.(u))},[un,R]),[ja,tp]=ie(!1),[ye,xo]=ie(null),wo=!!(je||Oe||Ge),rp=de(Oe);rp.current=Oe,ge(()=>{rp.current?.(ye)},[ye]),ge(()=>{if(Ge)return Ge.current=()=>xo(null),()=>{Ge.current=null}},[]),ge(()=>{Pe.current&&(Pe.current.dollySpeed=Math.max(et,0))},[et]),ge(()=>{Pe.current&&(Pe.current.enabled=Qe&&!ja&&!Qd&&!ye)},[Qe,ja,Qd,ye]);let Yl=de(null),np=de(new Map),ip=de(null),op=de(null),er=de(null),mi=de({});ge(()=>()=>{for(let u of Object.values(mi.current))URL.revokeObjectURL(u)},[]);let Dt=de({}),[,vv]=ie(0),ap=Y(()=>{vv(u=>u+1)},[]),Va=de({}),sp=de(null),hr=qm(fe),Er=de(null),[dn,xv]=ie(null),wv=Y(u=>{Er.current=u,xv(u)},[]),Fa=de(new Set),On=de(null);ge(()=>{let u=dn;if(!u||!U||!Qe||I)return;let b=new Set(["w","a","s","d"," ","c"]),_=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]),L=0,D=te=>te.code==="Space"?" ":te.key.toLowerCase(),q=()=>{Fa.current.clear(),L=0,On.current!==null&&(cancelAnimationFrame(On.current),On.current=null)},Q=te=>{let ve=Pe.current,xe=Fa.current;if(!ve||xe.size===0){On.current=null,L=0;return}let rt=L?Math.min((te-L)/1e3,.05):1/60;L=te;let at=Math.max(ve.distance*.75,.01)*rt;xe.has("w")&&ve.forward(at,!1),xe.has("s")&&ve.forward(-at,!1),xe.has("a")&&ve.truck(-at,0,!1),xe.has("d")&&ve.truck(at,0,!1),xe.has(" ")&&ve.truck(0,at,!1),xe.has("c")&&ve.truck(0,-at,!1),On.current=requestAnimationFrame(Q)},me=te=>{if(te.target!==u){q();return}if(_.has(te.key)){let xe=Pe.current;if(!xe)return;te.preventDefault();let rt=Math.PI/90,at=Math.max(xe.distance*.05,.01);te.key==="ArrowUp"?te.shiftKey?xe.forward(at,!0):xe.rotate(0,-rt,!0):te.key==="ArrowDown"?te.shiftKey?xe.forward(-at,!0):xe.rotate(0,rt,!0):te.key==="ArrowLeft"?xe.rotate(-rt,0,!0):xe.rotate(rt,0,!0);return}let ve=D(te);b.has(ve)&&(te.preventDefault(),Fa.current.add(ve),On.current===null&&(On.current=requestAnimationFrame(Q)))},we=te=>{Fa.current.delete(D(te))};return u.addEventListener("keydown",me),u.addEventListener("keyup",we),u.addEventListener("blur",q),()=>{u.removeEventListener("keydown",me),u.removeEventListener("keyup",we),u.removeEventListener("blur",q),q()}},[dn,Qe,U,I]);let Kl=de(null),[Mv,lp]=ie(He),[fi,Ua]=ie({}),[cp,Ql]=ie(null),[Jl,up]=ie(null),[Sv,Cv]=ie(null),[Tv,_v]=ie(null),[mr,dp]=ie(null),[Pv,pp]=ie({}),Tt=de(null),Ga=de(null),Zl=de(0),hp=de(null),[Ev,Av]=ie(0),pn=de(!1),Mo=de(!1),ec=de(!!G);ec.current=!!G;let Fr=de(null),[So,Co]=ie(!!r),[gi,To]=ie(!r||!!ne||!!G),[fr,mp]=ie(!1),[fp,gp]=ie([]),[bp,tc]=ie(!1),[Rv,rc]=ie(null),[yp,_o]=ie(!1),[vp,kv]=ie(0),nc=de(""),xp=de(""),[wp,Mp]=ie(!1),[Sp,Dv]=ie(null),[Lv,Cp]=ie(!1),[Po,Tp]=ie({total:0,missing:0}),[Ov,_p]=ie("Loading model..."),[Iv,ic]=ie(null),Et=de({}),Eo=Y(()=>{let u=Pe.current;if(!u||Fr.current)return;let b=u.getPosition(new Nt),_=u.getTarget(new Nt);Fr.current={position:[b.x,b.y,b.z],target:[_.x,_.y,_.z]}},[]),[Ao,Ha]=ie(!1),[Wa,Pp]=ie(0),[oc,Ep]=ie(!1);ge(()=>{Pp(0),Ep(!1)},[r,n]);let In=ut(()=>{let u=Re.cinematic,b=u?.enabled?{waypoints:u.waypoints,duration:u.duration,loop:u.loop,autoPlay:u.autoPlay}:null;return it===void 0?b&&(b.waypoints?.length??0)>=2?b:null:it===!1?null:it===!0?b??{}:{...b??{},...it}},[it,Re]),[Bn,Xt]=ie(!1),[Bv,zn]=ie(!1),ac=de(!1);ge(()=>{Xt(!1),zn(!1),ac.current=!1},[r,n]),ge(()=>{!In?.autoPlay||ac.current||fr&&gi&&!So&&(ac.current=!0,Xt(!0),zn(!1))},[In,fr,gi,So]);let zv=Y(()=>{Xt(!1),zn(!0)},[]),{captureVideo:sc,cancelVideo:lc,isRecording:Ap,recording:ot,progress:Nv,onProgress:jv}=$m({rendererCaptureRef:er,controlsRef:Pe,cinematicConfig:In,ready:e.status==="ready"&&fr&&gi&&!So,modelUrl:`${r}|${n??""}`,onCaptureStart:zv});ge(()=>{e.status==="lost"&&(t.interrupt(),lc(),Xt(!1),Pe.current?.stop())},[e.status,lc,t]);let{xrStore:Nn,presenterRef:Vv,arSupported:cc,vrSupported:Rp,quickLookSupported:kp,resolvedMobileHandoffUrl:Xa,isMobileHandoffOpen:Dp,arOverlay:Fv,openMobileHandoff:Uv,closeMobileHandoff:Lp,openQuickLook:Gv,handleARStateChange:Hv}=Wf({enableXR:jr,usdzUrl:Zt,mobileHandoffUrl:za,engagement:t}),[Ar,Op]=ie(()=>ze?.annotations??[]);ge(()=>{if(Ar.length>0){let u=Ar.reduce((b,_)=>Math.max(b,_.id),0);Ya.current=u}else Ya.current=0},[Ar]);let[Ft,$a]=ie(null),[hn,qa]=ie({title:"",description:""}),Ya=de(0),[Wv,Ip]=ie(null),[tr,bi]=ie(-1),[Bp,Ka]=ie(!1),yi=de(null),Ze=ut(()=>[...Ar].sort((u,b)=>u.id-b.id),[Ar]),gr=Re.section??Uo,zp=re&&fr&&fp.length>1,Np=dt||Ee||fe&&hr.supported||gt&&Ze.length>0,Qa=ut(()=>tr<0||tr>=Ze.length?null:Ze[tr],[tr,Ze]),Rr=Y(u=>{if(H!==void 0){E?.(u);return}Ip(u?{annotation:u}:null)},[H,E]),vi=Y(u=>{let b=Pe.current,_=Tt.current;if(!b)return;let L=new Nt,D=np.current.get(u.id);D?L.copy(D):_&&CP(u,_,L)||L.set(u.worldPosition[0],u.worldPosition[1],u.worldPosition[2]),Yl.current=null;let q=b.smoothTime;b.smoothTime=.6;let Q=u.worldNormal;if(_){let me=new mo().setFromObject(_),we=new Nt;me.getCenter(we);let te=new Nt;me.getSize(te);let ve=te.length()*.2,xe;Q?xe=new Nt(Q[0],Q[1],Q[2]):xe=L.clone().sub(we),xe.lengthSq()<1e-6&&xe.set(0,0,1),xe.normalize();let rt=Math.max(ve*.6,.3),at=L.clone().add(xe.multiplyScalar(rt));b.setPosition(at.x,at.y,at.z,!0),u.anchorNodeName&&u.anchorLocalPosition&&(Yl.current=at.clone().sub(L))}b.setTarget(L.x,L.y,L.z,!0),yi.current&&clearTimeout(yi.current),yi.current=setTimeout(()=>{b.smoothTime=q,yi.current=null},800),Rr(u)},[Rr]),Xv=Y(()=>{Ze.length!==0&&(t.startTour(Ze.length),Ha(!0),bi(0),vi(Ze[0]))},[Ze,vi,t]),$v=Y(()=>{if(Ze.length===0||tr<0)return;Ka(!0);let u=(tr-1+Ze.length)%Ze.length;bi(u),vi(Ze[u]),setTimeout(()=>Ka(!1),500)},[tr,Ze,vi]),qv=Y(()=>{if(Ze.length===0||tr<0)return;if(tr===Ze.length-1){if(t.completeTour(),Ha(!1),bi(-1),Rr(null),Pe.current&&Fr.current){let b=Fr.current;Pe.current.setLookAt(b.position[0],b.position[1],b.position[2],b.target[0],b.target[1],b.target[2],!0)}return}Ka(!0);let u=tr+1;bi(u),vi(Ze[u]),setTimeout(()=>Ka(!1),500)},[tr,Ze,vi,Rr,t]),Yv=Y(()=>{if(t.stopTour(),Ha(!1),bi(-1),Rr(null),Pe.current&&Fr.current){let u=Fr.current;Pe.current.setLookAt(u.position[0],u.position[1],u.position[2],u.target[0],u.target[1],u.target[2],!0)}},[Rr,t]);ge(()=>{Je.current.stopTour("annotations-changed"),bi(-1),Ha(!1)},[Ze.length]),ge(()=>()=>{yi.current&&clearTimeout(yi.current)},[]),ge(()=>{Qa&&Ao&&Rr(Qa)},[Qa,Rr,Ao]),ge(()=>{if(ze?.annotations===void 0)return;let u=ze.annotations.map(b=>({...b,localPosition:b.localPosition??b.worldPosition}));Op(u)},[ze?.annotations]);let Ro=Y(()=>{if(H!==void 0){E?.(null);return}Ip(null)},[H,E]),ko=H!==void 0?H:Wv?.annotation??null,Do=ut(()=>ko?Ar.find(b=>b.id===ko.id)??null:null,[ko,Ar]);ge(()=>{ko&&!Do&&Ro()},[ko,Do,Ro]);let Lo=!ae&&h!==void 0,he=Lo?He:Mv;Et.current=he,ge(()=>{if(!ye)return;let u=he[ye.objectKey]?.style?.material?.[ye.textureKey]?.path;(!wo||!u)&&xo(null)},[he,wo,ye]);let uc=de({}),[Ja,Kv]=ie({});ge(()=>{let u={...Ja},b=!1,_=new Set;for(let[L,D]of Object.entries(he)){_.add(L);let q=D.style?.material,Q=uc.current[L]??{},me={};for(let te of gn){let ve=q?.[te]?.path;ve&&(me[te]=ve,ve!==Q[te]&&(u[L]!==te&&(b=!0),u[L]=te))}let we=u[L];if(we&&!me[we]){let te=gn.find(ve=>!!me[ve]);te?u[L]=te:delete u[L],b=!0}uc.current[L]=me}for(let L of Object.keys(u))_.has(L)||(delete u[L],delete uc.current[L],b=!0);b&&Kv(u)},[he]);let Qv=ut(()=>Object.entries(he).map(([u,b])=>JSON.stringify([u,b.modelObjectId,b.transform??null])).sort().join(""),[he]),{measureMode:xi,measureModeRef:jp,measurePoints:Vp,measurementTool:Fp,areaClosed:Up,measurementError:Jv,selectMeasurementTool:Zv,undoMeasurementPoint:ex,finishMeasureArea:tx,snapMode:rx,setSnapMode:nx,snapPreview:ix,handleMeasurePointerMove:ox,clearSnapPreview:Gp,showDimensions:Hp,measureBox:dc,modelBounds:ax,refreshBounds:Wp,clearMeasurements:sx,toggleMeasureMode:lx,toggleDimensions:cx,handleMeasurePointerDown:ux,handleMeasureClick:dx}=jf({canvasAreaRef:Er,controlsRef:Pe,sceneRef:Tt,modelUrl:`${r}|${n??""}`,modelRotation:Re.model.rotation,bindingTransformSignature:Qv,modelLoaded:fr,enabled:De&&!ot}),[px,hx]=ie(34),{isDownloading:pc,downloadMenuOpen:mx,uvExportError:Xp,toggleDownloadMenu:fx,handleDownloadMesh:gx,handleDownloadScreenshot:bx,handleDownloadUvLayout:yx,handleDownloadVideo:$p,videoFormat:hc,setVideoFormat:vx,videoExportError:qp}=Rf({sceneRef:Tt,materialRefs:Va,rendererCaptureRef:er,objectBindings:he,downloadFilename:Ke,captureVideo:sc}),Yp=ut(()=>Object.fromEntries(Object.entries(he).filter(([,u])=>u.visible===!1).map(([u])=>[u,!0])),[he]),Ur=ut(()=>{let u=new WeakMap,b=new Map,_=new Map;for(let[L,D]of Object.entries(he))u.set(D,L),b.has(D.id)||b.set(D.id,L),_.has(D.modelObjectId)||_.set(D.modelObjectId,L);return{byReference:u,byId:b,byModelObjectId:_}},[he]),$t=Y(u=>u?Ur.byReference.get(u)??Ur.byModelObjectId.get(u.modelObjectId)??Ur.byId.get(u.id)??null:null,[Ur]),mc=d!==void 0,Oo=mc?d??null:Tv,Lt=$t(Oo);ge(()=>{t.setSelectedPart(Lt)},[Lt,t]);let fc=Lt?Dt.current[Lt]??null:null,xx=Lt?Ja[Lt]:void 0,Kp=$t(St?m??Jl??Sv:null),wx=Kp?Dt.current[Kp]??null:null,Qp=Y(u=>{Cv(u),g?.(u)},[g]),Jp=Te&&Oo!==null&&Lt!==null,Io=(Lt?he[Lt]:null)??Oo,Bo=Io&&(Io.modelObjectId||Io.id)||null,wi=Bo?Pv[Bo]??null:null;ge(()=>{Lo||lp(He)},[Lo,He]),ge(()=>{w?.(Yp)},[Yp,w]);let Mi=Y((u,b)=>{if(un==="pointerLock"){vo("orbit");return}u&&b?t.viewPart({objectId:u.id,objectKey:$t(u)??(u.modelObjectId||u.id),label:u.label,source:b}):u||t.setSelectedPart(null),mc||_v(u),f?.(u)},[un,vo,mc,f,$t,t]),rr=Y(u=>{Lo||lp(u),h?.(u)},[Lo,h]),Zp=de(null),Za=Y(u=>{if(!ae)return;let b=`${r}
26
+ ${n??""}`,_=Zp.current===b?Et.current:rv;Zp.current=b;let L=em(u);for(let D of Object.keys(L))_[D]&&(L[D]=_[D]);rr(L)},[ae,r,n,rr]),es=de({}),Si=Y(u=>{let b=rf(Dt.current[u]),_=Et.current[u]?.style?.material,L=_?.emissive??b.color,D=_?.emissiveIntensity??b.intensity;return{color:L,intensity:D,on:L!=="#000000"&&D>0}},[]),zo=Y((u,b)=>{let _=Et.current,L=_[u];L&&rr({..._,[u]:{...L,style:{...L.style,material:{...L.style?.material,...b}}}})},[rr]),gc=u=>u==="#000000"?"#ffffff":u,Mx=Y(u=>{let b=Lt;if(!b||!u)return;let _=Et.current[b];_&&rr({...Et.current,[b]:{..._,transform:{..._.transform,...u}}})},[rr,Lt]),br=Y((u,b)=>he[u]?u:b?$t(b):Ur.byId.get(u)??Ur.byModelObjectId.get(u)??null,[he,$t,Ur]),Ot=Y((u,b)=>{let _=br(u),L=_?he[_]:void 0;!_||!L||rr({...he,[_]:{...L,style:b(L.style)}})},[br,he,rr]),qt=Y(()=>{if(mr){let u=fi[mr.objectId]?.hex;u!==void 0&&(Ot(mr.objectId,b=>({...b,material:{...b?.material,baseColor:u}})),Ua(b=>({...b,[mr.objectId]:{}})))}dp(null)},[mr,fi,Ot]),eh=Y(()=>{Mi(null),Ql(null),qt()},[Mi,qt]),bc=Y((u,b,_,L,D)=>{let q=sp.current,Q=Er.current,me=Pe.current?.camera;if(!q)return{objectId:u,x:24,y:24};let we=q.getBoundingClientRect(),te=12,ve=we.width-b-te,xe=we.height-_-te,rt=Math.max(te,(we.width-b)/2),at=Math.max(te,(we.height-_)/2),ki=br(u,L),jo=ki?Dt.current[ki]:null,kr=(Di,Un)=>Un<=te?te:Math.min(Math.max(Di,te),Un);if(Q&&me&&jo){let Di=Q.getBoundingClientRect(),Un=new Nt;new mo().setFromObject(jo).getCenter(Un),Un.project(me);let Kx=(Un.x+1)/2*Di.width+(Di.left-we.left),Qx=(1-Un.y)/2*Di.height+(Di.top-we.top);return{objectId:u,x:kr(Kx+24,ve),y:kr(Qx-_/2,xe)}}let Ec=typeof D?.screenX=="number"?D.screenX-we.left:rt,Ac=typeof D?.screenY=="number"?D.screenY-we.top:at;return{objectId:u,x:kr(Ec,ve),y:kr(Ac,xe)}},[br]),ts=Y(u=>{let{objectId:b,action:_,binding:L}=u;switch(Ql(u),_.id){case"toggle-visibility":{let D=b;L?.modelObjectId&&(D=Ur.byModelObjectId.get(L.modelObjectId)??D);let q=he[D],Q=q?.visible===!1;q&&rr({...he,[D]:{...q,visible:Q}});break}case"change-color":qt(),pp(D=>{if(!(b in D))return D;let q={...D};return delete q[b],q}),Ua(D=>{let q=br(b,L)??b,Q=D[b]?.hex,me=he[q]?.style?.material?.baseColor;return{...D,[b]:{...D[b],hex:Q??me??"#ffffff"}}}),dp(bc(b,225,250,L,u));break;case"change-material":qt(),pp(D=>{if(b in D){let q={...D};return delete q[b],q}return{...D,[b]:bc(b,300,320,L,u)}});break;case"add-text":case"add-image":{qt();let D=_.id;cn.current++,Vr(null),pr(null),go(q=>q?.objectId===b&&q.kind===D?null:{objectId:b,kind:D,activeId:null});break}case"toggle-light":case"change-light-color":case"set-brightness":{let D=br(b,L);if(!D)break;let q=tf(pi.current,he,D);if(_.id==="toggle-light"){if(q.length>0){let te=!q.some(ve=>ve.visible);Na(Object.fromEntries(q.map(ve=>[ve.id,{visible:te}])));break}let we=Si(D);we.on?(es.current[D]=we.intensity,zo(D,{emissiveIntensity:0})):zo(D,{emissive:gc(we.color),emissiveIntensity:es.current[D]??1});break}let Q=_.id,me=q.length>0?null:Si(D);$l(we=>we?.objectId===b&&we.kind===Q?null:{objectId:b,kind:Q,target:me?{type:"glow",objectKey:D,baseIntensity:me.on?me.intensity:es.current[D]??1}:{type:"lights",lightIds:q.map(te=>te.id),baseIntensity:Object.fromEntries(q.map(te=>[te.id,te.intensity]))},percent:me&&!me.on?0:100});break}default:break}T?.(u)},[rr,zo,Na,Si,he,bc,T,qt,br,Ur]);ge(()=>{if(mr)return window.addEventListener("pointerdown",qt),()=>window.removeEventListener("pointerdown",qt)},[mr,qt]),ge(()=>{if(!Do)return;let u=b=>{if(Kl.current&&!Kl.current.contains(b.target)){if(b.target.closest?.(".ri-annotationMarker"))return;Ro()}};return document.addEventListener("mousedown",u),document.addEventListener("touchstart",u),()=>{document.removeEventListener("mousedown",u),document.removeEventListener("touchstart",u)}},[Do,Ro]),ge(()=>{if(!Ft)return;let u=b=>{let _=b.target;if(_.closest?.(".ri-annotationPopup")||_.closest?.("button, input, textarea, .ri-measureTools, .ri-xrTools, .ri-buttonContainer"))return;let L=Er.current;!L||!L.contains(_)||($a(null),qa({title:"",description:""}))};return document.addEventListener("mousedown",u,!0),document.addEventListener("touchstart",u,!0),()=>{document.removeEventListener("mousedown",u,!0),document.removeEventListener("touchstart",u,!0)}},[Ft]);let th=Y((u,b)=>{let _=mi.current[u];_&&URL.revokeObjectURL(_),b.startsWith("blob:")?mi.current[u]=b:delete mi.current[u],Ot(u,L=>({...L,material:{...L?.material,texture:{path:b}}}))},[Ot]),Sx=u=>{let b=u.target.files?.[0],_=op.current;if(!b||!_)return;let L=br(_);L&&(V?V(b,L).then(D=>th(L,D),D=>console.error("onTextureUpload failed:",D)):th(L,URL.createObjectURL(b)),u.target.value="")},rh=u=>{op.current=u,ip.current?.click()},nh=u=>{let b=br(u);if(!b)return;Ot(b,L=>L?.material?.texture?{...L,material:{...L.material,texture:void 0}}:L);let _=mi.current[b];_&&(URL.revokeObjectURL(_),delete mi.current[b])},Ci=!!je,yr=typeof je=="object"?je:void 0,Cx=Y((u,b,_)=>{if(yr?.onOffsetChange){yr.onOffsetChange(u,b,_);return}Ot(u,L=>{let D=L?.material?.texture;if(!D?.path)return L;let q=D.offset??[0,0],Q=[q[0],q[1]];return Q[b]=_,{...L,material:{...L?.material,texture:{...D,offset:Q}}}})},[Ot,yr]),Tx=Y((u,b)=>{if(yr?.onRotationChange){yr.onRotationChange(u,b);return}Ot(u,_=>{let L=_?.material?.texture;if(!L?.path)return _;let D=(b%360+360)%360;return{..._,material:{..._?.material,texture:{...L,rotation:D*Math.PI/180}}}})},[Ot,yr]),_x=Y(()=>{xo(null),yr?.onEndPositioning?.()},[yr]),yc=de(k);yc.current=k;let vr=Y(()=>{let u=Pe.current;!u||!yc.current||yc.current({objectBindings:Et.current,homeCameraState:Fr.current,captureImage:b=>Ap()?Promise.reject(new Error("Wait for video export to finish before capturing an image.")):Es(er.current,b),captureVideo:sc,invalidate:()=>er.current?.invalidate(),raw:{controls:u,scene:Tt.current,nodes:Dt.current}})},[sc,Ap]),Ti=Y(async(u=!1)=>{let b=Pe.current,_=Ga.current??Tt.current;if(!b||!_)return!1;try{if(u){let L=(_ instanceof mo?_:new mo().setFromObject(_)).getBoundingSphere(new oP),D=L.center.clone(),Q=b.getPosition(new Nt).clone().sub(b.getTarget(new Nt));Q.lengthSq()<1e-6&&Q.set(0,0,1),Q.normalize();let me=Math.max(L.radius*10,20),we=D.clone().add(Q.multiplyScalar(me));await b.setLookAt(we.x,we.y,we.z,D.x,D.y,D.z,!1)}return To(!0),await nv(b,()=>b.fitToBox(_,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),await new Promise(L=>{let D=performance.now(),q=()=>{b.active===!1||performance.now()-D>8e3?(b.dispatchEvent({type:"update"}),er.current?.invalidate(),L()):(er.current?.invalidate(),setTimeout(q,100))};setTimeout(q,100)}),pn.current=!0,Eo(),vr(),!0}catch(L){return console.error("Fit scene error:",L),!1}},[Eo,vr]);ge(()=>{if(pn.current=!1,Mo.current=!1,Fr.current=null,Tt.current=null,Ga.current=null,mp(!1),gp([]),tc(!1),rc(null),_o(!1),nc.current="",Tp({total:0,missing:0}),_p("Loading model..."),ic(null),!r){Co(!1),To(!0);return}Co(!0),To(!!ne||ec.current);let u=!1,b=null,_=D=>{b=setTimeout(L,D)},L=()=>{if(u||pn.current||Mo.current)return;let D=Ga.current??Tt.current;if(!Pe.current||!D){_(100);return}if(Zl.current=AP(D,Pe.current,K?.maxDistance)??Zl.current,om(Pe.current)){pn.current=!0,Eo(),vr(),Co(!1),To(!0),er.current?.invalidate();return}Mo.current=!0,(ne?ne():ec.current?Promise.resolve(!0):Ti(!0)).then(Q=>{pn.current=Q!==!1,pn.current?(Eo(),vr(),Co(!1)):u||_(100)}).catch(()=>{pn.current=!1,u||_(100)}).finally(()=>{Mo.current=!1})};return _(50),()=>{u=!0,b&&clearTimeout(b)}},[Eo,K?.maxDistance,Ti,r,vr,ne,n]),ge(()=>{if(!be)return;let u=dn;if(!u)return;let b=null,_=new ResizeObserver(()=>{!pn.current||Mo.current||(b&&clearTimeout(b),b=setTimeout(()=>{Ti()},150))});return _.observe(u),()=>{_.disconnect(),b&&clearTimeout(b)}},[dn,Ti,be]);let ih=Y(u=>{if(jp.current||(Xt(!1),qt(),Ql(null),Mi(u,"canvas"),jt||!ur))return;let b=Pe.current,_=$t(u),L=_?Dt.current[_]:null;b&&u.cameraState?.position&&u.cameraState?.target?(b.setPosition(u.cameraState.position[0],u.cameraState.position[1],u.cameraState.position[2],!0),b.setTarget(u.cameraState.target[0],u.cameraState.target[1],u.cameraState.target[2],!0)):b&&L&&b.fitToBox(L,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[Mi,qt,$t,jt,ur]),oh=Y(u=>{if(!wo)return!1;let b=$t(u);if(!b)return!1;let _=Ja[b];return _?(Ei.current=!1,Fn.current=null,xo({objectKey:b,textureKey:_}),!0):!1},[wo,$t,Ja]),vc=de(!1),jn=Y((u,b)=>{let _=Et.current,L=_[u];if(!L)return;let D=b(L.decals??[]);rr({..._,[u]:{...L,decals:D.length>0?D:void 0}})},[rr,he]),Px=ut(()=>{if(!bo)return null;let{objectKey:u,decalId:b}=bo,_=he[u],L=_?.decals?.find(D=>D.id===b);return L?{objectId:_.modelObjectId??u,decal:L,onCancel:()=>pr(null),onCommit:D=>{jn(u,q=>q.map(Q=>Q.id===b?{...Q,...D}:Q)),pr(null)}}:null},[bo,he,jn]),_i=C??Px,xc=Y((u,b)=>{cn.current++;let _=Et.current[u],L=Dt.current[_?.modelObjectId??u],D=Cm(L,Pe.current?.camera);if(!D)return Vr("Could not find a surface on this object for the decal."),!1;let q={...b,...D};return jn(u,Q=>[...Q,q]),Vr(null),go(Q=>Q&&{...Q,activeId:q.id}),pr({objectKey:u,decalId:q.id}),!0},[jn]),rs=Y(u=>{let b=Et.current[u],_=Dt.current[b?.modelObjectId??u]?.geometry;if(!_)return .2;_.boundingBox||_.computeBoundingBox();let L=_.boundingBox?.getSize(new Nt),D=L?Math.max(L.x,L.y,L.z):0;return D>0&&Number.isFinite(D)?D/3:.2},[]),ah=()=>`decal-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`,sh=de([]);ge(()=>()=>{for(let u of sh.current)URL.revokeObjectURL(u)},[]);let Ex=Y(async(u,b,_)=>{let L=++cn.current;pr(null);let D;if(V){if(D=await V(_,u),L!==cn.current)return}else D=URL.createObjectURL(_),sh.current.push(D);xc(b,{id:ah(),image:D,size:rs(b)})},[rs,V,xc]);ge(()=>{cn.current++,Vr(null),pr(null)},[Bo,r]);let lh=ut(()=>Kh(he,Ln.styleRules),[he,Ln.styleRules]),[Ax,ch]=ie(null);ge(()=>{ch(null)},[r]);let Pi=Ae!==void 0?Ae:Ax,wc=Y(u=>{Ae===void 0&&ch(u),ht?.(u)},[Ae,ht]),Vn=ut(()=>Jh(lh,Pi),[lh,Pi]),Gr=ut(()=>Vn.setAside.size>0?Qh(he,Pi):null,[Vn,he,Pi]),Rx=Y(u=>{let b=$t(u),_=b!==null&&Gr?.size===1&&Gr.has(b);wc(_?null:{...Pi,target:u.id})},[wc,Pi,Gr]),{sourceOf:mn}=Vn,uh=Y(u=>{let b=mn(u);ih(b)},[ih,mn]),dh=Y(u=>Qp(u&&mn(u)),[Qp,mn]),ph=Y((u,b)=>{let _=mn(u);return y?.({binding:_,...b})===!0?(vc.current=!0,!0):oh(_)},[y,oh,mn]),hh=ut(()=>x?(u,b)=>x({binding:mn(u),...b}):void 0,[x,mn]),mh=Y(u=>{if(Mi(u,"panel"),jt)return;let b=Pe.current,_=$t(u),L=_?Dt.current[_]:null;if(!b||!L)return;let D=u.cameraState;D?.position&&D?.target?(b.setPosition(D.position[0],D.position[1],D.position[2],!0),b.setTarget(D.target[0],D.target[1],D.target[2],!0)):b.fitToBox(L,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[Mi,$t,jt]);ge(()=>{vr()},[vr,he]);let fh=Y((u,b)=>{RP(b,Zl.current),A?.(Hr(u,b)),vr()},[vr,A]),kx=Y(u=>{hp.current=new Set(u.map(b=>b.name)),Av(b=>b+1),Za(u.map(b=>b.name)),a?.(u)},[Za,a]),Dx=Y(u=>{Ga.current=u,er.current?.invalidate()},[]),gh=Y(u=>{Tt.current=u,Wp(u),Tp(_P(u));let b=Rh(u);Dv(b>kc?b:null),Cp(!1),ic(null),b>kc&&_p(`Preparing large model (${Math.round(b/1e6)}M triangles) \u2014 the first display can take a while on this device...`),mp(!0),gp(Xh(u)),tc(!1),rc(null),Mp(!1),n||(a&&a(iy(u)),Za(tm(u))),N?.(u),M?.(Yh(u)),vr()},[Za,vr,M,a,N,Wp,n]),bh=Y(u=>{Co(!1),To(!0),tc(!0),rc(u),S?.(u)},[S]),Lx=Y(u=>{u.lengthComputable&&u.total>0&&ic(u.loaded/u.total*100),O?.(u)},[O]),yh=Y((u,b,_)=>{if(!ke)return;let L={...Re,lighting:{...Re.lighting,lights:Re.lighting.lights.map(D=>D.id===u?{...D,position:b,..._?{rotation:_}:{}}:D)}};ke(L)},[Re,ke]);ge(()=>{let u=Tt.current;if(!fr||!u){_o(!1);return}let b=Object.entries(he);if(b.length===0){_o(!1);return}let _=n?hp.current:new Set(Object.keys(Oi(u).nodesById));if(!_||_.size===0){_o(!1);return}let L=b.map(([q,Q])=>Q.modelObjectId??q).filter(q=>!_.has(q));_o(L.length>0),kv(L.length);let D=L.join(`
27
+ `);if(L.length>0&&D!==nc.current){let q=L.slice(0,10).map(me=>`"${me}"`).join(", "),Q=L.length>10?` and ${L.length-10} more`:"";console.warn(`[react-immersive] ${L.length} object binding(s) point at nodes this model doesn't have, so they can't be selected: ${q}${Q}. Each binding's modelObjectId (or its key) must match a node name; log onObjectCatalog to see this model's names.`)}nc.current=D},[fr,he,Ev,n]),ge(()=>{if(T||mt)return;let u=[];for(let[_,L]of Object.entries(he))for(let D of L.actions??[])Dc.includes(D.id)||u.push(`"${D.id}" on "${L.label??_}"`);let b=u.join(`
28
+ `);if(u.length>0&&b!==xp.current){let _=u.slice(0,10).join(", "),L=u.length>10?` and ${u.length-10} more`:"";console.warn(`[react-immersive] ${u.length} action button(s) do nothing because ModelViewer has no onAction handler: ${_}${L}. ModelViewer itself handles ${Dc.join(", ")}; handle other ids in onAction, or pass useViewerActions().handleAction to run their effects.`)}xp.current=b},[he,mt,T]);let Mc=Y(async()=>{if(ne){await ne();return}let u=Pe.current;if(!u)return;let b=Fr.current;try{b?await nv(u,()=>u.setLookAt(b.position[0],b.position[1],b.position[2],b.target[0],b.target[1],b.target[2],!0)):await Ti()}catch(_){console.error("Reset camera error:",_)}},[ne,Ti]),IP=Y(()=>{zn(!1),Xt(!0)},[]),BP=Y(()=>{Xt(!1)},[]),Ox=Y(()=>{Xt(!1),zn(!0),setTimeout(()=>{Mc()},100)},[Mc]),Ix=Y((u,b)=>{fh(u,b)},[fh]),vh=1,Bx=4,zx=.0015,Nx=.1,jx=8,Fn=de(null),Ei=de(!1),Sc=de([0,0]),ns=de([0,0]),is=de(1),nr=de(null),os=Y((u,b)=>{let _=ye;if(!_)return;let L=Et.current[_.objectKey]?.style?.material?.[_.textureKey],D=L?.path;if(!D)return;let q=L?.rotation??0,Q=xr(_.textureKey),me=Xo(D,Q),we=Va.current[_.objectKey],te=Array.isArray(we)?we:we?[we]:[],ve=ss[_.textureKey];for(let xe of te){let rt=xe;ve in rt&&(rt[ve]=gs(rt.userData,_.textureKey,me,D,u,b,q))}er.current?.invalidate()},[ye]),Vx=Y(u=>{if(!ye)return;u.currentTarget.setPointerCapture?.(u.pointerId),Fn.current={x:u.clientX,y:u.clientY},Ei.current=!1;let b=Et.current[ye.objectKey]?.style?.material?.[ye.textureKey];if(Sc.current=b?.offset??[0,0],ns.current=Sc.current,is.current=b?.scale??1,nr.current===null){let _=()=>{er.current?.invalidate(),nr.current=requestAnimationFrame(_)};nr.current=requestAnimationFrame(_)}},[ye]),Cc=Y(u=>{if(!ye||!Fn.current)return;let b=Er.current,_=b?.clientWidth||1,L=b?.clientHeight||1,D=u.clientX-Fn.current.x,q=u.clientY-Fn.current.y;if(!Ei.current&&Math.hypot(D,q)<Bx)return;Ei.current=!0;let Q=-(D/_)*vh,me=q/L*vh,[we,te]=Sc.current,ve=[we+Q,te+me];ns.current=ve,os(ve,is.current),Ot(ye.objectKey,xe=>({...xe,material:{...xe?.material,[ye.textureKey]:{...xe?.material?.[ye.textureKey],path:Et.current[ye.objectKey]?.style?.material?.[ye.textureKey]?.path,offset:ve}}}))},[ye,os,Ot]),No=Y(u=>{if(!ye)return;u.target?.releasePointerCapture?.(u.pointerId),nr.current!==null&&(cancelAnimationFrame(nr.current),nr.current=null);let b=Ei.current,_=ye;if(b){Ot(_.objectKey,L=>({...L,material:{...L?.material,[_.textureKey]:{...L?.material?.[_.textureKey],path:Et.current[_.objectKey]?.style?.material?.[_.textureKey]?.path,offset:ns.current}}})),Fn.current=null,Ei.current=!1;return}Fn.current=null,xo(null)},[ye,Ot]);ge(()=>{if(!ye)return nr.current!==null&&(cancelAnimationFrame(nr.current),nr.current=null),()=>{nr.current!==null&&(cancelAnimationFrame(nr.current),nr.current=null)}},[ye]),ge(()=>{let u=dn;if(!(!u||!ye))return u.addEventListener("pointermove",Cc),u.addEventListener("pointerup",No),u.addEventListener("pointercancel",No),()=>{u.removeEventListener("pointermove",Cc),u.removeEventListener("pointerup",No),u.removeEventListener("pointercancel",No)}},[dn,ye,Cc,No]);let Tc=Y(u=>{if(!ye)return;u.preventDefault();let b=ye,_=Math.exp(-u.deltaY*zx),L=Math.min(jx,Math.max(Nx,is.current*_));is.current=L,os(ns.current,L),Ot(b.objectKey,D=>({...D,material:{...D?.material,[b.textureKey]:{...D?.material?.[b.textureKey],path:Et.current[b.objectKey]?.style?.material?.[b.textureKey]?.path,scale:L}}}))},[ye,os,Ot]);ge(()=>{let u=dn;if(!(!u||!ye))return u.addEventListener("wheel",Tc,{passive:!1}),()=>u.removeEventListener("wheel",Tc)},[dn,ye,Tc]);let Fx=Y(u=>{if(jp.current)return;if(vc.current){vc.current=!1;return}let b=Pt==="scene"&&dr==="Annotations";if(u.target.closest("button, input, textarea, .ri-colorPicker, .ri-materialPicker, .ri-annotationPopup, .ri-annotationMarker, .ri-viewAnnotationPopup"))return;let L=Er.current,D=Pe.current,q=D?.camera,Q=Tt.current;if(!L||!D||!q||!Q||!b&&!D.enabled)return;let me=L.getBoundingClientRect(),we=(u.clientX-me.left)/me.width*2-1,te=-((u.clientY-me.top)/me.height)*2+1,ve=new iP;ve.setFromCamera(new aP(we,te),q);let xe=ve.intersectObject(Q,!0);if(xe.length===0)return;if(!b){let{x:kr,y:Ec,z:Ac}=xe[0].point;D.setOrbitPoint(kr,Ec,Ac);return}let rt=xe[0],at=rt.point,ki=Q.worldToLocal(rt.point.clone()),jo=[0,0,1];if(rt.face){let kr=rt.face.normal.clone().transformDirection(rt.object.matrixWorld).normalize();jo=[kr.x,kr.y,kr.z]}$a({worldPosition:[at.x,at.y,at.z],localPosition:[ki.x,ki.y,ki.z],worldNormal:jo,anchor:SP(rt),screenX:u.clientX-me.left,screenY:u.clientY-me.top}),qa({title:"",description:""})},[Pt,dr]),xh=Y(()=>{if(!Ft||!hn.title.trim())return;Ya.current+=1;let b={id:Ya.current,worldPosition:Ft.worldPosition,localPosition:Ft.localPosition,worldNormal:Ft.worldNormal,anchorNodeName:Ft.anchor?.anchorNodeName,anchorLocalPosition:Ft.anchor?.anchorLocalPosition,title:hn.title.trim(),description:hn.description},_=[...Ar,b];Op(_),z?.(_),$a(null)},[Ft,hn,Ar,z]),_c=Y(()=>$a(null),[]),Ux=Y(u=>{Rr(u)},[Rr]);if(Ct.status==="checking")return B("div",{className:"ri-viewer ri-viewer--license-checking",children:B(hs,{title:"Verifying License",message:"Checking your license key..."})});if(Ct.status==="invalid")return B("div",{className:"ri-viewer ri-viewer--license-invalid",children:B(hs,{tone:"error",title:"Invalid License",message:Ct.isLocalDomain?Ct.reason??"License has been revoked or has expired":"Failed to load. Please contact the site administrator."})});let fn=wi?br(wi.objectId):null,Pc=fn?he[fn]?.style?.material?.texture?.path:void 0,wh=Pc?gm(Pc)??Pc:void 0,Mh=Ci?yr?.offset??(fn?he[fn]?.style?.material?.texture?.offset:void 0):void 0,Sh=Ci?yr?.rotationDegrees??(fn?((he[fn]?.style?.material?.texture?.rotation??0)*180/Math.PI%360+360)%360:0):0,Ch=Ci?yr?.isPositioning??!!(fn&&ye?.objectKey===fn&&ye?.textureKey==="texture"):!1,Th=Ci?Cx:void 0,_h=Ci?Tx:void 0,Ph=Ci?_x:void 0,Gx=Er.current?.offsetWidth??600,Hx=Er.current?.offsetHeight??400,Wx=350,Xx=290,$x=Ft?Math.min(Ft.screenX+12,Gx-Wx-8):0,qx=Ft?Math.min(Ft.screenY,Hx-Xx-8):0,Yx=Ie&&!!r&&!bp&&!fr,Ai=jr&&(Nn&&(cc||Rp)||kp||!!Xa),Eh=(Ai?1:0)+(Me?1:0),Ri=u=>16+u*42+(De&&u>Eh?Math.max(0,px-34):0);return oe("div",{className:"ri-viewer",ref:hr.rootRef,style:{background:mv},children:[e.status!=="ready"&&B("div",{className:"ri-contextRecovery",role:"alert",children:oe("div",{className:"ri-contextRecovery__card",children:[B(Ba,{size:24,"aria-hidden":"true"}),B("h2",{children:e.status==="rebuilding"?"Reloading viewer\u2026":"3D view interrupted"}),B("p",{children:e.status==="rebuilding"?"Rebuilding the 3D view. Please wait\u2026":"The graphics connection was interrupted. The viewer will rebuild when it returns, or you can reload it now."}),oe("button",{type:"button",onClick:e.reload,disabled:e.status==="rebuilding",children:[B(Zy,{size:16,"aria-hidden":"true"}),"Reload viewer"]})]})}),oe("div",{className:"ri-viewerLeft",ref:sp,inert:e.status!=="ready",children:[Ne?Ne({isOpen:Jp,selectedObject:Io,currentAction:cp,onClose:eh,onAction:ts}):B(Bd,{isOpen:Jp,selectedObject:Io,currentAction:cp,onClose:eh,onAction:ts,renderActionExtra:u=>{if(u==="change-color"&&mr)return B(kd,{inline:!0,colorPicker:mr,onClose:qt,itemMaterials:fi,setItemMaterials:Ua});if((u==="change-light-color"||u==="set-brightness")&&Xl?.kind===u&&Xl.objectId===Bo){let b=Xl,_=b.target,L=_.type==="lights"?Re.lighting.lights.find(D=>D.id===_.lightIds[0])?.color??"#ffffff":gc(Si(_.objectKey).color);return B(of,{kind:b.kind,color:L,brightness:b.percent,onColorChange:D=>{if(_.type==="lights"){Na(Object.fromEntries(_.lightIds.map(Q=>[Q,{color:D}])));return}let q=Si(_.objectKey);zo(_.objectKey,{emissive:D,emissiveIntensity:q.intensity>0?q.intensity:es.current[_.objectKey]??1})},onBrightnessChange:D=>{if($l({...b,percent:D}),_.type==="lights"){Na(Object.fromEntries(_.lightIds.map(q=>[q,{intensity:(_.baseIntensity[q]??0)*(D/100)}])));return}zo(_.objectKey,{emissive:gc(Si(_.objectKey).color),emissiveIntensity:_.baseIntensity*(D/100)})},onClose:()=>$l(null)})}if((u==="add-text"||u==="add-image")&&ql?.kind===u&&ql.objectId===Bo){let b=ql,_=br(b.objectId);if(!_)return null;let L=u==="add-image";return B(df,{kind:u,decals:(he[_]?.decals??[]).filter(D=>!!D.image===L),activeId:b.activeId,error:pv,moving:bo?.objectKey===_&&bo.decalId===b.activeId,defaultSize:rs(_),onSelect:D=>{cn.current++,Vr(null),pr(null),go({...b,activeId:D})},onAddText:(D,q)=>xc(_,{id:ah(),text:D,color:q,size:rs(_)}),onAddImage:D=>{Ex(b.objectId,_,D)},onChange:(D,q)=>jn(_,Q=>Q.map(me=>me.id===D?{...me,...q}:me)),onNudge:(D,q)=>{let Q=Et.current[_],me=Q?.decals?.find(ve=>ve.id===D);if(!me)return;let we=Dt.current[Q.modelObjectId??_],te=_m(we,Pe.current?.camera,me,q);if(!te){Vr("No visible surface in that direction. Try another arrow or rotate the view.");return}Vr(null),pr(null),jn(_,ve=>ve.map(xe=>xe.id===D?{...xe,...te}:xe))},onMove:D=>{cn.current++,he[_]?.decals?.find(Q=>Q.id===D)&&(Vr(null),pr(Q=>Q?.objectKey===_&&Q.decalId===D?null:{objectKey:_,decalId:D}))},onRemove:D=>{pr(null),jn(_,q=>q.filter(Q=>Q.id!==D)),go({...b,activeId:null})},onClose:()=>{cn.current++,Vr(null),pr(null),go(null)}})}return u==="change-material"&&wi?B(Dd,{inline:!0,triggerFileUpload:rh,materialPopup:wi,textureUrl:wh,clearTexture:nh,offset:Mh,rotationDegrees:Sh,onOffsetChange:Th,onRotationChange:_h,isPositioning:Ch,onEndPositioning:Ph}):null}}),oe("div",{className:`ri-canvasArea ${xi?"ri-canvasArea--measuring":""} ${gi?"":"ri-canvasArea--positioning"} ${I?"ri-canvasArea--moveMode":""}`,ref:wv,tabIndex:U?0:void 0,onDoubleClick:Fx,onPointerDown:u=>{if(U&&Er.current?.focus({preventScroll:!0}),ye){Vx(u);return}ux(u)},onClick:ye?void 0:dx,onPointerMove:ox,onPointerLeave:Gp,onWheel:Gp,children:[wo&&!n&&(ye||xx)&&B("div",{className:"ri-moveZoomHint",role:"status",style:{position:"absolute",top:12,left:"50%",transform:"translateX(-50%)",zIndex:5,padding:"6px 12px",borderRadius:999,fontSize:12,fontWeight:500,color:"#fff",background:ye?"rgba(37, 99, 235, 0.92)":"rgba(0, 0, 0, 0.6)",pointerEvents:"none",whiteSpace:"nowrap"},children:ye?"Drag to move \xB7 Scroll to zoom \xB7 Click elsewhere to finish":"Double-click to move or zoom"}),yp&&!wp&&oe("div",{className:"ri-bindingsMismatchBanner",children:[B(Ba,{size:14,className:"ri-bindingsMismatchBanner__icon"}),B("span",{children:vp===1?"1 object binding doesn't match this model":`${vp} object bindings don't match this model`}),B("button",{type:"button",className:"ri-bindingsMismatchBanner__dismiss",onClick:u=>{u.stopPropagation(),Mp(!0)},"aria-label":"Dismiss",children:B($d,{size:12})})]}),Sp!==null&&!Lv&&oe("div",{className:`ri-largeModelBanner ${yp&&!wp?"ri-largeModelBanner--offset":""}`,children:[B(Ba,{size:14,className:"ri-largeModelBanner__icon"}),oe("span",{children:["Very large model (",Math.round(Sp/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."]}),B("button",{type:"button",className:"ri-largeModelBanner__dismiss",onClick:u=>{u.stopPropagation(),Cp(!0)},"aria-label":"Dismiss",children:B($d,{size:12})})]}),Ln.model.renderer==="uv-checker"&&Po.missing>0&&oe("div",{className:"ri-uvCheckerBanner",role:"status",children:[B(Ba,{size:14,className:"ri-uvCheckerBanner__icon"}),oe("span",{children:[Po.missing===Po.total?"UV Checker: this model has no UV0 coordinates.":`UV Checker: ${Po.missing} of ${Po.total} meshes have no UV0 coordinates.`," ","Missing UVs are shown in magenta."]})]}),B("input",{ref:ip,type:"file",accept:"image/png,image/jpeg,image/webp",className:"ri-hiddenInput",onChange:Sx}),B(Hi,{onError:e.fail,children:oe(wu,{onRendererCreated:e.onRendererCreated,suspended:e.status!=="ready",camera:G,backgroundColor:Ce,shadows:Z&&Re.shadows.enabled,sceneConfig:Ln,selectedObjectRef:fc,hoveredObjectRef:wx,highlightOnHover:St,renderMode:ft,maxDpr:Ve,reduceGpuLoad:fv,xrStore:Nn,rendererCaptureRef:er,preserveDrawingBuffer:pt,children:[B(Cu,{lightingConfig:Re.lighting,shadowConfig:Re.shadows,shadowsEnabled:Z,environmentRotation:Re.environment.rotation,environmentConfig:Re.environment,modelBounds:ax,objectBindings:he,nodeRefs:Dt}),Vt&&Re.lighting.lights.map(u=>!u.visible||u.type==="none"||u.type==="hemisphere"||u.attachment?null:B(qy,{light:u,position:u.position,rotation:u.rotation,color:u.color,intensity:u.intensity,visible:u.visible,onPositionChange:b=>yh(u.id,b,u.rotation),onRotationChange:b=>yh(u.id,u.position,b),onDraggingChange:tp},u.id)),B(Td,{setAside:Vn.setAside,nodeRefs:Dt}),B(Rd,{section:Re.section??Uo,box:dc,modelRef:Tt,showHandle:Se,onPositionChange:u=>fo({position:u}),onDraggingChange:uv}),B(Mu,{controlsRef:Pe,onCameraChange:Ix,cameraLimits:K,controllerType:un,onPointerLockExit:()=>vo("orbit")}),B(EP,{enabled:ot||xi||_i||un==="pointerLock"?!1:se??Re.model.autoRotate??!1,speed:tt??Re.model.autoRotateSpeed??1,controlsRef:Pe}),W&&!ot&&B(tP,{alignment:"top-right",margin:[80,80],renderPriority:2,onUpdate:()=>{Pe.current?.update(0),er.current?.invalidate()},children:B(rP,{axisColors:["#ff3653","#8adb00","#2c8fff"],labelColor:"white"})}),I&&fc&&Lt&&B(Xd,{node:fc,space:j,onTransformChange:Mx,onDraggingChange:u=>{tp(u),Oo&&v?.(Oo,u)}},Lt),_i&&B(Mf,{target:_i,nodes:Dt,controls:Pe}),B(Ts,{onLoadError:bh,children:B(Qy,{fallback:null,children:(()=>{let u=oe(ho,{children:[n?B(fd,{url:n,rotation:Ln.model.rotation,errorTarget:i,cacheSize:o,decoderConfig:Zd,objectBindings:Vn.bindings,itemMaterials:fi,sceneConfig:Ln,selectedItem:Lt,panelHoveredItem:m??Jl,highlightOnHover:St,onItemClick:uh,onItemHover:dh,onItemDoubleClick:ph,onItemContextMenu:hh,onObjectCatalog:kx,onTilesetBounds:Dx,onModelLoaded:gh,onLoadError:bh,nodeRefsOut:Dt,onNodeRefsChange:ap,materialRefsOut:Va,explodeFactor:Wa,suspendBindingTransforms:ja}):B(_u,{url:r,modelFormat:s,objectBindings:Vn.bindings,selectedItem:Lt,itemMaterials:fi,onItemClick:uh,onItemDoubleClick:ph,onItemContextMenu:hh,onItemHover:dh,onModelLoaded:gh,onAnimationsReady:F,nodeRefsOut:Dt,onNodeRefsChange:ap,materialRefsOut:Va,panelHoveredItem:m??Jl,sceneConfig:Ln,zoomOnSelected:ur,highlightOnHover:St,decoderConfig:Zd,onLoadProgress:Lx,explodeFactor:Wa,suspendBindingTransforms:ja,pulses:Vn.pulses}),B(xd,{annotations:Ar,sceneConfig:Re,activeAnnotation:Do,popupRef:Kl,canvasRootRef:Er,worldPositionsRef:np,modelLoaded:fr,onAnnotationClick:Ux,onCloseAnnotation:Ro,hideCloseButton:Ao,showAnnotationOnHover:Pr}),B(TP,{annotation:Qa,enabled:Ao&&!ot,controlsRef:Pe,offsetRef:Yl}),ot?B(Rs,{controlsRef:Pe,sceneRef:Tt,config:ot.config,playing:!0,resetOnPlay:!0,playOnce:!0,startAtPath:!0,onStarted:ot.onStarted,onFinished:ot.onFinished,onProgress:jv},"video-export"):In&&B(Rs,{controlsRef:Pe,sceneRef:Tt,config:In,playing:Bn&&!xi,resetOnPlay:Bv,onFinished:()=>{Xt(!1),zn(!1)},onUserInteract:()=>{Xt(!1)}},"cinematic-preview"),De&&B(Md,{points:Vp,unit:kt,box:dc,showDimensions:Hp,tool:Fp,areaClosed:Up,snapPreview:xi?ix:null})]});return Nn?B(xy,{ref:Vv,box:dc,scaleMode:Dn,onARStateChange:Hv,children:u}):u})()})},n??r),ee&&B(Qy,{fallback:null,children:ee})]})}),$&&B("div",{className:"ri-overlay",children:$}),Ie&&r&&bp&&(()=>{let u=ef(Rv,n||r,n?void 0:s);return B("div",{className:"ri-loadError",role:"alert",children:oe("div",{className:"ri-loadError__card",children:[oe("div",{className:"ri-loadError__header",children:[B(Ba,{size:16,"aria-hidden":"true"}),B("span",{className:"ri-loadError__title",children:u.title})]}),B("p",{className:"ri-loadError__detail",children:u.detail}),B("p",{className:"ri-loadError__source",children:n||r}),u.technical&&B("p",{className:"ri-loadError__technical",children:u.technical})]})})})(),B(Zh,{visible:Yx,message:Ov,progress:Iv??void 0}),Ai&&oe("div",{className:"ri-xrTools",style:{top:`${Ri(0)}px`},children:[!cc&&kp&&oe("button",{type:"button",className:"ri-xrButton",onClick:Gv,title:"View this model in AR with Apple Quick Look",children:[B(Jy,{size:16}),"View in AR"]}),Xa&&oe("button",{type:"button",className:"ri-xrButton",onClick:Uv,title:"Open this experience on a phone for AR","aria-haspopup":"dialog","aria-expanded":Dp,children:[B(fP,{size:16}),B("span",{children:"Open on phone"})]}),Nn&&cc&&oe("button",{type:"button",className:"ri-xrButton",onClick:()=>Nn.enterAR().catch(u=>{console.error("Failed to enter AR session:",u)}),title:"View this model in your space",children:[B(tv,{size:16}),B("span",{className:"ri-xrButtonPrefix",children:"Enter"}),B("span",{children:"AR"})]}),Nn&&Rp&&oe("button",{type:"button",className:"ri-xrButton",onClick:()=>Nn.enterVR().catch(u=>{console.error("Failed to enter VR session:",u)}),title:"View this model in VR",children:[B(mP,{size:16}),B("span",{className:"ri-xrButtonPrefix",children:"Enter"}),B("span",{children:"VR"})]})]}),Fv,Dp&&Xa&&B("div",{className:"ri-mobileHandoffBackdrop",onMouseDown:u=>{u.target===u.currentTarget&&Lp()},children:oe("section",{className:"ri-mobileHandoffDialog",role:"dialog","aria-modal":"true","aria-labelledby":"ri-mobileHandoffTitle",children:[B("button",{type:"button",className:"ri-mobileHandoffClose",onClick:Lp,"aria-label":"Close phone handoff",children:B($d,{size:18})}),B(tv,{size:22,"aria-hidden":"true"}),B("h2",{id:"ri-mobileHandoffTitle",children:"View in AR"}),B("p",{children:"Scan the code and choose AR."}),B("div",{className:"ri-mobileHandoffQr",children:B(nP,{value:Xa,size:208,level:"M",marginSize:4,title:"QR code to open this model on a phone"})})]})}),Me&&B("div",{className:"ri-uvCheckerTools",style:{top:`${Ri(Ai?1:0)}px`},children:B("button",{type:"button",className:`ri-measureButton ${hi?"ri-measureButton--active":""}`,onClick:()=>Jd(u=>!(u??yo)),title:hi?"Disable UV checker":"Enable UV checker","aria-label":hi?"Disable UV checker":"Enable UV checker","aria-pressed":hi,children:B(xP,{size:16})})}),De&&B(Sd,{top:Ri(Eh),active:xi,disabled:!!ot,tool:Fp,snap:rx,pointCount:Vp.length,areaClosed:Up,error:Jv,showDimensions:Hp,onToggle:()=>{Xt(!1),lx()},onTool:Zv,onSnap:nx,onUndo:ex,onClear:sx,onFinishArea:tx,onDimensions:cx,onHeight:hx}),Be&&oe("div",{className:"ri-explodeTools",style:{top:`${Ri((Ai?1:0)+(Me?1:0)+(De?1:0))}px`},children:[B("button",{type:"button",className:`ri-measureButton ${oc||Wa>0?"ri-measureButton--active":""}`,onClick:()=>Ep(u=>!u),title:"Exploded view","aria-pressed":oc,children:B(gP,{size:16})}),oc&&B("div",{className:"ri-explodeSlider",onPointerDown:u=>u.stopPropagation(),children:B("input",{type:"range",min:0,max:100,value:Math.round(Wa*100),onChange:u=>Pp(Number(u.target.value)/100),"aria-label":"Explode amount"})})]}),Se&&oe("div",{className:"ri-sectionTools",style:{top:`${Ri((Ai?1:0)+(Me?1:0)+(De?1:0)+(Be?1:0))}px`},children:[B("button",{type:"button",className:`ri-measureButton ${gr.enabled?"ri-measureButton--active":""}`,onClick:()=>fo({enabled:!gr.enabled}),title:gr.enabled?"Remove section cut":"Section cut","aria-label":"Section cut","aria-pressed":gr.enabled,children:B(yP,{size:16})}),gr.enabled&&oe("div",{className:"ri-sectionPanel",onPointerDown:u=>u.stopPropagation(),children:[B("div",{className:"ri-sectionAxes",role:"group","aria-label":"Section axis",children:Vh.map(u=>B("button",{type:"button",className:`ri-sectionAxis ${gr.axis===u?"ri-sectionAxis--active":""}`,"aria-pressed":gr.axis===u,onClick:()=>fo({axis:u}),children:u.toUpperCase()},u))}),B("input",{type:"range",min:0,max:100,value:Math.round(gr.position*100),onChange:u=>fo({position:Number(u.target.value)/100}),"aria-label":"Section position"}),B("button",{type:"button",className:`ri-sectionAxis ${gr.flip?"ri-sectionAxis--active":""}`,"aria-pressed":gr.flip,"aria-label":"Keep the other side",title:"Keep the other side",onClick:()=>fo({flip:!gr.flip}),children:B(bP,{size:14})})]})]}),In&&oe("div",{className:"ri-cinematicTools",style:{top:`${Ri((Ai?1:0)+(Me?1:0)+(De?1:0)+(Be?1:0)+(Se?1:0))}px`},children:[B("button",{type:"button",className:`ri-measureButton ${Bn?"ri-measureButton--active":""}`,disabled:!!ot||xi,onClick:()=>{Bn?Xt(!1):(zn(!1),Xt(!0))},title:Bn?"Pause cinematic":"Play cinematic","aria-pressed":Bn,children:Bn?B(vP,{size:16}):B(qd,{size:16})}),Bn&&B("button",{type:"button",className:"ri-measureButton ri-measureButton--stop",onClick:Ox,title:"Stop cinematic and reset camera",children:B(ev,{size:16})})]}),ot&&B("div",{className:"ri-recordingOverlay",onPointerDown:u=>u.stopPropagation(),children:oe("div",{className:"ri-isolationPill",role:"status","aria-live":"polite",children:[oe("span",{className:"ri-isolationPill__label",children:["Recording video \xB7 ",Nv,"%"]}),B("button",{type:"button",className:"ri-isolationPill__button",onClick:lc,children:"Cancel"})]})}),(zp||_i||Jt&&Gr)&&oe("div",{className:`ri-bottomStack ${Np?"ri-bottomStack--aboveButtons":""}`,children:[_i&&oe("div",{className:"ri-isolationPill",role:"status",onPointerDown:u=>u.stopPropagation(),children:[B("span",{className:"ri-isolationPill__label",children:"Drag the decal on the object. Release to save; Escape to cancel."}),B("button",{type:"button",className:"ri-isolationPill__button",onClick:_i.onCancel,children:"Cancel"})]}),Jt&&Gr&&oe("div",{className:"ri-isolationPill",onPointerDown:u=>u.stopPropagation(),children:[B("span",{className:"ri-isolationPill__label",children:Gr.size===1?`Isolated: ${(()=>{let[u]=Gr;return he[u]?.label??u})()}`:`Isolated: ${Gr.size} objects`}),B("button",{type:"button",className:"ri-isolationPill__button",onClick:()=>wc(null),children:"Show all"})]}),zp&&B("div",{className:"ri-variantPicker",role:"group","aria-label":"Material variants",onPointerDown:u=>u.stopPropagation(),children:fp.map(u=>{let b=Re.model.materialVariant===u;return B("button",{type:"button",className:`ri-variantPicker__option ${b?"ri-variantPicker__option--active":""}`,"aria-pressed":b,onClick:()=>dv(u),children:u},u)})})]}),Np&&oe("div",{className:"ri-buttonContainer",children:[B("div",{className:"ri-tourControls",children:gt&&Ze.length>0&&B(ho,{children:Ao?oe(ho,{children:[oe("button",{className:"ri-tourButton",onClick:$v,disabled:Bp||Ze.length===0||tr<=0,title:"Previous annotation",children:[B(pP,{size:16}),B("span",{children:"Prev"})]}),B("button",{className:"ri-tourButton ri-tourButton--stop",onClick:Yv,title:"Stop guided tour",children:B(ev,{size:16})}),oe("button",{className:"ri-tourButton ri-tourButton--next",onClick:qv,disabled:Bp||Ze.length===0,title:"Next annotation",children:[B("span",{children:"Next"}),B(hP,{size:16})]})]}):B("button",{className:"ri-navButtonSingle",onClick:Xv,disabled:Ze.length===0,title:"Start guided tour",children:"Guided Tour"})})}),oe("div",{className:"mv-rightControls",children:[fe&&hr.supported&&oe("div",{className:"mv-fullscreenWrapper",children:[hr.error&&B("div",{className:"mv-fullscreenError",role:"alert",children:hr.error}),B("button",{type:"button",className:"mv-fullscreenButton",onClick:()=>{hr.toggle()},disabled:hr.pending||!!ot,title:hr.active?"Exit fullscreen":"Enter fullscreen","aria-label":hr.active?"Exit fullscreen":"Enter fullscreen","aria-pressed":hr.active,children:hr.active?B(dP,{}):B(uP,{})})]}),dt&&B("button",{className:"mv-resetButton",onClick:Mc,disabled:!!ot,title:"Reset camera view",children:B(Zy,{})}),oe("div",{className:"mv-controllersWrapper",onPointerDown:u=>u.stopPropagation(),children:[yv&&oe("div",{className:"mv-controllersMenu",children:[B("button",{type:"button",className:`mv-controllersMenuItem ${un==="orbit"?"mv-controllersMenuItem--active":""}`,onClick:()=>vo("orbit"),children:"Orbit Control"}),B("button",{type:"button",className:`mv-controllersMenuItem ${un==="pointerLock"?"mv-controllersMenuItem--active":""}`,onClick:()=>vo("pointerLock"),children:"Point Lock"})]}),B("button",{className:"mv-controllersButton",onClick:()=>ep(u=>!u),title:"Camera controller","aria-label":"Camera controller settings",disabled:!!ot,children:B(wP,{size:15})})]}),Ee&&oe("div",{className:"mv-downloadWrapper",onPointerDown:u=>u.stopPropagation(),children:[mx&&oe("div",{className:"mv-downloadMenu",children:[oe("button",{className:"mv-downloadMenuItem",onClick:gx,disabled:pc||!!ot||!Tt.current,children:[B(Jy,{size:14}),"Download GLB"]}),B("div",{className:"mv-downloadMenuDivider"}),pt&&oe(ho,{children:[oe("button",{className:"mv-downloadMenuItem",onClick:bx,disabled:!!ot||!Tt.current,children:[B(sP,{size:14}),"Download PNG"]}),B("div",{className:"mv-downloadMenuDivider"})]}),oe("button",{className:"mv-downloadMenuItem",onClick:yx,disabled:!!ot||!Tt.current,children:[B(cP,{size:14}),"Download UV Layout"]}),B("div",{className:"mv-downloadMenuDivider"}),oe("label",{className:"mv-downloadMenuItem",children:["Video format",oe("select",{"aria-label":"Video format",value:hc,onChange:u=>vx(u.target.value),children:[B("option",{value:"auto",children:"Auto"}),B("option",{value:"webm",disabled:!$n("webm"),children:"WebM"}),B("option",{value:"mp4",disabled:!$n("mp4"),children:"MP4"})]})]}),oe("button",{className:"mv-downloadMenuItem",onClick:()=>{$p("turntable")},disabled:!!ot||!fr||!gi||So||!$n(hc),children:[B(qd,{size:14}),"Record turntable video"]}),In&&oe("button",{className:"mv-downloadMenuItem",onClick:()=>{$p("cinematic")},disabled:!!ot||!fr||!gi||So||!$n(hc),children:[B(qd,{size:14}),"Record cinematic video"]}),!$n()&&B("div",{className:"mv-downloadMenuNotice",role:"status",children:"Video recording is not supported in this browser."}),qp&&B("div",{className:"mv-downloadMenuNotice",role:"alert",children:qp}),Xp&&B("div",{className:"mv-downloadMenuNotice",role:"status","aria-live":"polite",children:Xp})]}),B("button",{className:"mv-downloadButton",onClick:fx,disabled:pc||!!ot||!Tt.current,title:"Download options",children:pc?oe(ho,{children:[B("span",{className:"mv-downloadButton__spinner"}),"Exporting\u2026"]}):oe(ho,{children:[B(lP,{size:15}),"Download"]})})]})]})]}),Ft&&oe("div",{className:"ri-annotationPopup",style:{left:$x,top:qx},onPointerDown:u=>u.stopPropagation(),onClick:u=>u.stopPropagation(),children:[B("input",{autoFocus:!0,className:"ri-annotationInput",placeholder:"Title *",value:hn.title,onChange:u=>qa(b=>({...b,title:u.target.value})),onKeyDown:u=>{u.key==="Enter"&&xh(),u.key==="Escape"&&_c()}}),B("textarea",{className:"ri-annotationTextarea",placeholder:"Description",value:hn.description,onChange:u=>qa(b=>({...b,description:u.target.value})),onKeyDown:u=>{u.key==="Escape"&&_c()},rows:5}),oe("div",{className:"ri-annotationActions",children:[B("button",{onClick:xh,className:`ri-annotationOkBtn ${hn.title.trim()?"":"disabled"}`,disabled:!hn.title.trim(),children:"OK"}),B("button",{onClick:_c,className:"ri-annotationCancelBtn",children:"Cancel"}),B("div",{className:"ri-annotationIcons"})]})]})]}),Ne&&mr&&B(kd,{colorPicker:mr,onClose:qt,itemMaterials:fi,setItemMaterials:Ua}),Ne&&wi&&B(Dd,{triggerFileUpload:rh,materialPopup:wi,textureUrl:wh,clearTexture:nh,offset:Mh,rotationDegrees:Sh,onOffsetChange:Th,onRotationChange:_h,isPositioning:Ch,onEndPositioning:Ph})]}),Ue&&B("div",{className:"ri-viewerRight",inert:e.status!=="ready",children:pe?pe({objectBindings:he,onAction:ts,onFocus:mh,onHover:up}):B(zd,{objectBindings:he,onAction:ts,onFocus:mh,onHover:up,isolatedKeys:Gr,onIsolate:Jt?Rx:void 0})}),Xe&&B(wy,{controlsRef:Pe,enabled:e.status==="ready",opacity:J,moveSensitivity:cr,position:Qt})]})}export{hs as a,Jx as b,lf as c,n2 as d,gm as e,i2 as f,o2 as g,Cm as h,_m as i,Jo as j,Cf as k,Bm as l,WP as m,X0 as n,Cs as o,Gd as p,Y_ as q,Xy as r,jm as s,A2 as t,kP as u,qP as v};