@liveroom-tech/react-immersive 4.2.7 → 4.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-CPHWRR2L.mjs → chunk-WVKZCAVE.mjs} +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.mts +22 -3
- package/dist/index.d.ts +22 -3
- package/dist/index.js +8 -8
- package/dist/index.mjs +7 -7
- package/dist/{utils-BUwXD_DX.d.mts → utils-BkdZxLFF.d.mts} +3 -0
- package/dist/{utils-BUwXD_DX.d.ts → utils-BkdZxLFF.d.ts} +3 -0
- package/dist/utils.d.mts +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +1 -1
- package/dist/utils.mjs +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
"use client";import{a as
|
|
1
|
+
"use client";import{a as ml,b as cm,c as dm,d as um,e as pm,f as hm,g as qa,h as Vi,i as vn,j as Cd,k as Sd,l as Fi,m as Md,n as zo,o as Td,p as gv,q as Pd}from"./chunk-WVKZCAVE.mjs";import{a as wd}from"./chunk-JR557W27.mjs";import{useRef as at,useState as Be,useEffect as Ct,useCallback as _e,useMemo as An,Suspense as J2}from"react";import{Box3 as fv,BufferAttribute as bv,Mesh as xv}from"three";import{acceleratedRaycast as yv,computeBoundsTree as vv,disposeBoundsTree as wv,MeshBVH as Cv}from"three-mesh-bvh";var mm=!1,jo=new WeakMap,Ya=new WeakMap;function Sv(){mm||(xv.prototype.raycast=yv,mm=!0)}function Mv(e){let t=new Set;return e.traverse(n=>{let i=n.geometry;!i||!i.attributes?.position||t.add(i)}),[...t]}function gm(e){let t=0;for(let n of e){let i=n.index?n.index.count:n.attributes.position.count;t+=i/3}return t}var Ui=12e6;function gl(e){return Ka(e)>Ui}function Ka(e){let t=new Set;return e.traverse(n=>{let i=n.geometry;i?.attributes?.position&&t.add(i)}),gm([...t])}function Tv(e,t){return new Promise((n,i)=>{let r=l=>{let u=l.data;if(!u||!u.error&&!u.serialized)return;if(e.removeEventListener("message",r),e.removeEventListener("error",o),u.error){i(new Error(String(u.error)));return}let{serialized:d}=u,h=Cv.deserialize(d,t,{setIndex:!1});d.index&&(t.index?t.index.array=d.index:t.setIndex(new bv(d.index,1,!1))),t.boundingBox=h.getBoundingBox(new fv),n(h)},o=l=>{e.removeEventListener("message",r),e.removeEventListener("error",o),i(new Error(l.message||"BVH worker error"))};e.addEventListener("message",r),e.addEventListener("error",o);let a=t.index?t.index.array.slice():null,s=t.attributes.position.array.slice(),c=[s,...a?[a]:[]].map(l=>l.buffer);e.postMessage({index:a,position:s,options:{groups:[...t.groups]}},c)})}async function Pv(){if(typeof window>"u"||typeof Worker>"u")return null;try{let{bvhWorkerCode:e}=await import("./bvhWorkerCode-6366A3UC.mjs"),t=new Blob([e],{type:"text/javascript"}),n=URL.createObjectURL(t),i=new Worker(n);return{worker:i,dispose:()=>{i.terminate(),URL.revokeObjectURL(n)}}}catch{return null}}async function kv(e,t){if(t)try{return await Tv(t,e)}catch{}let n=vv.call(e);return e.boundsTree=void 0,await new Promise(i=>setTimeout(i,0)),n}async function _v(e,t,n){if(e.boundsTree)return;if(t.buildPromise)return t.buildPromise;let i=(async()=>{let r=await n();t.references>0&&!e.boundsTree&&(e.boundsTree=r,t.ownedTree=r)})();return t.buildPromise=i.finally(()=>{t.buildPromise=void 0,t.references===0&&jo.delete(e)}),t.buildPromise}async function Vo(e,t){if(t?.aborted)return;let n=Ya.get(e);if(!n){if(n=Mv(e),gm(n)>Ui){Ya.set(e,[]);return}Ya.set(e,n);for(let r of n){let o=jo.get(r)??{references:0};o.references+=1,jo.set(r,o)}}if(n.length===0)return;Sv();let i=await Pv();if(t?.aborted){i?.dispose();return}try{for(let r of n){if(t?.aborted)return;let o=jo.get(r);o&&await _v(r,o,()=>kv(r,i?.worker))}}finally{i?.dispose()}}function Gi(e){let t=Ya.get(e);if(t){Ya.delete(e);for(let n of t){let i=jo.get(n);i&&(i.references=Math.max(0,i.references-1),!(i.references>0)&&(i.ownedTree&&n.boundsTree===i.ownedTree&&(wv.call(n),n.boundsTree=void 0),i.ownedTree=void 0,i.buildPromise||jo.delete(n)))}}}import{GizmoHelper as Q2,GizmoViewport as Z2}from"@react-three/drei";import{useFrame as Tx,useThree as Px}from"@react-three/fiber";import{QRCodeSVG as eP}from"qrcode.react";import{Box3 as ga,PerspectiveCamera as kx,Raycaster as tP,Sphere as nP,Vector2 as rP,Vector3 as In}from"three";import{AlertTriangle as Av}from"lucide-react";import{jsx as fl,jsxs as fm}from"react/jsx-runtime";function Hi({title:e,message:t,tone:n="default"}){return fm("div",{className:`ri-license-overlay${n==="error"?" ri-license-overlay--error":""}`,children:[fm("div",{className:"ri-license-overlay__header",children:[n==="error"?fl(Av,{size:16,className:"ri-license-overlay__icon","aria-hidden":"true"}):fl("span",{className:"ri-license-overlay__statusDot","aria-hidden":"true"}),fl("span",{className:"ri-license-overlay__title",children:e})]}),fl("p",{className:"ri-license-overlay__message",children:t})]})}import{Component as Ev}from"react";var bl=class extends Ev{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n,i){this.props.onLoadError?.(n)}render(){return this.state.hasError?null:this.props.children}};import{PerspectiveCamera as kd,Vector2 as Rv}from"three";var bm="riEditorGizmo";function xm(e){return e.userData[bm]=!0,e}function ym(e){let t=[];return e.traverse(n=>{n.visible&&n.userData[bm]&&(n.visible=!1,t.push(n))}),()=>{for(let n of t)n.visible=!0}}function xl(e,t={}){if(!e)return Promise.reject(new Error("Viewer not ready"));let{gl:n,scene:i,camera:r,invalidate:o}=e;if(!n.getContextAttributes().preserveDrawingBuffer)return Promise.reject(new Error("Screenshot capture is disabled. Set preserveDrawingBuffer on ModelViewer to enable it."));let{transparent:a=!1}=t,s=n.getSize(new Rv),c=n.getPixelRatio(),l=r instanceof kd?r.aspect:null,u=i.background,d=t.width??s.x,h=t.height??s.y,g=d!==s.x||h!==s.y,f=ym(i);return a&&(i.background=null),g&&(n.setPixelRatio(1),n.setSize(d,h,!1),r instanceof kd&&(r.aspect=d/h,r.updateProjectionMatrix())),o(),new Promise((y,k)=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{let v,p;try{v=n.domElement.toDataURL("image/png")}catch(m){p=m}f(),a&&(i.background=u),g&&(n.setPixelRatio(c),n.setSize(s.x,s.y,!1),r instanceof kd&&l!==null&&(r.aspect=l,r.updateProjectionMatrix())),o(),p?k(p):y(v)})})})}import{useCallback as wl,useEffect as Uv,useState as Rd}from"react";import{GLTFExporter as Lv}from"three-stdlib";function Xr(e,t){let n=URL.createObjectURL(e),i=document.createElement("a");i.href=n,i.download=t,i.style.display="none";try{document.body.appendChild(i),i.click()}finally{i.remove(),window.setTimeout(()=>{URL.revokeObjectURL(n)},1e3)}}function vm({scene:e,objectBindings:t,matRefs:n,downloadFilename:i,onComplete:r}){import("three").then(({Group:o,Mesh:a})=>{let s=new o,c=new Map;for(let[d,h]of Object.entries(t))c.set(h.modelObjectId??d,d);let l=d=>{let h=d;for(;h;){let g=h.name||h.uuid,f=c.get(g)??g,y=t[f];if(y?y.visible===!1:h.visible===!1)return!1;h=h.parent}return!0};e.traverse(d=>{let h=d;if(!h.isMesh||!h.geometry||!l(h))return;let g=h.name||h.uuid,f=c.get(g)??g,y=n[f]??h.material;if(!y)return;let k=new a(h.geometry,y);k.name=g,k.applyMatrix4(h.matrixWorld),s.add(k)}),new Lv().parse(s,d=>{let h=d instanceof ArrayBuffer?new Blob([d],{type:"model/gltf-binary"}):new Blob([JSON.stringify(d)],{type:"model/gltf+json"}),g=d instanceof ArrayBuffer?".glb":".gltf";Xr(h,`${i}${g}`),r()},d=>{console.error("GLTFExporter error:",d),r()},{binary:!0})})}import{strToU8 as Ov}from"fflate";import{zip as Bv}from"fflate";function yl(e,t=6){return new Promise((n,i)=>{Bv(e,{level:t},(r,o)=>{r?i(r):n(o)})})}var Ja=2048,wm=["#00e5ff","#ff4fd8","#ffe45e","#7cff6b","#ff784f","#a78bfa","#38bdf8","#fb7185"];function Cm(e){return e.split("&").join("&").split("<").join("<").split(">").join(">").split('"').join(""").split("'").join("'")}function Ed(e,t){return e.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||t}function Mm(e){return Ed(e,"model")}function _d(e,t){return e.index?Math.round(e.index.getX(t)):t}function Dv(e,t,n){let i=_d(e,n),r=_d(e,n+1),o=_d(e,n+2);if(i>=t.count||r>=t.count||o>=t.count)return null;let a=[{index:i,u:t.getX(i),v:t.getY(i)},{index:r,u:t.getX(r),v:t.getY(r)},{index:o,u:t.getX(o),v:t.getY(o)}];return a.every(s=>Number.isFinite(s.u)&&Number.isFinite(s.v))?a:null}function Sm(e){return`${e.u.toFixed(6)},${e.v.toFixed(6)}`}function Ad(e,t,n,i){let r,o;i?(r=t.index,o=n.index):(r=Sm(t),o=Sm(n));let a=r<o?`${r}|${o}`:`${o}|${r}`,s=e.get(a);s?s.count+=1:e.set(a,{count:1,start:t,end:n})}function Nv(e,t,n){Ad(e,t[0],t[1],n),Ad(e,t[1],t[2],n),Ad(e,t[2],t[0],n)}function Iv(e,t){return Array.isArray(e)?e[t]??null:e}function zv(e){let t=new Map,n=0,i=0,r=0;return e.traverse(o=>{let a=o;if(!a.isMesh||!a.geometry||!a.material)return;let s=a.geometry,c=s.getAttribute("uv");if(!c||c.itemSize<2||c.count<3)return;n+=1;let l=a.name||`Mesh ${n}`,u=s.index?.count??c.count,d=s.groups.length>0?s.groups:[{start:0,count:u,materialIndex:0}];for(let h of d){let g=h.materialIndex??0,f=Iv(a.material,g);if(!f)continue;let y=t.get(f.uuid);y||(i+=1,y={name:f.name||`Material ${i}`,layers:new Map},t.set(f.uuid,y));let k=y.layers.get(a.uuid);k||(k={name:l,color:wm[r%wm.length],edges:new Map},r+=1,y.layers.set(a.uuid,k));let v=Math.max(0,h.start),p=Math.min(u,v+h.count);for(let m=v;m+2<p;m+=3){let M=Dv(s,c,m);M&&Nv(k.edges,M,!!s.index)}}}),[...t.values()].filter(o=>[...o.layers.values()].some(a=>a.edges.size>0))}function vl(e){return(e*Ja).toFixed(2)}function jv(e){return`M${vl(e.start.u)} ${vl(1-e.start.v)}L${vl(e.end.u)} ${vl(1-e.end.v)}`}function Vv(e){let t=Cm(e.name),n=[...e.layers.values()].filter(i=>i.edges.size>0).map((i,r)=>{let o=Cm(i.name),a=`${Ed(i.name,"mesh")}-${r+1}`,s=[...i.edges.values()],c=s.filter(d=>d.count===1),u=(c.length>0?c:s).map(jv).join("");return[` <g id="${a}" data-mesh="${o}" fill="none" stroke="${i.color}"`,' stroke-width="1" stroke-linejoin="round" vector-effect="non-scaling-stroke">',` <title>${o}</title>`,` <path d="${u}"/>`," </g>"].join(`
|
|
2
2
|
`)}).join(`
|
|
3
|
-
`);return['<?xml version="1.0" encoding="UTF-8"?>',`<svg xmlns="http://www.w3.org/2000/svg" width="${
|
|
4
|
-
`)}function bv(e,t="model"){let n=mv(e),i=Wh(t);return n.map((r,o)=>{let a=pd(r.name,`material-${o+1}`);return{filename:n.length===1?`${i}-uv-layout.svg`:`${i}-uv-${a}-${o+1}.svg`,materialName:r.name,meshCount:[...r.layers.values()].filter(c=>c.edges.size>0).length,svg:fv(r)}})}async function $h(e,t="model"){let n=bv(e,t);if(n.length===0)return n;if(n.length===1)return zr(new Blob([n[0].svg],{type:"image/svg+xml;charset=utf-8"}),n[0].filename),n;let i=Object.fromEntries(n.map(o=>[o.filename,dv(o.svg)])),r=await Zs(i);return zr(new Blob([r],{type:"application/zip"}),`${Wh(t)}-uv-layouts.zip`),n}function Xh({sceneRef:e,materialRefs:t,rendererCaptureRef:n,objectBindings:i,downloadFilename:r}){let[o,a]=hd(!1),[s,c]=hd(!1),[l,u]=hd(null);xv(()=>{if(!s)return;let v=()=>c(!1);return window.addEventListener("pointerdown",v),()=>window.removeEventListener("pointerdown",v)},[s]);let d=tl(()=>{u(null),c(v=>!v)},[]),h=tl(()=>{let v=e.current;v&&(c(!1),a(!0),Fh({scene:v,objectBindings:i,matRefs:t.current,downloadFilename:r,onComplete:()=>a(!1)}))},[r,t,i,e]),g=tl(()=>{c(!1),Qs(n.current).then(v=>{let _=document.createElement("a");_.href=v,_.download=`${r}.png`,document.body.appendChild(_),_.click(),document.body.removeChild(_)}).catch(v=>{console.error("Screenshot failed:",v)})},[r,n]),f=tl(async()=>{let v=e.current;if(v)try{if((await $h(v,r)).length===0){u("This model does not contain UV coordinates.");return}u(null),c(!1)}catch(_){console.error("UV layout export failed:",_),u("Could not create the UV layout archive.")}},[r,e]);return{isDownloading:o,downloadMenuOpen:s,uvExportError:l,toggleDownloadMenu:d,handleDownloadMesh:h,handleDownloadScreenshot:g,handleDownloadUvLayout:f}}import{useCallback as Ro,useEffect as md,useRef as gd,useState as za}from"react";import{Box3 as qh,Raycaster as yv,Vector2 as vv,Vector3 as fd}from"three";function wv(e){let t=new qh().setFromObject(e),n=new fd;return t.getSize(n),{min:[t.min.x,t.min.y,t.min.z],max:[t.max.x,t.max.y,t.max.z],size:[n.x,n.y,n.z]}}function Cv(e){let t=new qh().setFromObject(e);if(t.isEmpty())return null;let n=t.getCenter(new fd),i=t.getSize(new fd).length()/2;return!Number.isFinite(i)||i<=0?null:{center:[n.x,n.y,n.z],radius:i}}function Yh({canvasAreaRef:e,controlsRef:t,sceneRef:n,modelUrl:i,modelRotation:r,bindingTransformSignature:o,modelLoaded:a}){let[s,c]=za(!1),[l,u]=za([]),[d,h]=za(!1),[g,f]=za(null),[v,_]=za(null),y=gd(!1),p=gd(0),m=gd(null);y.current=s;let S=Ro(x=>{x.updateMatrixWorld(!0),f(wv(x)),_(Cv(x))},[]),M=Ro(()=>u([]),[]),T=Ro(()=>c(x=>!x),[]),R=Ro(()=>h(x=>!x),[]),b=Ro(x=>{y.current&&(m.current={x:x.clientX,y:x.clientY})},[]),C=Ro(x=>{if(!y.current)return;let P=m.current;if(m.current=null,P&&Math.hypot(x.clientX-P.x,x.clientY-P.y)>6||x.target.closest("button, input, textarea, .ri-measureTools"))return;let E=e.current,z=t.current?.camera,A=n.current;if(!E||!z||!A)return;let F=E.getBoundingClientRect(),j=(x.clientX-F.left)/F.width*2-1,L=-((x.clientY-F.top)/F.height)*2+1,B=new yv;B.setFromCamera(new vv(j,L),z);let G=B.intersectObject(A,!0)[0];G&&(p.current+=1,u(U=>[...U,{id:p.current,position:[G.point.x,G.point.y,G.point.z]}]))},[e,t,n]);return md(()=>{u([]),f(null),_(null)},[i]),md(()=>{u([])},[r,o]),md(()=>{let x=n.current;!a||!x||S(x)},[o,a,S,n]),{measureMode:s,measureModeRef:y,measurePoints:l,showDimensions:d,measureBox:g,modelBounds:v,refreshBounds:S,clearMeasurements:M,toggleMeasureMode:T,toggleDimensions:R,handleMeasurePointerDown:b,handleMeasureClick:C}}import{createPortal as Mv}from"react-dom";import{createXRStore as Tv}from"@react-three/xr";import{MapPin as Pv}from"lucide-react";import{useCallback as Ii,useEffect as Lo,useMemo as Qh,useRef as _v,useState as ii}from"react";function bd(){return typeof navigator>"u"?!1:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function xd(){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 Kh(){return bd()||xd()}function Sv(){if(typeof window>"u"||typeof navigator>"u")return!1;let e=a=>typeof window.matchMedia=="function"&&window.matchMedia(a).matches,t=e("(pointer: coarse)")||e("(any-pointer: coarse)"),n=e("(hover: none)")||e("(any-hover: none)"),i=navigator.maxTouchPoints>0,r=typeof window.screen<"u"&&Math.min(window.screen.width,window.screen.height)<=1024,o=bd();return t||o||i&&n||i&&r}function yd(){if(!Sv())return!1;if(bd())return!0;let e=navigator.deviceMemory;return!(typeof e=="number"&&e>=8)}function Jh(e="auto"){switch(e){case"high":return!1;case"low":return!0;default:return yd()}}import{Fragment as kv,jsx as Bo,jsxs as vd}from"react/jsx-runtime";var Zh={canPlace:!1,isPlacementMode:!0,isModelPlaced:!1};function em({enableXR:e,usdzUrl:t,mobileHandoffUrl:n}){let i=_v(null),r=Qh(()=>{if(!e||typeof navigator>"u")return null;let j=navigator.xr;if(!j||typeof j.isSessionSupported!="function"||typeof j.addEventListener!="function")return null;try{return Tv({emulate:!1})}catch{return null}},[e]),[o,a]=ii(!1),[s,c]=ii(!1),[l,u]=ii(!0),[d,h]=ii(null),[g,f]=ii(!1),[v,_]=ii(!1),[y,p]=ii(Zh),[m,S]=ii(!1),M=Qh(()=>e&&!!t?.trim()&&xd(),[e,t]);Lo(()=>{u(Kh())},[]);let T=Ii(()=>{if(typeof window>"u")return null;try{let j=new URL(n?.trim()||window.location.href,window.location.href);return j.protocol==="http:"||j.protocol==="https:"?j.toString():null}catch{return null}},[n]);Lo(()=>{if(!e||l){h(null),f(!1);return}h(T())},[e,l,T]),Lo(()=>{if(r)return r.subscribe(j=>_(j.session!=null&&j.mode==="immersive-ar"))},[r]),Lo(()=>{S(!1),p(Zh)},[v]),Lo(()=>{if(!e||typeof navigator>"u")return;let j=navigator.xr;if(!j?.isSessionSupported)return;let L=!1;return j.isSessionSupported("immersive-ar").then(B=>!L&&a(B)).catch(()=>{}),j.isSessionSupported("immersive-vr").then(B=>!L&&c(B)).catch(()=>{}),()=>{L=!0}},[e]);let R=Ii(()=>{let j=T();j&&(h(j),f(!0))},[T]),b=Ii(()=>f(!1),[]),C=Ii(()=>{let j=t?.trim();if(!j)return;let L=document.createElement("a");L.setAttribute("rel","ar"),L.href=j,L.style.display="none";let B=document.createElement("img");B.alt="",B.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",L.appendChild(B),document.body.appendChild(L),L.click(),L.remove()},[t]),x=Ii(j=>{p(j),j.isPlacementMode||S(!1)},[]),P=Ii(j=>{S(!1),j?i.current?.finishPlacementMode():i.current?.cancelPlacementMode()},[]),I=Ii(j=>{j.preventDefault(),S(!0),i.current?.startPlacementMode()},[]);Lo(()=>{if(!m)return;let j=()=>P(!0),L=()=>P(!1);return window.addEventListener("pointerup",j),window.addEventListener("pointercancel",L),()=>{window.removeEventListener("pointerup",j),window.removeEventListener("pointercancel",L)}},[P,m]);let E=y.isModelPlaced?y.isPlacementMode?y.canPlace?"Release to place":"Move your device over a flat surface":null:y.canPlace?null:"Move your device over a flat surface",z=y.isModelPlaced&&!y.isPlacementMode?"Pinch to resize \xB7 Twist to rotate":null,A=r?.getState().domOverlayRoot??null,F=v&&A?Mv(vd(kv,{children:[z&&Bo("div",{className:"ri-arHintOverlay",children:Bo("div",{className:"ri-arHint",children:z})}),Bo("div",{className:"ri-arOverlay",children:vd("div",{className:"ri-arControls",children:[E&&Bo("div",{className:"ri-arStatus",children:E}),y.isModelPlaced&&vd("button",{type:"button",className:`ri-arActionButton ${m?"ri-arActionButton--active":""}`,onPointerDown:j=>I(j.nativeEvent),"aria-pressed":m,children:[Bo(Pv,{size:14}),"Relocate"]}),!y.isModelPlaced&&y.canPlace&&Bo("button",{type:"button",className:"ri-arActionButton ri-arActionButton--primary",onClick:()=>i.current?.placeCurrent(),children:"Tap to place"})]})})]}),A):null;return{xrStore:r,presenterRef:i,arSupported:o,vrSupported:s,quickLookSupported:M,resolvedMobileHandoffUrl:d,isMobileHandoffOpen:g,arOverlay:F,openMobileHandoff:R,closeMobileHandoff:b,openQuickLook:C,handleARStateChange:x}}import{Canvas as A1,useThree as E1}from"@react-three/fiber";import{ContactShadows as R1,Environment as L1}from"@react-three/drei";import{XR as B1}from"@react-three/xr";import{NoToneMapping as O1}from"three";import{Suspense as D1,useEffect as N1,useMemo as ul,useState as I1}from"react";import{useFrame as Cd,useThree as zi}from"@react-three/fiber";import{useXR as tm}from"@react-three/xr";import{Color as Av,PerspectiveCamera as Ev}from"three";import{useEffect as Oo,useLayoutEffect as Rv,useRef as wd}from"react";function nm({renderMode:e}){let{scene:t}=zi(),n=zi(a=>a.setFrameloop),i=tm(a=>a.session!=null),r=tm(a=>a.mode==="immersive-ar"),o=wd(void 0);return Oo(()=>{n(i?"always":e)},[i,e,n]),Oo(()=>{r?(o.current=t.background,t.background=null):o.current!==void 0&&(t.background=o.current,o.current=void 0)},[r,t]),Cd(()=>{r&&t.background!==null&&(t.background=null)}),null}function rm({onPresentingChange:e}){let t=zi(r=>r.gl),n=wd(null);Oo(()=>{let r=t.xr;if(!r)return;let o=c=>{c?(n.current=t.shadowMap.enabled,t.shadowMap.enabled=!1):n.current!==null&&(t.shadowMap.enabled=n.current,n.current=null),e(c)},a=()=>o(!0),s=()=>o(!1);return r.addEventListener("sessionstart",a),r.addEventListener("sessionend",s),o(r.isPresenting),()=>{r.removeEventListener("sessionstart",a),r.removeEventListener("sessionend",s)}},[t,e]);let i=wd(0);return Cd(()=>{if(!t.xr.isPresenting)return;let r=performance.now();if(r-i.current<1e3)return;i.current=r;let o=t.xr}),null}function im({active:e}){let t=zi(n=>n.invalidate);return Oo(()=>{e&&t()},[e,t]),Cd(()=>{e&&t()}),null}function om({color:e}){let{scene:t}=zi();return Oo(()=>{let n=t.background;return t.background=e?new Av(e):null,()=>{t.background=n}},[t,e]),null}function am({rotation:e}){let{scene:t}=zi();return Rv(()=>{let n=e*Math.PI/180;t.environmentRotation.set(0,n,0),t.backgroundRotation.set(0,n,0)}),null}function sm({cameraConfig:e}){let{camera:t}=zi();return Oo(()=>{if(!(t instanceof Ev))return;let n=e?.fov;typeof n=="number"&&t.fov!==n&&(t.fov=n,t.updateProjectionMatrix())},[t,e]),null}import{useThree as ll}from"@react-three/fiber";import{Autofocus as Jv,Bloom as Qv,BrightnessContrast as Zv,ChromaticAberration as e1,ColorAverage as t1,DepthOfField as n1,DotScreen as r1,EffectComposer as i1,Glitch as o1,GodRays as a1,Grid as s1,HueSaturation as l1,Noise as c1,Outline as d1,Pixelation as u1,Ramp as p1,Scanline as h1,SelectiveBloom as m1,Sepia as g1,SMAA as f1,SSAO as b1,ToneMapping as x1,Vignette as y1}from"@react-three/postprocessing";import{BlendFunction as Fa,KernelSize as v1}from"postprocessing";import{Color as cl,Vector2 as Ua}from"three";import{memo as w1,useCallback as C1,useEffect as km,useMemo as Ga,useRef as Am,useState as Em}from"react";import{CanvasTexture as cm,Color as dm,ImageLoader as Lv,NoColorSpace as nl,RepeatWrapping as lm,SRGBColorSpace as Pd,Texture as Bv}from"three";var Do=new Map,jr={color:"#93c5fd",intensity:.07},Va=new dm(jr.color).multiplyScalar(jr.intensity),um=new dm(jr.color),pm=.28,No=new Map,Td=new Map;function Ov(e){return`${e.name}|${e.size}|${e.lastModified}`}function hm(e){let t=Ov(e),n=e.name.lastIndexOf("."),i=n>0?e.name.slice(0,n):e.name,r=n>0?e.name.slice(n):"",o=`materials/${e.name}`,a=2;for(;;){let s=Td.get(o);if(s===void 0||s===t)return Td.set(o,t),o;o=`materials/${i}-${a}${r}`,a+=1}}function mm(e){return No.get(e)}function gm(e,t){let n=++e.loadGeneration;e.loaded=!1;let i=()=>{if(e.loadGeneration!==n)return;e.loaded=!0;let r=e.pending;e.pending=[];for(let o of r)o()};new Lv().load(t,r=>{e.loadGeneration===n&&(e.texture.image=r,e.texture.needsUpdate=!0,i())},void 0,()=>{e.loadGeneration===n&&(console.warn(`Failed to load texture: ${t}`),i())})}function fm(e,t){for(let n of[Pd,nl]){let i=Do.get(ja(e,n));i&&gm(i,t)}}function bm(e,t){let n=No.get(e);n&&n!==t&&n.startsWith("blob:")&&URL.revokeObjectURL(n),No.set(e,t),fm(e,t)}function _d(e){let t=No.get(e);t&&(t.startsWith("blob:")&&URL.revokeObjectURL(t),No.delete(e),Td.delete(e),fm(e,e))}function ja(e,t){return`${t}|${e}`}function Ut(e,t=nl,n){let i=ja(e,t),r=Do.get(i);if(r)return n&&!r.loaded&&r.pending.push(n),r.texture;let o=No.get(e)??e,a={texture:new Bv,refCount:0,loaded:!1,pending:n?[n]:[],loadGeneration:0};return a.texture.flipY=!1,a.texture.colorSpace=t,Do.set(i,a),gm(a,o),a.texture}function rl(e,t=nl,n){let i=Ut(e,t,n);return Do.get(ja(e,t)).refCount+=1,i}function ji(e,t=nl){let n=Do.get(ja(e,t));n&&(n.refCount-=1,n.refCount<=0&&(n.loadGeneration+=1,n.pending=[],n.texture.dispose(),Do.delete(ja(e,t))))}var Sd=null;function il(){if(Sd)return Sd;let e=256,t=document.createElement("canvas");t.width=e,t.height=e;let n=t.getContext("2d"),i=n.createRadialGradient(e*.35,e*.35,e*.02,e*.5,e*.5,e*.55);i.addColorStop(0,"#ffffff"),i.addColorStop(.4,"#b5b5b5"),i.addColorStop(1,"#3a3a3a"),n.fillStyle=i,n.fillRect(0,0,e,e);let r=new cm(t);return r.colorSpace=Pd,Sd=r,r}var Md=null;function xm(){if(Md)return Md;let e=1024,t=8,n=e/t,i=["#ef4444","#f59e0b","#22c55e","#6366f1"],r=document.createElement("canvas");r.width=e,r.height=e;let o=r.getContext("2d");o.textAlign="center",o.textBaseline="middle";for(let s=0;s<t;s+=1)for(let c=0;c<t;c+=1){let l=c*n,u=s*n,d=(Math.floor(c/2)+Math.floor(s/2))%4;o.fillStyle=i[d],o.fillRect(l,u,n,n),o.strokeStyle="rgba(0, 0, 0, 0.28)",o.lineWidth=2;for(let p=1;p<4;p+=1){let m=p*n/4;o.beginPath(),o.moveTo(l+m,u),o.lineTo(l+m,u+n),o.moveTo(l,u+m),o.lineTo(l+n,u+m),o.stroke()}o.strokeStyle="#09090b",o.lineWidth=7,o.strokeRect(l,u,n,n);let h=l+n*.23,g=u+n*.72,f=l+n*.72,v=u+n*.23;o.lineCap="round",o.lineJoin="round",o.beginPath(),o.moveTo(h,g),o.lineTo(f,v),o.lineTo(f-n*.2,v),o.moveTo(f,v),o.lineTo(f,v+n*.2),o.stroke();let _=s*t+c+1;o.font=`700 ${Math.round(n*.2)}px ui-monospace, SFMono-Regular, Menlo, monospace`,o.fillStyle="#ffffff",o.strokeStyle="rgba(0, 0, 0, 0.85)",o.lineWidth=6;let y=String(_).padStart(2,"0");o.strokeText(y,l+n/2,u+n*.82),o.fillText(y,l+n/2,u+n*.82)}let a=new cm(r);return a.colorSpace=Pd,a.wrapS=lm,a.wrapT=lm,a.flipY=!1,a.anisotropy=8,a.needsUpdate=!0,Md=a,a}import{forwardRef as Dv,useImperativeHandle as Nv,useMemo as Iv}from"react";import{BlendFunction as zv,Effect as jv}from"postprocessing";import{Uniform as Vv}from"three";import{jsx as Uv}from"react/jsx-runtime";var Fv=`
|
|
3
|
+
`);return['<?xml version="1.0" encoding="UTF-8"?>',`<svg xmlns="http://www.w3.org/2000/svg" width="${Ja}" height="${Ja}" viewBox="0 0 ${Ja} ${Ja}">`,` <title>${t} UV layout</title>`," <desc>UV0 island-outline template exported by React Immersive. The SVG canvas maps to the complete 0\u20131 texture area.</desc>",' <rect width="2048" height="2048" fill="none" stroke="#94a3b8" stroke-width="2"/>',n,"</svg>"].join(`
|
|
4
|
+
`)}function Fv(e,t="model"){let n=zv(e),i=Mm(t);return n.map((r,o)=>{let a=Ed(r.name,`material-${o+1}`);return{filename:n.length===1?`${i}-uv-layout.svg`:`${i}-uv-${a}-${o+1}.svg`,materialName:r.name,meshCount:[...r.layers.values()].filter(c=>c.edges.size>0).length,svg:Vv(r)}})}async function Tm(e,t="model"){let n=Fv(e,t);if(n.length===0)return n;if(n.length===1)return Xr(new Blob([n[0].svg],{type:"image/svg+xml;charset=utf-8"}),n[0].filename),n;let i=Object.fromEntries(n.map(o=>[o.filename,Ov(o.svg)])),r=await yl(i);return Xr(new Blob([r],{type:"application/zip"}),`${Mm(t)}-uv-layouts.zip`),n}function Pm({sceneRef:e,materialRefs:t,rendererCaptureRef:n,objectBindings:i,downloadFilename:r}){let[o,a]=Rd(!1),[s,c]=Rd(!1),[l,u]=Rd(null);Uv(()=>{if(!s)return;let y=()=>c(!1);return window.addEventListener("pointerdown",y),()=>window.removeEventListener("pointerdown",y)},[s]);let d=wl(()=>{u(null),c(y=>!y)},[]),h=wl(()=>{let y=e.current;y&&(c(!1),a(!0),vm({scene:y,objectBindings:i,matRefs:t.current,downloadFilename:r,onComplete:()=>a(!1)}))},[r,t,i,e]),g=wl(()=>{c(!1),xl(n.current).then(y=>{let k=document.createElement("a");k.href=y,k.download=`${r}.png`,document.body.appendChild(k),k.click(),document.body.removeChild(k)}).catch(y=>{console.error("Screenshot failed:",y)})},[r,n]),f=wl(async()=>{let y=e.current;if(y)try{if((await Tm(y,r)).length===0){u("This model does not contain UV coordinates.");return}u(null),c(!1)}catch(k){console.error("UV layout export failed:",k),u("Could not create the UV layout archive.")}},[r,e]);return{isDownloading:o,downloadMenuOpen:s,uvExportError:l,toggleDownloadMenu:d,handleDownloadMesh:h,handleDownloadScreenshot:g,handleDownloadUvLayout:f}}import{useCallback as Fo,useEffect as Ld,useRef as Bd,useState as Qa}from"react";import{Box3 as km,Raycaster as Gv,Vector2 as Hv,Vector3 as Od}from"three";function Wv(e){let t=new km().setFromObject(e),n=new Od;return t.getSize(n),{min:[t.min.x,t.min.y,t.min.z],max:[t.max.x,t.max.y,t.max.z],size:[n.x,n.y,n.z]}}function $v(e){let t=new km().setFromObject(e);if(t.isEmpty())return null;let n=t.getCenter(new Od),i=t.getSize(new Od).length()/2;return!Number.isFinite(i)||i<=0?null:{center:[n.x,n.y,n.z],radius:i}}function _m({canvasAreaRef:e,controlsRef:t,sceneRef:n,modelUrl:i,modelRotation:r,bindingTransformSignature:o,modelLoaded:a}){let[s,c]=Qa(!1),[l,u]=Qa([]),[d,h]=Qa(!1),[g,f]=Qa(null),[y,k]=Qa(null),v=Bd(!1),p=Bd(0),m=Bd(null);v.current=s;let M=Fo(T=>{T.updateMatrixWorld(!0),f(Wv(T)),k($v(T))},[]),C=Fo(()=>u([]),[]),P=Fo(()=>c(T=>!T),[]),A=Fo(()=>h(T=>!T),[]),b=Fo(T=>{v.current&&(m.current={x:T.clientX,y:T.clientY})},[]),w=Fo(T=>{if(!v.current)return;let S=m.current;if(m.current=null,S&&Math.hypot(T.clientX-S.x,T.clientY-S.y)>6||T.target.closest("button, input, textarea, .ri-measureTools"))return;let R=e.current,z=t.current?.camera,E=n.current;if(!R||!z||!E)return;let j=R.getBoundingClientRect(),I=(T.clientX-j.left)/j.width*2-1,L=-((T.clientY-j.top)/j.height)*2+1,B=new Gv;B.setFromCamera(new Hv(I,L),z);let G=B.intersectObject(E,!0)[0];G&&(p.current+=1,u(H=>[...H,{id:p.current,position:[G.point.x,G.point.y,G.point.z]}]))},[e,t,n]);return Ld(()=>{u([]),f(null),k(null)},[i]),Ld(()=>{u([])},[r,o]),Ld(()=>{let T=n.current;!a||!T||M(T)},[o,a,M,n]),{measureMode:s,measureModeRef:v,measurePoints:l,showDimensions:d,measureBox:g,modelBounds:y,refreshBounds:M,clearMeasurements:C,toggleMeasureMode:P,toggleDimensions:A,handleMeasurePointerDown:b,handleMeasureClick:w}}import{createPortal as qv}from"react-dom";import{createXRStore as Yv}from"@react-three/xr";import{MapPin as Kv}from"lucide-react";import{useCallback as Wi,useEffect as Uo,useMemo as Rm,useRef as Jv,useState as di}from"react";function Dd(){return typeof navigator>"u"?!1:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function Nd(){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 Am(){return Dd()||Nd()}function Xv(){if(typeof window>"u"||typeof navigator>"u")return!1;let e=a=>typeof window.matchMedia=="function"&&window.matchMedia(a).matches,t=e("(pointer: coarse)")||e("(any-pointer: coarse)"),n=e("(hover: none)")||e("(any-hover: none)"),i=navigator.maxTouchPoints>0,r=typeof window.screen<"u"&&Math.min(window.screen.width,window.screen.height)<=1024,o=Dd();return t||o||i&&n||i&&r}function Id(){if(!Xv())return!1;if(Dd())return!0;let e=navigator.deviceMemory;return!(typeof e=="number"&&e>=8)}function Em(e="auto"){switch(e){case"high":return!1;case"low":return!0;default:return Id()}}import{Fragment as Qv,jsx as Go,jsxs as zd}from"react/jsx-runtime";var Lm={canPlace:!1,isPlacementMode:!0,isModelPlaced:!1};function Bm({enableXR:e,usdzUrl:t,mobileHandoffUrl:n}){let i=Jv(null),r=Rm(()=>{if(!e||typeof navigator>"u")return null;let I=navigator.xr;if(!I||typeof I.isSessionSupported!="function"||typeof I.addEventListener!="function")return null;try{return Yv({emulate:!1})}catch{return null}},[e]),[o,a]=di(!1),[s,c]=di(!1),[l,u]=di(!0),[d,h]=di(null),[g,f]=di(!1),[y,k]=di(!1),[v,p]=di(Lm),[m,M]=di(!1),C=Rm(()=>e&&!!t?.trim()&&Nd(),[e,t]);Uo(()=>{u(Am())},[]);let P=Wi(()=>{if(typeof window>"u")return null;try{let I=new URL(n?.trim()||window.location.href,window.location.href);return I.protocol==="http:"||I.protocol==="https:"?I.toString():null}catch{return null}},[n]);Uo(()=>{if(!e||l){h(null),f(!1);return}h(P())},[e,l,P]),Uo(()=>{if(r)return r.subscribe(I=>k(I.session!=null&&I.mode==="immersive-ar"))},[r]),Uo(()=>{M(!1),p(Lm)},[y]),Uo(()=>{if(!e||typeof navigator>"u")return;let I=navigator.xr;if(!I?.isSessionSupported)return;let L=!1;return I.isSessionSupported("immersive-ar").then(B=>!L&&a(B)).catch(()=>{}),I.isSessionSupported("immersive-vr").then(B=>!L&&c(B)).catch(()=>{}),()=>{L=!0}},[e]);let A=Wi(()=>{let I=P();I&&(h(I),f(!0))},[P]),b=Wi(()=>f(!1),[]),w=Wi(()=>{let I=t?.trim();if(!I)return;let L=document.createElement("a");L.setAttribute("rel","ar"),L.href=I,L.style.display="none";let B=document.createElement("img");B.alt="",B.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",L.appendChild(B),document.body.appendChild(L),L.click(),L.remove()},[t]),T=Wi(I=>{p(I),I.isPlacementMode||M(!1)},[]),S=Wi(I=>{M(!1),I?i.current?.finishPlacementMode():i.current?.cancelPlacementMode()},[]),N=Wi(I=>{I.preventDefault(),M(!0),i.current?.startPlacementMode()},[]);Uo(()=>{if(!m)return;let I=()=>S(!0),L=()=>S(!1);return window.addEventListener("pointerup",I),window.addEventListener("pointercancel",L),()=>{window.removeEventListener("pointerup",I),window.removeEventListener("pointercancel",L)}},[S,m]);let R=v.isModelPlaced?v.isPlacementMode?v.canPlace?"Release to place":"Move your device over a flat surface":null:v.canPlace?null:"Move your device over a flat surface",z=v.isModelPlaced&&!v.isPlacementMode?"Pinch to resize \xB7 Twist to rotate":null,E=r?.getState().domOverlayRoot??null,j=y&&E?qv(zd(Qv,{children:[z&&Go("div",{className:"ri-arHintOverlay",children:Go("div",{className:"ri-arHint",children:z})}),Go("div",{className:"ri-arOverlay",children:zd("div",{className:"ri-arControls",children:[R&&Go("div",{className:"ri-arStatus",children:R}),v.isModelPlaced&&zd("button",{type:"button",className:`ri-arActionButton ${m?"ri-arActionButton--active":""}`,onPointerDown:I=>N(I.nativeEvent),"aria-pressed":m,children:[Go(Kv,{size:14}),"Relocate"]}),!v.isModelPlaced&&v.canPlace&&Go("button",{type:"button",className:"ri-arActionButton ri-arActionButton--primary",onClick:()=>i.current?.placeCurrent(),children:"Tap to place"})]})})]}),E):null;return{xrStore:r,presenterRef:i,arSupported:o,vrSupported:s,quickLookSupported:C,resolvedMobileHandoffUrl:d,isMobileHandoffOpen:g,arOverlay:j,openMobileHandoff:A,closeMobileHandoff:b,openQuickLook:w,handleARStateChange:T}}import{Canvas as Z1,useThree as ew}from"@react-three/fiber";import{ContactShadows as tw,Environment as nw}from"@react-three/drei";import{XR as rw}from"@react-three/xr";import{NoToneMapping as iw}from"three";import{Suspense as ow,useEffect as aw,useMemo as Rl,useState as sw}from"react";import{useFrame as Vd,useThree as $i}from"@react-three/fiber";import{useXR as Om}from"@react-three/xr";import{Color as Zv,PerspectiveCamera as e1}from"three";import{useEffect as Ho,useLayoutEffect as t1,useRef as jd}from"react";function Dm({renderMode:e}){let{scene:t}=$i(),n=$i(a=>a.setFrameloop),i=Om(a=>a.session!=null),r=Om(a=>a.mode==="immersive-ar"),o=jd(void 0);return Ho(()=>{n(i?"always":e)},[i,e,n]),Ho(()=>{r?(o.current=t.background,t.background=null):o.current!==void 0&&(t.background=o.current,o.current=void 0)},[r,t]),Vd(()=>{r&&t.background!==null&&(t.background=null)}),null}function Nm({onPresentingChange:e}){let t=$i(r=>r.gl),n=jd(null);Ho(()=>{let r=t.xr;if(!r)return;let o=c=>{c?(n.current=t.shadowMap.enabled,t.shadowMap.enabled=!1):n.current!==null&&(t.shadowMap.enabled=n.current,n.current=null),e(c)},a=()=>o(!0),s=()=>o(!1);return r.addEventListener("sessionstart",a),r.addEventListener("sessionend",s),o(r.isPresenting),()=>{r.removeEventListener("sessionstart",a),r.removeEventListener("sessionend",s)}},[t,e]);let i=jd(0);return Vd(()=>{if(!t.xr.isPresenting)return;let r=performance.now();if(r-i.current<1e3)return;i.current=r;let o=t.xr}),null}function Im({active:e}){let t=$i(n=>n.invalidate);return Ho(()=>{e&&t()},[e,t]),Vd(()=>{e&&t()}),null}function zm({color:e}){let{scene:t}=$i();return Ho(()=>{let n=t.background;return t.background=e?new Zv(e):null,()=>{t.background=n}},[t,e]),null}function jm({rotation:e}){let{scene:t}=$i();return t1(()=>{let n=e*Math.PI/180;t.environmentRotation.set(0,n,0),t.backgroundRotation.set(0,n,0)}),null}function Vm({cameraConfig:e}){let{camera:t}=$i();return Ho(()=>{if(!(t instanceof e1))return;let n=e?.fov;typeof n=="number"&&t.fov!==n&&(t.fov=n,t.updateProjectionMatrix())},[t,e]),null}import{useThree as _l}from"@react-three/fiber";import{Autofocus as w1,Bloom as C1,BrightnessContrast as S1,ChromaticAberration as M1,ColorAverage as T1,DepthOfField as P1,DotScreen as k1,EffectComposer as _1,Glitch as A1,GodRays as E1,Grid as R1,HueSaturation as L1,Noise as B1,Outline as O1,Pixelation as D1,Ramp as N1,Scanline as I1,SelectiveBloom as z1,Sepia as j1,SMAA as V1,SSAO as F1,ToneMapping as U1,Vignette as G1}from"@react-three/postprocessing";import{BlendFunction as ts,KernelSize as H1}from"postprocessing";import{Color as Al,Vector2 as ns}from"three";import{memo as W1,useCallback as $1,useEffect as sg,useMemo as rs,useRef as lg,useState as cg}from"react";import{CanvasTexture as Um,Color as Gm,ImageLoader as n1,NoColorSpace as Cl,RepeatWrapping as Fm,SRGBColorSpace as Hd,Texture as r1}from"three";var Wo=new Map,qr={color:"#93c5fd",intensity:.07},es=new Gm(qr.color).multiplyScalar(qr.intensity),Hm=new Gm(qr.color),Wm=.28,$o=new Map,Gd=new Map;function i1(e){return`${e.name}|${e.size}|${e.lastModified}`}function $m(e){let t=i1(e),n=e.name.lastIndexOf("."),i=n>0?e.name.slice(0,n):e.name,r=n>0?e.name.slice(n):"",o=`materials/${e.name}`,a=2;for(;;){let s=Gd.get(o);if(s===void 0||s===t)return Gd.set(o,t),o;o=`materials/${i}-${a}${r}`,a+=1}}function Xm(e){return $o.get(e)}function qm(e,t){let n=++e.loadGeneration;e.loaded=!1;let i=()=>{if(e.loadGeneration!==n)return;e.loaded=!0;let r=e.pending;e.pending=[];for(let o of r)o()};new n1().load(t,r=>{e.loadGeneration===n&&(e.texture.image=r,e.texture.needsUpdate=!0,i())},void 0,()=>{e.loadGeneration===n&&(console.warn(`Failed to load texture: ${t}`),i())})}function Ym(e,t){for(let n of[Hd,Cl]){let i=Wo.get(Za(e,n));i&&qm(i,t)}}function Km(e,t){let n=$o.get(e);n&&n!==t&&n.startsWith("blob:")&&URL.revokeObjectURL(n),$o.set(e,t),Ym(e,t)}function Wd(e){let t=$o.get(e);t&&(t.startsWith("blob:")&&URL.revokeObjectURL(t),$o.delete(e),Gd.delete(e),Ym(e,e))}function Za(e,t){return`${t}|${e}`}function Ft(e,t=Cl,n){let i=Za(e,t),r=Wo.get(i);if(r)return n&&!r.loaded&&r.pending.push(n),r.texture;let o=$o.get(e)??e,a={texture:new r1,refCount:0,loaded:!1,pending:n?[n]:[],loadGeneration:0};return a.texture.flipY=!1,a.texture.colorSpace=t,Wo.set(i,a),qm(a,o),a.texture}function Sl(e,t=Cl,n){let i=Ft(e,t,n);return Wo.get(Za(e,t)).refCount+=1,i}function Xi(e,t=Cl){let n=Wo.get(Za(e,t));n&&(n.refCount-=1,n.refCount<=0&&(n.loadGeneration+=1,n.pending=[],n.texture.dispose(),Wo.delete(Za(e,t))))}var Fd=null;function Ml(){if(Fd)return Fd;let e=256,t=document.createElement("canvas");t.width=e,t.height=e;let n=t.getContext("2d"),i=n.createRadialGradient(e*.35,e*.35,e*.02,e*.5,e*.5,e*.55);i.addColorStop(0,"#ffffff"),i.addColorStop(.4,"#b5b5b5"),i.addColorStop(1,"#3a3a3a"),n.fillStyle=i,n.fillRect(0,0,e,e);let r=new Um(t);return r.colorSpace=Hd,Fd=r,r}var Ud=null;function Jm(){if(Ud)return Ud;let e=1024,t=8,n=e/t,i=["#ef4444","#f59e0b","#22c55e","#6366f1"],r=document.createElement("canvas");r.width=e,r.height=e;let o=r.getContext("2d");o.textAlign="center",o.textBaseline="middle";for(let s=0;s<t;s+=1)for(let c=0;c<t;c+=1){let l=c*n,u=s*n,d=(Math.floor(c/2)+Math.floor(s/2))%4;o.fillStyle=i[d],o.fillRect(l,u,n,n),o.strokeStyle="rgba(0, 0, 0, 0.28)",o.lineWidth=2;for(let p=1;p<4;p+=1){let m=p*n/4;o.beginPath(),o.moveTo(l+m,u),o.lineTo(l+m,u+n),o.moveTo(l,u+m),o.lineTo(l+n,u+m),o.stroke()}o.strokeStyle="#09090b",o.lineWidth=7,o.strokeRect(l,u,n,n);let h=l+n*.23,g=u+n*.72,f=l+n*.72,y=u+n*.23;o.lineCap="round",o.lineJoin="round",o.beginPath(),o.moveTo(h,g),o.lineTo(f,y),o.lineTo(f-n*.2,y),o.moveTo(f,y),o.lineTo(f,y+n*.2),o.stroke();let k=s*t+c+1;o.font=`700 ${Math.round(n*.2)}px ui-monospace, SFMono-Regular, Menlo, monospace`,o.fillStyle="#ffffff",o.strokeStyle="rgba(0, 0, 0, 0.85)",o.lineWidth=6;let v=String(k).padStart(2,"0");o.strokeText(v,l+n/2,u+n*.82),o.fillText(v,l+n/2,u+n*.82)}let a=new Um(r);return a.colorSpace=Hd,a.wrapS=Fm,a.wrapT=Fm,a.flipY=!1,a.anisotropy=8,a.needsUpdate=!0,Ud=a,a}import{forwardRef as o1,useImperativeHandle as a1,useMemo as s1}from"react";import{BlendFunction as l1,Effect as c1}from"postprocessing";import{Uniform as d1}from"three";import{jsx as p1}from"react/jsx-runtime";var u1=`
|
|
5
5
|
uniform float exposure;
|
|
6
6
|
void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
|
|
7
7
|
outputColor = vec4(inputColor.rgb * exposure, inputColor.a);
|
|
8
8
|
}
|
|
9
|
-
`,kd=class extends jv{constructor(t=1){super("ExposureEffect",Fv,{blendFunction:zv.NORMAL,uniforms:new Map([["exposure",new Vv(t)]])})}set exposure(t){this.uniforms.get("exposure").value=t}},ym=Dv(function({exposure:t},n){let i=Iv(()=>new kd(t),[]);return i.exposure=t,Nv(n,()=>i,[i]),Uv("primitive",{object:i,dispose:null})});import{useFrame as Gv,useThree as ol}from"@react-three/fiber";import*as Sm from"@react-three/postprocessing";import{BlendFunction as Hv}from"postprocessing";import{Color as Wv,MathUtils as $v,Mesh as Xv,Vector2 as vm,Vector3 as wm}from"three";import{useEffect as Cm,useMemo as al,useRef as Ad}from"react";import{jsx as Yv}from"react/jsx-runtime";var qv=Sm.LensFlareEffect;function Mm({config:e}){let t=ol(h=>h.camera),n=ol(h=>h.raycaster),i=ol(h=>h.scene),r=ol(h=>h.viewport),o=Ad(null),a=Ad(new wm),s=Ad(new vm),c=al(()=>new wm(...e.lensPosition),[e.lensPosition]),l=al(()=>new Wv(e.colorGain??"#141414"),[e.colorGain]),u=al(()=>new vm(0,0),[]),d=al(()=>new qv({blendFunction:Hv.NORMAL,enabled:!0,glareSize:e.glareSize,lensPosition:c,screenRes:u,starPoints:6,flareSize:e.flareSize,flareSpeed:e.flareSpeed,flareShape:e.flareShape,animated:e.animated,anamorphic:e.anamorphic,colorGain:l,lensDirtTexture:null,haloScale:e.haloScale,secondaryGhosts:e.secondaryGhosts,aditionalStreaks:e.aditionalStreaks,ghostScale:e.ghostScale,opacity:e.opacity,starBurst:e.starBurst}),[l,e.aditionalStreaks,e.anamorphic,e.animated,e.flareShape,e.flareSize,e.flareSpeed,e.glareSize,e.haloScale,e.ghostScale,e.opacity,e.secondaryGhosts,e.starBurst,c,u]);return Cm(()=>(o.current=d,()=>{d.dispose(),o.current=null}),[d]),Cm(()=>{let h=d.uniforms.get("screenRes");h&&(h.value.x=r.width,h.value.y=r.height)},[d,r]),Gv((h,g)=>{let f=o.current;if(!f)return;let v=f.uniforms.get("lensPosition"),_=f.uniforms.get("opacity");if(!v||!_)return;let y=1;if(a.current.copy(c).project(t),a.current.z>1)return;v.value.x=a.current.x,v.value.y=a.current.y,s.current.x=a.current.x,s.current.y=a.current.y,n.setFromCamera(s.current,t);let p=n.intersectObjects(i.children,!0),{object:m}=p[0]||{};m&&(m.userData?.lensflare==="no-occlusion"?y=0:m instanceof Xv&&(m.material.uniforms?._transmission?.value>.2||m.material._transmission&&m.material._transmission>.2?y=.2:m.material.transparent&&(y=m.material.opacity))),_.value=$v.damp(_.value,y,12,g)}),Yv("primitive",{object:d,dispose:null})}import{RampType as Ed}from"@react-three/postprocessing";import{GlitchMode as Rd,KernelSize as Io,ToneMappingMode as Ld}from"postprocessing";import{Color as Kv}from"three";function Tm(e){return e==="linear"?Ld.LINEAR:e==="reinhard"?Ld.REINHARD:Ld.ACES_FILMIC}function sl(e){switch(e){case"verySmall":return Io.VERY_SMALL;case"small":return Io.SMALL;case"medium":return Io.MEDIUM;case"large":return Io.LARGE;case"veryLarge":return Io.VERY_LARGE;case"huge":return Io.HUGE}}function Pm(e){switch(e){case"constantMild":return Rd.CONSTANT_MILD;case"constantWild":return Rd.CONSTANT_WILD;default:return Rd.SPORADIC}}function Bd(e){let t=new Kv(e);return[t.r,t.g,t.b,1]}function _m(e){return e==="radial"?Ed.Radial:e==="mirroredLinear"?Ed.MirroredLinear:Ed.Linear}import{Fragment as _1,jsx as vt,jsxs as Od}from"react/jsx-runtime";var Vi={edgeStrength:1,pulseSpeed:0,visibleEdgeColor:new cl(jr.color).getHex(),hiddenEdgeColor:new cl(jr.color).multiplyScalar(.35).getHex(),kernelSize:v1.VERY_SMALL,blur:!1,xRay:!1};function S1(e){let t=[];return e.traverse(n=>{n.isMesh&&t.push(n)}),t}var Dd=[],M1=w1(function({sceneConfig:t,selectedObjectRef:n,highlightOnHover:i=!1,disabled:r=!1,onOutlineEffect:o}){let a=ll(M=>M.scene),s=ll(M=>M.gl),c=Am(null),l=t?.postProcessing,u=n??null,d=l?.outline.enabled===!0,h=d||i,[g,f]=Em(()=>s.xr?.isPresenting??!1);km(()=>{let M=s.xr;if(!M)return;let T=()=>f(!0),R=()=>f(!1);return M.addEventListener("sessionstart",T),M.addEventListener("sessionend",R),f(M.isPresenting),()=>{M.removeEventListener("sessionstart",T),M.removeEventListener("sessionend",R)}},[s]);let v=a.children.filter(M=>M.isLight),_=Ga(()=>new Ua(l?.chromaticAberration.offsetX??.002,l?.chromaticAberration.offsetY??.002),[l?.chromaticAberration.offsetX,l?.chromaticAberration.offsetY]),y=Ga(()=>new cl(l?.outline.visibleEdgeColor??"#ffffff").getHex(),[l?.outline.visibleEdgeColor]),p=Ga(()=>new cl(l?.outline.hiddenEdgeColor??"#22090a").getHex(),[l?.outline.hiddenEdgeColor]),m=Ga(()=>Bd(l?.ramp.startColor??"#000000"),[l?.ramp.startColor]),S=Ga(()=>Bd(l?.ramp.endColor??"#ffffff"),[l?.ramp.endColor]);return!l||g||r?null:Od(_1,{children:[l.godRays.enabled===!0&&Od("mesh",{ref:c,position:l.godRays.sunPosition,visible:!1,frustumCulled:!1,children:[vt("sphereGeometry",{args:[.1,8,8]}),vt("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),Od(i1,{multisampling:0,enableNormalPass:l.ssao.enabled===!0,autoClear:!1,children:[l.smaa.enabled===!0&&vt(f1,{}),l.ssao.enabled===!0&&vt(b1,{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&&vt(Jv,{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&&vt(n1,{focusDistance:l.depthOfField.focusDistance,focusRange:l.depthOfField.focusRange,focalLength:l.depthOfField.focalLength,bokehScale:l.depthOfField.bokehScale}),l.bloom.enabled===!0&&vt(Qv,{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&&vt(m1,{selection:u??void 0,lights:v,selectionLayer:l.selectiveBloom.selectionLayer,intensity:l.selectiveBloom.intensity,luminanceThreshold:l.selectiveBloom.luminanceThreshold,luminanceSmoothing:l.selectiveBloom.luminanceSmoothing,kernelSize:sl(l.selectiveBloom.kernelSize),mipmapBlur:l.selectiveBloom.mipmapBlur,inverted:l.selectiveBloom.inverted,ignoreBackground:l.selectiveBloom.ignoreBackground}),h&&vt(d1,{ref:o,selection:Dd,selectionLayer:l.outline.selectionLayer,blendFunction:Fa.SCREEN,edgeStrength:d?l.outline.edgeStrength:Vi.edgeStrength,pulseSpeed:d?l.outline.pulseSpeed:Vi.pulseSpeed,visibleEdgeColor:d?y:Vi.visibleEdgeColor,hiddenEdgeColor:d?p:Vi.hiddenEdgeColor,kernelSize:d?sl(l.outline.kernelSize):Vi.kernelSize,blur:d?l.outline.blur:Vi.blur,xRay:d?l.outline.xRay:Vi.xRay}),l.chromaticAberration.enabled===!0&&vt(e1,{offset:_,radialModulation:l.chromaticAberration.radialModulation,modulationOffset:l.chromaticAberration.modulationOffset}),l.colorAverage.enabled===!0&&vt(t1,{}),l.dotScreen.enabled===!0&&vt(r1,{angle:l.dotScreen.angle,scale:l.dotScreen.scale}),l.glitch.enabled===!0&&vt(o1,{mode:Pm(l.glitch.mode),delay:new Ua(l.glitch.delay[0],l.glitch.delay[1]),duration:new Ua(l.glitch.duration[0],l.glitch.duration[1]),strength:new Ua(l.glitch.strength[0],l.glitch.strength[1]),chromaticAberrationOffset:new Ua(l.glitch.chromaticAberrationOffset[0],l.glitch.chromaticAberrationOffset[1]),columns:l.glitch.columns,ratio:l.glitch.ratio,active:!0}),l.grid.enabled===!0&&vt(s1,{scale:l.grid.scale,lineWidth:l.grid.lineWidth}),l.lensflare.enabled===!0&&vt(Mm,{config:l.lensflare}),l.godRays.enabled===!0&&vt(a1,{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:sl(l.godRays.kernelSize)}),l.noise.enabled===!0&&vt(c1,{premultiply:l.noise.premultiply,opacity:l.noise.opacity,blendFunction:Fa.ADD}),l.brightnessContrast.enabled===!0&&vt(Zv,{brightness:l.brightnessContrast.brightness,contrast:l.brightnessContrast.contrast}),l.hueSaturation.enabled===!0&&vt(l1,{hue:l.hueSaturation.hue,saturation:l.hueSaturation.saturation}),l.toneMapping.enabled===!0&&vt(ym,{exposure:l.toneMapping.exposure}),l.vignette.enabled===!0&&vt(y1,{eskil:l.vignette.eskil,offset:l.vignette.offset,darkness:l.vignette.darkness,blendFunction:Fa.NORMAL}),l.toneMapping.enabled===!0&&vt(x1,{mode:Tm(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&&vt(g1,{intensity:l.sepia.intensity,blendFunction:Fa.NORMAL}),l.scanline.enabled===!0&&vt(h1,{density:l.scanline.density,blendFunction:Fa.OVERLAY}),l.pixelation.enabled===!0&&vt(u1,{granularity:l.pixelation.granularity}),l.ramp.enabled===!0&&vt(p1,{rampType:_m(l.ramp.rampType),rampStart:l.ramp.rampStart,rampEnd:l.ramp.rampEnd,startColor:m,endColor:S,opacity:l.ramp.rampMask?1:l.ramp.opacity??.5,rampBias:l.ramp.rampBias,rampGain:l.ramp.rampGain,rampMask:l.ramp.rampMask,rampInvert:l.ramp.rampInvert})]})]})});function T1(e){let t=[e];for(;t.length>0;){let n=t.pop();if(n.visible){if(n.isMesh)return!0;t.push(...n.children)}}return!1}function P1(e,t){return e.length===t.length&&e.every((n,i)=>n===t[i])}function Rm({hoveredObjectRef:e,...t}){let n=ll(c=>c.scene),i=ll(c=>c.invalidate),[r,o]=Em(null),a=C1(c=>o(c),[]),s=Am({effect:null,objects:Dd});return km(()=>{if(!r)return;let l=t.sceneConfig?.postProcessing?.outline.enabled===!0?S1(n):e&&T1(e)?[e]:Dd;s.current.effect===r&&P1(s.current.objects,l)||(s.current={effect:r,objects:l},r.selection.set(l),i())}),vt(M1,{...t,onOutlineEffect:a})}import{Component as k1}from"react";var dl=class extends k1{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n,i){this.props.onError?.(n)}render(){return this.state.hasError?this.props.fallback??null:this.props.children}};import{Fragment as V1,jsx as Fn,jsxs as Lm}from"react/jsx-runtime";var z1=1.5;function j1({captureRef:e}){let{gl:t,scene:n,camera:i,invalidate:r}=E1();return N1(()=>{if(e)return e.current={gl:t,scene:n,camera:i,invalidate:r},()=>{e.current=null}},[e,t,n,i,r]),null}function Nd({children:e,camera:t,backgroundColor:n,shadows:i=!0,sceneConfig:r,selectedObjectRef:o,hoveredObjectRef:a,highlightOnHover:s,renderMode:c="demand",maxDpr:l=2,xrStore:u,rendererCaptureRef:d,preserveDrawingBuffer:h=!1,reduceGpuLoad:g}){let f=g??yd(),v=f?Math.min(l,z1):l,_=i&&!f,y=ul(()=>n?{background:n}:r?.background.enabled?r.background.type==="color"?{background:r.background.color}:r.background.type==="image"&&r.background.imageUrl.trim()?{backgroundImage:`url("${r.background.imageUrl}")`,backgroundPosition:"center",backgroundRepeat:"no-repeat",backgroundSize:"cover"}:{background:"linear-gradient(180deg, #3a3a3c 0%, #1c1c1d 100%)"}:{background:"transparent"},[n,r]),p=ul(()=>{if(n)return n;let x=r?.background;if(x?.enabled){if(x.type==="color")return x.color;if(x.type==="image"&&x.imageUrl.trim()||x.type==="environment")return null}return"#1c1c1d"},[n,r]),m=ul(()=>{let x=r?.postProcessing;return x?!!(x.glitch.enabled||x.noise.enabled||x.lensflare.enabled&&x.lensflare.animated):!1},[r?.postProcessing]),[S,M]=I1(!1),T=r?.environment,R=r?.groundShadows,b=ul(()=>{if(!T)return null;if(T.source==="custom"){let x=T.customEnvironmentUrl.trim();return qs(x)?{files:x}:null}return{preset:T.preset}},[T]),C=Lm(V1,{children:[Fn(j1,{captureRef:d}),Fn(sm,{cameraConfig:t}),Fn(im,{active:m}),Fn(om,{color:p}),b?Fn(dl,{onError:x=>console.warn("Failed to load environment map:",x),children:Fn(D1,{fallback:null,children:Fn(L1,{...b,environmentIntensity:T?.intensity??.25,backgroundIntensity:T?.intensity??.25,background:r?.background.enabled===!0&&r.background.type==="environment"})})}):null,Fn(am,{rotation:T?.rotation??0}),u&&Fn(rm,{onPresentingChange:M}),R?.enabled&&R.mode==="shadowCatcher"&&!S&&Fn(R1,{position:[0,R.height,0],scale:R.size,opacity:R.intensity,blur:R.borderFade,far:15,resolution:1024,color:"#000000"}),e,Fn(Rm,{sceneConfig:r,selectedObjectRef:o,hoveredObjectRef:a,highlightOnHover:s,disabled:f})]});return Fn(A1,{frameloop:c,dpr:[1,v],shadows:_?"soft":!1,resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:y,camera:t??{fov:50},gl:{preserveDrawingBuffer:h,toneMapping:O1,toneMappingExposure:1},children:u?Lm(B1,{store:u,children:[Fn(nm,{renderMode:c}),C]}):C})}import{CameraControls as F1}from"@react-three/drei";import{useEffect as U1}from"react";import{jsx as G1}from"react/jsx-runtime";function Id({controlsRef:e,onCameraChange:t}){return U1(()=>{if(!t||!e||typeof e!="object"||!("current"in e))return;let n=e.current;if(!n)return;let i=()=>{t(n.camera,n)};return n.addEventListener("update",i),()=>{n.removeEventListener("update",i)}},[e,t]),G1(F1,{ref:e,makeDefault:!0,smoothTime:.3,dollyToCursor:!0})}import{useRef as jd,useMemo as pl,useEffect as W1}from"react";import{useFrame as $1,useThree as Bm}from"@react-three/fiber";import{Vector3 as X1}from"three";var zd=Symbol("react-immersive.model-node-id");function H1(e,t){Object.defineProperty(e,zd,{value:t,configurable:!0})}function zo(e){let t=new Map;e.traverse(c=>{if(!c.name)return;let l=t.get(c.name);l?l.push(c):t.set(c.name,[c])});let n=Object.create(null),i=new WeakMap,r=new Map,o=new Set(Array.from(t,([c,l])=>l.length===1?c:null).filter(c=>c!==null)),a=new Set,s=(c,l)=>{H1(c,l),n[l]=c,i.set(c,l),a.add(l)};for(let[c,l]of t)l.length===1&&s(l[0],c);for(let[c,l]of t){if(l.length<2)continue;let u=[];l.forEach((d,h)=>{let g=`${c} [${h+1}]`,f=g,v=2;for(;o.has(f)||a.has(f);)f=`${g}.${v++}`;s(d,f),u.push(f)}),r.set(c,u)}return{nodesById:n,idByNode:i,duplicateNames:r}}function Ha(e){return e[zd]??e.name??null}function gr(e,t){let n=null,i=[];return e.traverse(r=>{r[zd]===t&&(n=r),r.name===t&&i.push(r)}),n??(i.length===1?i[0]:null)}import{Fragment as Z1,jsx as Fi,jsxs as ew}from"react/jsx-runtime";function Dm(e,t){if(!t)return e;let n=t*Math.PI/180,i=Math.cos(n),r=Math.sin(n);return[e[0]*i+e[2]*r,e[1],-e[0]*r+e[2]*i]}function q1(e,t){let[n,i,r]=e.center,o=e.radius,a=Math.hypot(t[0],t[1],t[2]),s=a>1e-6?[t[0]/a,t[1]/a,t[2]/a]:[0,1,0],c=o*2;return{position:[n+s[0]*c,i+s[1]*c,r+s[2]*c],target:e.center,extent:o,near:Math.max(o/100,.001),far:c+o*2}}function Y1(e,t){let n=t[0]-e.center[0],i=t[1]-e.center[1],r=t[2]-e.center[2],o=Math.hypot(n,i,r);return{near:Math.max(o-e.radius,o*.01,.001),far:o+e.radius*2}}function K1(e,t,n){return t&&n&&!e.attachedToCamera?n.center:[0,0,0]}var J1={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}]},Q1={enabled:!0,mapSize:2048,bias:-5e-4,normalBias:.02,radius:3};function Om({light:e,shadows:t,shadowsEnabled:n,environmentRotation:i,modelBounds:r,objectBindings:o,nodeRefs:a}){let s=jd(null),c=jd(null),l=jd(null),u=Bm(y=>y.camera),d=Bm(y=>y.scene),h=pl(()=>new X1,[]),g=pl(()=>e.attachedToCamera||e.attachment?e.position:Dm(e.position,i),[e.position,e.attachedToCamera,e.attachment,i]);$1(()=>{let y=s.current??c.current??l.current;if(!y)return;if(e.attachedToCamera){y.position.copy(u.position);return}let p=e.attachment;if(!p)return;let m=o?xn(o,p.objectId):null,M=(m?o?.[m]:void 0)?.modelObjectId??p.objectId,T=(m?a?.current[m]:void 0)??gr(d,M);T&&(h.fromArray(p.offset),T.localToWorld(h),y.position.copy(h))});let f=n&&t.enabled&&e.castShadow,v=pl(()=>e.type==="directional"&&f&&r&&!e.attachedToCamera?q1(r,g):null,[e.type,e.attachedToCamera,f,r,g]),_=pl(()=>e.type==="spot"&&f&&r&&!e.attachedToCamera?Y1(r,g):null,[e.type,e.attachedToCamera,f,r,g]);return W1(()=>{let y=s.current??l.current;if(!y)return;let[p,m,S]=K1(e,f,r);y.target.position.set(p,m,S),y.target.updateMatrixWorld()},[e,f,r]),!e.visible||e.type==="none"?null:e.type==="directional"?Fi("directionalLight",{ref:s,color:e.color,intensity:e.intensity,position:v?.position??g,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":v?.near??.5,"shadow-camera-far":v?.far??40,"shadow-camera-left":-(v?.extent??8),"shadow-camera-right":v?.extent??8,"shadow-camera-top":v?.extent??8,"shadow-camera-bottom":-(v?.extent??8)}):e.type==="point"?Fi("pointLight",{ref:c,color:e.color,intensity:e.intensity,position:g,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"?Fi("spotLight",{ref:l,color:e.color,intensity:e.intensity,position:g,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":_?.near??.5,"shadow-camera-far":_?.far??40}):e.type==="hemisphere"?Fi("hemisphereLight",{color:e.color,groundColor:"#444444",intensity:e.intensity}):null}function Vd({lightingConfig:e,shadowConfig:t,shadowsEnabled:n=!0,environmentRotation:i=0,environmentConfig:r,modelBounds:o,objectBindings:a,nodeRefs:s}){let c=e??J1,l=t??Q1,u=r?.shadowLight,d=Dm([5,10,5],i);return ew(Z1,{children:[Fi("ambientLight",{intensity:c.ambient.intensity,color:c.ambient.color}),c.lights.map(h=>Fi(Om,{light:h,shadows:l,shadowsEnabled:n,environmentRotation:i,modelBounds:o,objectBindings:a,nodeRefs:s},h.id)),u?.enabled&&Fi(Om,{light:{id:"light-env-shadow",type:"directional",color:"#ffffff",intensity:u.intensity,position:d,attachedToCamera:!1,castShadow:!0,shadowBias:u.bias,visible:!0},shadows:l,shadowsEnabled:n,environmentRotation:0,modelBounds:o,objectBindings:a,nodeRefs:s})]})}import{useState as Qw,useEffect as Gt,useRef as ln,useMemo as yn}from"react";import{useFrame as Qd,useThree as Zw}from"@react-three/fiber";import{useLoader as Zm,useThree as Cw}from"@react-three/fiber";import{FileLoader as Sw,Loader as Mw,LoadingManager as Tw}from"three";import{FBXLoader as Pw,GLTFLoader as _w,MTLLoader as kw,OBJLoader as Aw}from"three-stdlib";import{USDLoader as Ew}from"three/examples/jsm/loaders/USDLoader.js";import{strFromU8 as tw,strToU8 as nw,unzip as rw}from"fflate";var Nm;function Im(e){Nm=e}function Wa(e){Nm?.(e)}var iw=[".glb",".gltf",".obj",".fbx",".usdz",".zip"],ow=["model/gltf-binary","model/gltf+json","model/vnd.usdz+zip","application/vnd.usdz+zip","application/zip","application/x-zip-compressed"],$a=1024*1024,zm=128*$a,jm=1024,Vm=128*$a,Fm=256*$a,Um=200,aw=$a,Vr=new Map,hl=".glb,.gltf,.obj,.fbx,.usdz,.zip,model/gltf-binary,model/gltf+json,model/vnd.usdz+zip,application/vnd.usdz+zip,application/zip";function Ud(e){let t=e.split(/[?#]/,1)[0].toLowerCase();return t.endsWith(".obj")?"obj":t.endsWith(".fbx")?"fbx":t.endsWith(".usdz")?"usdz":t.endsWith(".gltf")?"gltf":"glb"}function $m(e){return Vr.get(e)??{format:Ud(e)}}function sw(e){let t=e.name.toLowerCase();return iw.some(n=>t.endsWith(n))||ow.includes(e.type)}async function ml(e){if(!sw(e))throw new Error("Unsupported model file. Please upload a .glb, .gltf, .obj, .fbx, .usdz, or .zip asset.");let t=e.name.toLowerCase();if(t.endsWith(".usdz")||e.type==="model/vnd.usdz+zip"||e.type==="application/vnd.usdz+zip")return Gm(e,"usdz");if(t.endsWith(".zip")||lw(e.type))return cw(e);if(t.endsWith(".gltf")||e.type==="model/gltf+json")return Hm(e);let n=Ud(e.name);return n==="gltf"?Hm(e):Gm(e,n)}function Gm(e,t){let n=URL.createObjectURL(e);return Vr.set(n,{format:t,entryPath:e.name}),{url:n,name:e.name,format:t,cleanup:()=>{Wa(n),Vr.delete(n),URL.revokeObjectURL(n)}}}function lw(e){return e==="application/zip"||e==="application/x-zip-compressed"}async function Hm(e){let t=await e.text(),n=Xm(t,e.name);for(let r of qm(n))if(!Gd(r))throw new Error(`${e.name} references external assets. Upload a .zip containing the .gltf file and its dependencies.`);let i=URL.createObjectURL(e);return Vr.set(i,{format:"gltf",entryPath:e.name}),{url:i,name:e.name,format:"gltf",cleanup:()=>{Wa(i),Vr.delete(i),URL.revokeObjectURL(i)}}}async function cw(e){if(e.size>zm)throw new Error(`Model zip is too large. The compressed archive must be ${Fd(zm)} or smaller.`);let t=await dw(new Uint8Array(await e.arrayBuffer())),n=new Map;for(let[a,s]of Object.entries(t)){let c=Hd(a);!c||Ym(c)||n.set(c,s)}let i=[...n.keys()].filter(a=>/\.(gltf|obj|fbx)$/i.test(a));if(i.length===0)throw new Error("Invalid model zip: no .gltf, .obj, or .fbx file found.");if(i.length>1)throw new Error("Invalid model zip: multiple model entry files found.");let r=i[0],o=Ud(r);if(o==="gltf")return pw(e,r,n);if(o==="obj"||o==="fbx")return uw(e,r,o,n);throw new Error(`Unsupported model entry ${r}.`)}function dw(e){return new Promise((t,n)=>{let i=0,r=0,o=null,a=c=>(o??(o=new Error(`Invalid model zip: ${c}`)),!1);rw(e,{filter:c=>{if(o)return!1;if(i+=1,i>jm)return a(`archive contains more than ${jm.toLocaleString()} entries.`);if(c.originalSize>Vm)return a(`${c.name} expands beyond the ${Fd(Vm)} per-file limit.`);if(r+=c.originalSize,r>Fm)return a(`expanded contents exceed ${Fd(Fm)}.`);if(c.originalSize>=aw&&(c.size===0||c.originalSize/c.size>Um))return a(`${c.name} exceeds the ${Um}:1 compression-ratio limit.`);let l=Hd(c.name);return!!l&&!Ym(l)}},(c,l)=>{o?n(o):c?n(new Error(`Invalid model zip: ${c.message}`)):t(l)})})}function Fd(e){return`${e/$a} MiB`}function uw(e,t,n,i){let r=[],o={};for(let[s,c]of i){let l=URL.createObjectURL(new Blob([c],{type:Km(s)}));r.push(l),o[s]=l}let a=o[t];if(!a)throw r.forEach(s=>URL.revokeObjectURL(s)),new Error(`Invalid model zip: could not read ${t}.`);return Vr.set(a,{format:n,entryPath:t,resourceUrls:o}),{url:a,name:e.name,format:n,cleanup:()=>{Wa(a),Vr.delete(a),r.forEach(s=>URL.revokeObjectURL(s))}}}function pw(e,t,n){let i=n.get(t);if(!i)throw new Error("Invalid GLTF zip: no .gltf found.");let r=Xm(tw(i),t);hw(r,t);let o=mw(t),a=[];try{Wm(r.buffers,o,n,a),Wm(r.images,o,n,a);let s=new Blob([nw(JSON.stringify(r))],{type:"model/gltf+json"}),c=URL.createObjectURL(s);return a.push(c),Vr.set(c,{format:"gltf",entryPath:t}),{url:c,name:e.name,format:"gltf",cleanup:()=>{Wa(c),Vr.delete(c),a.forEach(l=>URL.revokeObjectURL(l))}}}catch(s){throw a.forEach(c=>URL.revokeObjectURL(c)),s}}function Wm(e,t,n,i){for(let r of e??[]){if(typeof r.uri!="string"||Gd(r.uri))continue;let o=gw(t,r.uri),a=n.get(o);if(!a)throw new Error(`Invalid GLTF zip: missing referenced asset ${r.uri}.`);let s=URL.createObjectURL(new Blob([a],{type:Km(o)}));i.push(s),r.uri=s}}function Xm(e,t){try{return JSON.parse(e)}catch{throw new Error(`${t} is not a valid .gltf JSON file.`)}}function qm(e){return[...e.buffers??[],...e.images??[]].map(t=>t.uri).filter(t=>typeof t=="string"&&t.length>0)}function hw(e,t){for(let n of qm(e)){if(Gd(n))continue;let i=/^[a-z][a-z0-9+.-]*:/i.test(n),r=n.startsWith("/")||n.startsWith("\\");if(i||r)throw new Error(`${t} references external assets. Include every dependency inside the uploaded .zip.`)}}function Gd(e){return e.startsWith("data:")}function Hd(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(i=>i&&i!==".")){if(n===".."){t.pop();continue}t.push(n)}return t.join("/")}function Ym(e){let t=e.split("/");return e.endsWith("/")||t.includes("__MACOSX")||t.some(n=>n===".DS_Store"||n.startsWith("._"))}function mw(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t)}function gw(e,t){let n=t.split(/[?#]/)[0],i=fw(n);return Hd(e?`${e}/${i}`:i)}function fw(e){try{return decodeURI(e)}catch{return e}}function Km(e){let t=e.toLowerCase();return t.endsWith(".obj")||t.endsWith(".mtl")?"text/plain":t.endsWith(".fbx")?"application/octet-stream":t.endsWith(".usdz")?"model/vnd.usdz+zip":t.endsWith(".bin")?"application/octet-stream":t.endsWith(".png")?"image/png":t.endsWith(".jpg")||t.endsWith(".jpeg")?"image/jpeg":t.endsWith(".webp")?"image/webp":t.endsWith(".avif")?"image/avif":t.endsWith(".ktx2")?"image/ktx2":"application/octet-stream"}import{useGLTF as fR}from"@react-three/drei";import{useThree as xR}from"@react-three/fiber";import{useMemo as vR}from"react";import{SRGBColorSpace as bw}from"three";import{DRACOLoader as xw,KTX2Loader as yw,MeshoptDecoder as vw}from"three-stdlib";function ww(e){return{name:"RI_unlit_emissive_texture",async afterRoot(t){let n=e.json.materials??[],i=new Map;if(n.forEach(o=>{let a=!!o?.extensions?.KHR_materials_unlit,s=!!o?.pbrMetallicRoughness?.baseColorTexture;a&&!s&&o?.emissiveTexture&&o.name&&i.set(o.name,o.emissiveTexture.index)}),i.size===0||!t.scene)return;let r=new Map;await Promise.all([...i].map(async([o,a])=>{let s=await e.getDependency("texture",a);s&&(s.colorSpace=bw,r.set(o,s))})),t.scene.traverse(o=>{let a=Array.isArray(o.material)?o.material:o.material?[o.material]:[];for(let s of a){let c=s.name?r.get(s.name):void 0;c&&!s.map&&(s.map=c,s.needsUpdate=!0)}})}}}var Wd="https://assets.react-immersive.liveroom.dev/three-r184/draco/",$d="https://assets.react-immersive.liveroom.dev/three-r184/basis/";function Jm(e,t={},n){let{dracoDecoderPath:i=Wd,ktx2TranscoderPath:r=$d,meshopt:o=!0}=t;if(i){let a=new xw;a.setDecoderPath(i),e.setDRACOLoader(a)}if(o&&e.setMeshoptDecoder(vw),r&&n){let a=new yw().setTranscoderPath(r).detectSupport(n);e.setKTX2Loader(a)}e.register((a=>ww(a)))}var gl=class extends Mw{constructor(){super(...arguments);this.options={source:{format:"glb"}}}configure(n){return this.options=n,this}load(n,i,r,o){this.loadAsset(n,r).then(i).catch(o)}async loadAsset(n,i){let r=Lw(this.options.source),{format:o}=this.options.source;if(o==="obj")return Rw(n,r,this.options.source,i);if(o==="fbx"){let c=Xd(this,new Pw(r)),l=Dw(n,this.options.source);l&&c.setResourcePath(l);let u=await c.loadAsync(n,i);return qd(u,"FBXMesh",!1),{scene:u,animations:u.animations??[]}}if(o==="usdz"){let l=await Xd(this,new Ew(r)).loadAsync(n,i);return qd(l,"USDZMesh",!1),{scene:l,animations:l.animations??[]}}let a=Xd(this,new _w(r));Jm(a,this.options.decoderConfig,this.options.renderer);let s=await a.loadAsync(n,i);return{scene:s.scene,animations:s.animations??[]}}};Im(e=>{Zm.clear(gl,e)});function xl(e,t={},n){let i=Cw(a=>a.gl),r=$m(e),o=n?{...r,format:n}:r;return Zm(gl,e,a=>{a.configure({source:o,decoderConfig:t,renderer:i})})}async function Rw(e,t,n,i){let r=await Qm(e,t,i),o=new Aw(t),a=Bw(r);if(a){let c=Ow(a,e,n);if(c)try{let l=await Qm(c.url,t),d=new kw(t).parse(l,c.basePath);d.preload(),o.setMaterials(d)}catch(l){console.warn(`[react-immersive] Could not load OBJ material ${a}; rendering geometry with fallback materials.`,l)}}let s=o.parse(r);return qd(s,"OBJMesh",!0),{scene:s,animations:[]}}function qd(e,t,n){let i=new Set,r=0;e.traverse(o=>{if(!("isMesh"in o&&o.isMesh===!0)){o.name&&i.add(o.name);return}let s=o.name||`${t}_${++r}`;if(!n&&o.name){i.add(o.name);return}let c=s,l=2;for(;i.has(c);)c=`${s}_${l++}`;o.name=c,i.add(c)})}function Qm(e,t,n){let i=new Sw(t);return i.setResponseType("text"),i.loadAsync(e,n)}function Xd(e,t){return t.setCrossOrigin(e.crossOrigin),t.setWithCredentials(e.withCredentials),t.setRequestHeader(e.requestHeader),t}function Lw(e){let t=new Tw,n=e.resourceUrls;return n&&t.setURLModifier(i=>{if(/^(?:blob:|data:)/i.test(i))return i;let r=bl(tg(i).split(/[?#]/)[0]),o=n[r];if(o)return o;let a=fl(e.entryPath??""),s=bl(a?`${a}/${r}`:r);return n[s]??i}),t}function Bw(e){return/^\s*mtllib\s+(.+?)\s*$/im.exec(e)?.[1]?.trim()||null}function Ow(e,t,n){if(n.resourceUrls&&n.entryPath){let i=bl(`${fl(n.entryPath)}/${tg(e)}`),r=n.resourceUrls[i];if(!r)return null;let o=fl(i);return{url:r,basePath:o?`${o}/`:""}}try{let i=new URL(e,t).href;return{url:i,basePath:eg(i)}}catch{return null}}function Dw(e,t){if(t.resourceUrls&&t.entryPath){let n=fl(t.entryPath);return n?`${n}/`:""}return eg(e)}function eg(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t+1)}function fl(e){let t=bl(e),n=t.lastIndexOf("/");return n===-1?"":t.slice(0,n)}function bl(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(i=>i&&i!=="."))n===".."?t.pop():t.push(n);return t.join("/")}function tg(e){try{return decodeURI(e)}catch{return e}}import{MeshStandardMaterial as eC,MeshBasicMaterial as Zd,MeshNormalMaterial as tC,MeshMatcapMaterial as nC,DoubleSide as rC,NormalBlending as iC,AnimationMixer as oC,LoopOnce as aC,LoopRepeat as sC,Box3 as kl,Vector3 as Gi,Matrix4 as lC,MathUtils as Al}from"three";import{SkeletonUtils as cC}from"three-stdlib";function ng(e){let t=new Map;return e.map((n,i)=>{let o=n.name.trim()||`Animation ${i+1}`,a=t.get(o)??0;return t.set(o,a+1),{clip:n,sourceName:a===0?o:`${o} (${a+1})`,duration:n.duration}})}import{AdditiveBlending as Nw,BackSide as Iw,DoubleSide as zw,FrontSide as jw,NoColorSpace as Vw,NormalBlending as Fw,SRGBColorSpace as Uw,Vector2 as rg}from"three";function ig(e){return!!(e&&typeof e=="object"&&"clone"in e&&"color"in e&&"metalness"in e&&"roughness"in e)}function og(e){return!!(e&&typeof e=="object"&&"isMeshPhysicalMaterial"in e&&e.isMeshPhysicalMaterial)}function Zn(e){return!!(e&&"isMesh"in e&&e.isMesh)}var Xa=["texture","metalnessMap","roughnessMap","emissiveMap","alphaMap","normalMap","bumpMap","aoMap","displacementMap","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","anisotropyMap","transmissionMap","thicknessMap","sheenColorMap","sheenRoughnessMap","specularIntensityMap","specularColorMap"],Gw=new Set(["texture","emissiveMap","sheenColorMap","specularColorMap"]);function Ui(e){return Gw.has(e)?Uw:Vw}function Ot(e,t){return e?.[t]?.path}function ag(e){return e==="back"?Iw:e==="double"?zw:jw}function sg(e){return e==="additive"?Nw:Fw}function Fr(e,t=1,n=t){if(e&&typeof e=="object"){let i=e;if(typeof i.x=="number"&&Number.isFinite(i.x)&&typeof i.y=="number"&&Number.isFinite(i.y))return new rg(i.x,i.y)}return new rg(t,n)}function Yd(e){return Number.isFinite(e)&&e>0?e:1}function yl(e,t){return e?.animations.clips.find(n=>n.sourceName===t)}function lg(e){return e?.loopMode??"repeat"}import{Color as Kd,MeshPhysicalMaterial as Hw,MeshStandardMaterial as Ww,Texture as Jd}from"three";function jo(e){if(ig(e))return e;if(!e||typeof e!="object")return null;let t=e,n=new Ww;typeof t.name=="string"&&(n.name=t.name),n.metalness=0,n.roughness=1,t.type==="MeshBasicMaterial"||t.isMeshBasicMaterial===!0?(n.color.set(0),n.emissiveIntensity=1,t.map instanceof Jd?(n.emissiveMap=t.map,n.emissive.set(16777215)):t.color instanceof Kd&&n.emissive.copy(t.color)):(t.color instanceof Kd&&n.color.copy(t.color),t.map instanceof Jd&&(n.map=t.map),t.emissive instanceof Kd&&n.emissive.copy(t.emissive),t.emissiveMap instanceof Jd&&(n.emissiveMap=t.emissiveMap));let r=["aoMap","aoMapIntensity","lightMap","lightMapIntensity","alphaMap","opacity","transparent","alphaTest","side","vertexColors","wireframe","depthTest","depthWrite","visible","toneMapped","fog"];for(let o of r)t[o]!==void 0&&(n[o]=t[o]);return n.needsUpdate=!0,n}function vl(e){if(og(e))return e.clone();let t=new Hw;return t.name=e.name,t.color.copy(e.color),t.map=e.map,t.lightMap=e.lightMap,t.lightMapIntensity=e.lightMapIntensity,t.aoMap=e.aoMap,t.aoMapIntensity=e.aoMapIntensity,t.emissive.copy(e.emissive),t.emissiveIntensity=e.emissiveIntensity,t.emissiveMap=e.emissiveMap,t.bumpMap=e.bumpMap,t.bumpScale=e.bumpScale,t.normalMap=e.normalMap,t.normalMapType=e.normalMapType,t.normalScale.copy(Fr(e.normalScale)),t.displacementMap=e.displacementMap,t.displacementScale=e.displacementScale,t.displacementBias=e.displacementBias,t.roughness=e.roughness,t.roughnessMap=e.roughnessMap,t.metalness=e.metalness,t.metalnessMap=e.metalnessMap,t.alphaMap=e.alphaMap,t.envMap=e.envMap,t.envMapRotation.copy(e.envMapRotation),t.envMapIntensity=e.envMapIntensity,t.wireframe=e.wireframe,t.wireframeLinewidth=e.wireframeLinewidth,t.flatShading=e.flatShading,t.fog=e.fog,t.opacity=e.opacity,t.transparent=e.transparent,t.alphaHash=e.alphaHash,t.blendSrc=e.blendSrc,t.blendDst=e.blendDst,t.blendEquation=e.blendEquation,t.blendSrcAlpha=e.blendSrcAlpha,t.blendDstAlpha=e.blendDstAlpha,t.blendEquationAlpha=e.blendEquationAlpha,t.blending=e.blending,t.premultipliedAlpha=e.premultipliedAlpha,t.dithering=e.dithering,t.alphaTest=e.alphaTest,t.depthTest=e.depthTest,t.depthWrite=e.depthWrite,t.colorWrite=e.colorWrite,t.stencilWrite=e.stencilWrite,t.stencilWriteMask=e.stencilWriteMask,t.stencilFunc=e.stencilFunc,t.stencilRef=e.stencilRef,t.stencilFuncMask=e.stencilFuncMask,t.stencilFail=e.stencilFail,t.stencilZFail=e.stencilZFail,t.stencilZPass=e.stencilZPass,t.side=e.side,t.shadowSide=e.shadowSide,t.toneMapped=e.toneMapped,t.vertexColors=e.vertexColors,t.visible=e.visible,t.clippingPlanes=e.clippingPlanes,t.clipIntersection=e.clipIntersection,t.clipShadows=e.clipShadows,t.forceSinglePass=e.forceSinglePass,t.polygonOffset=e.polygonOffset,t.polygonOffsetFactor=e.polygonOffsetFactor,t.polygonOffsetUnits=e.polygonOffsetUnits,t}function wl(e){e.userData.baseColor=e.color.clone(),e.userData.baseMap=e.map??null,e.userData.baseMetalness=e.metalness,e.userData.baseMetalnessMap=e.metalnessMap??null,e.userData.baseRoughness=e.roughness,e.userData.baseRoughnessMap=e.roughnessMap??null,e.userData.baseEmissive=e.emissive.clone(),e.userData.baseEmissiveIntensity=e.emissiveIntensity,e.userData.baseEmissiveMap=e.emissiveMap??null,e.userData.baseOpacity=e.opacity,e.userData.baseTransparent=e.transparent,e.userData.baseAlphaMap=e.alphaMap??null,e.userData.baseAlphaTest=e.alphaTest,e.userData.baseAlphaHash=e.alphaHash,e.userData.baseDithering=e.dithering,e.userData.baseBlending=e.blending,e.userData.baseDepthWrite=e.depthWrite,e.userData.baseSide=e.side,e.userData.baseNormalMap=e.normalMap??null,e.userData.baseNormalScale=Fr(e.normalScale),e.userData.baseBumpMap=e.bumpMap??null,e.userData.baseBumpScale=e.bumpScale,e.userData.baseAoMap=e.aoMap??null,e.userData.baseAoMapIntensity=e.aoMapIntensity,e.userData.baseDisplacementMap=e.displacementMap??null,e.userData.baseDisplacementScale=e.displacementScale,e.userData.baseDisplacementBias=e.displacementBias,e.userData.baseClearcoat=e.clearcoat,e.userData.baseClearcoatMap=e.clearcoatMap??null,e.userData.baseClearcoatRoughness=e.clearcoatRoughness,e.userData.baseClearcoatRoughnessMap=e.clearcoatRoughnessMap??null,e.userData.baseClearcoatNormalMap=e.clearcoatNormalMap??null,e.userData.baseClearcoatNormalScale=Fr(e.clearcoatNormalScale),e.userData.baseSheen=e.sheen,e.userData.baseSheenColor=e.sheenColor.clone(),e.userData.baseSheenColorMap=e.sheenColorMap??null,e.userData.baseSheenRoughness=e.sheenRoughness,e.userData.baseSheenRoughnessMap=e.sheenRoughnessMap??null,e.userData.baseAnisotropy=e.anisotropy,e.userData.baseAnisotropyRotation=e.anisotropyRotation,e.userData.baseAnisotropyMap=e.anisotropyMap??null,e.userData.baseTransmission=e.transmission,e.userData.baseTransmissionMap=e.transmissionMap??null,e.userData.baseThickness=e.thickness,e.userData.baseThicknessMap=e.thicknessMap??null,e.userData.baseAttenuationColor=e.attenuationColor.clone(),e.userData.baseAttenuationDistance=e.attenuationDistance,e.userData.baseReflectivity=e.reflectivity,e.userData.baseSpecularIntensity=e.specularIntensity,e.userData.baseSpecularIntensityMap=e.specularIntensityMap??null,e.userData.baseSpecularColor=e.specularColor.clone(),e.userData.baseSpecularColorMap=e.specularColorMap??null,e.userData.baseFlatShading=e.flatShading,e.userData.baseEnvMapIntensity=e.envMapIntensity}import{Color as Cl,FrontSide as $w,NormalBlending as cg,SRGBColorSpace as Sl}from"three";function Ml(e,t,n){e.map=e.userData.baseMap??null,e.color.copy(e.userData.baseColor),e.metalness=e.userData.baseMetalness??e.metalness,e.metalnessMap=e.userData.baseMetalnessMap??null,e.roughness=e.userData.baseRoughness??e.roughness,e.roughnessMap=e.userData.baseRoughnessMap??null,e.emissive.copy(e.userData.baseEmissive??new Cl(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??cg,e.depthWrite=e.userData.baseDepthWrite??!0,e.side=e.userData.baseSide??$w,e.normalMap=e.userData.baseNormalMap??null,e.normalScale.copy(Fr(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(Fr(e.userData.baseClearcoatNormalScale)),e.sheen=e.userData.baseSheen??e.sheen,e.sheenColor.copy(e.userData.baseSheenColor??new Cl(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 Cl("#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 Cl("#ffffff")),e.specularColorMap=e.userData.baseSpecularColorMap??null,e.flatShading=e.userData.baseFlatShading??e.flatShading,e.envMapIntensity=e.userData.baseEnvMapIntensity??e.envMapIntensity;let i=Ot(t,"texture"),r=Ot(t,"metalnessMap"),o=Ot(t,"roughnessMap"),a=Ot(t,"emissiveMap"),s=Ot(t,"alphaMap"),c=Ot(t,"normalMap"),l=Ot(t,"bumpMap"),u=Ot(t,"aoMap"),d=Ot(t,"displacementMap"),h=Ot(t,"clearcoatMap"),g=Ot(t,"clearcoatRoughnessMap"),f=Ot(t,"clearcoatNormalMap"),v=Ot(t,"anisotropyMap"),_=Ot(t,"transmissionMap"),y=Ot(t,"thicknessMap"),p=Ot(t,"sheenColorMap"),m=Ot(t,"sheenRoughnessMap"),S=Ot(t,"specularIntensityMap"),M=Ot(t,"specularColorMap");if(i?(e.map=Ut(i,Sl),e.color.set(n??"#ffffff")):n&&(e.map=null,e.color.set(n)),r&&(e.metalnessMap=Ut(r)),t?.metalness!==void 0&&(e.metalness=t.metalness),o&&(e.roughnessMap=Ut(o)),t?.roughness!==void 0&&(e.roughness=t.roughness),t?.emissive?e.emissive.set(t.emissive):a&&e.emissive.set("#ffffff"),t?.emissiveIntensity!==void 0&&(e.emissiveIntensity=t.emissiveIntensity),a&&(e.emissiveMap=Ut(a,Sl)),t?.opacity!==void 0&&(e.opacity=t.opacity),s&&(e.alphaMap=Ut(s)),t?.alphaTest!==void 0&&(e.alphaTest=t.alphaTest),t?.alphaHash!==void 0&&(e.alphaHash=t.alphaHash),t?.dithering!==void 0&&(e.dithering=t.dithering),t?.blendingMode&&(e.blending=sg(t.blendingMode),e.depthWrite=t.blendingMode!=="additive"),t?.side&&(e.side=ag(t.side)),c&&(e.normalMap=Ut(c)),c||t?.normalScale!==void 0){let T=t?.normalScale??Math.abs(Fr(e.userData.baseNormalScale).x);e.normalScale.set(T,t?.flipNormalY?-T:T)}if(l&&(e.bumpMap=Ut(l)),t?.bumpScale!==void 0&&(e.bumpScale=t.bumpScale),u&&(e.aoMap=Ut(u)),t?.aoMapIntensity!==void 0&&(e.aoMapIntensity=t.aoMapIntensity),d&&(e.displacementMap=Ut(d)),t?.displacementScale!==void 0&&(e.displacementScale=t.displacementScale),t?.displacementBias!==void 0&&(e.displacementBias=t.displacementBias),h&&(e.clearcoatMap=Ut(h)),t?.clearcoat!==void 0&&(e.clearcoat=t.clearcoat),g&&(e.clearcoatRoughnessMap=Ut(g)),t?.clearcoatRoughness!==void 0&&(e.clearcoatRoughness=t.clearcoatRoughness),f&&(e.clearcoatNormalMap=Ut(f)),f||t?.clearcoatNormalScale!==void 0){let T=t?.clearcoatNormalScale??Math.abs(Fr(e.userData.baseClearcoatNormalScale).x);e.clearcoatNormalScale.set(T,t?.flipClearcoatNormalY?-T:T)}t?.sheen!==void 0&&(e.sheen=t.sheen),t?.sheenColor&&e.sheenColor.set(t.sheenColor),p&&(e.sheenColorMap=Ut(p,Sl)),t?.sheenRoughness!==void 0&&(e.sheenRoughness=t.sheenRoughness),m&&(e.sheenRoughnessMap=Ut(m)),t?.anisotropy!==void 0&&(e.anisotropy=t.anisotropy),t?.anisotropyRotation!==void 0&&(e.anisotropyRotation=t.anisotropyRotation),v&&(e.anisotropyMap=Ut(v)),t?.transmission!==void 0&&(e.transmission=t.transmission),_&&(e.transmissionMap=Ut(_)),t?.thickness!==void 0&&(e.thickness=t.thickness),y&&(e.thicknessMap=Ut(y)),t?.attenuationColor&&e.attenuationColor.set(t.attenuationColor),t?.attenuationDistance!==void 0&&(e.attenuationDistance=t.attenuationDistance),t?.reflectivity!==void 0&&(e.reflectivity=t.reflectivity),t?.specularIntensity!==void 0&&(e.specularIntensity=t.specularIntensity),S&&(e.specularIntensityMap=Ut(S)),t?.specularColor&&e.specularColor.set(t.specularColor),M&&(e.specularColorMap=Ut(M,Sl)),e.transparent=e.opacity<1||e.transmission>0||e.blending!==cg||!!((s||e.alphaMap)&&e.alphaTest<=0),e.transparent||(e.depthWrite=!0)}function qa(e){return e.material}function Pr(e,t){return Array.isArray(e)?e.map(t):t(e,0)}function er(e,t){Array.isArray(e)?e.forEach(t):t(e,0)}function Tl(e,t){return Array.isArray(e)?e[t]:e}function Ya(e){e.updateMatrixWorld(!0),e.traverse(t=>{let n=t;n.isSkinnedMesh&&(n.skeleton?.update(),n.computeBoundingBox?.(),n.computeBoundingSphere?.())})}import{Matrix4 as Xw}from"three";function qw(e){return e.isSkinnedMesh===!0}function Vo(e){let t=[];return e.traverse(n=>{qw(n)&&t.push(n)}),t}var Ka="reactImmersiveSkinFreeze";function dg(e){return!!e.userData[Ka]}function Pl(e,t){let n=e.userData,i=new Xw().copy(t).invert(),r=n[Ka];if(r){r.frozenInverse.copy(i),e.bindMatrixInverse.copy(i);return}let o={frozenInverse:i,previousOnBeforeRender:e.onBeforeRender};e.bindMatrixInverse.copy(i),e.onBeforeRender=function(a,s,c,l,u,d){o.previousOnBeforeRender.call(this,a,s,c,l,u,d),e.bindMatrixInverse.copy(o.frozenInverse)},n[Ka]=o}function Fo(e){let t=e.userData,n=t[Ka];n&&(e.onBeforeRender=n.previousOnBeforeRender,delete t[Ka],e.updateMatrixWorld(!0))}import{useCallback as ug,useEffect as Yw,useRef as Kw}from"react";import{useThree as Jw}from"@react-three/fiber";function _l(){let e=Jw(r=>r.gl.domElement),t=Kw(void 0),n=ug(r=>{t.current===void 0&&(t.current=e.style.cursor),e.style.cursor=r},[e]),i=ug(()=>{let r=t.current;r!==void 0&&(e.style.cursor=r,t.current=void 0)},[e]);return Yw(()=>()=>{i()},[i]),{setCanvasCursor:n,restoreCanvasCursor:i}}import{jsx as pg}from"react/jsx-runtime";function El(e,t,n){let i=n.get(e);i&&(t?.position?e.position.fromArray(t.position):e.position.copy(i.position),t?.rotation?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2],i.rotation.order):e.rotation.copy(i.rotation),t?.scale?e.scale.fromArray(t.scale):e.scale.copy(i.scale),e.updateMatrix())}function Kt(e,t=!1){if(!e||typeof e!="object")return"-";let n=e;return[n.channel??0,t?n.format??"":"",n.isVideoTexture?n.colorSpace??"":""].join(":")}function Uo(e){let t=e,n=Number(t.clearcoat)>0,i=Number(t.sheen)>0,r=Number(t.anisotropy)>0,o=Number(t.transmission)>0,a=t.transparent===!1&&t.blending===iC&&t.alphaToCoverage!==!0;return[Kt(t.map),Kt(t.aoMap),Kt(t.lightMap),Kt(t.bumpMap),Kt(t.normalMap,!0),t.normalMap?t.normalMapType:"",Kt(t.displacementMap),Kt(t.emissiveMap),Kt(t.metalnessMap),Kt(t.roughnessMap),r,Kt(r?t.anisotropyMap:null),n,Kt(n?t.clearcoatMap:null),Kt(n?t.clearcoatNormalMap:null,!0),Kt(n?t.clearcoatRoughnessMap:null),i,Kt(i?t.sheenColorMap:null),Kt(i?t.sheenRoughnessMap:null),Kt(t.specularColorMap),Kt(t.specularIntensityMap),o,Kt(o?t.transmissionMap:null),Kt(o?t.thicknessMap:null),Kt(t.alphaMap),Number(t.alphaTest)>0,!!t.alphaHash,!!t.flatShading,!!t.dithering,t.side,a].join("|")}function eu({url:e,objectBindings:t,selectedItem:n,itemMaterials:i,onItemClick:r,onItemHover:o,onModelLoaded:a,onAnimationsReady:s,nodeRefsOut:c,onNodeRefsChange:l,materialRefsOut:u,panelHoveredItem:d,sceneConfig:h,zoomOnSelected:g=!0,highlightOnHover:f=!0,decoderConfig:v,modelFormat:_,explodeFactor:y=0,suspendBindingTransforms:p=!1}){let m=xl(e,v,_),S=Zw(k=>k.invalidate),[M,T]=Qw(null),R=ln(null),{setCanvasCursor:b,restoreCanvasCursor:C}=_l();Gt(()=>{f||(T(null),o?.(null),C())},[f,o,C]);let x=yn(()=>cC.clone(m.scene),[m.scene]),P=yn(()=>zo(x),[x]),I=P.nodesById;Gt(()=>{P.duplicateNames.size!==0&&console.warn("[react-immersive] Duplicate model node names were assigned unique binding IDs.",Object.fromEntries(P.duplicateNames))},[P]);let E=yn(()=>{let k=new WeakMap;return x.traverse(N=>{k.set(N,{position:N.position.clone(),rotation:N.rotation.clone(),scale:N.scale.clone()})}),k},[x]);Gt(()=>{let k=!1,N=null,H=null,J=window,X=Object.entries(I).filter(([,xt])=>Zn(xt)),se=new kl,ie=[],st=0;x.traverse(xt=>{Zn(xt)&&(xt.castShadow=!1,xt.receiveShadow=!0)});let pt=()=>{if(k)return;let xt=new Set,ge=se.getSize(new Gi),wt=new Gi;for(let{name:Xt,box:sn}of ie)sn.getSize(wt),wt.x>ge.x*.7&&wt.z>ge.z*.7&&wt.y>ge.y*.4&&xt.add(Xt);x.traverse(Xt=>{if(!Zn(Xt))return;let sn=Ha(Xt);Xt.castShadow=!sn||!xt.has(sn),Xt.receiveShadow=!0}),S()},ye=()=>{k||(J.requestIdleCallback?N=J.requestIdleCallback(Ie,{timeout:100}):H=window.setTimeout(()=>Ie(),0))},Ie=xt=>{if(N=null,H=null,k)return;let ge=performance.now(),wt=0;for(;st<X.length&&!(wt>0&&!(xt?xt.didTimeout?wt<16:xt.timeRemaining()>1:performance.now()-ge<8));){let[Xt,sn]=X[st];st+=1,wt+=1;let Rt=new kl().setFromObject(sn);Rt.isEmpty()||(ie.push({name:Xt,box:Rt}),se.union(Rt))}st<X.length?ye():pt()};return ye(),()=>{k=!0,N!==null&&J.cancelIdleCallback?.(N),H!==null&&window.clearTimeout(H)}},[S,I,x]),Gt(()=>{Ya(x)},[x]),Gt(()=>{let k=new AbortController;return Eo(x,k.signal),()=>{k.abort(),Di(x)}},[x]);let z=yn(()=>{let k={};for(let[N,H]of Object.entries(t))k[H.modelObjectId??N]=N;return k},[t]),A=yn(()=>Object.entries(t).map(([k,N])=>`${k}${N.modelObjectId??k}`).sort().join(""),[t]),F=yn(()=>Object.entries(t).map(([k,N])=>JSON.stringify([k,N.modelObjectId??k,N.transform??null])).sort().join(""),[t]),j=ln(new Map);Gt(()=>{let k=new Map,N=new Map;for(let[X,se]of Object.entries(t)){if(!se.transform)continue;let ie=I[se.modelObjectId??X];ie&&(k.set(ie,se.transform),N.set(ie,Vo(ie)))}let H=new Set([...j.current.keys(),...k.keys()]);for(let X of H){El(X,void 0,E);for(let se of Vo(X))Fo(se)}x.updateMatrixWorld(!0);let J=new Map;for(let X of N.values())for(let se of X)J.has(se)||J.set(se,se.matrixWorld.clone());for(let[X,se]of k)El(X,se,E);j.current=k,x.updateMatrixWorld(!0);for(let[X,se]of J)Pl(X,se);S()},[x,I,E,F,S]),Gt(()=>()=>{for(let k of Vo(x))Fo(k)},[x]);let L=yn(()=>{let k={};for(let[N,H]of Object.entries(t)){let J=H.modelObjectId??N,X=I[J];if(!Zn(X))continue;let se=qa(X);se&&(k[N]=Pr(se,ie=>{let st=jo(ie),pt=vl(st??new eC);return wl(pt),pt}))}return k},[I,A]);Gt(()=>{u&&(u.current=L)},[L,u]),Gt(()=>()=>{for(let k of Object.values(L))er(k,N=>N.dispose())},[L]);let B=h?.model.shading??"lit",G=h?.model.renderer??"pbr",U=h?.wireframe.enabled??!1,oe=h?.wireframe.color??"#93c5fd",ve=h?.wireframe.opacity??1,de=yn(()=>{let k={};if(B!=="unlit")return k;for(let[N,H]of Object.entries(L))k[N]=Pr(H,J=>{let X=new Zd;return X.color.copy(J.color),X.map=J.map,X.alphaMap=J.alphaMap,X.alphaTest=J.alphaTest,X.transparent=J.transparent,X.opacity=J.opacity,X.side=J.side,X});return k},[L,B]),we=yn(()=>{let k={};if(B!=="normals")return k;for(let[N,H]of Object.entries(L))k[N]=Pr(H,()=>new tC);return k},[L,B]),xe=yn(()=>{let k={};if(B!=="lit"||G!=="matcap")return k;let N=il();for(let[H,J]of Object.entries(L))k[H]=Pr(J,X=>{let se=new nC;return se.matcap=N,se.color.copy(X.color),se.alphaMap=X.alphaMap,se.alphaTest=X.alphaTest,se.side=X.side,se});return k},[L,B,G]);Gt(()=>()=>{for(let k of Object.values(de))er(k,N=>N.dispose());for(let k of Object.values(we))er(k,N=>N.dispose());for(let k of Object.values(xe))er(k,N=>N.dispose())},[de,we,xe]);let Ce=k=>B==="normals"?we[k]:B==="unlit"?de[k]:G==="matcap"?xe[k]:L[k],Ye=ln(a);Ye.current=a,Gt(()=>{Ye.current?.(x)},[x]);let gt=yn(()=>{let k={};for(let[N,H]of Object.entries(t)){let J=H.modelObjectId??N,X=I[J];X&&(k[N]=X)}return k},[I,A]);Gt(()=>(c.current=gt,l?.(),()=>{c.current===gt&&(c.current={})}),[gt,c,l]);let Fe=ln({});Gt(()=>()=>{for(let k of Object.values(Fe.current))for(let[N,H]of Object.entries(k))H&&ji(H,Ui(N));Fe.current={}},[]);let Ae=yn(()=>{let k=new Map;for(let[N,H]of Object.entries(t)){let J=d===H||d?.id===H.id||d?.modelObjectId===H.modelObjectId,X=f&&(M===N||J),se=X||n===N;(X||se)&&k.set(N,{emissive:X,matcap:se})}return k},[t,f,M,n,d]),Y=ln(Ae);Y.current=Ae,Gt(()=>{let k=new Set;for(let[N,H]of Object.entries(t)){k.add(N);let J=H.modelObjectId??N,X=I[J];if(!Zn(X))continue;X.visible=H.visible!==!1;let se=L[N];if(!se)continue;if(G!=="uv-checker"){let ge=Ce(N);ge&&(X.material=ge)}if(H.visible===!1)continue;let ie=de[N],st=xe[N],pt=i[N]??i[H.modelObjectId??N],ye=H.style?.material,Ie=Fe.current[N]??{};for(let ge of Xa){let wt=Ot(ye,ge),Xt=Ie[ge];if(Xt===wt)continue;let sn=Ui(ge);Xt&&ji(Xt,sn),wt?(rl(wt,sn,S),Ie[ge]=wt):delete Ie[ge]}Object.keys(Ie).length>0?Fe.current[N]=Ie:delete Fe.current[N];let xt=pt?.hex??ye?.baseColor;er(se,(ge,wt)=>{let Xt=Uo(ge);Ml(ge,ye,xt);let sn=ge.userData.reactImmersiveConfiguredEmissive;sn?.isColor?sn.copy(ge.emissive):ge.userData.reactImmersiveConfiguredEmissive=ge.emissive.clone();let Rt=Y.current.get(N);Rt?.emissive&&ge.emissive.add(Va),Xt!==Uo(ge)&&(ge.needsUpdate=!0);let Lt=Tl(ie,wt);if(Lt){let wr=Uo(Lt);Lt.color.copy(ge.color),Lt.map=ge.map,Lt.alphaMap=ge.alphaMap,Lt.alphaTest=ge.alphaTest,Lt.transparent=ge.transparent,Lt.opacity=ge.opacity,Lt.side=ge.side,wr!==Uo(Lt)&&(Lt.needsUpdate=!0)}let Qe=Tl(st,wt);if(Qe){let wr=Uo(Qe);Rt?.matcap?Qe.color.set(jr.color):Qe.color.copy(ge.color),Qe.map=ge.map,Qe.alphaMap=ge.alphaMap,Qe.alphaTest=ge.alphaTest,Qe.transparent=ge.transparent,Qe.opacity=ge.opacity,Qe.side=ge.side,wr!==Uo(Qe)&&(Qe.needsUpdate=!0)}})}for(let N of Object.keys(Fe.current))if(!k.has(N)){for(let[H,J]of Object.entries(Fe.current[N]))J&&ji(J,Ui(H));delete Fe.current[N]}S()},[t,I,L,de,we,xe,i,B,G,S]);let tt=ln(new Map);Gt(()=>{let k=tt.current,N=new Set([...k.keys(),...Ae.keys()]),H=!1;for(let J of N){let X=k.get(J),se=Ae.get(J),ie=!!X?.emissive!=!!se?.emissive,st=!!X?.matcap!=!!se?.matcap;if(!ie&&!st)continue;H=!0;let pt=L[J],ye=xe[J];pt&&er(pt,(Ie,xt)=>{let ge=Ie.userData.reactImmersiveConfiguredEmissive;ie&&ge?.isColor&&(Ie.emissive.copy(ge),se?.emissive&&Ie.emissive.add(Va));let wt=Tl(ye,xt);st&&wt&&(se?.matcap?wt.color.set(jr.color):wt.color.copy(Ie.color))})}tt.current=Ae,H&&S()},[Ae,L,xe,S]),Gt(()=>{if(G!=="uv-checker")return;let k=xm(),N=[];return x.traverse(H=>{if(!Zn(H))return;let J=H.material,X=Array.isArray(J)?J:[J],se=!!H.geometry.getAttribute("uv"),ie=X.map((pt,ye)=>{let Ie=new Zd({color:se?"#ffffff":"#ff00ff",map:se?k:null,side:pt.side});return Ie.name=`${H.name||"mesh"}-uv-checker-${ye}`,Ie.toneMapped=!1,Ie}),st=Array.isArray(J)?ie:ie[0];H.material=st,N.push({node:H,original:J,diagnostic:st})}),S(),()=>{for(let{node:H,original:J,diagnostic:X}of N){H.material=J;let se=Array.isArray(X)?X:[X];for(let ie of se)ie.dispose()}S()}},[x,G,S]),Gt(()=>{if(!U)return;let k=[];for(let[N,H]of Object.entries(t)){let J=H.modelObjectId??N,X=I[J];if(!Zn(X))continue;let se=new Zd({color:oe,wireframe:!0,transparent:!0,opacity:ve,depthTest:!1,depthWrite:!1,side:rC,toneMapped:!1}),ie=X.clone(!1);ie.name="",ie.position.set(0,0,0),ie.quaternion.identity(),ie.scale.set(1,1,1),ie.matrix.identity(),ie.matrixAutoUpdate=!0,ie.material=se,ie.castShadow=!1,ie.receiveShadow=!1,ie.frustumCulled=!1,ie.renderOrder=1,ie.userData={isWireframeOverlay:!0},ie.raycast=()=>{},X.morphTargetInfluences&&(ie.morphTargetInfluences=X.morphTargetInfluences),X.add(ie),k.push({node:X,overlay:ie})}return S(),()=>{for(let{node:N,overlay:H}of k)N.remove(H),H.material.dispose()}},[U,oe,ve,I,t,S]);let Be=yn(()=>ng(m.animations),[m.animations]),$t=ln(s);$t.current=s;let Ue=ln(h);Ue.current=h;let Pt=ln(null),_t=ln({}),Ee=ln(null),Ne=ln(null),te=ln(1),ae=ln(new Set),ft=ln(0),re=()=>({currentClip:Ne.current,isPlaying:Ee.current?.paused===!1,speed:te.current,time:Ee.current?.time??0,duration:Ee.current?.getClip().duration??0}),le=()=>{let k=re();ae.current.forEach(N=>N(k))},he=(k,N)=>{let H=lg(N);k.setLoop(H==="once"?aC:sC,H==="once"?1:1/0),k.clampWhenFinished=H==="once";let J=Yd(N?.speed??te.current);te.current=J,k.setEffectiveTimeScale(J)},Oe=()=>{Ee.current?.stop(),Ee.current=null,Ne.current=null,le(),S()},nt=()=>{Ee.current&&(Ee.current.paused=!0,le(),S())},Re=k=>{let N=Yd(k);te.current=N,Ee.current?.setEffectiveTimeScale(N),le()},De=k=>{let N=Ee.current;if(!N)return;let H=N.getClip().duration;N.time=Math.min(Math.max(k,0),H),Pt.current?.update(0),le(),S()},rt=k=>{let N=_t.current[k];if(!N)return;let H=yl(Ue.current,k);if(!H?.hidden){if(Ee.current===N&&N.paused){he(N,H),N.paused=!1,Ne.current=k,le(),S();return}Ee.current&&Ee.current!==N&&Ee.current.stop(),he(N,H),N.paused=!1,N.enabled=!0,N.reset().play(),Ee.current=N,Ne.current=k,le(),S()}};Gt(()=>{let k=new oC(x);Pt.current=k;let N={};for(let{clip:ie,sourceName:st}of Be)N[st]=k.clipAction(ie);_t.current=N;let H=ie=>{ie.action&&ie.action===Ee.current&&Oe()};k.addEventListener("finished",H);let J=()=>{};$t.current?.({clips:Be.map(({sourceName:ie})=>ie),clipDetails:Be.map(({sourceName:ie,duration:st})=>({sourceName:ie,duration:st})),play:Be.length?rt:J,pause:Be.length?nt:J,stop:Be.length?Oe:J,setSpeed:Be.length?Re:J,seek:Be.length?De:J,getState:re,subscribe:ie=>(ae.current.add(ie),ie(re()),()=>{ae.current.delete(ie)})}),te.current=1,le();let X=Ue.current?.animations.autoplayClip,se=X?yl(Ue.current,X):void 0;return X&&!se?.hidden&&rt(X),()=>{k.removeEventListener("finished",H),k.stopAllAction(),k.uncacheRoot(x),Pt.current=null,_t.current={},Ee.current=null,Ne.current=null,te.current=1,le()}},[x,Be]),Gt(()=>{let k=Ne.current,N=Ee.current;if(!k||!N||!h?.animations)return;let H=yl(h,k);if(H?.hidden){Oe();return}H&&(he(N,H),le())},[h?.animations]),Qd((k,N)=>{if(Pt.current&&Ee.current?.paused===!1){if(Pt.current.update(N),!p)for(let[H,J]of j.current)El(H,J,E);S(),ft.current+=N,ft.current>=.066&&(ft.current=0,le(),Ya(x))}});let ce=yn(()=>(h?.model.rotation??[0,0,0]).map(k=>k*Math.PI/180),[h?.model.rotation]);Qd((k,N)=>{if(!R.current)return;let H=R.current.rotation;H.x=Al.lerp(H.x,ce[0],1-Math.exp(-5*N)),H.y=Al.lerp(H.y,ce[1],1-Math.exp(-5*N)),H.z=Al.lerp(H.z,ce[2],1-Math.exp(-5*N)),Math.abs(H.x-ce[0])<1e-4&&Math.abs(H.y-ce[1])<1e-4&&Math.abs(H.z-ce[2])<1e-4||S()});let Pe=ln([]),Ke=ln(0),ke=ln(0),dt=yn(()=>new Gi,[]);Gt(()=>{let k=new Map;for(let[pt,ye]of Object.entries(t)){let Ie=I[ye.modelObjectId??pt];Ie&&k.set(Ie,ye)}for(let pt of Pe.current)El(pt.node,k.get(pt.node)?.transform,E);ke.current=0,x.updateWorldMatrix(!0,!0);let N=new kl().setFromObject(x),H=N.getCenter(new Gi),J=N.getSize(new Gi).length()*.5;Ke.current=Number.isFinite(J)?J:0;let X=[...k.keys()],se=new Set(X),ie=[],st=new Gi;for(let pt of X){if(!pt.parent)continue;let ye=pt.parent,Ie=!1;for(;ye;){if(se.has(ye)){Ie=!0;break}ye=ye.parent}if(Ie)continue;let xt=new kl().setFromObject(pt);if(xt.isEmpty())continue;xt.getCenter(st);let ge=st.clone().sub(H);ge.lengthSq()<1e-8||(ge.normalize(),ie.push({node:pt,restLocalPos:pt.position.clone(),restWorldPos:pt.getWorldPosition(new Gi),worldDir:ge,parentInverse:new lC().copy(pt.parent.matrixWorld).invert()}))}Pe.current=ie,S()},[x,I,A,F,E,S]),Gt(()=>{S()},[y,S]),Qd((k,N)=>{let H=Pe.current;if(H.length===0)return;let J=Math.min(Math.max(y,0),1),X=ke.current;if(Math.abs(X-J)<1e-4){if(X===J)return;ke.current=J}else ke.current=Al.lerp(X,J,1-Math.exp(-6*N)),S();let se=ke.current*Ke.current;for(let ie of H)dt.copy(ie.worldDir).multiplyScalar(se).add(ie.restWorldPos).applyMatrix4(ie.parentInverse),ie.node.position.copy(dt)});let ut=k=>{let N=k;for(;N;){let H=Ha(N),J=H?z[H]:void 0;if(J&&t[J])return[J,t[J]];N=N.parent}return null},bt=k=>{let N=ut(k.object);if(!N)return;let[,H]=N;H.selectable!==!1&&(k.stopPropagation(),r(H))},Je=k=>{if(!f)return;let N=ut(k.object);if(!N)return;let[H,J]=N;J.hoverable!==!1&&(k.stopPropagation(),b("pointer"),T(H),o?.(J))},Tn=k=>{f&&(k.stopPropagation(),C(),T(null),o?.(null))},ue=yn(()=>!Ys(x),[x]);return pg("group",{ref:R,children:pg("primitive",{object:x,...ue?{onClick:bt,...f?{onPointerOver:Je,onPointerOut:Tn}:{}}:{}})})}import{useCallback as Yi,useEffect as ui,useMemo as SM,useRef as vn,useState as Nu}from"react";import{useFrame as MM,useThree as TM}from"@react-three/fiber";import{Box3 as wg,BoxGeometry as AC,Group as yg,Matrix4 as Cg,Mesh as EC,MeshBasicMaterial as RC,Vector3 as Ur}from"three";import{Euler as dC,Matrix4 as Hi,MeshBasicMaterial as uC,MeshMatcapMaterial as pC,MeshNormalMaterial as hC,MeshStandardMaterial as mC,Quaternion as gC,Vector3 as Ja}from"three";function gg(e){let t={};for(let[n,i]of Object.entries(e))t[i.modelObjectId??n]=n;return t}function nu(e){let t=e,n=null;for(;t;){let i=t.userData?.ri_name;if(typeof i=="string"&&i)return i;!n&&t.name&&(n=t.name),t=t.parent}return n}function fg(e,t){return e||(t?t.modelObjectId??t.id:null)}function Bl(e,t){let n=nu(e);if(!n)return null;let i=t.keyByModelObject[n]??n,r=t.objectBindings[i];return r?{key:i,binding:r}:null}var Go=new Ja,tu=new Ja,fC=new Hi,hg=new Hi,Rl=new Hi,bC=new Hi,Ll=new Hi,xC=new Hi,yC=new Hi,vC=new Ja,wC=new Ja,oi=new Ja,mg=new gC,CC=new dC;function SC(e,t,n,i,r){let o=!!(n?.position||n?.rotation||n?.scale),a=!!(r&&r.factor>0&&r.radius>0);if(!o&&!a){e.matrixAutoUpdate=!0,e.position.copy(t.position),e.rotation.copy(t.rotation),e.scale.copy(t.scale),e.updateMatrix(),e.updateWorldMatrix(!0,!1);return}hg.compose(t.position,mg.setFromEuler(t.rotation),t.scale);let s=n?.rotation;Rl.compose(vC.fromArray(n?.position??[0,0,0]),mg.setFromEuler(CC.set(s?.[0]??0,s?.[1]??0,s?.[2]??0)),wC.fromArray(n?.scale??[1,1,1])),Rl.premultiply(i).multiply(bC.copy(i).invert()),e.parent?.updateWorldMatrix(!0,!1);let c=e.parent?.matrixWorld??fC;if(Ll.multiplyMatrices(c,hg).premultiply(Rl),a&&r){let l=e;for(;l.parent&&!l.userData.ri_name;)l=l.parent;let u=l.userData.ri_center;Array.isArray(u)&&u.length===3?oi.fromArray(u).applyMatrix4(i).applyMatrix4(Rl):oi.setFromMatrixPosition(Ll),oi.sub(r.centre),oi.lengthSq()>1e-8&&(oi.normalize().multiplyScalar(r.factor*r.radius),Ll.premultiply(yC.makeTranslation(oi.x,oi.y,oi.z)))}e.matrixAutoUpdate=!1,e.matrix.multiplyMatrices(xC.copy(c).invert(),Ll),e.matrixWorldNeedsUpdate=!0,e.updateWorldMatrix(!1,!1)}function Ol(e,t){if(!Zn(e)&&!e.userData.riLogicalObject)return;let n=Bl(e,t);if(!n)return;let i=bg(e);if(i.rest??(i.rest={position:e.position.clone(),rotation:e.rotation.clone(),scale:e.scale.clone()}),t.suspendTransforms)return;if(t.placementFrame&&!e.userData.riLogicalObject){SC(e,i.rest,n.binding.transform,t.placementFrame,t.explode);return}let r=i.rest,o=n.binding.transform;o?.position?e.position.fromArray(o.position):e.position.copy(r.position),o?.rotation?e.rotation.set(o.rotation[0],o.rotation[1],o.rotation[2],r.rotation.order):e.rotation.copy(r.rotation),o?.scale?e.scale.fromArray(o.scale):e.scale.copy(r.scale);let a=t.explode;if(a&&a.factor>0&&a.radius>0){e.updateWorldMatrix(!0,!1),tu.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?Go.fromArray(c).applyMatrix4(e.matrixWorld).sub(a.centre):Go.copy(tu).sub(a.centre),Go.lengthSq()>1e-8&&(Go.normalize().multiplyScalar(a.factor*a.radius).add(tu),e.parent&&e.parent.worldToLocal(Go),e.position.copy(Go))}e.updateMatrix(),e.updateWorldMatrix(!0,!1)}function Ho(e,t){e.traverse(n=>Ol(n,t))}function bg(e){var t;return(t=e.userData).riVisuals??(t.riVisuals={}),e.userData.riVisuals}function MC(e,t,n,i){return JSON.stringify([e?.style?.material??null,t??null,n.shadingMode,n.rendererMode,i])}function TC(e){if(e.textures){for(let t of Xa){let n=e.textures[t];n&&ji(n,Ui(t))}e.textures=void 0}}function PC(e,t,n){let i=e.textures??{};for(let r of Xa){let o=Ot(t,r),a=i[r];if(a===o)continue;let s=Ui(r);a&&ji(a,s),o?(rl(o,s,n),i[r]=o):delete i[r]}e.textures=Object.keys(i).length>0?i:void 0}function _C(e,t){if(t.shadingMode==="normals")return Pr(e,()=>new hC);if(t.shadingMode==="unlit")return Pr(e,n=>{let i=new uC;return i.color.copy(n.color),i.map=n.map,i.alphaMap=n.alphaMap,i.alphaTest=n.alphaTest,i.transparent=n.transparent,i.opacity=n.opacity,i.side=n.side,i});if(t.rendererMode==="matcap"){let n=il();return Pr(e,i=>{let r=new pC;return r.matcap=n,r.color.copy(i.color),r.alphaMap=i.alphaMap,r.alphaTest=i.alphaTest,r.side=i.side,r})}return e}function kC(e,t){if(!Zn(e))return;let i=bg(e);i.original??(i.original=qa(e));let r=Bl(e,t);if(!r){i.original&&(e.material=i.original),e.visible=!0;return}let{key:o,binding:a}=r;e.visible=a.visible!==!1,Ol(e,t);let s=t.itemMaterials?.[o]?.hex??t.itemMaterials?.[a.modelObjectId??o]?.hex,c=o===t.selectedKey||t.highlightOnHover!==!1&&o===t.hoveredKey,l=MC(a,s,t,c);if(i.signature===l&&i.display){e.material=i.display;return}let u=a.style?.material;if(PC(i,u,t.invalidate),!i.physical){let d=i.original??qa(e);if(!d)return;i.physical=Pr(d,h=>{let g=jo(h),f=vl(g??new mC);return wl(f),f})}er(i.physical,d=>{Ml(d,u,s??u?.baseColor),c&&(d.emissive.add(Va),d.color.lerp(um,pm)),d.needsUpdate=!0}),i.display&&i.display!==i.physical&&er(i.display,d=>d.dispose()),i.display=_C(i.physical,t),i.signature=l,e.material=i.display}function xg(e,t){e.traverse(n=>kC(n,t))}function ru(e){e.traverse(t=>{if(!Zn(t))return;let n=t.userData.riVisuals;n&&(n.rest&&(t.matrixAutoUpdate=!0,t.position.copy(n.rest.position),t.rotation.copy(n.rest.rotation),t.scale.copy(n.rest.scale),t.updateMatrix()),n.original&&(t.material=n.original),n.display&&n.display!==n.physical&&er(n.display,i=>i.dispose()),n.physical&&er(n.physical,i=>i.dispose()),TC(n),delete t.userData.riVisuals)})}var Sg=new Cg().makeRotationX(Math.PI/2),vg=Sg.clone().invert();function LC(e){let t=new Ur(e[0],e[1],e[2]),n=new Ur(Math.abs(e[3])+Math.abs(e[6])+Math.abs(e[9]),Math.abs(e[4])+Math.abs(e[7])+Math.abs(e[10]),Math.abs(e[5])+Math.abs(e[8])+Math.abs(e[11]));return new wg(t.clone().sub(n),t.clone().add(n))}function BC(e){let t=e.getCenter(new Ur),n=e.getSize(new Ur).multiplyScalar(.5);return[t.x,t.y,t.z,n.x,0,0,0,n.y,0,0,0,n.z]}var Dl=class{constructor(){this.group=new yg;this.objects=new Map;this.geometry=new AC(1,1,1);this.material=new RC;this.originalBounds=new WeakMap;this.signature="";this.lastContext=null;this.lastEffective=null;this.lastDragging=!1;this.version=0;this.tileVersions=new WeakMap;this.transforms=new Map}setCatalog(t){this.group.clear(),this.objects.clear();for(let n of t){let i=new wg(new Ur(...n.minimum),new Ur(...n.maximum)).applyMatrix4(vg),r=new yg;r.name=n.name,r.userData.ri_name=n.name,r.userData.riLogicalObject=!0,r.userData.ri_center=i.getCenter(new Ur).toArray();let o=new EC(this.geometry,this.material);o.visible=!1,o.raycast=()=>{},o.position.copy(i.getCenter(new Ur)),o.scale.copy(i.getSize(new Ur)),r.add(o),this.group.add(r),this.objects.set(n.name,r)}this.signature="",this.lastContext=null}nodesByBinding(t){let n={};for(let[i,r]of this.objects){let o=t.keyByModelObject[i]??i;t.objectBindings[o]&&(n[o]=r)}return n}sync(t,n,i=!1){if(!i&&!this.lastDragging&&t===this.lastContext&&this.lastEffective)return this.lastEffective;this.lastContext=t,this.lastDragging=i;let r={...t,suspendTransforms:!1},o=n?t.objectBindings[n]:void 0,a=o?this.objects.get(o.modelObjectId??n):void 0;i&&a&&o&&(r={...r,objectBindings:{...t.objectBindings,[n]:{...o,transform:{position:a.position.toArray(),rotation:[a.rotation.x,a.rotation.y,a.rotation.z],scale:a.scale.toArray()}}}});for(let c of this.objects.values())i&&c===a||Ol(c,r);this.group.updateWorldMatrix(!0,!0);let s=[...this.objects].map(([c,l])=>`${c}:${l.matrix.elements.join(",")}`).join(";");if(s!==this.signature){this.signature=s,this.version++,this.transforms.clear();for(let[c,l]of this.objects)l.matrix.equals(new Cg)||this.transforms.set(c,Sg.clone().multiply(l.matrix).multiply(vg))}return this.lastEffective=r,r}updateBounds(t){if(!t)return;let n=i=>{if(this.tileVersions.get(i)!==this.version){if(i.boundingVolume.box&&this.tileVersions.get(i)!==this.version){let r=this.originalBounds.get(i);r||(r={box:[...i.boundingVolume.box],error:i.geometricError},this.originalBounds.set(i,r));let o=LC(r.box),a=o.clone(),s=1;for(let l of i.extras?.featureIds??[]){let u=this.transforms.get(l);u&&(a.union(o.clone().applyMatrix4(u)),s=Math.max(s,u.getMaxScaleOnAxis()))}let c=BC(a);i.boundingVolume.box=c,i.geometricError=r.error*s,i.engineData?.boundingVolume?.setObbData(c,i.engineData.transform),this.tileVersions.set(i,this.version)}i.children?.forEach(n)}};n(t)}dispose(){this.group.clear(),this.objects.clear(),this.geometry.dispose(),this.material.dispose()}};var iu=Object.freeze({factor:1,loosened:!1,tooFine:0,raisedAt:-1/0,changedAt:-1/0}),Qa=16,ou=1.25,OC=1.5,DC=1.25,NC=500,IC=3e3,Mg=5e3,Tg=2e3,zC=.9;function Pg(e){return e.full&&(e.wanting||e.usage>1)}function _g(e){return e.loosened?IC:NC}function kg(e){let t=e.factor/DC;return t<=1+1e-6?1:t}function Ag(e,t){return e.factor>1&&!e.loosened&&!t.full&&!t.wanting&&t.usage<zC&&kg(e)>e.tooFine}function Eg(e,t){let{now:n}=t,i=t.moved&&e.tooFine>0?{...e,tooFine:0}:e;if(Pg(t)){if(n-i.changedAt<_g(i))return i;let r=Math.max(i.tooFine,i.factor);return i.factor>=Qa?i.loosened&&i.tooFine===r?i:{...i,loosened:!0,tooFine:r,changedAt:n}:{factor:Math.min(Qa,i.factor*OC),loosened:!0,tooFine:r,raisedAt:n,changedAt:n}}return i.loosened&&!t.wanting?{...i,loosened:!1,changedAt:n}:Ag(i,t)&&n-i.raisedAt>=Mg&&n-i.changedAt>=Tg?{...i,factor:kg(i),changedAt:n}:i}function Rg(e,t){let{now:n}=t;return Pg(t)?e.factor>=Qa&&e.loosened?null:Math.max(0,_g(e)-(n-e.changedAt)):e.loosened&&!t.wanting?0:Ag(e,t)?Math.max(0,Mg-(n-e.raisedAt),Tg-(n-e.changedAt)):null}function jC(e){try{let t=typeof location<"u"?location.href:void 0;return new URL(e,t).origin}catch{return null}}function Lg(e){if(!e)return null;let t=e.length,n=e.indexOf("?"),i=e.indexOf("#");n!==-1&&(t=Math.min(t,n)),i!==-1&&(t=Math.min(t,i));let r=e.lastIndexOf(".",t),o=e.lastIndexOf("/",t),a=e.indexOf("://");return a!==-1&&a+2===o||r===-1||r<o?null:e.substring(r+1,t)||null}var Il,zl=(Il=class{static setXRSession(e){e!==this.session&&(this.flushPending(),this.session=e)}static requestAnimationFrame(e){let{session:t,pending:n}=this,i,r=()=>{n.delete(i),e()};return i=t?t.requestAnimationFrame(r):requestAnimationFrame(r),n.set(i,e),i}static cancelAnimationFrame(e){let{pending:t,session:n}=this;t.delete(e),n?n.cancelAnimationFrame(e):cancelAnimationFrame(e)}static flushPending(){this.pending.forEach((e,t)=>{e(),this.cancelAnimationFrame(t)})}},rd(Il,"pending",new Map),rd(Il,"session",null),Il),Bg=2**30,Ng=class{get unloadPriorityCallback(){return this._unloadPriorityCallback}set unloadPriorityCallback(e){e.length===1?(console.warn('LRUCache: "unloadPriorityCallback" function has been changed to take two arguments.'),this._unloadPriorityCallback=(t,n)=>{let i=e(t),r=e(n);return i<r?-1:+(i>r)}):this._unloadPriorityCallback=e}constructor(){this.minSize=6e3,this.maxSize=8e3,this.minBytesSize=.3*Bg,this.maxBytesSize=.4*Bg,this.unloadPercent=.05,this.autoMarkUnused=!0,this.cachedBytes=0,this.itemSet=new Map,this.itemList=[],this.usedSet=new Set,this.callbacks=new Map,this.unloadingHandle=-1,this.bytesMap=new Map,this.loadedSet=new Set,this._unloadPriorityCallback=null;let e=this.itemSet;this.defaultPriorityCallback=t=>e.get(t)}isFull(){return this.itemSet.size>=this.maxSize||this.cachedBytes>=this.maxBytesSize}getMemoryUsage(e){return this.bytesMap.get(e)||0}setMemoryUsage(e,t){let{bytesMap:n,itemSet:i}=this;i.has(e)&&(this.cachedBytes-=n.get(e)||0,n.set(e,t),this.cachedBytes+=t)}add(e,t){let n=this.itemSet;if(n.has(e)||this.isFull())return!1;let i=this.usedSet,r=this.itemList,o=this.callbacks;return r.push(e),i.add(e),n.set(e,Date.now()),o.set(e,t),!0}has(e){return this.itemSet.has(e)}remove(e){let t=this.usedSet,n=this.itemSet,i=this.itemList,r=this.bytesMap,o=this.callbacks,a=this.loadedSet;if(n.has(e)){this.cachedBytes-=r.get(e)||0,r.delete(e),o.get(e)(e);let s=i.indexOf(e);return i.splice(s,1),t.delete(e),n.delete(e),o.delete(e),a.delete(e),!0}return!1}setLoaded(e,t){let{itemSet:n,loadedSet:i}=this;n.has(e)&&(t===!0?i.add(e):i.delete(e))}markUsed(e){let t=this.itemSet,n=this.usedSet;t.has(e)&&!n.has(e)&&(t.set(e,Date.now()),n.add(e))}markUnused(e){this.usedSet.delete(e)}markAllUnused(){this.usedSet.clear()}isUsed(e){return this.usedSet.has(e)}unloadUnusedContent(){let{unloadPercent:e,minSize:t,maxSize:n,itemList:i,itemSet:r,usedSet:o,loadedSet:a,callbacks:s,bytesMap:c,minBytesSize:l,maxBytesSize:u}=this,d=i.length-o.size,h=i.length-a.size,g=Math.max(Math.min(i.length-t,d),0),f=this.cachedBytes-l,v=this.unloadPriorityCallback||this.defaultPriorityCallback,_=!1,y=g>0&&d>0||h&&i.length>n;if(d&&this.cachedBytes>l||h&&this.cachedBytes>u||y){i.sort((b,C)=>{let x=o.has(b);if(x===o.has(C)){let P=a.has(b);return P===a.has(C)?-v(b,C):P?1:-1}else return x?1:-1});let p=Math.max(t*e,g*e),m=Math.ceil(Math.min(p,d,g)),S=Math.max(e*f,e*l),M=Math.min(S,f),T=0,R=0;for(;this.cachedBytes-R>u||i.length-T>n;){let b=i[T],C=c.get(b)||0;if(o.has(b)&&a.has(b)||this.cachedBytes-R-C<u&&i.length-T<=n)break;R+=C,T++}for(;R<M||T<m;){let b=i[T],C=c.get(b)||0;if(o.has(b)||this.cachedBytes-R-C<l&&T>=m)break;R+=C,T++}i.splice(0,T).forEach(b=>{this.cachedBytes-=c.get(b)||0,s.get(b)(b),c.delete(b),r.delete(b),s.delete(b),a.delete(b),o.delete(b)}),_=T<g||R<f&&T<d,_&&(_=T>0)}_&&(this.unloadingHandle=zl.requestAnimationFrame(()=>this.scheduleUnload()))}scheduleUnload(){zl.cancelAnimationFrame(this.unloadingHandle),this.scheduled||(this.scheduled=!0,queueMicrotask(()=>{this.scheduled=!1,this.unloadUnusedContent()}))}},VC=class extends DOMException{constructor(){super("PriorityQueue: Item removed","AbortError")}},Wo=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=>{zl.requestAnimationFrame(e)},this._runjobs=()=>{this.scheduled=!1,this.tryRunJobs()}}sort(){let e=this.priorityCallback,t=this.items;e!==null&&t.sort(e)}has(e){return this.callbacks.has(e)}add(e,t){let n={callback:t,reject:null,resolve:null,promise:null};return n.promise=new Promise((i,r)=>{let o=this.items,a=this.callbacks;n.resolve=i,n.reject=r,o.unshift(e),a.set(e,n),this.autoUpdate&&this.scheduleJobRun()}),n.promise}remove(e){let t=this.items,n=this.callbacks,i=t.indexOf(e);if(i!==-1){let r=n.get(e);r.promise.catch(o=>{if(o.name!=="AbortError")throw o}),r.reject(new VC),t.splice(i,1),n.delete(e)}}removeByFilter(e){let{items:t}=this;for(let n=0;n<t.length;n++){let i=t[n];e(i)&&(this.remove(i),n--)}}tryRunJobs(){this.sort();let e=this.items,t=this.callbacks,n=this.maxJobs,i=0,r=()=>{this.currJobs--,this.autoUpdate&&this.scheduleJobRun()};for(;n>this.currJobs&&e.length>0&&i<n;){this.currJobs++,i++;let o=e.pop(),{callback:a,resolve:s,reject:c}=t.get(o);t.delete(o);let l;try{l=a(o)}catch(u){c(u),r();continue}l instanceof Promise?l.then(s).catch(c).finally(r):(s(l),r())}}flush(e){let{items:t,callbacks:n}=this,i=t.indexOf(e);if(!n.has(e))return;let{callback:r,resolve:o,reject:a}=n.get(e);n.delete(e),t.splice(i,1);let s;try{s=r(e)}catch(c){a(c);return}return s instanceof Promise?s.then(o).catch(a):o(s),s}scheduleJobRun(){this.scheduled||(this.scheduled=(this._schedulingCallback(this._runjobs),!0))}},FC=class{get running(){for(let e of this.originQueues.values())if(e.running)return!0;return!1}get maxJobsPerOrigin(){return this._maxJobsPerOrigin}set maxJobsPerOrigin(e){this._maxJobsPerOrigin=e,this.originQueues.forEach(t=>t.maxJobs=e)}get maxJobs(){return this.maxJobsPerOrigin}set maxJobs(e){console.warn('DownloadPriorityQueue: "maxJobs" is no longer valid and limits jobs per server origin. Use "maxJobsPerOrigin", instead.'),this.maxJobsPerOrigin=e}get priorityCallback(){return this._priorityCallback}set priorityCallback(e){this._priorityCallback=e,this.originQueues.forEach(t=>t.priorityCallback=e)}constructor(){this.originQueues=new Map,this._itemQueues=new WeakMap,this._maxJobsPerOrigin=6,this._priorityCallback=null}add(e,t,n,i=null){this.originQueues.forEach((c,l)=>{c.running||this.originQueues.delete(l)});let r=e===null?null:jC(e),o=this.originQueues.get(r);o||(o=new Wo,o.maxJobs=this._maxJobsPerOrigin,o.priorityCallback=this._priorityCallback,this.originQueues.set(r,o));let a=this._itemQueues.get(t);if(a&&a!==o&&a.has(t))throw Error("DownloadPriorityQueue: Item is already queued with a different url origin.");this._itemQueues.set(t,o);let s=o.add(t,n);return i!==null&&(i.aborted?this.remove(t):i.addEventListener("abort",()=>this.remove(t),{once:!0})),s}remove(e){let t=this._itemQueues.get(e);t&&(t.remove(e),this._itemQueues.delete(e))}has(e){let t=this._itemQueues.get(e);return!!(t&&t.has(e))}};var $o=6378137,V5=1/298.257223563,Ig=6356752314245179e-9,Nl={inView:!1,error:1/0,distanceFromCamera:1/0};function Fl(e){return e===4||e===-1}function Gr(e,t){return Ul(e)&&e.traversal.lastFrameVisited===t&&e.traversal.used}function Ul(e){return!!e.traversal}function es(e){let{children:t}=e,n=t.length===0||Ul(t[t.length-1]),i=!e.internal.hasUnrenderableContent||Fl(e.internal.loadingState);return n&&i}function Wi(e){return e.traversal.unconditionallyRefine}function Za(e,t){if(Ul(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,Nl),e.traversal.inFrustum=Nl.inView,e.traversal.error=Nl.error,e.traversal.distanceFromCamera=Nl.distanceFromCamera,e.traversal.unconditionallyRefine=e.internal.hasUnrenderableContent,!e.traversal.unconditionallyRefine))){let n=e.parent;for(;n&&n.traversal.unconditionallyRefine;)n=n.parent;n&&n.geometricError<=e.geometricError&&(e.traversal.unconditionallyRefine=!0)}}function au(e,t,n=!1){if(Za(e,t),n?t.markTileUsed(e):jl(e),Wi(e)&&es(e)){let i=e.children;for(let r=0,o=i.length;r<o;r++)au(i[r],t,n)}}function zg(e,t){if(Za(e,t),e.traversal.usedLastFrame&&(jl(e),e.traversal.wasSetActive&&(e.traversal.active=!0),(!e.traversal.active||Wi(e))&&es(e))){let n=e.children;for(let i=0,r=n.length;i<r;i++)zg(n[i],t)}}function jl(e){e.traversal.used=!0}function UC(e,t){return!(e.traversal.error<=t.errorTarget&&!Wi(e)||t.maxDepth>0&&e.internal.depth+1>=t.maxDepth||!es(e))}function jg(e,t){let{frameCount:n}=t,{children:i}=e;for(let r=0,o=i.length;r<o;r++){let a=i[r];Gr(a,n)&&(a.traversal.active&&(a.traversal.kicked=!0,a.traversal.active=!1),jg(a,t))}}function Og(e){return!Wi(e)&&(!e.internal.hasContent||Fl(e.internal.loadingState))}function Vg(e,t){if(Za(e,t),!e.traversal.inFrustum)return;let n=e.parent;if(n&&n.refine==="ADD"&&e.geometricError>0&&e.traversal.error*(n.geometricError/e.geometricError)<=t.errorTarget)return;if(!UC(e,t)){jl(e);return}let i=!1,r=!1,o=e.children;for(let a=0,s=o.length;a<s;a++){let c=o[a];Vg(c,t),i||(i=Gr(c,t.frameCount)),r||(r=c.traversal.inFrustum)}if(e.refine==="REPLACE"&&!r&&o.length!==0){e.traversal.inFrustum=!1,t.markTileUsed(e);for(let a=0,s=o.length;a<s;a++)au(o[a],t,!0);return}if(jl(e),e.refine==="REPLACE"&&i&&(t.loadSiblings||t.loadAncestors))for(let a=0,s=o.length;a<s;a++)au(o[a],t)}function Fg(e,t){let n=t.frameCount;if(!Gr(e,n))return;let i=e.children,r=!1;for(let a=0,s=i.length;a<s;a++){let c=i[a];r||(r=Gr(c,n))}if(!r)e.traversal.isLeaf=!0;else{for(let s=0,c=i.length;s<c;s++)Fg(i[s],t);let a=!0;for(let s=0,c=i.length;s<c;s++){let l=i[s];if(Gr(l,n)){let u=!Wi(l),d=!l.internal.hasContent||Fl(l.internal.loadingState);u&&d||l.traversal.allChildrenLoaded||(a=!1)}}e.traversal.allChildrenLoaded=a}let o=!0;for(let a=0,s=i.length;a<s;a++){let c=i[a];Gr(c,t.frameCount)&&!c.traversal.allUsedChildrenProcessed&&(o=!1)}e.traversal.allUsedChildrenProcessed=o&&es(e)}function Ug(e,t){if(!Gr(e,t.frameCount))return;let n=e.children;if(e.refine==="REPLACE"&&t.loadAncestors&&!e.traversal.allChildrenLoaded&&!Wi(e)&&(e.traversal.isLeaf=!0),e.traversal.isLeaf){if(!Wi(e)&&(e.traversal.active=!0,es(e)&&e.internal.hasContent&&!Fl(e.internal.loadingState)))for(let r=0,o=n.length;r<o;r++)zg(n[r],t);return}let i=n.length>0;for(let r=0,o=n.length;r<o;r++){let a=n[r];Ug(a,t),Gr(a,t.frameCount)&&!(a.traversal.active&&Og(a))&&!a.traversal.allChildrenReady&&(i=!1)}e.traversal.allChildrenReady=i,e.refine==="REPLACE"&&!i&&e.traversal.wasSetActive&&Og(e)&&(e.traversal.active=!0,jg(e,t))}function Gg(e,t){Za(e,t);let n=Gr(e,t.frameCount);if(n&&(e.internal.hasUnrenderableContent&&(t.markTileUsed(e),t.queueTileForDownload(e)),e.internal.hasRenderableContent&&e.refine==="ADD"&&(e.traversal.active=!0),(e.traversal.active||e.traversal.kicked)&&e.internal.hasContent&&(t.markTileUsed(e),e.traversal.allUsedChildrenProcessed&&t.queueTileForDownload(e),e.internal.loadingState!==4&&(e.traversal.active=!1)),t.loadAncestors&&e.internal.hasContent&&(t.markTileUsed(e),t.queueTileForDownload(e)),e.internal.virtualChildCount>0&&e.internal.hasContent&&t.markTileUsed(e),e.traversal.visible=e.internal.hasRenderableContent&&e.traversal.active&&e.traversal.inFrustum&&e.internal.loadingState===4,t.stats.used++,e.traversal.inFrustum&&t.stats.inFrustum++),n||Ul(e)&&e.traversal.usedLastFrame){let i=!1,r=!1;n?(i=e.traversal.active,r=t.displayActiveTiles&&e.traversal.active||e.traversal.visible):Za(e,t),e.internal.hasRenderableContent&&e.internal.loadingState===4?(i&&t.stats.active++,r&&t.stats.visible++,e.traversal.wasSetActive!==i&&t.invokeOnePlugin(a=>a.setTileActive&&a.setTileActive(e,i)),e.traversal.wasSetVisible!==r&&t.invokeOnePlugin(a=>a.setTileVisible&&a.setTileVisible(e,r))):e.internal.hasRenderableContent||(r=e.traversal.isLeaf,e.traversal.wasSetVisible!==r&&t.invokeOnePlugin(a=>a.setEmptyTileVisible&&a.setEmptyTileVisible(e,r))),e.traversal.visible=r,e.traversal.active=i;let o=e.children;for(let a=0,s=o.length;a<s;a++){let c=o[a];Gg(c,t)}}}function GC(e,t){Vg(e,t),Fg(e,t),Ug(e,t),Gg(e,t)}function HC(e){let t=null;return()=>{t===null&&(t=zl.requestAnimationFrame(()=>{t=null,e()}))}}function WC(e,t=null,n=null){let i=[];for(i.push(e),i.push(null),i.push(0);i.length>0;){let r=i.pop(),o=i.pop(),a=i.pop();if(t&&t(a,o,r)){n&&n(a,o,r);return}let s=a.children;if(s)for(let c=s.length-1;c>=0;c--)i.push(s[c]),i.push(a),i.push(r+1);n&&n(a,o,r)}}var Dg=Symbol("PLUGIN_REGISTERED"),ai={inView:!0,error:0,distance:1/0},$C=(e,t)=>{let n=e.priority||0,i=t.priority||0;return n===i?!e.traversal||!t.traversal?0:e.traversal.used===t.traversal.used?e.traversal.error===t.traversal.error?e.traversal.distanceFromCamera===t.traversal.distanceFromCamera?e.internal.depthFromRenderedParent===t.internal.depthFromRenderedParent?0:e.internal.depthFromRenderedParent>t.internal.depthFromRenderedParent?-1:1:e.traversal.distanceFromCamera>t.traversal.distanceFromCamera?-1:1:e.traversal.error>t.traversal.error?1:-1:e.traversal.used?1:-1:n>i?1:-1},XC=(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,qC=(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,ts=(e,t)=>{let n=e.priority??1/0,i=t.priority??1/0;if(n!==i)return n>i?1:-1;if(!e.internal||!t.internal)return 0;let r=e.internal.renderer,o=t.internal.renderer,a=!r.loadAncestors,s=!o.loadAncestors;return a&&s?XC(e,t):$C(e,t)},Hg=new Ng;Hg.unloadPriorityCallback=qC;var Vl=new FC;Vl.maxJobsPerOrigin=25,Vl.priorityCallback=ts;var su=new Wo;su.maxJobs=5,su.priorityCallback=ts;var lu=new Wo;lu.maxJobs=25,lu.priorityCallback=(e,t)=>{let n=e.parent,i=t.parent;return n===i?0:n?i?ts(n,i):-1:1};var Wg=class{get root(){let e=this.rootTileset;return e?e.root:null}get loadProgress(){let{stats:e,isLoading:t}=this,n=e.queued+e.downloading+e.parsing,i=e.inCacheSinceLoad+ +!!t;return i===0?1:1-n/i}get downloadQueue(){return this._downloadQueue}set downloadQueue(e){if(e instanceof Wo){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=Hg,this.downloadQueue=Vl,this.parseQueue=su,this.processNodeQueue=lu,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=HC(()=>{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[Dg]===!0)throw Error("TilesRendererBase: A plugin can only be registered to a single tileset");let t=this.plugins,n=e.priority||0,i=t.length;for(let r=0;r<t.length;r++)if((t[r].priority||0)>n){i=r;break}t.splice(i,0,e),e[Dg]=!0,e.init&&e.init(this)}unregisterPlugin(e){let t=this.plugins;if(typeof e=="string"&&(e=this.getPluginByName(e)),t.includes(e)){let n=t.indexOf(e);return t.splice(n,1),e.dispose&&e.dispose(),!0}return!1}getPluginByName(e){return this.plugins.find(t=>t.name===e)||null}invokeOnePlugin(e){let t=[...this.plugins,this];for(let n=0;n<t.length;n++){let i=e(t[n]);if(i)return i}return null}invokeAllPlugins(e){let t=[...this.plugins,this],n=[];for(let i=0;i<t.length;i++){let r=e(t[i]);r&&n.push(r)}return n.length===0?null:Promise.all(n)}traverse(e,t,n=!0){this.root&&WC(this.root,(i,...r)=>(n&&this.ensureChildrenArePreprocessed(i,!0),e?e(i,...r):!1),t)}getAttributions(e=[]){return this.invokeAllPlugins(t=>t!==this&&t.getAttributions&&t.getAttributions(e)),e}update(){let{lruCache:e,usedSet:t,stats:n,root:i,downloadQueue:r,parseQueue:o,processNodeQueue:a}=this;if(this.rootLoadingState===0&&(this.rootLoadingState=2,this.invokeOnePlugin(l=>l.loadRootTileset&&l.loadRootTileset()).then(l=>{let u=this.rootURL;u!==null&&this.invokeAllPlugins(d=>u=d.preprocessURL?d.preprocessURL(u,null):u),this.rootLoadingState=4,this.rootTileset=l,this.dispatchEvent({type:"needs-update"}),this.dispatchEvent({type:"load-tileset",tileset:l,url:u}),this.dispatchEvent({type:"load-root-tileset",tileset:l,url:u})}).catch(l=>{this.rootLoadingState=-1,console.error(l),this.rootTileset=null,this.dispatchEvent({type:"load-error",tile:null,error:l,url:this.rootURL})})),!i)return;let s=null;if(this.invokeAllPlugins(l=>{if(l.doTilesNeedUpdate){let u=l.doTilesNeedUpdate();s=s===null?u:!!(s||u)}}),s===!1){this.dispatchEvent({type:"update-before"}),this.dispatchEvent({type:"update-after"});return}this.dispatchEvent({type:"update-before"}),n.inFrustum=0,n.used=0,n.active=0,n.visible=0,n.tilesProcessed=0,this.frameCount++,t.forEach(l=>e.markUnused(l)),t.clear(),this.prepareForTraversal(),GC(i,this),this.removeUnusedPendingTiles();let c=this.queuedTiles;c.sort(e.unloadPriorityCallback);for(let l=0,u=c.length;l<u&&!e.isFull();l++)this.requestTileContents(c[l]);c.length=0,e.scheduleUnload(),(r.running||o.running||a.running)===!1&&this.isLoading===!0&&(this.cachedSinceLoadComplete.clear(),n.inCacheSinceLoad=0,this.dispatchEvent({type:"tiles-load-end"}),this.isLoading=!1),this.dispatchEvent({type:"update-after"})}resetFailedTiles(){this.rootLoadingState===-1&&(this.rootLoadingState=0);let e=this.stats;e.failed!==0&&(this.traverse(t=>{t.internal.loadingState===-1&&(t.internal.loadingState=0)},null,!1),e.failed=0)}calculateTileViewErrorWithPlugin(e,t){this.calculateTileViewError(e,t);let{errorFalloff:n,errorFalloffDensity:i}=this;if(n>0&&Number.isFinite(t.distanceFromCamera)){let s=t.distanceFromCamera*i;t.error-=n*(1-Math.exp(-s*s))}let r=null,o=0,a=1/0;this.invokeAllPlugins(s=>{s!==this&&s.calculateTileViewError&&(ai.inView=!0,ai.error=0,ai.distance=1/0,s.calculateTileViewError(e,ai)&&(r===null&&(r=!0),r&&(r=ai.inView),ai.inView&&(a=Math.min(a,ai.distance),o=Math.max(o,ai.error))))}),t.inView&&r!==!1?(t.error=Math.max(t.error,o),t.distanceFromCamera=Math.min(t.distanceFromCamera,a)):r?(t.inView=!0,t.error=o,t.distanceFromCamera=a):t.inView=!1}dispose(){[...this.plugins].forEach(n=>{this.unregisterPlugin(n)});let e=this.lruCache,t=[];this.traverse(n=>(t.push(n),!1),null,!1);for(let n=0,i=t.length;n<i;n++)e.remove(t[n]);this.stats={queued:0,parsing:0,downloading:0,failed:0,inFrustum:0,traversed:0,used:0,active:0,visible:0},this.frameCount=0,this.loadingTiles.clear()}calculateBytesUsed(e,t){return 0}dispatchEvent(e){}addEventListener(e,t){}removeEventListener(e,t){}parseTile(e,t,n){return null}prepareForTraversal(){}disposeTile(e){e.traversal.visible&&(e.internal.hasRenderableContent?this.invokeOnePlugin(n=>n.setTileVisible&&n.setTileVisible(e,!1)):this.invokeOnePlugin(n=>n.setEmptyTileVisible&&n.setEmptyTileVisible(e,!1)),e.traversal.visible=!1),e.traversal.active&&e.internal.hasRenderableContent&&this.invokeOnePlugin(n=>n.setTileActive&&n.setTileActive(e,!1)),e.traversal.active=!1;let{scene:t}=e.engineData;t&&this.dispatchEvent({type:"dispose-model",scene:t,tile:e})}preprocessNode(e,t,n=null){if(this.processedTiles.add(e),this.stats.tilesProcessed++,e.content&&(!("uri"in e.content)&&"url"in e.content&&(e.content.uri=e.content.url,delete e.content.url),e.content.boundingVolume&&!("box"in e.content.boundingVolume||"sphere"in e.content.boundingVolume||"region"in e.content.boundingVolume)&&delete e.content.boundingVolume),e.parent=n,e.children=e.children||[],e.internal={hasContent:!1,hasRenderableContent:!1,hasUnrenderableContent:!1,loadingState:0,basePath:t,depth:-1,depthFromRenderedParent:-1,isVirtual:!1,virtualChildCount:0,renderer:this,...e.internal},e.content?.uri){let i=Lg(e.content.uri),r=!!(i&&/json$/.test(i));e.internal.hasContent=!0,e.internal.hasUnrenderableContent=r,e.internal.hasRenderableContent=!r}else e.internal.hasContent=!1,e.internal.hasUnrenderableContent=!1,e.internal.hasRenderableContent=!1;n?(e.internal.depth=n.internal.depth+1,e.internal.depthFromRenderedParent=n.internal.depthFromRenderedParent+ +!!e.internal.hasRenderableContent):(e.internal.depth=0,e.internal.depthFromRenderedParent=+!!e.internal.hasRenderableContent),e.traversal={distanceFromCamera:1/0,error:1/0,inFrustum:!1,wasInFrustum:!1,isLeaf:!1,used:!1,usedLastFrame:!1,visible:!1,wasSetVisible:!1,active:!1,wasSetActive:!1,allChildrenReady:!1,allChildrenLoaded:!1,kicked:!1,allUsedChildrenProcessed:!1,lastFrameVisited:-1},n===null?e.refine=e.refine||"REPLACE":e.refine=e.refine||n.refine,e.engineData={scene:null,metadata:null,boundingVolume:null},Object.defineProperty(e,"cached",{get(){return console.warn('TilesRenderer: "tile.cached" field has been renamed to "tile.engineData".'),this.engineData},enumerable:!1,configurable:!0}),this.invokeAllPlugins(i=>{i!==this&&i.preprocessNode&&i.preprocessNode(e,t,n)})}setTileActive(e,t){t?this.activeTiles.add(e):this.activeTiles.delete(e)}setTileVisible(e,t){t?this.visibleTiles.add(e):this.visibleTiles.delete(e),this.dispatchEvent({type:"tile-visibility-change",scene:e.engineData.scene,tile:e,visible:t})}calculateTileViewError(e,t){}removeUnusedPendingTiles(){let{lruCache:e,loadingTiles:t}=this,n=[];for(let i of t)!e.isUsed(i)&&i.internal.loadingState===1&&n.push(i);for(let i=0;i<n.length;i++)e.remove(n[i])}queueTileForDownload(e){e.internal.loadingState!==0||this.lruCache.isFull()||this.queuedTiles.push(e)}markTileUsed(e){this.usedSet.add(e),this.lruCache.markUsed(e)}fetchData(e,t){return fetch(e,t)}ensureChildrenArePreprocessed(e,t=this.stats.tilesProcessed<this.maxTilesProcessed){let n=e.children;if(n.length===0||n[n.length-1].traversal)return;let i=r=>{for(let o=0,a=r.length;o<a;o++){let s=r[o];s&&!s.traversal&&this.preprocessNode(s,e.internal.basePath,e)}};t?(this.processNodeQueue.remove(e),i(n)):this.processNodeQueue.has(e)||this.processNodeQueue.add(e,r=>{i(r.children),this._dispatchNeedsUpdateEvent()})}getBytesUsed(e){let t=0;return this.invokeAllPlugins(n=>{n.calculateBytesUsed&&(t+=n.calculateBytesUsed(e,e.engineData.scene)||0)}),t}recalculateBytesUsed(e=null){let{lruCache:t,processedTiles:n}=this;e===null?t.itemSet.forEach(i=>{n.has(i)&&t.setMemoryUsage(i,this.getBytesUsed(i))}):t.setMemoryUsage(e,this.getBytesUsed(e))}preprocessTileset(e,t,n=null){let[i,r]=e.asset.version.split(".").map(a=>parseInt(a));console.assert(i<=1,"TilesRenderer: asset.version is expected to be a 1.x or a compatible version."),i===1&&r>0&&console.warn("TilesRenderer: tiles versions at 1.1 or higher have limited support. Some new extensions and features may not be supported.");let o=t.replace(/\/[^/]*$/,"");o=new URL(o,window.location.href).toString(),this.preprocessNode(e.root,o,n)}loadRootTileset(){let e=this.rootURL;return this.invokeAllPlugins(t=>e=t.preprocessURL?t.preprocessURL(e,null):e),this.invokeOnePlugin(t=>t.fetchData&&t.fetchData(e,this.fetchOptions)).then(t=>{if(!(t instanceof Response))return t;if(t.ok)return t.json();throw Error(`TilesRenderer: Failed to load tileset "${e}" with status ${t.status} : ${t.statusText}`)}).then(t=>(this.preprocessTileset(t,e),t))}requestTileContents(e){if(e.internal.loadingState!==0)return;let t=!1,n=null,i=new URL(e.content.uri,e.internal.basePath+"/").toString();this.invokeAllPlugins(h=>i=h.preprocessURL?h.preprocessURL(i,e):i);let r=this.stats,o=this.lruCache,a=this.downloadQueue,s=this.parseQueue,c=this.loadingTiles,l=Lg(i),u=new AbortController,d=u.signal;if(o.add(e,h=>{u.abort(),t?h.children.length=0:this.invokeAllPlugins(g=>{g.disposeTile&&g.disposeTile(h)}),r.inCache--,this.cachedSinceLoadComplete.has(e)&&(this.cachedSinceLoadComplete.delete(e),r.inCacheSinceLoad--),h.internal.loadingState===1?r.queued--:h.internal.loadingState===2?r.downloading--:h.internal.loadingState===3?r.parsing--:h.internal.loadingState===4&&r.loaded--,h.internal.loadingState=0,s.remove(h),a.remove(h),c.delete(h)}))return this.isLoading||(this.isLoading=!0,this.dispatchEvent({type:"tiles-load-start"})),o.setMemoryUsage(e,this.getBytesUsed(e)),this.cachedSinceLoadComplete.add(e),r.inCacheSinceLoad++,r.inCache++,r.queued++,e.internal.loadingState=1,c.add(e),a.add(i,e,h=>{if(d.aborted)return Promise.resolve();e.internal.loadingState=2,r.downloading++,r.queued--;let g=this.invokeOnePlugin(f=>f.fetchData&&f.fetchData(i,{...this.fetchOptions,signal:d}));return this.dispatchEvent({type:"tile-download-start",tile:e,url:i,get uri(){return console.warn('tile-download-start event: "uri" has been renamed to "url".'),this.url}}),g}).then(h=>{if(!d.aborted){if(!(h instanceof Response))return h;if(h.ok)return l==="json"?h.json():h.arrayBuffer();throw Error(`Failed to load model with error code ${h.status}`)}}).then(h=>{if(!d.aborted)return r.downloading--,r.parsing++,e.internal.loadingState=3,s.add(e,g=>d.aborted?Promise.resolve():l==="json"&&h.root?(this.preprocessTileset(h,i,e),e.children.push(h.root),n=h,t=!0,Promise.resolve()):this.invokeOnePlugin(f=>f.parseTile&&f.parseTile(h,g,l,i,d)))}).then(()=>{if(d.aborted)return;r.parsing--,r.loaded++,e.internal.loadingState=4,c.delete(e),o.setLoaded(e,!0);let h=this.getBytesUsed(e);if(o.getMemoryUsage(e)===0&&h>0&&o.isFull()){o.remove(e);return}o.setMemoryUsage(e,h),this.dispatchEvent({type:"needs-update"}),t&&this.dispatchEvent({type:"load-tileset",tileset:n,url:i}),e.engineData.scene&&this.dispatchEvent({type:"load-model",scene:e.engineData.scene,tile:e,url:i})}).catch(h=>{d.aborted||(h.name==="AbortError"?o.remove(e):(s.remove(e),a.remove(e),e.internal.loadingState===1?r.queued--:e.internal.loadingState===2?r.downloading--:e.internal.loadingState===3?r.parsing--:e.internal.loadingState===4&&r.loaded--,r.failed++,console.error(`TilesRenderer : Failed to load tile at url "${e.content.uri}".`),console.error(h),e.internal.loadingState=-1,c.delete(e),o.setLoaded(e,!0),this.dispatchEvent({type:"load-error",tile:e,error:h,url:i})))})}};function $i(e){if(e===null||e.byteLength<4)return"";let t;if(t=e instanceof DataView?e:new DataView(e),String.fromCharCode(t.getUint8(0))==="{")return null;let n="";for(let i=0;i<4;i++)n+=String.fromCharCode(t.getUint8(i));return n}var YC=new TextDecoder;function $g(e){return YC.decode(e)}function Gl(e){return e.replace(/[\\/][^\\/]+$/,"")+"/"}var ns=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=Gl(e)),this.parse(t)))}resolveExternalURL(e){return new URL(e,this.workingPath).href}parse(e){throw Error("LoaderBase: Parse not implemented.")}};function Xg(e,t,n,i,r,o){let a;switch(i){case"SCALAR":a=1;break;case"VEC2":a=2;break;case"VEC3":a=3;break;case"VEC4":a=4;break;default:throw Error(`FeatureTable : Feature type not provided for "${o}".`)}let s,c=n*a;switch(r){case"BYTE":s=new Int8Array(e,t,c);break;case"UNSIGNED_BYTE":s=new Uint8Array(e,t,c);break;case"SHORT":s=new Int16Array(e,t,c);break;case"UNSIGNED_SHORT":s=new Uint16Array(e,t,c);break;case"INT":s=new Int32Array(e,t,c);break;case"UNSIGNED_INT":s=new Uint32Array(e,t,c);break;case"FLOAT":s=new Float32Array(e,t,c);break;case"DOUBLE":s=new Float64Array(e,t,c);break;default:throw Error(`FeatureTable : Feature component type not provided for "${o}".`)}return s}var Hl=class{constructor(e,t,n,i){this.buffer=e,this.binOffset=t+n,this.binLength=i;let r=null;if(n!==0){let o=new Uint8Array(e,t,n);r=JSON.parse($g(o))}else r={};this.header=r}getKeys(){return Object.keys(this.header).filter(e=>e!=="extensions")}getData(e,t,n=null,i=null){let r=this.header;if(!(e in r))return null;let o=r[e];if(!(o instanceof Object)||Array.isArray(o))return o;{let{buffer:a,binOffset:s,binLength:c}=this,l=o.byteOffset||0,u=o.type||i,d=o.componentType||n;if("type"in o&&i&&o.type!==i)throw Error("FeatureTable: Specified type does not match expected type.");let h=s+l,g=Xg(a,h,t,u,d,e);if(h+g.byteLength>s+c)throw Error("FeatureTable: Feature data read outside binary body length.");return g}}getBuffer(e,t){let{buffer:n,binOffset:i}=this;return n.slice(i+e,i+e+t)}},KC=class{constructor(e){this.batchTable=e;let t=e.header.extensions["3DTILES_batch_table_hierarchy"];this.classes=t.classes;for(let i of this.classes){let r=i.instances;for(let o in r)i.instances[o]=this._parseProperty(r[o],i.length,o)}if(this.instancesLength=t.instancesLength,this.classIds=this._parseProperty(t.classIds,this.instancesLength,"classIds"),t.parentCounts?this.parentCounts=this._parseProperty(t.parentCounts,this.instancesLength,"parentCounts"):this.parentCounts=Array(this.instancesLength).fill(1),t.parentIds){let i=this.parentCounts.reduce((r,o)=>r+o,0);this.parentIds=this._parseProperty(t.parentIds,i,"parentIds")}else this.parentIds=null;this.instancesIds=[];let n={};for(let i of this.classIds)n[i]=n[i]??0,this.instancesIds.push(n[i]),n[i]++}_parseProperty(e,t,n){if(Array.isArray(e))return e;{let{buffer:i,binOffset:r}=this.batchTable,o=e.byteOffset,a=e.componentType||"UNSIGNED_SHORT";return Xg(i,r+o,t,"SCALAR",a,n)}}getDataFromId(e,t={}){let n=this.parentCounts[e];if(this.parentIds&&n>0){let s=0;for(let c=0;c<e;c++)s+=this.parentCounts[c];for(let c=0;c<n;c++){let l=this.parentIds[s+c];l!==e&&this.getDataFromId(l,t)}}let i=this.classIds[e],r=this.classes[i].instances,o=this.classes[i].name,a=this.instancesIds[e];for(let s in r)t[o]=t[o]||{},t[o][s]=r[s][a];return t}},cu=class extends Hl{constructor(e,t,n,i,r){super(e,n,i,r),this.count=t,this.extensions={};let o=this.header.extensions;o&&o["3DTILES_batch_table_hierarchy"]&&(this.extensions["3DTILES_batch_table_hierarchy"]=new KC(this))}getDataFromId(e,t={}){if(e<0||e>=this.count)throw Error(`BatchTable: id value "${e}" out of bounds for "${this.count}" features number.`);for(let n of this.getKeys())t[n]=super.getData(n,this.count)[e];for(let n in this.extensions){let i=this.extensions[n];i.getDataFromId instanceof Function&&(t[n]=t[n]||{},i.getDataFromId(e,t[n]))}return t}getPropertyArray(e){return super.getData(e,this.count)}},qg=class extends ns{parse(e){let t=new DataView(e),n=$i(t);console.assert(n==="b3dm");let i=t.getUint32(4,!0);console.assert(i===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),c=t.getUint32(24,!0),l=new Hl(e.slice(28,28+o+a),0,o,a),u=28+o+a,d=new cu(e.slice(u,u+s+c),l.getData("BATCH_LENGTH"),0,s,c),h=u+s+c;return{version:i,featureTable:l,batchTable:d,glbBytes:new Uint8Array(e,h,r-h)}}},Yg=class extends ns{parse(e){let t=new DataView(e),n=$i(t);console.assert(n==="i3dm");let i=t.getUint32(4,!0);console.assert(i===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),c=t.getUint32(24,!0),l=t.getUint32(28,!0),u=new Hl(e.slice(32,32+o+a),0,o,a),d=32+o+a,h=new cu(e.slice(d,d+s+c),u.getData("INSTANCES_LENGTH"),0,s,c),g=d+s+c,f=new Uint8Array(e,g,r-g),v=null,_=null,y=null;if(l)v=f,_=Promise.resolve();else{let p=this.resolveExternalURL($g(f));y=Gl(p),_=fetch(p,this.fetchOptions).then(m=>{if(!m.ok)throw Error(`I3DMLoaderBase : Failed to load file "${p}" with status ${m.status} : ${m.statusText}`);return m.arrayBuffer()}).then(m=>{v=new Uint8Array(m)})}return _.then(()=>({version:i,featureTable:u,batchTable:h,glbBytes:v,gltfWorkingPath:y}))}},Kg=class extends ns{parse(e){let t=new DataView(e),n=$i(t);console.assert(n==="pnts");let i=t.getUint32(4,!0);console.assert(i===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),c=t.getUint32(24,!0),l=new Hl(e.slice(28,28+o+a),0,o,a),u=28+o+a,d=new cu(e.slice(u,u+s+c),l.getData("BATCH_LENGTH")||l.getData("POINTS_LENGTH"),0,s,c);return Promise.resolve({version:i,featureTable:l,batchTable:d})}},Jg=class extends ns{parse(e){let t=new DataView(e),n=$i(t);console.assert(n==="cmpt",'CMPTLoader: The magic bytes equal "cmpt".');let i=t.getUint32(4,!0);console.assert(i===1,'CMPTLoader: The version listed in the header is "1".');let r=t.getUint32(8,!0);console.assert(r===e.byteLength,"CMPTLoader: The contents buffer length listed in the header matches the file.");let o=t.getUint32(12,!0),a=[],s=16;for(let c=0;c<o;c++){let l=new DataView(e,s,12),u=$i(l),d=l.getUint32(4,!0),h=l.getUint32(8,!0),g=new Uint8Array(e,s,h);a.push({type:u,buffer:g,version:d}),s+=h}return{version:i,tiles:a}}};import{Box3 as mf,BufferAttribute as Xi,BufferGeometry as JC,Clock as aL,Color as QC,DefaultLoadingManager as ec,Euler as ZC,EventDispatcher as Wl,Frustum as eS,Group as yu,InstancedMesh as tS,LoadingManager as nS,MathUtils as gf,Matrix3 as rS,Matrix4 as cn,Mesh as sL,OrthographicCamera as lL,PerspectiveCamera as cL,Plane as iS,PlaneGeometry as dL,Points as oS,PointsMaterial as aS,Quaternion as ff,Ray as vu,Raycaster as uL,ShaderMaterial as pL,Sphere as bf,Spherical as sS,TextureUtils as lS,Vector2 as wu,Vector3 as je}from"three";import{GLTFLoader as Cu}from"three/addons/loaders/GLTFLoader.js";import{estimateBytesUsed as cS}from"three/addons/utils/BufferGeometryUtils.js";var Su=class extends qg{constructor(e=ec){super(),this.manager=e,this.adjustmentTransform=new cn}parse(e){let t=super.parse(e),n=t.glbBytes.slice().buffer;return new Promise((i,r)=>{let o=this.manager,a=this.fetchOptions,s=o.getHandler("path.gltf")||new Cu(o);a.credentials==="include"&&a.mode==="cors"&&s.setCrossOrigin("use-credentials"),"credentials"in a&&s.setWithCredentials(a.credentials==="include"),a.headers&&s.setRequestHeader(a.headers);let c=this.workingPath;!/[\\/]$/.test(c)&&c.length&&(c+="/");let l=this.adjustmentTransform;s.parse(n,c,u=>{let{batchTable:d,featureTable:h}=t,{scene:g}=u,f=h.getData("RTC_CENTER",1,"FLOAT","VEC3");f&&(g.position.x+=f[0],g.position.y+=f[1],g.position.z+=f[2]),u.scene.updateMatrix(),u.scene.matrix.multiply(l),u.scene.matrix.decompose(u.scene.position,u.scene.quaternion,u.scene.scale),u.batchTable=d,u.featureTable=h,g.batchTable=d,g.featureTable=h,i(u)},r)})}};function dS(e){let t=e>>11,n=e>>5&63,i=e&31;return[Math.round(t/31*255),Math.round(n/63*255),Math.round(i/31*255)]}var rs=new wu;function uS(e,t,n=new je){rs.set(e,t).divideScalar(256).multiplyScalar(2).subScalar(1),n.set(rs.x,rs.y,1-Math.abs(rs.x)-Math.abs(rs.y));let i=gf.clamp(-n.z,0,1);return n.x>=0?n.setX(n.x-i):n.setX(n.x+i),n.y>=0?n.setY(n.y-i):n.setY(n.y+i),n.normalize(),n}var Qg={RGB:"color",POSITION:"position"},Mu=class extends Kg{constructor(e=ec){super(),this.manager=e}parse(e){return super.parse(e).then(async t=>{let{featureTable:n,batchTable:i}=t,r=new aS,o=n.header.extensions,a=new je,s;if(o&&o["3DTILES_draco_point_compression"]){let{byteOffset:u,byteLength:d,properties:h}=o["3DTILES_draco_point_compression"],g=this.manager.getHandler("draco.drc");if(g==null)throw Error("PNTSLoader: dracoLoader not available.");let f={};for(let y in h)if(y in Qg&&y in h){let p=Qg[y];f[p]=h[y]}let v={attributeIDs:f,attributeTypes:{position:"Float32Array",color:"Uint8Array"},useUniqueIDs:!0},_=n.getBuffer(u,d);s=await g.decodeGeometry(_,v),s.attributes.color&&(r.vertexColors=!0)}else{let u=n.getData("POINTS_LENGTH"),d=n.getData("POSITION",u,"FLOAT","VEC3"),h=n.getData("NORMAL",u,"FLOAT","VEC3"),g=n.getData("NORMAL",u,"UNSIGNED_BYTE","VEC2"),f=n.getData("RGB",u,"UNSIGNED_BYTE","VEC3"),v=n.getData("RGBA",u,"UNSIGNED_BYTE","VEC4"),_=n.getData("RGB565",u,"UNSIGNED_SHORT","SCALAR"),y=n.getData("CONSTANT_RGBA",u,"UNSIGNED_BYTE","VEC4"),p=n.getData("POSITION_QUANTIZED",u,"UNSIGNED_SHORT","VEC3"),m=n.getData("QUANTIZED_VOLUME_SCALE",u,"FLOAT","VEC3"),S=n.getData("QUANTIZED_VOLUME_OFFSET",u,"FLOAT","VEC3");if(s=new JC,p){let M=new Float32Array(u*3);for(let T=0;T<u;T++)for(let R=0;R<3;R++){let b=3*T+R;M[b]=p[b]/65535*m[R]}a.x=S[0],a.y=S[1],a.z=S[2],s.setAttribute("position",new Xi(M,3,!1))}else s.setAttribute("position",new Xi(d,3,!1));if(h!==null)s.setAttribute("normal",new Xi(h,3,!1));else if(g!==null){let M=new Float32Array(u*3),T=new je;for(let R=0;R<u;R++){let b=g[R*2],C=g[R*2+1],x=uS(b,C,T);M[R*3]=x.x,M[R*3+1]=x.y,M[R*3+2]=x.z}s.setAttribute("normal",new Xi(M,3,!1))}if(v!==null)s.setAttribute("color",new Xi(v,4,!0)),r.vertexColors=!0,r.transparent=!0,r.depthWrite=!1;else if(f!==null)s.setAttribute("color",new Xi(f,3,!0)),r.vertexColors=!0;else if(_!==null){let M=new Uint8Array(u*3);for(let T=0;T<u;T++){let R=dS(_[T]);for(let b=0;b<3;b++){let C=3*T+b;M[C]=R[b]}}s.setAttribute("color",new Xi(M,3,!0)),r.vertexColors=!0}else if(y!==null){r.color=new QC(y[0],y[1],y[2]);let M=y[3]/255;M<1&&(r.opacity=M,r.transparent=!0,r.depthWrite=!1)}}let c=new oS(s,r);c.position.copy(a),t.scene=c,t.scene.featureTable=n,t.scene.batchTable=i;let l=n.getData("RTC_CENTER",1,"FLOAT","VEC3");return l&&(t.scene.position.x+=l[0],t.scene.position.y+=l[1],t.scene.position.z+=l[2]),t})}};function pS(e){let{x:t,y:n,z:i}=e;e.x=i,e.y=t,e.z=n}function hS(e){return-e+Math.PI/2}var Zg=new sS,si=new je,Pn=new je,du=new je,tr=new cn,_r=new cn,uu=new bf,Bn=new ZC,ef=new je,tf=new je,nf=new je,is=new je,$l=new vu,mS=1e-12,gS=.1;var Tu=class{constructor(e=1,t=1,n=1){this.name="",this.radius=new je(e,t,n)}intersectRay(e,t){return tr.makeScale(...this.radius).invert(),uu.center.set(0,0,0),uu.radius=1,$l.copy(e).applyMatrix4(tr),$l.intersectSphere(uu,t)?(tr.makeScale(...this.radius),t.applyMatrix4(tr),t):null}getEastNorthUpFrame(e,t,n,i){return n.isMatrix4&&(i=n,n=0,console.warn('Ellipsoid: The signature for "getEastNorthUpFrame" has changed.')),this.getEastNorthUpAxes(e,t,ef,tf,nf),this.getCartographicToPosition(e,t,n,is),i.makeBasis(ef,tf,nf).setPosition(is)}getOrientedEastNorthUpFrame(e,t,n,i,r,o,a){return this.getObjectFrame(e,t,n,i,r,o,a,0)}getObjectFrame(e,t,n,i,r,o,a,s=2){return this.getEastNorthUpFrame(e,t,n,tr),Bn.set(r,o,-i,"ZXY"),a.makeRotationFromEuler(Bn).premultiply(tr),s===1?(Bn.set(Math.PI/2,0,0,"XYZ"),_r.makeRotationFromEuler(Bn),a.multiply(_r)):s===2&&(Bn.set(-Math.PI/2,0,Math.PI,"XYZ"),_r.makeRotationFromEuler(Bn),a.multiply(_r)),a}getCartographicFromObjectFrame(e,t,n=2){return n===1?(Bn.set(-Math.PI/2,0,0,"XYZ"),_r.makeRotationFromEuler(Bn).premultiply(e)):n===2?(Bn.set(-Math.PI/2,0,Math.PI,"XYZ"),_r.makeRotationFromEuler(Bn).premultiply(e)):_r.copy(e),is.setFromMatrixPosition(_r),this.getPositionToCartographic(is,t),this.getEastNorthUpFrame(t.lat,t.lon,0,tr).invert(),_r.premultiply(tr),Bn.setFromRotationMatrix(_r,"ZXY"),t.azimuth=-Bn.z,t.elevation=Bn.x,t.roll=Bn.y,t}getEastNorthUpAxes(e,t,n,i,r,o=is){this.getCartographicToPosition(e,t,0,o),this.getCartographicToNormal(e,t,r),n.set(-o.y,o.x,0).normalize(),i.crossVectors(r,n).normalize()}getCartographicToPosition(e,t,n,i){this.getCartographicToNormal(e,t,si);let r=this.radius;Pn.copy(si),Pn.x*=r.x**2,Pn.y*=r.y**2,Pn.z*=r.z**2;let o=Math.sqrt(si.dot(Pn));return Pn.divideScalar(o),i.copy(Pn).addScaledVector(si,n)}getPositionToCartographic(e,t){this.getPositionToSurfacePoint(e,Pn),this.getPositionToNormal(Pn,si);let n=du.subVectors(e,Pn);return t.lon=Math.atan2(si.y,si.x),t.lat=Math.asin(si.z),t.height=Math.sign(n.dot(e))*n.length(),t}getCartographicToNormal(e,t,n){return Zg.set(1,hS(e),t),n.setFromSpherical(Zg).normalize(),pS(n),n}getPositionToNormal(e,t){let n=this.radius;return t.copy(e),t.x/=n.x**2,t.y/=n.y**2,t.z/=n.z**2,t.normalize(),t}getPositionToSurfacePoint(e,t){let n=this.radius,i=1/n.x**2,r=1/n.y**2,o=1/n.z**2,a=e.x*e.x*i,s=e.y*e.y*r,c=e.z*e.z*o,l=a+s+c,u=Math.sqrt(1/l),d=Pn.copy(e).multiplyScalar(u);if(l<gS)return isFinite(u)?t.copy(d):null;let h=du.set(d.x*i*2,d.y*r*2,d.z*o*2),g=(1-u)*e.length()/(.5*h.length()),f=0,v,_,y,p,m,S,M,T,R,b,C;do{g-=f,y=1/(1+g*i),p=1/(1+g*r),m=1/(1+g*o),S=y*y,M=p*p,T=m*m,R=S*y,b=M*p,C=T*m,v=a*S+s*M+c*T-1,_=a*R*i+s*b*r+c*C*o;let x=-2*_;f=v/x}while(Math.abs(v)>mS);return t.set(e.x*y,e.y*p,e.z*m)}calculateHorizonDistance(e,t){let n=this.calculateEffectiveRadius(e);return Math.sqrt(2*n*t+t**2)}calculateEffectiveRadius(e){let t=this.radius.x,n=1-this.radius.z**2/t**2,i=e*gf.DEG2RAD,r=Math.sin(i)**2;return t/Math.sqrt(1-n*r)}getPositionElevation(e){this.getPositionToSurfacePoint(e,Pn);let t=du.subVectors(e,Pn);return Math.sign(t.dot(e))*t.length()}closestPointToRayEstimate(e,t){return this.intersectRay(e,t)?t:(tr.makeScale(...this.radius).invert(),$l.copy(e).applyMatrix4(tr),Pn.set(0,0,0),$l.closestPointToPoint(Pn,t).normalize(),tr.makeScale(...this.radius),t.applyMatrix4(tr))}copy(e){return this.radius.copy(e.radius),this}clone(){return new this.constructor().copy(this)}},cs=new Tu($o,$o,Ig);cs.name="WGS84 Earth";var Xl=new je,Xo=new je,qo=new je,pu=new je,ql=new ff,Yl=new je,Yo=new cn,rf=new cn,of=new je,af=new cn,hu=new ff,mu={};function sf(e,t,n,i){if(e=e/n*2-1,t=t/n*2-1,i.x=e,i.y=t,i.z=1-Math.abs(e)-Math.abs(t),i.z<0){let r=i.x;i.x=(1-Math.abs(i.y))*(r>=0?1:-1),i.y=(1-Math.abs(r))*(i.y>=0?1:-1)}return i.normalize(),i}var Pu=class extends Yg{constructor(e=ec){super(),this.manager=e,this.adjustmentTransform=new cn,this.ellipsoid=cs.clone()}resolveExternalURL(e){return this.manager.resolveURL(super.resolveExternalURL(e))}parse(e){return super.parse(e).then(t=>{let{featureTable:n,batchTable:i}=t,r=t.glbBytes.slice().buffer;return new Promise((o,a)=>{let s=this.fetchOptions,c=this.manager,l=c.getHandler("path.gltf")||new Cu(c);s.credentials==="include"&&s.mode==="cors"&&l.setCrossOrigin("use-credentials"),"credentials"in s&&l.setWithCredentials(s.credentials==="include"),s.headers&&l.setRequestHeader(s.headers);let u=t.gltfWorkingPath??this.workingPath;/[\\/]$/.test(u)||(u+="/");let d=this.adjustmentTransform;l.parse(r,u,h=>{let g=n.getData("INSTANCES_LENGTH"),f=n.getData("POSITION",g,"FLOAT","VEC3"),v=n.getData("POSITION_QUANTIZED",g,"UNSIGNED_SHORT","VEC3"),_=n.getData("QUANTIZED_VOLUME_OFFSET",1,"FLOAT","VEC3"),y=n.getData("QUANTIZED_VOLUME_SCALE",1,"FLOAT","VEC3"),p=n.getData("NORMAL_UP",g,"FLOAT","VEC3"),m=n.getData("NORMAL_RIGHT",g,"FLOAT","VEC3"),S=n.getData("NORMAL_UP_OCT32P",g,"UNSIGNED_SHORT","VEC2"),M=n.getData("NORMAL_RIGHT_OCT32P",g,"UNSIGNED_SHORT","VEC2"),T=n.getData("SCALE_NON_UNIFORM",g,"FLOAT","VEC3"),R=n.getData("SCALE",g,"FLOAT","SCALAR"),b=n.getData("RTC_CENTER",1,"FLOAT","VEC3"),C=n.getData("EAST_NORTH_UP");if(!f&&v){f=new Float32Array(g*3);for(let E=0;E<g;E++)f[E*3+0]=_[0]+v[E*3+0]/65535*y[0],f[E*3+1]=_[1]+v[E*3+1]/65535*y[1],f[E*3+2]=_[2]+v[E*3+2]/65535*y[2]}let x=new je;for(let E=0;E<g;E++)x.x+=f[E*3+0]/g,x.y+=f[E*3+1]/g,x.z+=f[E*3+2]/g;let P=[],I=[];h.scene.updateMatrixWorld(),h.scene.traverse(E=>{if(E.isMesh){I.push(E);let{geometry:z,material:A}=E,F=new tS(z,A,g);F.position.copy(x),b&&(F.position.x+=b[0],F.position.y+=b[1],F.position.z+=b[2]),P.push(F)}});for(let E=0;E<g;E++){pu.set(f[E*3+0]-x.x,f[E*3+1]-x.y,f[E*3+2]-x.z),ql.identity(),p&&m?(Xo.set(p[E*3+0],p[E*3+1],p[E*3+2]),qo.set(m[E*3+0],m[E*3+1],m[E*3+2]),Xl.crossVectors(qo,Xo).normalize(),Yo.makeBasis(qo,Xo,Xl),ql.setFromRotationMatrix(Yo)):S&&M&&(sf(S[E*2+0],S[E*2+1],65535,Xo),sf(M[E*2+0],M[E*2+1],65535,qo),Xl.crossVectors(qo,Xo).normalize(),Yo.makeBasis(qo,Xo,Xl),ql.setFromRotationMatrix(Yo)),Yl.set(1,1,1),T&&Yl.set(T[E*3+0],T[E*3+1],T[E*3+2]),R&&Yl.multiplyScalar(R[E]);for(let z=0,A=P.length;z<A;z++){let F=P[z];hu.copy(ql),C&&(F.updateMatrixWorld(),of.copy(pu).applyMatrix4(F.matrixWorld),this.ellipsoid.getPositionToCartographic(of,mu),this.ellipsoid.getEastNorthUpFrame(mu.lat,mu.lon,af),hu.setFromRotationMatrix(af)),Yo.compose(pu,hu,Yl).multiply(d);let j=I[z];rf.multiplyMatrices(Yo,j.matrixWorld),F.setMatrixAt(E,rf)}}h.scene.clear(),h.scene.add(...P),h.batchTable=i,h.featureTable=n,h.scene.batchTable=i,h.scene.featureTable=n,o(h)},a)})})}},xf=class extends Jg{constructor(e=ec){super(),this.manager=e,this.adjustmentTransform=new cn,this.ellipsoid=cs.clone()}parse(e){let t=super.parse(e),{manager:n,ellipsoid:i,adjustmentTransform:r}=this,o=[];for(let a in t.tiles){let{type:s,buffer:c}=t.tiles[a];switch(s){case"b3dm":{let l=c.slice(),u=new Su(n);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions,u.adjustmentTransform.copy(r);let d=u.parse(l.buffer);o.push(d);break}case"pnts":{let l=c.slice(),u=new Mu(n);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions;let d=u.parse(l.buffer);o.push(d);break}case"i3dm":{let l=c.slice(),u=new Pu(n);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions,u.ellipsoid.copy(i),u.adjustmentTransform.copy(r);let d=u.parse(l.buffer);o.push(d);break}}}return Promise.all(o).then(a=>{let s=new yu;return a.forEach(c=>{s.add(c.scene)}),{tiles:a,scene:s}})}},os=new cn,fS=class extends yu{constructor(e){super(),this.isTilesGroup=!0,this.name="TilesRenderer.TilesGroup",this.tilesRenderer=e,this.matrixWorldInverse=new cn}raycast(e,t){return this.tilesRenderer.raycast(e,t),!1}updateMatrixWorld(e){if(this.matrixAutoUpdate&&this.updateMatrix(),this.matrixWorldNeedsUpdate||e){this.parent===null?os.copy(this.matrix):os.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1;let t=os.elements,n=this.matrixWorld.elements,i=!1;for(let r=0;r<16;r++){let o=t[r],a=n[r];if(Math.abs(o-a)>2**-52){i=!0;break}}if(i){this.matrixWorld.copy(os),this.matrixWorldInverse.copy(os).invert();let r=this.children;for(let c=0,l=r.length;c<l;c++)r[c].updateMatrixWorld();let{tilesRenderer:o}=this,{activeTiles:a,visibleTiles:s}=o;a.forEach(c=>{s.has(c)||c.engineData.scene.updateMatrixWorld(!0)})}}}updateWorldMatrix(e,t){this.parent&&e&&this.parent.updateWorldMatrix(e,!1),this.updateMatrixWorld(!0)}},bS=new vu;function xS(e,t,n,i){let{scene:r}=e.engineData;n.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(e,r,t,i))||t.intersectObject(r,!0,i)}function yS(e){return"traversal"in e}function yf(e,t,n,i,r=null){if(!yS(t))return;let{group:o,activeTiles:a}=e,{boundingVolume:s}=t.engineData;if(r===null&&(r=bS,r.copy(n.ray).applyMatrix4(o.matrixWorldInverse)),!t.traversal.used||!s.intersectsRay(r))return;a.has(t)&&xS(t,n,e,i);let c=t.children;for(let l=0,u=c.length;l<u;l++)yf(e,c[l],n,i,r)}var Kl=new je,Jl=new je,On=new je,Ql=new vu,bu=class{constructor(e=new mf,t=new cn){this.box=e.clone(),this.transform=t.clone(),this.inverseTransform=new cn,this.points=Array(8).fill().map(()=>new je),this.planes=[,,,,,,].fill().map(()=>new iS)}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,On).distanceTo(e)}containsPoint(e){return On.copy(e).applyMatrix4(this.inverseTransform),this.box.containsPoint(On)}intersectsRay(e){return Ql.copy(e).applyMatrix4(this.inverseTransform),Ql.intersectsBox(this.box)}intersectRay(e,t){return Ql.copy(e).applyMatrix4(this.inverseTransform),Ql.intersectBox(this.box,t)?(t.applyMatrix4(this.transform),t):null}update(){let{points:e,inverseTransform:t,transform:n,box:i}=this;t.copy(n).invert();let{min:r,max:o}=i,a=0;for(let s=-1;s<=1;s+=2)for(let c=-1;c<=1;c+=2)for(let l=-1;l<=1;l+=2)e[a].set(s<0?r.x:o.x,c<0?r.y:o.y,l<0?r.z:o.z).applyMatrix4(n),a++;this.updatePlanes()}updatePlanes(){Kl.copy(this.box.min).applyMatrix4(this.transform),Jl.copy(this.box.max).applyMatrix4(this.transform),On.set(0,0,1).transformDirection(this.transform),this.planes[0].setFromNormalAndCoplanarPoint(On,Kl),this.planes[1].setFromNormalAndCoplanarPoint(On,Jl).negate(),On.set(0,1,0).transformDirection(this.transform),this.planes[2].setFromNormalAndCoplanarPoint(On,Kl),this.planes[3].setFromNormalAndCoplanarPoint(On,Jl).negate(),On.set(1,0,0).transformDirection(this.transform),this.planes[4].setFromNormalAndCoplanarPoint(On,Kl),this.planes[5].setFromNormalAndCoplanarPoint(On,Jl).negate()}intersectsSphere(e){return this.clampPoint(e.center,On),On.distanceToSquared(e.center)<=e.radius*e.radius}intersectsFrustum(e){return this._intersectsPlaneShape(e.planes,e.points)}intersectsOBB(e){return this._intersectsPlaneShape(e.planes,e.points)}_intersectsPlaneShape(e,t){let n=this.points,i=this.planes;for(let r=0;r<6;r++){let o=e[r],a=-1/0;for(let s=0;s<8;s++){let c=n[s],l=o.distanceToPoint(c);a=a<l?l:a}if(a<0)return!1}for(let r=0;r<6;r++){let o=i[r],a=-1/0;for(let s=0;s<8;s++){let c=t[s],l=o.distanceToPoint(c);a=a<l?l:a}if(a<0)return!1}return!0}},ls=Math.PI,gu=ls/2,as=new je,qi=new je,fr=new je,Se=new je,_n=new cn,vS=new mf,lf=new cn;function li(e,t){t.radius=Math.max(t.radius,e.distanceToSquared(t.center))}function cf(e){return e.x!==e.y}var vf=class extends Tu{constructor(e=1,t=1,n=1,i=-gu,r=gu,o=0,a=2*ls,s=0,c=0){super(e,t,n),this.latStart=i,this.latEnd=r,this.lonStart=o,this.lonEnd=a,this.heightStart=s,this.heightEnd=c}getBoundingBox(e,t){cf(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported.");let{latStart:n,latEnd:i,lonStart:r,lonEnd:o,heightStart:a,heightEnd:s}=this,c=(n+i)*.5,l=(r+o)*.5,u=n>0,d=i<0,h;h=u?n:d?i:0;let{min:g,max:f}=e;g.setScalar(1/0),f.setScalar(-1/0),o-r<=ls?(this.getCartographicToNormal(c,l,fr),qi.set(0,0,1),as.crossVectors(qi,fr).normalize(),qi.crossVectors(fr,as).normalize(),t.makeBasis(as,qi,fr),_n.copy(t).invert(),this.getCartographicToPosition(h,r,s,Se).applyMatrix4(_n),f.x=Math.abs(Se.x),g.x=-f.x,this.getCartographicToPosition(i,r,s,Se).applyMatrix4(_n),f.y=Se.y,this.getCartographicToPosition(i,l,s,Se).applyMatrix4(_n),f.y=Math.max(Se.y,f.y),this.getCartographicToPosition(n,r,s,Se).applyMatrix4(_n),g.y=Se.y,this.getCartographicToPosition(n,l,s,Se).applyMatrix4(_n),g.y=Math.min(Se.y,g.y),this.getCartographicToPosition(c,l,s,Se).applyMatrix4(_n),f.z=Se.z,this.getCartographicToPosition(n,r,a,Se).applyMatrix4(_n),g.z=Se.z,this.getCartographicToPosition(i,r,a,Se).applyMatrix4(_n),g.z=Math.min(Se.z,g.z)):(this.getCartographicToPosition(h,l,s,fr),fr.z=0,fr.length()<1e-10?fr.set(1,0,0):fr.normalize(),qi.set(0,0,1),as.crossVectors(fr,qi).normalize(),t.makeBasis(as,qi,fr),_n.copy(t).invert(),this.getCartographicToPosition(h,l+gu,s,Se).applyMatrix4(_n),f.x=Math.abs(Se.x),g.x=-f.x,this.getCartographicToPosition(i,0,d?a:s,Se).applyMatrix4(_n),f.y=Se.y,this.getCartographicToPosition(n,0,u?a:s,Se).applyMatrix4(_n),g.y=Se.y,this.getCartographicToPosition(h,l,s,Se).applyMatrix4(_n),f.z=Se.z,this.getCartographicToPosition(h,o,s,Se).applyMatrix4(_n),g.z=Se.z),e.getCenter(Se),e.min.sub(Se).multiplyScalar(1.0000000000001),e.max.sub(Se).multiplyScalar(1.0000000000001),Se.applyMatrix4(t),t.setPosition(Se)}getBoundingSphere(e){cf(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported."),this.getBoundingBox(vS,lf),e.center.setFromMatrixPosition(lf),e.radius=0;let{latStart:t,latEnd:n,lonStart:i,lonEnd:r,heightStart:o,heightEnd:a}=this,s=(t+n)*.5,c=(i+r)*.5,l=t>0,u=n<0,d;d=l?t:u?n:0,this.getCartographicToPosition(d,i,a,Se),li(Se,e),this.getCartographicToPosition(n,i,a,Se),li(Se,e),this.getCartographicToPosition(n,c,a,Se),li(Se,e),this.getCartographicToPosition(t,i,a,Se),li(Se,e),this.getCartographicToPosition(t,c,a,Se),li(Se,e),this.getCartographicToPosition(s,c,a,Se),li(Se,e),this.getCartographicToPosition(t,i,o,Se),li(Se,e),r-i>ls&&(this.getCartographicToPosition(d,c+ls,a,Se),li(Se,e)),e.radius=Math.sqrt(e.radius)*1.0000000000001}},Hr=new je,Wr=new je,$r=new je,df=new je,uf=new je,wS=class{constructor(){this.sphere=null,this.obb=null,this.region=null,this.regionObb=null}intersectsRay(e){let t=this.sphere,n=this.obb||this.regionObb;return!(t&&!e.intersectsSphere(t)||n&&!n.intersectsRay(e))}intersectRay(e,t=null){let n=this.sphere,i=this.obb||this.regionObb,r=-1/0,o=-1/0;n&&e.intersectSphere(n,df)&&(r=n.containsPoint(e.origin)?0:e.origin.distanceToSquared(df)),i&&i.intersectRay(e,uf)&&(o=i.containsPoint(e.origin)?0:e.origin.distanceToSquared(uf));let a=Math.max(r,o);return a===-1/0?null:(e.at(Math.sqrt(a),t),t)}distanceToPoint(e){let t=this.sphere,n=this.obb||this.regionObb,i=-1/0,r=-1/0;return t&&(i=Math.max(t.distanceToPoint(e),0)),n&&(r=n.distanceToPoint(e)),i>r?i:r}intersectsFrustum(e){let t=this.obb||this.regionObb,n=this.sphere;return n&&!e.intersectsSphere(n)||t&&!t.intersectsFrustum(e)?!1:!!(n||t)}intersectsSphere(e){let t=this.obb||this.regionObb,n=this.sphere;return n&&!n.intersectsSphere(e)||t&&!t.intersectsSphere(e)?!1:!!(n||t)}intersectsOBB(e){let t=this.obb||this.regionObb,n=this.sphere;return n&&!e.intersectsSphere(n)||t&&!t.intersectsOBB(e)?!1:!!(n||t)}getOBB(e,t){let n=this.obb||this.regionObb;n?(e.copy(n.box),t.copy(n.transform)):(this.getAABB(e),t.identity())}getAABB(e){if(this.sphere)this.sphere.getBoundingBox(e);else{let t=this.obb||this.regionObb;e.copy(t.box).applyMatrix4(t.transform)}}getSphere(e){if(this.sphere)e.copy(this.sphere);else if(this.region)this.region.getBoundingSphere(e);else{let t=this.obb||this.regionObb;t.box.getBoundingSphere(e),e.applyMatrix4(t.transform)}}setObbData(e,t){let n=new bu;Hr.set(e[3],e[4],e[5]),Wr.set(e[6],e[7],e[8]),$r.set(e[9],e[10],e[11]);let i=Hr.length(),r=Wr.length(),o=$r.length();Hr.normalize(),Wr.normalize(),$r.normalize(),i===0&&Hr.crossVectors(Wr,$r),r===0&&Wr.crossVectors(Hr,$r),o===0&&$r.crossVectors(Hr,Wr),n.transform.set(Hr.x,Wr.x,$r.x,e[0],Hr.y,Wr.y,$r.y,e[1],Hr.z,Wr.z,$r.z,e[2],0,0,0,1).premultiply(t),n.box.min.set(-i,-r,-o),n.box.max.set(i,r,o),n.update(),this.obb=n}setSphereData(e,t,n,i,r){let o=new bf;o.center.set(e,t,n),o.radius=i,o.applyMatrix4(r),this.sphere=o}setRegionData(e,t,n,i,r,o,a){let s=new vf(...e.radius,n,r,t,i,o,a),c=new bu;s.getBoundingBox(c.box,c.transform),c.update(),this.region=s,this.regionObb=c}},CS=new rS;function SS(e,t,n,i){let r=CS.set(e.normal.x,e.normal.y,e.normal.z,t.normal.x,t.normal.y,t.normal.z,n.normal.x,n.normal.y,n.normal.z);return i.set(-e.constant,-t.constant,-n.constant),i.applyMatrix3(r.invert()),i}var MS=class extends eS{constructor(){super(),this.points=Array(8).fill().map(()=>new je)}setFromProjectionMatrix(...e){return super.setFromProjectionMatrix(...e),this.calculateFrustumPoints(),this}calculateFrustumPoints(){let{planes:e,points:t}=this;[[e[0],e[3],e[4]],[e[1],e[3],e[4]],[e[0],e[2],e[4]],[e[1],e[2],e[4]],[e[0],e[3],e[5]],[e[1],e[3],e[5]],[e[0],e[2],e[5]],[e[1],e[2],e[5]]].forEach((n,i)=>{SS(n[0],n[1],n[2],t[i])})}};var xu=0;function pf(e,t,n,i){try{return lS.getByteLength(e,t,n,i)}catch{return xu}}function TS(e){if(!e)return 0;if(e.isExternalTexture)return e.userData?.byteLength??xu;let{format:t,type:n,image:i,mipmaps:r}=e;if(e.isCompressedTexture&&Array.isArray(r)&&r.length>0){let a=0;for(let s of r)s?.data?.byteLength?a+=s.data.byteLength:a+=pf(s.width,s.height,t,n);return a}if(!i)return xu;let o=pf(i.width,i.height,t,n);return o*=e.generateMipmaps?4/3:1,o}function PS(e){let t=new Set,n=0;return e.traverse(i=>{if(i.geometry&&!t.has(i.geometry)&&(n+=cS(i.geometry),t.add(i.geometry)),i.material){let r=i.material;for(let o in r){let a=r[o];a&&a.isTexture&&!t.has(a)&&(n+=TS(a),t.add(a))}}}),n}var wf=Symbol("INITIAL_FRUSTUM_CULLED"),Zl=new cn,ss=new je,fu=new wu,_S=new je(1,0,0),kS=new je(0,1,0),AS=()=>null;function hf(e,t){e.traverse(n=>{n.frustumCulled=n[wf]&&t})}var _u=class extends Wg{get autoDisableRendererCulling(){return this._autoDisableRendererCulling}set autoDisableRendererCulling(e){this._autoDisableRendererCulling!==e&&(super._autoDisableRendererCulling=e,this.forEachLoadedModel(t=>{hf(t,!e)}))}constructor(...e){super(...e),this.accelerateRaycast=!0,this.group=new fS(this),this.ellipsoid=cs.clone(),this.cameras=[],this.cameraMap=new Map,this.cameraInfo=[],this._upRotationMatrix=new cn,this._bytesUsed=new WeakMap,this._autoDisableRendererCulling=!0,this.manager=new nS,this._listeners={}}addEventListener(e,t){Wl.prototype.addEventListener.call(this,e,t)}hasEventListener(e,t){return Wl.prototype.hasEventListener.call(this,e,t)}removeEventListener(e,t){Wl.prototype.removeEventListener.call(this,e,t)}dispatchEvent(e){Wl.prototype.dispatchEvent.call(this,e)}getBoundingBox(e){if(!this.root)return!1;let t=this.root.engineData.boundingVolume;return t?(t.getAABB(e),!0):!1}getOrientedBoundingBox(e,t){if(!this.root)return!1;let n=this.root.engineData.boundingVolume;return n?(n.getOBB(e,t),!0):!1}getBoundingSphere(e){if(!this.root)return!1;let t=this.root.engineData.boundingVolume;return t?(t.getSphere(e),!0):!1}forEachLoadedModel(e){this.traverse(t=>{let n=t.engineData&&t.engineData.scene;n&&e(n,t)},null,!1)}raycast(e,t){if(this.root)if(this.accelerateRaycast)yf(this,this.root,e,t);else{let n=e.firstHitOnly?[]:t;for(let i of this.activeTiles){let{scene:r}=i.engineData;this.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(i,r,e,n))||e.intersectObject(r,!0,n)}e.firstHitOnly&&n.length>0&&(n.sort((i,r)=>i.distance-r.distance),t.push(n[0]))}}hasCamera(e){return this.cameraMap.has(e)}setCamera(e){let t=this.cameras,n=this.cameraMap;return n.has(e)?!1:(n.set(e,new wu),t.push(e),this.dispatchEvent({type:"add-camera",camera:e}),!0)}setResolution(e,t,n){let i=this.cameraMap;if(!i.has(e))return!1;let r=t.isVector2?t.x:t,o=t.isVector2?t.y:n,a=i.get(e);return(a.width!==r||a.height!==o)&&(a.set(r,o),this.dispatchEvent({type:"camera-resolution-change"})),!0}getResolution(e,t){let n=this.cameraMap.get(e);return n?t.copy(n):null}setResolutionFromRenderer(e,t){return t.getSize(fu),this.setResolution(e,fu.x,fu.y)}deleteCamera(e){let t=this.cameras,n=this.cameraMap;if(n.has(e)){let i=t.indexOf(e);return t.splice(i,1),n.delete(e),this.dispatchEvent({type:"delete-camera",camera:e}),!0}return!1}loadRootTileset(...e){return super.loadRootTileset(...e).then(t=>{let{asset:n,extensions:i={}}=t;switch((n&&n.gltfUpAxis||"y").toLowerCase()){case"x":this._upRotationMatrix.makeRotationAxis(kS,-Math.PI/2);break;case"y":this._upRotationMatrix.makeRotationAxis(_S,Math.PI/2);break}if("3DTILES_ellipsoid"in i){let r=i["3DTILES_ellipsoid"],{ellipsoid:o}=this;o.name=r.body,r.radii?o.radius.set(...r.radii):o.radius.set(1,1,1)}return t})}prepareForTraversal(){let e=this.group,t=this.cameras,n=this.cameraMap,i=this.cameraInfo;for(;i.length>t.length;)i.pop();for(;i.length<t.length;)i.push({frustum:new MS,isOrthographic:!1,sseDenominator:-1,position:new je,invScale:-1,pixelSize:0});ss.setFromMatrixScale(e.matrixWorldInverse),Math.abs(Math.max(ss.x-ss.y,ss.x-ss.z))>1e-6&&console.warn("ThreeTilesRenderer : Non uniform scale used for tile which may cause issues when calculating screen space error.");for(let r=0,o=i.length;r<o;r++){let a=t[r],s=i[r],c=s.frustum,l=s.position,u=n.get(a);(u.width===0||u.height===0)&&console.warn("TilesRenderer: resolution for camera error calculation is not set.");let d=a.projectionMatrix.elements;if(s.isOrthographic=d[15]===1,s.isOrthographic){let h=2/d[0],g=2/d[5];s.pixelSize=Math.max(g/u.height,h/u.width)}else s.sseDenominator=2/d[5]/u.height;Zl.copy(e.matrixWorld),Zl.premultiply(a.matrixWorldInverse),Zl.premultiply(a.projectionMatrix),c.setFromProjectionMatrix(Zl,a.coordinateSystem,a.reversedDepth),l.set(0,0,0),l.applyMatrix4(a.matrixWorld),l.applyMatrix4(e.matrixWorldInverse)}}update(){if(super.update(),this.cameras.length===0&&this.root){let e=!1;this.invokeAllPlugins(t=>e||(e=!!(t!==this&&t.calculateTileViewError))),e===!1&&console.warn("TilesRenderer: no cameras defined. Cannot update 3d tiles.")}}preprocessNode(e,t,n=null){super.preprocessNode(e,t,n);let i=new cn;if(e.transform){let a=e.transform;for(let s=0;s<16;s++)i.elements[s]=a[s]}n&&i.premultiply(n.engineData.transform);let r=new cn().copy(i).invert(),o=new wS;"sphere"in e.boundingVolume&&o.setSphereData(...e.boundingVolume.sphere,i),"box"in e.boundingVolume&&o.setObbData(e.boundingVolume.box,i),"region"in e.boundingVolume&&o.setRegionData(this.ellipsoid,...e.boundingVolume.region),e.engineData.transform=i,e.engineData.transformInverse=r,e.engineData.boundingVolume=o,e.engineData.geometry=null,e.engineData.materials=null,e.engineData.textures=null,e.toJSON=AS}async parseTile(e,t,n,i,r){let o=t.engineData,a=Gl(i),s=this.fetchOptions,c=this.manager,l=null,u=o.transform,d=this._upRotationMatrix,h=($i(e)||n).toLowerCase();switch(h){case"b3dm":{let m=new Su(c);m.workingPath=a,m.fetchOptions=s,m.adjustmentTransform.copy(d),l=m.parse(e);break}case"pnts":{let m=new Mu(c);m.workingPath=a,m.fetchOptions=s,l=m.parse(e);break}case"i3dm":{let m=new Pu(c);m.workingPath=a,m.fetchOptions=s,m.adjustmentTransform.copy(d),m.ellipsoid.copy(this.ellipsoid),l=m.parse(e);break}case"cmpt":{let m=new xf(c);m.workingPath=a,m.fetchOptions=s,m.adjustmentTransform.copy(d),m.ellipsoid.copy(this.ellipsoid),l=m.parse(e).then(S=>S.scene);break}case"gltf":case"glb":{let m=c.getHandler("path.gltf")||c.getHandler("path.glb")||new Cu(c);m.setWithCredentials(s.credentials==="include"),m.setRequestHeader(s.headers||{}),s.credentials==="include"&&s.mode==="cors"&&m.setCrossOrigin("use-credentials");let S=m.resourcePath||m.path||a;!/[\\/]$/.test(S)&&S.length&&(S+="/"),l=m.parseAsync(e,S).then(M=>{M.scene=M.scene||new yu;let{scene:T}=M;return T.updateMatrix(),T.matrix.multiply(d).decompose(T.position,T.quaternion,T.scale),M});break}default:l=this.invokeOnePlugin(m=>m.parseToMesh&&m.parseToMesh(e,t,n,i,r));break}let g=await l;if(g===null)throw Error(`TilesRenderer: Content type "${h}" not supported.`);let f,v;g.isObject3D?(f=g,v=null):(f=g.scene,v=g),f.updateMatrix(),f.matrix.premultiply(u),f.matrix.decompose(f.position,f.quaternion,f.scale),await this.invokeAllPlugins(m=>m.processTileModel&&m.processTileModel(f,t)),f.traverse(m=>{m[wf]=m.frustumCulled,m.userData.tile=t}),hf(f,!this.autoDisableRendererCulling);let _=[],y=[],p=[];if(f.traverse(m=>{if(m.geometry&&y.push(m.geometry),m.material){let S=m.material;_.push(m.material);for(let M in S){let T=S[M];T&&T.isTexture&&p.push(T)}}}),r.aborted){for(let m=0,S=p.length;m<S;m++){let M=p[m];M.image instanceof ImageBitmap&&M.image.close(),M.dispose()}return}o.materials=_,o.geometry=y,o.textures=p,o.scene=f,o.metadata=v}disposeTile(e){super.disposeTile(e);let t=e.engineData;if(t.scene){let n=t.materials,i=t.geometry,r=t.textures,o=t.scene.parent;t.scene.traverse(a=>{a.userData.meshFeatures&&a.userData.meshFeatures.dispose(),a.userData.structuralMetadata&&a.userData.structuralMetadata.dispose()});for(let a=0,s=i.length;a<s;a++)i[a].dispose();for(let a=0,s=n.length;a<s;a++)n[a].dispose();for(let a=0,s=r.length;a<s;a++){let c=r[a];c.image instanceof ImageBitmap&&c.image.close(),c.dispose()}o&&o.remove(t.scene),t.scene=null,t.materials=null,t.textures=null,t.geometry=null,t.metadata=null}}setTileActive(e,t){super.setTileActive(e,t);let n=e.engineData.scene;n&&(t?(n.parent=this.group,n.updateMatrixWorld(!0)):n.parent=null)}setTileVisible(e,t){let n=e.engineData.scene,{activeTiles:i,group:r}=this;n&&(t?r.add(n):(r.remove(n),i.has(e)&&(n.parent=r))),super.setTileVisible(e,t)}calculateBytesUsed(e,t){let n=this._bytesUsed;return!n.has(e)&&t&&n.set(e,PS(t)),n.get(e)??null}calculateTileViewError(e,t){let n=e.engineData,i=this.cameras,r=this.cameraInfo,o=n.boundingVolume,a=!1,s=0,c=1/0,l=0,u=1/0;for(let d=0,h=i.length;d<h;d++){let g=r[d],f,v;if(g.isOrthographic){let y=g.pixelSize;f=e.geometricError/y,v=1/0}else{let y=g.sseDenominator;v=o.distanceToPoint(g.position),f=v===0?1/0:e.geometricError/(v*y)}let _=r[d].frustum;o.intersectsFrustum(_)&&(a=!0,s=Math.max(s,f),c=Math.min(c,v)),l=Math.max(l,f),u=Math.min(u,v)}a?(t.inView=!0,t.error=s,t.distanceFromCamera=c):(t.inView=!1,t.error=l,t.distanceFromCamera=u)}dispose(){super.dispose(),this.group.removeFromParent()}};import{BatchedMesh as VL,Box2 as ES,Box3 as FL,Box3Helper as UL,BoxGeometry as GL,BufferAttribute as Eu,BufferGeometry as HL,CanvasTexture as WL,Color as $L,CustomBlending as RS,DataTexture as LS,DefaultLoadingManager as XL,DoubleSide as qL,EventDispatcher as YL,FileLoader as BS,FloatType as KL,Frustum as JL,GreaterDepth as QL,Group as ZL,LineBasicMaterial as eB,LineSegments as tB,LinearFilter as OS,LinearMipMapLinearFilter as nB,MathUtils as Ru,Matrix2 as DS,Matrix3 as NS,Matrix4 as IS,Mesh as rB,MeshBasicMaterial as zS,MeshLambertMaterial as iB,MeshStandardMaterial as oB,OneFactor as jS,PlaneGeometry as aB,Points as sB,PointsMaterial as lB,Quaternion as cB,REVISION as dB,RGFormat as uB,Ray as pB,Raycaster as hB,RedFormat as mB,SRGBColorSpace as gB,ShaderMaterial as VS,Source as fB,Sphere as bB,SphereGeometry as xB,Texture as yB,TextureUtils as vB,Triangle as wB,UnsignedByteType as CB,Vector2 as br,Vector3 as If,Vector4 as FS,WebGLArrayRenderTarget as SB,WebGLRenderTarget as Cf,WebGLRenderer as US,ZeroFactor as GS}from"three";import{GLTFLoader as HS}from"three/addons/loaders/GLTFLoader.js";import{FullScreenQuad as zf}from"three/addons/postprocessing/Pass.js";var PB=Object.freeze({fill:"#cccccc",stroke:"transparent",strokeWidth:1,radius:2,order:0,visible:!0});var Sf=new Wo;Sf.maxJobs=10,Sf.priorityCallback=(e,t)=>{let n=e.tile,i=t.tile,r=n.internal.renderer,o=i.internal.renderer,a=r.visibleTiles.has(n);return a===o.visibleTiles.has(i)?ts(n,i):a?1:-1};var Mf=new If;function ds(e,t){if(e.isInterleavedBufferAttribute||e.array instanceof t)return e;let n=t===Int8Array||t===Int16Array||t===Int32Array?-1:0,i=new Eu(new t(e.count*e.itemSize),e.itemSize,!0),r=e.itemSize,o=e.count;for(let a=0;a<o;a++)for(let s=0;s<r;s++){let c=Ru.clamp(e.getComponent(a,s),n,1);i.setComponent(a,s,c)}return i}function WS(e,t=Int16Array){let n=e.geometry,i=n.attributes,r=i.position;if(r.isInterleavedBufferAttribute||r.array instanceof t)return r;let o=new Eu(new t(r.count*r.itemSize),r.itemSize,!1),a=r.itemSize,s=r.count;n.computeBoundingBox();let c=n.boundingBox,{min:l,max:u}=c,d=2**(8*t.BYTES_PER_ELEMENT-1)-1,h=-d;for(let g=0;g<s;g++)for(let f=0;f<a;f++){let v=f===0?"x":f===1?"y":"z",_=l[v],y=u[v],p=Ru.mapLinear(r.getComponent(g,f),_,y,h,d);o.setComponent(g,f,p)}c.getCenter(Mf).multiply(e.scale).applyQuaternion(e.quaternion),e.position.add(Mf),e.scale.x*=.5*(u.x-l.x)/d,e.scale.y*=.5*(u.y-l.y)/d,e.scale.z*=.5*(u.z-l.z)/d,i.position=o,e.geometry.boundingBox=null,e.geometry.boundingSphere=null,e.updateMatrixWorld()}var Lu=class{constructor(e){this._options={generateNormals:!1,disableMipmaps:!0,compressIndex:!0,compressNormals:!1,compressUvs:!1,compressPosition:!1,uvType:Int8Array,normalType:Int8Array,positionType:Int16Array,...e},this.name="TILES_COMPRESSION_PLUGIN",this.priority=-100}processTileModel(e,t){let{generateNormals:n,disableMipmaps:i,compressIndex:r,compressUvs:o,compressNormals:a,compressPosition:s,uvType:c,normalType:l,positionType:u}=this._options;e.traverse(d=>{if(d.material&&i){let h=d.material;for(let g in h){let f=h[g];f&&f.isTexture&&f.generateMipmaps&&(f.generateMipmaps=!1,f.minFilter=OS)}}if(d.geometry){let h=d.geometry,g=h.attributes;if(o){let{uv:f,uv1:v,uv2:_,uv3:y}=g;f&&(g.uv=ds(f,c)),v&&(g.uv1=ds(v,c)),_&&(g.uv2=ds(_,c)),y&&(g.uv3=ds(y,c))}if(n&&!g.normals&&h.computeVertexNormals(),a&&g.normals&&(g.normals=ds(g.normals,l)),s&&WS(d,u),r&&h.index){let f=g.position.count,v=h.index,_=f>65535?Uint32Array:f>255?Uint16Array:Uint8Array;if(!(v.array instanceof _)){let y=new _(h.index.count);y.set(v.array);let p=new Eu(y,1);h.setIndex(p)}}}})}};function dn(e,t,n){return e&&t in e?e[t]:n}function jf(e){return e!=="BOOLEAN"&&e!=="STRING"&&e!=="ENUM"}function $S(e){return/^FLOAT/.test(e)}function ms(e){return/^VEC/.test(e)}function gs(e){return/^MAT/.test(e)}function Vf(e,t,n,i=null){return gs(n)||ms(n)?i.fromArray(e,t):e[t]}function ku(e){let{type:t,componentType:n}=e;switch(t){case"SCALAR":return n==="INT64"?0n:0;case"VEC2":return new br;case"VEC3":return new If;case"VEC4":return new FS;case"MAT2":return new DS;case"MAT3":return new NS;case"MAT4":return new IS;case"BOOLEAN":return!1;case"STRING":return"";case"ENUM":return 0}}function Tf(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 hs(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 XS(e,t=null){if(e.array){t=t&&Array.isArray(t)?t:[],t.length=e.count;for(let n=0,i=t.length;n<i;n++)t[n]=tc(e,t[n])}else t=tc(e,t);return t}function tc(e,t=null){let n=e.default,i=e.type;if(t||(t=ku(e)),n===null){switch(i){case"SCALAR":return 0;case"VEC2":return t.set(0,0);case"VEC3":return t.set(0,0,0);case"VEC4":return t.set(0,0,0,0);case"MAT2":return t.identity();case"MAT3":return t.identity();case"MAT4":return t.identity();case"BOOLEAN":return!1;case"STRING":return"";case"ENUM":return""}throw Error("ClassProperty: invalid type.")}else if(gs(i))t.fromArray(n);else if(ms(i))t.fromArray(n);else return n}function qS(e,t){if(e.noData===null)return t;let n=e.noData,i=e.type;if(Array.isArray(t))for(let a=0,s=t.length;a<s;a++)t[a]=r(t[a]);else t=r(t);return t;function r(a){return o(a)&&(a=tc(e,a)),a}function o(a){if(gs(i)){let s=a.elements;for(let c=0,l=n.length;c<l;c++)if(n[c]!==s[c])return!1;return!0}else if(ms(i)){for(let s=0,c=n.length;s<c;s++)if(n[s]!==a.getComponent(s))return!1;return!0}else return n===a}}function YS(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 KS(e,t){let{type:n,componentType:i,scale:r,offset:o,normalized:a}=e;if(Array.isArray(t))for(let d=0,h=t.length;d<h;d++)t[d]=s(t[d]);else t=s(t);return t;function s(d){return d=gs(n)?l(d):ms(n)?c(d):u(d),d}function c(d){return d.x=u(d.x),d.y=u(d.y),"z"in d&&(d.z=u(d.z)),"w"in d&&(d.w=u(d.w)),d}function l(d){let h=d.elements;for(let g=0,f=h.length;g<f;g++)h[g]=u(h[g]);return d}function u(d){return a&&(d=YS(i,d)),(a||$S(i))&&(d=d*r+o),d}}function Bu(e,t,n=null){if(e.array){Array.isArray(t)||(t=Array(e.count||0)),t.length=n===null?e.count:n;for(let i=0,r=t.length;i<r;i++)Tf(e.type,t[i])||(t[i]=ku(e))}else Tf(e.type,t)||(t=ku(e));return t}function nc(e,t){for(let n in t)n in e||delete t[n];for(let n in e){let i=e[n];t[n]=Bu(i,t[n])}}function JS(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 ic=class{constructor(e,t,n=null){this.name=t.name||null,this.description=t.description||null,this.type=t.type,this.componentType=t.componentType||null,this.enumType=t.enumType||null,this.array=t.array||!1,this.count=t.count||0,this.normalized=t.normalized||!1,this.offset=t.offset||0,this.scale=dn(t,"scale",1),this.max=dn(t,"max",1/0),this.min=dn(t,"min",-1/0),this.required=t.required||!1,this.noData=dn(t,"noData",null),this.default=dn(t,"default",null),this.semantic=dn(t,"semantic",null),this.enumSet=null,this.accessorProperty=n,n&&(this.offset=dn(n,"offset",this.offset),this.scale=dn(n,"scale",this.scale),this.max=dn(n,"max",this.max),this.min=dn(n,"min",this.min)),t.type==="ENUM"&&(this.enumSet=e[this.enumType],this.componentType===null&&(this.componentType=dn(this.enumSet,"valueType","UINT16")))}shapeToProperty(e,t=null){return Bu(this,e,t)}resolveDefaultElement(e){return tc(this,e)}resolveDefault(e){return XS(this,e)}resolveNoData(e){return qS(this,e)}resolveEnumsToStrings(e){let t=this.enumSet;if(this.type==="ENUM")if(Array.isArray(e))for(let i=0,r=e.length;i<r;i++)e[i]=n(e[i]);else e=n(e);return e;function n(i){let r=t.values.find(o=>o.value===i);return r===null?"":r.name}}adjustValueScaleOffset(e){return jf(this.type)?KS(this,e):e}},Ou=class{constructor(e,t={},n={},i=null){this.definition=e,this.class=t[e.class],this.className=e.class,this.enums=n,this.data=i,this.name="name"in e?e.name:null,this.properties=null}getPropertyNames(){return Object.keys(this.class.properties)}includesData(e){return!!this.definition.properties[e]}dispose(){}_initProperties(e=ic){let t={};for(let n in this.class.properties)t[n]=new e(this.enums,this.class.properties[n],this.definition.properties[n]);this.properties=t}},QS=class extends ic{constructor(e,t,n=null){super(e,t,n),this.attribute=n?.attribute??null}},ZS=class extends Ou{constructor(...e){super(...e),this.isPropertyAttributeAccessor=!0,this._initProperties(QS)}getData(e,t,n={}){let i=this.properties;nc(i,n);for(let r in i)n[r]=this.getPropertyValue(r,e,t,n[r]);return n}getPropertyValue(e,t,n,i=null){if(t>=this.count)throw Error("PropertyAttributeAccessor: Requested index is outside the range of the buffer.");let r=this.properties[e],o=r.type;if(!r)throw Error("PropertyAttributeAccessor: Requested class property does not exist.");if(!this.definition.properties[e])return r.resolveDefault(i);i=r.shapeToProperty(i);let a=n.getAttribute(r.attribute.toLowerCase());if(gs(o)){let s=i.elements;for(let c=s.length;0<c;)s[0]=a.getComponent(t,0)}else if(ms(o))i.fromBufferAttribute(a,t);else if(o==="SCALAR"||o==="ENUM")i=a.getX(t);else throw Error("StructuredMetadata.PropertyAttributeAccessor: BOOLEAN and STRING types are not supported by property attributes.");return i=r.adjustValueScaleOffset(i),i=r.resolveEnumsToStrings(i),i=r.resolveNoData(i),i}},eM=class extends ic{constructor(e,t,n=null){super(e,t,n),this.values=n?.values??null,this.valueLength=JS(this.type),this.arrayOffsets=dn(n,"arrayOffsets",null),this.stringOffsets=dn(n,"stringOffsets",null),this.arrayOffsetType=dn(n,"arrayOffsetType","UINT32"),this.stringOffsetType=dn(n,"stringOffsetType","UINT32")}getArrayLengthFromId(e,t){let n=this.count;if(this.arrayOffsets!==null){let{arrayOffsets:i,arrayOffsetType:r}=this,o=new(hs(r))(e[i]);n=o[t+1]-o[t]}return n}getIndexOffsetFromId(e,t){let n=t;if(this.arrayOffsets){let{arrayOffsets:i,arrayOffsetType:r}=this;n=new(hs(r))(e[i])[n]}else this.array&&(n*=this.count);return n}},tM=class extends Ou{constructor(...e){super(...e),this.isPropertyTableAccessor=!0,this.count=this.definition.count,this._initProperties(eM)}getData(e,t={}){let n=this.properties;nc(n,t);for(let i in n)t[i]=this.getPropertyValue(i,e,t[i]);return t}_readValueAtIndex(e,t,n,i=null){let r=this.properties[e],{componentType:o,type:a}=r,s=this.data,c=s[r.values],l=new(hs(o,a))(c),u=r.getIndexOffsetFromId(s,t);if(jf(a)||a==="ENUM")return Vf(l,(u+n)*r.valueLength,a,i);if(a==="STRING"){let d=u+n,h=0;if(r.stringOffsets!==null){let{stringOffsets:f,stringOffsetType:v}=r,_=new(hs(v))(s[f]);h=_[d+1]-_[d],d=_[d]}let g=new Uint8Array(l.buffer,d,h);i=new TextDecoder().decode(g)}else if(a==="BOOLEAN"){let d=u+n,h=Math.floor(d/8),g=d%8;i=(l[h]>>g&1)==1}return i}getPropertyValue(e,t,n=null){if(t>=this.count)throw Error("PropertyTableAccessor: Requested index is outside the range of the table.");let i=this.properties[e];if(!i)throw Error("PropertyTableAccessor: Requested property does not exist.");if(!this.definition.properties[e])return i.resolveDefault(n);let r=i.array,o=this.data,a=i.getArrayLengthFromId(o,t);if(n=i.shapeToProperty(n,a),r)for(let s=0,c=n.length;s<c;s++)n[s]=this._readValueAtIndex(e,t,s,n[s]);else n=this._readValueAtIndex(e,t,0,n);return n=i.adjustValueScaleOffset(n),n=i.resolveEnumsToStrings(n),n=i.resolveNoData(n),n}},us=new ES,Pf=class{constructor(){this._renderer=new US,this._target=new Cf(1,1),this._texTarget=new Cf,this._quad=new zf(new VS({blending:RS,blendDst:GS,blendSrc:jS,uniforms:{map:{value:null},pixel:{value:new br}},vertexShader:`
|
|
9
|
+
`,$d=class extends c1{constructor(t=1){super("ExposureEffect",u1,{blendFunction:l1.NORMAL,uniforms:new Map([["exposure",new d1(t)]])})}set exposure(t){this.uniforms.get("exposure").value=t}},Qm=o1(function({exposure:t},n){let i=s1(()=>new $d(t),[]);return i.exposure=t,a1(n,()=>i,[i]),p1("primitive",{object:i,dispose:null})});import{useFrame as h1,useThree as Tl}from"@react-three/fiber";import*as ng from"@react-three/postprocessing";import{BlendFunction as m1}from"postprocessing";import{Color as g1,MathUtils as f1,Mesh as b1,Vector2 as Zm,Vector3 as eg}from"three";import{useEffect as tg,useMemo as Pl,useRef as Xd}from"react";import{jsx as y1}from"react/jsx-runtime";var x1=ng.LensFlareEffect;function rg({config:e}){let t=Tl(h=>h.camera),n=Tl(h=>h.raycaster),i=Tl(h=>h.scene),r=Tl(h=>h.viewport),o=Xd(null),a=Xd(new eg),s=Xd(new Zm),c=Pl(()=>new eg(...e.lensPosition),[e.lensPosition]),l=Pl(()=>new g1(e.colorGain??"#141414"),[e.colorGain]),u=Pl(()=>new Zm(0,0),[]),d=Pl(()=>new x1({blendFunction:m1.NORMAL,enabled:!0,glareSize:e.glareSize,lensPosition:c,screenRes:u,starPoints:6,flareSize:e.flareSize,flareSpeed:e.flareSpeed,flareShape:e.flareShape,animated:e.animated,anamorphic:e.anamorphic,colorGain:l,lensDirtTexture:null,haloScale:e.haloScale,secondaryGhosts:e.secondaryGhosts,aditionalStreaks:e.aditionalStreaks,ghostScale:e.ghostScale,opacity:e.opacity,starBurst:e.starBurst}),[l,e.aditionalStreaks,e.anamorphic,e.animated,e.flareShape,e.flareSize,e.flareSpeed,e.glareSize,e.haloScale,e.ghostScale,e.opacity,e.secondaryGhosts,e.starBurst,c,u]);return tg(()=>(o.current=d,()=>{d.dispose(),o.current=null}),[d]),tg(()=>{let h=d.uniforms.get("screenRes");h&&(h.value.x=r.width,h.value.y=r.height)},[d,r]),h1((h,g)=>{let f=o.current;if(!f)return;let y=f.uniforms.get("lensPosition"),k=f.uniforms.get("opacity");if(!y||!k)return;let v=1;if(a.current.copy(c).project(t),a.current.z>1)return;y.value.x=a.current.x,y.value.y=a.current.y,s.current.x=a.current.x,s.current.y=a.current.y,n.setFromCamera(s.current,t);let p=n.intersectObjects(i.children,!0),{object:m}=p[0]||{};m&&(m.userData?.lensflare==="no-occlusion"?v=0:m instanceof b1&&(m.material.uniforms?._transmission?.value>.2||m.material._transmission&&m.material._transmission>.2?v=.2:m.material.transparent&&(v=m.material.opacity))),k.value=f1.damp(k.value,v,12,g)}),y1("primitive",{object:d,dispose:null})}import{RampType as qd}from"@react-three/postprocessing";import{GlitchMode as Yd,KernelSize as Xo,ToneMappingMode as Kd}from"postprocessing";import{Color as v1}from"three";function ig(e){return e==="linear"?Kd.LINEAR:e==="reinhard"?Kd.REINHARD:Kd.ACES_FILMIC}function kl(e){switch(e){case"verySmall":return Xo.VERY_SMALL;case"small":return Xo.SMALL;case"medium":return Xo.MEDIUM;case"large":return Xo.LARGE;case"veryLarge":return Xo.VERY_LARGE;case"huge":return Xo.HUGE}}function og(e){switch(e){case"constantMild":return Yd.CONSTANT_MILD;case"constantWild":return Yd.CONSTANT_WILD;default:return Yd.SPORADIC}}function Jd(e){let t=new v1(e);return[t.r,t.g,t.b,1]}function ag(e){return e==="radial"?qd.Radial:e==="mirroredLinear"?qd.MirroredLinear:qd.Linear}import{Fragment as J1,jsx as ut,jsxs as Qd}from"react/jsx-runtime";var qi={edgeStrength:1,pulseSpeed:0,visibleEdgeColor:new Al(qr.color).getHex(),hiddenEdgeColor:new Al(qr.color).multiplyScalar(.35).getHex(),kernelSize:H1.VERY_SMALL,blur:!1,xRay:!1};function X1(e){let t=[];return e.traverse(n=>{n.isMesh&&t.push(n)}),t}var Zd=[],q1=W1(function({sceneConfig:t,selectedObjectRef:n,highlightOnHover:i=!1,disabled:r=!1,onOutlineEffect:o}){let a=_l(C=>C.scene),s=_l(C=>C.gl),c=lg(null),l=t?.postProcessing,u=n??null,d=l?.outline.enabled===!0,h=d||i,[g,f]=cg(()=>s.xr?.isPresenting??!1);sg(()=>{let C=s.xr;if(!C)return;let P=()=>f(!0),A=()=>f(!1);return C.addEventListener("sessionstart",P),C.addEventListener("sessionend",A),f(C.isPresenting),()=>{C.removeEventListener("sessionstart",P),C.removeEventListener("sessionend",A)}},[s]);let y=a.children.filter(C=>C.isLight),k=rs(()=>new ns(l?.chromaticAberration.offsetX??.002,l?.chromaticAberration.offsetY??.002),[l?.chromaticAberration.offsetX,l?.chromaticAberration.offsetY]),v=rs(()=>new Al(l?.outline.visibleEdgeColor??"#ffffff").getHex(),[l?.outline.visibleEdgeColor]),p=rs(()=>new Al(l?.outline.hiddenEdgeColor??"#22090a").getHex(),[l?.outline.hiddenEdgeColor]),m=rs(()=>Jd(l?.ramp.startColor??"#000000"),[l?.ramp.startColor]),M=rs(()=>Jd(l?.ramp.endColor??"#ffffff"),[l?.ramp.endColor]);return!l||g||r?null:Qd(J1,{children:[l.godRays.enabled===!0&&Qd("mesh",{ref:c,position:l.godRays.sunPosition,visible:!1,frustumCulled:!1,children:[ut("sphereGeometry",{args:[.1,8,8]}),ut("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),Qd(_1,{multisampling:0,enableNormalPass:l.ssao.enabled===!0,autoClear:!1,children:[l.smaa.enabled===!0&&ut(V1,{}),l.ssao.enabled===!0&&ut(F1,{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&&ut(w1,{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&&ut(P1,{focusDistance:l.depthOfField.focusDistance,focusRange:l.depthOfField.focusRange,focalLength:l.depthOfField.focalLength,bokehScale:l.depthOfField.bokehScale}),l.bloom.enabled===!0&&ut(C1,{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&&ut(z1,{selection:u??void 0,lights:y,selectionLayer:l.selectiveBloom.selectionLayer,intensity:l.selectiveBloom.intensity,luminanceThreshold:l.selectiveBloom.luminanceThreshold,luminanceSmoothing:l.selectiveBloom.luminanceSmoothing,kernelSize:kl(l.selectiveBloom.kernelSize),mipmapBlur:l.selectiveBloom.mipmapBlur,inverted:l.selectiveBloom.inverted,ignoreBackground:l.selectiveBloom.ignoreBackground}),h&&ut(O1,{ref:o,selection:Zd,selectionLayer:l.outline.selectionLayer,blendFunction:ts.SCREEN,edgeStrength:d?l.outline.edgeStrength:qi.edgeStrength,pulseSpeed:d?l.outline.pulseSpeed:qi.pulseSpeed,visibleEdgeColor:d?v:qi.visibleEdgeColor,hiddenEdgeColor:d?p:qi.hiddenEdgeColor,kernelSize:d?kl(l.outline.kernelSize):qi.kernelSize,blur:d?l.outline.blur:qi.blur,xRay:d?l.outline.xRay:qi.xRay}),l.chromaticAberration.enabled===!0&&ut(M1,{offset:k,radialModulation:l.chromaticAberration.radialModulation,modulationOffset:l.chromaticAberration.modulationOffset}),l.colorAverage.enabled===!0&&ut(T1,{}),l.dotScreen.enabled===!0&&ut(k1,{angle:l.dotScreen.angle,scale:l.dotScreen.scale}),l.glitch.enabled===!0&&ut(A1,{mode:og(l.glitch.mode),delay:new ns(l.glitch.delay[0],l.glitch.delay[1]),duration:new ns(l.glitch.duration[0],l.glitch.duration[1]),strength:new ns(l.glitch.strength[0],l.glitch.strength[1]),chromaticAberrationOffset:new ns(l.glitch.chromaticAberrationOffset[0],l.glitch.chromaticAberrationOffset[1]),columns:l.glitch.columns,ratio:l.glitch.ratio,active:!0}),l.grid.enabled===!0&&ut(R1,{scale:l.grid.scale,lineWidth:l.grid.lineWidth}),l.lensflare.enabled===!0&&ut(rg,{config:l.lensflare}),l.godRays.enabled===!0&&ut(E1,{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:kl(l.godRays.kernelSize)}),l.noise.enabled===!0&&ut(B1,{premultiply:l.noise.premultiply,opacity:l.noise.opacity,blendFunction:ts.ADD}),l.brightnessContrast.enabled===!0&&ut(S1,{brightness:l.brightnessContrast.brightness,contrast:l.brightnessContrast.contrast}),l.hueSaturation.enabled===!0&&ut(L1,{hue:l.hueSaturation.hue,saturation:l.hueSaturation.saturation}),l.toneMapping.enabled===!0&&ut(Qm,{exposure:l.toneMapping.exposure}),l.vignette.enabled===!0&&ut(G1,{eskil:l.vignette.eskil,offset:l.vignette.offset,darkness:l.vignette.darkness,blendFunction:ts.NORMAL}),l.toneMapping.enabled===!0&&ut(U1,{mode:ig(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&&ut(j1,{intensity:l.sepia.intensity,blendFunction:ts.NORMAL}),l.scanline.enabled===!0&&ut(I1,{density:l.scanline.density,blendFunction:ts.OVERLAY}),l.pixelation.enabled===!0&&ut(D1,{granularity:l.pixelation.granularity}),l.ramp.enabled===!0&&ut(N1,{rampType:ag(l.ramp.rampType),rampStart:l.ramp.rampStart,rampEnd:l.ramp.rampEnd,startColor:m,endColor:M,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 Y1(e){let t=[e];for(;t.length>0;){let n=t.pop();if(n.visible){if(n.isMesh)return!0;t.push(...n.children)}}return!1}function K1(e,t){return e.length===t.length&&e.every((n,i)=>n===t[i])}function dg({hoveredObjectRef:e,...t}){let n=_l(c=>c.scene),i=_l(c=>c.invalidate),[r,o]=cg(null),a=$1(c=>o(c),[]),s=lg({effect:null,objects:Zd});return sg(()=>{if(!r)return;let l=t.sceneConfig?.postProcessing?.outline.enabled===!0?X1(n):e&&Y1(e)?[e]:Zd;s.current.effect===r&&K1(s.current.objects,l)||(s.current={effect:r,objects:l},r.selection.set(l),i())}),ut(q1,{...t,onOutlineEffect:a})}import{Component as Q1}from"react";var El=class extends Q1{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n,i){this.props.onError?.(n)}render(){return this.state.hasError?this.props.fallback??null:this.props.children}};import{Fragment as dw,jsx as Un,jsxs as ug}from"react/jsx-runtime";var lw=1.5;function cw({captureRef:e}){let{gl:t,scene:n,camera:i,invalidate:r}=ew();return aw(()=>{if(e)return e.current={gl:t,scene:n,camera:i,invalidate:r},()=>{e.current=null}},[e,t,n,i,r]),null}function eu({children:e,camera:t,backgroundColor:n,shadows:i=!0,sceneConfig:r,selectedObjectRef:o,hoveredObjectRef:a,highlightOnHover:s,renderMode:c="demand",maxDpr:l=2,xrStore:u,rendererCaptureRef:d,preserveDrawingBuffer:h=!1,reduceGpuLoad:g}){let f=g??Id(),y=f?Math.min(l,lw):l,k=i&&!f,v=Rl(()=>n?{background:n}:r?.background.enabled?r.background.type==="color"?{background:r.background.color}:r.background.type==="image"&&r.background.imageUrl.trim()?{backgroundImage:`url("${r.background.imageUrl}")`,backgroundPosition:"center",backgroundRepeat:"no-repeat",backgroundSize:"cover"}:{background:"linear-gradient(180deg, #3a3a3c 0%, #1c1c1d 100%)"}:{background:"transparent"},[n,r]),p=Rl(()=>{if(n)return n;let T=r?.background;if(T?.enabled){if(T.type==="color")return T.color;if(T.type==="image"&&T.imageUrl.trim()||T.type==="environment")return null}return"#1c1c1d"},[n,r]),m=Rl(()=>{let T=r?.postProcessing;return T?!!(T.glitch.enabled||T.noise.enabled||T.lensflare.enabled&&T.lensflare.animated):!1},[r?.postProcessing]),[M,C]=sw(!1),P=r?.environment,A=r?.groundShadows,b=Rl(()=>{if(!P)return null;if(P.source==="custom"){let T=P.customEnvironmentUrl.trim();return ml(T)?{files:T}:null}return{preset:P.preset}},[P]),w=ug(dw,{children:[Un(cw,{captureRef:d}),Un(Vm,{cameraConfig:t}),Un(Im,{active:m}),Un(zm,{color:p}),b?Un(El,{onError:T=>console.warn("Failed to load environment map:",T),children:Un(ow,{fallback:null,children:Un(nw,{...b,environmentIntensity:P?.intensity??.25,backgroundIntensity:P?.intensity??.25,background:r?.background.enabled===!0&&r.background.type==="environment"})})}):null,Un(jm,{rotation:P?.rotation??0}),u&&Un(Nm,{onPresentingChange:C}),A?.enabled&&A.mode==="shadowCatcher"&&!M&&Un(tw,{position:[0,A.height,0],scale:A.size,opacity:A.intensity,blur:A.borderFade,far:15,resolution:1024,color:"#000000"}),e,Un(dg,{sceneConfig:r,selectedObjectRef:o,hoveredObjectRef:a,highlightOnHover:s,disabled:f})]});return Un(Z1,{frameloop:c,dpr:[1,y],shadows:k?"soft":!1,resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:v,camera:t??{fov:50},gl:{preserveDrawingBuffer:h,toneMapping:iw,toneMappingExposure:1},children:u?ug(rw,{store:u,children:[Un(Dm,{renderMode:c}),w]}):w})}import{CameraControls as uw,PointerLockControls as pw}from"@react-three/drei";import{Box3 as hw,Vector3 as pg}from"three";import{useEffect as is,useRef as mw}from"react";import{jsx as hg}from"react/jsx-runtime";var ui={minDistance:0,maxDistance:1/0,minPolarAngle:0,maxPolarAngle:Math.PI,minAzimuthAngle:-1/0,maxAzimuthAngle:1/0,boundaryEnclosesCamera:!1,boundaryFriction:0};function tu({controlsRef:e,onCameraChange:t,cameraLimits:n,controllerType:i="orbit",onPointerLockExit:r}){let o=i==="orbit",a=mw(null);return is(()=>{if(!o)return a.current?.lock(),()=>{a.current?.unlock()}},[o]),is(()=>{o&&document.pointerLockElement&&document.exitPointerLock()},[o]),is(()=>{if(o)return;let s=()=>{document.pointerLockElement||r?.()};return document.addEventListener("pointerlockchange",s),()=>{document.removeEventListener("pointerlockchange",s)}},[o,r]),is(()=>{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]),is(()=>{if(!o||!e||typeof e!="object"||!("current"in e))return;let s=e.current;s&&(s.minDistance=n?.minDistance??ui.minDistance,s.maxDistance=n?.maxDistance??ui.maxDistance,s.minPolarAngle=n?.minPolarAngle??ui.minPolarAngle,s.maxPolarAngle=n?.maxPolarAngle??ui.maxPolarAngle,s.minAzimuthAngle=n?.minAzimuthAngle??ui.minAzimuthAngle,s.maxAzimuthAngle=n?.maxAzimuthAngle??ui.maxAzimuthAngle,s.boundaryEnclosesCamera=n?.boundaryEnclosesCamera??ui.boundaryEnclosesCamera,s.boundaryFriction=n?.boundaryFriction??ui.boundaryFriction,s.setBoundary(n?.panBoundary?new hw(new pg(...n.panBoundary[0]),new pg(...n.panBoundary[1])):void 0))},[o,e,n?.minDistance,n?.maxDistance,n?.minPolarAngle,n?.maxPolarAngle,n?.minAzimuthAngle,n?.maxAzimuthAngle,n?.boundaryEnclosesCamera,n?.boundaryFriction,n?.panBoundary]),o?hg(uw,{ref:e,makeDefault:!0,smoothTime:.3,dollyToCursor:!0}):hg(pw,{ref:a,makeDefault:!0,selector:"[data-ri-pointer-lock-trigger]"})}import{useRef as ru,useMemo as Ll,useEffect as fw}from"react";import{useFrame as bw,useThree as mg}from"@react-three/fiber";import{Vector3 as xw}from"three";var nu=Symbol("react-immersive.model-node-id");function gw(e,t){Object.defineProperty(e,nu,{value:t,configurable:!0})}function qo(e){let t=new Map;e.traverse(c=>{if(!c.name)return;let l=t.get(c.name);l?l.push(c):t.set(c.name,[c])});let n=Object.create(null),i=new WeakMap,r=new Map,o=new Set(Array.from(t,([c,l])=>l.length===1?c:null).filter(c=>c!==null)),a=new Set,s=(c,l)=>{gw(c,l),n[l]=c,i.set(c,l),a.add(l)};for(let[c,l]of t)l.length===1&&s(l[0],c);for(let[c,l]of t){if(l.length<2)continue;let u=[];l.forEach((d,h)=>{let g=`${c} [${h+1}]`,f=g,y=2;for(;o.has(f)||a.has(f);)f=`${g}.${y++}`;s(d,f),u.push(f)}),r.set(c,u)}return{nodesById:n,idByNode:i,duplicateNames:r}}function os(e){return e[nu]??e.name??null}function xr(e,t){let n=null,i=[];return e.traverse(r=>{r[nu]===t&&(n=r),r.name===t&&i.push(r)}),n??(i.length===1?i[0]:null)}import{Fragment as Mw,jsx as Yi,jsxs as Tw}from"react/jsx-runtime";function fg(e,t){if(!t)return e;let n=t*Math.PI/180,i=Math.cos(n),r=Math.sin(n);return[e[0]*i+e[2]*r,e[1],-e[0]*r+e[2]*i]}function yw(e,t){let[n,i,r]=e.center,o=e.radius,a=Math.hypot(t[0],t[1],t[2]),s=a>1e-6?[t[0]/a,t[1]/a,t[2]/a]:[0,1,0],c=o*2;return{position:[n+s[0]*c,i+s[1]*c,r+s[2]*c],target:e.center,extent:o,near:Math.max(o/100,.001),far:c+o*2}}function vw(e,t){let n=t[0]-e.center[0],i=t[1]-e.center[1],r=t[2]-e.center[2],o=Math.hypot(n,i,r);return{near:Math.max(o-e.radius,o*.01,.001),far:o+e.radius*2}}function ww(e,t,n){return t&&n&&!e.attachedToCamera?n.center:[0,0,0]}var Cw={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}]},Sw={enabled:!0,mapSize:2048,bias:-5e-4,normalBias:.02,radius:3};function gg({light:e,shadows:t,shadowsEnabled:n,environmentRotation:i,modelBounds:r,objectBindings:o,nodeRefs:a}){let s=ru(null),c=ru(null),l=ru(null),u=mg(v=>v.camera),d=mg(v=>v.scene),h=Ll(()=>new xw,[]),g=Ll(()=>e.attachedToCamera||e.attachment?e.position:fg(e.position,i),[e.position,e.attachedToCamera,e.attachment,i]);bw(()=>{let v=s.current??c.current??l.current;if(!v)return;if(e.attachedToCamera){v.position.copy(u.position);return}let p=e.attachment;if(!p)return;let m=o?vn(o,p.objectId):null,C=(m?o?.[m]:void 0)?.modelObjectId??p.objectId,P=(m?a?.current[m]:void 0)??xr(d,C);P&&(h.fromArray(p.offset),P.localToWorld(h),v.position.copy(h))});let f=n&&t.enabled&&e.castShadow,y=Ll(()=>e.type==="directional"&&f&&r&&!e.attachedToCamera?yw(r,g):null,[e.type,e.attachedToCamera,f,r,g]),k=Ll(()=>e.type==="spot"&&f&&r&&!e.attachedToCamera?vw(r,g):null,[e.type,e.attachedToCamera,f,r,g]);return fw(()=>{let v=s.current??l.current;if(!v)return;let[p,m,M]=ww(e,f,r);v.target.position.set(p,m,M),v.target.updateMatrixWorld()},[e,f,r]),!e.visible||e.type==="none"?null:e.type==="directional"?Yi("directionalLight",{ref:s,color:e.color,intensity:e.intensity,position:y?.position??g,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,"shadow-camera-left":-(y?.extent??8),"shadow-camera-right":y?.extent??8,"shadow-camera-top":y?.extent??8,"shadow-camera-bottom":-(y?.extent??8)}):e.type==="point"?Yi("pointLight",{ref:c,color:e.color,intensity:e.intensity,position:g,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"?Yi("spotLight",{ref:l,color:e.color,intensity:e.intensity,position:g,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":k?.near??.5,"shadow-camera-far":k?.far??40}):e.type==="hemisphere"?Yi("hemisphereLight",{color:e.color,groundColor:"#444444",intensity:e.intensity}):null}function iu({lightingConfig:e,shadowConfig:t,shadowsEnabled:n=!0,environmentRotation:i=0,environmentConfig:r,modelBounds:o,objectBindings:a,nodeRefs:s}){let c=e??Cw,l=t??Sw,u=r?.shadowLight,d=fg([5,10,5],i);return Tw(Mw,{children:[Yi("ambientLight",{intensity:c.ambient.intensity,color:c.ambient.color}),c.lights.map(h=>Yi(gg,{light:h,shadows:l,shadowsEnabled:n,environmentRotation:i,modelBounds:o,objectBindings:a,nodeRefs:s},h.id)),u?.enabled&&Yi(gg,{light:{id:"light-env-shadow",type:"directional",color:"#ffffff",intensity:u.intensity,position:d,attachedToCamera:!1,castShadow:!0,shadowBias:u.bias,visible:!0},shadows:l,shadowsEnabled:n,environmentRotation:0,modelBounds:o,objectBindings:a,nodeRefs:s})]})}import{useState as SC,useEffect as Ut,useRef as sn,useMemo as wn}from"react";import{useFrame as fu,useThree as MC}from"@react-three/fiber";import{useLoader as Og,useThree as Xw}from"@react-three/fiber";import{FileLoader as qw,Loader as Yw,LoadingManager as Kw}from"three";import{FBXLoader as Jw,GLTFLoader as Qw,MTLLoader as Zw,OBJLoader as eC}from"three-stdlib";import{USDLoader as tC}from"three/examples/jsm/loaders/USDLoader.js";import{strFromU8 as Pw,strToU8 as kw,unzip as _w}from"fflate";var bg;function xg(e){bg=e}function as(e){bg?.(e)}var Aw=[".glb",".gltf",".obj",".fbx",".usdz",".zip"],Ew=["model/gltf-binary","model/gltf+json","model/vnd.usdz+zip","application/vnd.usdz+zip","application/zip","application/x-zip-compressed"],ss=1024*1024,yg=128*ss,vg=1024,wg=128*ss,Cg=256*ss,Sg=200,Rw=ss,Yr=new Map,Bl=".glb,.gltf,.obj,.fbx,.usdz,.zip,model/gltf-binary,model/gltf+json,model/vnd.usdz+zip,application/vnd.usdz+zip,application/zip";function au(e){let t=e.split(/[?#]/,1)[0].toLowerCase();return t.endsWith(".obj")?"obj":t.endsWith(".fbx")?"fbx":t.endsWith(".usdz")?"usdz":t.endsWith(".gltf")?"gltf":"glb"}function kg(e){return Yr.get(e)??{format:au(e)}}function Lw(e){let t=e.name.toLowerCase();return Aw.some(n=>t.endsWith(n))||Ew.includes(e.type)}async function Ol(e){if(!Lw(e))throw new Error("Unsupported model file. Please upload a .glb, .gltf, .obj, .fbx, .usdz, or .zip asset.");let t=e.name.toLowerCase();if(t.endsWith(".usdz")||e.type==="model/vnd.usdz+zip"||e.type==="application/vnd.usdz+zip")return Mg(e,"usdz");if(t.endsWith(".zip")||Bw(e.type))return Ow(e);if(t.endsWith(".gltf")||e.type==="model/gltf+json")return Tg(e);let n=au(e.name);return n==="gltf"?Tg(e):Mg(e,n)}function Mg(e,t){let n=URL.createObjectURL(e);return Yr.set(n,{format:t,entryPath:e.name}),{url:n,name:e.name,format:t,cleanup:()=>{as(n),Yr.delete(n),URL.revokeObjectURL(n)}}}function Bw(e){return e==="application/zip"||e==="application/x-zip-compressed"}async function Tg(e){let t=await e.text(),n=_g(t,e.name);for(let r of Ag(n))if(!su(r))throw new Error(`${e.name} references external assets. Upload a .zip containing the .gltf file and its dependencies.`);let i=URL.createObjectURL(e);return Yr.set(i,{format:"gltf",entryPath:e.name}),{url:i,name:e.name,format:"gltf",cleanup:()=>{as(i),Yr.delete(i),URL.revokeObjectURL(i)}}}async function Ow(e){if(e.size>yg)throw new Error(`Model zip is too large. The compressed archive must be ${ou(yg)} or smaller.`);let t=await Dw(new Uint8Array(await e.arrayBuffer())),n=new Map;for(let[a,s]of Object.entries(t)){let c=lu(a);!c||Eg(c)||n.set(c,s)}let i=[...n.keys()].filter(a=>/\.(gltf|obj|fbx)$/i.test(a));if(i.length===0)throw new Error("Invalid model zip: no .gltf, .obj, or .fbx file found.");if(i.length>1)throw new Error("Invalid model zip: multiple model entry files found.");let r=i[0],o=au(r);if(o==="gltf")return Iw(e,r,n);if(o==="obj"||o==="fbx")return Nw(e,r,o,n);throw new Error(`Unsupported model entry ${r}.`)}function Dw(e){return new Promise((t,n)=>{let i=0,r=0,o=null,a=c=>(o??(o=new Error(`Invalid model zip: ${c}`)),!1);_w(e,{filter:c=>{if(o)return!1;if(i+=1,i>vg)return a(`archive contains more than ${vg.toLocaleString()} entries.`);if(c.originalSize>wg)return a(`${c.name} expands beyond the ${ou(wg)} per-file limit.`);if(r+=c.originalSize,r>Cg)return a(`expanded contents exceed ${ou(Cg)}.`);if(c.originalSize>=Rw&&(c.size===0||c.originalSize/c.size>Sg))return a(`${c.name} exceeds the ${Sg}:1 compression-ratio limit.`);let l=lu(c.name);return!!l&&!Eg(l)}},(c,l)=>{o?n(o):c?n(new Error(`Invalid model zip: ${c.message}`)):t(l)})})}function ou(e){return`${e/ss} MiB`}function Nw(e,t,n,i){let r=[],o={};for(let[s,c]of i){let l=URL.createObjectURL(new Blob([c],{type:Rg(s)}));r.push(l),o[s]=l}let a=o[t];if(!a)throw r.forEach(s=>URL.revokeObjectURL(s)),new Error(`Invalid model zip: could not read ${t}.`);return Yr.set(a,{format:n,entryPath:t,resourceUrls:o}),{url:a,name:e.name,format:n,cleanup:()=>{as(a),Yr.delete(a),r.forEach(s=>URL.revokeObjectURL(s))}}}function Iw(e,t,n){let i=n.get(t);if(!i)throw new Error("Invalid GLTF zip: no .gltf found.");let r=_g(Pw(i),t);zw(r,t);let o=jw(t),a=[];try{Pg(r.buffers,o,n,a),Pg(r.images,o,n,a);let s=new Blob([kw(JSON.stringify(r))],{type:"model/gltf+json"}),c=URL.createObjectURL(s);return a.push(c),Yr.set(c,{format:"gltf",entryPath:t}),{url:c,name:e.name,format:"gltf",cleanup:()=>{as(c),Yr.delete(c),a.forEach(l=>URL.revokeObjectURL(l))}}}catch(s){throw a.forEach(c=>URL.revokeObjectURL(c)),s}}function Pg(e,t,n,i){for(let r of e??[]){if(typeof r.uri!="string"||su(r.uri))continue;let o=Vw(t,r.uri),a=n.get(o);if(!a)throw new Error(`Invalid GLTF zip: missing referenced asset ${r.uri}.`);let s=URL.createObjectURL(new Blob([a],{type:Rg(o)}));i.push(s),r.uri=s}}function _g(e,t){try{return JSON.parse(e)}catch{throw new Error(`${t} is not a valid .gltf JSON file.`)}}function Ag(e){return[...e.buffers??[],...e.images??[]].map(t=>t.uri).filter(t=>typeof t=="string"&&t.length>0)}function zw(e,t){for(let n of Ag(e)){if(su(n))continue;let i=/^[a-z][a-z0-9+.-]*:/i.test(n),r=n.startsWith("/")||n.startsWith("\\");if(i||r)throw new Error(`${t} references external assets. Include every dependency inside the uploaded .zip.`)}}function su(e){return e.startsWith("data:")}function lu(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(i=>i&&i!==".")){if(n===".."){t.pop();continue}t.push(n)}return t.join("/")}function Eg(e){let t=e.split("/");return e.endsWith("/")||t.includes("__MACOSX")||t.some(n=>n===".DS_Store"||n.startsWith("._"))}function jw(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t)}function Vw(e,t){let n=t.split(/[?#]/)[0],i=Fw(n);return lu(e?`${e}/${i}`:i)}function Fw(e){try{return decodeURI(e)}catch{return e}}function Rg(e){let t=e.toLowerCase();return t.endsWith(".obj")||t.endsWith(".mtl")?"text/plain":t.endsWith(".fbx")?"application/octet-stream":t.endsWith(".usdz")?"model/vnd.usdz+zip":t.endsWith(".bin")?"application/octet-stream":t.endsWith(".png")?"image/png":t.endsWith(".jpg")||t.endsWith(".jpeg")?"image/jpeg":t.endsWith(".webp")?"image/webp":t.endsWith(".avif")?"image/avif":t.endsWith(".ktx2")?"image/ktx2":"application/octet-stream"}import{useGLTF as $5}from"@react-three/drei";import{useThree as q5}from"@react-three/fiber";import{useMemo as K5}from"react";import{SRGBColorSpace as Uw}from"three";import{DRACOLoader as Gw,KTX2Loader as Hw,MeshoptDecoder as Ww}from"three-stdlib";function $w(e){return{name:"RI_unlit_emissive_texture",async afterRoot(t){let n=e.json.materials??[],i=new Map;if(n.forEach(o=>{let a=!!o?.extensions?.KHR_materials_unlit,s=!!o?.pbrMetallicRoughness?.baseColorTexture;a&&!s&&o?.emissiveTexture&&o.name&&i.set(o.name,o.emissiveTexture.index)}),i.size===0||!t.scene)return;let r=new Map;await Promise.all([...i].map(async([o,a])=>{let s=await e.getDependency("texture",a);s&&(s.colorSpace=Uw,r.set(o,s))})),t.scene.traverse(o=>{let a=Array.isArray(o.material)?o.material:o.material?[o.material]:[];for(let s of a){let c=s.name?r.get(s.name):void 0;c&&!s.map&&(s.map=c,s.needsUpdate=!0)}})}}}var cu="https://assets.react-immersive.liveroom.dev/three-r184/draco/",du="https://assets.react-immersive.liveroom.dev/three-r184/basis/";function Lg(e,t={},n){let{dracoDecoderPath:i=cu,ktx2TranscoderPath:r=du,meshopt:o=!0}=t;if(i){let a=new Gw;a.setDecoderPath(i),e.setDRACOLoader(a)}if(o&&e.setMeshoptDecoder(Ww),r&&n){let a=new Hw().setTranscoderPath(r).detectSupport(n);e.setKTX2Loader(a)}e.register((a=>$w(a)))}var Dl=class extends Yw{constructor(){super(...arguments);this.options={source:{format:"glb"}}}configure(n){return this.options=n,this}load(n,i,r,o){this.loadAsset(n,r).then(i).catch(o)}async loadAsset(n,i){let r=rC(this.options.source),{format:o}=this.options.source;if(o==="obj")return nC(n,r,this.options.source,i);if(o==="fbx"){let c=uu(this,new Jw(r)),l=aC(n,this.options.source);l&&c.setResourcePath(l);let u=await c.loadAsync(n,i);return pu(u,"FBXMesh",!1),{scene:u,animations:u.animations??[]}}if(o==="usdz"){let l=await uu(this,new tC(r)).loadAsync(n,i);return pu(l,"USDZMesh",!1),{scene:l,animations:l.animations??[]}}let a=uu(this,new Qw(r));Lg(a,this.options.decoderConfig,this.options.renderer);let s=await a.loadAsync(n,i);return{scene:s.scene,animations:s.animations??[]}}};xg(e=>{Og.clear(Dl,e)});function zl(e,t={},n,i){let r=Xw(s=>s.gl),o=kg(e),a=n?{...o,format:n}:o;return Og(Dl,e,s=>{s.configure({source:a,decoderConfig:t,renderer:r})},i)}async function nC(e,t,n,i){let r=await Bg(e,t,i),o=new eC(t),a=iC(r);if(a){let c=oC(a,e,n);if(c)try{let l=await Bg(c.url,t),d=new Zw(t).parse(l,c.basePath);d.preload(),o.setMaterials(d)}catch(l){console.warn(`[react-immersive] Could not load OBJ material ${a}; rendering geometry with fallback materials.`,l)}}let s=o.parse(r);return pu(s,"OBJMesh",!0),{scene:s,animations:[]}}function pu(e,t,n){let i=new Set,r=0;e.traverse(o=>{if(!("isMesh"in o&&o.isMesh===!0)){o.name&&i.add(o.name);return}let s=o.name||`${t}_${++r}`;if(!n&&o.name){i.add(o.name);return}let c=s,l=2;for(;i.has(c);)c=`${s}_${l++}`;o.name=c,i.add(c)})}function Bg(e,t,n){let i=new qw(t);return i.setResponseType("text"),i.loadAsync(e,n)}function uu(e,t){return t.setCrossOrigin(e.crossOrigin),t.setWithCredentials(e.withCredentials),t.setRequestHeader(e.requestHeader),t}function rC(e){let t=new Kw,n=e.resourceUrls;return n&&t.setURLModifier(i=>{if(/^(?:blob:|data:)/i.test(i))return i;let r=Il(Ng(i).split(/[?#]/)[0]),o=n[r];if(o)return o;let a=Nl(e.entryPath??""),s=Il(a?`${a}/${r}`:r);return n[s]??i}),t}function iC(e){return/^\s*mtllib\s+(.+?)\s*$/im.exec(e)?.[1]?.trim()||null}function oC(e,t,n){if(n.resourceUrls&&n.entryPath){let i=Il(`${Nl(n.entryPath)}/${Ng(e)}`),r=n.resourceUrls[i];if(!r)return null;let o=Nl(i);return{url:r,basePath:o?`${o}/`:""}}try{let i=new URL(e,t).href;return{url:i,basePath:Dg(i)}}catch{return null}}function aC(e,t){if(t.resourceUrls&&t.entryPath){let n=Nl(t.entryPath);return n?`${n}/`:""}return Dg(e)}function Dg(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t+1)}function Nl(e){let t=Il(e),n=t.lastIndexOf("/");return n===-1?"":t.slice(0,n)}function Il(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(i=>i&&i!=="."))n===".."?t.pop():t.push(n);return t.join("/")}function Ng(e){try{return decodeURI(e)}catch{return e}}import{MeshStandardMaterial as TC,MeshBasicMaterial as bu,MeshNormalMaterial as PC,MeshMatcapMaterial as kC,DoubleSide as _C,NormalBlending as AC,AnimationMixer as EC,LoopOnce as RC,LoopRepeat as LC,Box3 as ql,Vector3 as Ji,Matrix4 as BC,MathUtils as Yl}from"three";import{SkeletonUtils as OC}from"three-stdlib";function Ig(e){let t=new Map;return e.map((n,i)=>{let o=n.name.trim()||`Animation ${i+1}`,a=t.get(o)??0;return t.set(o,a+1),{clip:n,sourceName:a===0?o:`${o} (${a+1})`,duration:n.duration}})}import{AdditiveBlending as sC,BackSide as lC,DoubleSide as cC,FrontSide as dC,NoColorSpace as uC,NormalBlending as pC,SRGBColorSpace as hC,Vector2 as zg}from"three";function jg(e){return!!(e&&typeof e=="object"&&"clone"in e&&"color"in e&&"metalness"in e&&"roughness"in e)}function Vg(e){return!!(e&&typeof e=="object"&&"isMeshPhysicalMaterial"in e&&e.isMeshPhysicalMaterial)}function tr(e){return!!(e&&"isMesh"in e&&e.isMesh)}var ls=["texture","metalnessMap","roughnessMap","emissiveMap","alphaMap","normalMap","bumpMap","aoMap","displacementMap","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","anisotropyMap","transmissionMap","thicknessMap","sheenColorMap","sheenRoughnessMap","specularIntensityMap","specularColorMap"],mC=new Set(["texture","emissiveMap","sheenColorMap","specularColorMap"]);function Ki(e){return mC.has(e)?hC:uC}function Tt(e,t){return e?.[t]?.path}function Fg(e){return e==="back"?lC:e==="double"?cC:dC}function Ug(e){return e==="additive"?sC:pC}function Kr(e,t=1,n=t){if(e&&typeof e=="object"){let i=e;if(typeof i.x=="number"&&Number.isFinite(i.x)&&typeof i.y=="number"&&Number.isFinite(i.y))return new zg(i.x,i.y)}return new zg(t,n)}function hu(e){return Number.isFinite(e)&&e>0?e:1}function jl(e,t){return e?.animations.clips.find(n=>n.sourceName===t)}function Gg(e){return e?.loopMode??"repeat"}import{Color as mu,MeshPhysicalMaterial as gC,MeshStandardMaterial as fC,Texture as gu}from"three";function Yo(e){if(jg(e))return e;if(!e||typeof e!="object")return null;let t=e,n=new fC;typeof t.name=="string"&&(n.name=t.name),n.metalness=0,n.roughness=1,t.type==="MeshBasicMaterial"||t.isMeshBasicMaterial===!0?(n.color.set(0),n.emissiveIntensity=1,t.map instanceof gu?(n.emissiveMap=t.map,n.emissive.set(16777215)):t.color instanceof mu&&n.emissive.copy(t.color)):(t.color instanceof mu&&n.color.copy(t.color),t.map instanceof gu&&(n.map=t.map),t.emissive instanceof mu&&n.emissive.copy(t.emissive),t.emissiveMap instanceof gu&&(n.emissiveMap=t.emissiveMap));let r=["aoMap","aoMapIntensity","lightMap","lightMapIntensity","alphaMap","opacity","transparent","alphaTest","side","vertexColors","wireframe","depthTest","depthWrite","visible","toneMapped","fog"];for(let o of r)t[o]!==void 0&&(n[o]=t[o]);return n.needsUpdate=!0,n}function Vl(e){if(Vg(e))return e.clone();let t=new gC;return t.name=e.name,t.color.copy(e.color),t.map=e.map,t.lightMap=e.lightMap,t.lightMapIntensity=e.lightMapIntensity,t.aoMap=e.aoMap,t.aoMapIntensity=e.aoMapIntensity,t.emissive.copy(e.emissive),t.emissiveIntensity=e.emissiveIntensity,t.emissiveMap=e.emissiveMap,t.bumpMap=e.bumpMap,t.bumpScale=e.bumpScale,t.normalMap=e.normalMap,t.normalMapType=e.normalMapType,t.normalScale.copy(Kr(e.normalScale)),t.displacementMap=e.displacementMap,t.displacementScale=e.displacementScale,t.displacementBias=e.displacementBias,t.roughness=e.roughness,t.roughnessMap=e.roughnessMap,t.metalness=e.metalness,t.metalnessMap=e.metalnessMap,t.alphaMap=e.alphaMap,t.envMap=e.envMap,t.envMapRotation.copy(e.envMapRotation),t.envMapIntensity=e.envMapIntensity,t.wireframe=e.wireframe,t.wireframeLinewidth=e.wireframeLinewidth,t.flatShading=e.flatShading,t.fog=e.fog,t.opacity=e.opacity,t.transparent=e.transparent,t.alphaHash=e.alphaHash,t.blendSrc=e.blendSrc,t.blendDst=e.blendDst,t.blendEquation=e.blendEquation,t.blendSrcAlpha=e.blendSrcAlpha,t.blendDstAlpha=e.blendDstAlpha,t.blendEquationAlpha=e.blendEquationAlpha,t.blending=e.blending,t.premultipliedAlpha=e.premultipliedAlpha,t.dithering=e.dithering,t.alphaTest=e.alphaTest,t.depthTest=e.depthTest,t.depthWrite=e.depthWrite,t.colorWrite=e.colorWrite,t.stencilWrite=e.stencilWrite,t.stencilWriteMask=e.stencilWriteMask,t.stencilFunc=e.stencilFunc,t.stencilRef=e.stencilRef,t.stencilFuncMask=e.stencilFuncMask,t.stencilFail=e.stencilFail,t.stencilZFail=e.stencilZFail,t.stencilZPass=e.stencilZPass,t.side=e.side,t.shadowSide=e.shadowSide,t.toneMapped=e.toneMapped,t.vertexColors=e.vertexColors,t.visible=e.visible,t.clippingPlanes=e.clippingPlanes,t.clipIntersection=e.clipIntersection,t.clipShadows=e.clipShadows,t.forceSinglePass=e.forceSinglePass,t.polygonOffset=e.polygonOffset,t.polygonOffsetFactor=e.polygonOffsetFactor,t.polygonOffsetUnits=e.polygonOffsetUnits,t}function Fl(e){e.userData.baseColor=e.color.clone(),e.userData.baseMap=e.map??null,e.userData.baseMetalness=e.metalness,e.userData.baseMetalnessMap=e.metalnessMap??null,e.userData.baseRoughness=e.roughness,e.userData.baseRoughnessMap=e.roughnessMap??null,e.userData.baseEmissive=e.emissive.clone(),e.userData.baseEmissiveIntensity=e.emissiveIntensity,e.userData.baseEmissiveMap=e.emissiveMap??null,e.userData.baseOpacity=e.opacity,e.userData.baseTransparent=e.transparent,e.userData.baseAlphaMap=e.alphaMap??null,e.userData.baseAlphaTest=e.alphaTest,e.userData.baseAlphaHash=e.alphaHash,e.userData.baseDithering=e.dithering,e.userData.baseBlending=e.blending,e.userData.baseDepthWrite=e.depthWrite,e.userData.baseSide=e.side,e.userData.baseNormalMap=e.normalMap??null,e.userData.baseNormalScale=Kr(e.normalScale),e.userData.baseBumpMap=e.bumpMap??null,e.userData.baseBumpScale=e.bumpScale,e.userData.baseAoMap=e.aoMap??null,e.userData.baseAoMapIntensity=e.aoMapIntensity,e.userData.baseDisplacementMap=e.displacementMap??null,e.userData.baseDisplacementScale=e.displacementScale,e.userData.baseDisplacementBias=e.displacementBias,e.userData.baseClearcoat=e.clearcoat,e.userData.baseClearcoatMap=e.clearcoatMap??null,e.userData.baseClearcoatRoughness=e.clearcoatRoughness,e.userData.baseClearcoatRoughnessMap=e.clearcoatRoughnessMap??null,e.userData.baseClearcoatNormalMap=e.clearcoatNormalMap??null,e.userData.baseClearcoatNormalScale=Kr(e.clearcoatNormalScale),e.userData.baseSheen=e.sheen,e.userData.baseSheenColor=e.sheenColor.clone(),e.userData.baseSheenColorMap=e.sheenColorMap??null,e.userData.baseSheenRoughness=e.sheenRoughness,e.userData.baseSheenRoughnessMap=e.sheenRoughnessMap??null,e.userData.baseAnisotropy=e.anisotropy,e.userData.baseAnisotropyRotation=e.anisotropyRotation,e.userData.baseAnisotropyMap=e.anisotropyMap??null,e.userData.baseTransmission=e.transmission,e.userData.baseTransmissionMap=e.transmissionMap??null,e.userData.baseThickness=e.thickness,e.userData.baseThicknessMap=e.thicknessMap??null,e.userData.baseAttenuationColor=e.attenuationColor.clone(),e.userData.baseAttenuationDistance=e.attenuationDistance,e.userData.baseReflectivity=e.reflectivity,e.userData.baseSpecularIntensity=e.specularIntensity,e.userData.baseSpecularIntensityMap=e.specularIntensityMap??null,e.userData.baseSpecularColor=e.specularColor.clone(),e.userData.baseSpecularColorMap=e.specularColorMap??null,e.userData.baseFlatShading=e.flatShading,e.userData.baseEnvMapIntensity=e.envMapIntensity}import{Color as Ul,FrontSide as bC,NormalBlending as Hg,SRGBColorSpace as Gl}from"three";function Hl(e,t,n){e.map=e.userData.baseMap??null,e.color.copy(e.userData.baseColor),e.metalness=e.userData.baseMetalness??e.metalness,e.metalnessMap=e.userData.baseMetalnessMap??null,e.roughness=e.userData.baseRoughness??e.roughness,e.roughnessMap=e.userData.baseRoughnessMap??null,e.emissive.copy(e.userData.baseEmissive??new Ul(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??Hg,e.depthWrite=e.userData.baseDepthWrite??!0,e.side=e.userData.baseSide??bC,e.normalMap=e.userData.baseNormalMap??null,e.normalScale.copy(Kr(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(Kr(e.userData.baseClearcoatNormalScale)),e.sheen=e.userData.baseSheen??e.sheen,e.sheenColor.copy(e.userData.baseSheenColor??new Ul(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 Ul("#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 Ul("#ffffff")),e.specularColorMap=e.userData.baseSpecularColorMap??null,e.flatShading=e.userData.baseFlatShading??e.flatShading,e.envMapIntensity=e.userData.baseEnvMapIntensity??e.envMapIntensity;let i=Tt(t,"texture"),r=Tt(t,"metalnessMap"),o=Tt(t,"roughnessMap"),a=Tt(t,"emissiveMap"),s=Tt(t,"alphaMap"),c=Tt(t,"normalMap"),l=Tt(t,"bumpMap"),u=Tt(t,"aoMap"),d=Tt(t,"displacementMap"),h=Tt(t,"clearcoatMap"),g=Tt(t,"clearcoatRoughnessMap"),f=Tt(t,"clearcoatNormalMap"),y=Tt(t,"anisotropyMap"),k=Tt(t,"transmissionMap"),v=Tt(t,"thicknessMap"),p=Tt(t,"sheenColorMap"),m=Tt(t,"sheenRoughnessMap"),M=Tt(t,"specularIntensityMap"),C=Tt(t,"specularColorMap");if(i?(e.map=Ft(i,Gl),e.color.set(n??"#ffffff")):n&&(e.map=null,e.color.set(n)),r&&(e.metalnessMap=Ft(r)),t?.metalness!==void 0&&(e.metalness=t.metalness),o&&(e.roughnessMap=Ft(o)),t?.roughness!==void 0&&(e.roughness=t.roughness),t?.emissive?e.emissive.set(t.emissive):a&&e.emissive.set("#ffffff"),t?.emissiveIntensity!==void 0&&(e.emissiveIntensity=t.emissiveIntensity),a&&(e.emissiveMap=Ft(a,Gl)),t?.opacity!==void 0&&(e.opacity=t.opacity),s&&(e.alphaMap=Ft(s)),t?.alphaTest!==void 0&&(e.alphaTest=t.alphaTest),t?.alphaHash!==void 0&&(e.alphaHash=t.alphaHash),t?.dithering!==void 0&&(e.dithering=t.dithering),t?.blendingMode&&(e.blending=Ug(t.blendingMode),e.depthWrite=t.blendingMode!=="additive"),t?.side&&(e.side=Fg(t.side)),c&&(e.normalMap=Ft(c)),c||t?.normalScale!==void 0){let P=t?.normalScale??Math.abs(Kr(e.userData.baseNormalScale).x);e.normalScale.set(P,t?.flipNormalY?-P:P)}if(l&&(e.bumpMap=Ft(l)),t?.bumpScale!==void 0&&(e.bumpScale=t.bumpScale),u&&(e.aoMap=Ft(u)),t?.aoMapIntensity!==void 0&&(e.aoMapIntensity=t.aoMapIntensity),d&&(e.displacementMap=Ft(d)),t?.displacementScale!==void 0&&(e.displacementScale=t.displacementScale),t?.displacementBias!==void 0&&(e.displacementBias=t.displacementBias),h&&(e.clearcoatMap=Ft(h)),t?.clearcoat!==void 0&&(e.clearcoat=t.clearcoat),g&&(e.clearcoatRoughnessMap=Ft(g)),t?.clearcoatRoughness!==void 0&&(e.clearcoatRoughness=t.clearcoatRoughness),f&&(e.clearcoatNormalMap=Ft(f)),f||t?.clearcoatNormalScale!==void 0){let P=t?.clearcoatNormalScale??Math.abs(Kr(e.userData.baseClearcoatNormalScale).x);e.clearcoatNormalScale.set(P,t?.flipClearcoatNormalY?-P:P)}t?.sheen!==void 0&&(e.sheen=t.sheen),t?.sheenColor&&e.sheenColor.set(t.sheenColor),p&&(e.sheenColorMap=Ft(p,Gl)),t?.sheenRoughness!==void 0&&(e.sheenRoughness=t.sheenRoughness),m&&(e.sheenRoughnessMap=Ft(m)),t?.anisotropy!==void 0&&(e.anisotropy=t.anisotropy),t?.anisotropyRotation!==void 0&&(e.anisotropyRotation=t.anisotropyRotation),y&&(e.anisotropyMap=Ft(y)),t?.transmission!==void 0&&(e.transmission=t.transmission),k&&(e.transmissionMap=Ft(k)),t?.thickness!==void 0&&(e.thickness=t.thickness),v&&(e.thicknessMap=Ft(v)),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),M&&(e.specularIntensityMap=Ft(M)),t?.specularColor&&e.specularColor.set(t.specularColor),C&&(e.specularColorMap=Ft(C,Gl)),e.transparent=e.opacity<1||e.transmission>0||e.blending!==Hg||!!((s||e.alphaMap)&&e.alphaTest<=0),e.transparent||(e.depthWrite=!0)}function cs(e){return e.material}function Br(e,t){return Array.isArray(e)?e.map(t):t(e,0)}function nr(e,t){Array.isArray(e)?e.forEach(t):t(e,0)}function Wl(e,t){return Array.isArray(e)?e[t]:e}function ds(e){e.updateMatrixWorld(!0),e.traverse(t=>{let n=t;n.isSkinnedMesh&&(n.skeleton?.update(),n.computeBoundingBox?.(),n.computeBoundingSphere?.())})}import{Matrix4 as xC}from"three";function yC(e){return e.isSkinnedMesh===!0}function Ko(e){let t=[];return e.traverse(n=>{yC(n)&&t.push(n)}),t}var us="reactImmersiveSkinFreeze";function Wg(e){return!!e.userData[us]}function $l(e,t){let n=e.userData,i=new xC().copy(t).invert(),r=n[us];if(r){r.frozenInverse.copy(i),e.bindMatrixInverse.copy(i);return}let o={frozenInverse:i,previousOnBeforeRender:e.onBeforeRender};e.bindMatrixInverse.copy(i),e.onBeforeRender=function(a,s,c,l,u,d){o.previousOnBeforeRender.call(this,a,s,c,l,u,d),e.bindMatrixInverse.copy(o.frozenInverse)},n[us]=o}function Jo(e){let t=e.userData,n=t[us];n&&(e.onBeforeRender=n.previousOnBeforeRender,delete t[us],e.updateMatrixWorld(!0))}import{useCallback as $g,useEffect as vC,useRef as wC}from"react";import{useThree as CC}from"@react-three/fiber";function Xl(){let e=CC(r=>r.gl.domElement),t=wC(void 0),n=$g(r=>{t.current===void 0&&(t.current=e.style.cursor),e.style.cursor=r},[e]),i=$g(()=>{let r=t.current;r!==void 0&&(e.style.cursor=r,t.current=void 0)},[e]);return vC(()=>()=>{i()},[i]),{setCanvasCursor:n,restoreCanvasCursor:i}}import{jsx as Xg}from"react/jsx-runtime";function Kl(e,t,n){let i=n.get(e);i&&(t?.position?e.position.fromArray(t.position):e.position.copy(i.position),t?.rotation?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2],i.rotation.order):e.rotation.copy(i.rotation),t?.scale?e.scale.fromArray(t.scale):e.scale.copy(i.scale),e.updateMatrix())}function Xt(e,t=!1){if(!e||typeof e!="object")return"-";let n=e;return[n.channel??0,t?n.format??"":"",n.isVideoTexture?n.colorSpace??"":""].join(":")}function Qo(e){let t=e,n=Number(t.clearcoat)>0,i=Number(t.sheen)>0,r=Number(t.anisotropy)>0,o=Number(t.transmission)>0,a=t.transparent===!1&&t.blending===AC&&t.alphaToCoverage!==!0;return[Xt(t.map),Xt(t.aoMap),Xt(t.lightMap),Xt(t.bumpMap),Xt(t.normalMap,!0),t.normalMap?t.normalMapType:"",Xt(t.displacementMap),Xt(t.emissiveMap),Xt(t.metalnessMap),Xt(t.roughnessMap),r,Xt(r?t.anisotropyMap:null),n,Xt(n?t.clearcoatMap:null),Xt(n?t.clearcoatNormalMap:null,!0),Xt(n?t.clearcoatRoughnessMap:null),i,Xt(i?t.sheenColorMap:null),Xt(i?t.sheenRoughnessMap:null),Xt(t.specularColorMap),Xt(t.specularIntensityMap),o,Xt(o?t.transmissionMap:null),Xt(o?t.thicknessMap:null),Xt(t.alphaMap),Number(t.alphaTest)>0,!!t.alphaHash,!!t.flatShading,!!t.dithering,t.side,a].join("|")}function xu({url:e,objectBindings:t,selectedItem:n,itemMaterials:i,onItemClick:r,onItemHover:o,onModelLoaded:a,onAnimationsReady:s,nodeRefsOut:c,onNodeRefsChange:l,materialRefsOut:u,panelHoveredItem:d,sceneConfig:h,zoomOnSelected:g=!0,highlightOnHover:f=!0,decoderConfig:y,modelFormat:k,onLoadProgress:v,explodeFactor:p=0,suspendBindingTransforms:m=!1}){let M=zl(e,y,k,v),C=MC(V=>V.invalidate),[P,A]=SC(null),b=sn(null),{setCanvasCursor:w,restoreCanvasCursor:T}=Xl();Ut(()=>{f||(A(null),o?.(null),T())},[f,o,T]);let S=wn(()=>OC.clone(M.scene),[M.scene]),N=wn(()=>qo(S),[S]),R=N.nodesById;Ut(()=>{N.duplicateNames.size!==0&&console.warn("[react-immersive] Duplicate model node names were assigned unique binding IDs.",Object.fromEntries(N.duplicateNames))},[N]);let z=wn(()=>{let V=new WeakMap;return S.traverse(_=>{V.set(_,{position:_.position.clone(),rotation:_.rotation.clone(),scale:_.scale.clone()})}),V},[S]);Ut(()=>{let V=!1,_=null,F=null,q=window,te=Object.entries(R).filter(([,dt])=>tr(dt)),Q=new ql,ne=[],pt=0;S.traverse(dt=>{tr(dt)&&(dt.castShadow=!1,dt.receiveShadow=!0)});let Ve=()=>{if(V)return;let dt=new Set,fe=Q.getSize(new Ji),Mt=new Ji;for(let{name:me,box:jt}of ne)jt.getSize(Mt),Mt.x>fe.x*.7&&Mt.z>fe.z*.7&&Mt.y>fe.y*.4&&dt.add(me);S.traverse(me=>{if(!tr(me))return;let jt=os(me);me.castShadow=!jt||!dt.has(jt),me.receiveShadow=!0}),C()},ct=()=>{V||(q.requestIdleCallback?_=q.requestIdleCallback(Ue,{timeout:100}):F=window.setTimeout(()=>Ue(),0))},Ue=dt=>{if(_=null,F=null,V)return;let fe=performance.now(),Mt=0;for(;pt<te.length&&!(Mt>0&&!(dt?dt.didTimeout?Mt<16:dt.timeRemaining()>1:performance.now()-fe<8));){let[me,jt]=te[pt];pt+=1,Mt+=1;let Ln=new ql().setFromObject(jt);Ln.isEmpty()||(ne.push({name:me,box:Ln}),Q.union(Ln))}pt<te.length?ct():Ve()};return ct(),()=>{V=!0,_!==null&&q.cancelIdleCallback?.(_),F!==null&&window.clearTimeout(F)}},[C,R,S]),Ut(()=>{ds(S)},[S]),Ut(()=>{let V=new AbortController;return Vo(S,V.signal),()=>{V.abort(),Gi(S)}},[S]);let E=wn(()=>{let V={};for(let[_,F]of Object.entries(t))V[F.modelObjectId??_]=_;return V},[t]),j=wn(()=>Object.entries(t).map(([V,_])=>`${V}${_.modelObjectId??V}`).sort().join(""),[t]),I=wn(()=>Object.entries(t).map(([V,_])=>JSON.stringify([V,_.modelObjectId??V,_.transform??null])).sort().join(""),[t]),L=sn(new Map);Ut(()=>{let V=new Map,_=new Map;for(let[te,Q]of Object.entries(t)){if(!Q.transform)continue;let ne=R[Q.modelObjectId??te];ne&&(V.set(ne,Q.transform),_.set(ne,Ko(ne)))}let F=new Set([...L.current.keys(),...V.keys()]);for(let te of F){Kl(te,void 0,z);for(let Q of Ko(te))Jo(Q)}S.updateMatrixWorld(!0);let q=new Map;for(let te of _.values())for(let Q of te)q.has(Q)||q.set(Q,Q.matrixWorld.clone());for(let[te,Q]of V)Kl(te,Q,z);L.current=V,S.updateMatrixWorld(!0);for(let[te,Q]of q)$l(te,Q);C()},[S,R,z,I,C]),Ut(()=>()=>{for(let V of Ko(S))Jo(V)},[S]);let B=wn(()=>{let V={};for(let[_,F]of Object.entries(t)){let q=F.modelObjectId??_,te=R[q];if(!tr(te))continue;let Q=cs(te);Q&&(V[_]=Br(Q,ne=>{let pt=Yo(ne),Ve=Vl(pt??new TC);return Fl(Ve),Ve}))}return V},[R,j]);Ut(()=>{u&&(u.current=B)},[B,u]),Ut(()=>()=>{for(let V of Object.values(B))nr(V,_=>_.dispose())},[B]);let G=h?.model.shading??"lit",H=h?.model.renderer??"pbr",ae=h?.wireframe.enabled??!1,be=h?.wireframe.color??"#93c5fd",pe=h?.wireframe.opacity??1,xe=wn(()=>{let V={};if(G!=="unlit")return V;for(let[_,F]of Object.entries(B))V[_]=Br(F,q=>{let te=new bu;return te.color.copy(q.color),te.map=q.map,te.alphaMap=q.alphaMap,te.alphaTest=q.alphaTest,te.transparent=q.transparent,te.opacity=q.opacity,te.side=q.side,te});return V},[B,G]),Te=wn(()=>{let V={};if(G!=="normals")return V;for(let[_,F]of Object.entries(B))V[_]=Br(F,()=>new PC);return V},[B,G]),ye=wn(()=>{let V={};if(G!=="lit"||H!=="matcap")return V;let _=Ml();for(let[F,q]of Object.entries(B))V[F]=Br(q,te=>{let Q=new kC;return Q.matcap=_,Q.color.copy(te.color),Q.alphaMap=te.alphaMap,Q.alphaTest=te.alphaTest,Q.side=te.side,Q});return V},[B,G,H]);Ut(()=>()=>{for(let V of Object.values(xe))nr(V,_=>_.dispose());for(let V of Object.values(Te))nr(V,_=>_.dispose());for(let V of Object.values(ye))nr(V,_=>_.dispose())},[xe,Te,ye]);let St=V=>G==="normals"?Te[V]:G==="unlit"?xe[V]:H==="matcap"?ye[V]:B[V],st=sn(a);st.current=a,Ut(()=>{st.current?.(S)},[S]);let De=wn(()=>{let V={};for(let[_,F]of Object.entries(t)){let q=F.modelObjectId??_,te=R[q];te&&(V[_]=te)}return V},[R,j]);Ut(()=>(c.current=De,l?.(),()=>{c.current===De&&(c.current={})}),[De,c,l]);let ve=sn({});Ut(()=>()=>{for(let V of Object.values(ve.current))for(let[_,F]of Object.entries(V))F&&Xi(F,Ki(_));ve.current={}},[]);let Y=wn(()=>{let V=new Map;for(let[_,F]of Object.entries(t)){let q=d===F||d?.id===F.id||d?.modelObjectId===F.modelObjectId,te=f&&(P===_||q),Q=te||n===_;(te||Q)&&V.set(_,{emissive:te,matcap:Q})}return V},[t,f,P,n,d]),ft=sn(Y);ft.current=Y,Ut(()=>{let V=new Set;for(let[_,F]of Object.entries(t)){V.add(_);let q=F.modelObjectId??_,te=R[q];if(!tr(te))continue;te.visible=F.visible!==!1;let Q=B[_];if(!Q)continue;if(H!=="uv-checker"){let fe=St(_);fe&&(te.material=fe)}if(F.visible===!1)continue;let ne=xe[_],pt=ye[_],Ve=i[_]??i[F.modelObjectId??_],ct=F.style?.material,Ue=ve.current[_]??{};for(let fe of ls){let Mt=Tt(ct,fe),me=Ue[fe];if(me===Mt)continue;let jt=Ki(fe);me&&Xi(me,jt),Mt?(Sl(Mt,jt,C),Ue[fe]=Mt):delete Ue[fe]}Object.keys(Ue).length>0?ve.current[_]=Ue:delete ve.current[_];let dt=Ve?.hex??ct?.baseColor;nr(Q,(fe,Mt)=>{let me=Qo(fe);Hl(fe,ct,dt);let jt=fe.userData.reactImmersiveConfiguredEmissive;jt?.isColor?jt.copy(fe.emissive):fe.userData.reactImmersiveConfiguredEmissive=fe.emissive.clone();let Ln=ft.current.get(_);Ln?.emissive&&fe.emissive.add(es),me!==Qo(fe)&&(fe.needsUpdate=!0);let gn=Wl(ne,Mt);if(gn){let Ei=Qo(gn);gn.color.copy(fe.color),gn.map=fe.map,gn.alphaMap=fe.alphaMap,gn.alphaTest=fe.alphaTest,gn.transparent=fe.transparent,gn.opacity=fe.opacity,gn.side=fe.side,Ei!==Qo(gn)&&(gn.needsUpdate=!0)}let on=Wl(pt,Mt);if(on){let Ei=Qo(on);Ln?.matcap?on.color.set(qr.color):on.color.copy(fe.color),on.map=fe.map,on.alphaMap=fe.alphaMap,on.alphaTest=fe.alphaTest,on.transparent=fe.transparent,on.opacity=fe.opacity,on.side=fe.side,Ei!==Qo(on)&&(on.needsUpdate=!0)}})}for(let _ of Object.keys(ve.current))if(!V.has(_)){for(let[F,q]of Object.entries(ve.current[_]))q&&Xi(q,Ki(F));delete ve.current[_]}C()},[t,R,B,xe,Te,ye,i,G,H,C]);let ze=sn(new Map);Ut(()=>{let V=ze.current,_=new Set([...V.keys(),...Y.keys()]),F=!1;for(let q of _){let te=V.get(q),Q=Y.get(q),ne=!!te?.emissive!=!!Q?.emissive,pt=!!te?.matcap!=!!Q?.matcap;if(!ne&&!pt)continue;F=!0;let Ve=B[q],ct=ye[q];Ve&&nr(Ve,(Ue,dt)=>{let fe=Ue.userData.reactImmersiveConfiguredEmissive;ne&&fe?.isColor&&(Ue.emissive.copy(fe),Q?.emissive&&Ue.emissive.add(es));let Mt=Wl(ct,dt);pt&&Mt&&(Q?.matcap?Mt.color.set(qr.color):Mt.color.copy(Ue.color))})}ze.current=Y,F&&C()},[Y,B,ye,C]),Ut(()=>{if(H!=="uv-checker")return;let V=Jm(),_=[];return S.traverse(F=>{if(!tr(F))return;let q=F.material,te=Array.isArray(q)?q:[q],Q=!!F.geometry.getAttribute("uv"),ne=te.map((Ve,ct)=>{let Ue=new bu({color:Q?"#ffffff":"#ff00ff",map:Q?V:null,side:Ve.side});return Ue.name=`${F.name||"mesh"}-uv-checker-${ct}`,Ue.toneMapped=!1,Ue}),pt=Array.isArray(q)?ne:ne[0];F.material=pt,_.push({node:F,original:q,diagnostic:pt})}),C(),()=>{for(let{node:F,original:q,diagnostic:te}of _){F.material=q;let Q=Array.isArray(te)?te:[te];for(let ne of Q)ne.dispose()}C()}},[S,H,C]),Ut(()=>{if(!ae)return;let V=[];for(let[_,F]of Object.entries(t)){let q=F.modelObjectId??_,te=R[q];if(!tr(te))continue;let Q=new bu({color:be,wireframe:!0,transparent:!0,opacity:pe,depthTest:!1,depthWrite:!1,side:_C,toneMapped:!1}),ne=te.clone(!1);ne.name="",ne.position.set(0,0,0),ne.quaternion.identity(),ne.scale.set(1,1,1),ne.matrix.identity(),ne.matrixAutoUpdate=!0,ne.material=Q,ne.castShadow=!1,ne.receiveShadow=!1,ne.frustumCulled=!1,ne.renderOrder=1,ne.userData={isWireframeOverlay:!0},ne.raycast=()=>{},te.morphTargetInfluences&&(ne.morphTargetInfluences=te.morphTargetInfluences),te.add(ne),V.push({node:te,overlay:ne})}return C(),()=>{for(let{node:_,overlay:F}of V)_.remove(F),F.material.dispose()}},[ae,be,pe,R,t,C]);let lt=wn(()=>Ig(M.animations),[M.animations]),nt=sn(s);nt.current=s;let Ee=sn(h);Ee.current=h;let rt=sn(null),Bt=sn({}),he=sn(null),Nt=sn(null),_t=sn(1),Se=sn(new Set),$=sn(0),ge=()=>({currentClip:Nt.current,isPlaying:he.current?.paused===!1,speed:_t.current,time:he.current?.time??0,duration:he.current?.getClip().duration??0}),ie=()=>{let V=ge();Se.current.forEach(_=>_(V))},we=(V,_)=>{let F=Gg(_);V.setLoop(F==="once"?RC:LC,F==="once"?1:1/0),V.clampWhenFinished=F==="once";let q=hu(_?.speed??_t.current);_t.current=q,V.setEffectiveTimeScale(q)},Pe=()=>{he.current?.stop(),he.current=null,Nt.current=null,ie(),C()},ke=()=>{he.current&&(he.current.paused=!0,ie(),C())},Le=V=>{let _=hu(V);_t.current=_,he.current?.setEffectiveTimeScale(_),ie()},de=V=>{let _=he.current;if(!_)return;let F=_.getClip().duration;_.time=Math.min(Math.max(V,0),F),rt.current?.update(0),ie(),C()},it=V=>{let _=Bt.current[V];if(!_)return;let F=jl(Ee.current,V);if(!F?.hidden){if(he.current===_&&_.paused){we(_,F),_.paused=!1,Nt.current=V,ie(),C();return}he.current&&he.current!==_&&he.current.stop(),we(_,F),_.paused=!1,_.enabled=!0,_.reset().play(),he.current=_,Nt.current=V,ie(),C()}};Ut(()=>{let V=new EC(S);rt.current=V;let _={};for(let{clip:ne,sourceName:pt}of lt)_[pt]=V.clipAction(ne);Bt.current=_;let F=ne=>{ne.action&&ne.action===he.current&&Pe()};V.addEventListener("finished",F);let q=()=>{};nt.current?.({clips:lt.map(({sourceName:ne})=>ne),clipDetails:lt.map(({sourceName:ne,duration:pt})=>({sourceName:ne,duration:pt})),play:lt.length?it:q,pause:lt.length?ke:q,stop:lt.length?Pe:q,setSpeed:lt.length?Le:q,seek:lt.length?de:q,getState:ge,subscribe:ne=>(Se.current.add(ne),ne(ge()),()=>{Se.current.delete(ne)})}),_t.current=1,ie();let te=Ee.current?.animations.autoplayClip,Q=te?jl(Ee.current,te):void 0;return te&&!Q?.hidden&&it(te),()=>{V.removeEventListener("finished",F),V.stopAllAction(),V.uncacheRoot(S),rt.current=null,Bt.current={},he.current=null,Nt.current=null,_t.current=1,ie()}},[S,lt]),Ut(()=>{let V=Nt.current,_=he.current;if(!V||!_||!h?.animations)return;let F=jl(h,V);if(F?.hidden){Pe();return}F&&(we(_,F),ie())},[h?.animations]),fu((V,_)=>{if(rt.current&&he.current?.paused===!1){if(rt.current.update(_),!m)for(let[F,q]of L.current)Kl(F,q,z);C(),$.current+=_,$.current>=.066&&($.current=0,ie(),ds(S))}});let Ze=wn(()=>(h?.model.rotation??[0,0,0]).map(V=>V*Math.PI/180),[h?.model.rotation]);fu((V,_)=>{if(!b.current)return;let F=b.current.rotation;F.x=Yl.lerp(F.x,Ze[0],1-Math.exp(-5*_)),F.y=Yl.lerp(F.y,Ze[1],1-Math.exp(-5*_)),F.z=Yl.lerp(F.z,Ze[2],1-Math.exp(-5*_)),Math.abs(F.x-Ze[0])<1e-4&&Math.abs(F.y-Ze[1])<1e-4&&Math.abs(F.z-Ze[2])<1e-4||C()});let It=sn([]),Ot=sn(0),je=sn(0),Ie=wn(()=>new Ji,[]);Ut(()=>{let V=new Map;for(let[Ve,ct]of Object.entries(t)){let Ue=R[ct.modelObjectId??Ve];Ue&&V.set(Ue,ct)}for(let Ve of It.current)Kl(Ve.node,V.get(Ve.node)?.transform,z);je.current=0,S.updateWorldMatrix(!0,!0);let _=new ql().setFromObject(S),F=_.getCenter(new Ji),q=_.getSize(new Ji).length()*.5;Ot.current=Number.isFinite(q)?q:0;let te=[...V.keys()],Q=new Set(te),ne=[],pt=new Ji;for(let Ve of te){if(!Ve.parent)continue;let ct=Ve.parent,Ue=!1;for(;ct;){if(Q.has(ct)){Ue=!0;break}ct=ct.parent}if(Ue)continue;let dt=new ql().setFromObject(Ve);if(dt.isEmpty())continue;dt.getCenter(pt);let fe=pt.clone().sub(F);fe.lengthSq()<1e-8||(fe.normalize(),ne.push({node:Ve,restLocalPos:Ve.position.clone(),restWorldPos:Ve.getWorldPosition(new Ji),worldDir:fe,parentInverse:new BC().copy(Ve.parent.matrixWorld).invert()}))}It.current=ne,C()},[S,R,j,I,z,C]),Ut(()=>{C()},[p,C]),fu((V,_)=>{let F=It.current;if(F.length===0)return;let q=Math.min(Math.max(p,0),1),te=je.current;if(Math.abs(te-q)<1e-4){if(te===q)return;je.current=q}else je.current=Yl.lerp(te,q,1-Math.exp(-6*_)),C();let Q=je.current*Ot.current;for(let ne of F)Ie.copy(ne.worldDir).multiplyScalar(Q).add(ne.restWorldPos).applyMatrix4(ne.parentInverse),ne.node.position.copy(Ie)});let mn=V=>{let _=V;for(;_;){let F=os(_),q=F?E[F]:void 0;if(q&&t[q])return[q,t[q]];_=_.parent}return null},bt=V=>{let _=mn(V.object);if(!_)return;let[,F]=_;F.selectable!==!1&&(V.stopPropagation(),r(F))},xn=V=>{if(!f)return;let _=mn(V.object);if(!_)return;let[F,q]=_;q.hoverable!==!1&&(V.stopPropagation(),w("pointer"),A(F),o?.(q))},yn=V=>{f&&(V.stopPropagation(),T(),A(null),o?.(null))},zt=wn(()=>!gl(S),[S]);return Xg("group",{ref:b,children:Xg("primitive",{object:S,...zt?{onClick:bt,...f?{onPointerOver:xn,onPointerOut:yn}:{}}:{}})})}import{useCallback as io,useEffect as xi,useMemo as XM,useRef as Cn,useState as ap}from"react";import{useFrame as qM,useThree as YM}from"@react-three/fiber";import{Box3 as nf,BoxGeometry as eS,Group as ef,Matrix4 as rf,Mesh as tS,MeshBasicMaterial as nS,Vector3 as Jr}from"three";import{Euler as DC,Matrix4 as Qi,MeshBasicMaterial as NC,MeshMatcapMaterial as IC,MeshNormalMaterial as zC,MeshStandardMaterial as jC,Quaternion as VC,Vector3 as ps}from"three";function Kg(e){let t={};for(let[n,i]of Object.entries(e))t[i.modelObjectId??n]=n;return t}function vu(e){let t=e,n=null;for(;t;){let i=t.userData?.ri_name;if(typeof i=="string"&&i)return i;!n&&t.name&&(n=t.name),t=t.parent}return n}function Jg(e,t){return e||(t?t.modelObjectId??t.id:null)}function Zl(e,t){let n=vu(e);if(!n)return null;let i=t.keyByModelObject[n]??n,r=t.objectBindings[i];return r?{key:i,binding:r}:null}var Zo=new ps,yu=new ps,FC=new Qi,qg=new Qi,Jl=new Qi,UC=new Qi,Ql=new Qi,GC=new Qi,HC=new Qi,WC=new ps,$C=new ps,pi=new ps,Yg=new VC,XC=new DC;function qC(e,t,n,i,r){let o=!!(n?.position||n?.rotation||n?.scale),a=!!(r&&r.factor>0&&r.radius>0);if(!o&&!a){e.matrixAutoUpdate=!0,e.position.copy(t.position),e.rotation.copy(t.rotation),e.scale.copy(t.scale),e.updateMatrix(),e.updateWorldMatrix(!0,!1);return}qg.compose(t.position,Yg.setFromEuler(t.rotation),t.scale);let s=n?.rotation;Jl.compose(WC.fromArray(n?.position??[0,0,0]),Yg.setFromEuler(XC.set(s?.[0]??0,s?.[1]??0,s?.[2]??0)),$C.fromArray(n?.scale??[1,1,1])),Jl.premultiply(i).multiply(UC.copy(i).invert()),e.parent?.updateWorldMatrix(!0,!1);let c=e.parent?.matrixWorld??FC;if(Ql.multiplyMatrices(c,qg).premultiply(Jl),a&&r){let l=e;for(;l.parent&&!l.userData.ri_name;)l=l.parent;let u=l.userData.ri_center;Array.isArray(u)&&u.length===3?pi.fromArray(u).applyMatrix4(i).applyMatrix4(Jl):pi.setFromMatrixPosition(Ql),pi.sub(r.centre),pi.lengthSq()>1e-8&&(pi.normalize().multiplyScalar(r.factor*r.radius),Ql.premultiply(HC.makeTranslation(pi.x,pi.y,pi.z)))}e.matrixAutoUpdate=!1,e.matrix.multiplyMatrices(GC.copy(c).invert(),Ql),e.matrixWorldNeedsUpdate=!0,e.updateWorldMatrix(!1,!1)}function ec(e,t){if(!tr(e)&&!e.userData.riLogicalObject)return;let n=Zl(e,t);if(!n)return;let i=Qg(e);if(i.rest??(i.rest={position:e.position.clone(),rotation:e.rotation.clone(),scale:e.scale.clone()}),t.suspendTransforms)return;if(t.placementFrame&&!e.userData.riLogicalObject){qC(e,i.rest,n.binding.transform,t.placementFrame,t.explode);return}let r=i.rest,o=n.binding.transform;o?.position?e.position.fromArray(o.position):e.position.copy(r.position),o?.rotation?e.rotation.set(o.rotation[0],o.rotation[1],o.rotation[2],r.rotation.order):e.rotation.copy(r.rotation),o?.scale?e.scale.fromArray(o.scale):e.scale.copy(r.scale);let a=t.explode;if(a&&a.factor>0&&a.radius>0){e.updateWorldMatrix(!0,!1),yu.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?Zo.fromArray(c).applyMatrix4(e.matrixWorld).sub(a.centre):Zo.copy(yu).sub(a.centre),Zo.lengthSq()>1e-8&&(Zo.normalize().multiplyScalar(a.factor*a.radius).add(yu),e.parent&&e.parent.worldToLocal(Zo),e.position.copy(Zo))}e.updateMatrix(),e.updateWorldMatrix(!0,!1)}function ea(e,t){e.traverse(n=>ec(n,t))}function Qg(e){var t;return(t=e.userData).riVisuals??(t.riVisuals={}),e.userData.riVisuals}function YC(e,t,n,i){return JSON.stringify([e?.style?.material??null,t??null,n.shadingMode,n.rendererMode,i])}function KC(e){if(e.textures){for(let t of ls){let n=e.textures[t];n&&Xi(n,Ki(t))}e.textures=void 0}}function JC(e,t,n){let i=e.textures??{};for(let r of ls){let o=Tt(t,r),a=i[r];if(a===o)continue;let s=Ki(r);a&&Xi(a,s),o?(Sl(o,s,n),i[r]=o):delete i[r]}e.textures=Object.keys(i).length>0?i:void 0}function QC(e,t){if(t.shadingMode==="normals")return Br(e,()=>new zC);if(t.shadingMode==="unlit")return Br(e,n=>{let i=new NC;return i.color.copy(n.color),i.map=n.map,i.alphaMap=n.alphaMap,i.alphaTest=n.alphaTest,i.transparent=n.transparent,i.opacity=n.opacity,i.side=n.side,i});if(t.rendererMode==="matcap"){let n=Ml();return Br(e,i=>{let r=new IC;return r.matcap=n,r.color.copy(i.color),r.alphaMap=i.alphaMap,r.alphaTest=i.alphaTest,r.side=i.side,r})}return e}function ZC(e,t){if(!tr(e))return;let i=Qg(e);i.original??(i.original=cs(e));let r=Zl(e,t);if(!r){i.original&&(e.material=i.original),e.visible=!0;return}let{key:o,binding:a}=r;e.visible=a.visible!==!1,ec(e,t);let s=t.itemMaterials?.[o]?.hex??t.itemMaterials?.[a.modelObjectId??o]?.hex,c=o===t.selectedKey||t.highlightOnHover!==!1&&o===t.hoveredKey,l=YC(a,s,t,c);if(i.signature===l&&i.display){e.material=i.display;return}let u=a.style?.material;if(JC(i,u,t.invalidate),!i.physical){let d=i.original??cs(e);if(!d)return;i.physical=Br(d,h=>{let g=Yo(h),f=Vl(g??new jC);return Fl(f),f})}nr(i.physical,d=>{Hl(d,u,s??u?.baseColor),c&&(d.emissive.add(es),d.color.lerp(Hm,Wm)),d.needsUpdate=!0}),i.display&&i.display!==i.physical&&nr(i.display,d=>d.dispose()),i.display=QC(i.physical,t),i.signature=l,e.material=i.display}function Zg(e,t){e.traverse(n=>ZC(n,t))}function wu(e){e.traverse(t=>{if(!tr(t))return;let n=t.userData.riVisuals;n&&(n.rest&&(t.matrixAutoUpdate=!0,t.position.copy(n.rest.position),t.rotation.copy(n.rest.rotation),t.scale.copy(n.rest.scale),t.updateMatrix()),n.original&&(t.material=n.original),n.display&&n.display!==n.physical&&nr(n.display,i=>i.dispose()),n.physical&&nr(n.physical,i=>i.dispose()),KC(n),delete t.userData.riVisuals)})}var of=new rf().makeRotationX(Math.PI/2),tf=of.clone().invert();function rS(e){let t=new Jr(e[0],e[1],e[2]),n=new Jr(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 nf(t.clone().sub(n),t.clone().add(n))}function iS(e){let t=e.getCenter(new Jr),n=e.getSize(new Jr).multiplyScalar(.5);return[t.x,t.y,t.z,n.x,0,0,0,n.y,0,0,0,n.z]}var tc=class{constructor(){this.group=new ef;this.objects=new Map;this.geometry=new eS(1,1,1);this.material=new nS;this.originalBounds=new WeakMap;this.signature="";this.lastContext=null;this.lastEffective=null;this.lastDragging=!1;this.version=0;this.tileVersions=new WeakMap;this.transforms=new Map}setCatalog(t){this.group.clear(),this.objects.clear();for(let n of t){let i=new nf(new Jr(...n.minimum),new Jr(...n.maximum)).applyMatrix4(tf),r=new ef;r.name=n.name,r.userData.ri_name=n.name,r.userData.riLogicalObject=!0,r.userData.ri_center=i.getCenter(new Jr).toArray();let o=new tS(this.geometry,this.material);o.visible=!1,o.raycast=()=>{},o.position.copy(i.getCenter(new Jr)),o.scale.copy(i.getSize(new Jr)),r.add(o),this.group.add(r),this.objects.set(n.name,r)}this.signature="",this.lastContext=null}nodesByBinding(t){let n={};for(let[i,r]of this.objects){let o=t.keyByModelObject[i]??i;t.objectBindings[o]&&(n[o]=r)}return n}sync(t,n,i=!1){if(!i&&!this.lastDragging&&t===this.lastContext&&this.lastEffective)return this.lastEffective;this.lastContext=t,this.lastDragging=i;let r={...t,suspendTransforms:!1},o=n?t.objectBindings[n]:void 0,a=o?this.objects.get(o.modelObjectId??n):void 0;i&&a&&o&&(r={...r,objectBindings:{...t.objectBindings,[n]:{...o,transform:{position:a.position.toArray(),rotation:[a.rotation.x,a.rotation.y,a.rotation.z],scale:a.scale.toArray()}}}});for(let c of this.objects.values())i&&c===a||ec(c,r);this.group.updateWorldMatrix(!0,!0);let s=[...this.objects].map(([c,l])=>`${c}:${l.matrix.elements.join(",")}`).join(";");if(s!==this.signature){this.signature=s,this.version++,this.transforms.clear();for(let[c,l]of this.objects)l.matrix.equals(new rf)||this.transforms.set(c,of.clone().multiply(l.matrix).multiply(tf))}return this.lastEffective=r,r}updateBounds(t){if(!t)return;let n=i=>{if(this.tileVersions.get(i)!==this.version){if(i.boundingVolume.box&&this.tileVersions.get(i)!==this.version){let r=this.originalBounds.get(i);r||(r={box:[...i.boundingVolume.box],error:i.geometricError},this.originalBounds.set(i,r));let o=rS(r.box),a=o.clone(),s=1;for(let l of i.extras?.featureIds??[]){let u=this.transforms.get(l);u&&(a.union(o.clone().applyMatrix4(u)),s=Math.max(s,u.getMaxScaleOnAxis()))}let c=iS(a);i.boundingVolume.box=c,i.geometricError=r.error*s,i.engineData?.boundingVolume?.setObbData(c,i.engineData.transform),this.tileVersions.set(i,this.version)}i.children?.forEach(n)}};n(t)}dispose(){this.group.clear(),this.objects.clear(),this.geometry.dispose(),this.material.dispose()}};var Cu=Object.freeze({factor:1,loosened:!1,tooFine:0,raisedAt:-1/0,changedAt:-1/0}),hs=16,Su=1.25,oS=1.5,aS=1.25,sS=500,lS=3e3,af=5e3,sf=2e3,cS=.9;function lf(e){return e.full&&(e.wanting||e.usage>1)}function cf(e){return e.loosened?lS:sS}function df(e){let t=e.factor/aS;return t<=1+1e-6?1:t}function uf(e,t){return e.factor>1&&!e.loosened&&!t.full&&!t.wanting&&t.usage<cS&&df(e)>e.tooFine}function pf(e,t){let{now:n}=t,i=t.moved&&e.tooFine>0?{...e,tooFine:0}:e;if(lf(t)){if(n-i.changedAt<cf(i))return i;let r=Math.max(i.tooFine,i.factor);return i.factor>=hs?i.loosened&&i.tooFine===r?i:{...i,loosened:!0,tooFine:r,changedAt:n}:{factor:Math.min(hs,i.factor*oS),loosened:!0,tooFine:r,raisedAt:n,changedAt:n}}return i.loosened&&!t.wanting?{...i,loosened:!1,changedAt:n}:uf(i,t)&&n-i.raisedAt>=af&&n-i.changedAt>=sf?{...i,factor:df(i),changedAt:n}:i}function hf(e,t){let{now:n}=t;return lf(t)?e.factor>=hs&&e.loosened?null:Math.max(0,cf(e)-(n-e.changedAt)):e.loosened&&!t.wanting?0:uf(e,t)?Math.max(0,af-(n-e.raisedAt),sf-(n-e.changedAt)):null}function bf(e){try{let t=typeof location<"u"?location.href:void 0;return new URL(e,t).origin}catch{return null}}function Mu(e){if(!e)return null;let t=e.length,n=e.indexOf("?"),i=e.indexOf("#");n!==-1&&(t=Math.min(t,n)),i!==-1&&(t=Math.min(t,i));let r=e.lastIndexOf(".",t),o=e.lastIndexOf("/",t),a=e.indexOf("://");return a!==-1&&a+2===o||r===-1||r<o?null:e.substring(r+1,t)||null}var rc,ms=(rc=class{static setXRSession(e){e!==this.session&&(this.flushPending(),this.session=e)}static requestAnimationFrame(e){let{session:t,pending:n}=this,i,r=()=>{n.delete(i),e()};return i=t?t.requestAnimationFrame(r):requestAnimationFrame(r),n.set(i,e),i}static cancelAnimationFrame(e){let{pending:t,session:n}=this;t.delete(e),n?n.cancelAnimationFrame(e):cancelAnimationFrame(e)}static flushPending(){this.pending.forEach((e,t)=>{e(),this.cancelAnimationFrame(t)})}},wd(rc,"pending",new Map),wd(rc,"session",null),rc),mf=2**30,bs=class{get unloadPriorityCallback(){return this._unloadPriorityCallback}set unloadPriorityCallback(e){e.length===1?(console.warn('LRUCache: "unloadPriorityCallback" function has been changed to take two arguments.'),this._unloadPriorityCallback=(t,n)=>{let i=e(t),r=e(n);return i<r?-1:+(i>r)}):this._unloadPriorityCallback=e}constructor(){this.minSize=6e3,this.maxSize=8e3,this.minBytesSize=.3*mf,this.maxBytesSize=.4*mf,this.unloadPercent=.05,this.autoMarkUnused=!0,this.cachedBytes=0,this.itemSet=new Map,this.itemList=[],this.usedSet=new Set,this.callbacks=new Map,this.unloadingHandle=-1,this.bytesMap=new Map,this.loadedSet=new Set,this._unloadPriorityCallback=null;let e=this.itemSet;this.defaultPriorityCallback=t=>e.get(t)}isFull(){return this.itemSet.size>=this.maxSize||this.cachedBytes>=this.maxBytesSize}getMemoryUsage(e){return this.bytesMap.get(e)||0}setMemoryUsage(e,t){let{bytesMap:n,itemSet:i}=this;i.has(e)&&(this.cachedBytes-=n.get(e)||0,n.set(e,t),this.cachedBytes+=t)}add(e,t){let n=this.itemSet;if(n.has(e)||this.isFull())return!1;let i=this.usedSet,r=this.itemList,o=this.callbacks;return r.push(e),i.add(e),n.set(e,Date.now()),o.set(e,t),!0}has(e){return this.itemSet.has(e)}remove(e){let t=this.usedSet,n=this.itemSet,i=this.itemList,r=this.bytesMap,o=this.callbacks,a=this.loadedSet;if(n.has(e)){this.cachedBytes-=r.get(e)||0,r.delete(e),o.get(e)(e);let s=i.indexOf(e);return i.splice(s,1),t.delete(e),n.delete(e),o.delete(e),a.delete(e),!0}return!1}setLoaded(e,t){let{itemSet:n,loadedSet:i}=this;n.has(e)&&(t===!0?i.add(e):i.delete(e))}markUsed(e){let t=this.itemSet,n=this.usedSet;t.has(e)&&!n.has(e)&&(t.set(e,Date.now()),n.add(e))}markUnused(e){this.usedSet.delete(e)}markAllUnused(){this.usedSet.clear()}isUsed(e){return this.usedSet.has(e)}unloadUnusedContent(){let{unloadPercent:e,minSize:t,maxSize:n,itemList:i,itemSet:r,usedSet:o,loadedSet:a,callbacks:s,bytesMap:c,minBytesSize:l,maxBytesSize:u}=this,d=i.length-o.size,h=i.length-a.size,g=Math.max(Math.min(i.length-t,d),0),f=this.cachedBytes-l,y=this.unloadPriorityCallback||this.defaultPriorityCallback,k=!1,v=g>0&&d>0||h&&i.length>n;if(d&&this.cachedBytes>l||h&&this.cachedBytes>u||v){i.sort((b,w)=>{let T=o.has(b);if(T===o.has(w)){let S=a.has(b);return S===a.has(w)?-y(b,w):S?1:-1}else return T?1:-1});let p=Math.max(t*e,g*e),m=Math.ceil(Math.min(p,d,g)),M=Math.max(e*f,e*l),C=Math.min(M,f),P=0,A=0;for(;this.cachedBytes-A>u||i.length-P>n;){let b=i[P],w=c.get(b)||0;if(o.has(b)&&a.has(b)||this.cachedBytes-A-w<u&&i.length-P<=n)break;A+=w,P++}for(;A<C||P<m;){let b=i[P],w=c.get(b)||0;if(o.has(b)||this.cachedBytes-A-w<l&&P>=m)break;A+=w,P++}i.splice(0,P).forEach(b=>{this.cachedBytes-=c.get(b)||0,s.get(b)(b),c.delete(b),r.delete(b),s.delete(b),a.delete(b),o.delete(b)}),k=P<g||A<f&&P<d,k&&(k=P>0)}k&&(this.unloadingHandle=ms.requestAnimationFrame(()=>this.scheduleUnload()))}scheduleUnload(){ms.cancelAnimationFrame(this.unloadingHandle),this.scheduled||(this.scheduled=!0,queueMicrotask(()=>{this.scheduled=!1,this.unloadUnusedContent()}))}},dS=class extends DOMException{constructor(){super("PriorityQueue: Item removed","AbortError")}},Or=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=>{ms.requestAnimationFrame(e)},this._runjobs=()=>{this.scheduled=!1,this.tryRunJobs()}}sort(){let e=this.priorityCallback,t=this.items;e!==null&&t.sort(e)}has(e){return this.callbacks.has(e)}add(e,t){let n={callback:t,reject:null,resolve:null,promise:null};return n.promise=new Promise((i,r)=>{let o=this.items,a=this.callbacks;n.resolve=i,n.reject=r,o.unshift(e),a.set(e,n),this.autoUpdate&&this.scheduleJobRun()}),n.promise}remove(e){let t=this.items,n=this.callbacks,i=t.indexOf(e);if(i!==-1){let r=n.get(e);r.promise.catch(o=>{if(o.name!=="AbortError")throw o}),r.reject(new dS),t.splice(i,1),n.delete(e)}}removeByFilter(e){let{items:t}=this;for(let n=0;n<t.length;n++){let i=t[n];e(i)&&(this.remove(i),n--)}}tryRunJobs(){this.sort();let e=this.items,t=this.callbacks,n=this.maxJobs,i=0,r=()=>{this.currJobs--,this.autoUpdate&&this.scheduleJobRun()};for(;n>this.currJobs&&e.length>0&&i<n;){this.currJobs++,i++;let o=e.pop(),{callback:a,resolve:s,reject:c}=t.get(o);t.delete(o);let l;try{l=a(o)}catch(u){c(u),r();continue}l instanceof Promise?l.then(s).catch(c).finally(r):(s(l),r())}}flush(e){let{items:t,callbacks:n}=this,i=t.indexOf(e);if(!n.has(e))return;let{callback:r,resolve:o,reject:a}=n.get(e);n.delete(e),t.splice(i,1);let s;try{s=r(e)}catch(c){a(c);return}return s instanceof Promise?s.then(o).catch(a):o(s),s}scheduleJobRun(){this.scheduled||(this.scheduled=(this._schedulingCallback(this._runjobs),!0))}},sc=class{get running(){for(let e of this.originQueues.values())if(e.running)return!0;return!1}get maxJobsPerOrigin(){return this._maxJobsPerOrigin}set maxJobsPerOrigin(e){this._maxJobsPerOrigin=e,this.originQueues.forEach(t=>t.maxJobs=e)}get maxJobs(){return this.maxJobsPerOrigin}set maxJobs(e){console.warn('DownloadPriorityQueue: "maxJobs" is no longer valid and limits jobs per server origin. Use "maxJobsPerOrigin", instead.'),this.maxJobsPerOrigin=e}get priorityCallback(){return this._priorityCallback}set priorityCallback(e){this._priorityCallback=e,this.originQueues.forEach(t=>t.priorityCallback=e)}constructor(){this.originQueues=new Map,this._itemQueues=new WeakMap,this._maxJobsPerOrigin=6,this._priorityCallback=null}add(e,t,n,i=null){this.originQueues.forEach((c,l)=>{c.running||this.originQueues.delete(l)});let r=e===null?null:bf(e),o=this.originQueues.get(r);o||(o=new Or,o.maxJobs=this._maxJobsPerOrigin,o.priorityCallback=this._priorityCallback,this.originQueues.set(r,o));let a=this._itemQueues.get(t);if(a&&a!==o&&a.has(t))throw Error("DownloadPriorityQueue: Item is already queued with a different url origin.");this._itemQueues.set(t,o);let s=o.add(t,n);return i!==null&&(i.aborted?this.remove(t):i.addEventListener("abort",()=>this.remove(t),{once:!0})),s}remove(e){let t=this._itemQueues.get(e);t&&(t.remove(e),this._itemQueues.delete(e))}has(e){let t=this._itemQueues.get(e);return!!(t&&t.has(e))}};var to=6378137,uS=1/298.257223563,Pu=6356752314245179e-9,nc={inView:!1,error:1/0,distanceFromCamera:1/0};function lc(e){return e===4||e===-1}function Qr(e,t){return cc(e)&&e.traversal.lastFrameVisited===t&&e.traversal.used}function cc(e){return!!e.traversal}function xs(e){let{children:t}=e,n=t.length===0||cc(t[t.length-1]),i=!e.internal.hasUnrenderableContent||lc(e.internal.loadingState);return n&&i}function Zi(e){return e.traversal.unconditionallyRefine}function gs(e,t){if(cc(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,nc),e.traversal.inFrustum=nc.inView,e.traversal.error=nc.error,e.traversal.distanceFromCamera=nc.distanceFromCamera,e.traversal.unconditionallyRefine=e.internal.hasUnrenderableContent,!e.traversal.unconditionallyRefine))){let n=e.parent;for(;n&&n.traversal.unconditionallyRefine;)n=n.parent;n&&n.geometricError<=e.geometricError&&(e.traversal.unconditionallyRefine=!0)}}function Tu(e,t,n=!1){if(gs(e,t),n?t.markTileUsed(e):ic(e),Zi(e)&&xs(e)){let i=e.children;for(let r=0,o=i.length;r<o;r++)Tu(i[r],t,n)}}function xf(e,t){if(gs(e,t),e.traversal.usedLastFrame&&(ic(e),e.traversal.wasSetActive&&(e.traversal.active=!0),(!e.traversal.active||Zi(e))&&xs(e))){let n=e.children;for(let i=0,r=n.length;i<r;i++)xf(n[i],t)}}function ic(e){e.traversal.used=!0}function pS(e,t){return!(e.traversal.error<=t.errorTarget&&!Zi(e)||t.maxDepth>0&&e.internal.depth+1>=t.maxDepth||!xs(e))}function yf(e,t){let{frameCount:n}=t,{children:i}=e;for(let r=0,o=i.length;r<o;r++){let a=i[r];Qr(a,n)&&(a.traversal.active&&(a.traversal.kicked=!0,a.traversal.active=!1),yf(a,t))}}function gf(e){return!Zi(e)&&(!e.internal.hasContent||lc(e.internal.loadingState))}function vf(e,t){if(gs(e,t),!e.traversal.inFrustum)return;let n=e.parent;if(n&&n.refine==="ADD"&&e.geometricError>0&&e.traversal.error*(n.geometricError/e.geometricError)<=t.errorTarget)return;if(!pS(e,t)){ic(e);return}let i=!1,r=!1,o=e.children;for(let a=0,s=o.length;a<s;a++){let c=o[a];vf(c,t),i||(i=Qr(c,t.frameCount)),r||(r=c.traversal.inFrustum)}if(e.refine==="REPLACE"&&!r&&o.length!==0){e.traversal.inFrustum=!1,t.markTileUsed(e);for(let a=0,s=o.length;a<s;a++)Tu(o[a],t,!0);return}if(ic(e),e.refine==="REPLACE"&&i&&(t.loadSiblings||t.loadAncestors))for(let a=0,s=o.length;a<s;a++)Tu(o[a],t)}function wf(e,t){let n=t.frameCount;if(!Qr(e,n))return;let i=e.children,r=!1;for(let a=0,s=i.length;a<s;a++){let c=i[a];r||(r=Qr(c,n))}if(!r)e.traversal.isLeaf=!0;else{for(let s=0,c=i.length;s<c;s++)wf(i[s],t);let a=!0;for(let s=0,c=i.length;s<c;s++){let l=i[s];if(Qr(l,n)){let u=!Zi(l),d=!l.internal.hasContent||lc(l.internal.loadingState);u&&d||l.traversal.allChildrenLoaded||(a=!1)}}e.traversal.allChildrenLoaded=a}let o=!0;for(let a=0,s=i.length;a<s;a++){let c=i[a];Qr(c,t.frameCount)&&!c.traversal.allUsedChildrenProcessed&&(o=!1)}e.traversal.allUsedChildrenProcessed=o&&xs(e)}function Cf(e,t){if(!Qr(e,t.frameCount))return;let n=e.children;if(e.refine==="REPLACE"&&t.loadAncestors&&!e.traversal.allChildrenLoaded&&!Zi(e)&&(e.traversal.isLeaf=!0),e.traversal.isLeaf){if(!Zi(e)&&(e.traversal.active=!0,xs(e)&&e.internal.hasContent&&!lc(e.internal.loadingState)))for(let r=0,o=n.length;r<o;r++)xf(n[r],t);return}let i=n.length>0;for(let r=0,o=n.length;r<o;r++){let a=n[r];Cf(a,t),Qr(a,t.frameCount)&&!(a.traversal.active&&gf(a))&&!a.traversal.allChildrenReady&&(i=!1)}e.traversal.allChildrenReady=i,e.refine==="REPLACE"&&!i&&e.traversal.wasSetActive&&gf(e)&&(e.traversal.active=!0,yf(e,t))}function Sf(e,t){gs(e,t);let n=Qr(e,t.frameCount);if(n&&(e.internal.hasUnrenderableContent&&(t.markTileUsed(e),t.queueTileForDownload(e)),e.internal.hasRenderableContent&&e.refine==="ADD"&&(e.traversal.active=!0),(e.traversal.active||e.traversal.kicked)&&e.internal.hasContent&&(t.markTileUsed(e),e.traversal.allUsedChildrenProcessed&&t.queueTileForDownload(e),e.internal.loadingState!==4&&(e.traversal.active=!1)),t.loadAncestors&&e.internal.hasContent&&(t.markTileUsed(e),t.queueTileForDownload(e)),e.internal.virtualChildCount>0&&e.internal.hasContent&&t.markTileUsed(e),e.traversal.visible=e.internal.hasRenderableContent&&e.traversal.active&&e.traversal.inFrustum&&e.internal.loadingState===4,t.stats.used++,e.traversal.inFrustum&&t.stats.inFrustum++),n||cc(e)&&e.traversal.usedLastFrame){let i=!1,r=!1;n?(i=e.traversal.active,r=t.displayActiveTiles&&e.traversal.active||e.traversal.visible):gs(e,t),e.internal.hasRenderableContent&&e.internal.loadingState===4?(i&&t.stats.active++,r&&t.stats.visible++,e.traversal.wasSetActive!==i&&t.invokeOnePlugin(a=>a.setTileActive&&a.setTileActive(e,i)),e.traversal.wasSetVisible!==r&&t.invokeOnePlugin(a=>a.setTileVisible&&a.setTileVisible(e,r))):e.internal.hasRenderableContent||(r=e.traversal.isLeaf,e.traversal.wasSetVisible!==r&&t.invokeOnePlugin(a=>a.setEmptyTileVisible&&a.setEmptyTileVisible(e,r))),e.traversal.visible=r,e.traversal.active=i;let o=e.children;for(let a=0,s=o.length;a<s;a++){let c=o[a];Sf(c,t)}}}function hS(e,t){vf(e,t),wf(e,t),Cf(e,t),Sf(e,t)}function mS(e){let t=null;return()=>{t===null&&(t=ms.requestAnimationFrame(()=>{t=null,e()}))}}function gS(e,t=null,n=null){let i=[];for(i.push(e),i.push(null),i.push(0);i.length>0;){let r=i.pop(),o=i.pop(),a=i.pop();if(t&&t(a,o,r)){n&&n(a,o,r);return}let s=a.children;if(s)for(let c=s.length-1;c>=0;c--)i.push(s[c]),i.push(a),i.push(r+1);n&&n(a,o,r)}}var ff=Symbol("PLUGIN_REGISTERED"),hi={inView:!0,error:0,distance:1/0},fS=(e,t)=>{let n=e.priority||0,i=t.priority||0;return n===i?!e.traversal||!t.traversal?0:e.traversal.used===t.traversal.used?e.traversal.error===t.traversal.error?e.traversal.distanceFromCamera===t.traversal.distanceFromCamera?e.internal.depthFromRenderedParent===t.internal.depthFromRenderedParent?0:e.internal.depthFromRenderedParent>t.internal.depthFromRenderedParent?-1:1:e.traversal.distanceFromCamera>t.traversal.distanceFromCamera?-1:1:e.traversal.error>t.traversal.error?1:-1:e.traversal.used?1:-1:n>i?1:-1},bS=(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,xS=(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,ta=(e,t)=>{let n=e.priority??1/0,i=t.priority??1/0;if(n!==i)return n>i?1:-1;if(!e.internal||!t.internal)return 0;let r=e.internal.renderer,o=t.internal.renderer,a=!r.loadAncestors,s=!o.loadAncestors;return a&&s?bS(e,t):fS(e,t)},ku=new bs;ku.unloadPriorityCallback=xS;var fs=new sc;fs.maxJobsPerOrigin=25,fs.priorityCallback=ta;var oc=new Or;oc.maxJobs=5,oc.priorityCallback=ta;var ac=new Or;ac.maxJobs=25,ac.priorityCallback=(e,t)=>{let n=e.parent,i=t.parent;return n===i?0:n?i?ta(n,i):-1:1};var _u=class{get root(){let e=this.rootTileset;return e?e.root:null}get loadProgress(){let{stats:e,isLoading:t}=this,n=e.queued+e.downloading+e.parsing,i=e.inCacheSinceLoad+ +!!t;return i===0?1:1-n/i}get downloadQueue(){return this._downloadQueue}set downloadQueue(e){if(e instanceof Or){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=ku,this.downloadQueue=fs,this.parseQueue=oc,this.processNodeQueue=ac,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=mS(()=>{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[ff]===!0)throw Error("TilesRendererBase: A plugin can only be registered to a single tileset");let t=this.plugins,n=e.priority||0,i=t.length;for(let r=0;r<t.length;r++)if((t[r].priority||0)>n){i=r;break}t.splice(i,0,e),e[ff]=!0,e.init&&e.init(this)}unregisterPlugin(e){let t=this.plugins;if(typeof e=="string"&&(e=this.getPluginByName(e)),t.includes(e)){let n=t.indexOf(e);return t.splice(n,1),e.dispose&&e.dispose(),!0}return!1}getPluginByName(e){return this.plugins.find(t=>t.name===e)||null}invokeOnePlugin(e){let t=[...this.plugins,this];for(let n=0;n<t.length;n++){let i=e(t[n]);if(i)return i}return null}invokeAllPlugins(e){let t=[...this.plugins,this],n=[];for(let i=0;i<t.length;i++){let r=e(t[i]);r&&n.push(r)}return n.length===0?null:Promise.all(n)}traverse(e,t,n=!0){this.root&&gS(this.root,(i,...r)=>(n&&this.ensureChildrenArePreprocessed(i,!0),e?e(i,...r):!1),t)}getAttributions(e=[]){return this.invokeAllPlugins(t=>t!==this&&t.getAttributions&&t.getAttributions(e)),e}update(){let{lruCache:e,usedSet:t,stats:n,root:i,downloadQueue:r,parseQueue:o,processNodeQueue:a}=this;if(this.rootLoadingState===0&&(this.rootLoadingState=2,this.invokeOnePlugin(l=>l.loadRootTileset&&l.loadRootTileset()).then(l=>{let u=this.rootURL;u!==null&&this.invokeAllPlugins(d=>u=d.preprocessURL?d.preprocessURL(u,null):u),this.rootLoadingState=4,this.rootTileset=l,this.dispatchEvent({type:"needs-update"}),this.dispatchEvent({type:"load-tileset",tileset:l,url:u}),this.dispatchEvent({type:"load-root-tileset",tileset:l,url:u})}).catch(l=>{this.rootLoadingState=-1,console.error(l),this.rootTileset=null,this.dispatchEvent({type:"load-error",tile:null,error:l,url:this.rootURL})})),!i)return;let s=null;if(this.invokeAllPlugins(l=>{if(l.doTilesNeedUpdate){let u=l.doTilesNeedUpdate();s=s===null?u:!!(s||u)}}),s===!1){this.dispatchEvent({type:"update-before"}),this.dispatchEvent({type:"update-after"});return}this.dispatchEvent({type:"update-before"}),n.inFrustum=0,n.used=0,n.active=0,n.visible=0,n.tilesProcessed=0,this.frameCount++,t.forEach(l=>e.markUnused(l)),t.clear(),this.prepareForTraversal(),hS(i,this),this.removeUnusedPendingTiles();let c=this.queuedTiles;c.sort(e.unloadPriorityCallback);for(let l=0,u=c.length;l<u&&!e.isFull();l++)this.requestTileContents(c[l]);c.length=0,e.scheduleUnload(),(r.running||o.running||a.running)===!1&&this.isLoading===!0&&(this.cachedSinceLoadComplete.clear(),n.inCacheSinceLoad=0,this.dispatchEvent({type:"tiles-load-end"}),this.isLoading=!1),this.dispatchEvent({type:"update-after"})}resetFailedTiles(){this.rootLoadingState===-1&&(this.rootLoadingState=0);let e=this.stats;e.failed!==0&&(this.traverse(t=>{t.internal.loadingState===-1&&(t.internal.loadingState=0)},null,!1),e.failed=0)}calculateTileViewErrorWithPlugin(e,t){this.calculateTileViewError(e,t);let{errorFalloff:n,errorFalloffDensity:i}=this;if(n>0&&Number.isFinite(t.distanceFromCamera)){let s=t.distanceFromCamera*i;t.error-=n*(1-Math.exp(-s*s))}let r=null,o=0,a=1/0;this.invokeAllPlugins(s=>{s!==this&&s.calculateTileViewError&&(hi.inView=!0,hi.error=0,hi.distance=1/0,s.calculateTileViewError(e,hi)&&(r===null&&(r=!0),r&&(r=hi.inView),hi.inView&&(a=Math.min(a,hi.distance),o=Math.max(o,hi.error))))}),t.inView&&r!==!1?(t.error=Math.max(t.error,o),t.distanceFromCamera=Math.min(t.distanceFromCamera,a)):r?(t.inView=!0,t.error=o,t.distanceFromCamera=a):t.inView=!1}dispose(){[...this.plugins].forEach(n=>{this.unregisterPlugin(n)});let e=this.lruCache,t=[];this.traverse(n=>(t.push(n),!1),null,!1);for(let n=0,i=t.length;n<i;n++)e.remove(t[n]);this.stats={queued:0,parsing:0,downloading:0,failed:0,inFrustum:0,traversed:0,used:0,active:0,visible:0},this.frameCount=0,this.loadingTiles.clear()}calculateBytesUsed(e,t){return 0}dispatchEvent(e){}addEventListener(e,t){}removeEventListener(e,t){}parseTile(e,t,n){return null}prepareForTraversal(){}disposeTile(e){e.traversal.visible&&(e.internal.hasRenderableContent?this.invokeOnePlugin(n=>n.setTileVisible&&n.setTileVisible(e,!1)):this.invokeOnePlugin(n=>n.setEmptyTileVisible&&n.setEmptyTileVisible(e,!1)),e.traversal.visible=!1),e.traversal.active&&e.internal.hasRenderableContent&&this.invokeOnePlugin(n=>n.setTileActive&&n.setTileActive(e,!1)),e.traversal.active=!1;let{scene:t}=e.engineData;t&&this.dispatchEvent({type:"dispose-model",scene:t,tile:e})}preprocessNode(e,t,n=null){if(this.processedTiles.add(e),this.stats.tilesProcessed++,e.content&&(!("uri"in e.content)&&"url"in e.content&&(e.content.uri=e.content.url,delete e.content.url),e.content.boundingVolume&&!("box"in e.content.boundingVolume||"sphere"in e.content.boundingVolume||"region"in e.content.boundingVolume)&&delete e.content.boundingVolume),e.parent=n,e.children=e.children||[],e.internal={hasContent:!1,hasRenderableContent:!1,hasUnrenderableContent:!1,loadingState:0,basePath:t,depth:-1,depthFromRenderedParent:-1,isVirtual:!1,virtualChildCount:0,renderer:this,...e.internal},e.content?.uri){let i=Mu(e.content.uri),r=!!(i&&/json$/.test(i));e.internal.hasContent=!0,e.internal.hasUnrenderableContent=r,e.internal.hasRenderableContent=!r}else e.internal.hasContent=!1,e.internal.hasUnrenderableContent=!1,e.internal.hasRenderableContent=!1;n?(e.internal.depth=n.internal.depth+1,e.internal.depthFromRenderedParent=n.internal.depthFromRenderedParent+ +!!e.internal.hasRenderableContent):(e.internal.depth=0,e.internal.depthFromRenderedParent=+!!e.internal.hasRenderableContent),e.traversal={distanceFromCamera:1/0,error:1/0,inFrustum:!1,wasInFrustum:!1,isLeaf:!1,used:!1,usedLastFrame:!1,visible:!1,wasSetVisible:!1,active:!1,wasSetActive:!1,allChildrenReady:!1,allChildrenLoaded:!1,kicked:!1,allUsedChildrenProcessed:!1,lastFrameVisited:-1},n===null?e.refine=e.refine||"REPLACE":e.refine=e.refine||n.refine,e.engineData={scene:null,metadata:null,boundingVolume:null},Object.defineProperty(e,"cached",{get(){return console.warn('TilesRenderer: "tile.cached" field has been renamed to "tile.engineData".'),this.engineData},enumerable:!1,configurable:!0}),this.invokeAllPlugins(i=>{i!==this&&i.preprocessNode&&i.preprocessNode(e,t,n)})}setTileActive(e,t){t?this.activeTiles.add(e):this.activeTiles.delete(e)}setTileVisible(e,t){t?this.visibleTiles.add(e):this.visibleTiles.delete(e),this.dispatchEvent({type:"tile-visibility-change",scene:e.engineData.scene,tile:e,visible:t})}calculateTileViewError(e,t){}removeUnusedPendingTiles(){let{lruCache:e,loadingTiles:t}=this,n=[];for(let i of t)!e.isUsed(i)&&i.internal.loadingState===1&&n.push(i);for(let i=0;i<n.length;i++)e.remove(n[i])}queueTileForDownload(e){e.internal.loadingState!==0||this.lruCache.isFull()||this.queuedTiles.push(e)}markTileUsed(e){this.usedSet.add(e),this.lruCache.markUsed(e)}fetchData(e,t){return fetch(e,t)}ensureChildrenArePreprocessed(e,t=this.stats.tilesProcessed<this.maxTilesProcessed){let n=e.children;if(n.length===0||n[n.length-1].traversal)return;let i=r=>{for(let o=0,a=r.length;o<a;o++){let s=r[o];s&&!s.traversal&&this.preprocessNode(s,e.internal.basePath,e)}};t?(this.processNodeQueue.remove(e),i(n)):this.processNodeQueue.has(e)||this.processNodeQueue.add(e,r=>{i(r.children),this._dispatchNeedsUpdateEvent()})}getBytesUsed(e){let t=0;return this.invokeAllPlugins(n=>{n.calculateBytesUsed&&(t+=n.calculateBytesUsed(e,e.engineData.scene)||0)}),t}recalculateBytesUsed(e=null){let{lruCache:t,processedTiles:n}=this;e===null?t.itemSet.forEach(i=>{n.has(i)&&t.setMemoryUsage(i,this.getBytesUsed(i))}):t.setMemoryUsage(e,this.getBytesUsed(e))}preprocessTileset(e,t,n=null){let[i,r]=e.asset.version.split(".").map(a=>parseInt(a));console.assert(i<=1,"TilesRenderer: asset.version is expected to be a 1.x or a compatible version."),i===1&&r>0&&console.warn("TilesRenderer: tiles versions at 1.1 or higher have limited support. Some new extensions and features may not be supported.");let o=t.replace(/\/[^/]*$/,"");o=new URL(o,window.location.href).toString(),this.preprocessNode(e.root,o,n)}loadRootTileset(){let e=this.rootURL;return this.invokeAllPlugins(t=>e=t.preprocessURL?t.preprocessURL(e,null):e),this.invokeOnePlugin(t=>t.fetchData&&t.fetchData(e,this.fetchOptions)).then(t=>{if(!(t instanceof Response))return t;if(t.ok)return t.json();throw Error(`TilesRenderer: Failed to load tileset "${e}" with status ${t.status} : ${t.statusText}`)}).then(t=>(this.preprocessTileset(t,e),t))}requestTileContents(e){if(e.internal.loadingState!==0)return;let t=!1,n=null,i=new URL(e.content.uri,e.internal.basePath+"/").toString();this.invokeAllPlugins(h=>i=h.preprocessURL?h.preprocessURL(i,e):i);let r=this.stats,o=this.lruCache,a=this.downloadQueue,s=this.parseQueue,c=this.loadingTiles,l=Mu(i),u=new AbortController,d=u.signal;if(o.add(e,h=>{u.abort(),t?h.children.length=0:this.invokeAllPlugins(g=>{g.disposeTile&&g.disposeTile(h)}),r.inCache--,this.cachedSinceLoadComplete.has(e)&&(this.cachedSinceLoadComplete.delete(e),r.inCacheSinceLoad--),h.internal.loadingState===1?r.queued--:h.internal.loadingState===2?r.downloading--:h.internal.loadingState===3?r.parsing--:h.internal.loadingState===4&&r.loaded--,h.internal.loadingState=0,s.remove(h),a.remove(h),c.delete(h)}))return this.isLoading||(this.isLoading=!0,this.dispatchEvent({type:"tiles-load-start"})),o.setMemoryUsage(e,this.getBytesUsed(e)),this.cachedSinceLoadComplete.add(e),r.inCacheSinceLoad++,r.inCache++,r.queued++,e.internal.loadingState=1,c.add(e),a.add(i,e,h=>{if(d.aborted)return Promise.resolve();e.internal.loadingState=2,r.downloading++,r.queued--;let g=this.invokeOnePlugin(f=>f.fetchData&&f.fetchData(i,{...this.fetchOptions,signal:d}));return this.dispatchEvent({type:"tile-download-start",tile:e,url:i,get uri(){return console.warn('tile-download-start event: "uri" has been renamed to "url".'),this.url}}),g}).then(h=>{if(!d.aborted){if(!(h instanceof Response))return h;if(h.ok)return l==="json"?h.json():h.arrayBuffer();throw Error(`Failed to load model with error code ${h.status}`)}}).then(h=>{if(!d.aborted)return r.downloading--,r.parsing++,e.internal.loadingState=3,s.add(e,g=>d.aborted?Promise.resolve():l==="json"&&h.root?(this.preprocessTileset(h,i,e),e.children.push(h.root),n=h,t=!0,Promise.resolve()):this.invokeOnePlugin(f=>f.parseTile&&f.parseTile(h,g,l,i,d)))}).then(()=>{if(d.aborted)return;r.parsing--,r.loaded++,e.internal.loadingState=4,c.delete(e),o.setLoaded(e,!0);let h=this.getBytesUsed(e);if(o.getMemoryUsage(e)===0&&h>0&&o.isFull()){o.remove(e);return}o.setMemoryUsage(e,h),this.dispatchEvent({type:"needs-update"}),t&&this.dispatchEvent({type:"load-tileset",tileset:n,url:i}),e.engineData.scene&&this.dispatchEvent({type:"load-model",scene:e.engineData.scene,tile:e,url:i})}).catch(h=>{d.aborted||(h.name==="AbortError"?o.remove(e):(s.remove(e),a.remove(e),e.internal.loadingState===1?r.queued--:e.internal.loadingState===2?r.downloading--:e.internal.loadingState===3?r.parsing--:e.internal.loadingState===4&&r.loaded--,r.failed++,console.error(`TilesRenderer : Failed to load tile at url "${e.content.uri}".`),console.error(h),e.internal.loadingState=-1,c.delete(e),o.setLoaded(e,!0),this.dispatchEvent({type:"load-error",tile:e,error:h,url:i})))})}};function eo(e){if(e===null||e.byteLength<4)return"";let t;if(t=e instanceof DataView?e:new DataView(e),String.fromCharCode(t.getUint8(0))==="{")return null;let n="";for(let i=0;i<4;i++)n+=String.fromCharCode(t.getUint8(i));return n}var yS=new TextDecoder;function Mf(e){return yS.decode(e)}function dc(e){return e.replace(/[\\/][^\\/]+$/,"")+"/"}var na=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=dc(e)),this.parse(t)))}resolveExternalURL(e){return new URL(e,this.workingPath).href}parse(e){throw Error("LoaderBase: Parse not implemented.")}};function Au(e,t,n,i,r,o){let a;switch(i){case"SCALAR":a=1;break;case"VEC2":a=2;break;case"VEC3":a=3;break;case"VEC4":a=4;break;default:throw Error(`FeatureTable : Feature type not provided for "${o}".`)}let s,c=n*a;switch(r){case"BYTE":s=new Int8Array(e,t,c);break;case"UNSIGNED_BYTE":s=new Uint8Array(e,t,c);break;case"SHORT":s=new Int16Array(e,t,c);break;case"UNSIGNED_SHORT":s=new Uint16Array(e,t,c);break;case"INT":s=new Int32Array(e,t,c);break;case"UNSIGNED_INT":s=new Uint32Array(e,t,c);break;case"FLOAT":s=new Float32Array(e,t,c);break;case"DOUBLE":s=new Float64Array(e,t,c);break;default:throw Error(`FeatureTable : Feature component type not provided for "${o}".`)}return s}var ys=class{constructor(e,t,n,i){this.buffer=e,this.binOffset=t+n,this.binLength=i;let r=null;if(n!==0){let o=new Uint8Array(e,t,n);r=JSON.parse(Mf(o))}else r={};this.header=r}getKeys(){return Object.keys(this.header).filter(e=>e!=="extensions")}getData(e,t,n=null,i=null){let r=this.header;if(!(e in r))return null;let o=r[e];if(!(o instanceof Object)||Array.isArray(o))return o;{let{buffer:a,binOffset:s,binLength:c}=this,l=o.byteOffset||0,u=o.type||i,d=o.componentType||n;if("type"in o&&i&&o.type!==i)throw Error("FeatureTable: Specified type does not match expected type.");let h=s+l,g=Au(a,h,t,u,d,e);if(h+g.byteLength>s+c)throw Error("FeatureTable: Feature data read outside binary body length.");return g}}getBuffer(e,t){let{buffer:n,binOffset:i}=this;return n.slice(i+e,i+e+t)}},vS=class{constructor(e){this.batchTable=e;let t=e.header.extensions["3DTILES_batch_table_hierarchy"];this.classes=t.classes;for(let i of this.classes){let r=i.instances;for(let o in r)i.instances[o]=this._parseProperty(r[o],i.length,o)}if(this.instancesLength=t.instancesLength,this.classIds=this._parseProperty(t.classIds,this.instancesLength,"classIds"),t.parentCounts?this.parentCounts=this._parseProperty(t.parentCounts,this.instancesLength,"parentCounts"):this.parentCounts=Array(this.instancesLength).fill(1),t.parentIds){let i=this.parentCounts.reduce((r,o)=>r+o,0);this.parentIds=this._parseProperty(t.parentIds,i,"parentIds")}else this.parentIds=null;this.instancesIds=[];let n={};for(let i of this.classIds)n[i]=n[i]??0,this.instancesIds.push(n[i]),n[i]++}_parseProperty(e,t,n){if(Array.isArray(e))return e;{let{buffer:i,binOffset:r}=this.batchTable,o=e.byteOffset,a=e.componentType||"UNSIGNED_SHORT";return Au(i,r+o,t,"SCALAR",a,n)}}getDataFromId(e,t={}){let n=this.parentCounts[e];if(this.parentIds&&n>0){let s=0;for(let c=0;c<e;c++)s+=this.parentCounts[c];for(let c=0;c<n;c++){let l=this.parentIds[s+c];l!==e&&this.getDataFromId(l,t)}}let i=this.classIds[e],r=this.classes[i].instances,o=this.classes[i].name,a=this.instancesIds[e];for(let s in r)t[o]=t[o]||{},t[o][s]=r[s][a];return t}},uc=class extends ys{constructor(e,t,n,i,r){super(e,n,i,r),this.count=t,this.extensions={};let o=this.header.extensions;o&&o["3DTILES_batch_table_hierarchy"]&&(this.extensions["3DTILES_batch_table_hierarchy"]=new 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 n of this.getKeys())t[n]=super.getData(n,this.count)[e];for(let n in this.extensions){let i=this.extensions[n];i.getDataFromId instanceof Function&&(t[n]=t[n]||{},i.getDataFromId(e,t[n]))}return t}getPropertyArray(e){return super.getData(e,this.count)}},Eu=class extends na{parse(e){let t=new DataView(e),n=eo(t);console.assert(n==="b3dm");let i=t.getUint32(4,!0);console.assert(i===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),c=t.getUint32(24,!0),l=new ys(e.slice(28,28+o+a),0,o,a),u=28+o+a,d=new uc(e.slice(u,u+s+c),l.getData("BATCH_LENGTH"),0,s,c),h=u+s+c;return{version:i,featureTable:l,batchTable:d,glbBytes:new Uint8Array(e,h,r-h)}}},Ru=class extends na{parse(e){let t=new DataView(e),n=eo(t);console.assert(n==="i3dm");let i=t.getUint32(4,!0);console.assert(i===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),c=t.getUint32(24,!0),l=t.getUint32(28,!0),u=new ys(e.slice(32,32+o+a),0,o,a),d=32+o+a,h=new uc(e.slice(d,d+s+c),u.getData("INSTANCES_LENGTH"),0,s,c),g=d+s+c,f=new Uint8Array(e,g,r-g),y=null,k=null,v=null;if(l)y=f,k=Promise.resolve();else{let p=this.resolveExternalURL(Mf(f));v=dc(p),k=fetch(p,this.fetchOptions).then(m=>{if(!m.ok)throw Error(`I3DMLoaderBase : Failed to load file "${p}" with status ${m.status} : ${m.statusText}`);return m.arrayBuffer()}).then(m=>{y=new Uint8Array(m)})}return k.then(()=>({version:i,featureTable:u,batchTable:h,glbBytes:y,gltfWorkingPath:v}))}},Lu=class extends na{parse(e){let t=new DataView(e),n=eo(t);console.assert(n==="pnts");let i=t.getUint32(4,!0);console.assert(i===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),c=t.getUint32(24,!0),l=new ys(e.slice(28,28+o+a),0,o,a),u=28+o+a,d=new uc(e.slice(u,u+s+c),l.getData("BATCH_LENGTH")||l.getData("POINTS_LENGTH"),0,s,c);return Promise.resolve({version:i,featureTable:l,batchTable:d})}},Bu=class extends na{parse(e){let t=new DataView(e),n=eo(t);console.assert(n==="cmpt",'CMPTLoader: The magic bytes equal "cmpt".');let i=t.getUint32(4,!0);console.assert(i===1,'CMPTLoader: The version listed in the header is "1".');let r=t.getUint32(8,!0);console.assert(r===e.byteLength,"CMPTLoader: The contents buffer length listed in the header matches the file.");let o=t.getUint32(12,!0),a=[],s=16;for(let c=0;c<o;c++){let l=new DataView(e,s,12),u=eo(l),d=l.getUint32(4,!0),h=l.getUint32(8,!0),g=new Uint8Array(e,s,h);a.push({type:u,buffer:g,version:d}),s+=h}return{version:i,tiles:a}}};import{Box3 as Vf,BufferAttribute as no,BufferGeometry as wS,Clock as DL,Color as CS,DefaultLoadingManager as wc,Euler as SS,EventDispatcher as pc,Frustum as MS,Group as Gu,InstancedMesh as TS,LoadingManager as PS,MathUtils as Ff,Matrix3 as kS,Matrix4 as ln,Mesh as NL,OrthographicCamera as IL,PerspectiveCamera as zL,Plane as _S,PlaneGeometry as jL,Points as AS,PointsMaterial as ES,Quaternion as Uf,Ray as Hu,Raycaster as VL,ShaderMaterial as FL,Sphere as Gf,Spherical as RS,TextureUtils as LS,Vector2 as Wu,Vector3 as Ne}from"three";import{GLTFLoader as $u}from"three/addons/loaders/GLTFLoader.js";import{estimateBytesUsed as BS}from"three/addons/utils/BufferGeometryUtils.js";var Xu=class extends Eu{constructor(e=wc){super(),this.manager=e,this.adjustmentTransform=new ln}parse(e){let t=super.parse(e),n=t.glbBytes.slice().buffer;return new Promise((i,r)=>{let o=this.manager,a=this.fetchOptions,s=o.getHandler("path.gltf")||new $u(o);a.credentials==="include"&&a.mode==="cors"&&s.setCrossOrigin("use-credentials"),"credentials"in a&&s.setWithCredentials(a.credentials==="include"),a.headers&&s.setRequestHeader(a.headers);let c=this.workingPath;!/[\\/]$/.test(c)&&c.length&&(c+="/");let l=this.adjustmentTransform;s.parse(n,c,u=>{let{batchTable:d,featureTable:h}=t,{scene:g}=u,f=h.getData("RTC_CENTER",1,"FLOAT","VEC3");f&&(g.position.x+=f[0],g.position.y+=f[1],g.position.z+=f[2]),u.scene.updateMatrix(),u.scene.matrix.multiply(l),u.scene.matrix.decompose(u.scene.position,u.scene.quaternion,u.scene.scale),u.batchTable=d,u.featureTable=h,g.batchTable=d,g.featureTable=h,i(u)},r)})}};function OS(e){let t=e>>11,n=e>>5&63,i=e&31;return[Math.round(t/31*255),Math.round(n/63*255),Math.round(i/31*255)]}var vs=new Wu;function DS(e,t,n=new Ne){vs.set(e,t).divideScalar(256).multiplyScalar(2).subScalar(1),n.set(vs.x,vs.y,1-Math.abs(vs.x)-Math.abs(vs.y));let i=Ff.clamp(-n.z,0,1);return n.x>=0?n.setX(n.x-i):n.setX(n.x+i),n.y>=0?n.setY(n.y-i):n.setY(n.y+i),n.normalize(),n}var Tf={RGB:"color",POSITION:"position"},qu=class extends Lu{constructor(e=wc){super(),this.manager=e}parse(e){return super.parse(e).then(async t=>{let{featureTable:n,batchTable:i}=t,r=new ES,o=n.header.extensions,a=new Ne,s;if(o&&o["3DTILES_draco_point_compression"]){let{byteOffset:u,byteLength:d,properties:h}=o["3DTILES_draco_point_compression"],g=this.manager.getHandler("draco.drc");if(g==null)throw Error("PNTSLoader: dracoLoader not available.");let f={};for(let v in h)if(v in Tf&&v in h){let p=Tf[v];f[p]=h[v]}let y={attributeIDs:f,attributeTypes:{position:"Float32Array",color:"Uint8Array"},useUniqueIDs:!0},k=n.getBuffer(u,d);s=await g.decodeGeometry(k,y),s.attributes.color&&(r.vertexColors=!0)}else{let u=n.getData("POINTS_LENGTH"),d=n.getData("POSITION",u,"FLOAT","VEC3"),h=n.getData("NORMAL",u,"FLOAT","VEC3"),g=n.getData("NORMAL",u,"UNSIGNED_BYTE","VEC2"),f=n.getData("RGB",u,"UNSIGNED_BYTE","VEC3"),y=n.getData("RGBA",u,"UNSIGNED_BYTE","VEC4"),k=n.getData("RGB565",u,"UNSIGNED_SHORT","SCALAR"),v=n.getData("CONSTANT_RGBA",u,"UNSIGNED_BYTE","VEC4"),p=n.getData("POSITION_QUANTIZED",u,"UNSIGNED_SHORT","VEC3"),m=n.getData("QUANTIZED_VOLUME_SCALE",u,"FLOAT","VEC3"),M=n.getData("QUANTIZED_VOLUME_OFFSET",u,"FLOAT","VEC3");if(s=new wS,p){let C=new Float32Array(u*3);for(let P=0;P<u;P++)for(let A=0;A<3;A++){let b=3*P+A;C[b]=p[b]/65535*m[A]}a.x=M[0],a.y=M[1],a.z=M[2],s.setAttribute("position",new no(C,3,!1))}else s.setAttribute("position",new no(d,3,!1));if(h!==null)s.setAttribute("normal",new no(h,3,!1));else if(g!==null){let C=new Float32Array(u*3),P=new Ne;for(let A=0;A<u;A++){let b=g[A*2],w=g[A*2+1],T=DS(b,w,P);C[A*3]=T.x,C[A*3+1]=T.y,C[A*3+2]=T.z}s.setAttribute("normal",new no(C,3,!1))}if(y!==null)s.setAttribute("color",new no(y,4,!0)),r.vertexColors=!0,r.transparent=!0,r.depthWrite=!1;else if(f!==null)s.setAttribute("color",new no(f,3,!0)),r.vertexColors=!0;else if(k!==null){let C=new Uint8Array(u*3);for(let P=0;P<u;P++){let A=OS(k[P]);for(let b=0;b<3;b++){let w=3*P+b;C[w]=A[b]}}s.setAttribute("color",new no(C,3,!0)),r.vertexColors=!0}else if(v!==null){r.color=new CS(v[0],v[1],v[2]);let C=v[3]/255;C<1&&(r.opacity=C,r.transparent=!0,r.depthWrite=!1)}}let c=new AS(s,r);c.position.copy(a),t.scene=c,t.scene.featureTable=n,t.scene.batchTable=i;let l=n.getData("RTC_CENTER",1,"FLOAT","VEC3");return l&&(t.scene.position.x+=l[0],t.scene.position.y+=l[1],t.scene.position.z+=l[2]),t})}};function NS(e){let{x:t,y:n,z:i}=e;e.x=i,e.y=t,e.z=n}function IS(e){return-e+Math.PI/2}var Pf=new RS,mi=new Ne,kn=new Ne,Ou=new Ne,rr=new ln,Dr=new ln,Du=new Gf,Dn=new SS,kf=new Ne,_f=new Ne,Af=new Ne,ws=new Ne,hc=new Hu,zS=1e-12,jS=.1;var Yu=class{constructor(e=1,t=1,n=1){this.name="",this.radius=new Ne(e,t,n)}intersectRay(e,t){return rr.makeScale(...this.radius).invert(),Du.center.set(0,0,0),Du.radius=1,hc.copy(e).applyMatrix4(rr),hc.intersectSphere(Du,t)?(rr.makeScale(...this.radius),t.applyMatrix4(rr),t):null}getEastNorthUpFrame(e,t,n,i){return n.isMatrix4&&(i=n,n=0,console.warn('Ellipsoid: The signature for "getEastNorthUpFrame" has changed.')),this.getEastNorthUpAxes(e,t,kf,_f,Af),this.getCartographicToPosition(e,t,n,ws),i.makeBasis(kf,_f,Af).setPosition(ws)}getOrientedEastNorthUpFrame(e,t,n,i,r,o,a){return this.getObjectFrame(e,t,n,i,r,o,a,0)}getObjectFrame(e,t,n,i,r,o,a,s=2){return this.getEastNorthUpFrame(e,t,n,rr),Dn.set(r,o,-i,"ZXY"),a.makeRotationFromEuler(Dn).premultiply(rr),s===1?(Dn.set(Math.PI/2,0,0,"XYZ"),Dr.makeRotationFromEuler(Dn),a.multiply(Dr)):s===2&&(Dn.set(-Math.PI/2,0,Math.PI,"XYZ"),Dr.makeRotationFromEuler(Dn),a.multiply(Dr)),a}getCartographicFromObjectFrame(e,t,n=2){return n===1?(Dn.set(-Math.PI/2,0,0,"XYZ"),Dr.makeRotationFromEuler(Dn).premultiply(e)):n===2?(Dn.set(-Math.PI/2,0,Math.PI,"XYZ"),Dr.makeRotationFromEuler(Dn).premultiply(e)):Dr.copy(e),ws.setFromMatrixPosition(Dr),this.getPositionToCartographic(ws,t),this.getEastNorthUpFrame(t.lat,t.lon,0,rr).invert(),Dr.premultiply(rr),Dn.setFromRotationMatrix(Dr,"ZXY"),t.azimuth=-Dn.z,t.elevation=Dn.x,t.roll=Dn.y,t}getEastNorthUpAxes(e,t,n,i,r,o=ws){this.getCartographicToPosition(e,t,0,o),this.getCartographicToNormal(e,t,r),n.set(-o.y,o.x,0).normalize(),i.crossVectors(r,n).normalize()}getCartographicToPosition(e,t,n,i){this.getCartographicToNormal(e,t,mi);let r=this.radius;kn.copy(mi),kn.x*=r.x**2,kn.y*=r.y**2,kn.z*=r.z**2;let o=Math.sqrt(mi.dot(kn));return kn.divideScalar(o),i.copy(kn).addScaledVector(mi,n)}getPositionToCartographic(e,t){this.getPositionToSurfacePoint(e,kn),this.getPositionToNormal(kn,mi);let n=Ou.subVectors(e,kn);return t.lon=Math.atan2(mi.y,mi.x),t.lat=Math.asin(mi.z),t.height=Math.sign(n.dot(e))*n.length(),t}getCartographicToNormal(e,t,n){return Pf.set(1,IS(e),t),n.setFromSpherical(Pf).normalize(),NS(n),n}getPositionToNormal(e,t){let n=this.radius;return t.copy(e),t.x/=n.x**2,t.y/=n.y**2,t.z/=n.z**2,t.normalize(),t}getPositionToSurfacePoint(e,t){let n=this.radius,i=1/n.x**2,r=1/n.y**2,o=1/n.z**2,a=e.x*e.x*i,s=e.y*e.y*r,c=e.z*e.z*o,l=a+s+c,u=Math.sqrt(1/l),d=kn.copy(e).multiplyScalar(u);if(l<jS)return isFinite(u)?t.copy(d):null;let h=Ou.set(d.x*i*2,d.y*r*2,d.z*o*2),g=(1-u)*e.length()/(.5*h.length()),f=0,y,k,v,p,m,M,C,P,A,b,w;do{g-=f,v=1/(1+g*i),p=1/(1+g*r),m=1/(1+g*o),M=v*v,C=p*p,P=m*m,A=M*v,b=C*p,w=P*m,y=a*M+s*C+c*P-1,k=a*A*i+s*b*r+c*w*o;let T=-2*k;f=y/T}while(Math.abs(y)>zS);return t.set(e.x*v,e.y*p,e.z*m)}calculateHorizonDistance(e,t){let n=this.calculateEffectiveRadius(e);return Math.sqrt(2*n*t+t**2)}calculateEffectiveRadius(e){let t=this.radius.x,n=1-this.radius.z**2/t**2,i=e*Ff.DEG2RAD,r=Math.sin(i)**2;return t/Math.sqrt(1-n*r)}getPositionElevation(e){this.getPositionToSurfacePoint(e,kn);let t=Ou.subVectors(e,kn);return Math.sign(t.dot(e))*t.length()}closestPointToRayEstimate(e,t){return this.intersectRay(e,t)?t:(rr.makeScale(...this.radius).invert(),hc.copy(e).applyMatrix4(rr),kn.set(0,0,0),hc.closestPointToPoint(kn,t).normalize(),rr.makeScale(...this.radius),t.applyMatrix4(rr))}copy(e){return this.radius.copy(e.radius),this}clone(){return new this.constructor().copy(this)}},Ps=new Yu(to,to,Pu);Ps.name="WGS84 Earth";var mc=new Ne,ra=new Ne,ia=new Ne,Nu=new Ne,gc=new Uf,fc=new Ne,oa=new ln,Ef=new ln,Rf=new Ne,Lf=new ln,Iu=new Uf,zu={};function Bf(e,t,n,i){if(e=e/n*2-1,t=t/n*2-1,i.x=e,i.y=t,i.z=1-Math.abs(e)-Math.abs(t),i.z<0){let r=i.x;i.x=(1-Math.abs(i.y))*(r>=0?1:-1),i.y=(1-Math.abs(r))*(i.y>=0?1:-1)}return i.normalize(),i}var Ku=class extends Ru{constructor(e=wc){super(),this.manager=e,this.adjustmentTransform=new ln,this.ellipsoid=Ps.clone()}resolveExternalURL(e){return this.manager.resolveURL(super.resolveExternalURL(e))}parse(e){return super.parse(e).then(t=>{let{featureTable:n,batchTable:i}=t,r=t.glbBytes.slice().buffer;return new Promise((o,a)=>{let s=this.fetchOptions,c=this.manager,l=c.getHandler("path.gltf")||new $u(c);s.credentials==="include"&&s.mode==="cors"&&l.setCrossOrigin("use-credentials"),"credentials"in s&&l.setWithCredentials(s.credentials==="include"),s.headers&&l.setRequestHeader(s.headers);let u=t.gltfWorkingPath??this.workingPath;/[\\/]$/.test(u)||(u+="/");let d=this.adjustmentTransform;l.parse(r,u,h=>{let g=n.getData("INSTANCES_LENGTH"),f=n.getData("POSITION",g,"FLOAT","VEC3"),y=n.getData("POSITION_QUANTIZED",g,"UNSIGNED_SHORT","VEC3"),k=n.getData("QUANTIZED_VOLUME_OFFSET",1,"FLOAT","VEC3"),v=n.getData("QUANTIZED_VOLUME_SCALE",1,"FLOAT","VEC3"),p=n.getData("NORMAL_UP",g,"FLOAT","VEC3"),m=n.getData("NORMAL_RIGHT",g,"FLOAT","VEC3"),M=n.getData("NORMAL_UP_OCT32P",g,"UNSIGNED_SHORT","VEC2"),C=n.getData("NORMAL_RIGHT_OCT32P",g,"UNSIGNED_SHORT","VEC2"),P=n.getData("SCALE_NON_UNIFORM",g,"FLOAT","VEC3"),A=n.getData("SCALE",g,"FLOAT","SCALAR"),b=n.getData("RTC_CENTER",1,"FLOAT","VEC3"),w=n.getData("EAST_NORTH_UP");if(!f&&y){f=new Float32Array(g*3);for(let R=0;R<g;R++)f[R*3+0]=k[0]+y[R*3+0]/65535*v[0],f[R*3+1]=k[1]+y[R*3+1]/65535*v[1],f[R*3+2]=k[2]+y[R*3+2]/65535*v[2]}let T=new Ne;for(let R=0;R<g;R++)T.x+=f[R*3+0]/g,T.y+=f[R*3+1]/g,T.z+=f[R*3+2]/g;let S=[],N=[];h.scene.updateMatrixWorld(),h.scene.traverse(R=>{if(R.isMesh){N.push(R);let{geometry:z,material:E}=R,j=new TS(z,E,g);j.position.copy(T),b&&(j.position.x+=b[0],j.position.y+=b[1],j.position.z+=b[2]),S.push(j)}});for(let R=0;R<g;R++){Nu.set(f[R*3+0]-T.x,f[R*3+1]-T.y,f[R*3+2]-T.z),gc.identity(),p&&m?(ra.set(p[R*3+0],p[R*3+1],p[R*3+2]),ia.set(m[R*3+0],m[R*3+1],m[R*3+2]),mc.crossVectors(ia,ra).normalize(),oa.makeBasis(ia,ra,mc),gc.setFromRotationMatrix(oa)):M&&C&&(Bf(M[R*2+0],M[R*2+1],65535,ra),Bf(C[R*2+0],C[R*2+1],65535,ia),mc.crossVectors(ia,ra).normalize(),oa.makeBasis(ia,ra,mc),gc.setFromRotationMatrix(oa)),fc.set(1,1,1),P&&fc.set(P[R*3+0],P[R*3+1],P[R*3+2]),A&&fc.multiplyScalar(A[R]);for(let z=0,E=S.length;z<E;z++){let j=S[z];Iu.copy(gc),w&&(j.updateMatrixWorld(),Rf.copy(Nu).applyMatrix4(j.matrixWorld),this.ellipsoid.getPositionToCartographic(Rf,zu),this.ellipsoid.getEastNorthUpFrame(zu.lat,zu.lon,Lf),Iu.setFromRotationMatrix(Lf)),oa.compose(Nu,Iu,fc).multiply(d);let I=N[z];Ef.multiplyMatrices(oa,I.matrixWorld),j.setMatrixAt(R,Ef)}}h.scene.clear(),h.scene.add(...S),h.batchTable=i,h.featureTable=n,h.scene.batchTable=i,h.scene.featureTable=n,o(h)},a)})})}},Hf=class extends Bu{constructor(e=wc){super(),this.manager=e,this.adjustmentTransform=new ln,this.ellipsoid=Ps.clone()}parse(e){let t=super.parse(e),{manager:n,ellipsoid:i,adjustmentTransform:r}=this,o=[];for(let a in t.tiles){let{type:s,buffer:c}=t.tiles[a];switch(s){case"b3dm":{let l=c.slice(),u=new Xu(n);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions,u.adjustmentTransform.copy(r);let d=u.parse(l.buffer);o.push(d);break}case"pnts":{let l=c.slice(),u=new qu(n);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions;let d=u.parse(l.buffer);o.push(d);break}case"i3dm":{let l=c.slice(),u=new Ku(n);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions,u.ellipsoid.copy(i),u.adjustmentTransform.copy(r);let d=u.parse(l.buffer);o.push(d);break}}}return Promise.all(o).then(a=>{let s=new Gu;return a.forEach(c=>{s.add(c.scene)}),{tiles:a,scene:s}})}},Cs=new ln,VS=class extends Gu{constructor(e){super(),this.isTilesGroup=!0,this.name="TilesRenderer.TilesGroup",this.tilesRenderer=e,this.matrixWorldInverse=new ln}raycast(e,t){return this.tilesRenderer.raycast(e,t),!1}updateMatrixWorld(e){if(this.matrixAutoUpdate&&this.updateMatrix(),this.matrixWorldNeedsUpdate||e){this.parent===null?Cs.copy(this.matrix):Cs.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1;let t=Cs.elements,n=this.matrixWorld.elements,i=!1;for(let r=0;r<16;r++){let o=t[r],a=n[r];if(Math.abs(o-a)>2**-52){i=!0;break}}if(i){this.matrixWorld.copy(Cs),this.matrixWorldInverse.copy(Cs).invert();let r=this.children;for(let c=0,l=r.length;c<l;c++)r[c].updateMatrixWorld();let{tilesRenderer:o}=this,{activeTiles:a,visibleTiles:s}=o;a.forEach(c=>{s.has(c)||c.engineData.scene.updateMatrixWorld(!0)})}}}updateWorldMatrix(e,t){this.parent&&e&&this.parent.updateWorldMatrix(e,!1),this.updateMatrixWorld(!0)}},FS=new Hu;function US(e,t,n,i){let{scene:r}=e.engineData;n.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(e,r,t,i))||t.intersectObject(r,!0,i)}function GS(e){return"traversal"in e}function Wf(e,t,n,i,r=null){if(!GS(t))return;let{group:o,activeTiles:a}=e,{boundingVolume:s}=t.engineData;if(r===null&&(r=FS,r.copy(n.ray).applyMatrix4(o.matrixWorldInverse)),!t.traversal.used||!s.intersectsRay(r))return;a.has(t)&&US(t,n,e,i);let c=t.children;for(let l=0,u=c.length;l<u;l++)Wf(e,c[l],n,i,r)}var bc=new Ne,xc=new Ne,Nn=new Ne,yc=new Hu,Fu=class{constructor(e=new Vf,t=new ln){this.box=e.clone(),this.transform=t.clone(),this.inverseTransform=new ln,this.points=Array(8).fill().map(()=>new Ne),this.planes=[,,,,,,].fill().map(()=>new _S)}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,Nn).distanceTo(e)}containsPoint(e){return Nn.copy(e).applyMatrix4(this.inverseTransform),this.box.containsPoint(Nn)}intersectsRay(e){return yc.copy(e).applyMatrix4(this.inverseTransform),yc.intersectsBox(this.box)}intersectRay(e,t){return yc.copy(e).applyMatrix4(this.inverseTransform),yc.intersectBox(this.box,t)?(t.applyMatrix4(this.transform),t):null}update(){let{points:e,inverseTransform:t,transform:n,box:i}=this;t.copy(n).invert();let{min:r,max:o}=i,a=0;for(let s=-1;s<=1;s+=2)for(let c=-1;c<=1;c+=2)for(let l=-1;l<=1;l+=2)e[a].set(s<0?r.x:o.x,c<0?r.y:o.y,l<0?r.z:o.z).applyMatrix4(n),a++;this.updatePlanes()}updatePlanes(){bc.copy(this.box.min).applyMatrix4(this.transform),xc.copy(this.box.max).applyMatrix4(this.transform),Nn.set(0,0,1).transformDirection(this.transform),this.planes[0].setFromNormalAndCoplanarPoint(Nn,bc),this.planes[1].setFromNormalAndCoplanarPoint(Nn,xc).negate(),Nn.set(0,1,0).transformDirection(this.transform),this.planes[2].setFromNormalAndCoplanarPoint(Nn,bc),this.planes[3].setFromNormalAndCoplanarPoint(Nn,xc).negate(),Nn.set(1,0,0).transformDirection(this.transform),this.planes[4].setFromNormalAndCoplanarPoint(Nn,bc),this.planes[5].setFromNormalAndCoplanarPoint(Nn,xc).negate()}intersectsSphere(e){return this.clampPoint(e.center,Nn),Nn.distanceToSquared(e.center)<=e.radius*e.radius}intersectsFrustum(e){return this._intersectsPlaneShape(e.planes,e.points)}intersectsOBB(e){return this._intersectsPlaneShape(e.planes,e.points)}_intersectsPlaneShape(e,t){let n=this.points,i=this.planes;for(let r=0;r<6;r++){let o=e[r],a=-1/0;for(let s=0;s<8;s++){let c=n[s],l=o.distanceToPoint(c);a=a<l?l:a}if(a<0)return!1}for(let r=0;r<6;r++){let o=i[r],a=-1/0;for(let s=0;s<8;s++){let c=t[s],l=o.distanceToPoint(c);a=a<l?l:a}if(a<0)return!1}return!0}},Ts=Math.PI,ju=Ts/2,Ss=new Ne,ro=new Ne,yr=new Ne,Ce=new Ne,_n=new ln,HS=new Vf,Of=new ln;function gi(e,t){t.radius=Math.max(t.radius,e.distanceToSquared(t.center))}function Df(e){return e.x!==e.y}var $f=class extends Yu{constructor(e=1,t=1,n=1,i=-ju,r=ju,o=0,a=2*Ts,s=0,c=0){super(e,t,n),this.latStart=i,this.latEnd=r,this.lonStart=o,this.lonEnd=a,this.heightStart=s,this.heightEnd=c}getBoundingBox(e,t){Df(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported.");let{latStart:n,latEnd:i,lonStart:r,lonEnd:o,heightStart:a,heightEnd:s}=this,c=(n+i)*.5,l=(r+o)*.5,u=n>0,d=i<0,h;h=u?n:d?i:0;let{min:g,max:f}=e;g.setScalar(1/0),f.setScalar(-1/0),o-r<=Ts?(this.getCartographicToNormal(c,l,yr),ro.set(0,0,1),Ss.crossVectors(ro,yr).normalize(),ro.crossVectors(yr,Ss).normalize(),t.makeBasis(Ss,ro,yr),_n.copy(t).invert(),this.getCartographicToPosition(h,r,s,Ce).applyMatrix4(_n),f.x=Math.abs(Ce.x),g.x=-f.x,this.getCartographicToPosition(i,r,s,Ce).applyMatrix4(_n),f.y=Ce.y,this.getCartographicToPosition(i,l,s,Ce).applyMatrix4(_n),f.y=Math.max(Ce.y,f.y),this.getCartographicToPosition(n,r,s,Ce).applyMatrix4(_n),g.y=Ce.y,this.getCartographicToPosition(n,l,s,Ce).applyMatrix4(_n),g.y=Math.min(Ce.y,g.y),this.getCartographicToPosition(c,l,s,Ce).applyMatrix4(_n),f.z=Ce.z,this.getCartographicToPosition(n,r,a,Ce).applyMatrix4(_n),g.z=Ce.z,this.getCartographicToPosition(i,r,a,Ce).applyMatrix4(_n),g.z=Math.min(Ce.z,g.z)):(this.getCartographicToPosition(h,l,s,yr),yr.z=0,yr.length()<1e-10?yr.set(1,0,0):yr.normalize(),ro.set(0,0,1),Ss.crossVectors(yr,ro).normalize(),t.makeBasis(Ss,ro,yr),_n.copy(t).invert(),this.getCartographicToPosition(h,l+ju,s,Ce).applyMatrix4(_n),f.x=Math.abs(Ce.x),g.x=-f.x,this.getCartographicToPosition(i,0,d?a:s,Ce).applyMatrix4(_n),f.y=Ce.y,this.getCartographicToPosition(n,0,u?a:s,Ce).applyMatrix4(_n),g.y=Ce.y,this.getCartographicToPosition(h,l,s,Ce).applyMatrix4(_n),f.z=Ce.z,this.getCartographicToPosition(h,o,s,Ce).applyMatrix4(_n),g.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){Df(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported."),this.getBoundingBox(HS,Of),e.center.setFromMatrixPosition(Of),e.radius=0;let{latStart:t,latEnd:n,lonStart:i,lonEnd:r,heightStart:o,heightEnd:a}=this,s=(t+n)*.5,c=(i+r)*.5,l=t>0,u=n<0,d;d=l?t:u?n:0,this.getCartographicToPosition(d,i,a,Ce),gi(Ce,e),this.getCartographicToPosition(n,i,a,Ce),gi(Ce,e),this.getCartographicToPosition(n,c,a,Ce),gi(Ce,e),this.getCartographicToPosition(t,i,a,Ce),gi(Ce,e),this.getCartographicToPosition(t,c,a,Ce),gi(Ce,e),this.getCartographicToPosition(s,c,a,Ce),gi(Ce,e),this.getCartographicToPosition(t,i,o,Ce),gi(Ce,e),r-i>Ts&&(this.getCartographicToPosition(d,c+Ts,a,Ce),gi(Ce,e)),e.radius=Math.sqrt(e.radius)*1.0000000000001}},Zr=new Ne,ei=new Ne,ti=new Ne,Nf=new Ne,If=new Ne,WS=class{constructor(){this.sphere=null,this.obb=null,this.region=null,this.regionObb=null}intersectsRay(e){let t=this.sphere,n=this.obb||this.regionObb;return!(t&&!e.intersectsSphere(t)||n&&!n.intersectsRay(e))}intersectRay(e,t=null){let n=this.sphere,i=this.obb||this.regionObb,r=-1/0,o=-1/0;n&&e.intersectSphere(n,Nf)&&(r=n.containsPoint(e.origin)?0:e.origin.distanceToSquared(Nf)),i&&i.intersectRay(e,If)&&(o=i.containsPoint(e.origin)?0:e.origin.distanceToSquared(If));let a=Math.max(r,o);return a===-1/0?null:(e.at(Math.sqrt(a),t),t)}distanceToPoint(e){let t=this.sphere,n=this.obb||this.regionObb,i=-1/0,r=-1/0;return t&&(i=Math.max(t.distanceToPoint(e),0)),n&&(r=n.distanceToPoint(e)),i>r?i:r}intersectsFrustum(e){let t=this.obb||this.regionObb,n=this.sphere;return n&&!e.intersectsSphere(n)||t&&!t.intersectsFrustum(e)?!1:!!(n||t)}intersectsSphere(e){let t=this.obb||this.regionObb,n=this.sphere;return n&&!n.intersectsSphere(e)||t&&!t.intersectsSphere(e)?!1:!!(n||t)}intersectsOBB(e){let t=this.obb||this.regionObb,n=this.sphere;return n&&!e.intersectsSphere(n)||t&&!t.intersectsOBB(e)?!1:!!(n||t)}getOBB(e,t){let n=this.obb||this.regionObb;n?(e.copy(n.box),t.copy(n.transform)):(this.getAABB(e),t.identity())}getAABB(e){if(this.sphere)this.sphere.getBoundingBox(e);else{let t=this.obb||this.regionObb;e.copy(t.box).applyMatrix4(t.transform)}}getSphere(e){if(this.sphere)e.copy(this.sphere);else if(this.region)this.region.getBoundingSphere(e);else{let t=this.obb||this.regionObb;t.box.getBoundingSphere(e),e.applyMatrix4(t.transform)}}setObbData(e,t){let n=new Fu;Zr.set(e[3],e[4],e[5]),ei.set(e[6],e[7],e[8]),ti.set(e[9],e[10],e[11]);let i=Zr.length(),r=ei.length(),o=ti.length();Zr.normalize(),ei.normalize(),ti.normalize(),i===0&&Zr.crossVectors(ei,ti),r===0&&ei.crossVectors(Zr,ti),o===0&&ti.crossVectors(Zr,ei),n.transform.set(Zr.x,ei.x,ti.x,e[0],Zr.y,ei.y,ti.y,e[1],Zr.z,ei.z,ti.z,e[2],0,0,0,1).premultiply(t),n.box.min.set(-i,-r,-o),n.box.max.set(i,r,o),n.update(),this.obb=n}setSphereData(e,t,n,i,r){let o=new Gf;o.center.set(e,t,n),o.radius=i,o.applyMatrix4(r),this.sphere=o}setRegionData(e,t,n,i,r,o,a){let s=new $f(...e.radius,n,r,t,i,o,a),c=new Fu;s.getBoundingBox(c.box,c.transform),c.update(),this.region=s,this.regionObb=c}},$S=new kS;function XS(e,t,n,i){let r=$S.set(e.normal.x,e.normal.y,e.normal.z,t.normal.x,t.normal.y,t.normal.z,n.normal.x,n.normal.y,n.normal.z);return i.set(-e.constant,-t.constant,-n.constant),i.applyMatrix3(r.invert()),i}var qS=class extends MS{constructor(){super(),this.points=Array(8).fill().map(()=>new Ne)}setFromProjectionMatrix(...e){return super.setFromProjectionMatrix(...e),this.calculateFrustumPoints(),this}calculateFrustumPoints(){let{planes:e,points:t}=this;[[e[0],e[3],e[4]],[e[1],e[3],e[4]],[e[0],e[2],e[4]],[e[1],e[2],e[4]],[e[0],e[3],e[5]],[e[1],e[3],e[5]],[e[0],e[2],e[5]],[e[1],e[2],e[5]]].forEach((n,i)=>{XS(n[0],n[1],n[2],t[i])})}};var Uu=0;function zf(e,t,n,i){try{return LS.getByteLength(e,t,n,i)}catch{return Uu}}function YS(e){if(!e)return 0;if(e.isExternalTexture)return e.userData?.byteLength??Uu;let{format:t,type:n,image:i,mipmaps:r}=e;if(e.isCompressedTexture&&Array.isArray(r)&&r.length>0){let a=0;for(let s of r)s?.data?.byteLength?a+=s.data.byteLength:a+=zf(s.width,s.height,t,n);return a}if(!i)return Uu;let o=zf(i.width,i.height,t,n);return o*=e.generateMipmaps?4/3:1,o}function KS(e){let t=new Set,n=0;return e.traverse(i=>{if(i.geometry&&!t.has(i.geometry)&&(n+=BS(i.geometry),t.add(i.geometry)),i.material){let r=i.material;for(let o in r){let a=r[o];a&&a.isTexture&&!t.has(a)&&(n+=YS(a),t.add(a))}}}),n}var Xf=Symbol("INITIAL_FRUSTUM_CULLED"),vc=new ln,Ms=new Ne,Vu=new Wu,JS=new Ne(1,0,0),QS=new Ne(0,1,0),ZS=()=>null;function jf(e,t){e.traverse(n=>{n.frustumCulled=n[Xf]&&t})}var Ju=class extends _u{get autoDisableRendererCulling(){return this._autoDisableRendererCulling}set autoDisableRendererCulling(e){this._autoDisableRendererCulling!==e&&(super._autoDisableRendererCulling=e,this.forEachLoadedModel(t=>{jf(t,!e)}))}constructor(...e){super(...e),this.accelerateRaycast=!0,this.group=new VS(this),this.ellipsoid=Ps.clone(),this.cameras=[],this.cameraMap=new Map,this.cameraInfo=[],this._upRotationMatrix=new ln,this._bytesUsed=new WeakMap,this._autoDisableRendererCulling=!0,this.manager=new PS,this._listeners={}}addEventListener(e,t){pc.prototype.addEventListener.call(this,e,t)}hasEventListener(e,t){return pc.prototype.hasEventListener.call(this,e,t)}removeEventListener(e,t){pc.prototype.removeEventListener.call(this,e,t)}dispatchEvent(e){pc.prototype.dispatchEvent.call(this,e)}getBoundingBox(e){if(!this.root)return!1;let t=this.root.engineData.boundingVolume;return t?(t.getAABB(e),!0):!1}getOrientedBoundingBox(e,t){if(!this.root)return!1;let n=this.root.engineData.boundingVolume;return n?(n.getOBB(e,t),!0):!1}getBoundingSphere(e){if(!this.root)return!1;let t=this.root.engineData.boundingVolume;return t?(t.getSphere(e),!0):!1}forEachLoadedModel(e){this.traverse(t=>{let n=t.engineData&&t.engineData.scene;n&&e(n,t)},null,!1)}raycast(e,t){if(this.root)if(this.accelerateRaycast)Wf(this,this.root,e,t);else{let n=e.firstHitOnly?[]:t;for(let i of this.activeTiles){let{scene:r}=i.engineData;this.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(i,r,e,n))||e.intersectObject(r,!0,n)}e.firstHitOnly&&n.length>0&&(n.sort((i,r)=>i.distance-r.distance),t.push(n[0]))}}hasCamera(e){return this.cameraMap.has(e)}setCamera(e){let t=this.cameras,n=this.cameraMap;return n.has(e)?!1:(n.set(e,new Wu),t.push(e),this.dispatchEvent({type:"add-camera",camera:e}),!0)}setResolution(e,t,n){let i=this.cameraMap;if(!i.has(e))return!1;let r=t.isVector2?t.x:t,o=t.isVector2?t.y:n,a=i.get(e);return(a.width!==r||a.height!==o)&&(a.set(r,o),this.dispatchEvent({type:"camera-resolution-change"})),!0}getResolution(e,t){let n=this.cameraMap.get(e);return n?t.copy(n):null}setResolutionFromRenderer(e,t){return t.getSize(Vu),this.setResolution(e,Vu.x,Vu.y)}deleteCamera(e){let t=this.cameras,n=this.cameraMap;if(n.has(e)){let i=t.indexOf(e);return t.splice(i,1),n.delete(e),this.dispatchEvent({type:"delete-camera",camera:e}),!0}return!1}loadRootTileset(...e){return super.loadRootTileset(...e).then(t=>{let{asset:n,extensions:i={}}=t;switch((n&&n.gltfUpAxis||"y").toLowerCase()){case"x":this._upRotationMatrix.makeRotationAxis(QS,-Math.PI/2);break;case"y":this._upRotationMatrix.makeRotationAxis(JS,Math.PI/2);break}if("3DTILES_ellipsoid"in i){let r=i["3DTILES_ellipsoid"],{ellipsoid:o}=this;o.name=r.body,r.radii?o.radius.set(...r.radii):o.radius.set(1,1,1)}return t})}prepareForTraversal(){let e=this.group,t=this.cameras,n=this.cameraMap,i=this.cameraInfo;for(;i.length>t.length;)i.pop();for(;i.length<t.length;)i.push({frustum:new qS,isOrthographic:!1,sseDenominator:-1,position:new Ne,invScale:-1,pixelSize:0});Ms.setFromMatrixScale(e.matrixWorldInverse),Math.abs(Math.max(Ms.x-Ms.y,Ms.x-Ms.z))>1e-6&&console.warn("ThreeTilesRenderer : Non uniform scale used for tile which may cause issues when calculating screen space error.");for(let r=0,o=i.length;r<o;r++){let a=t[r],s=i[r],c=s.frustum,l=s.position,u=n.get(a);(u.width===0||u.height===0)&&console.warn("TilesRenderer: resolution for camera error calculation is not set.");let d=a.projectionMatrix.elements;if(s.isOrthographic=d[15]===1,s.isOrthographic){let h=2/d[0],g=2/d[5];s.pixelSize=Math.max(g/u.height,h/u.width)}else s.sseDenominator=2/d[5]/u.height;vc.copy(e.matrixWorld),vc.premultiply(a.matrixWorldInverse),vc.premultiply(a.projectionMatrix),c.setFromProjectionMatrix(vc,a.coordinateSystem,a.reversedDepth),l.set(0,0,0),l.applyMatrix4(a.matrixWorld),l.applyMatrix4(e.matrixWorldInverse)}}update(){if(super.update(),this.cameras.length===0&&this.root){let e=!1;this.invokeAllPlugins(t=>e||(e=!!(t!==this&&t.calculateTileViewError))),e===!1&&console.warn("TilesRenderer: no cameras defined. Cannot update 3d tiles.")}}preprocessNode(e,t,n=null){super.preprocessNode(e,t,n);let i=new ln;if(e.transform){let a=e.transform;for(let s=0;s<16;s++)i.elements[s]=a[s]}n&&i.premultiply(n.engineData.transform);let r=new ln().copy(i).invert(),o=new WS;"sphere"in e.boundingVolume&&o.setSphereData(...e.boundingVolume.sphere,i),"box"in e.boundingVolume&&o.setObbData(e.boundingVolume.box,i),"region"in e.boundingVolume&&o.setRegionData(this.ellipsoid,...e.boundingVolume.region),e.engineData.transform=i,e.engineData.transformInverse=r,e.engineData.boundingVolume=o,e.engineData.geometry=null,e.engineData.materials=null,e.engineData.textures=null,e.toJSON=ZS}async parseTile(e,t,n,i,r){let o=t.engineData,a=dc(i),s=this.fetchOptions,c=this.manager,l=null,u=o.transform,d=this._upRotationMatrix,h=(eo(e)||n).toLowerCase();switch(h){case"b3dm":{let m=new Xu(c);m.workingPath=a,m.fetchOptions=s,m.adjustmentTransform.copy(d),l=m.parse(e);break}case"pnts":{let m=new qu(c);m.workingPath=a,m.fetchOptions=s,l=m.parse(e);break}case"i3dm":{let m=new Ku(c);m.workingPath=a,m.fetchOptions=s,m.adjustmentTransform.copy(d),m.ellipsoid.copy(this.ellipsoid),l=m.parse(e);break}case"cmpt":{let m=new Hf(c);m.workingPath=a,m.fetchOptions=s,m.adjustmentTransform.copy(d),m.ellipsoid.copy(this.ellipsoid),l=m.parse(e).then(M=>M.scene);break}case"gltf":case"glb":{let m=c.getHandler("path.gltf")||c.getHandler("path.glb")||new $u(c);m.setWithCredentials(s.credentials==="include"),m.setRequestHeader(s.headers||{}),s.credentials==="include"&&s.mode==="cors"&&m.setCrossOrigin("use-credentials");let M=m.resourcePath||m.path||a;!/[\\/]$/.test(M)&&M.length&&(M+="/"),l=m.parseAsync(e,M).then(C=>{C.scene=C.scene||new Gu;let{scene:P}=C;return P.updateMatrix(),P.matrix.multiply(d).decompose(P.position,P.quaternion,P.scale),C});break}default:l=this.invokeOnePlugin(m=>m.parseToMesh&&m.parseToMesh(e,t,n,i,r));break}let g=await l;if(g===null)throw Error(`TilesRenderer: Content type "${h}" not supported.`);let f,y;g.isObject3D?(f=g,y=null):(f=g.scene,y=g),f.updateMatrix(),f.matrix.premultiply(u),f.matrix.decompose(f.position,f.quaternion,f.scale),await this.invokeAllPlugins(m=>m.processTileModel&&m.processTileModel(f,t)),f.traverse(m=>{m[Xf]=m.frustumCulled,m.userData.tile=t}),jf(f,!this.autoDisableRendererCulling);let k=[],v=[],p=[];if(f.traverse(m=>{if(m.geometry&&v.push(m.geometry),m.material){let M=m.material;k.push(m.material);for(let C in M){let P=M[C];P&&P.isTexture&&p.push(P)}}}),r.aborted){for(let m=0,M=p.length;m<M;m++){let C=p[m];C.image instanceof ImageBitmap&&C.image.close(),C.dispose()}return}o.materials=k,o.geometry=v,o.textures=p,o.scene=f,o.metadata=y}disposeTile(e){super.disposeTile(e);let t=e.engineData;if(t.scene){let n=t.materials,i=t.geometry,r=t.textures,o=t.scene.parent;t.scene.traverse(a=>{a.userData.meshFeatures&&a.userData.meshFeatures.dispose(),a.userData.structuralMetadata&&a.userData.structuralMetadata.dispose()});for(let a=0,s=i.length;a<s;a++)i[a].dispose();for(let a=0,s=n.length;a<s;a++)n[a].dispose();for(let a=0,s=r.length;a<s;a++){let c=r[a];c.image instanceof ImageBitmap&&c.image.close(),c.dispose()}o&&o.remove(t.scene),t.scene=null,t.materials=null,t.textures=null,t.geometry=null,t.metadata=null}}setTileActive(e,t){super.setTileActive(e,t);let n=e.engineData.scene;n&&(t?(n.parent=this.group,n.updateMatrixWorld(!0)):n.parent=null)}setTileVisible(e,t){let n=e.engineData.scene,{activeTiles:i,group:r}=this;n&&(t?r.add(n):(r.remove(n),i.has(e)&&(n.parent=r))),super.setTileVisible(e,t)}calculateBytesUsed(e,t){let n=this._bytesUsed;return!n.has(e)&&t&&n.set(e,KS(t)),n.get(e)??null}calculateTileViewError(e,t){let n=e.engineData,i=this.cameras,r=this.cameraInfo,o=n.boundingVolume,a=!1,s=0,c=1/0,l=0,u=1/0;for(let d=0,h=i.length;d<h;d++){let g=r[d],f,y;if(g.isOrthographic){let v=g.pixelSize;f=e.geometricError/v,y=1/0}else{let v=g.sseDenominator;y=o.distanceToPoint(g.position),f=y===0?1/0:e.geometricError/(y*v)}let k=r[d].frustum;o.intersectsFrustum(k)&&(a=!0,s=Math.max(s,f),c=Math.min(c,y)),l=Math.max(l,f),u=Math.min(u,y)}a?(t.inView=!0,t.error=s,t.distanceFromCamera=c):(t.inView=!1,t.error=l,t.distanceFromCamera=u)}dispose(){super.dispose(),this.group.removeFromParent()}};import{BatchedMesh as TB,Box2 as eM,Box3 as PB,Box3Helper as kB,BoxGeometry as _B,BufferAttribute as ep,BufferGeometry as AB,CanvasTexture as EB,Color as RB,CustomBlending as tM,DataTexture as nM,DefaultLoadingManager as LB,DoubleSide as BB,EventDispatcher as OB,FileLoader as rM,FloatType as DB,Frustum as NB,GreaterDepth as IB,Group as zB,LineBasicMaterial as jB,LineSegments as VB,LinearFilter as iM,LinearMipMapLinearFilter as FB,MathUtils as tp,Matrix2 as oM,Matrix3 as aM,Matrix4 as sM,Mesh as UB,MeshBasicMaterial as lM,MeshLambertMaterial as GB,MeshStandardMaterial as HB,OneFactor as cM,PlaneGeometry as WB,Points as $B,PointsMaterial as XB,Quaternion as qB,REVISION as YB,RGFormat as KB,Ray as JB,Raycaster as QB,RedFormat as ZB,SRGBColorSpace as eO,ShaderMaterial as dM,Source as tO,Sphere as nO,SphereGeometry as rO,Texture as iO,TextureUtils as oO,Triangle as aO,UnsignedByteType as sO,Vector2 as vr,Vector3 as cb,Vector4 as uM,WebGLArrayRenderTarget as lO,WebGLRenderTarget as qf,WebGLRenderer as pM,ZeroFactor as hM}from"three";import{GLTFLoader as mM}from"three/addons/loaders/GLTFLoader.js";import{FullScreenQuad as db}from"three/addons/postprocessing/Pass.js";var uO=Object.freeze({fill:"#cccccc",stroke:"transparent",strokeWidth:1,radius:2,order:0,visible:!0});var Yf=new Or;Yf.maxJobs=10,Yf.priorityCallback=(e,t)=>{let n=e.tile,i=t.tile,r=n.internal.renderer,o=i.internal.renderer,a=r.visibleTiles.has(n);return a===o.visibleTiles.has(i)?ta(n,i):a?1:-1};var Kf=new cb;function ks(e,t){if(e.isInterleavedBufferAttribute||e.array instanceof t)return e;let n=t===Int8Array||t===Int16Array||t===Int32Array?-1:0,i=new ep(new t(e.count*e.itemSize),e.itemSize,!0),r=e.itemSize,o=e.count;for(let a=0;a<o;a++)for(let s=0;s<r;s++){let c=tp.clamp(e.getComponent(a,s),n,1);i.setComponent(a,s,c)}return i}function gM(e,t=Int16Array){let n=e.geometry,i=n.attributes,r=i.position;if(r.isInterleavedBufferAttribute||r.array instanceof t)return r;let o=new ep(new t(r.count*r.itemSize),r.itemSize,!1),a=r.itemSize,s=r.count;n.computeBoundingBox();let c=n.boundingBox,{min:l,max:u}=c,d=2**(8*t.BYTES_PER_ELEMENT-1)-1,h=-d;for(let g=0;g<s;g++)for(let f=0;f<a;f++){let y=f===0?"x":f===1?"y":"z",k=l[y],v=u[y],p=tp.mapLinear(r.getComponent(g,f),k,v,h,d);o.setComponent(g,f,p)}c.getCenter(Kf).multiply(e.scale).applyQuaternion(e.quaternion),e.position.add(Kf),e.scale.x*=.5*(u.x-l.x)/d,e.scale.y*=.5*(u.y-l.y)/d,e.scale.z*=.5*(u.z-l.z)/d,i.position=o,e.geometry.boundingBox=null,e.geometry.boundingSphere=null,e.updateMatrixWorld()}var np=class{constructor(e){this._options={generateNormals:!1,disableMipmaps:!0,compressIndex:!0,compressNormals:!1,compressUvs:!1,compressPosition:!1,uvType:Int8Array,normalType:Int8Array,positionType:Int16Array,...e},this.name="TILES_COMPRESSION_PLUGIN",this.priority=-100}processTileModel(e,t){let{generateNormals:n,disableMipmaps:i,compressIndex:r,compressUvs:o,compressNormals:a,compressPosition:s,uvType:c,normalType:l,positionType:u}=this._options;e.traverse(d=>{if(d.material&&i){let h=d.material;for(let g in h){let f=h[g];f&&f.isTexture&&f.generateMipmaps&&(f.generateMipmaps=!1,f.minFilter=iM)}}if(d.geometry){let h=d.geometry,g=h.attributes;if(o){let{uv:f,uv1:y,uv2:k,uv3:v}=g;f&&(g.uv=ks(f,c)),y&&(g.uv1=ks(y,c)),k&&(g.uv2=ks(k,c)),v&&(g.uv3=ks(v,c))}if(n&&!g.normals&&h.computeVertexNormals(),a&&g.normals&&(g.normals=ks(g.normals,l)),s&&gM(d,u),r&&h.index){let f=g.position.count,y=h.index,k=f>65535?Uint32Array:f>255?Uint16Array:Uint8Array;if(!(y.array instanceof k)){let v=new k(h.index.count);v.set(y.array);let p=new ep(v,1);h.setIndex(p)}}}})}};function cn(e,t,n){return e&&t in e?e[t]:n}function ub(e){return e!=="BOOLEAN"&&e!=="STRING"&&e!=="ENUM"}function fM(e){return/^FLOAT/.test(e)}function Rs(e){return/^VEC/.test(e)}function Ls(e){return/^MAT/.test(e)}function pb(e,t,n,i=null){return Ls(n)||Rs(n)?i.fromArray(e,t):e[t]}function Qu(e){let{type:t,componentType:n}=e;switch(t){case"SCALAR":return n==="INT64"?0n:0;case"VEC2":return new vr;case"VEC3":return new cb;case"VEC4":return new uM;case"MAT2":return new oM;case"MAT3":return new aM;case"MAT4":return new sM;case"BOOLEAN":return!1;case"STRING":return"";case"ENUM":return 0}}function Jf(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 Es(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 bM(e,t=null){if(e.array){t=t&&Array.isArray(t)?t:[],t.length=e.count;for(let n=0,i=t.length;n<i;n++)t[n]=Cc(e,t[n])}else t=Cc(e,t);return t}function Cc(e,t=null){let n=e.default,i=e.type;if(t||(t=Qu(e)),n===null){switch(i){case"SCALAR":return 0;case"VEC2":return t.set(0,0);case"VEC3":return t.set(0,0,0);case"VEC4":return t.set(0,0,0,0);case"MAT2":return t.identity();case"MAT3":return t.identity();case"MAT4":return t.identity();case"BOOLEAN":return!1;case"STRING":return"";case"ENUM":return""}throw Error("ClassProperty: invalid type.")}else if(Ls(i))t.fromArray(n);else if(Rs(i))t.fromArray(n);else return n}function xM(e,t){if(e.noData===null)return t;let n=e.noData,i=e.type;if(Array.isArray(t))for(let a=0,s=t.length;a<s;a++)t[a]=r(t[a]);else t=r(t);return t;function r(a){return o(a)&&(a=Cc(e,a)),a}function o(a){if(Ls(i)){let s=a.elements;for(let c=0,l=n.length;c<l;c++)if(n[c]!==s[c])return!1;return!0}else if(Rs(i)){for(let s=0,c=n.length;s<c;s++)if(n[s]!==a.getComponent(s))return!1;return!0}else return n===a}}function yM(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 vM(e,t){let{type:n,componentType:i,scale:r,offset:o,normalized:a}=e;if(Array.isArray(t))for(let d=0,h=t.length;d<h;d++)t[d]=s(t[d]);else t=s(t);return t;function s(d){return d=Ls(n)?l(d):Rs(n)?c(d):u(d),d}function c(d){return d.x=u(d.x),d.y=u(d.y),"z"in d&&(d.z=u(d.z)),"w"in d&&(d.w=u(d.w)),d}function l(d){let h=d.elements;for(let g=0,f=h.length;g<f;g++)h[g]=u(h[g]);return d}function u(d){return a&&(d=yM(i,d)),(a||fM(i))&&(d=d*r+o),d}}function rp(e,t,n=null){if(e.array){Array.isArray(t)||(t=Array(e.count||0)),t.length=n===null?e.count:n;for(let i=0,r=t.length;i<r;i++)Jf(e.type,t[i])||(t[i]=Qu(e))}else Jf(e.type,t)||(t=Qu(e));return t}function Sc(e,t){for(let n in t)n in e||delete t[n];for(let n in e){let i=e[n];t[n]=rp(i,t[n])}}function wM(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 Tc=class{constructor(e,t,n=null){this.name=t.name||null,this.description=t.description||null,this.type=t.type,this.componentType=t.componentType||null,this.enumType=t.enumType||null,this.array=t.array||!1,this.count=t.count||0,this.normalized=t.normalized||!1,this.offset=t.offset||0,this.scale=cn(t,"scale",1),this.max=cn(t,"max",1/0),this.min=cn(t,"min",-1/0),this.required=t.required||!1,this.noData=cn(t,"noData",null),this.default=cn(t,"default",null),this.semantic=cn(t,"semantic",null),this.enumSet=null,this.accessorProperty=n,n&&(this.offset=cn(n,"offset",this.offset),this.scale=cn(n,"scale",this.scale),this.max=cn(n,"max",this.max),this.min=cn(n,"min",this.min)),t.type==="ENUM"&&(this.enumSet=e[this.enumType],this.componentType===null&&(this.componentType=cn(this.enumSet,"valueType","UINT16")))}shapeToProperty(e,t=null){return rp(this,e,t)}resolveDefaultElement(e){return Cc(this,e)}resolveDefault(e){return bM(this,e)}resolveNoData(e){return xM(this,e)}resolveEnumsToStrings(e){let t=this.enumSet;if(this.type==="ENUM")if(Array.isArray(e))for(let i=0,r=e.length;i<r;i++)e[i]=n(e[i]);else e=n(e);return e;function n(i){let r=t.values.find(o=>o.value===i);return r===null?"":r.name}}adjustValueScaleOffset(e){return ub(this.type)?vM(this,e):e}},ip=class{constructor(e,t={},n={},i=null){this.definition=e,this.class=t[e.class],this.className=e.class,this.enums=n,this.data=i,this.name="name"in e?e.name:null,this.properties=null}getPropertyNames(){return Object.keys(this.class.properties)}includesData(e){return!!this.definition.properties[e]}dispose(){}_initProperties(e=Tc){let t={};for(let n in this.class.properties)t[n]=new e(this.enums,this.class.properties[n],this.definition.properties[n]);this.properties=t}},CM=class extends Tc{constructor(e,t,n=null){super(e,t,n),this.attribute=n?.attribute??null}},SM=class extends ip{constructor(...e){super(...e),this.isPropertyAttributeAccessor=!0,this._initProperties(CM)}getData(e,t,n={}){let i=this.properties;Sc(i,n);for(let r in i)n[r]=this.getPropertyValue(r,e,t,n[r]);return n}getPropertyValue(e,t,n,i=null){if(t>=this.count)throw Error("PropertyAttributeAccessor: Requested index is outside the range of the buffer.");let r=this.properties[e],o=r.type;if(!r)throw Error("PropertyAttributeAccessor: Requested class property does not exist.");if(!this.definition.properties[e])return r.resolveDefault(i);i=r.shapeToProperty(i);let a=n.getAttribute(r.attribute.toLowerCase());if(Ls(o)){let s=i.elements;for(let c=s.length;0<c;)s[0]=a.getComponent(t,0)}else if(Rs(o))i.fromBufferAttribute(a,t);else if(o==="SCALAR"||o==="ENUM")i=a.getX(t);else throw Error("StructuredMetadata.PropertyAttributeAccessor: BOOLEAN and STRING types are not supported by property attributes.");return i=r.adjustValueScaleOffset(i),i=r.resolveEnumsToStrings(i),i=r.resolveNoData(i),i}},MM=class extends Tc{constructor(e,t,n=null){super(e,t,n),this.values=n?.values??null,this.valueLength=wM(this.type),this.arrayOffsets=cn(n,"arrayOffsets",null),this.stringOffsets=cn(n,"stringOffsets",null),this.arrayOffsetType=cn(n,"arrayOffsetType","UINT32"),this.stringOffsetType=cn(n,"stringOffsetType","UINT32")}getArrayLengthFromId(e,t){let n=this.count;if(this.arrayOffsets!==null){let{arrayOffsets:i,arrayOffsetType:r}=this,o=new(Es(r))(e[i]);n=o[t+1]-o[t]}return n}getIndexOffsetFromId(e,t){let n=t;if(this.arrayOffsets){let{arrayOffsets:i,arrayOffsetType:r}=this;n=new(Es(r))(e[i])[n]}else this.array&&(n*=this.count);return n}},TM=class extends ip{constructor(...e){super(...e),this.isPropertyTableAccessor=!0,this.count=this.definition.count,this._initProperties(MM)}getData(e,t={}){let n=this.properties;Sc(n,t);for(let i in n)t[i]=this.getPropertyValue(i,e,t[i]);return t}_readValueAtIndex(e,t,n,i=null){let r=this.properties[e],{componentType:o,type:a}=r,s=this.data,c=s[r.values],l=new(Es(o,a))(c),u=r.getIndexOffsetFromId(s,t);if(ub(a)||a==="ENUM")return pb(l,(u+n)*r.valueLength,a,i);if(a==="STRING"){let d=u+n,h=0;if(r.stringOffsets!==null){let{stringOffsets:f,stringOffsetType:y}=r,k=new(Es(y))(s[f]);h=k[d+1]-k[d],d=k[d]}let g=new Uint8Array(l.buffer,d,h);i=new TextDecoder().decode(g)}else if(a==="BOOLEAN"){let d=u+n,h=Math.floor(d/8),g=d%8;i=(l[h]>>g&1)==1}return i}getPropertyValue(e,t,n=null){if(t>=this.count)throw Error("PropertyTableAccessor: Requested index is outside the range of the table.");let i=this.properties[e];if(!i)throw Error("PropertyTableAccessor: Requested property does not exist.");if(!this.definition.properties[e])return i.resolveDefault(n);let r=i.array,o=this.data,a=i.getArrayLengthFromId(o,t);if(n=i.shapeToProperty(n,a),r)for(let s=0,c=n.length;s<c;s++)n[s]=this._readValueAtIndex(e,t,s,n[s]);else n=this._readValueAtIndex(e,t,0,n);return n=i.adjustValueScaleOffset(n),n=i.resolveEnumsToStrings(n),n=i.resolveNoData(n),n}},_s=new eM,Qf=class{constructor(){this._renderer=new pM,this._target=new qf(1,1),this._texTarget=new qf,this._quad=new db(new dM({blending:tM,blendDst:hM,blendSrc:cM,uniforms:{map:{value:null},pixel:{value:new vr}},vertexShader:`
|
|
10
10
|
void main() {
|
|
11
11
|
|
|
12
12
|
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
@@ -21,6 +21,6 @@
|
|
|
21
21
|
gl_FragColor = texelFetch( map, pixel, 0 );
|
|
22
22
|
|
|
23
23
|
}
|
|
24
|
-
`}))}increaseSizeTo(e){this._target.setSize(Math.max(this._target.width,e),1)}readDataAsync(e){let{_renderer:t,_target:n}=this;return t.readRenderTargetPixelsAsync(n,0,0,e.length/4,1,e)}readData(e){let{_renderer:t,_target:n}=this;t.readRenderTargetPixels(n,0,0,e.length/4,1,e)}renderPixelToTarget(e,t,n){let{_renderer:i,_target:r}=this;us.min.copy(t),us.max.copy(t),us.max.x+=1,us.max.y+=1,i.initRenderTarget(r),i.copyTextureToTexture(e,r.texture,us,n,0)}},di=new class{constructor(){let e=null;Object.getOwnPropertyNames(Pf.prototype).forEach(t=>{t!=="constructor"&&(this[t]=(...n)=>(e||(e=new Pf),e[t](...n)))})}},_f=new br,kf=new br,Af=new br;function nM(e,t){return t===0?e.getAttribute("uv"):e.getAttribute(`uv${t}`)}function Ff(e,t,n=[,,,]){let i=3*t,r=3*t+1,o=3*t+2;return e.index&&(i=e.index.getX(i),r=e.index.getX(r),o=e.index.getX(o)),n[0]=i,n[1]=r,n[2]=o,n}function Uf(e,t,n,i,r){let[o,a,s]=i,c=nM(e,t);_f.fromBufferAttribute(c,o),kf.fromBufferAttribute(c,a),Af.fromBufferAttribute(c,s),r.set(0,0,0).addScaledVector(_f,n.x).addScaledVector(kf,n.y).addScaledVector(Af,n.z)}function Gf(e,t,n,i){let r=e.x-Math.floor(e.x),o=e.y-Math.floor(e.y),a=Math.floor(r*t%t),s=Math.floor(o*n%n);return i.set(a,s),i}var Ef=new br,Rf=new br,Lf=new br,rM=class extends ic{constructor(e,t,n=null){super(e,t,n),this.channels=dn(n,"channels",[0]),this.index=dn(n,"index",null),this.texCoord=dn(n,"texCoord",null),this.valueLength=parseInt(this.type.replace(/[^0-9]/g,""))||1}readDataFromBuffer(e,t,n=null){let i=this.type;if(i==="BOOLEAN"||i==="STRING")throw Error("PropertyTextureAccessor: BOOLEAN and STRING types not supported.");return Vf(e,t*this.valueLength,i,n)}},iM=class extends Ou{constructor(...e){super(...e),this.isPropertyTextureAccessor=!0,this._asyncRead=!1,this._initProperties(rM)}getData(e,t,n,i={}){let r=this.properties;nc(r,i);let o=Object.keys(r),a=o.map(s=>i[s]);return this.getPropertyValuesAtTexel(o,e,t,n,a),o.forEach((s,c)=>i[s]=a[c]),i}async getDataAsync(e,t,n,i={}){let r=this.properties;nc(r,i);let o=Object.keys(r),a=o.map(s=>i[s]);return await this.getPropertyValuesAtTexelAsync(o,e,t,n,a),o.forEach((s,c)=>i[s]=a[c]),i}getPropertyValuesAtTexelAsync(...e){this._asyncRead=!0;let t=this.getPropertyValuesAtTexel(...e);return this._asyncRead=!1,t}getPropertyValuesAtTexel(e,t,n,i,r=[]){for(;r.length<e.length;)r.push(null);r.length=e.length,di.increaseSizeTo(r.length);let o=this.data,a=this.definition.properties,s=this.properties,c=Ff(i,t);for(let d=0,h=e.length;d<h;d++){let g=e[d];if(!a[g])continue;let f=s[g],v=o[f.index];Uf(i,f.texCoord,n,c,Ef),Gf(Ef,v.image.width,v.image.height,Rf),Lf.set(d,0),di.renderPixelToTarget(v,Rf,Lf)}let l=new Uint8Array(e.length*4);if(this._asyncRead)return di.readDataAsync(l).then(()=>(u.call(this),r));return di.readData(l),u.call(this),r;function u(){for(let d=0,h=e.length;d<h;d++){let g=e[d],f=s[g],v=f.type;if(r[d]=Bu(f,r[d]),!f)throw Error("PropertyTextureAccessor: Requested property does not exist.");if(!a[g]){r[d]=f.resolveDefault(r);continue}let _=f.valueLength*(f.count||1),y=f.channels.map(S=>l[4*d+S]),p=f.componentType,m=new(hs(p,v))(_);if(new Uint8Array(m.buffer).set(y),f.array){let S=r[d];for(let M=0,T=S.length;M<T;M++)S[M]=f.readDataFromBuffer(m,M,S[M])}else r[d]=f.readDataFromBuffer(m,0,r[d]);r[d]=f.adjustValueScaleOffset(r[d]),r[d]=f.resolveEnumsToStrings(r[d]),r[d]=f.resolveNoData(r[d])}}}dispose(){this.data.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},Au=class{constructor(e,t,n,i=null,r=null){let{schema:o,propertyTables:a=[],propertyTextures:s=[],propertyAttributes:c=[]}=e,{enums:l,classes:u}=o,d=a.map(f=>new tM(f,u,l,n)),h=[],g=[];i&&(i.propertyTextures&&(h=i.propertyTextures.map(f=>new iM(s[f],u,l,t))),i.propertyAttributes&&(g=i.propertyAttributes.map(f=>new ZS(c[f],u,l)))),this.schema=o,this.tableAccessors=d,this.textureAccessors=h,this.attributeAccessors=g,this.object=r,this.textures=t,this.nodeMetadata=i}getPropertyTableData(e,t,n=null){if(!Array.isArray(e))n||(n={}),n=this.tableAccessors[e].getData(t,n);else{n||(n=[]);let i=Math.min(e.length,t.length);n.length=i;for(let r=0;r<i;r++){let o=this.tableAccessors[e[r]];n[r]=o.getData(t[r],n[r])}}if(Array.isArray(e)!==Array.isArray(n)||Array.isArray(e)!==Array.isArray(t))throw Error("StructuralMetadata: Scalar and array inputs cannot be mixed.");return n}getPropertyTableInfo(e=null){if(e===null&&(e=this.tableAccessors.map((t,n)=>n)),Array.isArray(e))return e.map(t=>{let n=this.tableAccessors[t];return{name:n.name,className:n.definition.class}});{let t=this.tableAccessors[e];return{name:t.name,className:t.definition.class}}}getPropertyTextureData(e,t,n=[]){let i=this.textureAccessors;n.length=i.length;for(let r=0;r<i.length;r++)n[r]=i[r].getData(e,t,this.object.geometry,n[r]);return n}async getPropertyTextureDataAsync(e,t,n=[]){let i=this.textureAccessors;n.length=i.length;let r=[];for(let o=0;o<i.length;o++){let a=i[o].getDataAsync(e,t,this.object.geometry,n[o]).then(s=>{n[o]=s});r.push(a)}return await Promise.all(r),n}getPropertyTextureInfo(){return this.textureAccessors}getPropertyAttributeData(e,t=[]){let n=this.attributeAccessors;t.length=n.length;for(let i=0;i<n.length;i++)t[i]=n[i].getData(e,this.object.geometry,t[i]);return t}getPropertyAttributeInfo(){return this.attributeAccessors.map(e=>({name:e.name,className:e.definition.class}))}dispose(){this.textureAccessors.forEach(e=>e.dispose()),this.tableAccessors.forEach(e=>e.dispose()),this.attributeAccessors.forEach(e=>e.dispose())}},ps="EXT_structural_metadata";function oM(e,t=[]){let n=e.json.textures?.length||0,i=Array(n).fill(null);return t.forEach(({properties:r})=>{for(let o in r){let{index:a}=r[o];i[a]===null&&(i[a]=e.loadTexture(a))}}),Promise.all(i)}function aM(e,t=[]){let n=e.json.bufferViews?.length||0,i=Array(n).fill(null);return t.forEach(({properties:r})=>{for(let o in r){let{values:a,arrayOffsets:s,stringOffsets:c}=r[o];i[a]===null&&(i[a]=e.getDependency("bufferView",a)),i[s]===null&&(i[s]=e.getDependency("bufferView",s)),i[c]===null&&(i[c]=e.getDependency("bufferView",c))}}),Promise.all(i)}var Hf=class{constructor(e){this.parser=e,this.name=ps}async afterRoot({scene:e,parser:t}){let n=t.json.extensionsUsed;if(!n||!n.includes(ps))return;let i=null,r=t.json.extensions[ps];if(r.schemaUri){let{manager:c,path:l,requestHeader:u,crossOrigin:d}=t.options,h=new URL(r.schemaUri,l).toString(),g=new BS(c);g.setCrossOrigin(d),g.setResponseType("json"),g.setRequestHeader(u),i=g.loadAsync(h).then(f=>{r={...r,schema:f}})}let[o,a]=await Promise.all([oM(t,r.propertyTextures),aM(t,r.propertyTables),i]),s=new Au(r,o,a);e.userData.structuralMetadata=s,e.traverse(c=>{if(t.associations.has(c)){let{meshes:l,primitives:u}=t.associations.get(c),d=t.json.meshes[l]?.primitives[u];if(d&&d.extensions&&d.extensions[ps]){let h=d.extensions[ps];c.userData.structuralMetadata=new Au(r,o,a,h,c)}else c.userData.structuralMetadata=s}})}},Bf=new br,Of=new br,Df=new br;function sM(e){return e.x>e.y&&e.x>e.z?0:e.y>e.z?1:2}var Wf=class{constructor(e,t,n){this.geometry=e,this.textures=t,this.data=n,this._asyncRead=!1,this.featureIds=n.featureIds.map(i=>{let{texture:r,...o}=i,a={label:null,propertyTable:null,nullFeatureId:null,...o};return r&&(a.texture={texCoord:0,channels:[0],...r}),a})}getTextures(){return this.textures}getFeatureInfo(){return this.featureIds}getFeaturesAsync(...e){this._asyncRead=!0;let t=this.getFeatures(...e);return this._asyncRead=!1,t}getFeatures(e,t){let{geometry:n,textures:i,featureIds:r}=this,o=Array(r.length).fill(null),a=r.length;di.increaseSizeTo(a);let s=Ff(n,e),c=s[sM(t)];for(let d=0,h=r.length;d<h;d++){let g=r[d],f="nullFeatureId"in g?g.nullFeatureId:null;if("texture"in g){let v=i[g.texture.index];Uf(n,g.texture.texCoord,t,s,Bf),Gf(Bf,v.image.width,v.image.height,Of),Df.set(d,0),di.renderPixelToTarget(i[g.texture.index],Of,Df)}else if("attribute"in g){let v=n.getAttribute(`_feature_id_${g.attribute}`).getX(c);v!==f&&(o[d]=v)}else{let v=c;v!==f&&(o[d]=v)}}let l=new Uint8Array(a*4);if(this._asyncRead)return di.readDataAsync(l).then(()=>(u(),o));return di.readData(l),u(),o;function u(){let d=new Uint32Array(1);for(let h=0,g=r.length;h<g;h++){let f=r[h],v="nullFeatureId"in f?f.nullFeatureId:null;if("texture"in f){let{channels:_}=f.texture,y=_.map(m=>l[4*h+m]);new Uint8Array(d.buffer).set(y);let p=d[0];p!==v&&(o[h]=p)}}}}dispose(){this.textures.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},rc="EXT_mesh_features";function Nf(e,t,n){e.traverse(i=>{if(t.associations.has(i)){let{meshes:r,primitives:o}=t.associations.get(i),a=t.json.meshes[r]?.primitives[o];a&&a.extensions&&a.extensions[rc]&&n(i,a.extensions[rc])}})}var $f=class{constructor(e){this.parser=e,this.name=rc}async afterRoot({scene:e,parser:t}){let n=t.json.extensionsUsed;if(!n||!n.includes(rc))return;let i=t.json.textures?.length||0,r=Array(i).fill(null);Nf(e,t,(a,{featureIds:s})=>{s.forEach(c=>{if(c.texture&&r[c.texture.index]===null){let l=c.texture.index;r[l]=t.loadTexture(l)}})});let o=await Promise.all(r);Nf(e,t,(a,s)=>{a.userData.meshFeatures=new Wf(a.geometry,o,s)})}},Xf=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])}}},Du=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 HS(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 Xf),this.metadata&&(t.register(()=>new Hf),t.register(()=>new $f)),this.plugins.forEach(n=>t.register(n)),e.manager.addHandler(this._gltfRegex,t),this.tiles=e,this._loader=t}dispose(){this.tiles.manager.removeHandler(this._gltfRegex),this.tiles.manager.removeHandler(this._dracoRegex),this.autoDispose&&(this.ktxLoader.dispose(),this.dracoLoader.dispose())}};var{clamp:_B}=Ru;var kB=new zf(new zS),lM=new LS(new Uint8Array([255,255,255,255]),1,1);lM.needsUpdate=!0;var cM=0,dM=1,uM=2,pM=3,hM=4,mM=5,gM=6,fM=7,bM=8,xM=9,yM=10,vM=11,AB=Object.freeze({NONE:cM,SCREEN_ERROR:dM,GEOMETRIC_ERROR:uM,DISTANCE:pM,DEPTH:hM,RELATIVE_DEPTH:mM,IS_LEAF:gM,RANDOM_COLOR:fM,RANDOM_NODE_COLOR:bM,CUSTOM_COLOR:xM,LOAD_ORDER:yM,INDEXED_COLOR:vM});var EB=Math.PI/4,RB=3/5;var ci={NONE:0,NOT_READY:1,NO_FIT:2,DEPTH:3,OCCUPANCY:4,SPACING:5,ANGLE:6,FACING:7};var LB=new class{constructor(){this._cache={}}getColor(...e){let t=e.pop(),n=e.join("_"),{_cache:i}=this;return n in i||(t.setHSL(Math.random(),1,.5),i[n]=t.getHex()),t.set(i[n])}};var BB={[ci.NONE]:16777215,[ci.NOT_READY]:7829367,[ci.NO_FIT]:2250239,[ci.DEPTH]:4473924,[ci.OCCUPANCY]:65535,[ci.SPACING]:16776960,[ci.ANGLE]:16711680,[ci.FACING]:16711935};var OB=Math.PI/180;var DB=$o*Math.PI*2;var NB=$o*Math.PI*2;import{DRACOLoader as PM}from"three/examples/jsm/loaders/DRACOLoader.js";import{KTX2Loader as _M}from"three/examples/jsm/loaders/KTX2Loader.js";import{MeshoptDecoder as kM}from"three/examples/jsm/libs/meshopt_decoder.module.js";import{Box3 as AM,DoubleSide as EM,MathUtils as RM,Matrix4 as Jf,Sphere as LM,Vector3 as BM}from"three";import{BufferAttribute as qf,MathUtils as wM}from"three";function Yf(e){return!!e&&!e.isInterleavedBufferAttribute}function Kf(e,t,n,i){for(let r=0;r<e.count;r+=1)for(let o=0;o<e.itemSize;o+=1)t.setComponent(r,o,wM.clamp(e.getComponent(r,o),n,i));return t}function CM(e){for(let t=0;t<e.count;t+=1)for(let n=0;n<e.itemSize;n+=1){let i=e.getComponent(t,n);if(!Number.isFinite(i)||i<0||i>1)return!1}return!0}var oc=class{constructor(){this.name="RI_VERTEX_COMPRESSION_PLUGIN";this.priority=-99}processTileModel(t){t.traverse(n=>{let i=n.geometry;if(!i)return;let r=i.attributes.normal;Yf(r)&&!(r.array instanceof Int16Array)&&(i.attributes.normal=Kf(r,new qf(new Int16Array(r.count*r.itemSize),r.itemSize,!0),-1,1));for(let o of["uv","uv1","uv2","uv3"]){let a=i.attributes[o];!Yf(a)||a.array instanceof Uint16Array||!CM(a)||(i.attributes[o]=Kf(a,new qf(new Uint16Array(a.count*a.itemSize),a.itemSize,!0),0,1))}})}};import{jsx as Zf,jsxs as NM}from"react/jsx-runtime";var OM=0,Qf=4;function DM(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 Iu({url:e,rotation:t=[0,0,0],errorTarget:n=64,cacheSize:i=800,memoryBudgetMB:r=800,decoderConfig:o,objectBindings:a,itemMaterials:s,sceneConfig:c,selectedItem:l,panelHoveredItem:u,highlightOnHover:d=!0,onItemClick:h,onItemHover:g,onObjectCatalog:f,onTilesetBounds:v,onModelLoaded:_,onLoadError:y,nodeRefsOut:p,onNodeRefsChange:m,materialRefsOut:S,explodeFactor:M=0,suspendBindingTransforms:T=!1}){let{camera:R,gl:b,invalidate:C}=TM(),x=vn(null),[P,I]=Nu(null),E=vn({onItemClick:h,onItemHover:g,onObjectCatalog:f,onTilesetBounds:v,onModelLoaded:_,onLoadError:y,onNodeRefsChange:m});E.current={onItemClick:h,onItemHover:g,onObjectCatalog:f,onTilesetBounds:v,onModelLoaded:_,onLoadError:y,onNodeRefsChange:m};let z=vn(!0),[A,F]=Nu(null),j=vn(null);j.current=A;let L=vn([]),B=vn(!1);ui(()=>{let re=new Dl;return F(re),()=>re.dispose()},[e]);let G=vn(null),U=vn(0),oe=vn(!1),ve=r*1024*1024,de=vn(!1),we=vn(iu),xe=vn(null),Ce=vn(null),Ye=vn(null);ui(()=>()=>{Ye.current!==null&&clearTimeout(Ye.current)},[]);let gt=o?.dracoDecoderPath??Wd,Fe=o?.ktx2TranscoderPath??$d,Ae=o?.meshopt??!0,[Y,tt]=Nu(null);ui(()=>{oe.current=!1,de.current=!1;let re=new _u(e);re.loadAncestors=!0,re.downloadQueue.maxJobsPerOrigin=4,re.parseQueue.maxJobs=2;let le=gt?new PM().setDecoderPath(gt).setWorkerLimit(2):null,he=Fe?new _M().setTranscoderPath(Fe).detectSupport(b):null;return re.registerPlugin(new Du({dracoLoader:le,ktxLoader:he,meshoptDecoder:Ae?kM:null,autoDispose:!1})),re.registerPlugin(new Lu({disableMipmaps:!0,compressIndex:!0,compressNormals:!1,compressUvs:!1,compressPosition:!0})),re.registerPlugin(new oc),tt(re),window.__riTiles=re,()=>{re.forEachLoadedModel(Oe=>Di(Oe)),re.dispose(),le?.dispose(),he?.dispose(),tt(Oe=>Oe===re?null:Oe)}},[gt,b,Fe,Ae,e]),ui(()=>{Y&&(we.current=iu,xe.current=null,Y.errorTarget=n,Y.lruCache.maxSize=i,Y.lruCache.minSize=Math.max(1,Math.floor(i*.75)),Y.lruCache.maxBytesSize=ve,Y.lruCache.minBytesSize=ve*.75,C())},[i,n,C,ve,Y]);let Be=SM(()=>{let re=a??{};return{objectBindings:re,keyByModelObject:gg(re),itemMaterials:s,shadingMode:c?.model.shading??"lit",rendererMode:c?.model.renderer??"pbr",selectedKey:l??null,hoveredKey:fg(P,u),highlightOnHover:d,suspendTransforms:T,placementFrame:Y?.group.matrixWorld,invalidate:C}},[P,d,C,s,a,u,c,l,T,Y]),$t=Yi(()=>{if(!Y)return;let re=Ee.current,le=B.current?j.current?.nodesByBinding(re)??{}:{},he={};Y.group.traverse(De=>{if(!De.isMesh)return;let rt=nu(De);if(!rt)return;let ce=re.keyByModelObject[rt]??rt;if(!re.objectBindings[ce])return;le[ce]||(le[ce]=De);let Pe=De.material;Pe&&(he[ce]=Pe)});let Oe=p?.current??{},nt=Object.keys(Oe),Re=nt.length!==Object.keys(le).length||nt.some(De=>Oe[De]!==le[De]);p&&(p.current=le),S&&(S.current=he),(Re||!p)&&E.current.onNodeRefsChange?.()},[S,p,Y]),Ue=Yi(re=>Bl(re,Be),[Be]),Pt=Yi(re=>xg(re,Be),[Be]),_t=vn(Pt);_t.current=Pt;let Ee=vn(Be);Ee.current=Be;let Ne=Yi(()=>{let re=G.current,le=U.current;return!re||le<=0?Ee.current:{...Ee.current,explode:{factor:le,centre:re.centre,radius:re.radius}}},[]);ui(()=>{Y&&(Pt(Y.group),z.current=!0,Y.forEachLoadedModel(re=>{Pt(re),Ho(re,Ne())}),C())},[Pt,C,Ne,Y]),ui(()=>{let re=DM(e);if(!re)return;let le=!1;return fetch(re).then(he=>he.ok?he.json():null).then(he=>{le||!he?.objects||(L.current=he.objects,B.current=he.bindingFrame==="gltf-identity-v2",B.current&&j.current?.setCatalog(he.objects),z.current=!0,E.current.onObjectCatalog?.(he.objects),C())}).catch(()=>{}),()=>{le=!0}},[e,C,A]),ui(()=>{if(!Y)return;let re=!1,le=()=>C(),he=De=>{De.scene&&(De.scene.traverse(rt=>{let ce=rt.material;for(let Pe of Array.isArray(ce)?ce:ce?[ce]:[])Pe.transparent&&Pe.side===EM&&(Pe.forceSinglePass=!0)}),_t.current(De.scene),Ho(De.scene,Ne()),Eo(De.scene)),z.current=!0,re||(re=!0,E.current.onModelLoaded?.(Y.group)),C()},Oe=De=>{E.current.onLoadError?.(De.error)},nt=De=>{De.scene&&(ru(De.scene),Di(De.scene)),z.current=!0};Y.setCamera(R),Y.setResolutionFromRenderer(R,b),Y.addEventListener("needs-update",le),Y.addEventListener("load-model",he),Y.addEventListener("load-error",Oe),Y.addEventListener("dispose-model",nt);let Re=()=>{z.current=!0,C()};return Y.addEventListener("tile-visibility-change",Re),C(),()=>{Y.removeEventListener("needs-update",le),Y.removeEventListener("load-model",he),Y.removeEventListener("load-error",Oe),Y.removeEventListener("dispose-model",nt),Y.removeEventListener("tile-visibility-change",Re),ru(Y.group),Y.deleteCamera(R),p&&(p.current={}),S&&(S.current={})}},[R,b,C,S,p,Ne,Y]);let te=Yi(re=>{let le=Ue(re.object);le&&(re.stopPropagation(),E.current.onItemClick?.(le.binding))},[Ue,h]),ae=Yi(re=>{let le=Ue(re.object),he=le?.key??null;he!==x.current&&(x.current=he,I(he),E.current.onItemHover?.(le?.binding??null))},[Ue]),ft=Yi(()=>{x.current!==null&&(x.current=null,I(null),E.current.onItemHover?.(null))},[]);return ui(()=>{C()},[C,Y]),MM((re,le)=>{if(!Y)return;if(Y.setResolutionFromRenderer(R,b),B.current&&A){let k=A.sync(Ne(),l,T);A.updateBounds(Y.root),T&&Y.forEachLoadedModel(N=>Ho(N,k))}if(Y.update(),!oe.current){let k=new AM;if(Y.getBoundingBox(k)){oe.current=!0,Y.group.updateMatrixWorld(),k.applyMatrix4(Y.group.matrixWorld);let N=k.getBoundingSphere(new LM);G.current={centre:N.center.clone(),radius:k.getSize(new BM).length()*.5},E.current.onTilesetBounds?.(k),C()}}z.current&&(z.current=!1,$t());let he=Math.min(Math.max(M,0),1),Oe=U.current;Math.abs(Oe-he)>1e-4?(U.current=RM.lerp(Oe,he,1-Math.exp(-6*le)),Ho(Y.group,Ne()),C()):Oe!==he&&(U.current=he,Ho(Y.group,Ne()),C());let nt=Y,Re=Y.lruCache,De=Re.isFull(),rt=we.current,ce=rt.loosened&&xe.current?xe.current:{bytes:Re.maxBytesSize,items:Re.maxSize},Pe=0;for(let k of Re.usedSet??[])Pe+=Re.bytesMap?.get(k)??0;let Ke=!1,ke=Y;for(let k of ke.usedSet??[]){let N=k.internal?.loadingState??Qf;if(k.traversal?.used&&k.internal?.hasContent&&N>=OM&&N<Qf){Ke=!0;break}}let dt=Ce.current??(Ce.current={world:new Jf,projection:new Jf}),ut=!dt.world.equals(R.matrixWorld)||!dt.projection.equals(R.projectionMatrix);ut&&(dt.world.copy(R.matrixWorld),dt.projection.copy(R.projectionMatrix));let bt={full:De,wanting:Ke,moved:ut,usage:Math.max(Pe/Math.max(1,ce.bytes),(Re.usedSet?.size??0)/Math.max(1,ce.items)),now:performance.now()},Je=Eg(rt,bt);Je!==rt&&(Je.loosened&&(!rt.loosened||Je.raisedAt!==rt.raisedAt)?(rt.loosened||(xe.current=ce),Re.maxBytesSize=Math.max(ce.bytes,Re.cachedBytes??0)*ou,Re.maxSize=Math.ceil(Math.max(ce.items,Re.itemSet?.size??0)*ou)):!Je.loosened&&rt.loosened&&xe.current&&(Re.maxBytesSize=xe.current.bytes,Re.maxSize=xe.current.items,xe.current=null),we.current=Je,Y.errorTarget=n*Je.factor,C()),!de.current&&De&&bt.wanting&&Je.factor>=Qa&&(de.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 Tn=Rg(Je,bt);Tn===0?C():Tn!==null&&Ye.current===null&&(Ye.current=setTimeout(()=>{Ye.current=null,C()},Tn)),((nt.stats?.downloading??0)>0||(nt.stats?.parsing??0)>0||nt.loadProgress!==void 0&&nt.loadProgress<1&&!De)&&C()}),Y?NM("group",{rotation:t,children:[A?Zf("primitive",{object:A.group}):null,Zf("primitive",{object:Y.group,onClick:te,onPointerMove:ae,onPointerOut:ft})]}):null}import{useMemo as Ji,useRef as pi,useState as Jo,useEffect as Ki,useCallback as Ko}from"react";import{Html as eb}from"@react-three/drei";import{useFrame as tb,useThree as ju}from"@react-three/fiber";import{MathUtils as zu,Vector3 as fs}from"three";import{jsx as xr,jsxs as Vu}from"react/jsx-runtime";var IM=.02;function nb(e,t){let n=pi(null),i=ju(l=>l.scene),r=pi(null),o=Ji(()=>new fs(...e.anchorLocalPosition??e.localPosition??e.worldPosition),[e.anchorLocalPosition,e.localPosition,e.worldPosition]),a=Ji(()=>new fs,[]),s=Ji(()=>new fs,[]),c=Ji(()=>new fs,[]);return Ki(()=>{r.current=null},[e.anchorNodeName]),tb(({camera:l})=>{let u=n.current,d=u?.parent;if(!u||!d)return;let h=r.current;if(e.anchorNodeName&&(!h||!h.parent)&&(h=gr(i,e.anchorNodeName),r.current=h),h?(h.updateWorldMatrix(!0,!1),a.copy(o).applyMatrix4(h.matrixWorld)):(a.copy(o),d.localToWorld(a)),t){let g=t.current.get(e.id);g||(g=new fs,t.current.set(e.id,g)),g.copy(a)}c.copy(l.position).sub(a),c.lengthSq()>0?(c.normalize(),s.copy(a).addScaledVector(c,IM)):s.copy(a),d.worldToLocal(s),u.position.copy(s)}),n}function zM({annotation:e,occluders:t,worldPositionsRef:n,onClick:i,onHover:r,showAnnotationOnHover:o}){let[a,s]=Jo(!1),c=nb(e,n),[l,u]=Jo(!1),[d,h]=Jo(1),g=pi(null),f=pi(null),v=pi(null);Ki(()=>()=>{g.current&&(clearTimeout(g.current),g.current=null),v.current&&(clearTimeout(v.current),v.current=null)},[]);let _=M=>{M.stopPropagation(),M.preventDefault(),g.current&&(clearTimeout(g.current),g.current=null),g.current=window.setTimeout(()=>{i?.(e),g.current=null},10)},y=M=>{M.stopPropagation(),u(!0),h(100),v.current&&(clearTimeout(v.current),v.current=null),r?.(e),o&&i?.(e)},p=M=>{M.stopPropagation(),u(!1),h(1),v.current&&clearTimeout(v.current),v.current=window.setTimeout(()=>{r?.(null),o&&r?.(null),v.current=null},50)},m=M=>{M.stopPropagation();let T=M.currentTarget;T.dataset.pointerX=String(M.clientX),T.dataset.pointerY=String(M.clientY)},S=M=>{M.stopPropagation();let T=M.currentTarget,R=parseFloat(T.dataset.pointerX||"0"),b=parseFloat(T.dataset.pointerY||"0"),C=M.clientX-R,x=M.clientY-b;Math.sqrt(C*C+x*x)<10&&_(M)};return xr("group",{ref:c,children:xr(eb,{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:xr("div",{ref:f,className:`ri-annotationMarker ${l?"ri-annotationMarker--hovered":""}`,title:e.title,style:{display:a?"none":"flex"},onPointerDown:m,onPointerUp:S,onPointerEnter:y,onPointerLeave:p,onDoubleClick:M=>{M.stopPropagation(),i?.(e)},role:"button",tabIndex:0,"aria-label":`Annotation ${e.id}`,children:xr("span",{className:"ri-annotationMarker-id",children:e.id})})})})}function jM({annotation:e,occluders:t,popupRef:n,onClose:i,hideCloseButton:r=!1}){let[o,a]=Jo(!1),s=nb(e),c=Vu("div",{ref:n,className:"ri-viewAnnotationPopup",style:{display:o?"none":"block"},onPointerDown:l=>l.stopPropagation(),onClick:l=>l.stopPropagation(),children:[Vu("div",{className:"ri-viewAnnotationHeader",children:[xr("h4",{className:"ri-viewAnnotationTitle",children:e.title}),!r&&xr("button",{onClick:l=>{l.stopPropagation(),i?.()},className:"ri-viewAnnotationClose","aria-label":"Close annotation",children:"\xD7"})]}),e.description&&xr("p",{className:"ri-viewAnnotationDescription",children:e.description})]});return xr("group",{ref:s,children:xr(eb,{occlude:t,onOcclude:a,pointerEvents:o?"none":"auto",zIndexRange:[1e3,2e3],style:{pointerEvents:o?"none":"auto",zIndex:1e3},transparent:!0,children:c})})}function Fu({annotations:e,sceneConfig:t,activeAnnotation:n,popupRef:i,canvasRootRef:r,worldPositionsRef:o,modelLoaded:a,onAnnotationClick:s,onAnnotationHover:c,onCloseAnnotation:l,hideCloseButton:u=!1,showAnnotationOnHover:d=!1}){let h=ju(A=>A.invalidate),g=ju(A=>A.scene),[f,v]=Jo(null),[_,y]=Jo(!1),p=pi(null),m=pi(null),S=pi(null),M=Ji(()=>{let A=[];return g.traverse(F=>{let j=F;j.isMesh&&!j.isSkinnedMesh&&A.push({current:F})}),A},[g,e,a]),T=Ko(()=>{h();let A=()=>{h(),m.current=window.requestAnimationFrame(()=>{h(),m.current=null})};m.current=window.requestAnimationFrame(A)},[h]);Ki(()=>{T()},[e,T]),Ki(()=>{T()},[n,T]),Ki(()=>()=>{m.current!==null&&window.cancelAnimationFrame(m.current),S.current&&clearTimeout(S.current)},[]);let R=_?f:n||f,b=Ji(()=>R?e.find(A=>A.id===R.id)??R:null,[R,e]),C=Ko(A=>{if(_&&f?.id===A.id){y(!1),v(null),l?.();return}y(!0),v(A),s?.(A)},[_,f,s,l]),x=Ko(A=>{c?.(A),d&&!_&&(S.current&&(clearTimeout(S.current),S.current=null),A?v(A):S.current=window.setTimeout(()=>{v(null),l?.(),S.current=null},100))},[_,c,d,l]),P=Ko(()=>{y(!1),v(null),l?.()},[l]),I=Ko(A=>{let F=A.target;if(F.closest?.(".ri-annotationMarker")||F.closest?.(".ri-viewAnnotationPopup")||F.closest?.(".annotation-html-wrapper"))return;let j=r.current;j&&j.contains(F)&&(y(!1),v(null),l?.())},[r,l]),E=Ko(A=>{A.key==="Escape"&&_&&(y(!1),v(null),l?.())},[_,l]);Ki(()=>{let A=r.current;return A&&(A.addEventListener("click",I),A.addEventListener("pointerdown",I)),document.addEventListener("keydown",E),()=>{A&&(A.removeEventListener("click",I),A.removeEventListener("pointerdown",I)),document.removeEventListener("keydown",E)}},[r,I,E]);let z=Ji(()=>(t?.model.rotation??[0,0,0]).map(A=>A*Math.PI/180),[t?.model.rotation]);return Ki(()=>{h()},[h,z]),tb((A,F)=>{if(!p.current)return;p.current.rotation.x=zu.lerp(p.current.rotation.x,z[0],1-Math.exp(-5*F)),p.current.rotation.y=zu.lerp(p.current.rotation.y,z[1],1-Math.exp(-5*F)),p.current.rotation.z=zu.lerp(p.current.rotation.z,z[2],1-Math.exp(-5*F));let{rotation:j}=p.current;Math.abs(j.x-z[0])+Math.abs(j.y-z[1])+Math.abs(j.z-z[2])>1e-4&&h()}),Vu("group",{ref:p,children:[e.map(A=>{let F=`${A.worldPosition.join(",")}-${A.title}-${A.id}`;return xr(zM,{annotation:A,occluders:M,worldPositionsRef:o,onClick:C,onHover:x,showAnnotationOnHover:d},F)}),b?xr(jM,{annotation:b,occluders:M,popupRef:i,onClose:P,hideCloseButton:u},`popup-${b.id}`):null]})}import{useEffect as VM,useMemo as rb}from"react";import{Html as ob,Line as FM}from"@react-three/drei";import{BoxGeometry as UM,EdgesGeometry as GM,Vector3 as ib}from"three";import{jsx as Xr,jsxs as Qo}from"react/jsx-runtime";var HM="#22d3ee",WM="#facc15";function ac(e,t){let n=e<10?e.toFixed(3):e.toFixed(2);return t?`${n} ${t}`:n}function $M(e,t){return[(e[0]+t[0])/2,(e[1]+t[1])/2,(e[2]+t[2])/2]}function sc({position:e,children:t}){return Xr(ob,{center:!0,position:e,zIndexRange:[20,0],children:Xr("div",{className:"ri-measureLabel",children:t})})}function XM({box:e,unit:t}){let n=rb(()=>[(e.min[0]+e.max[0])/2,(e.min[1]+e.max[1])/2,(e.min[2]+e.max[2])/2],[e.min,e.max]),i=rb(()=>{let[s,c,l]=e.size;return new GM(new UM(s||1e-4,c||1e-4,l||1e-4))},[e.size]);VM(()=>()=>{i.dispose()},[i]);let[r,o,a]=e.size;return Qo("group",{position:n,children:[Xr("lineSegments",{geometry:i,children:Xr("lineBasicMaterial",{color:WM})}),Qo(sc,{position:[0,-o/2,a/2],children:["W ",ac(r,t)]}),Qo(sc,{position:[-r/2,0,a/2],children:["H ",ac(o,t)]}),Qo(sc,{position:[r/2,-o/2,0],children:["D ",ac(a,t)]})]})}function Uu({points:e,unit:t,box:n,showDimensions:i}){return Qo("group",{children:[e.map(r=>Xr(ob,{center:!0,position:r.position,zIndexRange:[15,0],children:Xr("div",{className:"ri-measureDot"})},r.id)),e.slice(1).map((r,o)=>{let a=e[o].position,s=r.position,c=new ib(...a).distanceTo(new ib(...s));return Qo("group",{children:[Xr(FM,{points:[a,s],color:HM,lineWidth:2}),Xr(sc,{position:$M(a,s),children:ac(c,t)})]},`${e[o].id}-${r.id}`)}),i&&n?Xr(XM,{box:n,unit:t}):null]})}import{forwardRef as qM,useCallback as bs,useEffect as ab,useImperativeHandle as YM,useMemo as sb,useRef as wn}from"react";import{useXR as lb,useXRHitTest as KM,useXRInputSourceEvent as JM}from"@react-three/xr";import{useFrame as QM}from"@react-three/fiber";import{Matrix4 as ZM,Vector3 as cb}from"three";import{Fragment as oT,jsx as xs,jsxs as hb}from"react/jsx-runtime";var eT=1,db=1,tT=.1,nT=10;function rT(e,t){let[n,i,r]=e.size,o=(e.min[0]+e.max[0])/2,a=(e.min[2]+e.max[2])/2,s=Math.max(n,i,r)||1;return{scale:t==="real-world"?1:eT/s,offset:[-o,-e.min[1],-a]}}function ub(e){let t=e[0].clientX-e[1].clientX,n=e[0].clientY-e[1].clientY;return Math.hypot(t,n)}function pb(e){let t=e[0].clientX-e[1].clientX,n=e[0].clientY-e[1].clientY;return Math.atan2(n,t)}var iT=qM(function({box:t,scaleMode:n,children:i,onARStateChange:r},o){let a=wn(null),s=wn(null),c=wn(null),l=lb(F=>F.session!=null),u=lb(F=>F.mode==="immersive-ar"),d=sb(()=>t?rT(t,n):null,[t,n]),h=wn(new cb(0,0,-db)),g=wn(1),f=wn(0),v=wn(!0),_=wn(!1),y=sb(()=>new ZM,[]),p=wn(new cb),m=wn(!1),S=wn(null),M=wn(!1),T=wn(0),R=wn(0),b=wn(1),C=wn(0),x=bs(()=>{if(!r||!u)return;let F={canPlace:m.current,isPlacementMode:v.current,isModelPlaced:_.current},j=S.current;j&&j.canPlace===F.canPlace&&j.isPlacementMode===F.isPlacementMode&&j.isModelPlaced===F.isModelPlaced||(S.current=F,r(F))},[u,r]),P=bs(()=>!u||!m.current?!1:(h.current.copy(p.current),_.current=!0,v.current=!1,x(),!0),[x,u]),I=bs(()=>{u&&(v.current=!0,x())},[x,u]),E=bs(()=>{let F=P();return!F&&u&&(v.current=!1,x()),F},[x,u,P]),z=bs(()=>{u&&(v.current=!1,x())},[x,u]);YM(o,()=>({placeCurrent:P,startPlacementMode:I,finishPlacementMode:E,cancelPlacementMode:z}),[z,E,P,I]),ab(()=>{if(!l){h.current.set(0,0,-db),g.current=1,f.current=0,m.current=!1,M.current=!1,v.current=!0,_.current=!1,S.current=null;return}u&&(m.current=!1,M.current=!1,v.current=!0,_.current=!1,S.current=null,x())},[x,l,u]),KM((F,j)=>{if(!u||F.length===0){m.current&&(m.current=!1,x());return}j(y,F[0])&&(p.current.setFromMatrixPosition(y),m.current||(m.current=!0,x()))},"viewer"),JM("all","select",()=>{!u||M.current||!v.current||P()},[u,P]),ab(()=>{if(!u)return;let F=B=>{B.touches.length===2&&(M.current=!0,T.current=ub(B.touches),R.current=pb(B.touches),b.current=g.current,C.current=f.current)},j=B=>{if(!M.current||B.touches.length!==2)return;B.preventDefault();let G=ub(B.touches);if(T.current>0){let oe=G/T.current;g.current=Math.min(nT,Math.max(tT,b.current*oe))}let U=pb(B.touches);f.current=C.current-(U-R.current)},L=B=>{B.touches.length===0&&requestAnimationFrame(()=>{M.current=!1})};return window.addEventListener("touchstart",F),window.addEventListener("touchmove",j,{passive:!1}),window.addEventListener("touchend",L),window.addEventListener("touchcancel",L),()=>{window.removeEventListener("touchstart",F),window.removeEventListener("touchmove",j),window.removeEventListener("touchend",L),window.removeEventListener("touchcancel",L)}},[u]),QM(()=>{let F=a.current,j=s.current;if(!F||!j)return;!l||!d?(F.visible=!0,F.position.set(0,0,0),F.rotation.set(0,0,0),j.scale.setScalar(1)):(F.visible=!u||_.current,F.position.copy(h.current),F.rotation.set(0,f.current,0),j.scale.setScalar(d.scale*g.current));let L=c.current;if(L){let B=u&&v.current&&m.current;L.visible=B,B&&L.position.copy(p.current)}});let A=l&&d?d.offset:[0,0,0];return hb(oT,{children:[hb("mesh",{ref:c,visible:!1,rotation:[-Math.PI/2,0,0],children:[xs("ringGeometry",{args:[.05,.07,32]}),xs("meshBasicMaterial",{color:"#22d3ee",transparent:!0,opacity:.95})]}),xs("group",{ref:a,children:xs("group",{ref:s,children:xs("group",{position:A,children:i})})})]})}),mb=iT;import{useEffect as lc,useMemo as kr,useRef as hi}from"react";import{useFrame as aT,useThree as sT}from"@react-three/fiber";import{Box3 as lT,CatmullRomCurve3 as gb,Sphere as cT,Spherical as dT,Vector3 as mi}from"three";var uT=1.2;function Gu({controlsRef:e,sceneRef:t,config:n,playing:i,resetOnPlay:r=!1,onFinished:o,onUserInteract:a,onStop:s}){let c=sT(z=>z.invalidate),l=kr(()=>n.waypoints??[],[n.waypoints]),u=l.length>=2,d=n.loop??!0,h=kr(()=>{if(l.length<2)return 24;let z=0;for(let A=0;A<l.length-1;A++)z+=l[A].segmentDuration??3.5;return d&&l.length>1&&(z+=l[l.length-1].segmentDuration??3.5),Math.max(z,4)},[l,d]),g=n.duration??h,f=kr(()=>l.map(z=>[...z.position,...z.target,z.azimuthAngle??"",z.polarAngle??"",z.segmentDuration??""].join(",")).join(";"),[l]),v=kr(()=>{let z=[];if(l.length<2)return z;let A=0;for(let F=0;F<l.length-1;F++)A+=l[F].segmentDuration??3.5,z.push(A);return d&&l.length>1&&(A+=l[l.length-1].segmentDuration??3.5,z.push(A)),z},[l,d]),_=kr(()=>z=>{if(l.length<2||v.length===0)return z/g;let A=v[v.length-1],F=d?z%g:Math.min(z,g),j=g>0?F/g*A:0;for(let L=0;L<v.length;L++)if(j<=v[L]){let B=L===0?0:v[L-1],G=v[L]-B,U=G>0?(j-B)/G:0,oe=d?l.length:l.length-1,ve=L/oe,de=1/oe;return ve+U*de}return 1},[l.length,v,g,d]),y=kr(()=>u?{position:new gb(l.map(z=>new mi(...z.position)),d,"catmullrom",.5),target:new gb(l.map(z=>new mi(...z.target)),d,"catmullrom",.5)}:null,[f,u,d]),p=kr(()=>{if(!u||!l.every(A=>Number.isFinite(A.azimuthAngle)&&Number.isFinite(A.polarAngle)))return null;let z=l.map(A=>({azimuth:A.azimuthAngle,polar:A.polarAngle,distance:new mi(...A.position).distanceTo(new mi(...A.target))}));for(let A=1;A<z.length;A+=1){let F=z[A-1].azimuth,j=z[A].azimuth;z[A].azimuth=j+Math.round((F-j)/(Math.PI*2))*Math.PI*2}return z},[f,u]),m=hi(0),S=hi(0),M=hi(new mi),T=hi(new mi),R=hi(!1),b=hi(0),C=hi(!1),x=hi(null),P=kr(()=>new mi,[]),I=kr(()=>new mi,[]),E=kr(()=>new dT,[]);return lc(()=>{m.current=0,b.current=0,S.current=0,C.current=!1},[f,d,g]),lc(()=>{r&&(b.current=0,m.current=0,C.current=!1)},[r]),lc(()=>{if(!i){R.current=!1,m.current>0&&!r?b.current=m.current:r&&(b.current=0),(m.current>0||C.current)&&s?.();return}m.current>=g&&!d&&(m.current=0,b.current=0,C.current=!1);let z=e.current;if(z&&(z.getPosition(M.current),z.getTarget(T.current)),r||C.current||b.current===0?(m.current=0,b.current=0,C.current=!1):b.current>0&&b.current<g?m.current=b.current:(m.current=0,b.current=0),S.current=0,!u){let A=t.current;if(A){let F=new lT().setFromObject(A).getBoundingSphere(new cT);x.current={center:F.center.clone(),radius:F.radius>0?F.radius:1}}}R.current=!0,c()},[i,u,e,t,c,g,d,f,r,s]),lc(()=>{if(!i||!a)return;let z=e.current;if(!z)return;let A=()=>{C.current||a()};return z.addEventListener("controlstart",A),()=>z.removeEventListener("controlstart",A)},[i,e,a]),aT((z,A)=>{if(!i||!R.current)return;let F=e.current;if(!F)return;m.current+=A,S.current+=A;let j=_(m.current),L=!d&&m.current>=g;if(j=d?j%1:Math.min(j,1),y)if(y.target.getPoint(j,I),p){let G=d?p.length:p.length-1,U=Math.min(j,1)*G,oe=Math.min(Math.floor(U),G-1),ve=(oe+1)%p.length,de=j>=1?1:U-oe,we=de*de*(3-2*de),xe=p[oe],Ce=p[ve],Ye=Ce.azimuth+Math.round((xe.azimuth-Ce.azimuth)/(Math.PI*2))*Math.PI*2,gt=xe.azimuth+(Ye-xe.azimuth)*we,Fe=xe.polar+(Ce.polar-xe.polar)*we,Ae=xe.distance+(Ce.distance-xe.distance)*we;E.set(Math.max(Ae,1e-6),Math.min(Math.max(Fe,1e-6),Math.PI-1e-6),gt),P.setFromSpherical(E).add(I)}else y.position.getPoint(j,P);else{let G=x.current;if(!G)return;let U=j*Math.PI*2,oe=G.radius*2.2;P.set(G.center.x+Math.cos(U)*oe,G.center.y+G.radius*.6,G.center.z+Math.sin(U)*oe),I.copy(G.center)}let B=Math.min(S.current/uT,1);if(B<1){let G=B*B*(3-2*B);P.lerpVectors(M.current,P,G),I.lerpVectors(T.current,I,G)}if(F.setLookAt(P.x,P.y,P.z,I.x,I.y,I.z,!1),L){R.current=!1,C.current=!0,m.current=0,b.current=0,o?.();return}c()}),null}import{useEffect as fT,useState as bT}from"react";var pT="ri:license-grant:v1",hT={"260cd89ea13f":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwjr3ofKTkkcxOM0GYl/RlJj9JsuyjSF8sYmCd2YqsHJCEO8EvlNDrO2Kl4agFKo6dRhyR2/oWeiU6P9WIqRbvw=="},fb=new Map;function xb(e){let t=atob(e);return Uint8Array.from(t,n=>n.charCodeAt(0)).buffer}function bb(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");return xb(t.padEnd(Math.ceil(t.length/4)*4,"="))}function mT(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 cc(e){let t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e.trim())),n=String.fromCharCode(...new Uint8Array(t));return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function Hu(e,t){return`${pT}:${t}:${e}`}function gT(e,t){let n=fb.get(e);if(n)return n;let i=crypto.subtle.importKey("spki",xb(t),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]);return fb.set(e,i),i}async function Wu(e,t,n){if(!globalThis.crypto?.subtle)return null;try{let[i,r,o,a,...s]=e.split("."),c=hT[r];if(i!=="ri1"||!c||!o||!a||s.length>0)return null;let l=JSON.parse(new TextDecoder().decode(bb(o)));if(!mT(l)||!await crypto.subtle.verify({name:"ECDSA",hash:"SHA-256"},await gT(r,c),bb(a),new TextEncoder().encode(`${i}.${r}.${o}`)))return null;let d=Math.floor(Date.now()/1e3),h=l.expiresAt-l.issuedAt;return l.licenseKeyHash!==t||l.domain!==n||l.expiresAt<=d||l.issuedAt>d+300||h<=0||h>43200?null:{environment:l.environment,tier:l.tier,expiresAt:l.expiresAt}}catch{return null}}async function yb(e,t,n){try{return await Wu(e,await cc(t),n)}catch{return null}}async function vb(e,t,n){try{let i=await cc(t);return await Wu(e,i,n)?(localStorage.setItem(Hu(i,n),e),!0):!1}catch{return!1}}async function wb(e,t){try{let n=await cc(e),i=Hu(n,t),r=localStorage.getItem(i);if(!r)return null;let o=await Wu(r,n,t);return o||localStorage.removeItem(i),o}catch{return null}}async function $u(e,t){try{let n=await cc(e);localStorage.removeItem(Hu(n,t))}catch{}}var xT=["localhost","127.0.0.1","0.0.0.0"],yT=e=>xT.includes(e)||e.endsWith(".local")||e.endsWith(".localhost"),Sb="https://react-immersive.liveroom.dev/api/validate-license",vT=()=>typeof window<"u",wT=300*1e3,CT=5e3,ST=400,qu=new Map,Xu=new Map,gi=class extends Error{},Mb=async(e,t,n)=>{let i=await wb(e,t);return i?(console.warn("[react-immersive] License server unreachable \u2014 using a previously verified, time-limited offline grant."),{status:"valid",reason:"Previously verified offline grant",environment:i.environment,tier:i.tier,isLocalDomain:n}):null},Cb=async(e,t,n)=>{let i=await Mb(e,t,n);return i||(console.warn("[react-immersive] License server unreachable and no valid offline grant is available \u2014 license validation failed."),{status:"invalid",reason:"Could not reach license server",isLocalDomain:n})},MT=e=>e instanceof gi||e instanceof TypeError,TT=()=>new Promise(e=>setTimeout(e,ST)),PT=e=>e==="development"||e==="production",_T=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&&!PT(t.environment)||t.tier!==void 0&&typeof t.tier!="string"||t.offlineGrant!==void 0&&typeof t.offlineGrant!="string")},kT=e=>{if(!e||typeof e!="object")return null;let t=e,n=t.reason??t.error;return typeof n=="string"&&n.trim()?n:null},AT=(e,t,n)=>`${n}::${e}::${t}`,ET=e=>{let t=qu.get(e);return t?Date.now()-t.timestamp>wT?(qu.delete(e),null):t.result:null},RT=(e,t)=>({status:e.valid?"valid":"invalid",reason:e.reason,environment:e.environment,tier:e.tier,isLocalDomain:t}),LT=(e,t)=>({status:"invalid",reason:e,isLocalDomain:t});async function BT(e,t,n,i){let r=AT(e,t,i),o=ET(r);if(o)return o;let a=Xu.get(r);if(a)return a;let s=(async()=>{for(let c=0;c<2;c+=1)try{return await OT(e,t,n,r,i)}catch(l){if(!MT(l))throw l;if(c===0){let u=await Mb(e,t,n);if(u)return u;await TT();continue}return Cb(e,t,n)}return Cb(e,t,n)})().finally(()=>{Xu.delete(r)});return Xu.set(r,s),s}async function OT(e,t,n,i,r){let o=new AbortController,a=setTimeout(()=>o.abort(),CT),s;try{s=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},cache:"no-store",signal:o.signal,body:JSON.stringify({licenseKey:e,domain:t})})}catch(u){throw o.signal.aborted?new gi("License validation timed out"):u}finally{clearTimeout(a)}let c;try{c=await s.json()}catch{throw new gi(`License server returned a non-JSON response${s.status?` (${s.status})`:""}`)}if(!s.ok){if(s.status===429||s.status>=500)throw new gi(`License server error (${s.status})`);let u=kT(c)??`License validation failed${s.status?` (${s.status})`:""}`;return await $u(e,t),LT(u,n)}if(!_T(c))throw new gi("License server returned an unexpected payload");let l=RT(c,n);if(l.status==="valid"&&r!==Sb){let u=c.offlineGrant?await yb(c.offlineGrant,e,t):null;if(!u)throw new gi("License validation endpoint did not return a verifiable signed grant");l={...l,environment:u.environment,tier:u.tier}}return l.status==="valid"?(qu.set(i,{result:l,timestamp:Date.now()}),c.offlineGrant&&(await vb(c.offlineGrant,e,t)||console.warn("[react-immersive] The license server returned an invalid offline grant; it was not cached."))):await $u(e,t),l}var dc=(e,t=Sb)=>{let[n,i]=bT({status:"checking",isLocalDomain:!1});return fT(()=>{if(!vT())return;let r=!1,o=u=>{r||i(u)},a=e.trim(),s=window.location.hostname.toLowerCase(),c=yT(s);return o({status:"checking",isLocalDomain:c}),a?((async()=>{try{o(await BT(a,s,c,t))}catch(u){let d=u instanceof TypeError?"Could not reach license server":u instanceof Error?u.message:"License validation failed";o({status:"invalid",reason:d,isLocalDomain:c})}})(),()=>{r=!0}):(o({status:"invalid",reason:"No license key provided",isLocalDomain:c}),()=>{r=!0})},[e,t]),n};import{useRef as Qi,useState as DT,useCallback as Ar,useEffect as NT}from"react";import{jsx as Un,jsxs as Yu}from"react/jsx-runtime";var IT={up:{width:38,height:22},down:{width:38,height:22},left:{width:22,height:38},right:{width:22,height:38}},zT={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"},uc=({direction:e})=>{let t=IT[e],n=zT[e];return Yu("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:[Un("polyline",{points:n,stroke:"rgba(0, 0, 0, 0.9)",strokeWidth:"6",strokeLinecap:"round",strokeLinejoin:"round"}),Un("polyline",{points:n,stroke:"#2095F2",strokeWidth:"4",strokeLinecap:"round",strokeLinejoin:"round"})]})},qr=16,jT={"bottom-left":{bottom:qr,left:qr,top:"auto",right:"auto",transform:"none"},"bottom-right":{bottom:qr,right:qr,top:"auto",left:"auto",transform:"none"},"top-left":{top:qr,left:qr,bottom:"auto",right:"auto",transform:"none"},"top-right":{top:qr,right:qr,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:qr,left:"50%",bottom:"auto",right:"auto",transform:"translateX(-50%)"}},VT=({controlsRef:e,enabled:t=!0,opacity:n=.9,moveSensitivity:i=.001,rotateSensitivity:r=.01,position:o="center-bottom"})=>{let a=Qi(null),[s,c]=DT({x:0,y:0}),l=Qi(!1),u=Qi({x:0,y:0}),d=Qi(),h=Qi(),g=Qi(null),f=Qi(0),v=()=>e.current,_=(E,z,A)=>{let F=Math.hypot(E,z);if(F>A){let j=A/F;return{x:E*j,y:z*j}}return{x:E,y:z}},y=E=>{let A=Math.abs(E);return A<.12?0:Math.sign(E)*((A-.12)/(1-.12))},p=Ar(()=>{let E=()=>{let{x:z,y:A}=u.current,F=y(z),j=y(A);if(t&&(F!==0||j!==0)){let L=v();L&&L.rotate(-F*r,-j*r,!0)}d.current=requestAnimationFrame(E)};d.current=requestAnimationFrame(E)},[t,r]),m=Ar(()=>{d.current&&cancelAnimationFrame(d.current)},[]),S=Ar((E,z)=>{if(!a.current||!l.current)return;let A=a.current.getBoundingClientRect(),F=A.left+A.width/2,j=A.top+A.height/2,L=A.width/2-18,B=E-F,G=z-j,U=_(B,G,L);c(U),u.current={x:U.x/L,y:U.y/L}},[]),M=Ar(E=>{if(!t)return;E.preventDefault(),E.stopPropagation(),l.current=!0,p();let z="touches"in E?E.touches[0]:E;S(z.clientX,z.clientY)},[t,p,S]),T=Ar(E=>{if(!l.current)return;E.preventDefault();let z="touches"in E?E.touches[0]:E;S(z.clientX,z.clientY)},[S]),R=Ar(()=>{l.current=!1,c({x:0,y:0}),u.current={x:0,y:0},m()},[m]),b=i*10,C=Ar(E=>{t&&v()?.forward(E*b,!0)},[t,b]),x=Ar(E=>{t&&v()?.truck(E*b,0,!0)},[t,b]),P=Ar((E,z,A)=>{if(!t)return;h.current&&cancelAnimationFrame(h.current),g.current={control:E,amount:z,action:A},f.current=0,A(z);let F=j=>{if(!g.current)return;if(f.current===0){f.current=j,h.current=requestAnimationFrame(F);return}if(j-f.current>200){let{amount:B,action:G}=g.current;G(B),f.current=j}h.current=requestAnimationFrame(F)};h.current=requestAnimationFrame(F)},[t]),I=Ar(E=>{g.current?.control===E&&(h.current&&(cancelAnimationFrame(h.current),h.current=void 0),g.current=null,f.current=0)},[]);return NT(()=>(window.addEventListener("mousemove",T),window.addEventListener("mouseup",R),window.addEventListener("touchmove",T,{passive:!1}),window.addEventListener("touchend",R),window.addEventListener("touchcancel",R),()=>{window.removeEventListener("mousemove",T),window.removeEventListener("mouseup",R),window.removeEventListener("touchmove",T),window.removeEventListener("touchend",R),window.removeEventListener("touchcancel",R),m(),h.current&&cancelAnimationFrame(h.current)}),[T,R,m]),t?Un("div",{className:"mc__wrapper",style:{opacity:n,...jT[o]},children:Yu("div",{className:"mc__dpad",children:[Un("button",{"aria-label":"Move forward",className:"mc__arrow mc__arrow--up",onMouseDown:()=>P("up",1,C),onMouseUp:()=>I("up"),onMouseLeave:()=>I("up"),onTouchStart:E=>{E.preventDefault(),P("up",1,C)},onTouchEnd:()=>I("up"),onTouchCancel:()=>I("up"),children:Un(uc,{direction:"up"})}),Yu("div",{className:"mc__middle-row",children:[Un("button",{"aria-label":"Move left",className:"mc__arrow mc__arrow--left",onMouseDown:()=>P("left",-1,x),onMouseUp:()=>I("left"),onMouseLeave:()=>I("left"),onTouchStart:E=>{E.preventDefault(),P("left",-1,x)},onTouchEnd:()=>I("left"),onTouchCancel:()=>I("left"),children:Un(uc,{direction:"left"})}),Un("div",{ref:a,className:"mc__joystick",onMouseDown:M,onTouchStart:M,children:Un("div",{className:"mc__knob",style:{transform:`translate(${s.x}px, ${s.y}px)`}})}),Un("button",{"aria-label":"Move right",className:"mc__arrow mc__arrow--right",onMouseDown:()=>P("right",1,x),onMouseUp:()=>I("right"),onMouseLeave:()=>I("right"),onTouchStart:E=>{E.preventDefault(),P("right",1,x)},onTouchEnd:()=>I("right"),onTouchCancel:()=>I("right"),children:Un(uc,{direction:"right"})})]}),Un("button",{"aria-label":"Move backward",className:"mc__arrow mc__arrow--down",onMouseDown:()=>P("down",-1,C),onMouseUp:()=>I("down"),onMouseLeave:()=>I("down"),onTouchStart:E=>{E.preventDefault(),P("down",-1,C)},onTouchEnd:()=>I("down"),onTouchCancel:()=>I("down"),children:Un(uc,{direction:"down"})})]})}):null},Tb=VT;import{HexColorPicker as FT}from"react-colorful";import{jsx as pc,jsxs as Pb}from"react/jsx-runtime";var Ku=({colorPicker:e,onClose:t,itemMaterials:n,setItemMaterials:i,inline:r=!1})=>Pb("div",{className:`ri-popover${r?" ri-popover--inline":""}`,style:r?{padding:12}:{left:e.x,top:e.y,width:"min(225px, calc(100vw - 24px))",padding:12},onPointerDown:o=>o.stopPropagation(),children:[pc("p",{className:"ri-popoverLabel",children:"Color"}),pc(FT,{color:n[e.objectId]?.hex??"#ffffff",onChange:o=>i(a=>({...a,[e.objectId]:{...a[e.objectId],hex:o}}))}),Pb("div",{className:"ri-inlineRow",children:[pc("span",{className:"ri-colorCode",children:n[e.objectId]?.hex??"#ffffff"}),pc("button",{className:"ri-secondaryButton",onClick:t,children:"Done"})]})]});import{jsx as Er,jsxs as Ju}from"react/jsx-runtime";var Qu=({materialPopup:e,textureUrl:t,triggerFileUpload:n,clearTexture:i,inline:r=!1})=>Ju("div",{className:`ri-popover${r?" ri-popover--inline":""}`,style:r?{overflow:"hidden"}:{left:e.x,top:e.y,width:"min(300px, calc(100vw - 24px))",overflow:"hidden"},onPointerDown:o=>o.stopPropagation(),children:[Er("div",{className:"ri-popoverHeader",children:Er("p",{className:"ri-popoverLabel",style:{marginBottom:0},children:"Material"})}),Ju("div",{className:"ri-materialBody",children:[t?Er("div",{className:"ri-previewFrame",children:Er("img",{src:t,alt:"texture preview",className:"ri-previewImage"})}):Ju("div",{className:"ri-emptyState",children:[Er("svg",{width:"24",height:"24",fill:"none",stroke:"currentColor",strokeWidth:1.5,viewBox:"0 0 24 24",children:Er("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"})}),Er("span",{style:{fontSize:12},children:"No texture applied"})]}),Er("button",{onClick:()=>n(e.objectId),className:"ri-uploadButton",children:t?"Replace image":"Upload image"}),t&&Er("button",{onClick:()=>i(e.objectId),className:"ri-removeButton",children:"Remove texture"}),Er("p",{className:"ri-formatHint",children:"JPG \xB7 PNG \xB7 WebP"})]})]});import{Fragment as UT,useEffect as Zu,useRef as GT,useState as ep}from"react";import{Fragment as tp,jsx as un,jsxs as Zo}from"react/jsx-runtime";function _b({entries:e}){return un(tp,{children:e.map(([t,n])=>{let i=n!==null&&typeof n=="object",r=i?Object.entries(n):[];return i&&r.length>0?Zo("div",{className:"left-panel__data-group",children:[un("span",{className:"left-panel__data-key",children:t}),un("div",{className:"left-panel__data-children",children:un(_b,{entries:r})})]},t):Zo("div",{className:"left-panel__data-row",children:[un("span",{className:"left-panel__data-key",children:t}),un("span",{className:`left-panel__data-value left-panel__data-value--${typeof n}`,children:i?Array.isArray(n)?"[]":"{}":String(n)})]},t)})})}function HT({content:e}){let t=e!=null,[n,i]=ep(t),[r,o]=ep(t),a=GT(e);return t&&(a.current=e),Zu(()=>{if(t){i(!0);return}if(n){o(!1);let s=setTimeout(()=>i(!1),300);return()=>clearTimeout(s)}},[t,n]),Zu(()=>{if(n&&t){let s=requestAnimationFrame(()=>o(!0));return()=>cancelAnimationFrame(s)}},[n,t]),n?un("div",{className:`left-panel__action-extra${r?" left-panel__action-extra--open":""}`,children:un("div",{className:"left-panel__action-extra-inner",children:e??a.current})}):null}function np({isOpen:e,selectedObject:t,currentAction:n,onClose:i,onAction:r,renderActionExtra:o}){let[a,s]=ep(t);Zu(()=>{t&&s(t)},[t]);let c=t??a,l=c?Object.entries(c).filter(([u])=>u!=="actions"):[];return un("div",{className:`left-panel ${e?"left-panel--open":"left-panel--closed"}`,children:c&&Zo(tp,{children:[Zo("div",{className:"left-panel__header",children:[un("p",{className:"left-panel__title",children:c.label}),un("button",{onClick:i,className:"left-panel__close-btn","aria-label":"Close panel",children:"\u2715"})]}),l.length>0&&un("div",{className:"left-panel__data",children:un(_b,{entries:l})}),un("hr",{className:"left-panel__divider"}),c.actions&&c.actions.length>0&&Zo(tp,{children:[un("div",{className:"left-panel__actions-label",children:"Actions"}),un("div",{className:"left-panel__actions-list",children:c.actions.map((u,d)=>{let h=n?.action.id===u.id&&(n.binding===c||n.binding?.id===c.id||n.binding?.modelObjectId===c.modelObjectId||n.objectId===c.id||n.objectId===c.modelObjectId),g=o?.(u.id);return Zo(UT,{children:[un("button",{onClick:f=>r({objectId:c.modelObjectId||c.id||"",action:u,binding:c,screenX:f.clientX,screenY:f.clientY}),className:["left-panel__action-btn",`left-panel__action-btn--${u.id}`,h?"left-panel__action-btn--active":""].filter(Boolean).join(" "),"data-action-id":u.id,"data-label":u.label,children:u.label}),un(HT,{content:g})]},d)})})]})]})})}import{useMemo as $T,useState as Ab}from"react";import{Boxes as XT}from"lucide-react";import{useState as WT}from"react";import{jsx as Yr,jsxs as ys}from"react/jsx-runtime";function kb({openButtonLabel:e,openButtonAriaLabel:t,eyebrow:n,title:i,searchValue:r,onSearchChange:o,searchPlaceholder:a,children:s,isOpen:c,onToggle:l,openButtonIcon:u,closeButtonIcon:d,closeButtonAriaLabel:h}){let[g,f]=WT(!1),v=c!==void 0?c:g,_=y=>{c===void 0&&f(y),l?.(y)};return ys("div",{className:`ri-sidepanel-wrap ${v?"ri-sidepanel-wrap--open":"ri-sidepanel-wrap--closed"}`,children:[!v&&ys("button",{type:"button",className:"ri-sidepanel__open-btn",onClick:()=>_(!0),"aria-label":t,title:"Open panel",children:[u,e?Yr("span",{children:e}):null]}),ys("div",{className:`ri-sidepanel ${v?"ri-sidepanel--open":"ri-sidepanel--closed"}`,"aria-hidden":!v,children:[ys("div",{className:"ri-sidepanel__header",children:[ys("div",{className:"ri-sidepanel__header-top",children:[Yr("span",{className:"ri-sidepanel__eyebrow",children:n}),Yr("button",{type:"button",className:"ri-sidepanel__close-btn",onClick:()=>_(!1),"aria-label":h,title:"Close",children:d??Yr("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:Yr("path",{d:"M1 1L11 11M11 1L1 11",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"})})})]}),Yr("p",{className:"ri-sidepanel__title",children:i})]}),Yr("div",{className:"ri-sidepanel__search-wrap",children:Yr("input",{className:"ri-sidepanel__search",type:"text",placeholder:a,value:r,onChange:y=>o(y.target.value)})}),Yr("div",{className:"ri-sidepanel__list",children:s})]})]})}import{jsx as Zi,jsxs as qT}from"react/jsx-runtime";function rp({objectBindings:e,onAction:t,onFocus:n,onHover:i,isOpen:r,onToggle:o}){let[a,s]=Ab(null),[c,l]=Ab(""),u=$T(()=>Object.entries(e).filter(([d,h])=>{let g=c.toLowerCase();return d.toLowerCase().includes(g)||(h.label??"").toLowerCase().includes(g)}),[e,c]);return Zi(kb,{openButtonLabel:"",openButtonAriaLabel:"Open scene objects panel",openButtonIcon:Zi(XT,{width:16,height:16,"aria-hidden":"true"}),eyebrow:"SCENE OBJECTS",title:`${u.length} visible entries`,searchValue:c,onSearchChange:l,searchPlaceholder:"Search nodes, labels",isOpen:r,onToggle:o,closeButtonAriaLabel:"Close scene objects panel",children:u.map(([d,h])=>{let g=h.visible!==!1,f=a===d;return qT("div",{onClick:()=>n(h),onMouseEnter:()=>{s(d),i?.(h)},onMouseLeave:()=>{s(null),i?.(null)},className:`ri-sidepanel__row${f?" ri-sidepanel__row--hovered":""}`,children:[Zi("span",{className:`ri-sidepanel__label${f?" ri-sidepanel__label--hovered":""}`,children:h.label??d}),Zi("button",{type:"button",onClick:v=>{v.stopPropagation(),t?.({objectId:d,action:{id:"toggle-visibility",label:"Toggle Visibility",type:"command"},binding:h})},className:"ri-sidepanel__vis-btn",title:g?"Hide":"Show",children:Zi("span",{className:`ri-sidepanel__checkbox${g?" ri-sidepanel__checkbox--checked":""}`,children:g&&Zi("svg",{width:"9",height:"9",viewBox:"0 0 10 10",fill:"none",children:Zi("path",{d:"M1.5 5L4 7.5L8.5 2.5",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})})})})]},d)})})}import{AlertTriangle as hp,Box as ex,Camera as D2,Download as N2,Eraser as I2,FileImage as z2,RotateCcw as j2,ChevronLeft as V2,Square as tx,ChevronRight as F2,RectangleGoggles as U2,QrCode as G2,X as mp,Expand as H2,Play as W2,Pause as $2,Smartphone as nx,PencilRuler as X2,RulerDimensionLine as q2,Grid3X3 as Y2}from"lucide-react";import{createContext as YT,useContext as KT}from"react";var ip=YT({isInsideEditor:!1,activeTab:"object",activeSubTab:"General",tier:"free"});var nr=()=>KT(ip);import{jsx as Eb,jsxs as JT}from"react/jsx-runtime";function ea({visible:e,message:t,tone:n="default",spinner:i=!0}){return e?JT("div",{className:"bb-loadingOverlay",role:"status","aria-live":"polite",children:[i&&Eb("span",{className:"bb-loadingSpinner","aria-hidden":"true"}),Eb("span",{className:`bb-loadingMessage bb-status--${n}`,children:t})]}):null}var op=new WeakSet;function ta(e){op.add(e)}function Rb(e){let t=op.has(e);return t&&op.delete(e),t}import{useRef as Mt,useEffect as vs,useMemo as Kr,useSyncExternalStore as t2}from"react";import{useThree as n2,useFrame as r2}from"@react-three/fiber";import{Sphere as i2,Line as o2}from"@react-three/drei";import{Vector3 as Ht,Vector2 as a2,AdditiveBlending as ap,Plane as Db,TextureLoader as s2}from"three";var Lb="data:image/png;base64,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";var Bb="data:image/png;base64,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";var Ob="data:image/png;base64,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";import{Fragment as x2,jsx as We,jsxs as Cn}from"react/jsx-runtime";var na=-100,ra=100,Hb=.03,l2=.03,c2=.03,Nb=.5,d2=Lb,u2=Bb,p2=Ob,h2=Math.PI/4,Ib=.4,oa=64,zb=Hb*3,sp="#4d7dff",jb="#ffcc00",Vb=.02,Wb=new Ht(0,1,0),hc=32,Fb="#ff9d3d",mc=4,Rr=1.4,gc=.35,m2=.13,Ub=.12,Gb=.055,g2={x:"#ff4444",y:"#44ff44",z:"#4444ff"};function $b(e){return new Ht(e==="x"?1:0,e==="y"?1:0,e==="z"?1:0)}function f2(e,t){let n=$b(e);t.lengthSq()<1e-8&&(t=n.clone());let i=new Ht().crossVectors(n,new Ht().crossVectors(t,n));if(i.lengthSq()<1e-8){let r=Math.abs(n.y)<.9?Wb:new Ht(1,0,0);i=new Ht().crossVectors(n,r)}return i.normalize()}function lp(e){let t=new Float32Array((oa+1)*3);for(let n=0;n<=oa;n++){let i=n/oa*Math.PI*2,r=Math.cos(i)*Ib,o=Math.sin(i)*Ib,a=0,s=0,c=0;e==="x"?(s=r,c=o):e==="y"?(a=r,c=o):(a=r,s=o),t[n*3]=a,t[n*3+1]=s,t[n*3+2]=c}return t}function b2(e){let t=Math.abs(e.y)<.99?new Ht(0,1,0):new Ht(1,0,0),n=new Ht().crossVectors(e,t).normalize(),i=new Ht().crossVectors(e,n).normalize();return[n,i]}function ia(e,t,n){return Math.min(Math.max(e,t),n)}var aa=null,cp=new Set;function ws(e){aa!==e&&(aa=e,cp.forEach(t=>t()))}function dp(e){return cp.add(e),()=>cp.delete(e)}function fc(){return aa}function Xb({light:e,position:t,color:n,intensity:i,visible:r,onPositionChange:o,onDraggingChange:a}){let{activeTab:s,activeSubTab:c,setActiveTab:l,setActiveSubTab:u}=nr(),{camera:d,gl:h,raycaster:g,invalidate:f}=n2(),v=Mt(null),_=Mt(null),y=Mt(null),p=Mt(null),m=Mt(null),S=Mt(null),M=Mt(null),T=Mt(null),R=Mt(null),b=Mt(null),C=Mt(null),x=Mt(null),P=Mt(null),I=Mt(null),E=Mt(null),z=Mt(null),A=Mt(null),F=Mt({dragging:!1,axis:null}),j=Mt(new Db),L=Mt(new Ht),B=Mt(null),G=Mt(null),U=Mt(new Ht),oe=Mt(!1),ve=Mt(new Db),de=Mt(a);vs(()=>{de.current=a},[a]);let we=Kr(()=>new Ht(t[0],t[1],t[2]),[t]),xe=Kr(()=>new Float32Array(6),[]),Ce=Kr(()=>new Float32Array(6),[]),Ye=Kr(()=>lp("x"),[]),gt=Kr(()=>lp("y"),[]),Fe=Kr(()=>lp("z"),[]),Ae=Kr(()=>new Float32Array((hc+1)*3),[]),Y=Kr(()=>new Float32Array(mc*2*3),[]),tt=e?.type==="point",Be=e?.type==="spot",$t=tt?u2:Be?p2:d2,Ue=tt?l2:Be?c2:Hb,Pt=Kr(()=>new s2().load($t),[$t]),_t=t2(dp,fc,fc),Ee=!!e&&_t===e.id;if(vs(()=>{oe.current||(U.current.copy(we),f())},[we,f]),vs(()=>{e&&aa===e.id&&!r&&ws(null)},[e?.id,r]),vs(()=>()=>{e&&aa===e.id&&ws(null)},[e?.id]),r2(()=>{if(v.current&&v.current.position.copy(U.current),y.current){y.current.lookAt(d.position);let te=d,ae;te.isOrthographicCamera?ae=Ue/te.zoom:ae=d.position.distanceTo(U.current)*Ue,y.current.scale.setScalar(ae)}if(M.current){let te=d,ae;te.isOrthographicCamera?ae=zb/te.zoom:ae=d.position.distanceTo(U.current)*zb,M.current.scale.setScalar(ae)}if(C.current){let te=d,ae;te.isOrthographicCamera?ae=Gb/te.zoom:ae=d.position.distanceTo(U.current)*Gb,C.current.scale.setScalar(ae)}if(m.current){let te=m.current.getAttribute("position"),ae=te.array;ae[0]=0,ae[1]=0,ae[2]=0,ae[3]=U.current.x,ae[4]=U.current.y,ae[5]=U.current.z,te.needsUpdate=!0,m.current.computeBoundingSphere()}if(S.current){let te=U.current,ae=te.length();S.current.visible=ae>Nb,ae>1e-6&&(S.current.position.copy(te).multiplyScalar(.5),S.current.scale.set(1,ae,1),S.current.quaternion.setFromUnitVectors(Wb,te.clone().normalize()))}if(p.current&&(p.current.visible=U.current.length()>Nb),Be&&T.current&&R.current&&b.current){let te=U.current,ae=te.length();if(ae>1e-6){T.current.visible=!0;let ft=te.clone().negate().normalize(),re=ae,le=e?.angle??Math.PI/6,he=re*Math.tan(le),Oe=te.clone().add(ft.clone().multiplyScalar(re)),[nt,Re]=b2(ft),De=R.current.getAttribute("position"),rt=De.array;for(let Ke=0;Ke<=hc;Ke++){let ke=Ke/hc*Math.PI*2,dt=Oe.x+(nt.x*Math.cos(ke)+Re.x*Math.sin(ke))*he,ut=Oe.y+(nt.y*Math.cos(ke)+Re.y*Math.sin(ke))*he,bt=Oe.z+(nt.z*Math.cos(ke)+Re.z*Math.sin(ke))*he;rt[Ke*3]=dt,rt[Ke*3+1]=ut,rt[Ke*3+2]=bt}De.needsUpdate=!0,R.current.computeBoundingSphere();let ce=b.current.getAttribute("position"),Pe=ce.array;for(let Ke=0;Ke<mc;Ke++){let ke=Ke/mc*Math.PI*2,dt=Oe.x+(nt.x*Math.cos(ke)+Re.x*Math.sin(ke))*he,ut=Oe.y+(nt.y*Math.cos(ke)+Re.y*Math.sin(ke))*he,bt=Oe.z+(nt.z*Math.cos(ke)+Re.z*Math.sin(ke))*he,Je=Ke*6;Pe[Je]=te.x,Pe[Je+1]=te.y,Pe[Je+2]=te.z,Pe[Je+3]=dt,Pe[Je+4]=ut,Pe[Je+5]=bt}ce.needsUpdate=!0,b.current.computeBoundingSphere()}else T.current.visible=!1}if(B.current&&(B.current.visible=F.current.dragging),G.current&&F.current.dragging){let te=G.current.getAttribute("position"),ae=te.array;ae[0]=L.current.x,ae[1]=L.current.y,ae[2]=L.current.z,ae[3]=U.current.x,ae[4]=U.current.y,ae[5]=U.current.z,te.needsUpdate=!0,G.current.computeBoundingSphere()}}),vs(()=>{let te=ce=>{let Pe=h.domElement.getBoundingClientRect();return new a2((ce.clientX-Pe.left)/Pe.width*2-1,-((ce.clientY-Pe.top)/Pe.height)*2+1)},ae=ce=>!!ce.target.closest?.("button, input, textarea, .ri-annotationPopup, .ri-colorPicker, .ri-materialPicker"),ft=()=>{let ce=[];return[x.current,E.current,P.current,z.current,I.current,A.current].forEach(Pe=>{Pe&&ce.push(Pe)}),ce},re=ce=>ce===x.current||ce===E.current?"x":ce===P.current||ce===z.current?"y":ce===I.current||ce===A.current?"z":null,le=()=>{F.current.dragging&&(F.current={dragging:!1,axis:null},B.current&&(B.current.visible=!1),h.domElement.style.cursor="default",de.current?.(!1))},he=()=>{oe.current&&(oe.current=!1,h.domElement.style.cursor="default",de.current?.(!1))},Oe=ce=>{if(F.current.dragging&&F.current.axis){let ut=F.current.axis,bt=U.current,Je=$b(ut),Tn=new Ht().subVectors(d.position,bt),ue=f2(ut,Tn);j.current.setFromNormalAndCoplanarPoint(ue,bt);let k=te(ce);g.setFromCamera(k,d);let N=new Ht,H=g.ray.intersectPlane(j.current,N);if(!H)return;let X=H.clone().sub(bt).dot(Je),se=bt.clone().add(Je.clone().multiplyScalar(X)),ie=[ia(ut==="x"?se.x:bt.x,na,ra),ia(ut==="y"?se.y:bt.y,na,ra),ia(ut==="z"?se.z:bt.z,na,ra)];U.current.set(ie[0],ie[1],ie[2]),o?.(ie),f();return}if(!oe.current)return;let Pe=te(ce);g.setFromCamera(Pe,d);let Ke=new Ht,ke=g.ray.intersectPlane(ve.current,Ke);if(!ke)return;let dt=[ia(ke.x,na,ra),ia(ke.y,na,ra),ia(ke.z,na,ra)];U.current.set(dt[0],dt[1],dt[2]),o?.(dt),f()},nt=ce=>{if(ae(ce))return;let Pe=te(ce);if(g.setFromCamera(Pe,d),Ee){let dt=ft(),ut=dt.length?g.intersectObjects(dt,!1):[];if(ut.length>0){let bt=ut[0].object,Je=re(bt);if(Je){let Tn=U.current;F.current={dragging:!0,axis:Je},L.current.copy(Tn),de.current?.(!0),h.domElement.style.cursor="grabbing",h.domElement.setPointerCapture(ce.pointerId),ce.preventDefault(),ce.stopPropagation();return}}}let Ke=[];if(_.current&&Ke.push(_.current),y.current&&Ke.push(y.current),Ke.length===0)return;if(g.intersectObjects(Ke,!1).length>0){let dt=e?.id??null;aa!==dt&&(ws(dt),l?.("scene"),u?.("Lighting"));let ut=new Ht;d.getWorldDirection(ut),ve.current.setFromNormalAndCoplanarPoint(ut,U.current),oe.current=!0,de.current?.(!0),h.domElement.style.cursor="grabbing",h.domElement.setPointerCapture(ce.pointerId),ce.preventDefault(),ce.stopPropagation()}},Re=ce=>{if(F.current.dragging){le();try{h.domElement.releasePointerCapture(ce.pointerId)}catch{}}if(oe.current){he();try{h.domElement.releasePointerCapture(ce.pointerId)}catch{}}},De=()=>{le(),he()},rt=()=>{le(),he()};return h.domElement.addEventListener("pointerdown",nt),window.addEventListener("pointermove",Oe),window.addEventListener("pointerup",Re),window.addEventListener("pointercancel",De),window.addEventListener("blur",rt),()=>{h.domElement.removeEventListener("pointerdown",nt),window.removeEventListener("pointermove",Oe),window.removeEventListener("pointerup",Re),window.removeEventListener("pointercancel",De),window.removeEventListener("blur",rt)}},[d,g,h,f,o,e,l,u,Ee]),s!=="scene"||c!=="Lighting"||!e||!r||e.type==="none"||e.type==="hemisphere")return null;let Ne=["x","y","z"];return Cn("group",{ref:te=>{te&&jh(te)},children:[Cn("group",{ref:v,children:[We("sprite",{ref:y,children:We("spriteMaterial",{map:Pt,transparent:!0,opacity:.9,blending:ap,depthWrite:!1,rotation:Be?h2:0},$t)}),We(i2,{ref:_,args:[.25,16,16],children:We("meshBasicMaterial",{transparent:!0,opacity:.01})}),tt&&Cn("group",{ref:M,children:[Cn("lineLoop",{renderOrder:999,children:[We("bufferGeometry",{children:We("bufferAttribute",{attach:"attributes-position",args:[Ye,3],count:oa+1})}),We("lineBasicMaterial",{color:sp,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),Cn("lineLoop",{renderOrder:999,children:[We("bufferGeometry",{children:We("bufferAttribute",{attach:"attributes-position",args:[gt,3],count:oa+1})}),We("lineBasicMaterial",{color:sp,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),Cn("lineLoop",{renderOrder:999,children:[We("bufferGeometry",{children:We("bufferAttribute",{attach:"attributes-position",args:[Fe,3],count:oa+1})}),We("lineBasicMaterial",{color:sp,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]})]}),Ee&&We("group",{ref:C,children:Ne.map(te=>{let ae=g2[te],ft=new Ht(te==="x"?Rr:0,te==="y"?Rr:0,te==="z"?Rr:0),re=new Ht(te==="x"?Rr-gc/2:0,te==="y"?Rr-gc/2:0,te==="z"?Rr-gc/2:0),le=new Ht(te==="x"?Rr/2:0,te==="y"?Rr/2:0,te==="z"?Rr/2:0),he=te==="x"?[0,0,-Math.PI/2]:te==="y"?[0,0,0]:[Math.PI/2,0,0],Oe=te==="x"?x:te==="y"?P:I,nt=te==="x"?E:te==="y"?z:A;return Cn("group",{children:[We(o2,{points:[new Ht(0,0,0),ft],color:ae,transparent:!0,opacity:.9,lineWidth:2,depthTest:!1}),Cn("mesh",{ref:nt,position:le,rotation:he,children:[We("cylinderGeometry",{args:[Ub,Ub,Rr,8]}),We("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),Cn("mesh",{ref:Oe,position:re,rotation:he,children:[We("coneGeometry",{args:[m2,gc,8]}),We("meshBasicMaterial",{color:ae,depthTest:!1})]})]},te)})})]}),!tt&&!Be&&Cn(x2,{children:[Cn("mesh",{ref:S,children:[We("cylinderGeometry",{args:[Vb,Vb,1,8,1,!0]}),We("meshBasicMaterial",{color:jb,transparent:!0,opacity:.05,blending:ap,depthWrite:!1,depthTest:!1})]}),Cn("line",{ref:p,children:[We("bufferGeometry",{ref:m,children:We("bufferAttribute",{attach:"attributes-position",args:[xe,3],count:2})}),We("lineBasicMaterial",{color:jb,transparent:!0,opacity:.7,blending:ap})]})]}),Be&&Cn("group",{ref:T,children:[Cn("lineLoop",{renderOrder:999,children:[We("bufferGeometry",{ref:R,children:We("bufferAttribute",{attach:"attributes-position",args:[Ae,3],count:hc+1})}),We("lineBasicMaterial",{color:Fb,transparent:!0,opacity:.85,depthTest:!1,depthWrite:!1})]}),Cn("lineSegments",{renderOrder:999,children:[We("bufferGeometry",{ref:b,children:We("bufferAttribute",{attach:"attributes-position",args:[Y,3],count:mc*2})}),We("lineBasicMaterial",{color:Fb,transparent:!0,opacity:.5,depthTest:!1,depthWrite:!1})]})]}),Cn("line",{ref:te=>{B.current=te,te&&(te.visible=!1)},children:[We("bufferGeometry",{ref:G,children:We("bufferAttribute",{attach:"attributes-position",args:[Ce,3],count:2})}),We("lineBasicMaterial",{color:"#ffffff",transparent:!0,opacity:.6})]})]})}import{useCallback as up,useLayoutEffect as C2,useMemo as Lr,useRef as Jr}from"react";import{PivotControls as S2}from"@react-three/drei";import{useFrame as M2,useThree as T2}from"@react-three/fiber";import{Euler as Qb,Matrix4 as xc,Quaternion as yc,Vector3 as Cs}from"three";import{Box3 as qb,Euler as y2,Matrix4 as Yb,Quaternion as v2,Vector3 as fi}from"three";function bc(e){e.updateWorldMatrix(!0,!0);let t=new Yb().copy(e.matrixWorld).invert(),n=new qb,i=new qb,r=!1;return e.traverse(o=>{let a=o;if(!a.isMesh||!a.geometry||(a.geometry.boundingBox||a.geometry.computeBoundingBox(),!a.geometry.boundingBox))return;let s=new Yb().multiplyMatrices(t,o.matrixWorld);i.copy(a.geometry.boundingBox).applyMatrix4(s),n.union(i),r=!0}),r?n.getCenter(new fi):new fi}function Kb(e,t="XYZ"){return new v2().setFromEuler(new y2(e[0],e[1],e[2],t))}function w2(e,t,n,i,r="XYZ"){let a=new fi(...i).multiply(new fi(...n)).applyQuaternion(Kb(t,r)).add(new fi(...e));return[a.x,a.y,a.z]}function Jb(e,t,n,i,r,o="XYZ"){let a=new fi(...w2(e,t,i,r,o)),s=new fi(...r).multiply(new fi(...i)).applyQuaternion(Kb(n,o)),c=a.sub(s);return[c.x,c.y,c.z]}import{jsx as Zb}from"react/jsx-runtime";function pp({node:e,space:t,onTransformChange:n,onDraggingChange:i}){let r=T2(P=>P.invalidate),o=Lr(()=>bc(e),[e]),a=Lr(()=>new xc,[]),s=Jr(!1),c=Jr(new xc),l=Jr(new xc),u=Jr(null),d=Jr(0),h=Jr([]),g=Jr(null),f=Jr(i);f.current=i;let v=Lr(()=>new Cs,[]),_=Lr(()=>new yc,[]),y=Lr(()=>new Cs,[]),p=Lr(()=>new yc,[]),m=Lr(()=>new Cs(1,1,1),[]),S=Lr(()=>new yc,[]),M=Lr(()=>new Cs,[]),T=Lr(()=>new Cs,[]),R=Jr([0,0,0]),b=up(()=>{s.current||(e.updateWorldMatrix(!0,!1),v.copy(o).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(_),p.copy(_),t==="world"&&p.identity(),a.compose(v,p,m))},[v,a,p,m,e,o,t,_]);C2(()=>(b(),()=>{let P=g.current!==null;P&&(cancelAnimationFrame(g.current),g.current=null),(s.current||P)&&(s.current=!1,f.current(!1));for(let I of h.current)Fo(I);h.current=[]}),[b]),M2(()=>b());let C=up(()=>{g.current!==null&&(cancelAnimationFrame(g.current),g.current=null),e.updateWorldMatrix(!0,!0),h.current=[];for(let P of Vo(e))dg(P)||(Pl(P,P.matrixWorld),h.current.push(P));e.updateWorldMatrix(!0,!1),v.copy(o).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(_),e.getWorldScale(y),c.current.compose(v,_,y),l.current.copy(a),R.current=[e.rotation.x,e.rotation.y,e.rotation.z],u.current=null,s.current=!0,i(!0)},[v,a,e,i,o,_,y]),x=up((P,I)=>{let E=c.current.clone().premultiply(I),z=l.current.clone().premultiply(I);E.decompose(M,_,T);let A=M.clone();z.decompose(v,p,m),t==="world"&&p.identity(),a.compose(v,p,m),P.decompose(M,S,T);let F=new Qb().setFromQuaternion(S,e.rotation.order),[j,L,B]=R.current,G=[j+F.x,L+F.y,B+F.z],U=new yc().setFromEuler(new Qb(G[0],G[1],G[2],e.rotation.order)),ve=(e.parent?.matrixWorld||new xc).clone().invert(),de=A.clone().applyMatrix4(ve),we=o.clone().multiply(e.scale).applyQuaternion(U),xe=de.clone().sub(we),Ce=[xe.x,xe.y,xe.z];e.position.set(Ce[0],Ce[1],Ce[2]),e.rotation.set(G[0],G[1],G[2],e.rotation.order),e.updateMatrixWorld(!0),r(),u.current={position:Ce,rotation:G}},[v,S,a,p,m,r,e,o,M,T,t,_]);return Zb("group",{children:Zb(S2,{matrix:a,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableScaling:!0,onDragStart:C,onDrag:(P,I,E,z)=>x(I,z),onDragEnd:()=>{s.current=!1;let P=u.current;if(u.current=null,P)n(P),g.current=requestAnimationFrame(()=>{g.current=null,i(!1)});else if(h.current.length>0){for(let I of h.current)Fo(I);e.updateMatrixWorld(!0),r(),i(!1)}else i(!1);h.current=[]}})})}import{Fragment as eo,jsx as $,jsxs as Ve}from"react/jsx-runtime";function K2(e){let t=e.object;if(!t.isSkinnedMesh||!e.face||!t.skeleton)return null;let n=t.geometry,i=n.getAttribute("skinIndex"),r=n.getAttribute("skinWeight"),o=n.getAttribute("position");if(!i||!r||!o)return null;let a=t.worldToLocal(e.point.clone()),s=[e.face.a,e.face.b,e.face.c],c=new Dn,l=s[0],u=1/0;for(let g of s){c.fromBufferAttribute(o,g);let f=c.distanceToSquared(a);f<u&&(u=f,l=g)}let d=i.getComponent(l,0),h=r.getComponent(l,0);for(let g=1;g<4;g++){let f=r.getComponent(l,g);f>h&&(h=f,d=i.getComponent(l,g))}return t.skeleton.bones[d]??null}function J2(e){let t=K2(e)??e.object,n=Ha(t);if(!n)return null;t.updateWorldMatrix(!0,!1);let i=t.worldToLocal(e.point.clone());return{anchorNodeName:n,anchorLocalPosition:[i.x,i.y,i.z]}}function Q2(e,t,n){if(!e.anchorNodeName||!e.anchorLocalPosition)return!1;let i=gr(t,e.anchorNodeName);return i?(i.updateWorldMatrix(!0,!1),n.set(...e.anchorLocalPosition).applyMatrix4(i.matrixWorld),!0):!1}function Z2({annotation:e,enabled:t,controlsRef:n,offsetRef:i}){let r=E2(h=>h.scene),o=mt(null),a=mt(!1),s=kn(()=>new Dn,[]),c=kn(()=>new Dn,[]),l=kn(()=>new Dn,[]),u=e?.anchorNodeName,d=e?.anchorLocalPosition;return Et(()=>{o.current=null,a.current=!1},[u,e?.id]),A2(()=>{let h=n.current,g=i.current;if(!t||!h||!g||!u||!d){a.current=!1;return}let f=o.current;if((!f||!f.parent)&&(f=gr(r,u),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(g),h.setLookAt(l.x,l.y,l.z,s.x,s.y,s.z,!0))}),null}function eP(e){let t={total:0,missing:0};return e.traverse(n=>{let i=n;!i.isMesh||!i.geometry||(t.total+=1,i.geometry.getAttribute("uv")||(t.missing+=1))}),t}function tP(e,t){let n=t?.camera;if(!(n instanceof ix))return null;let r=(e instanceof sa?e:new sa().setFromObject(e)).getSize(new Dn).length();return!Number.isFinite(r)||r<=0?null:(n.near=r/100,n.far=r*100,n.updateProjectionMatrix(),t&&(t.maxDistance=r*10),r)}function nP(e,t){let n=e.camera;if(!(n instanceof ix)||!(t>0))return;let i=Math.min(Math.max(e.distance/200,t/1e5),t/100);Math.abs(i-n.near)<=n.near*.01||(n.near=i,n.updateProjectionMatrix())}async function rx(e,t,n=.6){let i=e.smoothTime;e.smoothTime=n;try{return await t()}finally{e.smoothTime=i}}function vc({modelUrl:e,tilesetUrl:t,tilesErrorTarget:n=8,tilesCacheSize:i=800,onObjectCatalog:r,modelFormat:o,licenseKey:a,licenseValidationUrl:s,objectBindings:c,selectedObject:l,panelHoveredObject:u,onObjectBindingsChange:d,onObjectSelect:h,onObjectHover:g,onObjectEditLeaseChange:f,onModelLoaded:v,onLoadError:_,onAction:y,onHiddenObjectsChange:p,onCameraChange:m,onViewerReady:S,onTextureUpload:M,onAnimationsReady:T,onAnnotationsChange:R,activeAnnotation:b,onActiveAnnotationChange:C,lights:x,camera:P,backgroundColor:I,shadows:E=!0,showObjectBindingDataPanel:z=!0,customObjectBindingDataPanel:A,customSceneObjectsPanel:F,showSceneObjectsPanel:j=!0,showDownloadButton:L=!0,downloadFilename:B="model",showResetButton:G=!0,showLoadingOverlay:U=!0,showMouseController:oe=!1,mouseControllerPosition:ve="center-bottom",mouseControllerOpacity:de=1,moveSensitivity:we=.08,zoomSensitivity:xe=1,sceneConfig:Ce,onSceneConfigChange:Ye,disableZoom:gt=!1,zoomOnSelected:Fe=!0,highlightOnHover:Ae=!0,enableCameraControls:Y=!0,onAutoFit:tt,refitOnResize:Be=!0,renderMode:$t="demand",maxDpr:Ue=2,preserveDrawingBuffer:Pt=!1,performanceProfile:_t="auto",dracoDecoderPath:Ee,ktx2TranscoderPath:Ne,meshopt:te=!0,showMeasureTools:ae=!1,showUvCheckerButton:ft=!1,showExplodeControls:re=!1,cinematic:le,measurementUnit:he="m",enableXR:Oe=!1,usdzUrl:nt,arScaleMode:Re="normalized",mobileHandoffUrl:De,showAnnotationNavigation:rt=!0,showAnnotationOnHover:ce=!1,moveModeEnabled:Pe=!1,objectTransformSpace:Ke="world",enableKeyboardNavigation:ke=!1,showViewGizmo:dt=!1}){let{isInsideEditor:ut,activeTab:bt,activeSubTab:Je}=nr(),Tn=ut&&bt==="scene"&&Je==="Lighting",ue=dc(a,s),k=kn(()=>Ce??Li,[Ce]),[N,H]=Ge(null),J=k.model.renderer==="uv-checker",X=ft?N??J:J,se=kn(()=>{let w=X?"uv-checker":J?"pbr":k.model.renderer;return w===k.model.renderer?k:{...k,model:{...k.model,renderer:w}}},[J,k,X]);Et(()=>{H(null)},[e,k.model.renderer,ft,t]);let ie=kn(()=>{if(I)return I;let w=k.background;return w.enabled&&w.type==="color"?w.color:"#1c1c1d"},[I,k]),st=kn(()=>({dracoDecoderPath:Ee,ktx2TranscoderPath:Ne,meshopt:te}),[Ee,Ne,te]),pt=kn(()=>Jh(_t),[_t]),ye=mt(null),[Ie,xt]=Ge(!1);Et(()=>{ye.current&&(ye.current.dollySpeed=Math.max(xe,0))},[xe]),Et(()=>{ye.current&&(ye.current.enabled=Y&&!Ie)},[Y,Ie]);let ge=mt(null),wt=mt(new Map),Xt=mt(null),sn=mt(null),Rt=mt(null),Lt=mt({});Et(()=>()=>{for(let w of Object.values(Lt.current))URL.revokeObjectURL(w)},[]);let Qe=mt({}),[,wr]=Ge(0),kt=_e(()=>{wr(w=>w+1)},[]),ho=mt({}),fa=mt(null),Xn=mt(null),[Or,Dc]=Ge(null),Nc=_e(w=>{Xn.current=w,Dc(w)},[]),mo=mt(new Set),qn=mt(null);Et(()=>{let w=Or;if(!w||!ke||!Y||Pe)return;let D=new Set(["w","a","s","d"," ","c"]),ee=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]),ne=0,pe=it=>it.code==="Space"?" ":it.key.toLowerCase(),At=()=>{mo.current.clear(),ne=0,qn.current!==null&&(cancelAnimationFrame(qn.current),qn.current=null)},St=it=>{let on=ye.current,lt=mo.current;if(!on||lt.size===0){qn.current=null,ne=0;return}let bn=ne?Math.min((it-ne)/1e3,.05):1/60;ne=it;let Yt=Math.max(on.distance*.75,.01)*bn;lt.has("w")&&on.forward(Yt,!1),lt.has("s")&&on.forward(-Yt,!1),lt.has("a")&&on.truck(-Yt,0,!1),lt.has("d")&&on.truck(Yt,0,!1),lt.has(" ")&&on.truck(0,Yt,!1),lt.has("c")&&on.truck(0,-Yt,!1),qn.current=requestAnimationFrame(St)},rn=it=>{if(it.target!==w){At();return}if(ee.has(it.key)){let lt=ye.current;if(!lt)return;it.preventDefault();let bn=Math.PI/90,Yt=Math.max(lt.distance*.05,.01);it.key==="ArrowUp"?it.shiftKey?lt.forward(Yt,!0):lt.rotate(0,-bn,!0):it.key==="ArrowDown"?it.shiftKey?lt.forward(-Yt,!0):lt.rotate(0,bn,!0):it.key==="ArrowLeft"?lt.rotate(-bn,0,!0):lt.rotate(bn,0,!0);return}let on=pe(it);D.has(on)&&(it.preventDefault(),mo.current.add(on),qn.current===null&&(qn.current=requestAnimationFrame(St)))},qt=it=>{mo.current.delete(pe(it))};return w.addEventListener("keydown",rn),w.addEventListener("keyup",qt),w.addEventListener("blur",At),()=>{w.removeEventListener("keydown",rn),w.removeEventListener("keyup",qt),w.removeEventListener("blur",At),At()}},[Or,Y,ke,Pe]);let Bt=mt(null),[ba,dr]=Ge(c),[Zr,go]=Ge({}),[Ls,ei]=Ge(null),[Si,jn]=Ge(null),[Ic,ur]=Ge(null),[xa,zc]=Ge(null),[Vn,fo]=Ge(null),[Yn,Mi]=Ge(null),gn=mt(null),bo=mt(null),ya=mt(0),jc=mt(null),[Bs,Vc]=Ge(0),Cr=mt(!1),Ti=mt(!1),va=mt(!!P);va.current=!!P;let Kn=mt(null),[wa,Pi]=Ge(!!e),[xo,_i]=Ge(!e||!!tt||!!P),[Dr,Os]=Ge(!1),[Fc,Ca]=Ge(!1),[Ds,ti]=Ge(!1),[Ns,Is]=Ge(!1),[zs,Uc]=Ge(null),[Gc,js]=Ge(!1),[ki,Vs]=Ge({total:0,missing:0}),[Hc,Sa]=Ge("Loading model..."),pr=mt({}),Ai=_e(()=>{let w=ye.current;if(!w||Kn.current)return;let D=w.getPosition(new Dn),ee=w.getTarget(new Dn);Kn.current={position:[D.x,D.y,D.z],target:[ee.x,ee.y,ee.z]}},[]),[O,V]=Ge(!1),[Q,me]=Ge(0),[Me,yt]=Ge(!1);Et(()=>{me(0),yt(!1)},[e,t]);let ht=kn(()=>{let w=k.cinematic,D=w?.enabled?{waypoints:w.waypoints,duration:w.duration,loop:w.loop,autoPlay:w.autoPlay}:null;return le===void 0?D&&(D.waypoints?.length??0)>=2?D:null:le===!1?null:le===!0?D??{}:{...D??{},...le}},[le,k]),[ze,fn]=Ge(!1),[ny,yo]=Ge(!1),Wc=mt(!1);Et(()=>{fn(!1),yo(!1),Wc.current=!1},[e,t]),Et(()=>{!ht?.autoPlay||Wc.current||Dr&&xo&&!wa&&(Wc.current=!0,fn(!0),yo(!1))},[ht,Dr,xo,wa]);let{xrStore:Ei,presenterRef:ry,arSupported:$c,vrSupported:nh,quickLookSupported:rh,resolvedMobileHandoffUrl:Fs,isMobileHandoffOpen:ih,arOverlay:iy,openMobileHandoff:oy,closeMobileHandoff:oh,openQuickLook:ay,handleARStateChange:sy}=em({enableXR:Oe,usdzUrl:nt,mobileHandoffUrl:De}),[Sr,ah]=Ge(()=>Ce?.annotations??[]);Et(()=>{if(Sr.length>0){let w=Sr.reduce((D,ee)=>Math.max(D,ee.id),0);Hs.current=w}else Hs.current=0},[Sr]);let[Ln,Us]=Ge(null),[ni,Gs]=Ge({title:"",description:""}),Hs=mt(0),[ly,sh]=Ge(null),[Jn,vo]=Ge(-1),[lh,Ws]=Ge(!1),wo=mt(null),Ft=kn(()=>[...Sr].sort((w,D)=>w.id-D.id),[Sr]),$s=kn(()=>Jn<0||Jn>=Ft.length?null:Ft[Jn],[Jn,Ft]),Mr=_e(w=>{if(b!==void 0){C?.(w);return}sh(w?{annotation:w}:null)},[b,C]),Co=_e(w=>{let D=ye.current,ee=gn.current;if(!D)return;let ne=new Dn,pe=wt.current.get(w.id);pe?ne.copy(pe):ee&&Q2(w,ee,ne)||ne.set(w.worldPosition[0],w.worldPosition[1],w.worldPosition[2]),ge.current=null;let At=D.smoothTime;D.smoothTime=.6;let St=w.worldNormal;if(ee){let rn=new sa().setFromObject(ee),qt=new Dn;rn.getCenter(qt);let it=new Dn;rn.getSize(it);let on=it.length()*.2,lt;St?lt=new Dn(St[0],St[1],St[2]):lt=ne.clone().sub(qt),lt.lengthSq()<1e-6&<.set(0,0,1),lt.normalize();let bn=Math.max(on*.6,.3),Yt=ne.clone().add(lt.multiplyScalar(bn));D.setPosition(Yt.x,Yt.y,Yt.z,!0),w.anchorNodeName&&w.anchorLocalPosition&&(ge.current=Yt.clone().sub(ne))}D.setTarget(ne.x,ne.y,ne.z,!0),wo.current&&clearTimeout(wo.current),wo.current=setTimeout(()=>{D.smoothTime=At,wo.current=null},800),Mr(w)},[Mr]),cy=_e(()=>{Ft.length!==0&&(V(!0),vo(0),Co(Ft[0]))},[Ft,Co]),dy=_e(()=>{if(Ft.length===0||Jn<0)return;Ws(!0);let w=(Jn-1+Ft.length)%Ft.length;vo(w),Co(Ft[w]),setTimeout(()=>Ws(!1),500)},[Jn,Ft,Co]),uy=_e(()=>{if(Ft.length===0||Jn<0)return;if(Jn===Ft.length-1){if(V(!1),vo(-1),Mr(null),ye.current&&Kn.current){let D=Kn.current;ye.current.setLookAt(D.position[0],D.position[1],D.position[2],D.target[0],D.target[1],D.target[2],!0)}return}Ws(!0);let w=Jn+1;vo(w),Co(Ft[w]),setTimeout(()=>Ws(!1),500)},[Jn,Ft,Co,Mr]),py=_e(()=>{if(V(!1),vo(-1),Mr(null),ye.current&&Kn.current){let w=Kn.current;ye.current.setLookAt(w.position[0],w.position[1],w.position[2],w.target[0],w.target[1],w.target[2],!0)}},[Mr]);Et(()=>{vo(-1),V(!1)},[Ft.length]),Et(()=>()=>{wo.current&&clearTimeout(wo.current)},[]),Et(()=>{$s&&O&&Mr($s)},[$s,Mr,O]),Et(()=>{if(Ce?.annotations===void 0)return;let w=Ce.annotations.map(D=>({...D,localPosition:D.localPosition??D.worldPosition}));ah(w)},[Ce?.annotations]);let Ma=_e(()=>{if(b!==void 0){C?.(null);return}sh(null)},[b,C]),Ta=b!==void 0?b:ly?.annotation??null,Pa=kn(()=>Ta?Sr.find(D=>D.id===Ta.id)??null:null,[Ta,Sr]);Et(()=>{Ta&&!Pa&&Ma()},[Ta,Pa,Ma]);let _a=d!==void 0,Ct=_a?c:ba;pr.current=Ct;let hy=kn(()=>Object.entries(Ct).map(([w,D])=>JSON.stringify([w,D.modelObjectId,D.transform??null])).sort().join(""),[Ct]),{measureMode:ka,measureModeRef:my,measurePoints:ch,showDimensions:Xc,measureBox:dh,modelBounds:gy,refreshBounds:uh,clearMeasurements:fy,toggleMeasureMode:by,toggleDimensions:xy,handleMeasurePointerDown:yy,handleMeasureClick:vy}=Yh({canvasAreaRef:Xn,controlsRef:ye,sceneRef:gn,modelUrl:e,modelRotation:k.model.rotation,bindingTransformSignature:hy,modelLoaded:Dr}),{isDownloading:qc,downloadMenuOpen:wy,uvExportError:ph,toggleDownloadMenu:Cy,handleDownloadMesh:Sy,handleDownloadScreenshot:My,handleDownloadUvLayout:Ty}=Xh({sceneRef:gn,materialRefs:ho,rendererCaptureRef:Rt,objectBindings:Ct,downloadFilename:B}),hh=kn(()=>Object.fromEntries(Object.entries(Ct).filter(([,w])=>w.visible===!1).map(([w])=>[w,!0])),[Ct]),Nr=kn(()=>{let w=new WeakMap,D=new Map,ee=new Map;for(let[ne,pe]of Object.entries(Ct))w.set(pe,ne),D.has(pe.id)||D.set(pe.id,ne),ee.has(pe.modelObjectId)||ee.set(pe.modelObjectId,ne);return{byReference:w,byId:D,byModelObjectId:ee}},[Ct]),ri=_e(w=>w?Nr.byReference.get(w)??Nr.byModelObjectId.get(w.modelObjectId)??Nr.byId.get(w.id)??null:null,[Nr]),Yc=l!==void 0,Aa=Yc?l??null:xa,hr=ri(Aa),Kc=hr?Qe.current[hr]??null:null,mh=ri(Ae?u??Si??Ic:null),Py=mh?Qe.current[mh]??null:null,gh=_e(w=>{ur(w),g?.(w)},[g]),fh=z&&Aa!==null&&hr!==null,bh=(hr?Ct[hr]:null)??Aa;Et(()=>{_a||dr(c)},[_a,c]),Et(()=>{p?.(hh)},[hh,p]);let So=_e(w=>{Yc||zc(w),h?.(w)},[Yc,h]),Mo=_e(w=>{_a||dr(w),d?.(w)},[_a,d]),_y=_e(w=>{let D=hr;if(!D||!w)return;let ee=pr.current[D];ee&&Mo({...pr.current,[D]:{...ee,transform:{...ee.transform,...w}}})},[Mo,hr]),Ir=_e((w,D)=>Ct[w]?w:D?ri(D):Nr.byId.get(w)??Nr.byModelObjectId.get(w)??null,[Ct,ri,Nr]),Ea=_e((w,D)=>{let ee=Ir(w),ne=ee?Ct[ee]:void 0;!ee||!ne||Mo({...Ct,[ee]:{...ne,style:D(ne.style)}})},[Ir,Ct,Mo]),Qn=_e(()=>{if(Vn){let w=Zr[Vn.objectId]?.hex;w!==void 0&&(Ea(Vn.objectId,D=>({...D,material:{...D?.material,baseColor:w}})),go(D=>({...D,[Vn.objectId]:{}})))}fo(null)},[Vn,Zr,Ea]),xh=_e(()=>{So(null),ei(null),Qn(),Mi(null)},[So,Qn]),Jc=_e((w,D,ee,ne,pe)=>{let At=fa.current,St=Xn.current,rn=ye.current?.camera;if(!At)return{objectId:w,x:24,y:24};let qt=At.getBoundingClientRect(),it=12,on=qt.width-D-it,lt=qt.height-ee-it,bn=Math.max(it,(qt.width-D)/2),Yt=Math.max(it,(qt.height-ee)/2),Po=Ir(w,ne),Ba=Po?Qe.current[Po]:null,Tr=(_o,Ri)=>Ri<=it?it:Math.min(Math.max(_o,it),Ri);if(St&&rn&&Ba){let _o=St.getBoundingClientRect(),Ri=new Dn;new sa().setFromObject(Ba).getCenter(Ri),Ri.project(rn);let Gy=(Ri.x+1)/2*_o.width+(_o.left-qt.left),Hy=(1-Ri.y)/2*_o.height+(_o.top-qt.top);return{objectId:w,x:Tr(Gy+24,on),y:Tr(Hy-ee/2,lt)}}let td=typeof pe?.screenX=="number"?pe.screenX-qt.left:bn,nd=typeof pe?.screenY=="number"?pe.screenY-qt.top:Yt;return{objectId:w,x:Tr(td,on),y:Tr(nd,lt)}},[Ir]),Xs=_e(w=>{let{objectId:D,action:ee,binding:ne}=w;switch(ei(w),ee.id){case"toggle-visibility":{let pe=D;ne?.modelObjectId&&(pe=Nr.byModelObjectId.get(ne.modelObjectId)??pe);let At=Ct[pe],St=At?.visible===!1;At&&Mo({...Ct,[pe]:{...At,visible:St}});break}case"change-color":Qn(),Mi(null),go(pe=>{let At=Ir(D,ne)??D,St=pe[D]?.hex,rn=Ct[At]?.style?.material?.baseColor;return{...pe,[D]:{...pe[D],hex:St??rn??"#ffffff"}}}),fo(Jc(D,225,250,ne,w));break;case"change-material":Qn(),Mi(Jc(D,300,320,ne,w));break;default:break}y?.(w)},[Mo,Ct,Jc,y,Qn,Ir,Nr]);Et(()=>{if(Vn)return window.addEventListener("pointerdown",Qn),()=>window.removeEventListener("pointerdown",Qn)},[Vn,Qn]),Et(()=>{if(!Yn)return;let w=()=>Mi(null);return window.addEventListener("pointerdown",w),()=>window.removeEventListener("pointerdown",w)},[Yn]),Et(()=>{if(!Pa)return;let w=D=>{if(Bt.current&&!Bt.current.contains(D.target)){if(D.target.closest?.(".ri-annotationMarker"))return;Ma()}};return document.addEventListener("mousedown",w),document.addEventListener("touchstart",w),()=>{document.removeEventListener("mousedown",w),document.removeEventListener("touchstart",w)}},[Pa,Ma]),Et(()=>{if(!Ln)return;let w=D=>{let ee=D.target;if(ee.closest?.(".ri-annotationPopup")||ee.closest?.("button, input, textarea, .ri-measureTools, .ri-xrTools, .ri-buttonContainer"))return;let ne=Xn.current;!ne||!ne.contains(ee)||(Us(null),Gs({title:"",description:""}))};return document.addEventListener("mousedown",w,!0),document.addEventListener("touchstart",w,!0),()=>{document.removeEventListener("mousedown",w,!0),document.removeEventListener("touchstart",w,!0)}},[Ln]);let yh=_e((w,D)=>{let ee=Lt.current[w];ee&&URL.revokeObjectURL(ee),D.startsWith("blob:")?Lt.current[w]=D:delete Lt.current[w],Ea(w,ne=>({...ne,material:{...ne?.material,texture:{path:D}}}))},[Ea]),ky=w=>{let D=w.target.files?.[0],ee=sn.current;if(!D||!ee)return;let ne=Ir(ee);ne&&(M?M(D,ne).then(pe=>yh(ne,pe),pe=>console.error("onTextureUpload failed:",pe)):yh(ne,URL.createObjectURL(D)),w.target.value="")},vh=w=>{sn.current=w,Xt.current?.click()},wh=w=>{let D=Ir(w);if(!D)return;Ea(D,ne=>ne?.material?.texture?{...ne,material:{...ne.material,texture:void 0}}:ne);let ee=Lt.current[D];ee&&(URL.revokeObjectURL(ee),delete Lt.current[D])},Qc=mt(S);Qc.current=S;let mr=_e(()=>{let w=ye.current;!w||!Qc.current||Qc.current({controls:w,scene:gn.current,objectBindings:pr.current,nodeRefs:Qe.current,homeCameraState:Kn.current,captureImage:D=>Qs(Rt.current,D),invalidate:()=>Rt.current?.invalidate()})},[]),To=_e(async(w=!1)=>{let D=ye.current,ee=bo.current??gn.current;if(!D||!ee)return!1;try{if(w){let ne=(ee instanceof sa?ee:new sa().setFromObject(ee)).getBoundingSphere(new B2),pe=ne.center.clone(),St=D.getPosition(new Dn).clone().sub(D.getTarget(new Dn));St.lengthSq()<1e-6&&St.set(0,0,1),St.normalize();let rn=Math.max(ne.radius*10,20),qt=pe.clone().add(St.multiplyScalar(rn));await D.setLookAt(qt.x,qt.y,qt.z,pe.x,pe.y,pe.z,!1)}return _i(!0),await rx(D,()=>D.fitToBox(ee,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),await new Promise(ne=>{let pe=performance.now(),At=()=>{D.active===!1||performance.now()-pe>8e3?(D.dispatchEvent({type:"update"}),Rt.current?.invalidate(),ne()):(Rt.current?.invalidate(),setTimeout(At,100))};setTimeout(At,100)}),Cr.current=!0,Ai(),mr(),!0}catch(ne){return console.error("Fit scene error:",ne),!1}},[Ai,mr]);Et(()=>{if(Cr.current=!1,Ti.current=!1,Kn.current=null,gn.current=null,bo.current=null,Os(!1),Ca(!1),ti(!1),Vs({total:0,missing:0}),Sa("Loading model..."),!e){Pi(!1),_i(!0);return}Pi(!0),_i(!!tt||va.current);let w=!1,D=null,ee=pe=>{D=setTimeout(ne,pe)},ne=()=>{if(w||Cr.current||Ti.current)return;let pe=bo.current??gn.current;if(!ye.current||!pe){ee(100);return}if(ya.current=tP(pe,ye.current)??ya.current,Rb(ye.current)){Cr.current=!0,Ai(),mr(),Pi(!1),_i(!0),Rt.current?.invalidate();return}Ti.current=!0,(tt?tt():va.current?Promise.resolve(!0):To(!0)).then(St=>{Cr.current=St!==!1,Cr.current?(Ai(),mr(),Pi(!1)):w||ee(100)}).catch(()=>{Cr.current=!1,w||ee(100)}).finally(()=>{Ti.current=!1})};return ee(50),()=>{w=!0,D&&clearTimeout(D)}},[Ai,To,e,mr,tt,t]),Et(()=>{if(!Be)return;let w=Or;if(!w)return;let D=null,ee=new ResizeObserver(()=>{!Cr.current||Ti.current||(D&&clearTimeout(D),D=setTimeout(()=>{To()},150))});return ee.observe(w),()=>{ee.disconnect(),D&&clearTimeout(D)}},[Or,To,Be]);let Ch=_e(w=>{if(my.current||(fn(!1),Qn(),Mi(null),ei(null),So(w),gt||!Fe))return;let D=ye.current,ee=ri(w),ne=ee?Qe.current[ee]:null;D&&w.cameraState?.position&&w.cameraState?.target?(D.setPosition(w.cameraState.position[0],w.cameraState.position[1],w.cameraState.position[2],!0),D.setTarget(w.cameraState.target[0],w.cameraState.target[1],w.cameraState.target[2],!0)):D&&ne&&D.fitToBox(ne,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[So,Qn,ri,gt,Fe]),Sh=_e(w=>{if(So(w),gt)return;let D=ye.current,ee=ri(w),ne=ee?Qe.current[ee]:null;if(!D||!ne)return;let pe=w.cameraState;pe?.position&&pe?.target?(D.setPosition(pe.position[0],pe.position[1],pe.position[2],!0),D.setTarget(pe.target[0],pe.target[1],pe.target[2],!0)):D.fitToBox(ne,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[So,ri,gt]);Et(()=>{mr()},[mr]);let Mh=_e((w,D)=>{nP(D,ya.current),m?.(w,D),mr()},[mr,m]),Ay=_e(w=>{jc.current=new Set(w.map(D=>D.name)),Vc(D=>D+1),r?.(w)},[r]),Ey=_e(w=>{bo.current=w,Rt.current?.invalidate()},[]),Th=_e(w=>{gn.current=w,uh(w),Vs(eP(w));let D=Na(w);Uc(D>Oi?D:null),js(!1),D>Oi&&Sa(`Preparing large model (${Math.round(D/1e6)}M triangles) \u2014 the first display can take a while on this device...`),Os(!0),Ca(!1),Is(!1),v?.(w),mr()},[mr,v,uh]),Ph=_e(w=>{Pi(!1),_i(!0),Ca(!0),_?.(w)},[_]),Ry=_e((w,D)=>{if(!Ye)return;let ee={...k,lighting:{...k.lighting,lights:k.lighting.lights.map(ne=>ne.id===w?{...ne,position:D}:ne)}};Ye(ee)},[k,Ye]);Et(()=>{let w=gn.current;if(!Dr||!w){ti(!1);return}let D=Object.entries(Ct);if(D.length===0){ti(!1);return}let ee=t?jc.current:new Set(Object.keys(zo(w).nodesById));if(!ee||ee.size===0){ti(!1);return}let ne=D.some(([pe,At])=>!ee.has(At.modelObjectId??pe));ti(ne)},[Dr,Ct,Bs,t]);let Zc=_e(async()=>{if(tt){await tt();return}let w=ye.current;if(!w)return;let D=Kn.current;try{D?await rx(w,()=>w.setLookAt(D.position[0],D.position[1],D.position[2],D.target[0],D.target[1],D.target[2],!0)):await To()}catch(ee){console.error("Reset camera error:",ee)}},[tt,To]),aA=_e(()=>{yo(!1),fn(!0)},[]),sA=_e(()=>{fn(!1)},[]),Ly=_e(()=>{fn(!1),yo(!0),setTimeout(()=>{Zc()},100)},[Zc]),By=_e((w,D)=>{Mh(w,D)},[Mh]),Oy=_e(w=>{let D=bt==="scene"&&Je==="Annotations";if(w.target.closest("button, input, textarea, .ri-colorPicker, .ri-materialPicker, .ri-annotationPopup, .ri-annotationMarker, .ri-viewAnnotationPopup"))return;let ne=Xn.current,pe=ye.current,At=pe?.camera,St=gn.current;if(!ne||!pe||!At||!St||!D&&!pe.enabled)return;let rn=ne.getBoundingClientRect(),qt=(w.clientX-rn.left)/rn.width*2-1,it=-((w.clientY-rn.top)/rn.height)*2+1,on=new L2;on.setFromCamera(new O2(qt,it),At);let lt=on.intersectObject(St,!0);if(lt.length===0)return;if(!D){let{x:Tr,y:td,z:nd}=lt[0].point;pe.setOrbitPoint(Tr,td,nd);return}let bn=lt[0],Yt=bn.point,Po=St.worldToLocal(bn.point.clone()),Ba=[0,0,1];if(bn.face){let Tr=bn.face.normal.clone().transformDirection(bn.object.matrixWorld).normalize();Ba=[Tr.x,Tr.y,Tr.z]}Us({worldPosition:[Yt.x,Yt.y,Yt.z],localPosition:[Po.x,Po.y,Po.z],worldNormal:Ba,anchor:J2(bn),screenX:w.clientX-rn.left,screenY:w.clientY-rn.top}),Gs({title:"",description:""})},[bt,Je]),_h=_e(()=>{if(!Ln||!ni.title.trim())return;Hs.current+=1;let D={id:Hs.current,worldPosition:Ln.worldPosition,localPosition:Ln.localPosition,worldNormal:Ln.worldNormal,anchorNodeName:Ln.anchor?.anchorNodeName,anchorLocalPosition:Ln.anchor?.anchorLocalPosition,title:ni.title.trim(),description:ni.description},ee=[...Sr,D];ah(ee),R?.(ee),Us(null)},[Ln,ni,Sr,R]),ed=_e(()=>Us(null),[]),Dy=_e(w=>{Mr(w)},[Mr]);if(ue.status==="checking")return $("div",{className:"ri-viewer ri-viewer--license-checking",children:$(Ni,{title:"Verifying License",message:"Checking your license key..."})});if(ue.status==="invalid")return $("div",{className:"ri-viewer ri-viewer--license-invalid",children:$(Ni,{tone:"error",title:"Invalid License",message:ue.isLocalDomain?ue.reason??"License has been revoked or has expired":"Failed to load. Please contact the site administrator."})});let kh=Yn?Ir(Yn.objectId):null,Ah=kh?Ct[kh]?.style?.material?.texture?.path:void 0,Ny=Xn.current?.offsetWidth??600,Iy=Xn.current?.offsetHeight??400,zy=350,jy=290,Vy=Ln?Math.min(Ln.screenX+12,Ny-zy-8):0,Fy=Ln?Math.min(Ln.screenY,Iy-jy-8):0,Uy=U&&!!e&&!Fc&&(!Dr||!xo||wa),Ra=Oe&&(Ei&&($c||nh)||rh||!!Fs),La=w=>16+w*42;return Ve("div",{className:"ri-viewer",style:{background:ie},children:[Ve("div",{className:"ri-viewerLeft",ref:fa,children:[A?A({isOpen:fh,selectedObject:bh,currentAction:Ls,onClose:xh,onAction:Xs}):$(np,{isOpen:fh,selectedObject:bh,currentAction:Ls,onClose:xh,onAction:Xs,renderActionExtra:w=>w==="change-color"&&Vn?$(Ku,{inline:!0,colorPicker:Vn,onClose:Qn,itemMaterials:Zr,setItemMaterials:go}):w==="change-material"&&Yn?$(Qu,{inline:!0,triggerFileUpload:vh,materialPopup:Yn,textureUrl:Ah,clearTexture:wh}):null}),Ve("div",{className:`ri-canvasArea ${ka?"ri-canvasArea--measuring":""} ${xo?"":"ri-canvasArea--positioning"} ${Pe?"ri-canvasArea--moveMode":""}`,ref:Nc,tabIndex:ke?0:void 0,onDoubleClick:Oy,onPointerDown:w=>{ke&&Xn.current?.focus({preventScroll:!0}),yy(w)},onClick:vy,children:[Ds&&!Ns&&Ve("div",{className:"ri-bindingsMismatchBanner",children:[$(hp,{size:14,className:"ri-bindingsMismatchBanner__icon"}),$("span",{children:"Object bindings data don't match this model"}),$("button",{type:"button",className:"ri-bindingsMismatchBanner__dismiss",onClick:w=>{w.stopPropagation(),Is(!0)},"aria-label":"Dismiss",children:$(mp,{size:12})})]}),zs!==null&&!Gc&&Ve("div",{className:`ri-largeModelBanner ${Ds&&!Ns?"ri-largeModelBanner--offset":""}`,children:[$(hp,{size:14,className:"ri-largeModelBanner__icon"}),Ve("span",{children:["Very large model (",Math.round(zs/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."]}),$("button",{type:"button",className:"ri-largeModelBanner__dismiss",onClick:w=>{w.stopPropagation(),js(!0)},"aria-label":"Dismiss",children:$(mp,{size:12})})]}),se.model.renderer==="uv-checker"&&ki.missing>0&&Ve("div",{className:"ri-uvCheckerBanner",role:"status",children:[$(hp,{size:14,className:"ri-uvCheckerBanner__icon"}),Ve("span",{children:[ki.missing===ki.total?"UV Checker: this model has no UV0 coordinates.":`UV Checker: ${ki.missing} of ${ki.total} meshes have no UV0 coordinates.`," ","Missing UVs are shown in magenta."]})]}),$("input",{ref:Xt,type:"file",accept:"image/png,image/jpeg,image/webp",className:"ri-hiddenInput",onChange:ky}),Ve(Nd,{camera:P,backgroundColor:I,shadows:E&&k.shadows.enabled,sceneConfig:se,selectedObjectRef:Kc,hoveredObjectRef:Py,highlightOnHover:Ae,renderMode:$t,maxDpr:Ue,reduceGpuLoad:pt,xrStore:Ei,rendererCaptureRef:Rt,preserveDrawingBuffer:Pt,children:[x??Ve(eo,{children:[$(Vd,{lightingConfig:k.lighting,shadowConfig:k.shadows,shadowsEnabled:E,environmentRotation:k.environment.rotation,environmentConfig:k.environment,modelBounds:gy,objectBindings:Ct,nodeRefs:Qe}),Tn&&k.lighting.lights.map(w=>!w.visible||w.type==="none"||w.type==="hemisphere"||w.attachment?null:$(Xb,{light:w,position:w.position,color:w.color,intensity:w.intensity,visible:w.visible,onPositionChange:D=>Ry(w.id,D)},w.id))]}),$(Id,{controlsRef:ye,onCameraChange:By}),dt&&$(_2,{alignment:"top-right",margin:[80,80],renderPriority:2,onUpdate:()=>{ye.current?.update(0),Rt.current?.invalidate()},children:$(k2,{axisColors:["#ff3653","#8adb00","#2c8fff"],labelColor:"white"})}),Pe&&Kc&&hr&&$(pp,{node:Kc,space:Ke,onTransformChange:_y,onDraggingChange:w=>{xt(w),Aa&&f?.(Aa,w)}},hr),$(Js,{onLoadError:Ph,children:$(P2,{fallback:null,children:(()=>{let w=Ve(eo,{children:[t?$(Iu,{url:t,rotation:se.model.rotation,errorTarget:n,cacheSize:i,decoderConfig:st,objectBindings:Ct,itemMaterials:Zr,sceneConfig:se,selectedItem:hr,panelHoveredItem:u??Si,highlightOnHover:Ae,onItemClick:Ch,onItemHover:gh,onObjectCatalog:Ay,onTilesetBounds:Ey,onModelLoaded:Th,onLoadError:Ph,nodeRefsOut:Qe,onNodeRefsChange:kt,materialRefsOut:ho,explodeFactor:Q,suspendBindingTransforms:Ie}):$(eu,{url:e,modelFormat:o,objectBindings:Ct,selectedItem:hr,itemMaterials:Zr,onItemClick:Ch,onItemHover:gh,onModelLoaded:Th,onAnimationsReady:T,nodeRefsOut:Qe,onNodeRefsChange:kt,materialRefsOut:ho,panelHoveredItem:u??Si,sceneConfig:se,zoomOnSelected:Fe,highlightOnHover:Ae,decoderConfig:st,explodeFactor:Q,suspendBindingTransforms:Ie}),$(Fu,{annotations:Sr,sceneConfig:k,activeAnnotation:Pa,popupRef:Bt,canvasRootRef:Xn,worldPositionsRef:wt,modelLoaded:Dr,onAnnotationClick:Dy,onCloseAnnotation:Ma,hideCloseButton:O,showAnnotationOnHover:ce}),$(Z2,{annotation:$s,enabled:O,controlsRef:ye,offsetRef:ge}),ht&&$(Gu,{controlsRef:ye,sceneRef:gn,config:ht,playing:ze,resetOnPlay:ny,onFinished:()=>{fn(!1),yo(!1)},onUserInteract:()=>{fn(!1)}}),ae&&$(Uu,{points:ch,unit:he,box:dh,showDimensions:Xc})]});return Ei?$(mb,{ref:ry,box:dh,scaleMode:Re,onARStateChange:sy,children:w}):w})()})},t??e)]}),$(ea,{visible:Uy,message:Hc}),Ra&&Ve("div",{className:"ri-xrTools",style:{top:`${La(0)}px`},children:[!$c&&rh&&Ve("button",{type:"button",className:"ri-xrButton",onClick:ay,title:"View this model in AR with Apple Quick Look",children:[$(ex,{size:16}),"View in AR"]}),Fs&&Ve("button",{type:"button",className:"ri-xrButton",onClick:oy,title:"Open this experience on a phone for AR","aria-haspopup":"dialog","aria-expanded":ih,children:[$(G2,{size:16}),$("span",{children:"Open on phone"})]}),Ei&&$c&&Ve("button",{type:"button",className:"ri-xrButton",onClick:()=>Ei.enterAR().catch(w=>{console.error("Failed to enter AR session:",w)}),title:"View this model in your space",children:[$(nx,{size:16}),$("span",{className:"ri-xrButtonPrefix",children:"Enter"}),$("span",{children:"AR"})]}),Ei&&nh&&Ve("button",{type:"button",className:"ri-xrButton",onClick:()=>Ei.enterVR().catch(w=>{console.error("Failed to enter VR session:",w)}),title:"View this model in VR",children:[$(U2,{size:16}),$("span",{className:"ri-xrButtonPrefix",children:"Enter"}),$("span",{children:"VR"})]})]}),iy,ih&&Fs&&$("div",{className:"ri-mobileHandoffBackdrop",onMouseDown:w=>{w.target===w.currentTarget&&oh()},children:Ve("section",{className:"ri-mobileHandoffDialog",role:"dialog","aria-modal":"true","aria-labelledby":"ri-mobileHandoffTitle",children:[$("button",{type:"button",className:"ri-mobileHandoffClose",onClick:oh,"aria-label":"Close phone handoff",children:$(mp,{size:18})}),$(nx,{size:22,"aria-hidden":"true"}),$("h2",{id:"ri-mobileHandoffTitle",children:"View in AR"}),$("p",{children:"Scan the code and choose AR."}),$("div",{className:"ri-mobileHandoffQr",children:$(R2,{value:Fs,size:208,level:"M",marginSize:4,title:"QR code to open this model on a phone"})})]})}),ft&&$("div",{className:"ri-uvCheckerTools",style:{top:`${La(Ra?1:0)}px`},children:$("button",{type:"button",className:`ri-measureButton ${X?"ri-measureButton--active":""}`,onClick:()=>H(w=>!(w??J)),title:X?"Disable UV checker":"Enable UV checker","aria-label":X?"Disable UV checker":"Enable UV checker","aria-pressed":X,children:$(Y2,{size:16})})}),ae&&Ve("div",{className:"ri-measureTools",style:{top:`${La((Ra?1:0)+(ft?1:0))}px`},children:[$("button",{type:"button",className:`ri-measureButton ${ka?"ri-measureButton--active":""}`,onClick:by,title:ka?"Stop measuring":"Measure distance","aria-pressed":ka,children:$(X2,{size:16})}),$("button",{type:"button",className:`ri-measureButton ${Xc?"ri-measureButton--active":""}`,onClick:xy,title:"Toggle bounding dimensions","aria-pressed":Xc,children:$(q2,{size:16})}),ch.length>0&&$("button",{type:"button",className:"ri-measureButton",onClick:fy,title:"Clear measurements",children:$(I2,{size:16})}),ka&&$("span",{className:"ri-measureHint",children:"Click points on the model to measure"})]}),re&&Ve("div",{className:"ri-explodeTools",style:{top:`${La((Ra?1:0)+(ft?1:0)+(ae?1:0))}px`},children:[$("button",{type:"button",className:`ri-measureButton ${Me||Q>0?"ri-measureButton--active":""}`,onClick:()=>yt(w=>!w),title:"Exploded view","aria-pressed":Me,children:$(H2,{size:16})}),Me&&$("div",{className:"ri-explodeSlider",onPointerDown:w=>w.stopPropagation(),children:$("input",{type:"range",min:0,max:100,value:Math.round(Q*100),onChange:w=>me(Number(w.target.value)/100),"aria-label":"Explode amount"})})]}),ht&&Ve("div",{className:"ri-cinematicTools",style:{top:`${La((Ra?1:0)+(ft?1:0)+(ae?1:0)+(re?1:0))}px`},children:[$("button",{type:"button",className:`ri-measureButton ${ze?"ri-measureButton--active":""}`,onClick:()=>{ze?fn(!1):(yo(!1),fn(!0))},title:ze?"Pause cinematic":"Play cinematic","aria-pressed":ze,children:ze?$($2,{size:16}):$(W2,{size:16})}),ze&&$("button",{type:"button",className:"ri-measureButton ri-measureButton--stop",onClick:Ly,title:"Stop cinematic and reset camera",children:$(tx,{size:16})})]}),(G||L||rt&&Ft.length>0)&&Ve("div",{className:"ri-buttonContainer",children:[$("div",{className:"ri-tourControls",children:rt&&Ft.length>0&&$(eo,{children:O?Ve(eo,{children:[Ve("button",{className:"ri-tourButton",onClick:dy,disabled:lh||Ft.length===0||Jn<=0,title:"Previous annotation",children:[$(V2,{size:16}),$("span",{children:"Prev"})]}),$("button",{className:"ri-tourButton ri-tourButton--stop",onClick:py,title:"Stop guided tour",children:$(tx,{size:16})}),Ve("button",{className:"ri-tourButton ri-tourButton--next",onClick:uy,disabled:lh||Ft.length===0,title:"Next annotation",children:[$("span",{children:"Next"}),$(F2,{size:16})]})]}):$("button",{className:"ri-navButtonSingle",onClick:cy,disabled:Ft.length===0,title:"Start guided tour",children:"Guided Tour"})})}),Ve("div",{className:"ri-rightControls",children:[G&&$("button",{className:"ri-resetButton",onClick:Zc,title:"Reset camera view",children:$(j2,{})}),L&&Ve("div",{className:"ri-downloadWrapper",onPointerDown:w=>w.stopPropagation(),children:[wy&&Ve("div",{className:"ri-downloadMenu",children:[Ve("button",{className:"ri-downloadMenuItem",onClick:Sy,disabled:qc||!gn.current,children:[$(ex,{size:14}),"Download GLB"]}),$("div",{className:"ri-downloadMenuDivider"}),Pt&&Ve(eo,{children:[Ve("button",{className:"ri-downloadMenuItem",onClick:My,disabled:!gn.current,children:[$(D2,{size:14}),"Download PNG"]}),$("div",{className:"ri-downloadMenuDivider"})]}),Ve("button",{className:"ri-downloadMenuItem",onClick:Ty,disabled:!gn.current,children:[$(z2,{size:14}),"Download UV Layout"]}),ph&&$("div",{className:"ri-downloadMenuNotice",role:"status","aria-live":"polite",children:ph})]}),$("button",{className:"ri-downloadButton",onClick:Cy,disabled:qc||!gn.current,title:"Download options",children:qc?Ve(eo,{children:[$("span",{className:"ri-downloadButton__spinner"}),"Exporting\u2026"]}):Ve(eo,{children:[$(N2,{size:15}),"Download"]})})]})]})]}),Ln&&Ve("div",{className:"ri-annotationPopup",style:{left:Vy,top:Fy},onPointerDown:w=>w.stopPropagation(),onClick:w=>w.stopPropagation(),children:[$("input",{autoFocus:!0,className:"ri-annotationInput",placeholder:"Title *",value:ni.title,onChange:w=>Gs(D=>({...D,title:w.target.value})),onKeyDown:w=>{w.key==="Enter"&&_h(),w.key==="Escape"&&ed()}}),$("textarea",{className:"ri-annotationTextarea",placeholder:"Description",value:ni.description,onChange:w=>Gs(D=>({...D,description:w.target.value})),onKeyDown:w=>{w.key==="Escape"&&ed()},rows:5}),Ve("div",{className:"ri-annotationActions",children:[$("button",{onClick:_h,className:`ri-annotationOkBtn ${ni.title.trim()?"":"disabled"}`,disabled:!ni.title.trim(),children:"OK"}),$("button",{onClick:ed,className:"ri-annotationCancelBtn",children:"Cancel"}),$("div",{className:"ri-annotationIcons"})]})]})]}),A&&Vn&&$(Ku,{colorPicker:Vn,onClose:Qn,itemMaterials:Zr,setItemMaterials:go}),A&&Yn&&$(Qu,{triggerFileUpload:vh,materialPopup:Yn,textureUrl:Ah,clearTexture:wh})]}),j&&$("div",{className:"ri-viewerRight",children:F?F({objectBindings:Ct,onAction:Xs,onFocus:Sh,onHover:jn}):$(rp,{objectBindings:Ct,onAction:Xs,onFocus:Sh,onHover:jn})}),oe&&$(Tb,{controlsRef:ye,enabled:!0,opacity:de,moveSensitivity:we,position:ve})]})}import{useCallback as Wt,useEffect as po,useMemo as Gp,useRef as Mn,useState as at}from"react";import{Redo2 as E0,Undo2 as R0,Upload as L0,ListRestart as B0,X as J_,AlertTriangle as Q_}from"lucide-react";import{useCallback as Nn,useRef as la,useState as ox}from"react";import{Vector3 as ax}from"three";function sx(e){return[e.x,e.y,e.z]}function bi(e,t){let n=new ax,i=new ax;return t.getPosition(n),t.getTarget(i),{position:sx(n),target:sx(i),fov:"fov"in e&&typeof e.fov=="number"?e.fov:null,zoom:"zoom"in e&&typeof e.zoom=="number"?e.zoom:1,azimuthAngle:t.azimuthAngle,polarAngle:t.polarAngle}}function rP(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 Ss(e,t,n=.6){let i=e.smoothTime;e.smoothTime=n;try{return await t()}finally{e.smoothTime=i}}function gp(e={}){let t=la(e);t.current=e;let n=la(null),[i,r]=ox(null),[o,a]=ox(()=>({...e.presets})),s=la(o);s.current=o;let c=Nn(C=>{r(x=>rP(x,C)?x:C)},[]),l=Nn((C,x)=>{c(bi(C,x))},[c]),u=la(null),d=la(null),h=la(null),g=Nn(C=>{n.current=C;let x=bi(C.controls.camera,C.controls);c(x),C.scene!==d.current&&(d.current=C.scene,u.current=null,h.current=null),C.homeCameraState&&!u.current&&(u.current=C.homeCameraState);let{initialPosition:P,initialTarget:I,initialTransition:E=!1}=t.current;if((P||I)&&C.scene&&(P||C.homeCameraState)&&h.current!==C.controls){h.current=C.controls,C.homeCameraState||ta(C.controls);let z=P??x.position,A=I??x.target;C.controls.setLookAt(z[0],z[1],z[2],A[0],A[1],A[2],E).then(()=>{if(n.current?.controls!==C.controls)return;let F=bi(C.controls.camera,C.controls);u.current={position:F.position,target:F.target},c(F)}).catch(()=>{})}},[c]),f=Nn(async()=>{let C=n.current,x=C?.controls;if(!x)return!1;try{let P=u.current;return P?await Ss(x,()=>x.setLookAt(P.position[0],P.position[1],P.position[2],P.target[0],P.target[1],P.target[2],!0)):C?.scene?await Ss(x,()=>x.fitToBox(C.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})):await Ss(x,()=>x.reset(!0)),!0}catch{return!1}},[]),v=Nn(async()=>{let C=n.current;if(!C?.controls||!C.scene)return!1;try{return await Ss(C.controls,()=>C.controls.fitToBox(C.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),_=Nn(async C=>{let x=n.current;if(!x?.controls)return!1;let P=xn(x.objectBindings,C);if(!P)return!1;let I=x.nodeRefs[P];if(!I)return!1;try{return await Ss(x.controls,()=>x.controls.fitToBox(I,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),y=Nn(async(C,x=!0)=>{let P=n.current?.controls;if(!P)return!1;try{return n.current?.homeCameraState||ta(P),await P.setTarget(C[0],C[1],C[2],x),c(bi(P.camera,P)),!0}catch{return!1}},[c]),p=Nn(async(C,x=!0)=>{let P=n.current?.controls;if(!P)return!1;try{n.current?.homeCameraState||ta(P);let I=[P.setLookAt(C.position[0],C.position[1],C.position[2],C.target[0],C.target[1],C.target[2],x)];C.azimuthAngle!=null&&C.polarAngle!=null&&I.push(P.rotateTo(C.azimuthAngle,C.polarAngle,x)),await Promise.all(I);let E=P.camera,z=!1;return C.fov!=null&&"fov"in E&&typeof E.fov=="number"&&(E.fov=C.fov,z=!0),C.zoom!=null&&"zoom"in E&&typeof E.zoom=="number"&&(E.zoom=C.zoom,z=!0),z&&"updateProjectionMatrix"in E&&E.updateProjectionMatrix(),c(bi(E,P)),!0}catch{return!1}},[c]),m=Nn((C,x=!0)=>p(C,x),[p]),S=Nn((C,x,P=!0)=>p({position:C,target:x},P),[p]),M=Nn(async(C,x,P=!0)=>{let I=n.current?.controls;if(!I)return!1;try{return n.current?.homeCameraState||ta(I),await I.rotateTo(C,x,P),c(bi(I.camera,I)),!0}catch{return!1}},[c]),T=Nn(async(C,x=!0)=>{let P=n.current?.controls;if(!P)return!1;try{return n.current?.homeCameraState||ta(P),await P.dollyTo(C,x),c(bi(P.camera,P)),!0}catch{return!1}},[c]),R=Nn(C=>{let x=n.current?.controls,P=C.trim();if(!x||!P)return null;let I=bi(x.camera,x);return s.current={...s.current,[P]:I},a(E=>({...E,[P]:I})),c(I),I},[c]),b=Nn((C,x=!0)=>{let P=s.current[C];return P?p(P,x):Promise.resolve(!1)},[p]);return{cameraState:i,cameraPresets:o,resetView:f,focusObject:_,fitScene:v,setCameraTarget:y,setCameraState:m,lookAt:S,orbitTo:M,dollyTo:T,savePreset:R,goToPreset:b,handleCameraChange:l,handleViewerReady:g}}import{useCallback as ca,useEffect as iP,useRef as lx,useState as to}from"react";function fp(){let e=lx(null),[t,n]=to([]),i=lx(null),[r,o]=to([]),[a,s]=to(null),[c,l]=to(!1),[u,d]=to(1),[h,g]=to(0),[f,v]=to(0);iP(()=>()=>{i.current?.()},[]);let _=ca(T=>{i.current?.(),e.current=T,n(T.clips),o(T.clipDetails??T.clips.map(b=>({sourceName:b,duration:0})));let R=T.getState?.()??{currentClip:null,isPlaying:!1,speed:1,time:0,duration:0};s(R.currentClip),l(R.isPlaying),d(R.speed),g(R.time),v(R.duration),T.subscribe?i.current=T.subscribe(b=>{s(b.currentClip),l(b.isPlaying),d(b.speed),g(b.time),v(b.duration)}):i.current=null},[]),y=ca(T=>{e.current?.play(T),s(T),l(!0)},[]),p=ca(()=>{e.current?.pause(),l(!1)},[]),m=ca(()=>{e.current?.stop(),s(null),l(!1),g(0)},[]),S=ca(T=>{e.current?.setSpeed(T),d(T)},[]),M=ca(T=>{e.current?.seek?.(T),g(T)},[]);return{clips:t,clipDetails:r,currentClip:a,isPlaying:c,speed:u,time:h,duration:f,play:y,pause:p,stop:m,setSpeed:S,seek:M,handleAnimationsReady:_}}import{useState as t_,useEffect as n_}from"react";import{useState as gP}from"react";import{ChevronDown as fP,ChevronLeft as bP,ChevronRight as xP,RotateCcw as yP}from"lucide-react";import{HexColorInput as vP,HexColorPicker as wP}from"react-colorful";import{useLayoutEffect as aP,useRef as dx,useState as ux}from"react";import{createPortal as sP}from"react-dom";import{ChevronDown as lP,Info as cP}from"lucide-react";import{HexColorInput as dP,HexColorPicker as uP}from"react-colorful";function da(e){let t=e.replace("#","").match(/.{2}/g).map(i=>parseInt(i,16)/255).map(i=>i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4));return .2126*t[0]+.7152*t[1]+.0722*t[2]>.179?"#000":"#fff"}import{useEffect as oP}from"react";function cx(e,t,n){oP(()=>{if(!n)return;let i=Array.isArray(e)?e:[e],r=o=>{let a=o.target;i.some(c=>c.current?.contains(a))||t()};return document.addEventListener("pointerdown",r,!0),()=>{document.removeEventListener("pointerdown",r,!0)}},[e,t,n])}import{jsx as Ze,jsxs as An}from"react/jsx-runtime";function bp({anchorRef:e,onClose:t,children:n}){let i=dx(null),[r,o]=ux(null);return cx([i,e],t,!0),aP(()=>{let a=e.current;if(!a)return;let s=a.getBoundingClientRect(),c=222,l=8,u=Math.min(Math.max(s.right-c,l),window.innerWidth-c-l),d=Math.min(s.bottom+6,window.innerHeight-200);o({top:d,left:u})},[e]),r?sP(Ze("div",{ref:i,className:"se-colorPickerPopover",style:{position:"fixed",top:r.top,left:r.left},children:n}),document.body):null}function pP(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").replace(/\s+/g," ").trim().replace(/\b\w/g,t=>t.toUpperCase())}function no({title:e,children:t}){return An("section",{className:"se-section",children:[Ze("h3",{className:"se-sectionTitle",children:e}),Ze("div",{className:"se-sectionBody",children:t})]})}function $e({title:e,open:t,onToggle:n,trailing:i,children:r,disabled:o,tooltip:a}){let s=a?`${a}`:e;return An("section",{className:"se-panel",children:[An("button",{type:"button",className:"se-panelHeader",onClick:n,"aria-expanded":t,title:s,children:[An("span",{className:"se-panelHeaderMain",children:[Ze(lP,{size:16,className:`se-panelChevron ${t?"se-panelChevron--open":""}`}),Ze("span",{className:"se-panelTitle",children:e}),a?Ze("span",{className:"se-panelHelp",title:s,"aria-label":s,role:"img",onClick:c=>c.stopPropagation(),children:Ze(cP,{size:13})}):null]}),i?Ze("span",{className:"se-panelTrailing",onClick:c=>c.stopPropagation(),children:i}):null]}),t?Ze("div",{className:"se-panelBody",style:o?{opacity:.45,pointerEvents:"none"}:void 0,children:r}):null]})}function ot({checked:e,onChange:t,label:n}){return An("label",{className:"se-switch","aria-label":n,children:[Ze("input",{type:"checkbox",checked:e,onChange:i=>t(i.target.checked)}),Ze("span",{className:"se-switchTrack",children:Ze("span",{className:"se-switchThumb"})})]})}function W({label:e,value:t,min:n,max:i,step:r,formatValue:o,onChange:a,disabled:s=!1}){return An("label",{className:`se-field ${s?"se-field--disabled":""}`,children:[An("span",{className:"se-fieldLabel",children:[e,Ze("span",{className:"se-fieldValue",children:o?o(t):t})]}),Ze("input",{className:"se-slider",type:"range",min:n,max:i,step:r,value:t,onChange:c=>a(Number(c.target.value)),disabled:s})]})}function ct({label:e,checked:t,onChange:n}){return An("label",{className:"se-field se-fieldInline",children:[Ze("span",{className:"se-fieldLabel",children:e}),Ze("input",{type:"checkbox",className:"se-checkbox",checked:t,onChange:i=>n(i.target.checked)})]})}function Gn({label:e,value:t,options:n,onChange:i}){return An("label",{className:"se-field se-fieldInline",children:[Ze("span",{className:"se-fieldLabel",children:e}),Ze("select",{className:"se-select",value:t,onChange:r=>i(r.target.value),children:n.map(r=>Ze("option",{value:r,children:pP(r)},r))})]})}function rr({label:e,value:t,onChange:n}){let[i,r]=ux(!1),o=dx(null);return An("div",{className:"se-field",children:[An("div",{className:"se-fieldInline",children:[Ze("span",{className:"se-fieldLabel",children:e}),Ze("span",{ref:o,style:{display:"inline-flex"},children:Ze(dP,{prefixed:!0,className:"se-swatch",onClick:()=>r(a=>!a),style:{background:t,color:da(t)},color:t,onChange:n})})]}),i?Ze(bp,{anchorRef:o,onClose:()=>r(!1),children:Ze(uP,{color:t,onChange:n})}):null]})}function xi({label:e,value:t,min:n,max:i,step:r,onChange:o}){return An("div",{className:"se-field",children:[Ze("span",{className:"se-fieldLabel",children:e}),Ze("div",{className:"se-vectorRow",children:["X","Y","Z"].map((s,c)=>An("label",{className:"se-vectorAxis",children:[Ze("span",{children:s}),Ze("input",{type:"number",className:"se-numberInput",min:n,max:i,step:r,value:t[c],onChange:l=>{let u=[...t];u[c]=Number(l.target.value),o(u)}})]},s))})]})}function ro({label:e,value:t,min:n,max:i,step:r,onChange:o}){return An("div",{className:"se-field",children:[Ze("span",{className:"se-fieldLabel",children:e}),Ze("div",{className:"se-vectorRow",children:["X","Y"].map((s,c)=>An("label",{className:"se-vectorAxis",children:[Ze("span",{children:s}),Ze("input",{type:"number",className:"se-numberInput",min:n,max:i,step:r,value:t[c],onChange:l=>{let u=[...t];u[c]=Number(l.target.value),o(u)}})]},s))})]})}var px={free:0,starter:1,growth:2};function hx(e){return e==="starter"||e==="growth"||e==="scale"?e==="scale"?"growth":e:"free"}function Qr(e,t){return px[e]>=px[t]}var mx={free:"Free",starter:"Starter",growth:"Growth"};import{Lock as hP}from"lucide-react";import{jsx as mP,jsxs as gx}from"react/jsx-runtime";function In({requiredTier:e,feature:t}){return gx("div",{className:"bb-tierLock",children:[mP(hP,{size:16}),gx("p",{className:"bb-tierLockMessage",children:[t," requires the ",mx[e]," plan or higher."]})]})}import{Fragment as xp,jsx as be,jsxs as Jt}from"react/jsx-runtime";var CP=["lit","unlit","normals"],SP=["color","image","environment"];function fx(e){let t=e%360;return t<0?t+360:t}function wc({title:e,open:t,onToggle:n,children:i,trailing:r}){return Jt("section",{className:"se-panel",children:[Jt("button",{type:"button",className:"se-panelHeader",onClick:n,"aria-expanded":t,children:[Jt("span",{className:"se-panelHeaderMain",children:[be(fP,{size:16,className:`se-panelChevron ${t?"se-panelChevron--open":""}`}),be("span",{className:"se-panelTitle",children:e})]}),r?be("span",{className:"se-panelTrailing",onClick:o=>o.stopPropagation(),children:r}):null]}),t?be("div",{className:"se-panelBody",children:i}):null]})}function yp({config:e,onChange:t}){let{model:n,camera:i,wireframe:r,background:o,environment:a}=e,{tier:s}=nr(),c=Qr(s,"starter"),[l,u]=gP({general:!0,camera:!0,wireframe:!1,background:!1}),d=p=>u(m=>({...m,[p]:!m[p]})),h=p=>t({...e,model:p}),g=p=>t({...e,camera:p}),f=p=>t({...e,wireframe:p}),v=p=>t({...e,background:p}),_=p=>t({...e,environment:p}),y=p=>{_({...a,source:"preset",preset:p})};return Jt("div",{className:"se-generalContent",children:[Jt(wc,{title:"General",open:l.general,onToggle:()=>d("general"),children:[Jt("div",{className:"se-field",children:[Jt("div",{className:"se-fieldLabel",children:[be("span",{children:"Straighten model"}),be("button",{type:"button",className:"se-iconButton",onClick:()=>h({...n,rotation:[0,0,0]}),"aria-label":"Reset model rotation",children:be(yP,{size:16})})]}),be("div",{className:"se-axisStepperGrid",children:["X","Y","Z"].map((p,m)=>Jt("div",{className:"se-axisStepper",children:[be("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let S=[...n.rotation];S[m]=fx(S[m]-90),h({...n,rotation:S})},"aria-label":`Rotate ${p} axis backward`,children:be(bP,{size:16})}),be("span",{className:"se-axisStepperLabel",children:p}),be("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let S=[...n.rotation];S[m]=fx(S[m]+90),h({...n,rotation:S})},"aria-label":`Rotate ${p} axis forward`,children:be(xP,{size:16})})]},p))})]}),be(xi,{label:"Rotation",value:n.rotation,min:0,max:360,step:1,onChange:p=>h({...n,rotation:p})}),Jt("div",{className:"se-field",children:[be("span",{className:"se-fieldLabel",children:"Renderer"}),be("div",{className:"se-segmentedControl se-segmentedControl--renderer",children:Rh.map(p=>be("button",{type:"button",className:`se-segmentedOption ${n.renderer===p?"se-segmentedOption--active":""}`,onClick:()=>h({...n,renderer:p}),children:p==="uv-checker"?"UV CHECKER":p.toUpperCase()},p))})]}),be(Gn,{label:"Shading",value:n.shading,options:CP,onChange:p=>h({...n,shading:p})})]}),be(wc,{title:"Camera",open:l.camera,onToggle:()=>d("camera"),children:be(W,{label:"Field Of View",value:i.fieldOfView,min:20,max:100,step:.1,formatValue:p=>`${p.toFixed(3)}\xB0`,onChange:p=>g({...i,fieldOfView:p})})}),be(wc,{title:"Wireframe",open:l.wireframe,onToggle:()=>d("wireframe"),trailing:Jt("label",{className:"se-switch","aria-label":"Toggle wireframe preview",children:[be("input",{type:"checkbox",checked:c&&r.enabled,disabled:!c,onChange:p=>f({...r,enabled:p.target.checked})}),be("span",{className:"se-switchTrack",children:be("span",{className:"se-switchThumb"})})]}),children:c?Jt(xp,{children:[be(W,{label:"Opacity",value:r.opacity,min:0,max:1,step:.01,onChange:p=>f({...r,opacity:p})}),be(rr,{label:"Wire color",value:r.color,onChange:p=>f({...r,color:p})})]}):be(In,{requiredTier:"starter",feature:"Wireframe preview"})}),be(wc,{title:"Background",open:l.background,onToggle:()=>d("background"),trailing:Jt("label",{className:"se-switch","aria-label":"Toggle scene background",children:[be("input",{type:"checkbox",checked:o.enabled,onChange:p=>v({...o,enabled:p.target.checked})}),be("span",{className:"se-switchTrack",children:be("span",{className:"se-switchThumb"})})]}),children:o.enabled?Jt(xp,{children:[Jt("div",{className:"se-field",children:[be("span",{className:"se-fieldLabel",children:"Background type"}),be("div",{className:"se-segmentedControl",children:SP.map(p=>be("button",{type:"button",className:`se-segmentedOption ${o.type===p?"se-segmentedOption--active":""}`,onClick:()=>v({...o,type:p}),children:p},p))})]}),o.type==="environment"?c?Jt(xp,{children:[Jt("div",{className:"se-field",children:[be("span",{className:"se-fieldLabel",children:"Environment source"}),Jt("div",{className:"se-segmentedControl",children:[be("button",{type:"button",className:`se-segmentedOption ${a.source==="preset"?"se-segmentedOption--active":""}`,onClick:()=>_({...a,source:"preset"}),children:"PRESET"}),be("button",{type:"button",className:`se-segmentedOption ${a.source==="custom"?"se-segmentedOption--active":""}`,onClick:()=>_({...a,source:"custom"}),children:"CUSTOM"})]})]}),a.source==="preset"?be(Gn,{label:"Environment preset",value:a.preset,options:Lh,onChange:y}):Jt("label",{className:"se-field",children:[be("span",{className:"se-fieldLabel",children:"Custom environment URL"}),be("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/environment.hdr",value:a.customEnvironmentUrl,onChange:p=>_({...a,customEnvironmentUrl:p.target.value})}),be("span",{className:"bb-note",children:"Enter a HDR, EXR, JPG, JPEG, PNG, or WEBP URL."}),a.customEnvironmentUrl.trim()&&!qs(a.customEnvironmentUrl)?be("span",{className:"bb-note",style:{color:"#fca5a5"},children:"Invalid image/HDRI URL."}):null]}),be(W,{label:"Environment intensity",value:a.intensity,min:0,max:3,step:.05,onChange:p=>_({...a,intensity:p})})]}):be(In,{requiredTier:"starter",feature:"Environment backgrounds"}):null,o.type==="image"?Jt("label",{className:"se-field",children:[be("span",{className:"se-fieldLabel",children:"Background image URL"}),be("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/background.jpg",value:o.imageUrl,onChange:p=>v({...o,imageUrl:p.target.value})})]}):null,o.type==="color"?Jt("div",{className:"se-field",children:[be("span",{className:"se-fieldLabel",children:"Background color"}),be("div",{className:"se-inlineColorPicker",children:be(wP,{color:o.color,onChange:p=>v({...o,color:p})})}),be("div",{className:"se-fieldInline",children:be(vP,{prefixed:!0,className:"se-swatch",style:{background:o.color,color:da(o.color)},color:o.color,onChange:p=>v({...o,color:p})})})]}):null]}):be("div",{className:"se-placeholder",children:"Background rendering is disabled for this scene preset."})})]})}import{useState as TP}from"react";import{jsx as fe,jsxs as Ms}from"react/jsx-runtime";function bx({pp:e,set:t,open:n,toggle:i}){let{ssao:r}=e;return Ms($e,{title:"SSAO",tooltip:"Adds soft contact shadows in corners, creases, and tight spaces.",open:n.ssao,onToggle:()=>i("ssao"),disabled:!r.enabled,trailing:fe(ot,{checked:r.enabled,onChange:o=>t("ssao",{...r,enabled:o}),label:"Toggle SSAO"}),children:[fe(W,{label:"Samples",value:r.samples,min:1,max:64,step:1,onChange:o=>t("ssao",{...r,samples:o})}),fe(W,{label:"Rings",value:r.rings,min:1,max:12,step:1,onChange:o=>t("ssao",{...r,rings:o})}),fe(W,{label:"Intensity",value:r.intensity,min:0,max:20,step:.5,onChange:o=>t("ssao",{...r,intensity:o})}),fe(W,{label:"Radius",value:r.radius,min:.01,max:1,step:.01,onChange:o=>t("ssao",{...r,radius:o})}),fe(W,{label:"Bias",value:r.bias,min:0,max:.1,step:.001,onChange:o=>t("ssao",{...r,bias:o})}),fe(W,{label:"Luminance Influence",value:r.luminanceInfluence,min:0,max:1,step:.01,onChange:o=>t("ssao",{...r,luminanceInfluence:o})}),fe(W,{label:"Fade",value:r.fade,min:0,max:.1,step:.001,onChange:o=>t("ssao",{...r,fade:o})}),fe(W,{label:"Min Radius Scale",value:r.minRadiusScale,min:0,max:1,step:.01,onChange:o=>t("ssao",{...r,minRadiusScale:o})}),fe(W,{label:"World Distance Threshold",value:r.worldDistanceThreshold,min:0,max:100,step:.1,onChange:o=>t("ssao",{...r,worldDistanceThreshold:o})}),fe(W,{label:"World Distance Falloff",value:r.worldDistanceFalloff,min:0,max:20,step:.1,onChange:o=>t("ssao",{...r,worldDistanceFalloff:o})}),fe(W,{label:"World Proximity Threshold",value:r.worldProximityThreshold,min:0,max:100,step:.1,onChange:o=>t("ssao",{...r,worldProximityThreshold:o})}),fe(W,{label:"World Proximity Falloff",value:r.worldProximityFalloff,min:0,max:20,step:.1,onChange:o=>t("ssao",{...r,worldProximityFalloff:o})})]})}function xx({pp:e,set:t,open:n,toggle:i}){let{autofocus:r}=e;return Ms($e,{title:"Auto focus",tooltip:"Keeps the focus plane tracking a subject so the image stays sharp where you want it.",open:n.autofocus,onToggle:()=>i("autofocus"),disabled:!r.enabled,trailing:fe(ot,{checked:r.enabled,onChange:o=>t("autofocus",{...r,enabled:o}),label:"Toggle Autofocus"}),children:[fe(W,{label:"Focus Distance",value:r.focusDistance,min:0,max:50,step:.1,onChange:o=>t("autofocus",{...r,focusDistance:o})}),fe(W,{label:"Focus Range",value:r.focusRange,min:.1,max:50,step:.1,onChange:o=>t("autofocus",{...r,focusRange:o})}),fe(W,{label:"Focal Length",value:r.focalLength,min:0,max:1,step:.01,onChange:o=>t("autofocus",{...r,focalLength:o})}),fe(W,{label:"Bokeh Scale",value:r.bokehScale,min:0,max:20,step:.1,onChange:o=>t("autofocus",{...r,bokehScale:o})}),fe(xi,{label:"Target",value:r.target,min:-100,max:100,step:.1,onChange:o=>t("autofocus",{...r,target:o})}),fe(ct,{label:"Mouse Follow",checked:r.mouse,onChange:o=>t("autofocus",{...r,mouse:o})}),fe(ct,{label:"Manual Update",checked:r.manual,onChange:o=>t("autofocus",{...r,manual:o})}),fe(W,{label:"Debug",value:r.debug,min:0,max:1,step:.01,onChange:o=>t("autofocus",{...r,debug:o})}),fe(W,{label:"Smooth Time",value:r.smoothTime,min:0,max:2,step:.01,onChange:o=>t("autofocus",{...r,smoothTime:o})})]})}function yx({pp:e,set:t,open:n,toggle:i}){let{godRays:r}=e;return Ms($e,{title:"God Rays",tooltip:"Creates light shafts that streak outward from a bright sun or light source.",open:n.godRays,onToggle:()=>i("godRays"),disabled:!r.enabled,trailing:fe(ot,{checked:r.enabled,onChange:o=>t("godRays",{...r,enabled:o}),label:"Toggle GodRays"}),children:[fe(xi,{label:"Sun Position",value:r.sunPosition,min:-100,max:100,step:.1,onChange:o=>t("godRays",{...r,sunPosition:o})}),fe(W,{label:"Samples",value:r.samples,min:1,max:128,step:1,onChange:o=>t("godRays",{...r,samples:o})}),fe(W,{label:"Density",value:r.density,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,density:o})}),fe(W,{label:"Decay",value:r.decay,min:0,max:1,step:.01,onChange:o=>t("godRays",{...r,decay:o})}),fe(W,{label:"Weight",value:r.weight,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,weight:o})}),fe(W,{label:"Exposure",value:r.exposure,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,exposure:o})}),fe(W,{label:"Clamp Max",value:r.clampMax,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,clampMax:o})}),fe(ct,{label:"Blur",checked:r.blur,onChange:o=>t("godRays",{...r,blur:o})}),fe(Gn,{label:"Kernel Size",value:r.kernelSize,options:Oa,onChange:o=>t("godRays",{...r,kernelSize:o})})]})}function vx({pp:e,set:t,open:n,toggle:i}){let{lensflare:r}=e;return Ms($e,{title:"Lens Flare",tooltip:"Adds camera flare artifacts and glow from a bright light source.",open:n.lensflare,onToggle:()=>i("lensflare"),disabled:!r.enabled,trailing:fe(ot,{checked:r.enabled,onChange:o=>t("lensflare",{...r,enabled:o}),label:"Toggle Lensflare"}),children:[fe(xi,{label:"Lens Position",value:r.lensPosition,min:-100,max:100,step:.1,onChange:o=>t("lensflare",{...r,lensPosition:o})}),fe(W,{label:"Smooth Time",value:r.smoothTime,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,smoothTime:o})}),fe(W,{label:"Glare Size",value:r.glareSize,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,glareSize:o})}),fe(W,{label:"Flare Size",value:r.flareSize,min:0,max:.1,step:.001,onChange:o=>t("lensflare",{...r,flareSize:o})}),fe(W,{label:"Flare Speed",value:r.flareSpeed,min:0,max:.2,step:.001,onChange:o=>t("lensflare",{...r,flareSpeed:o})}),fe(W,{label:"Flare Shape",value:r.flareShape,min:0,max:.2,step:.001,onChange:o=>t("lensflare",{...r,flareShape:o})}),fe(ct,{label:"Animated",checked:r.animated,onChange:o=>t("lensflare",{...r,animated:o})}),fe(ct,{label:"Anamorphic",checked:r.anamorphic,onChange:o=>t("lensflare",{...r,anamorphic:o})}),fe(rr,{label:"Color Gain",value:r.colorGain,onChange:o=>t("lensflare",{...r,colorGain:o})}),fe(W,{label:"Halo Scale",value:r.haloScale,min:0,max:2,step:.01,onChange:o=>t("lensflare",{...r,haloScale:o})}),fe(ct,{label:"Secondary Ghosts",checked:r.secondaryGhosts,onChange:o=>t("lensflare",{...r,secondaryGhosts:o})}),fe(ct,{label:"Additional Streaks",checked:r.aditionalStreaks,onChange:o=>t("lensflare",{...r,aditionalStreaks:o})}),fe(W,{label:"Ghost Scale",value:r.ghostScale,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,ghostScale:o})}),fe(W,{label:"Opacity",value:r.opacity,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,opacity:o})}),fe(ct,{label:"Star Burst",checked:r.starBurst,onChange:o=>t("lensflare",{...r,starBurst:o})})]})}function wx({pp:e,set:t,open:n,toggle:i}){let{depthOfField:r}=e;return Ms($e,{title:"Depth Of Field",tooltip:"Blurs areas that sit away from the focal plane for a camera-like look.",open:n.depthOfField,onToggle:()=>i("depthOfField"),disabled:!r.enabled,trailing:fe(ot,{checked:r.enabled,onChange:o=>t("depthOfField",{...r,enabled:o}),label:"Toggle DepthOfField"}),children:[fe(W,{label:"Focus Distance",value:r.focusDistance,min:0,max:50,step:.1,onChange:o=>t("depthOfField",{...r,focusDistance:o})}),fe(W,{label:"Focus Range",value:r.focusRange,min:.1,max:50,step:.1,onChange:o=>t("depthOfField",{...r,focusRange:o})}),fe(W,{label:"Focal Length",value:r.focalLength,min:0,max:1,step:.01,onChange:o=>t("depthOfField",{...r,focalLength:o})}),fe(W,{label:"Bokeh Scale",value:r.bokehScale,min:0,max:20,step:.1,onChange:o=>t("depthOfField",{...r,bokehScale:o})})]})}import{jsx as He,jsxs as ua}from"react/jsx-runtime";var MP=["linear","reinhard","aces"];function Cx({pp:e,set:t,open:n,toggle:i}){let{colorAverage:r}=e;return He($e,{title:"Color Average",tooltip:"Blends the frame toward a single average color for a washed-out stylized look.",open:n.colorAverage,onToggle:()=>i("colorAverage"),disabled:!r.enabled,trailing:He(ot,{checked:r.enabled,onChange:o=>t("colorAverage",{...r,enabled:o}),label:"Toggle ColorAverage"}),children:He("div",{className:"se-placeholder",children:"Averages the frame color using the docs default blend mode."})})}function Sx({pp:e,set:t,open:n,toggle:i}){let{brightnessContrast:r}=e;return ua($e,{title:"Brightness Contrast",tooltip:"Raises or lowers overall brightness and contrast across the scene.",open:n.brightnessContrast,onToggle:()=>i("brightnessContrast"),disabled:!r.enabled,trailing:He(ot,{checked:r.enabled,onChange:o=>t("brightnessContrast",{...r,enabled:o}),label:"Toggle BrightnessContrast"}),children:[He(W,{label:"Brightness",value:r.brightness,min:-1,max:1,step:.01,onChange:o=>t("brightnessContrast",{...r,brightness:o})}),He(W,{label:"Contrast",value:r.contrast,min:-1,max:1,step:.01,onChange:o=>t("brightnessContrast",{...r,contrast:o})})]})}function Mx({pp:e,set:t,open:n,toggle:i}){let{hueSaturation:r}=e;return ua($e,{title:"Hue Saturation",tooltip:"Shifts the hue and saturation to tint the whole image.",open:n.hueSaturation,onToggle:()=>i("hueSaturation"),disabled:!r.enabled,trailing:He(ot,{checked:r.enabled,onChange:o=>t("hueSaturation",{...r,enabled:o}),label:"Toggle HueSaturation"}),children:[He(W,{label:"Hue",value:r.hue,min:-Math.PI,max:Math.PI,step:.01,formatValue:o=>`${o.toFixed(2)} rad`,onChange:o=>t("hueSaturation",{...r,hue:o})}),He(W,{label:"Saturation",value:r.saturation,min:-1,max:1,step:.01,onChange:o=>t("hueSaturation",{...r,saturation:o})})]})}function Tx({pp:e,set:t,open:n,toggle:i}){let{vignette:r}=e;return ua($e,{title:"Vignette",tooltip:"Darkens the edges of the screen so the center feels more focused.",open:n.vignette,onToggle:()=>i("vignette"),disabled:!r.enabled,trailing:He(ot,{checked:r.enabled,onChange:o=>t("vignette",{...r,enabled:o}),label:"Toggle Vignette"}),children:[He(W,{label:"Offset",value:r.offset,min:0,max:1,step:.01,onChange:o=>t("vignette",{...r,offset:o})}),He(W,{label:"Darkness",value:r.darkness,min:0,max:1,step:.01,onChange:o=>t("vignette",{...r,darkness:o})}),He(ct,{label:"Eskil",checked:r.eskil,onChange:o=>t("vignette",{...r,eskil:o})})]})}function Px({pp:e,set:t,open:n,toggle:i}){let{bloom:r}=e;return ua($e,{title:"Bloom",tooltip:"Makes bright areas glow and bleed softly into nearby pixels.",open:n.bloom,onToggle:()=>i("bloom"),disabled:!r.enabled,trailing:He(ot,{checked:r.enabled,onChange:o=>t("bloom",{...r,enabled:o}),label:"Toggle Bloom"}),children:[He(W,{label:"Threshold",value:r.luminanceThreshold,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,luminanceThreshold:o})}),He(W,{label:"Smoothing",value:r.luminanceSmoothing,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,luminanceSmoothing:o})}),He(W,{label:"Intensity",value:r.intensity,min:0,max:3,step:.05,onChange:o=>t("bloom",{...r,intensity:o})}),He(ct,{label:"Mipmap Blur",checked:r.mipmapBlur,onChange:o=>t("bloom",{...r,mipmapBlur:o})}),He(W,{label:"Radius",value:r.radius,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,radius:o})}),He(W,{label:"Levels",value:r.levels,min:1,max:16,step:1,onChange:o=>t("bloom",{...r,levels:o})})]})}function _x({pp:e,set:t,open:n,toggle:i}){let{toneMapping:r}=e;return ua($e,{title:"Tone Mapping",tooltip:"Remaps HDR lighting to screen output and controls exposure style.",open:n.toneMapping,onToggle:()=>i("toneMapping"),disabled:!r.enabled,trailing:He(ot,{checked:r.enabled,onChange:o=>t("toneMapping",{...r,enabled:o}),label:"Toggle ToneMapping"}),children:[ua("div",{className:"se-field",children:[He("span",{className:"se-fieldLabel",children:"Mode"}),He("div",{className:"se-segmentedControl",children:MP.map(o=>He("button",{type:"button",className:`se-segmentedOption ${r.mode===o?"se-segmentedOption--active":""}`,onClick:()=>t("toneMapping",{...r,mode:o}),children:o==="aces"?"Filmic":o.charAt(0).toUpperCase()+o.slice(1)},o))})]}),He(W,{label:"Resolution",value:r.resolution,min:64,max:4096,step:64,onChange:o=>t("toneMapping",{...r,resolution:o})}),He(W,{label:"White Point",value:r.whitePoint,min:0,max:16,step:.01,onChange:o=>t("toneMapping",{...r,whitePoint:o})}),He(W,{label:"Middle Grey",value:r.middleGrey,min:0,max:1,step:.01,onChange:o=>t("toneMapping",{...r,middleGrey:o})}),He(W,{label:"Min Luminance",value:r.minLuminance,min:0,max:1,step:.01,onChange:o=>t("toneMapping",{...r,minLuminance:o})}),He(W,{label:"Average Luminance",value:r.averageLuminance,min:0,max:4,step:.01,onChange:o=>t("toneMapping",{...r,averageLuminance:o})}),He(W,{label:"Adaptation Rate",value:r.adaptationRate,min:0,max:10,step:.01,onChange:o=>t("toneMapping",{...r,adaptationRate:o})}),He(W,{label:"Exposure",value:r.exposure,min:0,max:3,step:.01,onChange:o=>t("toneMapping",{...r,exposure:o})})]})}function kx({pp:e,set:t,open:n,toggle:i}){let{sepia:r}=e;return He($e,{title:"Sepia",tooltip:"Adds a warm vintage brown tint to the entire image.",open:n.sepia,onToggle:()=>i("sepia"),disabled:!r.enabled,trailing:He(ot,{checked:r.enabled,onChange:o=>t("sepia",{...r,enabled:o}),label:"Toggle Sepia"}),children:He(W,{label:"Intensity",value:r.intensity,min:0,max:1,step:.01,onChange:o=>t("sepia",{...r,intensity:o})})})}import{jsx as Le,jsxs as pa}from"react/jsx-runtime";function Ax({pp:e,set:t,open:n,toggle:i}){let{dotScreen:r}=e;return pa($e,{title:"Dot Screen",tooltip:"Overlays a halftone dot pattern for a printed or retro look.",open:n.dotScreen,onToggle:()=>i("dotScreen"),disabled:!r.enabled,trailing:Le(ot,{checked:r.enabled,onChange:o=>t("dotScreen",{...r,enabled:o}),label:"Toggle DotScreen"}),children:[Le(W,{label:"Angle",value:r.angle,min:0,max:Math.PI*2,step:.01,formatValue:o=>`${o.toFixed(2)} rad`,onChange:o=>t("dotScreen",{...r,angle:o})}),Le(W,{label:"Scale",value:r.scale,min:.1,max:10,step:.05,onChange:o=>t("dotScreen",{...r,scale:o})})]})}function Ex({pp:e,set:t,open:n,toggle:i}){let{glitch:r}=e;return pa($e,{title:"Glitch",tooltip:"Introduces digital distortion, tearing, and scan noise.",open:n.glitch,onToggle:()=>i("glitch"),disabled:!r.enabled,trailing:Le(ot,{checked:r.enabled,onChange:o=>t("glitch",{...r,enabled:o}),label:"Toggle Glitch"}),children:[Le(Gn,{label:"Mode",value:r.mode,options:Bh,onChange:o=>t("glitch",{...r,mode:o})}),Le(ro,{label:"Delay",value:r.delay,min:0,max:10,step:.01,onChange:o=>t("glitch",{...r,delay:o})}),Le(ro,{label:"Duration",value:r.duration,min:0,max:5,step:.01,onChange:o=>t("glitch",{...r,duration:o})}),Le(ro,{label:"Strength",value:r.strength,min:0,max:2,step:.01,onChange:o=>t("glitch",{...r,strength:o})}),Le(ro,{label:"Chromatic Aberration Offset",value:r.chromaticAberrationOffset,min:0,max:.02,step:1e-4,onChange:o=>t("glitch",{...r,chromaticAberrationOffset:o})}),Le(W,{label:"Columns",value:r.columns,min:0,max:.5,step:.001,onChange:o=>t("glitch",{...r,columns:o})}),Le(W,{label:"Ratio",value:r.ratio,min:0,max:1,step:.01,onChange:o=>t("glitch",{...r,ratio:o})})]})}function Rx({pp:e,set:t,open:n,toggle:i}){let{grid:r}=e;return pa($e,{title:"Grid",tooltip:"Adds a visual grid overlay that feels retro or debug-like.",open:n.grid,onToggle:()=>i("grid"),disabled:!r.enabled,trailing:Le(ot,{checked:r.enabled,onChange:o=>t("grid",{...r,enabled:o}),label:"Toggle Grid"}),children:[Le(W,{label:"Scale",value:r.scale,min:.1,max:10,step:.05,onChange:o=>t("grid",{...r,scale:o})}),Le(W,{label:"Line Width",value:r.lineWidth,min:0,max:1,step:.01,onChange:o=>t("grid",{...r,lineWidth:o})})]})}function Lx({pp:e,set:t,open:n,toggle:i}){let{chromaticAberration:r}=e;return pa($e,{title:"Chromatic Aberration",tooltip:"Separates color channels slightly to mimic lens fringing.",open:n.chromaticAberration,onToggle:()=>i("chromaticAberration"),disabled:!r.enabled,trailing:Le(ot,{checked:r.enabled,onChange:o=>t("chromaticAberration",{...r,enabled:o}),label:"Toggle ChromaticAberration"}),children:[Le(W,{label:"Offset X",value:r.offsetX,min:0,max:.02,step:1e-4,onChange:o=>t("chromaticAberration",{...r,offsetX:o})}),Le(W,{label:"Offset Y",value:r.offsetY,min:0,max:.02,step:1e-4,onChange:o=>t("chromaticAberration",{...r,offsetY:o})}),Le(ct,{label:"Radial Modulation",checked:r.radialModulation,onChange:o=>t("chromaticAberration",{...r,radialModulation:o})}),Le(W,{label:"Modulation Offset",value:r.modulationOffset,min:0,max:1,step:.01,onChange:o=>t("chromaticAberration",{...r,modulationOffset:o})})]})}function Bx({pp:e,set:t,open:n,toggle:i}){let{noise:r}=e;return pa($e,{title:"Noise",tooltip:"Adds film grain or static noise to the rendered image.",open:n.noise,onToggle:()=>i("noise"),disabled:!r.enabled,trailing:Le(ot,{checked:r.enabled,onChange:o=>t("noise",{...r,enabled:o}),label:"Toggle Noise"}),children:[Le(W,{label:"Amount",value:r.opacity,min:0,max:1,step:.01,onChange:o=>t("noise",{...r,opacity:o})}),Le(ct,{label:"Premultiply",checked:r.premultiply,onChange:o=>t("noise",{...r,premultiply:o})})]})}function Ox({pp:e,set:t,open:n,toggle:i}){let{scanline:r}=e;return Le($e,{title:"Scan Line",tooltip:"Draws horizontal CRT-style scan lines over the frame.",open:n.scanline,onToggle:()=>i("scanline"),disabled:!r.enabled,trailing:Le(ot,{checked:r.enabled,onChange:o=>t("scanline",{...r,enabled:o}),label:"Toggle Scanline"}),children:Le(W,{label:"Density",value:r.density,min:0,max:10,step:.25,onChange:o=>t("scanline",{...r,density:o})})})}function Dx({pp:e,set:t,open:n,toggle:i}){let{pixelation:r}=e;return Le($e,{title:"Pixelation",tooltip:"Reduces detail into larger pixels for a blocky stylized effect.",open:n.pixelation,onToggle:()=>i("pixelation"),disabled:!r.enabled,trailing:Le(ot,{checked:r.enabled,onChange:o=>t("pixelation",{...r,enabled:o}),label:"Toggle Pixelation"}),children:Le(W,{label:"Granularity",value:r.granularity,min:0,max:20,step:1,onChange:o=>t("pixelation",{...r,granularity:o})})})}function Nx({pp:e,set:t,open:n,toggle:i}){let{ramp:r}=e;return pa($e,{title:"Ramp",tooltip:"Adds a screen-space color gradient, or masks effects earlier in the stack.",open:n.ramp,onToggle:()=>i("ramp"),disabled:!r.enabled,trailing:Le(ot,{checked:r.enabled,onChange:o=>t("ramp",{...r,enabled:o}),label:"Toggle Ramp"}),children:[Le(Gn,{label:"Ramp Type",value:r.rampType,options:Oh,onChange:o=>t("ramp",{...r,rampType:o})}),Le(ro,{label:"Ramp Start",value:r.rampStart,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampStart:o})}),Le(ro,{label:"Ramp End",value:r.rampEnd,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampEnd:o})}),Le(rr,{label:"Start Color",value:r.startColor,onChange:o=>t("ramp",{...r,startColor:o})}),Le(rr,{label:"End Color",value:r.endColor,onChange:o=>t("ramp",{...r,endColor:o})}),!r.rampMask&&Le(W,{label:"Gradient Opacity",value:r.opacity??.5,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,opacity:o})}),Le(W,{label:"Bias",value:r.rampBias,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampBias:o})}),Le(W,{label:"Gain",value:r.rampGain,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampGain:o})}),Le(ct,{label:"Mask Earlier Effects",checked:r.rampMask,onChange:o=>t("ramp",{...r,rampMask:o})}),Le(ct,{label:"Invert",checked:r.rampInvert,onChange:o=>t("ramp",{...r,rampInvert:o})})]})}import{jsx as Nt,jsxs as Vx}from"react/jsx-runtime";function Ix({pp:e,set:t,open:n,toggle:i}){let{outline:r}=e;return Vx($e,{title:"Outline",tooltip:"Draws a visible edge around the selected object binding.",open:n.outline,onToggle:()=>i("outline"),disabled:!r.enabled,trailing:Nt(ot,{checked:r.enabled,onChange:o=>t("outline",{...r,enabled:o}),label:"Toggle Outline"}),children:[Nt("div",{className:"se-placeholder",children:"Outlines the currently selected object binding in the model editor."}),Nt(W,{label:"Selection Layer",value:r.selectionLayer,min:0,max:20,step:1,onChange:o=>t("outline",{...r,selectionLayer:o})}),Nt(W,{label:"Edge Strength",value:r.edgeStrength,min:0,max:10,step:.1,onChange:o=>t("outline",{...r,edgeStrength:o})}),Nt(W,{label:"Pulse Speed",value:r.pulseSpeed,min:0,max:10,step:.1,onChange:o=>t("outline",{...r,pulseSpeed:o})}),Nt(rr,{label:"Visible Edge Color",value:r.visibleEdgeColor,onChange:o=>t("outline",{...r,visibleEdgeColor:o})}),Nt(rr,{label:"Hidden Edge Color",value:r.hiddenEdgeColor,onChange:o=>t("outline",{...r,hiddenEdgeColor:o})}),Nt(Gn,{label:"Kernel Size",value:r.kernelSize,options:Oa,onChange:o=>t("outline",{...r,kernelSize:o})}),Nt(ct,{label:"Blur",checked:r.blur,onChange:o=>t("outline",{...r,blur:o})}),Nt(ct,{label:"X-Ray",checked:r.xRay,onChange:o=>t("outline",{...r,xRay:o})})]})}function zx({pp:e,set:t,open:n,toggle:i}){let{selectiveBloom:r}=e;return Vx($e,{title:"Selective Bloom",tooltip:"Applies bloom only to objects assigned to the selected layer.",open:n.selectiveBloom,onToggle:()=>i("selectiveBloom"),disabled:!r.enabled,trailing:Nt(ot,{checked:r.enabled,onChange:o=>t("selectiveBloom",{...r,enabled:o}),label:"Toggle SelectiveBloom"}),children:[Nt("div",{className:"se-placeholder",children:"Applies bloom to the currently selected object binding."}),Nt(W,{label:"Selection Layer",value:r.selectionLayer,min:0,max:20,step:1,onChange:o=>t("selectiveBloom",{...r,selectionLayer:o})}),Nt(W,{label:"Intensity",value:r.intensity,min:0,max:5,step:.05,onChange:o=>t("selectiveBloom",{...r,intensity:o})}),Nt(W,{label:"Threshold",value:r.luminanceThreshold,min:0,max:1,step:.01,onChange:o=>t("selectiveBloom",{...r,luminanceThreshold:o})}),Nt(W,{label:"Smoothing",value:r.luminanceSmoothing,min:0,max:1,step:.01,onChange:o=>t("selectiveBloom",{...r,luminanceSmoothing:o})}),Nt(Gn,{label:"Kernel Size",value:r.kernelSize,options:Oa,onChange:o=>t("selectiveBloom",{...r,kernelSize:o})}),Nt(ct,{label:"Mipmap Blur",checked:r.mipmapBlur,onChange:o=>t("selectiveBloom",{...r,mipmapBlur:o})}),Nt(ct,{label:"Inverted",checked:r.inverted,onChange:o=>t("selectiveBloom",{...r,inverted:o})}),Nt(ct,{label:"Ignore Background",checked:r.ignoreBackground,onChange:o=>t("selectiveBloom",{...r,ignoreBackground:o})})]})}function jx({pp:e,set:t,open:n,toggle:i}){let{smaa:r}=e;return Nt($e,{title:"SMAA",tooltip:"Reduces jagged edges with subpixel anti-aliasing.",open:n.smaa,onToggle:()=>i("smaa"),trailing:Nt(ot,{checked:r.enabled,onChange:o=>t("smaa",{...r,enabled:o}),label:"Toggle SMAA"}),children:Nt("div",{className:"se-placeholder",children:"Subpixel Morphological Anti-Aliasing smooths jagged edges in post-process."})})}import{jsx as It,jsxs as PP}from"react/jsx-runtime";function vp({config:e,onChange:t}){let[n,i]=TP({autofocus:!1,colorAverage:!1,dotScreen:!1,glitch:!1,godRays:!1,grid:!1,lensflare:!1,outline:!1,selectiveBloom:!1,ramp:!1,ssao:!1,brightnessContrast:!1,hueSaturation:!1,depthOfField:!1,chromaticAberration:!1,vignette:!1,bloom:!1,toneMapping:!1,noise:!1,sepia:!1,scanline:!1,pixelation:!1,smaa:!1}),r=c=>i(l=>({...l,[c]:!l[c]})),o=e.postProcessing,s={pp:o,set:(c,l)=>t({...e,postProcessing:{...o,[c]:l}}),open:n,toggle:r};return PP("div",{className:"se-generalContent",children:[It(bx,{...s}),It(xx,{...s}),It(Cx,{...s}),It(Ax,{...s}),It(Ex,{...s}),It(yx,{...s}),It(Rx,{...s}),It(vx,{...s}),It(Ix,{...s}),It(zx,{...s}),It(Sx,{...s}),It(Mx,{...s}),It(wx,{...s}),It(Lx,{...s}),It(Tx,{...s}),It(Px,{...s}),It(_x,{...s}),It(Bx,{...s}),It(kx,{...s}),It(Ox,{...s}),It(Dx,{...s}),It(Nx,{...s}),It(jx,{...s})]})}import{useState as Fx,useSyncExternalStore as _P}from"react";import{Eye as kP,EyeOff as AP,Plus as EP,Trash2 as RP}from"lucide-react";import{Fragment as Ux,jsx as Te,jsxs as Hn}from"react/jsx-runtime";var LP=["512","1024","2048","4096"],Gx={none:"None",directional:"Direction",point:"Point",spot:"Spot",hemisphere:"Hemi"};function BP({index:e,light:t,selected:n,onSelect:i,onToggleVisible:r}){return Hn("div",{className:`se-lightRow ${n?"se-lightRow--active":""}`,onClick:i,children:[Hn("span",{className:"se-lightRowLabel",children:[e+1,": ",Gx[t.type]]}),Te("button",{type:"button",className:"se-iconButton","aria-label":t.visible?"Hide light":"Show light",onClick:o=>{o.stopPropagation(),r()},children:t.visible?Te(kP,{size:14}):Te(AP,{size:14})})]})}function OP(){return{id:crypto.randomUUID(),type:"directional",color:"#ffffff",intensity:1,position:[5,10,5],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0}}function wp({config:e,onChange:t}){let[n,i]=Fx({lights:!0,shadows:!1,groundShadows:!1,environment:!1,envShadow:!1}),r=_P(dp,fc),[o,a]=Fx(e.lighting.lights[0]?.id??null),s=r??o,c=b=>{a(b),ws(b)},l=b=>i(C=>({...C,[b]:!C[b]})),{tier:u}=nr(),d=Qr(u,"starter"),{lighting:h,shadows:g,groundShadows:f,environment:v}=e,_=b=>t({...e,lighting:b}),y=b=>t({...e,shadows:b}),p=b=>t({...e,groundShadows:b}),m=b=>t({...e,environment:b}),S=(b,C)=>{_({...h,lights:h.lights.map(x=>x.id===b?{...x,...C}:x)})},M=h.lights.find(b=>b.id===s)??null,T=()=>{let b=OP();_({...h,lights:[...h.lights,b]}),c(b.id)},R=()=>{if(!M)return;let b=h.lights.filter(C=>C.id!==M.id);_({...h,lights:b}),c(b[0]?.id??null)};return Hn("div",{className:"se-generalContent",children:[Hn($e,{title:"Lights",open:n.lights,onToggle:()=>l("lights"),children:[Te("div",{className:"se-lightList",children:h.lights.map((b,C)=>Te(BP,{index:C,light:b,selected:b.id===s,onSelect:()=>c(b.id),onToggleVisible:()=>S(b.id,{visible:!b.visible})},b.id))}),Hn("div",{className:"se-lightActions",children:[Te("button",{type:"button",className:"se-iconButton",onClick:T,title:"Add light",children:Te(EP,{size:14})}),M&&h.lights.length>1&&Te("button",{type:"button",className:"se-iconButton",onClick:R,title:"Remove selected light",children:Te(RP,{size:14})})]}),M?Hn("div",{className:"se-lightProps",children:[Hn("div",{className:"se-field",children:[Te("span",{className:"se-fieldLabel",children:"Type"}),Te("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:Eh.map(b=>Te("button",{type:"button",className:`se-segmentedOption ${M.type===b?"se-segmentedOption--active":""}`,onClick:()=>S(M.id,{type:b}),children:Gx[b]},b))})]}),Te(rr,{label:"Color",value:M.color,onChange:b=>S(M.id,{color:b})}),Te(W,{label:"Intensity",value:M.intensity,min:0,max:10,step:.1,onChange:b=>S(M.id,{intensity:b})}),M.type!=="hemisphere"&&M.type!=="none"&&Te(xi,{label:"Position",value:M.position,min:-100,max:100,step:.05,onChange:b=>S(M.id,{position:b})}),M.type==="spot"&&Hn(Ux,{children:[Te(W,{label:"Angle",value:M.angle??Math.PI/6,min:0,max:Math.PI/2,step:.01,formatValue:b=>`${Math.round(b*180/Math.PI)}\xB0`,onChange:b=>S(M.id,{angle:b})}),Te(W,{label:"Penumbra",value:M.penumbra??.2,min:0,max:1,step:.01,onChange:b=>S(M.id,{penumbra:b})}),Te(W,{label:"Distance",value:M.distance??0,min:0,max:100,step:.5,onChange:b=>S(M.id,{distance:b})}),Te(W,{label:"Decay",value:M.decay??2,min:0,max:4,step:.1,onChange:b=>S(M.id,{decay:b})})]}),Te(ct,{label:"Attached to camera",checked:M.attachedToCamera,onChange:b=>S(M.id,{attachedToCamera:b})}),Te(ct,{label:"Cast shadows",checked:M.castShadow,onChange:b=>S(M.id,{castShadow:b})}),Te(W,{label:"Shadow bias",value:M.shadowBias,min:-.01,max:.01,step:1e-4,onChange:b=>S(M.id,{shadowBias:b})})]}):null]}),Hn($e,{title:"Shadows",open:n.shadows,onToggle:()=>l("shadows"),disabled:!g.enabled,trailing:Te(ot,{checked:g.enabled,onChange:b=>y({...g,enabled:b}),label:"Toggle shadows"}),children:[Te(Gn,{label:"Map size",value:String(g.mapSize),options:LP,onChange:b=>y({...g,mapSize:Number(b)})}),Te(W,{label:"Bias",value:g.bias,min:-.01,max:.01,step:1e-4,onChange:b=>y({...g,bias:b})}),Te(W,{label:"Normal bias",value:g.normalBias,min:0,max:.2,step:.01,onChange:b=>y({...g,normalBias:b})}),Te(W,{label:"Radius (softness)",value:g.radius,min:0,max:20,step:.5,onChange:b=>y({...g,radius:b})})]}),Hn($e,{title:"Ground Shadows",open:n.groundShadows,onToggle:()=>l("groundShadows"),disabled:!f.enabled,trailing:Te(ot,{checked:f.enabled,onChange:b=>p({...f,enabled:b}),label:"Toggle ground shadows"}),children:[Hn("div",{className:"se-field",children:[Te("span",{className:"se-fieldLabel",children:"Mode"}),Te("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:["shadowCatcher"].map(b=>Te("button",{type:"button",className:`se-segmentedOption ${f.mode===b?"se-segmentedOption--active":""}`,onClick:()=>p({...f,mode:b}),children:b==="shadowCatcher"?"Shadow Catcher":"Baked AO"},b))})]}),f.mode==="bakedAO"&&Te("div",{className:"se-placeholder",children:"Requires pre-baked AO textures \u2014 not yet available."}),Te(W,{label:"Intensity",value:f.intensity,min:0,max:1,step:.01,onChange:b=>p({...f,intensity:b})}),Te(W,{label:"Border fade",value:f.borderFade,min:0,max:10,step:.1,onChange:b=>p({...f,borderFade:b})}),Te(W,{label:"Height",value:f.height,min:-5,max:5,step:.1,onChange:b=>p({...f,height:b})}),Te(W,{label:"Size",value:f.size,min:1,max:50,step:.5,onChange:b=>p({...f,size:b})})]}),Te($e,{title:"Environment",open:n.environment,onToggle:()=>l("environment"),children:d?Hn(Ux,{children:[Te(W,{label:"Orientation",value:v.rotation,min:0,max:360,step:1,formatValue:b=>`${b}\xB0`,onChange:b=>m({...v,rotation:b})}),Te(W,{label:"Brightness",value:v.intensity,min:0,max:3,step:.05,onChange:b=>m({...v,intensity:b})}),Hn($e,{title:"Shadow",open:n.envShadow,onToggle:()=>l("envShadow"),trailing:Te(ot,{checked:v.shadowLight.enabled,onChange:b=>m({...v,shadowLight:{...v.shadowLight,enabled:b}}),label:"Toggle environment shadow light"}),disabled:!v.shadowLight.enabled,children:[Te(W,{label:"Light intensity",value:v.shadowLight.intensity,min:0,max:20,step:.1,onChange:b=>m({...v,shadowLight:{...v.shadowLight,intensity:b}})}),Te(W,{label:"Shadow bias",value:v.shadowLight.bias,min:-.01,max:.01,step:1e-4,onChange:b=>m({...v,shadowLight:{...v.shadowLight,bias:b}})})]})]}):Te(In,{requiredTier:"starter",feature:"Environment lighting"})})]})}import{useMemo as DP,useState as NP}from"react";import{ChevronDown as IP,Pause as zP,Play as jP,Square as VP,Trash2 as FP}from"lucide-react";import{jsx as Xe,jsxs as zt}from"react/jsx-runtime";function UP(e){if(!Number.isFinite(e)||e<=0)return"Unknown duration";let t=Math.round(e*10)/10;if(t<60)return`${t.toFixed(1)}s`;let n=Math.floor(t/60),i=(t%60).toFixed(1).padStart(4,"0");return`${n}:${i}`}function Hx(e){let t=Number.isFinite(e)&&e>0?e:0;if(t<60)return`${t.toFixed(1)}s`;let n=Math.floor(t/60),i=(t%60).toFixed(1).padStart(4,"0");return`${n}:${i}`}function GP(e){return Number.isFinite(e)?Math.min(3,Math.max(.1,Number(e.toFixed(2)))):1}function Cp({config:e,onChange:t,clipDetails:n,currentClip:i,isPlaying:r,time:o,play:a,pause:s,stop:c,setSpeed:l,seek:u}){let[d,h]=NP(!1),g=DP(()=>new Map(n.map(b=>[b.sourceName,b.duration])),[n]),f=e.animations.clips.filter(b=>!b.hidden),v=e.animations.clips.filter(b=>b.hidden),_=(b,C=e.animations.autoplayClip)=>{t({...e,animations:{clips:b(e.animations.clips),autoplayClip:C}})},y=(b,C)=>{_(x=>x.map(P=>P.sourceName===b?C(P):P))},p=(b,C)=>{y(b,x=>({...x,loopMode:C}))},m=(b,C)=>{let x=GP(C);y(b,P=>({...P,speed:x})),i===b&&l(x)},S=(b,C)=>{y(b,x=>({...x,displayName:C}))},M=b=>{let C=e.animations.autoplayClip===b?null:b;t({...e,animations:{...e.animations,autoplayClip:C}})},T=b=>{_(C=>C.map(x=>x.sourceName===b?{...x,hidden:!0}:x),e.animations.autoplayClip===b?null:e.animations.autoplayClip),i===b&&c()},R=b=>{_(C=>C.map(x=>x.sourceName===b?{...x,hidden:!1}:x))};return e.animations.clips.length===0?Xe(no,{title:"Animations",children:Xe("div",{className:"se-helperCard",children:"Upload a model with embedded animations to manage playback, naming, autoplay, and per-clip speed here."})}):zt(no,{title:"Animations",children:[f.length===0&&Xe("div",{className:"se-helperCard",children:Xe("span",{children:"Preview clips directly in the viewer, choose one optional autoplay animation, and use soft delete to hide clips without modifying the GLB."})}),f.length===0?Xe("div",{className:"se-placeholder",children:"All animations are currently removed. Restore a clip below to make it available again."}):Xe("div",{className:"se-animationList",children:f.map(b=>{let C=i===b.sourceName,x=g.get(b.sourceName)??0;return zt("article",{className:`se-animationCard ${C?"se-animationCard--active":""}`,children:[zt("div",{className:"se-animationHeader",children:[zt("div",{className:"se-animationHeading",children:[zt("div",{className:"se-animationTitleRow",children:[Xe("span",{className:"se-animationStatus",children:C?r?"Playing":"Paused":"Ready"}),e.animations.autoplayClip===b.sourceName?Xe("span",{className:"se-animationBadge",children:"Autoplay"}):null]}),Xe("div",{className:"se-animationSource",children:b.sourceName})]}),Xe("button",{type:"button",className:"se-animationDangerButton",onClick:()=>T(b.sourceName),title:"Remove animation",children:Xe(FP,{size:16})})]}),zt("div",{className:"se-field",children:[Xe("span",{className:"se-fieldLabel",children:"Display name"}),Xe("input",{className:"se-textInput",value:b.displayName,onChange:I=>S(b.sourceName,I.target.value),placeholder:"Animation name"})]}),zt("div",{className:"se-animationMeta",children:[Xe("span",{children:UP(x)}),Xe("span",{children:b.loopMode==="once"?"Play once":"Looping"}),zt("span",{children:[b.speed.toFixed(2),"x"]})]}),zt("div",{className:"se-animationButtonRow",children:[(()=>{let I=C&&r;return Xe("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:()=>I?s():a(b.sourceName),"aria-label":I?"Pause":"Play",title:I?"Pause":"Play",children:I?Xe(zP,{size:16}):Xe(jP,{size:16})})})(),Xe("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:c,disabled:!C,"aria-label":"Stop",title:"Stop",children:Xe(VP,{size:16})})]}),zt("div",{className:"se-animationSeekRow",children:[Xe("input",{className:"se-slider se-animationSeek",type:"range",min:0,max:Math.max(x,.001),step:.01,value:C?Math.min(o,x):0,disabled:!C||x<=0,onChange:I=>u(Number(I.target.value)),"aria-label":"Seek"}),zt("span",{className:"se-animationSeekTime",children:[Hx(C?Math.min(o,x):0)," / ",Hx(x)]})]}),zt("div",{className:"se-animationGrid",children:[zt("label",{className:"se-field",children:[Xe("span",{className:"se-fieldLabel",children:"Loop mode"}),zt("select",{className:"se-select",value:b.loopMode,onChange:I=>p(b.sourceName,I.target.value),children:[Xe("option",{value:"repeat",children:"Loop"}),Xe("option",{value:"once",children:"Play Once"})]})]}),zt("label",{className:"se-field",children:[zt("span",{className:"se-fieldLabel",children:["Speed",zt("span",{className:"se-fieldValue",children:[b.speed.toFixed(2),"x"]})]}),zt("div",{className:"se-animationSpeedRow",children:[Xe("input",{className:"se-slider",type:"range",min:.1,max:3,step:.1,value:b.speed,onChange:I=>m(b.sourceName,Number(I.target.value))}),Xe("input",{className:"se-numberInput se-animationSpeedInput",type:"number",min:.1,max:3,step:.1,value:b.speed,onChange:I=>m(b.sourceName,Number(I.target.value))})]})]})]}),Xe("button",{type:"button",className:`se-animationAutoplayButton ${e.animations.autoplayClip===b.sourceName?"se-animationAutoplayButton--active":""}`,onClick:()=>M(b.sourceName),children:e.animations.autoplayClip===b.sourceName?"Disable autoplay":"Set as autoplay"})]},b.sourceName)})}),v.length>0?zt("section",{className:"se-removedAnimations",children:[Xe("button",{type:"button",className:"se-panelHeader",onClick:()=>h(b=>!b),children:zt("span",{className:"se-panelHeaderMain",children:[Xe(IP,{size:16,className:`se-panelChevron ${d?"se-panelChevron--open":""}`}),zt("span",{className:"se-panelTitle",children:["Removed Animations (",v.length,")"]})]})}),d?Xe("div",{className:"se-removedAnimationList",children:v.map(b=>zt("div",{className:"se-removedAnimationRow",children:[zt("div",{children:[Xe("div",{className:"se-removedAnimationName",children:b.displayName||b.sourceName}),Xe("div",{className:"se-animationSource",children:b.sourceName})]}),Xe("button",{type:"button",className:"se-animationButton",onClick:()=>R(b.sourceName),children:"Restore"})]},b.sourceName))}):null]}):null]})}import{useState as Wx}from"react";import{Pencil as HP,Trash2 as WP}from"lucide-react";import{jsx as pn,jsxs as ir}from"react/jsx-runtime";function Sp({config:e,onChange:t}){let[n,i]=Wx(null),[r,o]=Wx({title:"",description:""}),a=e.annotations,s=d=>{i(d),o({title:d.title,description:d.description||""})},c=()=>{if(!n||!r.title.trim())return;let d=a.map(h=>h.id===n.id?{...h,title:r.title.trim(),description:r.description||""}:h);t({...e,annotations:d}),i(null),o({title:"",description:""})},l=d=>{if(window.confirm("Delete this annotation?")){let g=a.filter(f=>f.id!==d).map((f,v)=>({...f,id:v+1}));t({...e,annotations:g}),i(null),o({title:"",description:""})}},u=()=>{i(null),o({title:"",description:""})};return ir(no,{title:"Annotations",children:[e.annotations.length===0?pn("div",{className:"bb-emptyAnnotations",children:"No annotations yet. Double-click on the model to add one."}):pn("div",{className:"bb-annotationsList",children:e.annotations.map(d=>ir("div",{className:"bb-annotationCard",children:[ir("div",{className:"bb-annotationHeader",children:[ir("div",{className:"bb-annotationBadge",children:["#",d.id]}),ir("div",{className:"bb-annotationActions",children:[pn("button",{className:"bb-annotationAction bb-annotationAction--edit",onClick:()=>s(d),title:"Edit annotation",children:pn(HP,{size:16})}),pn("button",{className:"bb-annotationAction bb-annotationAction--delete",onClick:()=>l(d.id),title:"Delete annotation",children:pn(WP,{size:16})})]})]}),pn("div",{className:"bb-annotationTitle",children:d.title}),d.description&&pn("div",{className:"bb-annotationDescription",children:d.description}),ir("div",{className:"bb-annotationPosition",children:["Position: [",d.worldPosition[0].toFixed(2),","," ",d.worldPosition[1].toFixed(2),","," ",d.worldPosition[2].toFixed(2),"]"]})]},d.id))}),n&&pn("div",{className:"bb-editAnnotationOverlay",onClick:u,children:ir("div",{className:"bb-editAnnotationPopup",onClick:d=>d.stopPropagation(),children:[ir("div",{className:"bb-editAnnotationHeader",children:[pn("h3",{className:"bb-editAnnotationTitle",children:"Edit Annotation"}),pn("button",{className:"bb-editAnnotationClose",onClick:u,children:"\xD7"})]}),ir("div",{className:"bb-editAnnotationBody",children:[ir("div",{className:"bb-field",children:[pn("label",{className:"bb-label",children:"Title"}),pn("input",{className:"bb-input",value:r.title,onChange:d=>o({...r,title:d.target.value}),placeholder:"Enter annotation title"})]}),ir("div",{className:"bb-field",children:[pn("label",{className:"bb-label",children:"Description"}),pn("textarea",{className:"bb-textarea",value:r.description,onChange:d=>o({...r,description:d.target.value}),placeholder:"Enter annotation description",rows:3})]}),ir("div",{className:"bb-editAnnotationActions",children:[pn("button",{className:"bb-button",onClick:u,children:"Cancel"}),pn("button",{className:"bb-button bb-button--primary",onClick:c,disabled:!r.title.trim(),children:"Save"}),pn("button",{className:"bb-button bb-button--danger",onClick:()=>l(n.id),children:"Delete"})]})]})]})})]})}import{useState as $P,useCallback as io}from"react";import{ArrowDown as XP,ArrowUp as qP,MapPin as YP,Plus as KP,Trash2 as JP,Settings as QP}from"lucide-react";import{Fragment as e_,jsx as Tt,jsxs as Qt}from"react/jsx-runtime";var ZP={enabled:!0,waypoints:[],loop:!0,autoPlay:!1},oo=3.5;function Mp({config:e,onChange:t,cameraState:n,onPreviewWaypoint:i}){let r=e.cinematic??ZP,{waypoints:o}=r,a=io((y,p)=>{if(y.length<2)return 0;let m=0;for(let S=0;S<y.length-1;S++){let M=y[S].segmentDuration??oo;m+=M}return p&&y.length>1&&(m+=y[y.length-1].segmentDuration??oo),Math.max(m,0)},[]),s=io(y=>{t({...e,cinematic:{...r,...y}})},[e,r,t]),c=io(()=>{if(!n)return;let y={position:[...n.position],target:[...n.target],...n.azimuthAngle!=null?{azimuthAngle:n.azimuthAngle}:{},...n.polarAngle!=null?{polarAngle:n.polarAngle}:{},segmentDuration:oo},p=[...o,y],m=a(p,r.loop);s({waypoints:p,duration:m})},[n,o,r.loop,a,s]),l=io(y=>{let p=o.filter((S,M)=>M!==y),m=a(p,r.loop);s({waypoints:p,duration:m})},[o,r.loop,a,s]),u=io((y,p)=>{let m=y+p;if(m<0||m>=o.length)return;let S=[...o];[S[y],S[m]]=[S[m],S[y]];let M=a(S,r.loop);s({waypoints:S,duration:M})},[o,r.loop,a,s]),d=io((y,p)=>{let m=o.map((M,T)=>T===y?{...M,...p}:M),S=a(m,r.loop);s({waypoints:m,duration:S})},[o,r.loop,a,s]),[h,g]=$P(!1),f=o.some(y=>y.segmentDuration!==void 0),v=io(y=>y>=o.length-1?oo:o[y]?.segmentDuration??oo,[o]),_=o.length>=2;return Qt(no,{title:"Cinematic Camera",children:[Tt("p",{className:"se-cinematicHint",children:"Frame the model in the viewer, then capture it as a waypoint. The camera glides through the waypoints in order \u2014 enable and press play in the viewer to preview."}),Qt("button",{type:"button",className:"bb-button bb-button--primary se-cinematicAdd",onClick:c,disabled:!n,title:"Capture the current camera view as a waypoint",children:[Tt(KP,{size:15}),"Add waypoint from current view"]}),Qt("div",{className:"se-customizeToggle",children:[Qt("label",{className:"se-toggleLabel",children:[Tt("input",{type:"checkbox",checked:h,onChange:y=>g(y.target.checked)}),Tt(QP,{size:14}),Tt("span",{children:"Customize durations between waypoints"})]}),h&&Qt("span",{className:"se-toggleHint",children:["Set duration for each segment between waypoints: 1\u21922, 2\u21923, etc. Default: ",oo,"s"]})]}),o.length===0?Tt("div",{className:"bb-emptyAnnotations",children:"No waypoints yet. Position the camera and add your first one."}):Qt(e_,{children:[Tt("div",{className:"se-waypointList",children:o.map((y,p)=>{let m=v(p),S=p===o.length-1,M=y.segmentDuration!==void 0&&y.segmentDuration!==oo;return Qt("div",{children:[Qt("div",{className:"se-waypointCard",children:[Tt("div",{className:"se-waypointBadge",children:p+1}),Qt("div",{className:"se-waypointBody",children:[Qt("div",{className:"se-waypointCoords",children:["pos [",y.position.map(T=>T.toFixed(1)).join(", "),"]"]}),Qt("div",{className:"se-waypointCoords",children:["look [",y.target.map(T=>T.toFixed(1)).join(", "),"]"]}),h&&!S&&Qt("div",{className:`se-customBadge ${M?"se-customBadge--custom":"se-customBadge--default"}`,children:[m.toFixed(1),"s",!M&&" (default)"]})]}),Qt("div",{className:"se-waypointActions",children:[Tt("button",{className:"se-waypointAction",onClick:()=>i?.(y),title:"Fly camera to this waypoint",disabled:!i,children:Tt(YP,{size:15})}),Tt("button",{className:"se-waypointAction",onClick:()=>u(p,-1),title:"Move up",disabled:p===0,children:Tt(qP,{size:15})}),Tt("button",{className:"se-waypointAction",onClick:()=>u(p,1),title:"Move down",disabled:S,children:Tt(XP,{size:15})}),Tt("button",{className:"se-waypointAction se-waypointAction--delete",onClick:()=>l(p),title:"Delete waypoint",children:Tt(JP,{size:15})})]})]}),h&&!S&&Qt("div",{className:"se-segmentBetween",children:[Qt("div",{className:"se-segmentLabel",children:[p+1," \u2192 ",p+2,!y.segmentDuration&&" (default)"]}),Qt("div",{className:"se-segmentControls",children:[Tt("span",{className:"se-durationLabel",children:"Duration:"}),Tt("input",{type:"range",className:"se-segmentSlider",min:1,max:20,step:.5,value:m,onChange:T=>{let R=parseFloat(T.target.value);d(p,{segmentDuration:R})}}),Qt("span",{className:"se-segmentValue",children:[m.toFixed(1),"s"]}),Qt("div",{className:"se-presetButtons",children:[[2,4,6,8].map(T=>Qt("button",{className:"se-presetButton",onClick:()=>d(p,{segmentDuration:T}),children:[T,"s"]},`preset-${p}-${T}`)),Tt("button",{className:"se-presetButton se-presetButton--default",onClick:()=>{let T=o.map((b,C)=>{if(C===p){let{segmentDuration:x,...P}=b;return P}return b}),R=a(T,r.loop);s({waypoints:T,duration:R})},children:"Reset"})]})]})]})]},`waypoint-wrapper-${p}`)})}),Qt("div",{className:"se-totalDuration",children:[Tt("span",{className:"se-totalLabel",children:"Total duration:"}),Tt("span",{className:"se-totalValue",children:_?(r.duration??a(o,r.loop)).toFixed(1)+"s":"-"}),!_&&Tt("span",{className:"se-totalHint",children:"(need at least 2 waypoints)"})]})]}),Tt(ct,{label:"Enable cinematic camera",checked:r.enabled,onChange:y=>s({enabled:y})}),Tt(ct,{label:"Loop",checked:r.loop,onChange:y=>{let p=y,m=a(o,p);s({loop:p,duration:m})}}),Tt(ct,{label:"Auto-play on load",checked:r.autoPlay,onChange:y=>s({autoPlay:y})}),!h&&_&&Tt(W,{label:"Duration",value:r.duration??a(o,r.loop),min:4,max:120,step:1,formatValue:y=>`${y}s`,onChange:y=>s({duration:y})})]})}import{Box as r_,Clapperboard as i_,MessageSquareText as o_,Sparkles as a_,Spotlight as s_,Video as l_}from"lucide-react";import{jsx as hn,jsxs as d_}from"react/jsx-runtime";var c_=[{label:"General",icon:hn(r_,{})},{label:"Lighting",icon:hn(s_,{})},{label:"Animations",icon:hn(i_,{})},{label:"Post Processing",icon:hn(a_,{})},{label:"Annotations",icon:hn(o_,{})},{label:"Cinematic",icon:hn(l_,{})}],$x={currentClip:null,isPlaying:!1,time:0,duration:0,play:()=>{},pause:()=>{},stop:()=>{},setSpeed:()=>{},seek:()=>{}};function Tp({config:e,onChange:t,activeSubTab:n,onActiveSubTabChange:i,cameraState:r=null,onPreviewWaypoint:o,animationClipDetails:a=[],animationPlayback:s=$x}){let[c,l]=t_("General"),u=n??c,d=s??$x,{tier:h}=nr(),g=Qr(h,"starter"),f=Qr(h,"growth");n_(()=>{n!==void 0&&l(n)},[n]);let v=_=>{n===void 0&&l(_),i?.(_)};return d_("div",{className:"se-tabContent",children:[hn("div",{className:"se-subTabRow",children:c_.map(_=>hn("button",{type:"button",title:_.label,className:`se-subTab ${u===_.label?"se-subTab--active":""}`,onClick:()=>v(_.label),children:_.icon},_.label))}),u==="General"&&hn(yp,{config:e,onChange:t}),u==="Lighting"&&hn(wp,{config:e,onChange:t}),u==="Animations"&&(g?hn(Cp,{config:e,onChange:t,clipDetails:a,currentClip:d.currentClip,isPlaying:d.isPlaying,time:d.time,duration:d.duration,play:d.play,pause:d.pause,stop:d.stop,setSpeed:d.setSpeed,seek:d.seek}):hn(In,{requiredTier:"starter",feature:"Animation configuration"})),u==="Post Processing"&&(f?hn(vp,{config:e,onChange:t}):hn(In,{requiredTier:"growth",feature:"Post-processing effects"})),u==="Annotations"&&(g?hn(Sp,{config:e,onChange:t}):hn(In,{requiredTier:"starter",feature:"Annotations"})),u==="Cinematic"&&(g?hn(Mp,{config:e,onChange:t,cameraState:r,onPreviewWaypoint:o}):hn(In,{requiredTier:"starter",feature:"Cinematic camera"}))]})}import{ChevronDown as Xx,Info as qx}from"lucide-react";import{jsx as En,jsxs as ao}from"react/jsx-runtime";function Yx({title:e,trailing:t,children:n,disabled:i,open:r,onToggle:o,tooltip:a}){let s=a?`${a}`:e;return ao("div",{className:"bb-materialPanel",children:[ao("button",{type:"button",className:"bb-materialPanelHeader",onClick:o,"aria-expanded":r,title:s,children:[ao("div",{className:"bb-materialPanelTitleWrap",children:[En(Xx,{size:14,className:`bb-materialPanelChevron ${r?"bb-materialPanelChevron--open":""}`}),En("span",{className:"bb-materialPanelTitle",children:e}),a?En("span",{className:"bb-materialPanelHelp",title:s,"aria-label":s,role:"img",onClick:c=>c.stopPropagation(),children:En(qx,{size:12})}):null]}),t?En("div",{onClick:c=>c.stopPropagation(),children:t}):null]}),r?En("div",{className:"bb-materialPanelBody",style:i?{opacity:.45,pointerEvents:"none"}:void 0,children:n}):null]})}function zn({title:e,open:t,onToggle:n,trailing:i,children:r,tooltip:o}){let a=o?`${e}: ${o}`:e;return ao("div",{className:"bb-section",children:[ao("button",{type:"button",className:"bb-sectionHeaderButton",onClick:n,"aria-expanded":t,title:a,children:[ao("span",{className:"bb-sectionHeaderMain",children:[En(Xx,{size:15,className:`bb-sectionChevron ${t?"bb-sectionChevron--open":""}`}),En("h2",{className:"bb-sectionTitle",children:e}),o?En("span",{className:"bb-sectionHelp",title:a,"aria-label":a,role:"img",onClick:s=>s.stopPropagation(),children:En(qx,{size:13})}):null]}),i?En("span",{onClick:s=>s.stopPropagation(),children:i}):null]}),t?En("div",{className:"bb-sectionBody",children:r}):null]})}function Kx({checked:e,onChange:t,label:n}){return ao("label",{className:"se-switch","aria-label":n,children:[En("input",{type:"checkbox",checked:e,onChange:i=>t(i.target.checked)}),En("span",{className:"se-switchTrack",children:En("span",{className:"se-switchThumb"})})]})}import{useState as Zx}from"react";import{jsx as Pp}from"react/jsx-runtime";function Wn({panelKey:e,title:t,tooltip:n,toggleLabel:i,controls:r,children:o,requiredTier:a}){let{openMaterialPanels:s,materialPanelEnabled:c,onToggleMaterialPanel:l,onSetMaterialPanelState:u}=r,d=a?.locked??!1;return Pp(Yx,{title:t,tooltip:n,disabled:d||!c[e],open:s[e],onToggle:()=>l(e),trailing:Pp(Kx,{checked:!d&&c[e],onChange:d?()=>{}:h=>u(e,h),label:i??`Toggle ${t}`}),children:d&&a?Pp(In,{requiredTier:a.tier,feature:t}):o})}import{useRef as Jx,useState as u_}from"react";import{HexColorInput as p_,HexColorPicker as h_}from"react-colorful";import{FileUp as m_}from"lucide-react";import{jsx as Zt,jsxs as yi}from"react/jsx-runtime";function en({label:e,value:t,placeholder:n,onChange:i}){let r=Jx(null);return yi("div",{className:"bb-field bb-field--full",children:[Zt("label",{className:"bb-label",children:e}),yi("div",{className:"bb-fileField",children:[Zt("input",{className:"bb-input bb-fileField-input",placeholder:n,value:t,onChange:o=>{let a=o.target.value;!a&&t&&_d(t),i(a)}}),Zt("button",{type:"button",className:"bb-fileFieldButton",onClick:()=>r.current?.click(),"aria-label":`Select file for ${e}`,title:`Select file for ${e}`,children:Zt(m_,{size:20})}),Zt("input",{ref:r,type:"file",accept:"image/png,image/jpeg,image/webp,image/avif",className:"bb-hiddenInput",onChange:o=>{let a=o.target.files?.[0];if(!a)return;let s=hm(a);t&&t!==s&&_d(t),bm(s,URL.createObjectURL(a)),i(s),o.target.value=""}})]})]})}function so({label:e,value:t,fallback:n="#ffffff",onChange:i}){let[r,o]=u_(!1),a=t||n,s=Jx(null);return yi("div",{className:"bb-field",children:[Zt("span",{className:"bb-label",children:e}),Zt("div",{className:"se-fieldInline",children:Zt("span",{ref:s,style:{display:"inline-flex"},children:Zt(p_,{prefixed:!0,className:"se-swatch",onClick:()=>o(c=>!c),style:{background:a,color:da(a)},color:a,onChange:i})})}),r?Zt(bp,{anchorRef:s,onClose:()=>o(!1),children:Zt(h_,{color:a,onChange:i})}):null]})}function Ts({label:e,checked:t,onChange:n}){return yi("label",{className:"bb-checkbox",children:[Zt("input",{type:"checkbox",checked:t,onChange:i=>n(i.target.checked)}),e]})}function Qx({label:e,value:t,min:n,max:i,step:r,placeholder:o,onChange:a}){return yi("div",{className:"bb-field",children:[Zt("label",{className:"bb-label",children:e}),Zt("input",{className:"bb-input",type:"number",min:n,max:i,step:r,placeholder:o,value:t??"",onChange:s=>a(s.target.value===""?void 0:Number(s.target.value))})]})}function ha({label:e,value:t,options:n,onChange:i}){return yi("div",{className:"bb-field",children:[Zt("label",{className:"bb-label",children:e}),Zt("select",{className:"bb-select",value:t,onChange:r=>i(r.target.value),children:n.map(r=>Zt("option",{value:r,children:r},r))})]})}function Dt({label:e,value:t,min:n,max:i,step:r,onChange:o}){return yi("div",{className:"bb-field bb-field--full",children:[Zt("label",{className:"bb-label",children:e}),yi("div",{className:"bb-sliderField",children:[Zt("input",{className:`bb-slider ${t===void 0?"bb-slider--unset":""}`,type:"range",min:n,max:i,step:r,value:t??n,onChange:s=>o(Number(s.target.value))}),Zt("input",{className:"bb-input bb-input--compact",type:"number",min:n,max:i,step:r,value:t??"",onChange:s=>o(s.target.value===""?void 0:Number(s.target.value))})]})]})}import{Fragment as _p,jsx as K,jsxs as an}from"react/jsx-runtime";function e0({selectedItem:e,selectedMaterial:t,pbrWorkflow:n,onPbrWorkflowChange:i,openMaterialPanels:r,materialPanelEnabled:o,onToggleMaterialPanel:a,onSetMaterialPanelState:s,updateSelectedMaterial:c,setSelectedTexturePath:l}){let u={openMaterialPanels:r,materialPanelEnabled:o,onToggleMaterialPanel:a,onSetMaterialPanelState:s},{tier:d}=nr(),h=Qr(d,"starter"),g={tier:"starter",locked:!h},[f,v]=Zx("roughness"),[_,y]=Zx("factor");return an(_p,{children:[K(Wn,{panelKey:"pbr",title:"PBR Maps",tooltip:"Controls the base color and workflow used for physically based shading.",controls:u,children:h?an("div",{className:"bb-grid",children:[K(ha,{label:"Workflow",value:n,options:["metalness","specular"],onChange:i}),K("div",{className:"bb-field bb-field--full",children:K("p",{className:"bb-note",style:{margin:0},children:n==="metalness"?"Metalness workflow maps directly to the underlying physical material.":"Specular workflow exposes the same physical material with non-metal specular controls; it does not switch to a separate spec/gloss shader."})}),K(en,{label:n==="specular"?"Albedo texture path":"Base color texture path",placeholder:"materials/oak-wood.jpg",value:t?.texture?.path??"",onChange:p=>l(e,"texture",p)}),K(so,{label:n==="specular"?"Albedo color":"Base color",value:t?.baseColor??"#ffffff",onChange:p=>c(e,m=>({...m,baseColor:p}))}),n==="metalness"?an(_p,{children:[K(Dt,{label:"Metalness",value:t?.metalness,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,metalness:p}))}),K(en,{label:"Metalness map path",placeholder:"materials/body-metalness.jpg",value:t?.metalnessMap?.path??"",onChange:p=>l(e,"metalnessMap",p)})]}):an(_p,{children:[K(Dt,{label:"Specular intensity",value:t?.specularIntensity,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,specularIntensity:p}))}),K(so,{label:"Specular color",value:t?.specularColor??"#ffffff",onChange:p=>c(e,m=>({...m,specularColor:p}))}),K(en,{label:"Specular intensity map path",placeholder:"materials/body-specular-intensity.jpg",value:t?.specularIntensityMap?.path??"",onChange:p=>l(e,"specularIntensityMap",p)}),K(en,{label:"Specular color map path",placeholder:"materials/body-specular-color.jpg",value:t?.specularColorMap?.path??"",onChange:p=>l(e,"specularColorMap",p)})]}),K(Dt,{label:"Specular F0 / reflectivity",value:t?.reflectivity,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,reflectivity:p}))})]}):an("div",{className:"bb-grid",children:[K(so,{label:"Base color",value:t?.baseColor??"#ffffff",onChange:p=>c(e,m=>({...m,baseColor:p}))}),K(Dt,{label:"Metalness",value:t?.metalness,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,metalness:p}))}),K("div",{className:"bb-field bb-field--full",children:K(In,{requiredTier:"starter",feature:"Texture maps, the specular workflow, and reflectivity"})})]})}),K(Wn,{panelKey:"roughness",requiredTier:g,title:"Roughness / Glossiness",tooltip:"Adjusts how matte or shiny the surface appears.",toggleLabel:"Toggle Roughness and Glossiness",controls:u,children:an("div",{className:"bb-grid",children:[K(ha,{label:"Mode",value:f,options:["roughness","glossiness"],onChange:v}),K("div",{className:"bb-field bb-field--full",children:K("p",{className:"bb-note",style:{margin:0},children:f==="roughness"?"Roughness: 0 is glossy, 1 is matte.":"Glossiness is the inverse of roughness (glossiness = 1 \u2212 roughness)"})}),f==="roughness"?K(Dt,{label:"Roughness",value:t?.roughness,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,roughness:p}))}):K(Dt,{label:"Glossiness",value:t?.roughness===void 0?void 0:1-t.roughness,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,roughness:p===void 0?void 0:1-p}))}),K(en,{label:f==="glossiness"?"Glossiness map path (applied as roughness)":"Roughness map path",placeholder:"materials/body-roughness.jpg",value:t?.roughnessMap?.path??"",onChange:p=>l(e,"roughnessMap",p)})]})}),K(Wn,{panelKey:"emission",requiredTier:g,title:"Emission",tooltip:"Makes the material self-illuminated with emissive color and intensity.",controls:u,children:an("div",{className:"bb-grid",children:[K(so,{label:"Emissive color",value:t?.emissive??"#000000",fallback:"#000000",onChange:p=>c(e,m=>({...m,emissive:p}))}),K(Dt,{label:"Emissive intensity",value:t?.emissiveIntensity,min:0,max:10,step:.1,onChange:p=>c(e,m=>({...m,emissiveIntensity:p}))}),K(en,{label:"Emissive map path",placeholder:"materials/body-emissive.jpg",value:t?.emissiveMap?.path??"",onChange:p=>l(e,"emissiveMap",p)})]})}),K(Wn,{panelKey:"opacity",requiredTier:g,title:"Opacity",tooltip:"Controls transparency, alpha testing, and blending behavior.",controls:u,children:an("div",{className:"bb-grid",children:[K(Dt,{label:"Opacity",value:t?.opacity,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,opacity:p}))}),K(Dt,{label:"Alpha test",value:t?.alphaTest,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,alphaTest:p}))}),K(en,{label:"Alpha map path",placeholder:"materials/body-alpha.png",value:t?.alphaMap?.path??"",onChange:p=>l(e,"alphaMap",p)}),K(ha,{label:"Blending mode",value:t?.blendingMode??"normal",options:od,onChange:p=>c(e,m=>({...m,blendingMode:p}))}),an("div",{className:"bb-field",children:[K("label",{className:"bb-label",children:"Alpha hash"}),K("div",{className:"bb-checkboxRow",children:K(Ts,{label:"Use alpha hash",checked:t?.alphaHash??!1,onChange:p=>c(e,m=>({...m,alphaHash:p}))})})]}),an("div",{className:"bb-field",children:[K("label",{className:"bb-label",children:"Dithering"}),K("div",{className:"bb-checkboxRow",children:K(Ts,{label:"Use dithering",checked:t?.dithering??!1,onChange:p=>c(e,m=>({...m,dithering:p}))})})]})]})}),an(Wn,{panelKey:"normalBump",requiredTier:g,title:"Normal & Bump",tooltip:"Adds surface detail without changing the actual mesh shape.",toggleLabel:"Toggle Normal and Bump",controls:u,children:[an("div",{className:"bb-grid",children:[K(en,{label:"Normal map path",placeholder:"materials/body-normal.jpg",value:t?.normalMap?.path??"",onChange:p=>l(e,"normalMap",p)}),K(Dt,{label:"Normal scale",value:t?.normalScale,min:0,max:5,step:.01,onChange:p=>c(e,m=>({...m,normalScale:p}))}),K(en,{label:"Bump map path",placeholder:"materials/body-bump.jpg",value:t?.bumpMap?.path??"",onChange:p=>l(e,"bumpMap",p)}),K(Dt,{label:"Bump scale",value:t?.bumpScale,min:0,max:5,step:.01,onChange:p=>c(e,m=>({...m,bumpScale:p}))})]}),K("div",{className:"bb-checkboxRow",style:{marginTop:12},children:K(Ts,{label:"Flip normal Y",checked:t?.flipNormalY??!1,onChange:p=>c(e,m=>({...m,flipNormalY:p}))})})]}),K(Wn,{panelKey:"displacement",requiredTier:g,title:"Displacement",tooltip:"Offsets geometry using a texture to create real surface height.",controls:u,children:an("div",{className:"bb-grid",children:[K(en,{label:"Displacement map path",placeholder:"materials/body-displacement.jpg",value:t?.displacementMap?.path??"",onChange:p=>l(e,"displacementMap",p)}),K(Dt,{label:"Displacement scale",value:t?.displacementScale,min:-5,max:5,step:.01,onChange:p=>c(e,m=>({...m,displacementScale:p}))}),K(Dt,{label:"Displacement bias",value:t?.displacementBias,min:-5,max:5,step:.01,onChange:p=>c(e,m=>({...m,displacementBias:p}))})]})}),K(Wn,{panelKey:"ao",requiredTier:g,title:"Ambient Occlusion",tooltip:"Darkens creases and contact areas to add depth.",controls:u,children:an("div",{className:"bb-grid",children:[K(en,{label:"AO map path",placeholder:"materials/body-ao.jpg",value:t?.aoMap?.path??"",onChange:p=>l(e,"aoMap",p)}),K(Dt,{label:"AO intensity",value:t?.aoMapIntensity,min:0,max:5,step:.01,onChange:p=>c(e,m=>({...m,aoMapIntensity:p}))})]})}),an(Wn,{panelKey:"clearcoat",requiredTier:g,title:"Clearcoat",tooltip:"Adds a glossy protective layer on top of the base material.",controls:u,children:[an("div",{className:"bb-grid",children:[K(en,{label:"Clearcoat map path",placeholder:"materials/body-clearcoat.jpg",value:t?.clearcoatMap?.path??"",onChange:p=>l(e,"clearcoatMap",p)}),K(Dt,{label:"Clearcoat",value:t?.clearcoat,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,clearcoat:p}))}),K(en,{label:"Clearcoat roughness map path",placeholder:"materials/body-clearcoat-roughness.jpg",value:t?.clearcoatRoughnessMap?.path??"",onChange:p=>l(e,"clearcoatRoughnessMap",p)}),K(Dt,{label:"Clearcoat roughness",value:t?.clearcoatRoughness,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,clearcoatRoughness:p}))}),K(en,{label:"Clearcoat normal map path",placeholder:"materials/body-clearcoat-normal.jpg",value:t?.clearcoatNormalMap?.path??"",onChange:p=>l(e,"clearcoatNormalMap",p)}),K(Dt,{label:"Clearcoat normal scale",value:t?.clearcoatNormalScale,min:0,max:5,step:.01,onChange:p=>c(e,m=>({...m,clearcoatNormalScale:p}))})]}),K("div",{className:"bb-checkboxRow",style:{marginTop:12},children:K(Ts,{label:"Flip clearcoat normal Y",checked:t?.flipClearcoatNormalY??!1,onChange:p=>c(e,m=>({...m,flipClearcoatNormalY:p}))})})]}),K(Wn,{panelKey:"sheen",requiredTier:g,title:"Sheen",tooltip:"Adds a soft fabric-like sheen on grazing angles.",controls:u,children:an("div",{className:"bb-grid",children:[K(Dt,{label:"Sheen",value:t?.sheen,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,sheen:p}))}),K(so,{label:"Sheen color",value:t?.sheenColor??"#ffffff",onChange:p=>c(e,m=>({...m,sheenColor:p}))}),K(en,{label:"Sheen color map path",placeholder:"materials/body-sheen-color.jpg",value:t?.sheenColorMap?.path??"",onChange:p=>l(e,"sheenColorMap",p)}),K(Dt,{label:"Sheen roughness",value:t?.sheenRoughness,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,sheenRoughness:p}))}),K(en,{label:"Sheen roughness map path",placeholder:"materials/body-sheen-roughness.jpg",value:t?.sheenRoughnessMap?.path??"",onChange:p=>l(e,"sheenRoughnessMap",p)})]})}),K(Wn,{panelKey:"anisotropy",requiredTier:g,title:"Anisotropy",tooltip:"Stretches reflections in one direction for brushed or fiber-like surfaces.",controls:u,children:an("div",{className:"bb-grid",children:[K(Dt,{label:"Intensity",value:t?.anisotropy,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,anisotropy:p}))}),K(ha,{label:"Tilt direction",value:_,options:["factor","texture"],onChange:y}),_==="factor"?K(Dt,{label:"Rotation (rad)",value:t?.anisotropyRotation,min:0,max:6.28,step:.01,onChange:p=>c(e,m=>({...m,anisotropyRotation:p}))}):K(en,{label:"Anisotropy map path",placeholder:"materials/body-anisotropy.jpg",value:t?.anisotropyMap?.path??"",onChange:p=>l(e,"anisotropyMap",p)})]})}),K(Wn,{panelKey:"transmission",requiredTier:g,title:"Transmission & Volume",tooltip:"Controls glass-like transmission and how light travels through volume.",toggleLabel:"Toggle Transmission and Volume",controls:u,children:an("div",{className:"bb-grid",children:[K(Dt,{label:"Transmission",value:t?.transmission,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,transmission:p}))}),K(en,{label:"Transmission map path",placeholder:"materials/body-transmission.jpg",value:t?.transmissionMap?.path??"",onChange:p=>l(e,"transmissionMap",p)}),K(Dt,{label:"Thickness",value:t?.thickness,min:0,max:5,step:.01,onChange:p=>c(e,m=>({...m,thickness:p}))}),K(en,{label:"Thickness map path",placeholder:"materials/body-thickness.jpg",value:t?.thicknessMap?.path??"",onChange:p=>l(e,"thicknessMap",p)}),K(so,{label:"Volume tint",value:t?.attenuationColor??"#ffffff",onChange:p=>c(e,m=>({...m,attenuationColor:p}))}),K(Qx,{label:"Attenuation distance",value:t?.attenuationDistance,min:0,step:.01,placeholder:"Infinity when unset",onChange:p=>c(e,m=>({...m,attenuationDistance:p}))})]})}),K(Wn,{panelKey:"faces",requiredTier:g,title:"Faces Rendering",tooltip:"Chooses which side of the mesh renders and how backfaces are handled.",controls:u,children:K("div",{className:"bb-grid",children:K(ha,{label:"Side",value:t?.side??"front",options:id,onChange:p=>c(e,m=>({...m,side:p}))})})})]})}var t0=[{id:"wood",label:"Wood",swatch:"#8b5a2b",material:{baseColor:"#8b5a2b",metalness:0,roughness:.75,reflectivity:.04}},{id:"brushed-metal",label:"Brushed Metal",swatch:"linear-gradient(135deg, #cfcfcf, #8a8a8a)",material:{baseColor:"#c8c8c8",metalness:1,roughness:.35}},{id:"chrome",label:"Polished Chrome",swatch:"linear-gradient(135deg, #ffffff, #9aa0a6)",material:{baseColor:"#e8e8e8",metalness:1,roughness:.05}},{id:"gold",label:"Gold",swatch:"linear-gradient(135deg, #ffe9a8, #c89b2c)",material:{baseColor:"#e6b325",metalness:1,roughness:.2}},{id:"copper",label:"Copper",swatch:"linear-gradient(135deg, #e3a576, #8a4a26)",material:{baseColor:"#b87333",metalness:1,roughness:.3}},{id:"glass",label:"Glass",swatch:"linear-gradient(135deg, rgba(255,255,255,0.9), rgba(180,210,230,0.4))",material:{baseColor:"#ffffff",metalness:0,roughness:.02,reflectivity:.5,opacity:1,transmission:1,thickness:.5,attenuationColor:"#ffffff",attenuationDistance:1}},{id:"frosted-glass",label:"Frosted Glass",swatch:"linear-gradient(135deg, rgba(255,255,255,0.85), rgba(210,225,235,0.6))",material:{baseColor:"#ffffff",metalness:0,roughness:.4,reflectivity:.3,opacity:1,transmission:.9,thickness:.5}},{id:"plastic-glossy",label:"Glossy Plastic",swatch:"#dadada",material:{baseColor:"#dadada",metalness:0,roughness:.25,reflectivity:.5,clearcoat:.3,clearcoatRoughness:.1}},{id:"plastic-matte",label:"Matte Plastic",swatch:"#9a9a9a",material:{baseColor:"#9a9a9a",metalness:0,roughness:.85,reflectivity:.04}},{id:"rubber",label:"Rubber",swatch:"#1a1a1a",material:{baseColor:"#1a1a1a",metalness:0,roughness:.9,reflectivity:.02}},{id:"fabric",label:"Fabric",swatch:"#9c8a6b",material:{baseColor:"#9c8a6b",metalness:0,roughness:.95,sheen:.4,sheenColor:"#ffffff",sheenRoughness:.6}},{id:"ceramic",label:"Ceramic",swatch:"#f5f5f0",material:{baseColor:"#f5f5f0",metalness:0,roughness:.15,clearcoat:.6,clearcoatRoughness:.1}},{id:"concrete",label:"Concrete",swatch:"#9b9b93",material:{baseColor:"#9b9b93",metalness:0,roughness:.95,reflectivity:.03}}];import{jsx as kp,jsxs as g_}from"react/jsx-runtime";function n0({disabled:e,onApply:t}){return kp("div",{className:"bb-presetGallery",children:t0.map(n=>g_("button",{type:"button",className:"bb-presetSwatch",disabled:e,title:`Apply ${n.label} preset`,onClick:()=>t(n.material),children:[kp("span",{className:"bb-presetSwatchColor",style:{background:n.swatch}}),kp("span",{className:"bb-presetSwatchLabel",children:n.label})]},n.id))})}import{useEffect as f_,useRef as b_,useState as x_}from"react";import{ChevronDown as y_,Download as v_,FileCode2 as w_,FileJson as C_}from"lucide-react";import{jsx as Cc,jsxs as Ps}from"react/jsx-runtime";function Ap({disabled:e,exporting:t,onExportJson:n,onExportTs:i}){let[r,o]=x_(!1),a=b_(null);return f_(()=>{if(!r)return;let s=c=>{a.current?.contains(c.target)||o(!1)};return window.addEventListener("pointerdown",s),()=>window.removeEventListener("pointerdown",s)},[r]),Ps("div",{className:"bb-exportMenuWrapper",ref:a,children:[Ps("button",{type:"button",className:"bb-button bb-button--ghost",disabled:e||t,onClick:()=>o(s=>!s),title:"Export",children:[Cc(v_,{size:14}),t?"Exporting\u2026":"Export",Cc(y_,{size:12})]}),r&&Ps("div",{className:"bb-exportMenu",children:[Ps("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{o(!1),n()},children:[Cc(C_,{size:14}),"JSON"]}),Ps("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{o(!1),i()},children:[Cc(w_,{size:14}),"TypeScript"]})]})]})}import{jsx as lo,jsxs as Ep}from"react/jsx-runtime";function r0({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r,idError:o}){return lo(zn,{title:"Identity",open:n,onToggle:i,children:Ep("div",{className:"bb-grid",children:[Ep("div",{className:"bb-field bb-field--full",children:[lo("label",{className:"bb-label",children:"Model Node ID"}),lo("span",{className:"bb-note",children:"This is the exact mesh name from the imported model and stays locked."}),lo("input",{className:"bb-input bb-readonly",value:t.modelObjectId,readOnly:!0})]}),Ep("div",{className:"bb-field bb-field--full",children:[lo("label",{className:"bb-label",children:"ID"}),lo("input",{className:`bb-input ${o?"bb-input--error":""}`,value:t.id,onChange:a=>r(e,s=>({...s,id:a.target.value}))}),o?lo("span",{className:"bb-status bb-status--error",children:o}):null]})]})})}import{useEffect as S_,useState as a0}from"react";var i0=["other","body","light","wheel","glass","interior","floor","wall","door","furniture","decor","electronics","seat","table","chair","window","sofa","bed","engine","headlight"],o0=["normal","hidden","selected","disabled"];import{jsx as Sn,jsxs as yr}from"react/jsx-runtime";function s0({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r}){let[o,a]=a0(t.group??""),[s,c]=a0(t.tags?.join(", ")??"");S_(()=>{a(t.group??""),c(t.tags?.join(", ")??"")},[e,t.group,t.tags]);let l=()=>{r(e,d=>({...d,group:o.trim()||void 0}))},u=()=>{let d=[...new Set(s.split(",").map(h=>h.trim()).filter(Boolean))];r(e,h=>({...h,tags:d.length>0?d:void 0}))};return yr(zn,{title:"Basics",open:n,onToggle:i,children:[yr("div",{className:"bb-grid",children:[yr("div",{className:"bb-field",children:[Sn("label",{className:"bb-label",children:"Label"}),Sn("input",{className:"bb-input",value:t.label??"",onChange:d=>r(e,h=>({...h,label:d.target.value}))})]}),yr("div",{className:"bb-field",children:[Sn("label",{className:"bb-label",children:"Type"}),Sn("input",{className:"bb-input",list:"binding-type-suggestions",value:t.type,onChange:d=>r(e,h=>({...h,type:d.target.value}))}),Sn("datalist",{id:"binding-type-suggestions",children:i0.map(d=>Sn("option",{value:d},d))})]}),yr("div",{className:"bb-field",children:[Sn("label",{className:"bb-label",children:"Status"}),Sn("select",{className:"bb-select",value:t.status??"normal",onChange:d=>r(e,h=>({...h,status:d.target.value})),children:o0.map(d=>Sn("option",{value:d,children:d},d))})]}),yr("div",{className:"bb-field",children:[Sn("label",{className:"bb-label",children:"Group"}),Sn("input",{className:"bb-input",placeholder:"paint",value:o,onChange:d=>a(d.target.value),onBlur:l,onKeyDown:d=>{d.key==="Enter"&&d.currentTarget.blur()}})]}),yr("div",{className:"bb-field",children:[Sn("label",{className:"bb-label",children:"Tags"}),Sn("input",{className:"bb-input",placeholder:"exterior, configurable",value:s,onChange:d=>c(d.target.value),onBlur:u,onKeyDown:d=>{d.key==="Enter"&&d.currentTarget.blur()}})]})]}),yr("div",{className:"bb-checkboxRow",style:{marginTop:12},children:[yr("label",{className:"bb-checkbox",children:[Sn("input",{type:"checkbox",checked:t.selectable??!1,onChange:d=>r(e,h=>({...h,selectable:d.target.checked}))}),"selectable"]}),yr("label",{className:"bb-checkbox",children:[Sn("input",{type:"checkbox",checked:t.hoverable??!1,onChange:d=>r(e,h=>({...h,hoverable:d.target.checked}))}),"hoverable"]}),yr("label",{className:"bb-checkbox",children:[Sn("input",{type:"checkbox",checked:t.visible??!1,onChange:d=>r(e,h=>({...h,visible:d.target.checked}))}),"visible"]})]})]})}import{useEffect as T_,useState as P_}from"react";var co=[{id:"change-color",label:"Change Color",handling:"viewer",description:"Opens a color picker docked under the action and commits the result to style.material.baseColor."},{id:"change-material",label:"Change Material",handling:"viewer",description:"Opens the material picker so the viewer can swap the object's texture."},{id:"toggle-visibility",label:"Toggle Visibility",handling:"viewer",description:"Flips the binding's visible flag."},{id:"toggle-light",label:"Toggle Light",handling:"host",description:"Seeded on light bindings. Add declarative effects for useViewerActions, or handle it in onAction."},{id:"change-light-color",label:"Change Light Color",handling:"host",description:"Seeded on light bindings. Add declarative effects for useViewerActions, or handle it in onAction."},{id:"set-brightness",label:"Set Brightness",handling:"host",description:"Seeded on light bindings. Add declarative effects for useViewerActions, or handle it in onAction."}],Sc="__custom__";function _s(e){return co.find(t=>t.id===e)}var Aj=co.filter(e=>e.handling==="viewer").map(e=>e.id),M_=new Set(["","New Action",...co.map(e=>e.label)]);function Rp(e){return M_.has(e.trim())}function l0(e,t){let n=Array.from({length:t.length+1},(i,r)=>r);for(let i=1;i<=e.length;i+=1){let r=[i];for(let o=1;o<=t.length;o+=1){let a=n[o-1]+(e[i-1]===t[o-1]?0:1);r[o]=Math.min(r[o-1]+1,n[o]+1,a)}n=r}return n[t.length]}function c0(e){if(_s(e))return null;let t=e.trim().toLowerCase();if(!t)return null;let n=t.replace(/[^a-z0-9]/g,""),i=null;for(let r of co){let o=Math.min(l0(t,r.id),l0(n,r.id.replace(/[^a-z0-9]/g,"")));(!i||o<i.distance)&&(i={id:r.id,distance:o})}return i&&i.distance<=2?i.id:null}import{Fragment as k_,jsx as tn,jsxs as or}from"react/jsx-runtime";var d0=co.filter(e=>e.handling==="viewer"),__=co.filter(e=>e.handling==="host");function u0({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r}){let[o,a]=P_(new Set);T_(()=>{a(new Set)},[e]);let s=t.actions??[],c=(d,h)=>r(e,g=>({...g,actions:(g.actions??[]).map((f,v)=>v===d?h(f):f)})),l=d=>{r(e,h=>({...h,actions:(h.actions??[]).filter((g,f)=>f!==d)})),a(h=>{let g=new Set;return h.forEach(f=>{f<d?g.add(f):f>d&&g.add(f-1)}),g})},u=(d,h)=>a(g=>{let f=new Set(g);return h?f.add(d):f.delete(d),f});return or(zn,{title:"Actions",open:n,onToggle:i,children:[tn("div",{className:"bb-actionList",children:s.map((d,h)=>{let g=_s(d.id),f=o.has(h)||!g,v=d.id.trim(),_=g?null:c0(d.id),y=v.length>0&&s.some((p,m)=>m!==h&&p.id.trim()===v);return or("div",{className:"bb-actionCard",children:[or("div",{className:"bb-actionCardHeader",children:[or("div",{className:"bb-actionCardTitle",children:["Action ",h+1]}),tn("div",{className:"bb-actionCardMeta",children:d.type})]}),or("div",{className:"bb-actionGrid",children:[or("div",{className:"bb-field",children:[tn("label",{className:"bb-label",children:"Action ID"}),or("select",{className:"bb-select",value:f?Sc:d.id,onChange:p=>{let m=p.target.value;if(m===Sc){u(h,!0);return}u(h,!1);let S=_s(m);c(h,M=>({...M,id:m,label:S&&Rp(M.label)?S.label:M.label}))},children:[tn("optgroup",{label:"Handled by the viewer",children:d0.map(p=>tn("option",{value:p.id,children:p.id},p.id))}),tn("optgroup",{label:"Handled by your app",children:__.map(p=>tn("option",{value:p.id,children:p.id},p.id))}),tn("option",{value:Sc,children:"Custom\u2026"})]})]}),f?or("div",{className:"bb-field",children:[tn("label",{className:"bb-label",children:"Custom action ID"}),tn("input",{className:"bb-input",value:d.id,placeholder:"open-datasheet",onChange:p=>{u(h,!0),c(h,m=>({...m,id:p.target.value}))}})]}):null,or("div",{className:"bb-field",children:[tn("label",{className:"bb-label",children:"Label"}),tn("input",{className:"bb-input",value:d.label,onChange:p=>c(h,m=>({...m,label:p.target.value}))})]}),g?tn("span",{className:"bb-note",children:g.description}):v.length===0?tn("span",{className:"bb-note",style:{color:"#fca5a5"},children:"An action ID is required, the button renders but can never be identified in onAction."}):or("span",{className:"bb-note",style:{color:"#fcd34d"},children:["Unrecognised ID, the viewer has no built-in behavior for it. Add declarative effects and execute them with useViewerActions, or handle it in onAction.",_?or(k_,{children:[" Did you mean ",tn("button",{type:"button",className:"bb-linkButton",onClick:()=>{u(h,!1);let p=_s(_);c(h,m=>({...m,id:_,label:p&&Rp(m.label)?p.label:m.label}))},children:_}),"?"]}):null]}),d.effects?.length?or("span",{className:"bb-note",children:[d.effects.length," declarative effect",d.effects.length===1?"":"s",", execute with useViewerActions."]}):null,y?tn("span",{className:"bb-note",style:{color:"#fcd34d"},children:"Another action on this binding uses the same ID, they will render as two identical buttons."}):null]}),tn("div",{className:"bb-actionFooter",children:tn("button",{type:"button",className:"bb-button bb-button--ghost bb-actionRemove",onClick:()=>l(h),children:"Remove Action"})})]},h)})}),tn("div",{style:{marginTop:10},children:tn("button",{type:"button",className:"bb-button",onClick:()=>{let d=d0.find(h=>!s.some(g=>g.id===h.id));r(e,h=>({...h,actions:[...h.actions??[],{id:d?.id??"",label:d?.label??"New Action",type:"command"}]})),d||u(s.length,!0)},children:"Add Action"})})]})}import{MapPin as A_,Trash2 as E_}from"lucide-react";import{Fragment as R_,jsx as ar,jsxs as $n}from"react/jsx-runtime";function p0({selectedBinding:e,open:t,onToggle:n,cameraState:i,formattedCameraState:r,savedCameraPosition:o,onSaveCameraPosition:a,onGoToSavedCamera:s,onClearSavedCamera:c,onResetView:l,onFitScene:u}){return $n(zn,{title:"Camera Position",open:t,onToggle:n,children:[$n("div",{className:"se-waypointCard bb-cameraWaypoint",children:[ar("span",{className:"bb-cameraLiveBadge",children:"LIVE"}),$n("div",{className:"se-waypointBody",children:[ar("div",{className:"bb-cameraWaypointLabel",children:"Current view"}),i?$n(R_,{children:[$n("div",{className:"se-waypointCoords",children:["pos ",r?.position]}),$n("div",{className:"se-waypointCoords",children:["look ",r?.target]})]}):ar("div",{className:"se-waypointCoords",children:"Move the camera to see live position"})]})]}),$n("div",{className:"bb-cameraControls bb-cameraControls--centered",children:[ar("button",{type:"button",className:"bb-button bb-button--primary",onClick:a,disabled:!i,children:"Save"}),ar("button",{type:"button",className:"bb-button bb-button--ghost",onClick:l,children:"Reset View"}),ar("button",{type:"button",className:"bb-button bb-button--ghost",onClick:u,children:"Fit Scene"})]}),o?.position&&o?.target&&$n("div",{className:"se-waypointCard bb-cameraWaypoint",children:[ar("span",{className:"bb-cameraSavedBadge",children:"SAVED"}),$n("div",{className:"se-waypointBody",children:[$n("div",{className:"bb-cameraWaypointLabel",children:["For ",e.label]}),$n("div",{className:"se-waypointCoords",children:["pos [",o.position.map(d=>d.toFixed(1)).join(", "),"]"]}),$n("div",{className:"se-waypointCoords",children:["look [",o.target.map(d=>d.toFixed(1)).join(", "),"]"]})]}),$n("div",{className:"se-waypointActions",children:[ar("button",{className:"se-waypointAction",onClick:s,title:"Fly camera to the saved position",children:ar(A_,{size:15})}),ar("button",{className:"se-waypointAction se-waypointAction--delete",onClick:c,title:"Delete saved position",children:ar(E_,{size:15})})]})]}),ar("span",{className:"bb-note",children:'Tip: Position the camera how you want, then click "Save" to store this position for the selected object. The camera position updates in real-time as you navigate.'})]})}import{Move3d as L_,RotateCcw as B_}from"lucide-react";import{jsx as jt,jsxs as vr}from"react/jsx-runtime";var h0=["X","Y","Z"];var O_=.1;function Lp(e){let t=e%360;return t<0?t+360:t}function m0(e){return Lp(e*180/Math.PI)}function g0(e){return e*Math.PI/180}function D_(e,t,n){let i=[...e],r=m0(e[t]);return i[t]=g0(Lp(r+n)),i}function N_({value:e,min:t=-1/0,max:n=1/0,step:i=.1,disabled:r=!1,onChange:o,formatValue:a=c=>Number(c.toFixed(3)),label:s}){return jt("div",{className:"bb-transformAxesGrid",children:h0.map((c,l)=>vr("div",{className:"bb-transformAxis",children:[jt("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:c}),jt("div",{className:"bb-transformAxisControl",children:jt("input",{type:"number",className:"se-numberInput bb-transformNumberInput",step:i,min:t,max:n,value:a(e[l]),disabled:r,"aria-label":`${c} ${s?.toLowerCase()||""}`,onChange:u=>{let d=Number(u.target.value);if(Number.isFinite(d)){let h=Math.max(t,Math.min(n,d)),g=[...e];g[l]=h,o(g)}}})})]},c))})}function f0({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r,moveModeEnabled:o,onToggleMoveMode:a,transformSpace:s,onTransformSpaceChange:c,originalTransform:l}){let u=t.transform?.rotation??l?.rotation??[0,0,0],d=t.transform?.position??l?.position??[0,0,0],h=(p,m)=>{let S=p.transform?.rotation??l?.rotation??[0,0,0],M=p.transform?.position??l?.position??[0,0,0],T=p.transform?.scale??l?.scale??[1,1,1],R=l?.pivotLocal??[0,0,0],b=Jb(M,S,m,T,R,l?.rotationOrder??"XYZ");return{...p,transform:{...p.transform,position:b,rotation:m}}},g=(p,m)=>{e&&r(e,S=>{let M=S.transform?.rotation??l?.rotation??[0,0,0],T=D_(M,p,m);return h(S,T)})},f=(p,m)=>{e&&r(e,S=>{let T=[...S.transform?.rotation??l?.rotation??[0,0,0]];return T[p]=g0(Lp(m)),h(S,T)})},v=(p,m)=>{e&&r(e,S=>{let T=[...S.transform?.position??l?.position??[0,0,0]];return T[p]=m,{...S,transform:{...S.transform,position:T}}})},_=(p,m)=>{e&&v(p,d[p]+m)},y=()=>{!e||!l||r(e,p=>{let m={...p.transform};return delete m.position,delete m.rotation,{...p,transform:Object.keys(m).length>0?m:void 0}})};return vr(zn,{title:"Move & Rotate",open:n,onToggle:i,tooltip:"Enable the transform gizmo to move or rotate the selected mesh on any axis. Rotation uses the object's visible center while exported position and rotation remain local GLTF transforms.",children:[vr("div",{className:"se-field",children:[vr("div",{className:"se-fieldLabel",children:[vr("span",{children:[jt(L_,{size:14,style:{marginRight:6,verticalAlign:"-2px"}}),"Transform gizmo"]}),vr("label",{className:"se-switch","aria-label":"Toggle move mode",children:[jt("input",{type:"checkbox",checked:o,onChange:p=>a(p.target.checked)}),jt("span",{className:"se-switchTrack",children:jt("span",{className:"se-switchThumb"})})]})]}),jt("span",{className:"bb-note",children:"Select a mesh \xB7 drag the colored arrows or planes to move"})]}),vr("div",{className:"se-field",style:{marginTop:10},children:[jt("div",{className:"se-fieldLabel",children:jt("span",{children:"Axis space"})}),jt("div",{className:"se-segmentedControl",children:["world","local"].map(p=>jt("button",{type:"button",className:`se-segmentedOption ${s===p?"se-segmentedOption--active":""}`,onClick:()=>c(p),children:p},p))})]}),vr("div",{className:"se-field",style:{marginTop:10},children:[jt("div",{className:"se-fieldLabel",children:jt("span",{children:"Rotation (degrees)"})}),jt("div",{className:"bb-transformAxesGrid",children:h0.map((p,m)=>{let S=Math.round(m0(u[m]));return vr("div",{className:"bb-transformAxis",children:[jt("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:p}),jt("div",{className:"bb-transformAxisControl",children:jt("input",{type:"number",className:"se-numberInput bb-transformNumberInput",step:1,min:0,max:359,value:S,disabled:!e,"aria-label":`${p} rotation in degrees`,onChange:M=>{let T=Number(M.target.value);Number.isFinite(T)&&f(m,T)}})})]},p)})})]}),vr("div",{className:"se-field",style:{marginTop:10},children:[jt("div",{className:"se-fieldLabel",children:jt("span",{children:"Position"})}),jt(N_,{value:d,min:-1/0,max:1/0,step:O_,disabled:!e,label:"position",onChange:p=>{e&&r(e,m=>({...m,transform:{...m.transform,position:p}}))}})]}),vr("button",{type:"button",className:"bb-button bb-button--ghost",style:{marginTop:10,display:"inline-flex",alignItems:"center",gap:6},disabled:!e||!l,onClick:y,title:"Restore this node's position and rotation to what they were in the original model",children:[jt(B_,{size:14}),"Restore original position & rotation"]})]})}import{memo as F_,useMemo as x0,useState as U_}from"react";function I_(e){return e.trim().replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/[_\s]+/g,"-").replace(/[^a-zA-Z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").toLowerCase()}function Bp(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").replace(/\s+/g," ").trim().replace(/\b\w/g,t=>t.toUpperCase())}function z_(e){let t=e.toLowerCase();return t.includes("light")?"light":t.includes("wheel")||t.includes("rim")||t.includes("tire")?"wheel":t.includes("glass")||t.includes("window")||t.includes("windshield")||t.includes("sunroof")?"glass":t.includes("seat")||t.includes("dashboard")||t.includes("console")||t.includes("doorpanel")?"interior":t.includes("floor")?"floor":t.includes("wall")?"wall":t.includes("door")?"door":t.includes("chair")||t.includes("table")||t.includes("sofa")||t.includes("bed")?"furniture":"other"}function j_(e){return e==="light"||e.endsWith("light")?[{id:"toggle-light",label:"Toggle Light",type:"command"},{id:"change-light-color",label:"Change Light Color",type:"command"},{id:"set-brightness",label:"Set Brightness",type:"command"}]:[{id:"change-color",label:"Change Color",type:"command"},{id:"change-material",label:"Change Material",type:"command"},{id:"toggle-visibility",label:"Toggle Visibility",type:"command"}]}function V_(e){let t=z_(e);return{id:I_(e),modelObjectId:e,type:t,label:Bp(e),status:"normal",selectable:!0,hoverable:!0,visible:!0,style:{},actions:j_(t),metrics:{},metadata:{}}}function Mc(e){return Object.fromEntries(e.map(t=>[t,V_(t)]))}function b0(e){let{nodesById:t}=zo(e),n=[];for(let[i,r]of Object.entries(t)){let o=r;o.isMesh&&o.geometry&&r.name&&n.push(i)}return n.sort((i,r)=>i.localeCompare(r))}import{Fragment as H_,jsx as uo,jsxs as vi}from"react/jsx-runtime";var y0=F_(G_);function G_({bindings:e,selectedItem:t,onSelect:n,onHover:i,isOpen:r=!0,onToggle:o}){let[a,s]=U_(""),c=x0(()=>Object.keys(e),[e]),l=x0(()=>{let u=a.trim().toLowerCase();return u?c.filter(d=>{let h=e[d];return d.toLowerCase().includes(u)||h.label?.toLowerCase().includes(u)||h.type.toLowerCase().includes(u)}):c},[e,c,a]);return vi("aside",{className:`bb-sidebar bb-sidebar--right ${r?"":"bb-sidebar--collapsed"}`,children:[vi("div",{className:"bb-header bb-header--sidebar",children:[!r&&uo("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>o?.(!0),"aria-label":"Open scene nodes sidebar",title:"Open scene nodes",children:"\u2190"}),r&&vi(H_,{children:[vi("div",{children:[uo("div",{className:"bb-sectionKicker",children:"Scene Nodes"}),vi("div",{className:"bb-sectionHeading",children:[l.length," visible entries"]})]}),uo("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>o?.(!1),"aria-label":"Close scene nodes sidebar",title:"Close scene nodes",children:"\u2192"})]})]}),r&&vi("section",{className:"bb-nodeList",children:[uo("div",{className:"bb-search",children:uo("input",{className:"bb-input",placeholder:"Search nodes, labels, or types",value:a,onChange:u=>s(u.target.value)})}),uo("div",{className:"bb-nodeItems",children:l.map(u=>{let d=e[u];return vi("button",{type:"button",className:`bb-nodeButton ${u===t?"bb-nodeButton--active":""}`,onClick:()=>n(u),onMouseEnter:()=>i?.(u),onMouseLeave:()=>i?.(null),children:[uo("span",{className:"bb-nodeName",children:u}),vi("span",{className:"bb-nodeMeta",children:[d.type,d.label===Bp(u)?"":d.label||"\xB7 Untitled"]})]},u)})})]})]})}import{jsx as Tc,jsxs as v0}from"react/jsx-runtime";function Op({title:e,label:t,open:n,onToggle:i,draft:r,error:o,example:a,onDraftChange:s,onCommit:c}){return Tc(zn,{title:e,open:n,onToggle:i,children:v0("div",{className:"bb-field",children:[Tc("label",{className:"bb-label",children:t}),Tc("textarea",{className:"bb-textarea",value:r,onChange:l=>s(l.target.value),onBlur:c}),o?Tc("span",{className:"bb-status bb-status--error",children:o}):v0("span",{className:"bb-note",children:["Use a JSON object like ",a,"."]})]})})}function w0(e,t){let n=new Map(e.animations.clips.map(o=>[o.sourceName,o])),i=t.map(({sourceName:o})=>n.get(o)??{sourceName:o,displayName:o,hidden:!1,loopMode:"repeat",speed:1}),r=e.animations.autoplayClip&&i.some(o=>o.sourceName===e.animations.autoplayClip&&!o.hidden)?e.animations.autoplayClip:null;return{clips:i,autoplayClip:r}}import{useCallback as Pc,useReducer as W_,useRef as $_}from"react";var X_=100;function q_(e,t){switch(t.type){case"set":{let n=typeof t.updater=="function"?t.updater(e.present):t.updater;return n===e.present?e:t.coalesce?{...e,present:n,future:[]}:{past:[...e.past,e.present].slice(-X_),present:n,future:[]}}case"undo":{if(e.past.length===0)return e;let n=e.past[e.past.length-1];return{past:e.past.slice(0,-1),present:n,future:[e.present,...e.future]}}case"redo":{if(e.future.length===0)return e;let[n,...i]=e.future;return{past:[...e.past,e.present],present:n,future:i}}case"reset":return{past:[],present:t.value,future:[]}}}function Dp(e,t=600){let[n,i]=W_(q_,{past:[],present:e,future:[]}),r=$_(0),o=Pc(l=>{let u=Date.now(),d=u-r.current<t;r.current=u,i({type:"set",updater:l,coalesce:d})},[t]),a=Pc(()=>{r.current=0,i({type:"undo"})},[]),s=Pc(()=>{r.current=0,i({type:"redo"})},[]),c=Pc(l=>{r.current=0,i({type:"reset",value:l})},[]);return{value:n.present,setValue:o,undo:a,redo:s,reset:c,canUndo:n.past.length>0,canRedo:n.future.length>0}}import{strToU8 as Y_}from"fflate";function C0(e){return JSON.stringify(e,null,2)}function S0(e){return['import { defineObjectBindings } from "@liveroom-tech/react-immersive/utils";',"",`export const objectBindings = defineObjectBindings(${JSON.stringify(e,null,2)});`,""].join(`
|
|
25
|
-
`)}function
|
|
26
|
-
`)}function ks(e,t,n){zr(new Blob([t],{type:n}),e)}function Np(e){return JSON.stringify(e??{},null,2)}function Ip(e){return`[${e[0].toFixed(3)}, ${e[1].toFixed(3)}, ${e[2].toFixed(3)}]`}function K_(e){let t=e.style?.material;return t?Object.values(t).filter(n=>!!n&&typeof n=="object"&&typeof n.path=="string"&&n.path.trim().length>0).map(n=>n.path):[]}async function P0(e){let t=new Set;for(let r of Object.values(e))for(let o of K_(r))t.add(o);let n=[],i=[];return await Promise.all(Array.from(t).map(async r=>{let o=mm(r);if(o)try{let a=await fetch(o);if(!a.ok)throw new Error(String(a.status));n.push({path:r,blob:await a.blob()})}catch{i.push(r)}})),{assets:n,failedPaths:i}}async function zp(e,t,n,i,r){if(r.length===0){ks(e,t,n);return}let o={[e]:Y_(t)};for(let s of r)o[s.path]=new Uint8Array(await s.blob.arrayBuffer());let a=await Zs(o);zr(new Blob([a],{type:"application/zip"}),i)}var jp={pbr:["texture","baseColor","metalness","metalnessMap","specularIntensity","specularIntensityMap","specularColor","specularColorMap","reflectivity"],roughness:["roughness","roughnessMap"],emission:["emissive","emissiveIntensity","emissiveMap"],opacity:["opacity","alphaMap","alphaTest","alphaHash","dithering","blendingMode"],normalBump:["normalMap","normalScale","flipNormalY","bumpMap","bumpScale"],displacement:["displacementMap","displacementScale","displacementBias"],ao:["aoMap","aoMapIntensity"],clearcoat:["clearcoat","clearcoatMap","clearcoatRoughness","clearcoatRoughnessMap","clearcoatNormalMap","clearcoatNormalScale","flipClearcoatNormalY"],sheen:["sheen","sheenColor","sheenColorMap","sheenRoughness","sheenRoughnessMap"],anisotropy:["anisotropy","anisotropyRotation","anisotropyMap"],transmission:["transmission","transmissionMap","thickness","thicknessMap","attenuationColor","attenuationDistance"],faces:["side"]},_0=Object.keys(jp);function k0(e){if(e==null)return!1;if(typeof e=="string")return e.trim().length>0;if(typeof e=="number")return Number.isFinite(e);if(typeof e=="boolean")return e;if(typeof e=="object"&&"path"in e){let t=e.path;return typeof t=="string"&&t.trim().length>0}return!1}function Vp(e){if(e)return Object.values(e).some(k0)?e:void 0}function sr(e,t){return e?jp[t].some(n=>k0(e[n])):!1}function Fp(e){return{pbr:sr(e,"pbr"),roughness:sr(e,"roughness"),emission:sr(e,"emission"),opacity:sr(e,"opacity"),normalBump:sr(e,"normalBump"),displacement:sr(e,"displacement"),ao:sr(e,"ao"),clearcoat:sr(e,"clearcoat"),sheen:sr(e,"sheen"),anisotropy:sr(e,"anisotropy"),transmission:sr(e,"transmission"),faces:sr(e,"faces")}}function Up(e,t){if(t)return{...e,style:{...e.style,material:t}};if(!e.style)return e;let{material:n,...i}=e.style;return{...e,style:Object.keys(i).length>0?i:void 0}}function A0(e,t){if(!e)return;let n={...e};for(let i of jp[t])delete n[i];return n}import{Fragment as As,jsx as Z,jsxs as qe}from"react/jsx-runtime";var Z_="/room.glb";function _c(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function O0(e,t){if(!_c(e)||!_c(t))return t??e;let n={...e};for(let[i,r]of Object.entries(t)){let o=n[i];n[i]=_c(o)&&_c(r)?O0(o,r):r}return n}function D0({licenseKey:e,licenseValidationUrl:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,project:o,onProjectChange:a,projectChangeDebounceMs:s=350,onModelUpload:c,onEditLeaseChange:l}){let u=Mn(null),d=Mn(null),h=Mn(null),[g,f]=at(o?.model.url??null),[v,_]=at(o?.model.name??""),[y,p]=at(o?.model??null),[m,S]=at(null),M=Dp(o?.objectBindings??{}),T=M.value,R=M.setValue,[b,C]=at(!1),[x,P]=at(!1),[I,E]=at("Load the demo model or upload a GLB, GLTF, OBJ, FBX, or USDZ model to generate bindings."),[z,A]=at("default"),[F,j]=at(!1),[L,B]=at("{}"),[G,U]=at("{}"),[oe,ve]=at(null),[de,we]=at(null),[xe,Ce]=at(!1),[Ye,gt]=at(!1),[Fe,Ae]=at(!1),[Y,tt]=at({identity:!0,basics:!0,material:!1,actions:!1,camera:!1,transform:!1,metrics:!1,metadata:!1}),[Be,$t]=at({pbr:!0,roughness:!1,emission:!1,opacity:!1,normalBump:!1,displacement:!1,ao:!1,clearcoat:!1,sheen:!1,anisotropy:!1,transmission:!1,faces:!1}),Ue=O=>tt(V=>({...V,[O]:!V[O]})),Pt=O=>$t(V=>({...V,[O]:!V[O]})),[_t,Ee]=at("object"),[Ne,te]=at("General"),[ae,ft]=at("metalness"),[re,le]=at(Fp()),he=Mn(null),[Oe,nt]=at(!1),[Re,De]=at(!0),[rt,ce]=at(!0),[Pe,Ke]=at(!1),[ke,dt]=at(null),[ut,bt]=at(!1),[Je,Tn]=at("world"),ue=Mn({}),k=Dp(o?.sceneConfig??Li),N=k.value,H=k.setValue,[J,X]=at(null),[se,ie]=at(null),st=dc(e,t),pt=hx(st.tier),ye=Gp(()=>({isInsideEditor:!0,activeTab:_t,activeSubTab:Ne,tier:pt,setActiveTab:Ee,setActiveSubTab:te}),[_t,Ne,pt]),Ie=Mn(null),xt=Mn(0),ge=Mn(0),wt=Mn(o?`${o.id}:${o.revision}`:null),Xt=Mn(null),sn=Mn(!1),Rt=Mn(!1),Lt=Mn(o?{modelUrl:o.model.url,bindings:o.objectBindings,sceneConfig:o.sceneConfig}:null),Qe=Mn(o?{requestId:0,modelName:o.model.name??"model",modelUrl:o.model.url,storedBindings:o.objectBindings,streaming:!!o.model.tilesetUrl}:null),wr=Mn(null),{cameraState:kt,resetView:ho,focusObject:fa,fitScene:Xn,setCameraState:Or,handleCameraChange:Dc,handleViewerReady:Nc}=gp(),mo=Wt(O=>{Or({position:O.position,target:O.target,fov:kt?.fov??null,zoom:kt?.zoom??1,azimuthAngle:O.azimuthAngle,polarAngle:O.polarAngle},!0)},[Or,kt]),qn=fp(),Bt=m?T[m]??null:null,ba=Bt?.style?.material,dr=Bt?.cameraState,Zr=kt?{position:Ip(kt.position),target:Ip(kt.target)}:null,go=Wt(O=>{H(V=>{let Q=V.annotations.map(Me=>Me.id).join(","),me=O.map(Me=>Me.id).join(",");return Q===me?V:{...V,annotations:O}})},[]),Ls=Wt(O=>{X(O?{annotation:O}:null)},[]);po(()=>{if(!Bt){B("{}"),U("{}"),ve(null),we(null);return}B(Np(Bt.metrics)),U(Np(Bt.metadata)),ve(null),we(null)},[Bt]),po(()=>{let O=Fp(ba);if(he.current!==m){he.current=m,le(O);return}le(V=>{let Q=!1,me={...V};for(let Me of _0)O[Me]&&!V[Me]&&(me[Me]=!0,Q=!0);return Q?me:V})},[m,ba]),po(()=>()=>{Ie.current?.cleanup()},[]);let ei=Wt((O,V)=>{let Q=Mc(O);if(V){let me=new Map(Object.values(V).map(Me=>[Me.modelObjectId,Me]));for(let Me of O){let yt=me.get(Me);yt&&(Q[Me]=yt)}}return Q},[]);po(()=>{if(!o)return;let O=`${o.id}:${o.revision}`;if(wt.current===O)return;wt.current=O;let V=g!==o.model.url||y?.tilesetUrl!==o.model.tilesetUrl||y?.assetVersion!==o.model.assetVersion,Q=T!==o.objectBindings,me=N!==o.sceneConfig;(V||Q||me)&&(Rt.current=!0),p(o.model),_(o.model.name??"model");let Me=o.objectBindings;if(Q){let yt=Xt.current;Me=yt?ei(yt,o.objectBindings):o.objectBindings,M.reset(Me)}if(me&&k.reset(o.sceneConfig),V){let yt=++ge.current;Qe.current={requestId:yt,modelName:o.model.name??"model",modelUrl:o.model.url,storedBindings:o.objectBindings,streaming:!!o.model.tilesetUrl},wr.current=null,S(null),C(!0),f(o.model.url)}Lt.current={modelUrl:o.model.url,bindings:Me,sceneConfig:o.sceneConfig}},[T,ei,o,g,N,y,M,k]);let Si=Mn(a);Si.current=a,po(()=>{if(!o||!Si.current||!g)return;if(!sn.current){sn.current=!0;return}let O=Lt.current;if(g===o.model.url&&T===o.objectBindings&&N===o.sceneConfig||O!==null&&g===O.modelUrl&&T===O.bindings&&N===O.sceneConfig){Rt.current=!1;return}if(Qe.current)return;if(Rt.current){Rt.current=!1;return}let V=window.setTimeout(()=>{Si.current?.({projectId:o.id,baseRevision:o.revision,model:{...y??o.model,url:g,name:v||o.model.name},objectBindings:T,sceneConfig:N},"local")},s);return()=>window.clearTimeout(V)},[T,v,g,o,s,y,N]),po(()=>{let O=V=>{if(V.key.toLowerCase()!=="z"||!(V.metaKey||V.ctrlKey))return;let Q=V.target,me=Q?.tagName;if(me==="INPUT"||me==="TEXTAREA"||Q?.isContentEditable)return;V.preventDefault();let Me=_t==="scene"?k:M;V.shiftKey?Me.redo():Me.undo()};return window.addEventListener("keydown",O),()=>window.removeEventListener("keydown",O)},[_t,M,k]),po(()=>{if(b||z==="default"||z==="success")return;j(!0);let O=window.setTimeout(()=>j(!1),4e3);return()=>window.clearTimeout(O)},[I,z,b]);let jn=Gp(()=>Object.keys(T),[T]),Ic=Gp(()=>!m||!Bt?null:Bt.id.trim()?Object.entries(T).some(([Q,me])=>Q!==m&&me.id===Bt.id)?"Another binding already uses this ID.":null:"ID is required.",[T,m,Bt]),ur=(O,V)=>{R(Q=>({...Q,[O]:V(Q[O])}))},xa=(O,V)=>{ur(O,Q=>{let me=Vp(V(Q.style?.material));return Up(Q,me)})},zc=(O,V,Q)=>{xa(O,me=>({...me,[V]:Q?{path:Q}:void 0}))},Vn=(O,V)=>{le(Q=>({...Q,[O]:V})),!V&&m&&ur(m,Q=>{let me=Vp(A0(Q.style?.material,O));return Up(Q,me)})},fo=Wt((O,V,Q)=>{let me=b0(O),Me=Mc(me);if(Q){let ht=new Map(Object.values(Q).map(ze=>[ze.modelObjectId,ze]));for(let ze of me){let fn=ht.get(ze);fn&&(Me[ze]=fn)}}O.updateMatrixWorld(!0);let yt={};for(let ht of me){let ze=gr(O,ht);if(!ze){yt[ht]={position:[0,0,0],rotation:[0,0,0],scale:[1,1,1],pivotLocal:[0,0,0],rotationOrder:"XYZ"};continue}let fn=bc(ze);yt[ht]={position:[ze.position.x,ze.position.y,ze.position.z],rotation:[ze.rotation.x,ze.rotation.y,ze.rotation.z],scale:[ze.scale.x,ze.scale.y,ze.scale.z],pivotLocal:[fn.x,fn.y,fn.z],rotationOrder:ze.rotation.order}}ue.current=yt,M.reset(Me),S(me[0]??null),Q||H(ht=>({...ht,annotations:[]})),E(`Generated ${me.length} bindings from ${V}.`),A("success"),C(!1)},[M,H]),Yn=(O,V,Q,me)=>{let Me=++ge.current;C(!0);let yt=Q?Q/1048576:0;E(yt>=100?`Reading ${V} (${Math.round(yt)}MB \u2014 large file, this can take a while)...`:`Reading ${V} and generating starter bindings...`),A("default"),_(V),p(me??{url:O,name:V}),X(null);let ht=wr.current;if(O===g&&ht?.url===O){Qe.current=null,fo(ht.scene,V);return}Qe.current={requestId:Me,modelName:V,modelUrl:O,streaming:!!me?.tilesetUrl},f(O),M.reset({}),S(null)},Mi=Wt(O=>{let V=Qe.current;if(!(!V||V.requestId!==ge.current)){if(Qe.current=null,wr.current={url:V.modelUrl,scene:O},V.streaming){E(`Streaming ${V.modelName}.`),A("success"),C(!1);return}V.storedBindings&&(Rt.current=!0),fo(O,V.modelName,V.storedBindings)}},[fo,M]),gn=Wt(O=>{let V=O.map(me=>me.name);if(V.length===0)return;Xt.current=V,Rt.current=!0;let Q=ei(V,o?.objectBindings);if(M.reset(Q),o){let me=Lt.current;Lt.current={modelUrl:me?.modelUrl??o.model.url,bindings:Q,sceneConfig:me?.sceneConfig??o.sceneConfig}}S(me=>me??V[0]??null),E(`Streaming ${V.length} bindable objects.`),A("success"),C(!1)},[ei,M,o]),bo=Wt(O=>{let V=Qe.current;!V||V.requestId!==ge.current||(Qe.current=null,console.error(O),E(`Could not read ${V.modelName}. Make sure the file is a valid GLB, GLTF, OBJ, FBX, or USDZ asset.`),A("error"),C(!1))},[]),ya=Wt(O=>{qn.handleAnimationsReady(O);let V=O.clipDetails??O.clips.map(Q=>({sourceName:Q,duration:0}));H(Q=>({...Q,animations:w0(Q,V)}))},[qn,H]),jc=async()=>{Ie.current?.cleanup(),Ie.current=null,await Yn(Z_,"room.glb")},Bs=async O=>{if(c){try{C(!0),E(`Uploading ${O.name}...`),A("default");let Q=await c(O);await Yn(Q.url,Q.name??O.name,O.size,Q)}catch(Q){C(!1),E(Q instanceof Error?Q.message:`Could not upload ${O.name}.`),A("error")}return}let V;try{V=await ml(O)}catch(Q){E(Q instanceof Error?Q.message:"Could not read model file. Upload a .glb, .gltf, .obj, .fbx, .usdz, or .zip asset."),A("error");return}Ie.current?.cleanup(),Ie.current=V,await Yn(V.url,V.name,O.size,{url:V.url,name:V.name})},Vc=async O=>{let V=O.target.files?.[0];V&&(await Bs(V),O.target.value="")},Cr=()=>{Ie.current?.cleanup(),Ie.current=null,wr.current=null,Qe.current=null,ue.current={},xt.current=0,Ce(!1),f(null),_(""),p(null),S(null),X(null),M.reset({}),B("{}"),U("{}"),ve(null),we(null),ie(null),bt(!1),H(O=>({...O,animations:Li.animations,annotations:[]})),E("Load the demo model or upload a GLB, GLTF, OBJ, FBX, or USDZ model to generate bindings."),A("default")},Ti=()=>{u.current?.click()},va=()=>{d.current?.click()},Kn=async O=>{P(!0);try{let{assets:V,failedPaths:Q}=await P0(T);O==="json"?await zp("objectBindings.json",C0(T),"application/json","objectBindings.zip",V):await zp("objectBindings.ts",S0(T),"text/typescript","objectBindings-ts.zip",V),Q.length>0?(E(`Exported, but ${Q.length} uploaded image${Q.length===1?"":"s"} couldn't be bundled: ${Q.join(", ")}.`),A("error")):V.length>0&&(E(`Exported with ${V.length} uploaded image${V.length===1?"":"s"} bundled into the zip.`),A("success"))}catch(V){let Q=V instanceof Error?V.message:"Unknown export error.";E(`Failed to export bindings: ${Q}`),A("error")}finally{P(!1)}},wa=async O=>{if(!jn.length){E("Load a model before importing bindings."),A("error");return}let V;try{V=JSON.parse(await O.text())}catch{E(`${O.name} is not valid JSON.`),A("error");return}if(V===null||typeof V!="object"||Array.isArray(V)){E("Expected a JSON object mapping object IDs to bindings."),A("error");return}let Q=new Map;for(let ht of Object.values(V))if(ht!==null&&typeof ht=="object"&&typeof ht.id=="string"&&typeof ht.type=="string"&&typeof ht.modelObjectId=="string"){let ze=ht;Q.set(ze.modelObjectId,ze)}if(Q.size===0){E(`${O.name} doesn't look like an exported bindings file.`),A("error");return}let me={...T},Me=0;for(let ht of Object.keys(me)){let ze=Q.get(ht);ze&&(me[ht]=ze,Me++)}if(Me===0){E(`None of the object IDs in ${O.name} match this model \u2014 nothing imported.`),A("error");return}R(me);let yt=Q.size-Me;E(yt>0?`Imported ${Me} binding${Me===1?"":"s"} from ${O.name} (${yt} skipped \u2014 not in this model).`:`Imported ${Me} binding${Me===1?"":"s"} from ${O.name}.`),A("success")},Pi=async O=>{let V=O.target.files?.[0];V&&(await wa(V),O.target.value="")},xo=()=>{h.current?.click()},_i=async O=>{let V;try{V=JSON.parse(await O.text())}catch{E(`${O.name} is not valid JSON.`),A("error");return}if(V===null||typeof V!="object"||Array.isArray(V)){E("Expected a JSON object with scene config sections."),A("error");return}let Q=["model","camera","lighting","wireframe","shadows","environment","background","groundShadows","postProcessing","animations","annotations","cinematic"],me=V,Me=Q.filter(yt=>me[yt]!==void 0);if(Me.length===0){E(`${O.name} doesn't look like an exported scene config file.`),A("error");return}H(yt=>{let ht={...yt};for(let ze of Me)ht[ze]=O0(yt[ze],me[ze]);return ht}),E(`Imported ${Me.length} section${Me.length===1?"":"s"} from ${O.name}.`),A("success")},Dr=async O=>{let V=O.target.files?.[0];V&&(await _i(V),O.target.value="")},Os=O=>{O.preventDefault(),O.stopPropagation(),!(b||g)&&(xt.current+=1,Ce(!0))},Fc=O=>{O.preventDefault(),O.stopPropagation(),!(b||g)&&(O.dataTransfer.dropEffect="copy",Ce(!0))},Ca=O=>{O.preventDefault(),O.stopPropagation(),!(b||g)&&(xt.current=Math.max(0,xt.current-1),xt.current===0&&Ce(!1))},Ds=async O=>{if(O.preventDefault(),O.stopPropagation(),xt.current=0,Ce(!1),b||g)return;let V=O.dataTransfer.files?.[0];V&&await Bs(V)},ti=(O,V,Q)=>{if(!m)return;let me;try{me=JSON.parse(V)}catch{Q("Invalid JSON");return}if(me===null||typeof me!="object"||Array.isArray(me)){Q("Expected a JSON object");return}if(O==="metrics"&&Object.values(me).some(yt=>typeof yt!="number"||!Number.isFinite(yt))){Q("Metrics values must be numbers");return}ur(m,Me=>({...Me,[O]:me})),Q(null)},Ns=Wt(O=>{if(!O){S(null);return}let V=Object.entries(T).find(([Q,me])=>me===O||Q===O.modelObjectId||me.modelObjectId===O.modelObjectId)?.[0]??null;S(V)},[T]),Is=Wt(async O=>{S(O),ie(null),await fa(O)},[fa]),zs=Wt(O=>{ie(O?T[O]??null:null)},[T]),Uc=Wt(O=>Ae(!O),[]),Gc=Wt(()=>{if(!m||!kt)return;let O={position:kt.position,target:kt.target,...kt.fov!=null?{fov:kt.fov}:{},zoom:kt.zoom};ur(m,V=>({...V,cameraState:O}))},[m,kt]),js=Wt(()=>{!dr?.position||!dr?.target||Or({position:dr.position,target:dr.target,fov:dr.fov??kt?.fov??null,zoom:dr.zoom??kt?.zoom??1},!0)},[dr,Or,kt]),ki=Wt(()=>{m&&ur(m,O=>({...O,cameraState:void 0}))},[m]),Vs=Wt(async()=>{await ho()},[ho]),Hc=Wt(async()=>{await Xn()},[Xn]),Sa=Wt(O=>{dt(O),Ke(!0)},[]),pr=Wt(()=>{Ke(!1),dt(null)},[]),Ai=Wt(()=>{if(ke==="bindings"){if(!jn.length){pr();return}let O=Mc(jn);M.reset(O),S(jn[0]??null),E("Object bindings reset to default values."),A("success")}else ke==="scene"&&(k.reset(Li),E("Scene config reset to default values."),A("success"));pr()},[ke,jn,M,k,pr]);return st.status==="checking"?Z("div",{className:"bb-root bb-root--licenseChecking",children:Z(Ni,{title:"Verifying License",message:"Checking your license key..."})}):st.status==="invalid"?Z("div",{className:"bb-root bb-root--licenseInvalid",children:Z(Ni,{tone:"error",title:"Invalid License",message:st.isLocalDomain?st.reason??"License has been revoked or has expired":"Failed to load. Please contact the site administrator."})}):qe(ip.Provider,{value:ye,children:[qe("div",{className:"bb-root",children:[Z("input",{ref:u,type:"file",accept:hl,className:"bb-hiddenInput",onChange:Vc,disabled:b}),Z("input",{ref:d,type:"file",accept:".json,application/json",className:"bb-hiddenInput",onChange:Pi,disabled:b}),Z("input",{ref:h,type:"file",accept:".json,application/json",className:"bb-hiddenInput",onChange:Dr,disabled:b}),qe("aside",{className:`bb-sidebar bb-sidebar--left ${Ye?"bb-sidebar--collapsed":""}`,children:[qe("div",{className:"bb-header bb-header--sidebar",children:[!Ye&&Z("h1",{className:"bb-title",children:"Binding Builder"}),Z("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>gt(O=>!O),"aria-label":Ye?"Open editor sidebar":"Collapse editor sidebar",title:Ye?"Open editor":"Collapse editor",children:Ye?"\u2192":"\u2190"})]}),!Ye&&qe(As,{children:[qe("div",{className:"bb-tabRow",children:[Z("button",{type:"button",className:`bb-tab ${_t==="object"?"bb-tab--active":""}`,onClick:()=>Ee("object"),children:"Object"}),Z("button",{type:"button",className:`bb-tab ${_t==="scene"?"bb-tab--active":""}`,onClick:()=>Ee("scene"),children:"Scene"})]}),Z("section",{className:"bb-editor",children:_t==="scene"?Z(As,{children:g?Z(Tp,{config:N,onChange:H,activeSubTab:Ne,onActiveSubTabChange:te,cameraState:Ne==="Cinematic"&&kt?{position:kt.position,target:kt.target,azimuthAngle:kt.azimuthAngle,polarAngle:kt.polarAngle}:null,onPreviewWaypoint:mo,animationClipDetails:qn.clipDetails,animationPlayback:qn}):Z("div",{className:"bb-emptyEditor",children:"Upload a model to edit its scene settings."})}):!Bt||!m?Z("div",{className:"bb-emptyEditor",children:"Select a generated node binding to edit its values."}):qe(As,{children:[Z("div",{className:"bb-editorHeader",children:qe("div",{children:[Z("div",{className:"bb-sectionKicker",children:"Editing Binding"}),Z("h2",{className:"bb-editorTitle",children:Bt.label||m}),qe("div",{className:"bb-editorMeta",children:[Z("span",{children:Bt.type}),Z("span",{children:Bt.modelObjectId})]})]})}),Z(r0,{selectedItem:m,selectedBinding:Bt,open:Y.identity,onToggle:()=>Ue("identity"),updateBinding:ur,idError:Ic}),Z(s0,{selectedItem:m,selectedBinding:Bt,open:Y.basics,onToggle:()=>Ue("basics"),updateBinding:ur}),qe(zn,{title:"Material",open:Y.material,onToggle:()=>Ue("material"),tooltip:"Edit the selected object's base material, textures, and surface properties.",children:[Z(n0,{disabled:!m,onApply:O=>m&&xa(m,V=>({...V,...O}))}),Z(e0,{selectedItem:m,selectedMaterial:ba,pbrWorkflow:ae,onPbrWorkflowChange:ft,openMaterialPanels:Be,materialPanelEnabled:re,onToggleMaterialPanel:Pt,onSetMaterialPanelState:Vn,updateSelectedMaterial:xa,setSelectedTexturePath:zc})]}),Z(u0,{selectedItem:m,selectedBinding:Bt,open:Y.actions,onToggle:()=>Ue("actions"),updateBinding:ur}),Z(p0,{selectedBinding:Bt,open:Y.camera,onToggle:()=>Ue("camera"),cameraState:kt,formattedCameraState:Zr,savedCameraPosition:dr,onSaveCameraPosition:Gc,onGoToSavedCamera:js,onClearSavedCamera:ki,onResetView:Vs,onFitScene:Hc}),Z(f0,{selectedItem:m,selectedBinding:Bt,open:Y.transform,onToggle:()=>Ue("transform"),updateBinding:ur,moveModeEnabled:ut,onToggleMoveMode:bt,transformSpace:Je,onTransformSpaceChange:Tn,originalTransform:ue.current[m]??null}),Z(Op,{title:"Metrics",label:"Metrics JSON",open:Y.metrics,onToggle:()=>Ue("metrics"),draft:L,error:oe,example:'{"area": 42}',onDraftChange:B,onCommit:()=>ti("metrics",L,ve)}),Z(Op,{title:"Metadata",label:"Metadata JSON",open:Y.metadata,onToggle:()=>Ue("metadata"),draft:G,error:de,example:'{"room": "kitchen"}',onDraftChange:U,onCommit:()=>ti("metadata",G,we)})]})}),_t==="object"&&qe("div",{className:"bb-toolbar",children:[qe("div",{className:"bb-toolbarGroup",children:[Z("button",{type:"button",className:"bb-iconButton",disabled:!M.canUndo,onClick:M.undo,title:"Undo (Cmd/Ctrl+Z)",children:Z(R0,{size:16})}),Z("button",{type:"button",className:"bb-iconButton",disabled:!jn.length,onClick:()=>Sa("bindings"),title:"Reset object bindings to default",children:Z(B0,{size:16})}),Z("button",{type:"button",className:"bb-iconButton",disabled:!M.canRedo,onClick:M.redo,title:"Redo (Cmd/Ctrl+Shift+Z)",children:Z(E0,{size:16})})]}),Z("div",{className:"bb-toolbarDivider"}),qe("button",{type:"button",className:"bb-button bb-button--ghost",disabled:!jn.length||b,onClick:va,title:"Re-apply a previously exported objectBindings.json onto this model",children:[Z(L0,{size:14}),"Import"]}),Z("div",{className:"bb-toolbarDivider"}),Z(Ap,{disabled:!jn.length||x,exporting:x,onExportJson:()=>Kn("json"),onExportTs:()=>Kn("ts")})]}),_t==="scene"&&qe("div",{className:"bb-toolbar",children:[qe("div",{className:"bb-toolbarGroup",children:[Z("button",{type:"button",className:"bb-iconButton",disabled:!k.canUndo,onClick:k.undo,title:"Undo (Cmd/Ctrl+Z)",children:Z(R0,{size:16})}),Z("button",{type:"button",className:"bb-iconButton",onClick:()=>Sa("scene"),title:"Reset scene config to default",children:Z(B0,{size:16})}),Z("button",{type:"button",className:"bb-iconButton",disabled:!k.canRedo,onClick:k.redo,title:"Redo (Cmd/Ctrl+Shift+Z)",children:Z(E0,{size:16})})]}),Z("div",{className:"bb-toolbarDivider"}),qe("button",{type:"button",className:"bb-button bb-button--ghost",disabled:!jn.length||b,onClick:xo,title:"Re-apply a previously exported sceneConfig.json",children:[Z(L0,{size:14}),"Import"]}),Z("div",{className:"bb-toolbarDivider"}),Z(Ap,{disabled:!jn.length||b,onExportJson:()=>ks("sceneConfig.json",M0(N),"application/json"),onExportTs:()=>ks("sceneConfig.ts",T0(N),"text/typescript")})]})]})]}),qe("main",{className:"bb-previewShell",children:[qe("div",{className:"bb-previewHeader",children:[qe("div",{className:"bb-previewToggles",children:[qe("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[Z("input",{type:"checkbox",checked:Oe,onChange:O=>nt(O.target.checked)}),"Zoom on selected"]}),qe("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[Z("input",{type:"checkbox",checked:Re,onChange:O=>De(O.target.checked)}),"Highlight on hover"]}),qe("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[Z("input",{type:"checkbox",checked:rt,onChange:O=>ce(O.target.checked)}),"Camera controller"]})]}),qe("div",{className:"bb-previewControlsColumn",children:[qe("div",{className:"bb-previewControls",children:[Z("div",{className:"bb-previewMeta",children:Z("span",{children:m?`Focused: ${m}`:"Select a node to inspect it"})}),g&&Z("button",{type:"button",className:"bb-button bb-button--ghost bb-removeModelButton",onClick:Cr,children:"Remove model"})]}),g&&Z("div",{className:"bb-moveHint",children:ut?Z(As,{children:"Select a mesh \xB7 drag the colored arrows, planes, or rings"}):qe(As,{children:[Z("kbd",{children:"W"}),Z("kbd",{children:"A"}),Z("kbd",{children:"S"}),Z("kbd",{children:"D"})," move \xB7 ",Z("kbd",{children:"Space"}),"/",Z("kbd",{children:"C"})," up \xB7 down \xB7 drag to look"]})})]})]}),qe("div",{className:"bb-preview",children:[Z(ea,{visible:b||F,message:I,tone:z,spinner:b}),g?Z(vc,{modelUrl:g,tilesetUrl:y?.tilesetUrl,objectBindings:T,selectedObject:Bt,onObjectSelect:Ns,onObjectBindingsChange:R,onObjectEditLeaseChange:(O,V)=>l?.(O.modelObjectId||O.id,V),showObjectBindingDataPanel:!1,showSceneObjectsPanel:!1,onCameraChange:Dc,onViewerReady:Nc,onAnnotationsChange:go,activeAnnotation:J?.annotation??null,onActiveAnnotationChange:Ls,onAnimationsReady:ya,onModelLoaded:Mi,onLoadError:bo,onObjectCatalog:gn,licenseKey:e,licenseValidationUrl:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,sceneConfig:N,onSceneConfigChange:H,preserveDrawingBuffer:!0,disableZoom:!1,zoomOnSelected:Oe,highlightOnHover:Re,enableCameraControls:rt,moveModeEnabled:ut,objectTransformSpace:Je,enableKeyboardNavigation:!0,showViewGizmo:!0,panelHoveredObject:Re?se:null,showLoadingOverlay:!1}):Z("div",{className:`bb-previewPlaceholder ${xe?"bb-previewPlaceholder--dragActive":""}`,onDragEnter:Os,onDragOver:Fc,onDragLeave:Ca,onDrop:Ds,children:qe("div",{children:[Z("div",{children:"Upload a GLB, GLTF, OBJ, FBX, or USDZ model, or drag a supported model/ZIP bundle here to generate editable object bindings."}),Z("button",{type:"button",className:"bb-previewPlaceholderButton",onClick:Ti,disabled:b,children:b?"Loading model...":"Upload"})]})})]})]}),Z(y0,{bindings:T,selectedItem:m,onSelect:Is,onHover:zs,isOpen:!Fe,onToggle:Uc})]}),Pe&&Z("div",{className:"bb-reset-overlay",onClick:pr,children:qe("div",{className:"bb-reset-dialog",onClick:O=>O.stopPropagation(),children:[qe("div",{className:"bb-reset-header",children:[qe("h3",{className:"bb-reset-title",children:[Z(Q_,{size:20,className:"bb-icon-warning"}),"Confirm Reset"]}),Z("button",{className:"bb-reset-close",onClick:pr,children:Z(J_,{size:20})})]}),qe("div",{className:"bb-reset-body",children:[qe("p",{className:"bb-reset-message",children:["Are you sure you want to reset"," ",Z("strong",{children:ke==="bindings"?"Object Bindings":"Scene Config"}),"?"]}),Z("p",{className:"bb-reset-details",children:ke==="bindings"?"This will remove all your custom changes to object properties, groups, tags, transforms, materials, actions, camera positions, metrics, and metadata.":"This will restore all scene settings (camera, lighting, environment, background, animations, annotations, etc.) to their default values."}),Z("p",{className:"bb-reset-warning",children:"This action cannot be undone!"})]}),qe("div",{className:"bb-reset-footer",children:[Z("button",{className:"bb-reset-btn",onClick:pr,children:"Cancel"}),Z("button",{className:"bb-reset-btn-danger",onClick:Ai,children:"Yes, Reset"})]})]})})]})}import{useRef as wi,useState as nn,useCallback as Rn,useEffect as lr,useMemo as kc,Component as ek,Suspense as Hp}from"react";import{CameraControls as tk,Environment as nk}from"@react-three/drei";import{useFrame as F0,useThree as ma}from"@react-three/fiber";import{Canvas as rk}from"@react-three/fiber";import{Box3 as ik,MeshStandardMaterial as ok,PerspectiveCamera as ak,Vector3 as sk}from"three";import{SkeletonUtils as lk}from"three-stdlib";import{X as Yp,Check as U0,Settings as ck,ChevronDown as dk,Boxes as uk,Trash2 as pk,Upload as Wp,AlertTriangle as hk}from"lucide-react";import{Fragment as V0,jsx as q,jsxs as et}from"react/jsx-runtime";var N0={color:"#93c5fd",intensity:.05},mk=["apartment","city","dawn","forest","lobby","night","park","studio","sunset","warehouse"];function gk(e){return!!(e&&"isMesh"in e&&e.isMesh)}function I0(e,t){Array.isArray(e)?e.forEach(t):t(e)}function fk(e,t){if(!t)return;let n=t.camera;if(!(n instanceof ak))return;let i=new ik().setFromObject(e).getSize(new sk).length();!Number.isFinite(i)||i<=0||(n.near=i/100,n.far=i*100,n.updateProjectionMatrix(),t.maxDistance=i*10)}var qp=class extends ek{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n){this.props.onLoadError?.(n)}render(){return this.state.hasError?null:this.props.children}};function bk({url:e,format:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,hiddenKeys:o,selectedKey:a,panelHoveredKey:s,nodeRefsOut:c,onMeshesReady:l,onModelLoaded:u,onMeshClick:d,highlightOnHover:h}){let{scene:g}=xl(e,{dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r},t),f=ma(x=>x.invalidate),{setCanvasCursor:v,restoreCanvasCursor:_}=_l(),[y,p]=nn(null),m=kc(()=>lk.clone(g),[g]),S=kc(()=>{let x={};return m.traverse(P=>{if(!gk(P))return;let I=P.name||P.uuid;x[I]={key:I,label:P.name||P.type,ref:P}}),x},[m]),M=kc(()=>{let x={};for(let[P,{ref:I}]of Object.entries(S)){let z=(Array.isArray(I.material)?I.material:[I.material]).map(A=>{let j=(jo(A)??new ok).clone();return j.userData.baseColor=j.color.clone(),j.userData.baseMap=j.map,j.userData.baseEmissive=j.emissive.clone(),j.userData.baseEmissiveMap=j.emissiveMap,j.userData.baseEmissiveIntensity=j.emissiveIntensity,j});x[P]=Array.isArray(I.material)?z:z[0]}return x},[S]);lr(()=>()=>{Object.values(M).forEach(x=>I0(x,P=>P.dispose()))},[M]);let T=wi(null);lr(()=>{T.current!==e&&(T.current=e,m.updateWorldMatrix(!0,!0),Ya(m),l(S),u(m))},[e,m,S,l,u]),lr(()=>{let x=new AbortController;return Eo(m,x.signal),()=>{x.abort(),Di(m)}},[m]);let R=kc(()=>!Ys(m),[m]);lr(()=>{for(let[x,{ref:P}]of Object.entries(S))c.current[x]=P},[S,c]),lr(()=>{!h&&y!==null&&(p(null),_())},[h,y,_]),lr(()=>{for(let[x,{ref:P}]of Object.entries(S)){P.visible=!o.has(x);let I=M[x];if(!I)continue;P.material=I;let E=h&&y===x,z=h&&s===x;I0(I,A=>{if(A.color.copy(A.userData.baseColor),A.map=A.userData.baseMap??null,A.emissive.copy(A.userData.baseEmissive),A.emissiveMap=A.userData.baseEmissiveMap??null,A.emissiveIntensity=A.userData.baseEmissiveIntensity,z||E){let F=!!A.userData.baseEmissiveMap;A.emissive.set(N0.color),A.emissiveIntensity=F?A.userData.baseEmissiveIntensity:N0.intensity}A.needsUpdate=!0})}f()},[S,M,y,a,s,h,o,f]);let b=x=>{let P=x;for(;P;){let I=P.name||P.uuid;if(S[I])return I;P=P.parent}return null},C=R?{onClick:x=>{let P=b(x.object);P&&(x.stopPropagation(),d(P))},...h?{onPointerOver:x=>{let P=b(x.object);P&&(x.stopPropagation(),v("pointer"),p(P))},onPointerOut:x=>{x.stopPropagation(),_(),p(null)}}:{}}:{};return q("primitive",{object:m,...C})}function xk({scene:e,controlsRef:t,refitOnResize:n,onInitialFitComplete:i}){let r=wi(!1),o=ma(c=>c.invalidate),a=ma(c=>c.size),s=wi(null);return lr(()=>{r.current=!1,o()},[o,e]),F0(()=>{if(!r.current){if(!e||!t.current){o();return}r.current=!0,fk(e,t.current),t.current.fitToBox(e,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{}).finally(i)}}),lr(()=>{if(!(!n||!r.current||!e||!t.current))return s.current&&clearTimeout(s.current),s.current=setTimeout(()=>{t.current?.fitToBox(e,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{}),o()},150),()=>{s.current&&clearTimeout(s.current)}},[a.width,a.height,n]),null}function yk({exposure:e}){let t=ma(i=>i.gl),n=ma(i=>i.invalidate);return lr(()=>{t.toneMappingExposure=e,n()},[t,e,n]),null}function vk({enabled:e,controlsRef:t}){let n=ma(i=>i.invalidate);return F0((i,r)=>{!e||!t.current||(t.current.rotate(r*.2,0,!1),n())}),null}function Ac(e){return Array.from(e.types).includes("Files")}function z0({label:e,checked:t,onChange:n}){return et("div",{className:"env-row",children:[q("span",{className:"env-row__label",children:e}),q("div",{className:"env-row__value",children:q("button",{className:"env-checkbox-btn",onClick:()=>n(!t),children:q("span",{className:`env-checkbox${t?" env-checkbox--checked":""}`,children:t&&q(U0,{size:9,strokeWidth:2,color:"white"})})})})]})}function $p({label:e,value:t,onChange:n}){return et("div",{className:"env-row",children:[q("span",{className:"env-row__label",children:e}),q("div",{className:"env-row__value",children:et("div",{className:"env-color-swatch",style:{background:t},children:[q("span",{className:"env-color-swatch__hex",children:t}),q("input",{type:"color",className:"env-color-swatch__input",value:t,onChange:i=>n(i.target.value)})]})})]})}function Xp({label:e,value:t,min:n,max:i,step:r,onChange:o}){return et("div",{className:"env-row",children:[q("span",{className:"env-row__label",children:e}),et("div",{className:"env-row__value env-row__value--slider",children:[q("input",{type:"range",className:"env-slider",min:n,max:i,step:r,value:t,onChange:a=>o(Number(a.target.value))}),q("span",{className:"env-slider__value",children:t.toFixed(2)})]})]})}function wk({label:e,value:t,options:n,onChange:i}){return et("div",{className:"env-row",children:[q("span",{className:"env-row__label",children:e}),q("div",{className:"env-row__value",children:q("select",{className:"env-select",value:t,onChange:r=>i(r.target.value),children:n.map(r=>q("option",{value:r,children:r},r))})})]})}function j0({title:e,children:t}){let[n,i]=nn(!1);return et("div",{className:"env-section",children:[et("button",{className:"env-section__header",onClick:()=>i(r=>!r),children:[q(dk,{size:12,strokeWidth:2,className:`env-section__chevron${n?" env-section__chevron--collapsed":""}`}),q("span",{children:e})]}),!n&&q("div",{className:"env-section__body",children:t})]})}function Ck({isOpen:e,onToggle:t,settings:n,onChange:i}){return et("div",{className:`left-panel-wrapper ${e?"left-panel-wrapper--open":"left-panel-wrapper--closed"}`,children:[!e&&q("button",{className:"side-panel__open-btn side-panel__open-btn--left",onClick:()=>t(!0),children:q(ck,{size:20,strokeWidth:1.8})}),et("div",{className:`side-panel side-panel--left ${e?"side-panel--open-left":"side-panel--closed-left"}`,"aria-hidden":!e,children:[q("div",{className:"side-panel__header",children:et("div",{className:"side-panel__header-top",children:[q("span",{className:"side-panel__eyebrow",children:"Scene Settings"}),q("button",{className:"side-panel__close-btn",onClick:()=>t(!1),title:"Close",children:q(Yp,{size:12,strokeWidth:1.6})})]})}),et("div",{className:"env-controls",children:[et(j0,{title:"Background",children:[q(z0,{label:"Background",checked:n.backgroundEnabled,onChange:r=>i("backgroundEnabled",r)}),q($p,{label:"Background Color",value:n.backgroundColor,onChange:r=>i("backgroundColor",r)}),q(wk,{label:"Environment",value:n.envPreset,options:mk,onChange:r=>i("envPreset",r)}),q(z0,{label:"Auto Rotate",checked:n.autoRotate,onChange:r=>i("autoRotate",r)})]}),et(j0,{title:"Lighting",children:[q(Xp,{label:"Exposure",value:n.exposure,min:0,max:2,step:.05,onChange:r=>i("exposure",r)}),q(Xp,{label:"Ambient Light Intensity",value:n.ambientIntensity,min:0,max:3,step:.05,onChange:r=>i("ambientIntensity",r)}),q($p,{label:"Ambient Light Color",value:n.ambientColor,onChange:r=>i("ambientColor",r)}),q(Xp,{label:"Direct Light Intensity",value:n.directionalIntensity,min:0,max:5,step:.05,onChange:r=>i("directionalIntensity",r)}),q($p,{label:"Direct Light Color",value:n.directionalColor,onChange:r=>i("directionalColor",r)})]})]})]})]})}function Sk({meshKeys:e,hiddenKeys:t,selectedKey:n,isOpen:i,onToggle:r,onFocus:o,onHover:a,onToggleVisibility:s}){let[c,l]=nn(""),[u,d]=nn(null),h=Object.values(e).filter(g=>g.label.toLowerCase().includes(c.toLowerCase()));return et("div",{className:`right-panel-wrapper ${i?"right-panel-wrapper--open":"right-panel-wrapper--closed"}`,children:[!i&&q("button",{className:"side-panel__open-btn",onClick:()=>r(!0),children:q(uk,{size:20,strokeWidth:1.8})}),et("div",{className:`side-panel ${i?"side-panel--open":"side-panel--closed"}`,"aria-hidden":!i,children:[et("div",{className:"side-panel__header",children:[et("div",{className:"side-panel__header-top",children:[q("span",{className:"side-panel__eyebrow",children:"SCENE OBJECTS"}),q("button",{className:"side-panel__close-btn",onClick:()=>r(!1),title:"Close",children:q(Yp,{size:12,strokeWidth:1.6})})]}),et("p",{className:"side-panel__title",children:[h.length," objects"]})]}),q("div",{className:"side-panel__search-wrap",children:q("input",{className:"side-panel__search",type:"text",placeholder:"Search objects",value:c,onChange:g=>l(g.target.value)})}),q("div",{className:"side-panel__list",children:h.map(({key:g,label:f})=>{let v=!t.has(g),_=n===g,y=u===g;return et("div",{onClick:()=>o(g),onMouseEnter:()=>{d(g),a(g)},onMouseLeave:()=>{d(null),a(null)},className:["side-panel__row",y?"side-panel__row--hovered":"",_?"side-panel__row--selected":""].filter(Boolean).join(" "),children:[q("span",{className:`side-panel__label${y||_?" side-panel__label--hovered":""}`,children:f}),q("button",{className:"side-panel__vis-btn",title:v?"Hide":"Show",onClick:p=>{p.stopPropagation(),s(g)},children:q("span",{className:`side-panel__checkbox${v?" side-panel__checkbox--checked":""}`,children:v&&q(U0,{size:9,strokeWidth:5,color:"white"})})})]},g)})})]})]})}function G0({modelUrl:e,modelFormat:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r=!0,backgroundColor:o="#1a1a1a",showSceneObjectsPanel:a=!0,showSceneSettingsPanel:s=!0,enableModelUpload:c=!1,zoomOnSelected:l=!1,highlightOnHover:u=!1,showLoadingOverlay:d=!0,refitOnResize:h=!0,backgroundEnabled:g=!1,autoRotate:f=!1,envPreset:v="city",exposure:_=1,ambientIntensity:y=.6,ambientColor:p="#ffffff",directionalIntensity:m=1.2,directionalColor:S="#ffffff",onModelLoaded:M,onLoadError:T}){let R=wi(null),b=wi({}),C=wi(null),x=wi(null),P=wi(0),[I,E]=nn(null),[z,A]=nn(null),[F,j]=nn(!1),[L,B]=nn({}),[G,U]=nn(new Set),[oe,ve]=nn(null),[de,we]=nn(null),[xe,Ce]=nn(null),[Ye,gt]=nn(null),[Fe,Ae]=nn(!1),[Y,tt]=nn(!1),[Be,$t]=nn(!1),[Ue,Pt]=nn(!1),[_t,Ee]=nn(()=>typeof window>"u"?!0:window.innerWidth>900),[Ne,te]=nn(()=>typeof window>"u"?!0:window.innerWidth>900),[ae,ft]=nn({backgroundEnabled:g,backgroundColor:o,autoRotate:f,envPreset:v,exposure:_,ambientIntensity:y,ambientColor:p,directionalIntensity:m,directionalColor:S}),re=c?xe:e,le=Rn(()=>{E(null),A(null),j(!1),B({}),U(new Set),ve(null),we(null),Ae(!1),$t(!1)},[]),he=Rn(()=>{x.current?.cleanup(),x.current=null},[]),Oe=Rn(()=>{he(),Ce(null),gt(null),le(),ft({backgroundEnabled:g,backgroundColor:o,autoRotate:f,envPreset:v,exposure:_,ambientIntensity:y,ambientColor:p,directionalIntensity:m,directionalColor:S})},[p,y,f,o,g,S,m,v,_,le,he]),nt=Rn(async ue=>{tt(!0);try{let k=await ml(ue);he(),x.current=k,Ce(k.url),gt(k.name),le()}catch(k){Ae(!0),T?.(k)}finally{tt(!1)}},[T,le,he]),Re=Rn(ue=>{let k=ue?.[0];k&&nt(k)},[nt]);lr(()=>()=>{he()},[he]);let De=Rn((ue,k)=>{ft(N=>({...N,[ue]:k}))},[]);lr(()=>{ft(ue=>({...ue,backgroundColor:o}))},[o]),lr(()=>{le()},[re,le]);let rt=Rn(ue=>{B(ue),U(new Set),ve(null)},[]),ce=Rn(ue=>{E(ue),Ae(!1);let k=Na(ue);A(k>Oi?k:null),j(!1),M?.(ue)},[M]),Pe=Rn(ue=>{Ae(!0),T?.(ue)},[T]),Ke=Rn(ue=>{if(ve(ue),!l)return;let k=b.current[ue];!k||!R.current||R.current.fitToBox(k,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[l]),ke=Rn(ue=>{U(k=>{let N=new Set(k);return N.has(ue)?N.delete(ue):N.add(ue),N})},[]),dt=Rn(ue=>{!c||!Ac(ue.dataTransfer)||(ue.preventDefault(),ue.stopPropagation(),P.current+=1,Pt(!0))},[c]),ut=Rn(ue=>{!c||!Ac(ue.dataTransfer)||(ue.preventDefault(),ue.stopPropagation(),ue.dataTransfer.dropEffect="copy",Pt(!0))},[c]),bt=Rn(ue=>{!c||!Ac(ue.dataTransfer)||(ue.preventDefault(),ue.stopPropagation(),P.current=Math.max(0,P.current-1),P.current===0&&Pt(!1))},[c]),Je=Rn(ue=>{!c||!Ac(ue.dataTransfer)||(ue.preventDefault(),ue.stopPropagation(),P.current=0,Pt(!1),Re(ue.dataTransfer.files))},[c,Re]),Tn=d&&(Y||!!(re&&!Fe&&(!I||!Be)));return et("div",{className:"smv-root",style:{background:ae.backgroundColor},onDragEnter:dt,onDragOver:ut,onDragLeave:bt,onDrop:Je,children:[s&&re&&q(Ck,{isOpen:Ne,onToggle:te,settings:ae,onChange:De}),et("div",{className:"smv-canvasArea",children:[z!==null&&!F&&et("div",{className:"smv-largeModelBanner",children:[q(hk,{size:14,className:"smv-largeModelBanner__icon"}),et("span",{children:["Very large model detected (",Math.round(z/1e6),"M triangles) \u2014 it may render and move slowly on this device, and click/hover selection on the model is disabled. Use the scene objects panel to select parts."]}),q("button",{type:"button",className:"smv-largeModelBanner__dismiss",onClick:()=>j(!0),"aria-label":"Dismiss",children:q(Yp,{size:12})})]}),c?et(V0,{children:[q("input",{ref:C,type:"file",accept:hl,className:"smv-upload-input",onChange:ue=>{Re(ue.target.files),ue.currentTarget.value=""}}),re?q("div",{className:"smv-upload-toolbar",children:et(V0,{children:[q("span",{className:"smv-upload-toolbar__name",children:Ye??"Uploaded model"}),et("button",{type:"button",className:"smv-upload-toolbar__button smv-upload-toolbar__button--ghost",onClick:Oe,children:[q(pk,{size:14}),"Clear"]})]})}):null]}):null,re?q(rk,{dpr:[1,2],frameloop:"demand",resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:{background:ae.backgroundColor},camera:{position:[0,0,5],fov:45,near:.1,far:1e3},children:et(Hp,{fallback:null,children:[q("ambientLight",{intensity:ae.ambientIntensity,color:ae.ambientColor}),q("directionalLight",{position:[-4,5,7],intensity:ae.directionalIntensity,color:ae.directionalColor,castShadow:!0}),q("directionalLight",{position:[-5,5,5],intensity:.5}),q(Hp,{fallback:null,children:q(nk,{preset:ae.envPreset,background:ae.backgroundEnabled})}),q(yk,{exposure:ae.exposure}),q(vk,{enabled:ae.autoRotate,controlsRef:R}),q(qp,{onLoadError:Pe,children:q(Hp,{fallback:null,children:q(bk,{url:re,format:xe?void 0:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,hiddenKeys:G,selectedKey:oe,panelHoveredKey:de,nodeRefsOut:b,onMeshesReady:rt,onModelLoaded:ce,onMeshClick:Ke,highlightOnHover:u})})},re),q(xk,{scene:I,controlsRef:R,refitOnResize:h,onInitialFitComplete:()=>$t(!0)}),q(tk,{ref:R,makeDefault:!0,smoothTime:.3})]})}):q("div",{className:"smv-upload-empty-state",style:{background:ae.backgroundColor},children:et("div",{className:"smv-upload-empty-state__card",children:[q("div",{className:"smv-upload-empty-state__icon",children:q(Wp,{size:24})}),et("p",{className:"smv-upload-empty-state__body",children:["Drag and drop ",q("code",{children:".glb"}),", ",q("code",{children:".gltf"}),","," ",q("code",{children:".obj"}),", ",q("code",{children:".fbx"}),", ",q("code",{children:".usdz"}),", or"," ",q("code",{children:".zip"})," here"]}),et("button",{type:"button",className:"smv-upload-empty-state__button",onClick:()=>C.current?.click(),children:[q(Wp,{size:15}),"Choose model"]})]})}),q(ea,{visible:Tn,message:Y?"Preparing model...":"Loading model..."}),c&&Ue?q("div",{className:"smv-upload-drop-overlay",children:et("div",{className:"smv-upload-drop-overlay__card",children:[q(Wp,{size:20}),q("span",{children:"Release to load your model"})]})}):null]}),a&&re&&q(Sk,{meshKeys:L,hiddenKeys:G,selectedKey:oe,isOpen:_t,onToggle:Ee,onFocus:Ke,onHover:we,onToggleVisibility:ke})]})}import{useCallback as H0,useState as Mk}from"react";function Tk(e=null){let[t,n]=Mk(e),i=H0(o=>{n(o)},[n]),r=H0(()=>{n(null)},[]);return{selectedObjectBinding:t,setSelectedObjectBinding:n,handleObjectSelect:i,clearSelection:r}}import{useMemo as Pk}from"react";function _k(e,t){return Pk(()=>{if(!t)return null;let n=e[t];return n||(Object.values(e).find(i=>i.id===t||i.modelObjectId===t)??null)},[e,t])}import{useMemo as kk}from"react";function Ak(e){return kk(()=>Object.values(e).map(t=>t.modelObjectId),[e])}import{useCallback as mn,useMemo as W0,useState as Ek}from"react";var $0={baseColor:"texture",metalness:"metalnessMap",roughness:"roughnessMap",emissive:"emissiveMap",alpha:"alphaMap",normal:"normalMap",bump:"bumpMap",ao:"aoMap",displacement:"displacementMap",clearcoat:"clearcoatMap",clearcoatRoughness:"clearcoatRoughnessMap",clearcoatNormal:"clearcoatNormalMap",anisotropy:"anisotropyMap",transmission:"transmissionMap",thickness:"thicknessMap",sheenColor:"sheenColorMap",sheenRoughness:"sheenRoughnessMap",specularIntensity:"specularIntensityMap",specularColor:"specularColorMap"};function X0(e){if(e)return Object.fromEntries(Object.entries(e).map(([t,n])=>[t,n&&typeof n=="object"?{...n}:n]))}function Rk(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t.visible===!1).map(([t])=>[t,!0]))}function Lk(e){let[t,n]=Ek(e),i=mn((R,b)=>{n(C=>b===void 0?ko(C,R):ko(C,R,b))},[]),r=mn((R,b)=>i(R,sd(b)),[i]),o=mn((R,b)=>r(R,{baseColor:b}),[r]),a=mn((R,b,C="baseColor")=>{let x=$0[C],P=typeof b=="string"?{path:b}:b;i(R,{style:{material:{[x]:P}}})},[i]),s=mn((R,b="baseColor")=>{let C=$0[b];i(R,{style:{material:{[C]:void 0}}})},[i]),c=mn((R,b)=>{n(C=>{let x=xn(C,R);if(!x)return C;let P=X0(C[x]?.style?.material),I=Bi(C,b);if(I.length===0)return C;let E=C;for(let z of I){let A=C[z];A&&(E===C&&(E={...C}),E[z]={...A,style:{...A.style,material:X0(P)}})}return E})},[]),l=mn(R=>i(R,{style:{material:void 0}}),[i]),u=mn((R,b)=>i(R,{transform:b}),[i]),d=mn(R=>i(R,{transform:void 0}),[i]),h=mn((R,b)=>i(R,{metadata:b}),[i]),g=mn(R=>ad(t,R),[t]),f=mn(R=>Bi(t,R).map(b=>t[b]?.id??b),[t]),v=mn(R=>{let b=xn(t,R);return b?t[b]?.style?.material??null:null},[t]),_=mn(R=>i(R,{visible:!1}),[i]),y=mn(R=>i(R,{visible:!0}),[i]),p=mn(R=>{n(b=>{let C=Bi(b,R).reduce((x,P)=>{let I=b[P];return I&&x.push({ids:P,patch:{visible:I.visible===!1}}),x},[]);return ko(b,C)})},[n]),m=mn(()=>{n(R=>ko(R,Object.keys(R),{visible:!0}))},[n]),S=W0(()=>Rk(t),[t]),M=W0(()=>Object.keys(S).map(R=>t[R]?.id??R),[S,t]),T=mn(R=>{let b=xn(t,R);return b?t[b]?.visible===!1:!1},[t]);return{objectBindings:t,setObjectBindings:n,updateObjectBindings:i,setMaterial:r,setBaseColor:o,setTexture:a,clearTexture:s,copyMaterial:c,resetMaterial:l,getMaterial:v,setTransform:u,resetTransform:d,updateMetadata:h,selectObjectBindings:g,selectObjectBindingIds:f,hiddenObjects:S,hiddenObjectIds:M,hideObject:_,showObject:y,toggleObjectVisibility:p,isObjectHidden:T,clearHiddenObjects:m}}import{useCallback as cr,useMemo as Bk,useRef as Ok,useState as Dk}from"react";var Nk={type:"point",color:"#ffffff",intensity:1,position:[0,0,0],distance:0,decay:2,attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0};function Ik(e){let t=Ok(null),[n,i]=Dk(()=>{let y=typeof e=="function"?e():e;return t.current=y,y}),r=cr(y=>{i(p=>{let m=typeof y=="function"?y(p):y;return ld(p,m)})},[]),o=cr(()=>{let y=t.current;y&&i(y)},[]),a=cr((y,p)=>{r(m=>({lighting:{lights:m.lighting.lights.map(S=>S.id===y?{...S,...p}:S)}}))},[r]),s=cr(y=>{r(p=>p.lighting.lights.some(m=>m.id===y.id)?{}:{lighting:{lights:[...p.lighting.lights,{...Nk,...y}]}})},[r]),c=cr(y=>{r(p=>({lighting:{lights:p.lighting.lights.filter(m=>m.id!==y)}}))},[r]),l=cr((y,p)=>a(y,{intensity:p}),[a]),u=cr((y,p)=>a(y,{color:p}),[a]),d=cr(y=>a(y,{visible:!0}),[a]),h=cr(y=>a(y,{visible:!1}),[a]),g=cr(y=>{r(p=>({lighting:{lights:p.lighting.lights.map(m=>m.id===y?{...m,visible:!m.visible}:m)}}))},[r]),f=cr((y,p)=>a(y,{attachment:p,attachedToCamera:!1}),[a]),v=cr(y=>a(y,{attachment:void 0}),[a]),_=Bk(()=>({items:n.lighting.lights,get:y=>n.lighting.lights.find(p=>p.id===y),add:s,update:a,remove:c,setIntensity:l,setColor:u,show:d,hide:h,toggle:g,attach:f,detach:v}),[n.lighting.lights,s,a,c,l,u,d,h,g,f,v]);return{sceneConfig:n,setSceneConfig:i,updateSceneConfig:r,resetSceneConfig:o,lights:_}}import{useCallback as zk,useState as jk}from"react";function Vk(){let[e,t]=jk(null),n=zk(i=>{t(i)},[t]);return{hoveredObjectBinding:e,handleHoveredObject:n}}import{useCallback as Kp,useState as Es}from"react";import{Box3 as Fk,Vector3 as q0}from"three";function Ec(e){return[e.x,e.y,e.z]}function Uk(){let[e,t]=Es(!0),[n,i]=Es(!1),[r,o]=Es(null),[a,s]=Es(null),[c,l]=Es(0),u=Kp(g=>{let f=new Fk().setFromObject(g),v=f.min.clone(),_=f.max.clone(),y=new q0,p=new q0,m=0;g.traverse(S=>{"isMesh"in S&&S.isMesh&&(m+=1)}),f.getCenter(y),f.getSize(p),s({min:Ec(v),max:Ec(_),center:Ec(y),size:Ec(p)}),l(m),o(null),t(!1),i(!0)},[]),d=Kp(g=>{o(g),s(null),l(0),t(!1),i(!1)},[]),h=Kp(()=>{t(!0),i(!1),o(null),s(null),l(0)},[]);return{isLoading:e,isReady:n,error:r,bounds:a,objectCount:c,handleModelLoaded:u,handleLoadError:d,resetModelState:h}}import{useCallback as Jp}from"react";function Gk({bindings:e,scene:t,camera:n,animations:i,onAction:r}){let{objectBindings:o,updateObjectBindings:a,showObject:s,hideObject:c,toggleObjectVisibility:l}=e,u=t?.updateSceneConfig,d=n?.focusObject,h=n?.fitScene,g=n?.resetView,f=n?.setCameraTarget,v=n?.setCameraState,_=i?.play,y=i?.pause,p=i?.stop,m=i?.setSpeed,S=i?.seek,M=Jp(b=>{let C=xn(o,b);return C?o[C]?.actions??[]:[]},[o]),T=Jp(async b=>{for(let C of b.action.effects??[]){if("objectBindings"in C){a(C.target,C.objectBindings);continue}if("sceneConfig"in C){u?.(C.sceneConfig);continue}if("visibility"in C){C.visibility==="show"?s(C.target):C.visibility==="hide"?c(C.target):l(C.target);continue}if("camera"in C){let P=C.camera;P.type==="focus-object"?await d?.(P.objectId??b.objectId):P.type==="fit-scene"?await h?.():P.type==="reset"?await g?.():P.type==="set-target"?await f?.(P.target,P.transition??!0):await v?.(P.state,P.transition??!0);continue}let x=C.animation;x.type==="play"?_?.(x.clip):x.type==="pause"?y?.():x.type==="stop"?p?.():x.type==="set-speed"?m?.(x.speed):S?.(x.time)}await r?.(b)},[h,d,c,r,y,_,g,S,m,v,f,s,p,l,a,u]),R=Jp(async(b,C)=>{let x=xn(o,b);if(!x)return null;let P=o[x],I=P?.actions?.find(z=>z.id===C);if(!P||!I)return null;let E={objectId:x,action:I,binding:P};return await T(E),E},[T,o]);return{getActionsForObject:M,handleAction:T,runAction:R}}import{useCallback as Rc,useRef as Y0}from"react";function Hk(e){return typeof e=="function"?e:e?.handleViewerReady??null}function Wk(...e){let t=Y0(null),n=Y0(e);n.current=e;let i=Rc(s=>{t.current=s;let c=new Set;for(let l of n.current){let u=Hk(l);u&&!c.has(u)&&(c.add(u),u(s))}},[]),r=Rc(()=>t.current,[]),o=Rc(s=>{let c=t.current;return c?c.captureImage(s):Promise.reject(new Error("ModelViewer is not ready yet."))},[]),a=Rc(()=>{let s=t.current;return s?(s.invalidate(),!0):!1},[]);return{handleViewerReady:i,getViewer:r,captureImage:o,invalidate:a}}import{useCallback as Vt,useEffect as $k,useRef as Br}from"react";import{Material as Xk,PointLight as qk,Vector3 as Yk}from"three";var eh=["emissiveIntensity","opacity","metalness","roughness","transmission","clearcoat","clearcoatRoughness","ior","thickness"],Lc=1;function Bc(e){return typeof e=="string"?[e]:e}function Oc(e,t=0,n=1){return Math.min(n,Math.max(t,e))}function Qp(e,t){return e+Math.random()*(t-e)}function K0([e,t],n){return e+(t-e)*n}function Zp([e,t],n){return[e[0]+(t[0]-e[0])*n,e[1]+(t[1]-e[1])*n,e[2]+(t[2]-e[2])*n]}function J0(e,t){let n=Oc(e);switch(t){case"ease-in":return n*n;case"ease-out":return 1-(1-n)*(1-n);case"ease-in-out":return n<.5?2*n*n:1-Math.pow(-2*n+2,2)/2;default:return n}}function Kk(e){let t=e.material;return t?(Array.isArray(t)?t:[t]).filter(n=>n instanceof Xk):[]}function Jk(e){let t={opacity:e.opacity,transparent:e.transparent};e.color&&(t.baseColor=`#${e.color.getHexString()}`),e.emissive&&(t.emissive=`#${e.emissive.getHexString()}`);for(let n of eh){let i=e[n];typeof i=="number"&&(t[n]=i)}return t}function Q0(e,t){t.baseColor!==void 0&&e.color&&e.color.set(t.baseColor),t.emissive!==void 0&&e.emissive&&e.emissive.set(t.emissive);for(let n of eh){let i=t[n];i!==void 0&&typeof e[n]=="number"&&(e[n]=i)}t.transparent!==void 0&&(e.transparent=t.transparent),e.needsUpdate=!0}function Qk(e){return{position:[e.position.x,e.position.y,e.position.z],rotation:[e.rotation.x,e.rotation.y,e.rotation.z],scale:[e.scale.x,e.scale.y,e.scale.z],visible:e.visible}}function Zk(e,t){if(t.position&&e.position.set(...t.position),t.rotation&&e.rotation.set(...t.rotation),t.scale!==void 0){let n=typeof t.scale=="number"?[t.scale,t.scale,t.scale]:t.scale;e.scale.set(...n)}t.visible!==void 0&&(e.visible=t.visible),e.updateMatrix(),e.updateMatrixWorld(!0)}function eA(e={}){let t=Br(e);t.current=e;let n=Br(null),i=Br(null),r=Br(null),o=Br(new Map),a=Br(new Map),s=Br(new Map),c=Br(new Map),l=Vt(L=>{let B=n.current;if(!B)return null;let G=xn(B.objectBindings,L);return B.nodeRefs[L]??(G?B.nodeRefs[G]:null)??(B.scene?gr(B.scene,L):null)??null},[]),u=Vt(L=>{let B=n.current;return B?typeof L=="object"&&!Array.isArray(L)?Bi(B.objectBindings,L):Bc(L).map(G=>xn(B.objectBindings,G)??G):typeof L=="string"?[L]:Array.isArray(L)?L:[]},[]),d=Vt(()=>{n.current?.invalidate()},[]),h=Vt((L,B)=>{let G=!1;for(let U of u(L)){let oe=l(U);if(oe)for(let ve of Kk(oe))s.current.has(ve)||s.current.set(ve,Jk(ve)),Q0(ve,B),G=!0}return G},[l,u]),g=Vt((L,B)=>{let G=h(L,B);return G&&d(),G},[d,h]),f=Vt((L,B)=>{let G=!1;for(let U of u(L)){let oe=l(U);oe&&(c.current.has(oe)||c.current.set(oe,Qk(oe)),Zk(oe,B),G=!0)}return G},[l,u]),v=Vt((L,B)=>{let G=f(L,B);return G&&d(),G},[d,f]),_=Vt(L=>{let B=l(L);if(!B)return null;B.updateWorldMatrix(!0,!1);let G=B.getWorldPosition(new Yk);return[G.x,G.y,G.z]},[l]),y=Vt(L=>{let B=a.current.get(L);return B?(B.light.removeFromParent(),B.light.dispose(),a.current.delete(L),d(),!0):!1},[d]),p=Vt(L=>{let B=l(L.target);if(!B)return!1;let G=a.current.get(L.id),U=G?.light??new qk;return G&&G.target!==L.target&&U.removeFromParent(),U.name=`react-immersive-runtime-light:${L.id}`,U.color.set(L.color??"#ffffff"),U.intensity=L.intensity??1,U.distance=L.distance??0,U.decay=L.decay??2,U.castShadow=L.castShadow??!1,U.position.set(...L.offset??[0,0,0]),U.parent!==B&&B.add(U),a.current.set(L.id,{light:U,target:L.target}),d(),!0},[d,l]),m=Vt((L,B)=>{let G=a.current.get(L);if(!G)return!1;if(B.target&&B.target!==G.target){let U=l(B.target);if(!U)return!1;G.light.removeFromParent(),U.add(G.light),G.target=B.target}return B.color!==void 0&&G.light.color.set(B.color),B.intensity!==void 0&&(G.light.intensity=B.intensity),B.distance!==void 0&&(G.light.distance=B.distance),B.decay!==void 0&&(G.light.decay=B.decay),B.offset!==void 0&&G.light.position.set(...B.offset),B.castShadow!==void 0&&(G.light.castShadow=B.castShadow),d(),!0},[d,l]),S=Vt((L,B)=>{let G=U=>B[U%B.length]??0;for(let U of L.materials??[])u(U.targets).forEach((oe,ve)=>{let de=G(ve),we={};for(let xe of eh){let Ce=U.values[xe];Ce&&(we[xe]=K0(Ce,de))}h(oe,we)});for(let U of L.transforms??[])u(U.targets).forEach((oe,ve)=>{let de=G(ve),we={};U.values.position&&(we.position=Zp(U.values.position,de)),U.values.rotation&&(we.rotation=Zp(U.values.rotation,de)),U.values.scale&&(we.scale=Zp(U.values.scale,de)),f(oe,we)});for(let U of L.lights??[])Bc(U.lights).forEach((oe,ve)=>{let de=a.current.get(oe);de&&(de.light.intensity=K0(U.intensity,G(ve)))})},[u,h,f]),M=Br(()=>{}),T=Br(()=>{});T.current=L=>{r.current=null;let B=!1;for(let[G,U]of o.current){U.startedAt===null&&(U.startedAt=L);let oe=U.lastFrameAt??L;U.lastFrameAt=L;let ve=U.override&&U.override.until>L?U.override.level:null;U.override&&ve===null&&(U.override=null);let de=U.update(L,L-U.startedAt,Math.min(100,L-oe),ve);B=!0,de||(o.current.delete(G),U.onComplete?.())}B&&d(),o.current.size>0&&M.current()},M.current=()=>{r.current!==null||typeof requestAnimationFrame>"u"||(r.current=requestAnimationFrame(L=>T.current(L)))};let R=Vt(L=>(o.current.set(L.id,L),M.current(),L.id),[]),b=Vt((L,B={})=>{let G=B.id??`transition-${Lc++}`,U=Math.max(1,B.duration??400),oe=B.easing??"ease-in-out";return R({id:G,startedAt:null,lastFrameAt:null,override:null,onComplete:B.onComplete,update:(ve,de,we,xe)=>{let Ce=xe??J0(de/U,oe);return S(L,[Ce]),de<U}})},[S,R]),C=Vt((L,B={})=>{let G=B.id??`pulse-${Lc++}`,U=Math.max(1,B.duration??1e3),oe=B.minLevel??0,ve=B.maxLevel??1,de=B.repeat??1/0,we=B.synchronized??!0,xe=Math.max(1,...[...L.materials??[],...L.transforms??[]].map(Ce=>u(Ce.targets).length),...(L.lights??[]).map(Ce=>Bc(Ce.lights).length));return R({id:G,startedAt:null,lastFrameAt:null,override:null,onComplete:B.onComplete,update:(Ce,Ye,gt,Fe)=>{let Ae=Ye/U,Y=Array.from({length:we?1:xe},(tt,Be)=>{if(Fe!==null)return Fe;let $t=Ae+(we?0:Be/xe),Ue=.5-Math.cos($t%1*Math.PI*2)/2;return oe+(ve-oe)*Ue});return S(L,Y),de===1/0||Ae<de}})},[S,R,u]),x=Vt((L,B={})=>{let G=B.id??`timeline-${Lc++}`,U=B.repeat??1,oe=L.map(de=>({...de,duration:Math.max(1,de.duration),hold:Math.max(0,de.hold??0)})),ve=Math.max(1,oe.reduce((de,we)=>de+we.duration+we.hold,0));return R({id:G,startedAt:null,lastFrameAt:null,override:null,onComplete:B.onComplete,update:(de,we,xe,Ce)=>{if(oe.length===0||U<=0)return!1;let Ye=we/ve;if(U!==1/0&&Ye>=U){for(let Ae of oe)S(Ae.channels,[1]);return!1}let gt=we%ve,Fe=0;for(let Ae of oe){let Y=Fe+Ae.duration,tt=Y+Ae.hold;if(gt>=Y){S(Ae.channels,[Ce??1]),Fe=tt;continue}if(gt>=Fe){let Be=Ce??J0((gt-Fe)/Ae.duration,Ae.easing??"ease-in-out");S(Ae.channels,[Be]);break}}return!0}})},[S,R]),P=Vt((L,B={})=>{let G=B.id??`flicker-${Lc++}`,U=B.synchronized??!0,oe=B.minLevel??.15,ve=B.maxLevel??1,de=B.interval??[45,160],we=typeof de=="number"?[de,de]:de,xe=[Math.max(1,Math.min(...we)),Math.max(1,Math.max(...we))],Ce=Oc(B.response??.7,.01,1),Ye=Oc(B.blackoutChance??.08),gt=Oc(B.flashChance??.12),Fe=B.flashLevel??1.15,Ae=Math.max(1,...[...L.materials??[],...L.transforms??[]].map(Ue=>u(Ue.targets).length),...(L.lights??[]).map(Ue=>Bc(Ue.lights).length)),Y=U?1:Ae,tt=Array.from({length:Y},()=>oe),Be=Array.from({length:Y},()=>oe),$t=Array.from({length:Y},()=>0);return R({id:G,startedAt:null,lastFrameAt:null,override:null,onComplete:B.onComplete,update:(Ue,Pt,_t,Ee)=>{for(let Ne=0;Ne<Y;Ne+=1){if(Ee!==null)Be[Ne]=Ee;else if(Ue>=$t[Ne]){let ae=Math.random();Be[Ne]=ae<Ye?Qp(0,Math.min(.04,oe)):ae<Ye+gt?Fe:Qp(oe,ve),$t[Ne]=Ue+Qp(...xe)}let te=1-Math.pow(1-Ce,Math.max(1,_t)/16.67);tt[Ne]+=(Be[Ne]-tt[Ne])*te}return S(L,tt),B.duration===void 0||Pt<B.duration}})},[S,R,u]),I=Vt((L,B,G)=>{let U=o.current.get(L);if(!U)return!1;let oe=typeof performance>"u"?Date.now():performance.now();return U.override={level:B,until:oe+Math.max(0,G)},M.current(),!0},[]),E=Vt(L=>o.current.delete(L),[]),z=Vt(()=>{o.current.clear(),r.current!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(r.current),r.current=null)},[]),A=Vt(()=>{for(let[L,B]of s.current)Q0(L,B);s.current.clear();for(let[L,B]of c.current)L.position.set(...B.position),L.rotation.set(...B.rotation),L.scale.set(...B.scale),L.visible=B.visible,L.updateMatrix(),L.updateMatrixWorld(!0);c.current.clear();for(let L of a.current.values())L.light.removeFromParent(),L.light.dispose();a.current.clear(),d()},[d]),F=Vt(()=>{z(),A()},[A,z]),j=Vt(L=>{i.current&&i.current!==L.scene&&A(),n.current=L,i.current=L.scene,t.current.onViewerReady?.(L)},[A]);return $k(()=>()=>{F(),n.current=null,i.current=null},[F]),{handleViewerReady:j,setMaterial:g,setTransform:v,getWorldPosition:_,addPointLight:p,updatePointLight:m,removePointLight:y,transition:b,timeline:x,pulse:C,flicker:P,overrideEffect:I,stopEffect:E,stopAllEffects:z,resetRuntime:F}}import{useCallback as ga,useEffect as th,useRef as Ci,useState as tA}from"react";function ty(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Rs(e){return typeof e=="number"&&Number.isFinite(e)}function Z0(e){return Array.isArray(e)&&e.length===3&&e.every(Rs)}function nA(e){return!ty(e)||!Z0(e.position)||!Z0(e.target)||e.fov!==null&&!Rs(e.fov)||!Rs(e.zoom)||e.zoom<=0||e.azimuthAngle!==void 0&&!Rs(e.azimuthAngle)||e.polarAngle!==void 0&&!Rs(e.polarAngle)?null:{position:e.position,target:e.target,fov:e.fov,zoom:e.zoom,azimuthAngle:e.azimuthAngle,polarAngle:e.polarAngle}}function rA(e){if(!ty(e))return null;let t;if(e.camera!==void 0){let r=nA(e.camera);if(!r)return null;t=r}let n;if(e.hidden!==void 0){if(!Array.isArray(e.hidden)||!e.hidden.every(r=>typeof r=="string"))return null;n=e.hidden}let i;if(e.selected===null||typeof e.selected=="string")i=e.selected;else if(e.selected!==void 0)return null;return{camera:t,hidden:n,selected:i}}function ey(e,t,n){let i=Object.values(t).filter(r=>r.visible===!1).map(r=>r.id);return{camera:e??void 0,hidden:i,selected:n?.id??null}}function iA({cameraState:e,setCameraState:t,objectBindings:n,onObjectBindingsChange:i,selectedObjectBinding:r,setSelectedObjectBinding:o,paramKey:a="view",debounceMs:s=400,autoSync:c=!0}){let l=Ci(null),u=Ci(null),d=Ci(null),h=Ci(null),g=Ci(null),f=ga(()=>{g.current!==null&&(window.clearTimeout(g.current),g.current=null),d.current=null,h.current=null},[]),v=ga(()=>{let C=ey(e,n,r);return`${a}=${encodeURIComponent(JSON.stringify(C))}`},[e,n,r,a]),_=ga(()=>{let C=new URL(window.location.href);return C.hash=v(),C.toString()},[v]),y=ga(C=>{let x=new URL(window.location.href);x.hash=C,window.history.replaceState(null,"",x.toString()),u.current=C,l.current=new URLSearchParams(x.hash.slice(1)).get(a)},[a]),p=ga(()=>{f(),y(v())},[v,f,y]),m=Ci({cameraState:e,objectBindings:n,selectedObjectBinding:r});m.current={cameraState:e,objectBindings:n,selectedObjectBinding:r};let[S,M]=tA(!1);th(()=>{if(!c||!S){f();return}let C=m.current,x=ey(C.cameraState,C.objectBindings,C.selectedObjectBinding),P=`${a}=${encodeURIComponent(JSON.stringify(x))}`;if(P===u.current){f();return}P===d.current&&s===h.current||(f(),d.current=P,h.current=s,g.current=window.setTimeout(()=>{g.current=null,d.current=null,h.current=null,y(P)},Math.max(0,s)))},[c,e,f,s,n,a,S,r,y]),th(()=>f,[f]);let T=Ci(null),R=Ci(null),b=ga(async()=>{M(!0);let C=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash,x=new URLSearchParams(C).get(a);if(!x)return T.current=null,!1;if(x===l.current||x===T.current||x===R.current)return!1;let P;try{P=JSON.parse(x)}catch{return!1}let I=rA(P);if(!I)return!1;R.current=x;try{if(I.camera&&await t(I.camera,!1),I.hidden){let E=new Set(I.hidden);i(Object.fromEntries(Object.entries(n).map(([z,A])=>[z,{...A,visible:!E.has(A.id)}])))}if(I.selected!==void 0){let E=I.selected?xn(n,I.selected):null;o(E?n[E]:null)}return T.current=x,!0}finally{R.current===x&&(R.current=null)}},[n,i,a,t,o]);return th(()=>{let C=()=>{b().catch(()=>{})};return window.addEventListener("hashchange",C),()=>{window.removeEventListener("hashchange",C)}},[b]),{getShareUrl:_,syncUrl:p,restoreFromUrl:b}}export{D0 as BindingBuilder,Li as DEFAULT_SCENE_CONFIG,od as MATERIAL_BLENDING_MODES,id as MATERIAL_SIDES,vc as ModelViewer,G0 as SimpleModelViewer,Wy as defineObjectBindings,sd as material,ko as patchBindings,ld as patchSceneConfig,Bi as selectBindingKeys,ad as selectBindings,_k as useObjectBinding,Ak as useObjectBindingIds,Lk as useObjectBindings,Ik as useSceneConfig,iA as useShareableViewerState,Gk as useViewerActions,fp as useViewerAnimations,gp as useViewerCamera,Wk as useViewerConnection,eA as useViewerEffects,Vk as useViewerHover,Uk as useViewerModel,Tk as useViewerSelection};
|
|
24
|
+
`}))}increaseSizeTo(e){this._target.setSize(Math.max(this._target.width,e),1)}readDataAsync(e){let{_renderer:t,_target:n}=this;return t.readRenderTargetPixelsAsync(n,0,0,e.length/4,1,e)}readData(e){let{_renderer:t,_target:n}=this;t.readRenderTargetPixels(n,0,0,e.length/4,1,e)}renderPixelToTarget(e,t,n){let{_renderer:i,_target:r}=this;_s.min.copy(t),_s.max.copy(t),_s.max.x+=1,_s.max.y+=1,i.initRenderTarget(r),i.copyTextureToTexture(e,r.texture,_s,n,0)}},bi=new class{constructor(){let e=null;Object.getOwnPropertyNames(Qf.prototype).forEach(t=>{t!=="constructor"&&(this[t]=(...n)=>(e||(e=new Qf),e[t](...n)))})}},Zf=new vr,eb=new vr,tb=new vr;function PM(e,t){return t===0?e.getAttribute("uv"):e.getAttribute(`uv${t}`)}function hb(e,t,n=[,,,]){let i=3*t,r=3*t+1,o=3*t+2;return e.index&&(i=e.index.getX(i),r=e.index.getX(r),o=e.index.getX(o)),n[0]=i,n[1]=r,n[2]=o,n}function mb(e,t,n,i,r){let[o,a,s]=i,c=PM(e,t);Zf.fromBufferAttribute(c,o),eb.fromBufferAttribute(c,a),tb.fromBufferAttribute(c,s),r.set(0,0,0).addScaledVector(Zf,n.x).addScaledVector(eb,n.y).addScaledVector(tb,n.z)}function gb(e,t,n,i){let r=e.x-Math.floor(e.x),o=e.y-Math.floor(e.y),a=Math.floor(r*t%t),s=Math.floor(o*n%n);return i.set(a,s),i}var nb=new vr,rb=new vr,ib=new vr,kM=class extends Tc{constructor(e,t,n=null){super(e,t,n),this.channels=cn(n,"channels",[0]),this.index=cn(n,"index",null),this.texCoord=cn(n,"texCoord",null),this.valueLength=parseInt(this.type.replace(/[^0-9]/g,""))||1}readDataFromBuffer(e,t,n=null){let i=this.type;if(i==="BOOLEAN"||i==="STRING")throw Error("PropertyTextureAccessor: BOOLEAN and STRING types not supported.");return pb(e,t*this.valueLength,i,n)}},_M=class extends ip{constructor(...e){super(...e),this.isPropertyTextureAccessor=!0,this._asyncRead=!1,this._initProperties(kM)}getData(e,t,n,i={}){let r=this.properties;Sc(r,i);let o=Object.keys(r),a=o.map(s=>i[s]);return this.getPropertyValuesAtTexel(o,e,t,n,a),o.forEach((s,c)=>i[s]=a[c]),i}async getDataAsync(e,t,n,i={}){let r=this.properties;Sc(r,i);let o=Object.keys(r),a=o.map(s=>i[s]);return await this.getPropertyValuesAtTexelAsync(o,e,t,n,a),o.forEach((s,c)=>i[s]=a[c]),i}getPropertyValuesAtTexelAsync(...e){this._asyncRead=!0;let t=this.getPropertyValuesAtTexel(...e);return this._asyncRead=!1,t}getPropertyValuesAtTexel(e,t,n,i,r=[]){for(;r.length<e.length;)r.push(null);r.length=e.length,bi.increaseSizeTo(r.length);let o=this.data,a=this.definition.properties,s=this.properties,c=hb(i,t);for(let d=0,h=e.length;d<h;d++){let g=e[d];if(!a[g])continue;let f=s[g],y=o[f.index];mb(i,f.texCoord,n,c,nb),gb(nb,y.image.width,y.image.height,rb),ib.set(d,0),bi.renderPixelToTarget(y,rb,ib)}let l=new Uint8Array(e.length*4);if(this._asyncRead)return bi.readDataAsync(l).then(()=>(u.call(this),r));return bi.readData(l),u.call(this),r;function u(){for(let d=0,h=e.length;d<h;d++){let g=e[d],f=s[g],y=f.type;if(r[d]=rp(f,r[d]),!f)throw Error("PropertyTextureAccessor: Requested property does not exist.");if(!a[g]){r[d]=f.resolveDefault(r);continue}let k=f.valueLength*(f.count||1),v=f.channels.map(M=>l[4*d+M]),p=f.componentType,m=new(Es(p,y))(k);if(new Uint8Array(m.buffer).set(v),f.array){let M=r[d];for(let C=0,P=M.length;C<P;C++)M[C]=f.readDataFromBuffer(m,C,M[C])}else r[d]=f.readDataFromBuffer(m,0,r[d]);r[d]=f.adjustValueScaleOffset(r[d]),r[d]=f.resolveEnumsToStrings(r[d]),r[d]=f.resolveNoData(r[d])}}}dispose(){this.data.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},Zu=class{constructor(e,t,n,i=null,r=null){let{schema:o,propertyTables:a=[],propertyTextures:s=[],propertyAttributes:c=[]}=e,{enums:l,classes:u}=o,d=a.map(f=>new TM(f,u,l,n)),h=[],g=[];i&&(i.propertyTextures&&(h=i.propertyTextures.map(f=>new _M(s[f],u,l,t))),i.propertyAttributes&&(g=i.propertyAttributes.map(f=>new SM(c[f],u,l)))),this.schema=o,this.tableAccessors=d,this.textureAccessors=h,this.attributeAccessors=g,this.object=r,this.textures=t,this.nodeMetadata=i}getPropertyTableData(e,t,n=null){if(!Array.isArray(e))n||(n={}),n=this.tableAccessors[e].getData(t,n);else{n||(n=[]);let i=Math.min(e.length,t.length);n.length=i;for(let r=0;r<i;r++){let o=this.tableAccessors[e[r]];n[r]=o.getData(t[r],n[r])}}if(Array.isArray(e)!==Array.isArray(n)||Array.isArray(e)!==Array.isArray(t))throw Error("StructuralMetadata: Scalar and array inputs cannot be mixed.");return n}getPropertyTableInfo(e=null){if(e===null&&(e=this.tableAccessors.map((t,n)=>n)),Array.isArray(e))return e.map(t=>{let n=this.tableAccessors[t];return{name:n.name,className:n.definition.class}});{let t=this.tableAccessors[e];return{name:t.name,className:t.definition.class}}}getPropertyTextureData(e,t,n=[]){let i=this.textureAccessors;n.length=i.length;for(let r=0;r<i.length;r++)n[r]=i[r].getData(e,t,this.object.geometry,n[r]);return n}async getPropertyTextureDataAsync(e,t,n=[]){let i=this.textureAccessors;n.length=i.length;let r=[];for(let o=0;o<i.length;o++){let a=i[o].getDataAsync(e,t,this.object.geometry,n[o]).then(s=>{n[o]=s});r.push(a)}return await Promise.all(r),n}getPropertyTextureInfo(){return this.textureAccessors}getPropertyAttributeData(e,t=[]){let n=this.attributeAccessors;t.length=n.length;for(let i=0;i<n.length;i++)t[i]=n[i].getData(e,this.object.geometry,t[i]);return t}getPropertyAttributeInfo(){return this.attributeAccessors.map(e=>({name:e.name,className:e.definition.class}))}dispose(){this.textureAccessors.forEach(e=>e.dispose()),this.tableAccessors.forEach(e=>e.dispose()),this.attributeAccessors.forEach(e=>e.dispose())}},As="EXT_structural_metadata";function AM(e,t=[]){let n=e.json.textures?.length||0,i=Array(n).fill(null);return t.forEach(({properties:r})=>{for(let o in r){let{index:a}=r[o];i[a]===null&&(i[a]=e.loadTexture(a))}}),Promise.all(i)}function EM(e,t=[]){let n=e.json.bufferViews?.length||0,i=Array(n).fill(null);return t.forEach(({properties:r})=>{for(let o in r){let{values:a,arrayOffsets:s,stringOffsets:c}=r[o];i[a]===null&&(i[a]=e.getDependency("bufferView",a)),i[s]===null&&(i[s]=e.getDependency("bufferView",s)),i[c]===null&&(i[c]=e.getDependency("bufferView",c))}}),Promise.all(i)}var fb=class{constructor(e){this.parser=e,this.name=As}async afterRoot({scene:e,parser:t}){let n=t.json.extensionsUsed;if(!n||!n.includes(As))return;let i=null,r=t.json.extensions[As];if(r.schemaUri){let{manager:c,path:l,requestHeader:u,crossOrigin:d}=t.options,h=new URL(r.schemaUri,l).toString(),g=new rM(c);g.setCrossOrigin(d),g.setResponseType("json"),g.setRequestHeader(u),i=g.loadAsync(h).then(f=>{r={...r,schema:f}})}let[o,a]=await Promise.all([AM(t,r.propertyTextures),EM(t,r.propertyTables),i]),s=new Zu(r,o,a);e.userData.structuralMetadata=s,e.traverse(c=>{if(t.associations.has(c)){let{meshes:l,primitives:u}=t.associations.get(c),d=t.json.meshes[l]?.primitives[u];if(d&&d.extensions&&d.extensions[As]){let h=d.extensions[As];c.userData.structuralMetadata=new Zu(r,o,a,h,c)}else c.userData.structuralMetadata=s}})}},ob=new vr,ab=new vr,sb=new vr;function RM(e){return e.x>e.y&&e.x>e.z?0:e.y>e.z?1:2}var bb=class{constructor(e,t,n){this.geometry=e,this.textures=t,this.data=n,this._asyncRead=!1,this.featureIds=n.featureIds.map(i=>{let{texture:r,...o}=i,a={label:null,propertyTable:null,nullFeatureId:null,...o};return r&&(a.texture={texCoord:0,channels:[0],...r}),a})}getTextures(){return this.textures}getFeatureInfo(){return this.featureIds}getFeaturesAsync(...e){this._asyncRead=!0;let t=this.getFeatures(...e);return this._asyncRead=!1,t}getFeatures(e,t){let{geometry:n,textures:i,featureIds:r}=this,o=Array(r.length).fill(null),a=r.length;bi.increaseSizeTo(a);let s=hb(n,e),c=s[RM(t)];for(let d=0,h=r.length;d<h;d++){let g=r[d],f="nullFeatureId"in g?g.nullFeatureId:null;if("texture"in g){let y=i[g.texture.index];mb(n,g.texture.texCoord,t,s,ob),gb(ob,y.image.width,y.image.height,ab),sb.set(d,0),bi.renderPixelToTarget(i[g.texture.index],ab,sb)}else if("attribute"in g){let y=n.getAttribute(`_feature_id_${g.attribute}`).getX(c);y!==f&&(o[d]=y)}else{let y=c;y!==f&&(o[d]=y)}}let l=new Uint8Array(a*4);if(this._asyncRead)return bi.readDataAsync(l).then(()=>(u(),o));return bi.readData(l),u(),o;function u(){let d=new Uint32Array(1);for(let h=0,g=r.length;h<g;h++){let f=r[h],y="nullFeatureId"in f?f.nullFeatureId:null;if("texture"in f){let{channels:k}=f.texture,v=k.map(m=>l[4*h+m]);new Uint8Array(d.buffer).set(v);let p=d[0];p!==y&&(o[h]=p)}}}}dispose(){this.textures.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},Mc="EXT_mesh_features";function lb(e,t,n){e.traverse(i=>{if(t.associations.has(i)){let{meshes:r,primitives:o}=t.associations.get(i),a=t.json.meshes[r]?.primitives[o];a&&a.extensions&&a.extensions[Mc]&&n(i,a.extensions[Mc])}})}var xb=class{constructor(e){this.parser=e,this.name=Mc}async afterRoot({scene:e,parser:t}){let n=t.json.extensionsUsed;if(!n||!n.includes(Mc))return;let i=t.json.textures?.length||0,r=Array(i).fill(null);lb(e,t,(a,{featureIds:s})=>{s.forEach(c=>{if(c.texture&&r[c.texture.index]===null){let l=c.texture.index;r[l]=t.loadTexture(l)}})});let o=await Promise.all(r);lb(e,t,(a,s)=>{a.userData.meshFeatures=new bb(a.geometry,o,s)})}},yb=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])}}},op=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 mM(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 yb),this.metadata&&(t.register(()=>new fb),t.register(()=>new xb)),this.plugins.forEach(n=>t.register(n)),e.manager.addHandler(this._gltfRegex,t),this.tiles=e,this._loader=t}dispose(){this.tiles.manager.removeHandler(this._gltfRegex),this.tiles.manager.removeHandler(this._dracoRegex),this.autoDispose&&(this.ktxLoader.dispose(),this.dracoLoader.dispose())}};var{clamp:pO}=tp;var hO=new db(new lM),LM=new nM(new Uint8Array([255,255,255,255]),1,1);LM.needsUpdate=!0;var BM=0,OM=1,DM=2,NM=3,IM=4,zM=5,jM=6,VM=7,FM=8,UM=9,GM=10,HM=11,mO=Object.freeze({NONE:BM,SCREEN_ERROR:OM,GEOMETRIC_ERROR:DM,DISTANCE:NM,DEPTH:IM,RELATIVE_DEPTH:zM,IS_LEAF:jM,RANDOM_COLOR:VM,RANDOM_NODE_COLOR:FM,CUSTOM_COLOR:UM,LOAD_ORDER:GM,INDEXED_COLOR:HM});var gO=Math.PI/4,fO=3/5;var fi={NONE:0,NOT_READY:1,NO_FIT:2,DEPTH:3,OCCUPANCY:4,SPACING:5,ANGLE:6,FACING:7};var bO=new class{constructor(){this._cache={}}getColor(...e){let t=e.pop(),n=e.join("_"),{_cache:i}=this;return n in i||(t.setHSL(Math.random(),1,.5),i[n]=t.getHex()),t.set(i[n])}};var xO={[fi.NONE]:16777215,[fi.NOT_READY]:7829367,[fi.NO_FIT]:2250239,[fi.DEPTH]:4473924,[fi.OCCUPANCY]:65535,[fi.SPACING]:16776960,[fi.ANGLE]:16711680,[fi.FACING]:16711935};var yO=Math.PI/180;var vO=to*Math.PI*2;var wO=to*Math.PI*2;import{DRACOLoader as KM}from"three/examples/jsm/loaders/DRACOLoader.js";import{KTX2Loader as JM}from"three/examples/jsm/loaders/KTX2Loader.js";import{MeshoptDecoder as QM}from"three/examples/jsm/libs/meshopt_decoder.module.js";import{Box3 as ZM,DoubleSide as eT,MathUtils as tT,Matrix4 as Sb,Sphere as nT,Vector3 as rT}from"three";import{BufferAttribute as vb,MathUtils as WM}from"three";function wb(e){return!!e&&!e.isInterleavedBufferAttribute}function Cb(e,t,n,i){for(let r=0;r<e.count;r+=1)for(let o=0;o<e.itemSize;o+=1)t.setComponent(r,o,WM.clamp(e.getComponent(r,o),n,i));return t}function $M(e){for(let t=0;t<e.count;t+=1)for(let n=0;n<e.itemSize;n+=1){let i=e.getComponent(t,n);if(!Number.isFinite(i)||i<0||i>1)return!1}return!0}var Pc=class{constructor(){this.name="RI_VERTEX_COMPRESSION_PLUGIN";this.priority=-99}processTileModel(t){t.traverse(n=>{let i=n.geometry;if(!i)return;let r=i.attributes.normal;wb(r)&&!(r.array instanceof Int16Array)&&(i.attributes.normal=Cb(r,new vb(new Int16Array(r.count*r.itemSize),r.itemSize,!0),-1,1));for(let o of["uv","uv1","uv2","uv3"]){let a=i.attributes[o];!wb(a)||a.array instanceof Uint16Array||!$M(a)||(i.attributes[o]=Cb(a,new vb(new Uint16Array(a.count*a.itemSize),a.itemSize,!0),0,1))}})}};import{jsx as Tb,jsxs as cT}from"react/jsx-runtime";var iT=0,Mb=4,oT=6,aT=12,sT=4;function lT(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 sp({url:e,rotation:t=[0,0,0],errorTarget:n=64,cacheSize:i=800,memoryBudgetMB:r=800,decoderConfig:o,objectBindings:a,itemMaterials:s,sceneConfig:c,selectedItem:l,panelHoveredItem:u,highlightOnHover:d=!0,onItemClick:h,onItemHover:g,onObjectCatalog:f,onTilesetBounds:y,onModelLoaded:k,onLoadError:v,nodeRefsOut:p,onNodeRefsChange:m,materialRefsOut:M,explodeFactor:C=0,suspendBindingTransforms:P=!1}){let{camera:A,gl:b,invalidate:w}=YM(),T=Cn(null),[S,N]=ap(null),R=Cn({onItemClick:h,onItemHover:g,onObjectCatalog:f,onTilesetBounds:y,onModelLoaded:k,onLoadError:v,onNodeRefsChange:m});R.current={onItemClick:h,onItemHover:g,onObjectCatalog:f,onTilesetBounds:y,onModelLoaded:k,onLoadError:v,onNodeRefsChange:m};let z=Cn(!0),[E,j]=ap(null),I=Cn(null);I.current=E;let L=Cn([]),B=Cn(!1);xi(()=>{let $=new tc;return j($),()=>$.dispose()},[e]);let G=Cn(null),H=Cn(0),ae=Cn(!1),be=r*1024*1024,pe=Cn(!1),xe=Cn(Cu),Te=Cn(null),ye=Cn(null),St=Cn(null);xi(()=>()=>{St.current!==null&&clearTimeout(St.current)},[]);let st=o?.dracoDecoderPath??cu,De=o?.ktx2TranscoderPath??du,ve=o?.meshopt??!0,[Y,ft]=ap(null);xi(()=>{ae.current=!1,pe.current=!1;let $=new Ju(e);$.loadAncestors=!0;let ge=new sc;ge.priorityCallback=$.downloadQueue.priorityCallback,ge.maxJobsPerOrigin=aT;let ie=new Or;ie.priorityCallback=$.parseQueue.priorityCallback,ie.maxJobs=oT;let we=new Or;we.priorityCallback=$.processNodeQueue.priorityCallback,we.maxJobs=$.processNodeQueue.maxJobs;let Pe=new bs;Pe.unloadPriorityCallback=$.lruCache.unloadPriorityCallback,$.downloadQueue=ge,$.parseQueue=ie,$.processNodeQueue=we,$.lruCache=Pe;let ke=st?new KM().setDecoderPath(st).setWorkerLimit(sT):null,Le=De?new JM().setTranscoderPath(De).detectSupport(b):null;return $.registerPlugin(new op({dracoLoader:ke,ktxLoader:Le,meshoptDecoder:ve?QM:null,autoDispose:!1})),$.registerPlugin(new np({disableMipmaps:!0,compressIndex:!0,compressNormals:!1,compressUvs:!1,compressPosition:!0})),$.registerPlugin(new Pc),ft($),window.__riTiles=$,()=>{$.forEachLoadedModel(de=>Gi(de)),$.dispose(),ke?.dispose(),Le?.dispose(),ft(de=>de===$?null:de)}},[st,b,De,ve,e]),xi(()=>{Y&&(xe.current=Cu,Te.current=null,Y.errorTarget=n,Y.lruCache.maxSize=i,Y.lruCache.minSize=Math.max(1,Math.floor(i*.75)),Y.lruCache.maxBytesSize=be,Y.lruCache.minBytesSize=be*.75,w())},[i,n,w,be,Y]);let ze=XM(()=>{let $=a??{};return{objectBindings:$,keyByModelObject:Kg($),itemMaterials:s,shadingMode:c?.model.shading??"lit",rendererMode:c?.model.renderer??"pbr",selectedKey:l??null,hoveredKey:Jg(S,u),highlightOnHover:d,suspendTransforms:P,placementFrame:Y?.group.matrixWorld,invalidate:w}},[S,d,w,s,a,u,c,l,P,Y]),lt=io(()=>{if(!Y)return;let $=Bt.current,ge=B.current?I.current?.nodesByBinding($)??{}:{},ie={};Y.group.traverse(Le=>{if(!Le.isMesh)return;let de=vu(Le);if(!de)return;let it=$.keyByModelObject[de]??de;if(!$.objectBindings[it])return;ge[it]||(ge[it]=Le);let Ze=Le.material;Ze&&(ie[it]=Ze)});let we=p?.current??{},Pe=Object.keys(we),ke=Pe.length!==Object.keys(ge).length||Pe.some(Le=>we[Le]!==ge[Le]);p&&(p.current=ge),M&&(M.current=ie),(ke||!p)&&R.current.onNodeRefsChange?.()},[M,p,Y]),nt=io($=>Zl($,ze),[ze]),Ee=io($=>Zg($,ze),[ze]),rt=Cn(Ee);rt.current=Ee;let Bt=Cn(ze);Bt.current=ze;let he=io(()=>{let $=G.current,ge=H.current;return!$||ge<=0?Bt.current:{...Bt.current,explode:{factor:ge,centre:$.centre,radius:$.radius}}},[]);xi(()=>{Y&&(Ee(Y.group),z.current=!0,Y.forEachLoadedModel($=>{Ee($),ea($,he())}),w())},[Ee,w,he,Y]),xi(()=>{let $=lT(e);if(!$)return;let ge=!1;return fetch($).then(ie=>ie.ok?ie.json():null).then(ie=>{ge||!ie?.objects||(L.current=ie.objects,B.current=ie.bindingFrame==="gltf-identity-v2",B.current&&I.current?.setCatalog(ie.objects),z.current=!0,R.current.onObjectCatalog?.(ie.objects),w())}).catch(()=>{}),()=>{ge=!0}},[e,w,E]),xi(()=>{if(!Y)return;let $=!1,ge=()=>w(),ie=de=>{de.scene&&(de.scene.traverse(it=>{let Ze=it.material;for(let It of Array.isArray(Ze)?Ze:Ze?[Ze]:[])It.transparent&&It.side===eT&&(It.forceSinglePass=!0)}),rt.current(de.scene),ea(de.scene,he()),Vo(de.scene)),z.current=!0,$||($=!0,R.current.onModelLoaded?.(Y.group)),w()},we=de=>{R.current.onLoadError?.(de.error)},Pe=de=>{de.scene&&(wu(de.scene),Gi(de.scene)),z.current=!0};Y.setCamera(A),Y.setResolutionFromRenderer(A,b),Y.addEventListener("needs-update",ge),Y.addEventListener("load-model",ie),Y.addEventListener("load-error",we),Y.addEventListener("dispose-model",Pe);let ke=()=>{z.current=!0,w()};Y.addEventListener("tile-visibility-change",ke);let Le=()=>{let de=Y.root;de&&!de.content?.uri&&de.refine==="REPLACE"&&(de.refine="ADD",w())};return Y.addEventListener("load-root-tileset",Le),w(),()=>{Y.removeEventListener("needs-update",ge),Y.removeEventListener("load-model",ie),Y.removeEventListener("load-error",we),Y.removeEventListener("dispose-model",Pe),Y.removeEventListener("tile-visibility-change",ke),Y.removeEventListener("load-root-tileset",Le),wu(Y.group),Y.deleteCamera(A),p&&(p.current={}),M&&(M.current={})}},[A,b,w,M,p,he,Y]);let Nt=io($=>{let ge=nt($.object);ge&&($.stopPropagation(),R.current.onItemClick?.(ge.binding))},[nt,h]),_t=io($=>{let ge=nt($.object),ie=ge?.key??null;ie!==T.current&&(T.current=ie,N(ie),R.current.onItemHover?.(ge?.binding??null))},[nt]),Se=io(()=>{T.current!==null&&(T.current=null,N(null),R.current.onItemHover?.(null))},[]);return xi(()=>{w()},[w,Y]),qM(($,ge)=>{if(!Y)return;if(Y.setResolutionFromRenderer(A,b),B.current&&E){let zt=E.sync(he(),l,P);E.updateBounds(Y.root),P&&Y.forEachLoadedModel(V=>ea(V,zt))}if(Y.update(),!ae.current){let zt=new ZM;if(Y.getBoundingBox(zt)){ae.current=!0,Y.group.updateMatrixWorld(),zt.applyMatrix4(Y.group.matrixWorld);let V=zt.getBoundingSphere(new nT);G.current={centre:V.center.clone(),radius:zt.getSize(new rT).length()*.5},R.current.onTilesetBounds?.(zt),w()}}z.current&&(z.current=!1,lt());let ie=Math.min(Math.max(C,0),1),we=H.current;Math.abs(we-ie)>1e-4?(H.current=tT.lerp(we,ie,1-Math.exp(-6*ge)),ea(Y.group,he()),w()):we!==ie&&(H.current=ie,ea(Y.group,he()),w());let Pe=Y,ke=Y.lruCache,Le=ke.isFull(),de=xe.current,it=de.loosened&&Te.current?Te.current:{bytes:ke.maxBytesSize,items:ke.maxSize},Ze=0;for(let zt of ke.usedSet??[])Ze+=ke.bytesMap?.get(zt)??0;let It=!1,Ot=Y;for(let zt of Ot.usedSet??[]){let V=zt.internal?.loadingState??Mb;if(zt.traversal?.used&&zt.internal?.hasContent&&V>=iT&&V<Mb){It=!0;break}}let je=ye.current??(ye.current={world:new Sb,projection:new Sb}),Ie=!je.world.equals(A.matrixWorld)||!je.projection.equals(A.projectionMatrix);Ie&&(je.world.copy(A.matrixWorld),je.projection.copy(A.projectionMatrix));let mn={full:Le,wanting:It,moved:Ie,usage:Math.max(Ze/Math.max(1,it.bytes),(ke.usedSet?.size??0)/Math.max(1,it.items)),now:performance.now()},bt=pf(de,mn);bt!==de&&(bt.loosened&&(!de.loosened||bt.raisedAt!==de.raisedAt)?(de.loosened||(Te.current=it),ke.maxBytesSize=Math.max(it.bytes,ke.cachedBytes??0)*Su,ke.maxSize=Math.ceil(Math.max(it.items,ke.itemSet?.size??0)*Su)):!bt.loosened&&de.loosened&&Te.current&&(ke.maxBytesSize=Te.current.bytes,ke.maxSize=Te.current.items,Te.current=null),xe.current=bt,Y.errorTarget=n*bt.factor,w()),!pe.current&&Le&&mn.wanting&&bt.factor>=hs&&(pe.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 xn=hf(bt,mn);xn===0?w():xn!==null&&St.current===null&&(St.current=setTimeout(()=>{St.current=null,w()},xn)),((Pe.stats?.downloading??0)>0||(Pe.stats?.parsing??0)>0||Pe.loadProgress!==void 0&&Pe.loadProgress<1&&!Le)&&w()}),Y?cT("group",{rotation:t,children:[E?Tb("primitive",{object:E.group}):null,Tb("primitive",{object:Y.group,onClick:Nt,onPointerMove:_t,onPointerOut:Se})]}):null}import{useMemo as ao,useRef as yi,useState as sa,useEffect as oo,useCallback as aa}from"react";import{Html as Pb}from"@react-three/drei";import{useFrame as kb,useThree as cp}from"@react-three/fiber";import{MathUtils as lp,Vector3 as Bs}from"three";import{jsx as wr,jsxs as dp}from"react/jsx-runtime";var dT=.02;function _b(e,t){let n=yi(null),i=cp(l=>l.scene),r=yi(null),o=ao(()=>new Bs(...e.anchorLocalPosition??e.localPosition??e.worldPosition),[e.anchorLocalPosition,e.localPosition,e.worldPosition]),a=ao(()=>new Bs,[]),s=ao(()=>new Bs,[]),c=ao(()=>new Bs,[]);return oo(()=>{r.current=null},[e.anchorNodeName]),kb(({camera:l})=>{let u=n.current,d=u?.parent;if(!u||!d)return;let h=r.current;if(e.anchorNodeName&&(!h||!h.parent)&&(h=xr(i,e.anchorNodeName),r.current=h),h?(h.updateWorldMatrix(!0,!1),a.copy(o).applyMatrix4(h.matrixWorld)):(a.copy(o),d.localToWorld(a)),t){let g=t.current.get(e.id);g||(g=new Bs,t.current.set(e.id,g)),g.copy(a)}c.copy(l.position).sub(a),c.lengthSq()>0?(c.normalize(),s.copy(a).addScaledVector(c,dT)):s.copy(a),d.worldToLocal(s),u.position.copy(s)}),n}function uT({annotation:e,occluders:t,worldPositionsRef:n,onClick:i,onHover:r,showAnnotationOnHover:o}){let[a,s]=sa(!1),c=_b(e,n),[l,u]=sa(!1),[d,h]=sa(1),g=yi(null),f=yi(null),y=yi(null);oo(()=>()=>{g.current&&(clearTimeout(g.current),g.current=null),y.current&&(clearTimeout(y.current),y.current=null)},[]);let k=C=>{C.stopPropagation(),C.preventDefault(),g.current&&(clearTimeout(g.current),g.current=null),g.current=window.setTimeout(()=>{i?.(e),g.current=null},10)},v=C=>{C.stopPropagation(),u(!0),h(100),y.current&&(clearTimeout(y.current),y.current=null),r?.(e),o&&i?.(e)},p=C=>{C.stopPropagation(),u(!1),h(1),y.current&&clearTimeout(y.current),y.current=window.setTimeout(()=>{r?.(null),o&&r?.(null),y.current=null},50)},m=C=>{C.stopPropagation();let P=C.currentTarget;P.dataset.pointerX=String(C.clientX),P.dataset.pointerY=String(C.clientY)},M=C=>{C.stopPropagation();let P=C.currentTarget,A=parseFloat(P.dataset.pointerX||"0"),b=parseFloat(P.dataset.pointerY||"0"),w=C.clientX-A,T=C.clientY-b;Math.sqrt(w*w+T*T)<10&&k(C)};return wr("group",{ref:c,children:wr(Pb,{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:wr("div",{ref:f,className:`ri-annotationMarker ${l?"ri-annotationMarker--hovered":""}`,title:e.title,style:{display:a?"none":"flex"},onPointerDown:m,onPointerUp:M,onPointerEnter:v,onPointerLeave:p,onDoubleClick:C=>{C.stopPropagation(),i?.(e)},role:"button",tabIndex:0,"aria-label":`Annotation ${e.id}`,children:wr("span",{className:"ri-annotationMarker-id",children:e.id})})})})}function pT({annotation:e,occluders:t,popupRef:n,onClose:i,hideCloseButton:r=!1}){let[o,a]=sa(!1),s=_b(e),c=dp("div",{ref:n,className:"ri-viewAnnotationPopup",style:{display:o?"none":"block"},onPointerDown:l=>l.stopPropagation(),onClick:l=>l.stopPropagation(),children:[dp("div",{className:"ri-viewAnnotationHeader",children:[wr("h4",{className:"ri-viewAnnotationTitle",children:e.title}),!r&&wr("button",{onClick:l=>{l.stopPropagation(),i?.()},className:"ri-viewAnnotationClose","aria-label":"Close annotation",children:"\xD7"})]}),e.description&&wr("p",{className:"ri-viewAnnotationDescription",children:e.description})]});return wr("group",{ref:s,children:wr(Pb,{occlude:t,onOcclude:a,pointerEvents:o?"none":"auto",zIndexRange:[1e3,2e3],style:{pointerEvents:o?"none":"auto",zIndex:1e3},transparent:!0,children:c})})}function up({annotations:e,sceneConfig:t,activeAnnotation:n,popupRef:i,canvasRootRef:r,worldPositionsRef:o,modelLoaded:a,onAnnotationClick:s,onAnnotationHover:c,onCloseAnnotation:l,hideCloseButton:u=!1,showAnnotationOnHover:d=!1}){let h=cp(E=>E.invalidate),g=cp(E=>E.scene),[f,y]=sa(null),[k,v]=sa(!1),p=yi(null),m=yi(null),M=yi(null),C=ao(()=>{let E=[];return g.traverse(j=>{let I=j;I.isMesh&&!I.isSkinnedMesh&&E.push({current:j})}),E},[g,e,a]),P=aa(()=>{h();let E=()=>{h(),m.current=window.requestAnimationFrame(()=>{h(),m.current=null})};m.current=window.requestAnimationFrame(E)},[h]);oo(()=>{P()},[e,P]),oo(()=>{P()},[n,P]),oo(()=>()=>{m.current!==null&&window.cancelAnimationFrame(m.current),M.current&&clearTimeout(M.current)},[]);let A=k?f:n||f,b=ao(()=>A?e.find(E=>E.id===A.id)??A:null,[A,e]),w=aa(E=>{if(k&&f?.id===E.id){v(!1),y(null),l?.();return}v(!0),y(E),s?.(E)},[k,f,s,l]),T=aa(E=>{c?.(E),d&&!k&&(M.current&&(clearTimeout(M.current),M.current=null),E?y(E):M.current=window.setTimeout(()=>{y(null),l?.(),M.current=null},100))},[k,c,d,l]),S=aa(()=>{v(!1),y(null),l?.()},[l]),N=aa(E=>{let j=E.target;if(j.closest?.(".ri-annotationMarker")||j.closest?.(".ri-viewAnnotationPopup")||j.closest?.(".annotation-html-wrapper"))return;let I=r.current;I&&I.contains(j)&&(v(!1),y(null),l?.())},[r,l]),R=aa(E=>{E.key==="Escape"&&k&&(v(!1),y(null),l?.())},[k,l]);oo(()=>{let E=r.current;return E&&(E.addEventListener("click",N),E.addEventListener("pointerdown",N)),document.addEventListener("keydown",R),()=>{E&&(E.removeEventListener("click",N),E.removeEventListener("pointerdown",N)),document.removeEventListener("keydown",R)}},[r,N,R]);let z=ao(()=>(t?.model.rotation??[0,0,0]).map(E=>E*Math.PI/180),[t?.model.rotation]);return oo(()=>{h()},[h,z]),kb((E,j)=>{if(!p.current)return;p.current.rotation.x=lp.lerp(p.current.rotation.x,z[0],1-Math.exp(-5*j)),p.current.rotation.y=lp.lerp(p.current.rotation.y,z[1],1-Math.exp(-5*j)),p.current.rotation.z=lp.lerp(p.current.rotation.z,z[2],1-Math.exp(-5*j));let{rotation:I}=p.current;Math.abs(I.x-z[0])+Math.abs(I.y-z[1])+Math.abs(I.z-z[2])>1e-4&&h()}),dp("group",{ref:p,children:[e.map(E=>{let j=`${E.worldPosition.join(",")}-${E.title}-${E.id}`;return wr(uT,{annotation:E,occluders:C,worldPositionsRef:o,onClick:w,onHover:T,showAnnotationOnHover:d},j)}),b?wr(pT,{annotation:b,occluders:C,popupRef:i,onClose:S,hideCloseButton:u},`popup-${b.id}`):null]})}import{useEffect as hT,useMemo as Ab}from"react";import{Html as Rb,Line as mT}from"@react-three/drei";import{BoxGeometry as gT,EdgesGeometry as fT,Vector3 as Eb}from"three";import{jsx as ni,jsxs as la}from"react/jsx-runtime";var bT="#22d3ee",xT="#facc15";function kc(e,t){let n=e<10?e.toFixed(3):e.toFixed(2);return t?`${n} ${t}`:n}function yT(e,t){return[(e[0]+t[0])/2,(e[1]+t[1])/2,(e[2]+t[2])/2]}function _c({position:e,children:t}){return ni(Rb,{center:!0,position:e,zIndexRange:[20,0],children:ni("div",{className:"ri-measureLabel",children:t})})}function vT({box:e,unit:t}){let n=Ab(()=>[(e.min[0]+e.max[0])/2,(e.min[1]+e.max[1])/2,(e.min[2]+e.max[2])/2],[e.min,e.max]),i=Ab(()=>{let[s,c,l]=e.size;return new fT(new gT(s||1e-4,c||1e-4,l||1e-4))},[e.size]);hT(()=>()=>{i.dispose()},[i]);let[r,o,a]=e.size;return la("group",{position:n,children:[ni("lineSegments",{geometry:i,children:ni("lineBasicMaterial",{color:xT})}),la(_c,{position:[0,-o/2,a/2],children:["W ",kc(r,t)]}),la(_c,{position:[-r/2,0,a/2],children:["H ",kc(o,t)]}),la(_c,{position:[r/2,-o/2,0],children:["D ",kc(a,t)]})]})}function pp({points:e,unit:t,box:n,showDimensions:i}){return la("group",{children:[e.map(r=>ni(Rb,{center:!0,position:r.position,zIndexRange:[15,0],children:ni("div",{className:"ri-measureDot"})},r.id)),e.slice(1).map((r,o)=>{let a=e[o].position,s=r.position,c=new Eb(...a).distanceTo(new Eb(...s));return la("group",{children:[ni(mT,{points:[a,s],color:bT,lineWidth:2}),ni(_c,{position:yT(a,s),children:kc(c,t)})]},`${e[o].id}-${r.id}`)}),i&&n?ni(vT,{box:n,unit:t}):null]})}import{forwardRef as wT,useCallback as Os,useEffect as Lb,useImperativeHandle as CT,useMemo as Bb,useRef as Sn}from"react";import{useXR as Ob,useXRHitTest as ST,useXRInputSourceEvent as MT}from"@react-three/xr";import{useFrame as TT}from"@react-three/fiber";import{Matrix4 as PT,Vector3 as Db}from"three";import{Fragment as LT,jsx as Ds,jsxs as jb}from"react/jsx-runtime";var kT=1,Nb=1,_T=.1,AT=10;function ET(e,t){let[n,i,r]=e.size,o=(e.min[0]+e.max[0])/2,a=(e.min[2]+e.max[2])/2,s=Math.max(n,i,r)||1;return{scale:t==="real-world"?1:kT/s,offset:[-o,-e.min[1],-a]}}function Ib(e){let t=e[0].clientX-e[1].clientX,n=e[0].clientY-e[1].clientY;return Math.hypot(t,n)}function zb(e){let t=e[0].clientX-e[1].clientX,n=e[0].clientY-e[1].clientY;return Math.atan2(n,t)}var RT=wT(function({box:t,scaleMode:n,children:i,onARStateChange:r},o){let a=Sn(null),s=Sn(null),c=Sn(null),l=Ob(j=>j.session!=null),u=Ob(j=>j.mode==="immersive-ar"),d=Bb(()=>t?ET(t,n):null,[t,n]),h=Sn(new Db(0,0,-Nb)),g=Sn(1),f=Sn(0),y=Sn(!0),k=Sn(!1),v=Bb(()=>new PT,[]),p=Sn(new Db),m=Sn(!1),M=Sn(null),C=Sn(!1),P=Sn(0),A=Sn(0),b=Sn(1),w=Sn(0),T=Os(()=>{if(!r||!u)return;let j={canPlace:m.current,isPlacementMode:y.current,isModelPlaced:k.current},I=M.current;I&&I.canPlace===j.canPlace&&I.isPlacementMode===j.isPlacementMode&&I.isModelPlaced===j.isModelPlaced||(M.current=j,r(j))},[u,r]),S=Os(()=>!u||!m.current?!1:(h.current.copy(p.current),k.current=!0,y.current=!1,T(),!0),[T,u]),N=Os(()=>{u&&(y.current=!0,T())},[T,u]),R=Os(()=>{let j=S();return!j&&u&&(y.current=!1,T()),j},[T,u,S]),z=Os(()=>{u&&(y.current=!1,T())},[T,u]);CT(o,()=>({placeCurrent:S,startPlacementMode:N,finishPlacementMode:R,cancelPlacementMode:z}),[z,R,S,N]),Lb(()=>{if(!l){h.current.set(0,0,-Nb),g.current=1,f.current=0,m.current=!1,C.current=!1,y.current=!0,k.current=!1,M.current=null;return}u&&(m.current=!1,C.current=!1,y.current=!0,k.current=!1,M.current=null,T())},[T,l,u]),ST((j,I)=>{if(!u||j.length===0){m.current&&(m.current=!1,T());return}I(v,j[0])&&(p.current.setFromMatrixPosition(v),m.current||(m.current=!0,T()))},"viewer"),MT("all","select",()=>{!u||C.current||!y.current||S()},[u,S]),Lb(()=>{if(!u)return;let j=B=>{B.touches.length===2&&(C.current=!0,P.current=Ib(B.touches),A.current=zb(B.touches),b.current=g.current,w.current=f.current)},I=B=>{if(!C.current||B.touches.length!==2)return;B.preventDefault();let G=Ib(B.touches);if(P.current>0){let ae=G/P.current;g.current=Math.min(AT,Math.max(_T,b.current*ae))}let H=zb(B.touches);f.current=w.current-(H-A.current)},L=B=>{B.touches.length===0&&requestAnimationFrame(()=>{C.current=!1})};return window.addEventListener("touchstart",j),window.addEventListener("touchmove",I,{passive:!1}),window.addEventListener("touchend",L),window.addEventListener("touchcancel",L),()=>{window.removeEventListener("touchstart",j),window.removeEventListener("touchmove",I),window.removeEventListener("touchend",L),window.removeEventListener("touchcancel",L)}},[u]),TT(()=>{let j=a.current,I=s.current;if(!j||!I)return;!l||!d?(j.visible=!0,j.position.set(0,0,0),j.rotation.set(0,0,0),I.scale.setScalar(1)):(j.visible=!u||k.current,j.position.copy(h.current),j.rotation.set(0,f.current,0),I.scale.setScalar(d.scale*g.current));let L=c.current;if(L){let B=u&&y.current&&m.current;L.visible=B,B&&L.position.copy(p.current)}});let E=l&&d?d.offset:[0,0,0];return jb(LT,{children:[jb("mesh",{ref:c,visible:!1,rotation:[-Math.PI/2,0,0],children:[Ds("ringGeometry",{args:[.05,.07,32]}),Ds("meshBasicMaterial",{color:"#22d3ee",transparent:!0,opacity:.95})]}),Ds("group",{ref:a,children:Ds("group",{ref:s,children:Ds("group",{position:E,children:i})})})]})}),Vb=RT;import{useEffect as Ac,useMemo as Nr,useRef as vi}from"react";import{useFrame as BT,useThree as OT}from"@react-three/fiber";import{Box3 as DT,CatmullRomCurve3 as Fb,Sphere as NT,Spherical as IT,Vector3 as wi}from"three";var zT=1.2;function hp({controlsRef:e,sceneRef:t,config:n,playing:i,resetOnPlay:r=!1,onFinished:o,onUserInteract:a,onStop:s}){let c=OT(z=>z.invalidate),l=Nr(()=>n.waypoints??[],[n.waypoints]),u=l.length>=2,d=n.loop??!0,h=Nr(()=>{if(l.length<2)return 24;let z=0;for(let E=0;E<l.length-1;E++)z+=l[E].segmentDuration??3.5;return d&&l.length>1&&(z+=l[l.length-1].segmentDuration??3.5),Math.max(z,4)},[l,d]),g=n.duration??h,f=Nr(()=>l.map(z=>[...z.position,...z.target,z.azimuthAngle??"",z.polarAngle??"",z.segmentDuration??""].join(",")).join(";"),[l]),y=Nr(()=>{let z=[];if(l.length<2)return z;let E=0;for(let j=0;j<l.length-1;j++)E+=l[j].segmentDuration??3.5,z.push(E);return d&&l.length>1&&(E+=l[l.length-1].segmentDuration??3.5,z.push(E)),z},[l,d]),k=Nr(()=>z=>{if(l.length<2||y.length===0)return z/g;let E=y[y.length-1],j=d?z%g:Math.min(z,g),I=g>0?j/g*E:0;for(let L=0;L<y.length;L++)if(I<=y[L]){let B=L===0?0:y[L-1],G=y[L]-B,H=G>0?(I-B)/G:0,ae=d?l.length:l.length-1,be=L/ae,pe=1/ae;return be+H*pe}return 1},[l.length,y,g,d]),v=Nr(()=>u?{position:new Fb(l.map(z=>new wi(...z.position)),d,"catmullrom",.5),target:new Fb(l.map(z=>new wi(...z.target)),d,"catmullrom",.5)}:null,[f,u,d]),p=Nr(()=>{if(!u||!l.every(E=>Number.isFinite(E.azimuthAngle)&&Number.isFinite(E.polarAngle)))return null;let z=l.map(E=>({azimuth:E.azimuthAngle,polar:E.polarAngle,distance:new wi(...E.position).distanceTo(new wi(...E.target))}));for(let E=1;E<z.length;E+=1){let j=z[E-1].azimuth,I=z[E].azimuth;z[E].azimuth=I+Math.round((j-I)/(Math.PI*2))*Math.PI*2}return z},[f,u]),m=vi(0),M=vi(0),C=vi(new wi),P=vi(new wi),A=vi(!1),b=vi(0),w=vi(!1),T=vi(null),S=Nr(()=>new wi,[]),N=Nr(()=>new wi,[]),R=Nr(()=>new IT,[]);return Ac(()=>{m.current=0,b.current=0,M.current=0,w.current=!1},[f,d,g]),Ac(()=>{r&&(b.current=0,m.current=0,w.current=!1)},[r]),Ac(()=>{if(!i){A.current=!1,m.current>0&&!r?b.current=m.current:r&&(b.current=0),(m.current>0||w.current)&&s?.();return}m.current>=g&&!d&&(m.current=0,b.current=0,w.current=!1);let z=e.current;if(z&&(z.getPosition(C.current),z.getTarget(P.current)),r||w.current||b.current===0?(m.current=0,b.current=0,w.current=!1):b.current>0&&b.current<g?m.current=b.current:(m.current=0,b.current=0),M.current=0,!u){let E=t.current;if(E){let j=new DT().setFromObject(E).getBoundingSphere(new NT);T.current={center:j.center.clone(),radius:j.radius>0?j.radius:1}}}A.current=!0,c()},[i,u,e,t,c,g,d,f,r,s]),Ac(()=>{if(!i||!a)return;let z=e.current;if(!z)return;let E=()=>{w.current||a()};return z.addEventListener("controlstart",E),()=>z.removeEventListener("controlstart",E)},[i,e,a]),BT((z,E)=>{if(!i||!A.current)return;let j=e.current;if(!j)return;m.current+=E,M.current+=E;let I=k(m.current),L=!d&&m.current>=g;if(I=d?I%1:Math.min(I,1),v)if(v.target.getPoint(I,N),p){let G=d?p.length:p.length-1,H=Math.min(I,1)*G,ae=Math.min(Math.floor(H),G-1),be=(ae+1)%p.length,pe=I>=1?1:H-ae,xe=pe*pe*(3-2*pe),Te=p[ae],ye=p[be],St=ye.azimuth+Math.round((Te.azimuth-ye.azimuth)/(Math.PI*2))*Math.PI*2,st=Te.azimuth+(St-Te.azimuth)*xe,De=Te.polar+(ye.polar-Te.polar)*xe,ve=Te.distance+(ye.distance-Te.distance)*xe;R.set(Math.max(ve,1e-6),Math.min(Math.max(De,1e-6),Math.PI-1e-6),st),S.setFromSpherical(R).add(N)}else v.position.getPoint(I,S);else{let G=T.current;if(!G)return;let H=I*Math.PI*2,ae=G.radius*2.2;S.set(G.center.x+Math.cos(H)*ae,G.center.y+G.radius*.6,G.center.z+Math.sin(H)*ae),N.copy(G.center)}let B=Math.min(M.current/zT,1);if(B<1){let G=B*B*(3-2*B);S.lerpVectors(C.current,S,G),N.lerpVectors(P.current,N,G)}if(j.setLookAt(S.x,S.y,S.z,N.x,N.y,N.z,!1),L){A.current=!1,w.current=!0,m.current=0,b.current=0,o?.();return}c()}),null}import{useEffect as GT,useState as HT}from"react";var jT="ri:license-grant:v1",VT={"260cd89ea13f":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwjr3ofKTkkcxOM0GYl/RlJj9JsuyjSF8sYmCd2YqsHJCEO8EvlNDrO2Kl4agFKo6dRhyR2/oWeiU6P9WIqRbvw=="},Ub=new Map;function Hb(e){let t=atob(e);return Uint8Array.from(t,n=>n.charCodeAt(0)).buffer}function Gb(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");return Hb(t.padEnd(Math.ceil(t.length/4)*4,"="))}function FT(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 Ec(e){let t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e.trim())),n=String.fromCharCode(...new Uint8Array(t));return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function mp(e,t){return`${jT}:${t}:${e}`}function UT(e,t){let n=Ub.get(e);if(n)return n;let i=crypto.subtle.importKey("spki",Hb(t),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]);return Ub.set(e,i),i}async function gp(e,t,n){if(!globalThis.crypto?.subtle)return null;try{let[i,r,o,a,...s]=e.split("."),c=VT[r];if(i!=="ri1"||!c||!o||!a||s.length>0)return null;let l=JSON.parse(new TextDecoder().decode(Gb(o)));if(!FT(l)||!await crypto.subtle.verify({name:"ECDSA",hash:"SHA-256"},await UT(r,c),Gb(a),new TextEncoder().encode(`${i}.${r}.${o}`)))return null;let d=Math.floor(Date.now()/1e3),h=l.expiresAt-l.issuedAt;return l.licenseKeyHash!==t||l.domain!==n||l.expiresAt<=d||l.issuedAt>d+300||h<=0||h>43200?null:{environment:l.environment,tier:l.tier,expiresAt:l.expiresAt}}catch{return null}}async function Wb(e,t,n){try{return await gp(e,await Ec(t),n)}catch{return null}}async function $b(e,t,n){try{let i=await Ec(t);return await gp(e,i,n)?(localStorage.setItem(mp(i,n),e),!0):!1}catch{return!1}}async function Xb(e,t){try{let n=await Ec(e),i=mp(n,t),r=localStorage.getItem(i);if(!r)return null;let o=await gp(r,n,t);return o||localStorage.removeItem(i),o}catch{return null}}async function fp(e,t){try{let n=await Ec(e);localStorage.removeItem(mp(n,t))}catch{}}var WT=["localhost","127.0.0.1","0.0.0.0"],$T=e=>WT.includes(e)||e.endsWith(".local")||e.endsWith(".localhost"),Yb="https://react-immersive.liveroom.dev/api/validate-license",XT=()=>typeof window<"u",qT=300*1e3,YT=5e3,KT=400,xp=new Map,bp=new Map,Ci=class extends Error{},Kb=async(e,t,n)=>{let i=await Xb(e,t);return i?(console.warn("[react-immersive] License server unreachable \u2014 using a previously verified, time-limited offline grant."),{status:"valid",reason:"Previously verified offline grant",environment:i.environment,tier:i.tier,isLocalDomain:n}):null},qb=async(e,t,n)=>{let i=await Kb(e,t,n);return i||(console.warn("[react-immersive] License server unreachable and no valid offline grant is available \u2014 license validation failed."),{status:"invalid",reason:"Could not reach license server",isLocalDomain:n})},JT=e=>e instanceof Ci||e instanceof TypeError,QT=()=>new Promise(e=>setTimeout(e,KT)),ZT=e=>e==="development"||e==="production",e2=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&&!ZT(t.environment)||t.tier!==void 0&&typeof t.tier!="string"||t.offlineGrant!==void 0&&typeof t.offlineGrant!="string")},t2=e=>{if(!e||typeof e!="object")return null;let t=e,n=t.reason??t.error;return typeof n=="string"&&n.trim()?n:null},n2=(e,t,n)=>`${n}::${e}::${t}`,r2=e=>{let t=xp.get(e);return t?Date.now()-t.timestamp>qT?(xp.delete(e),null):t.result:null},i2=(e,t)=>({status:e.valid?"valid":"invalid",reason:e.reason,environment:e.environment,tier:e.tier,isLocalDomain:t}),o2=(e,t)=>({status:"invalid",reason:e,isLocalDomain:t});async function a2(e,t,n,i){let r=n2(e,t,i),o=r2(r);if(o)return o;let a=bp.get(r);if(a)return a;let s=(async()=>{for(let c=0;c<2;c+=1)try{return await s2(e,t,n,r,i)}catch(l){if(!JT(l))throw l;if(c===0){let u=await Kb(e,t,n);if(u)return u;await QT();continue}return qb(e,t,n)}return qb(e,t,n)})().finally(()=>{bp.delete(r)});return bp.set(r,s),s}async function s2(e,t,n,i,r){let o=new AbortController,a=setTimeout(()=>o.abort(),YT),s;try{s=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},cache:"no-store",signal:o.signal,body:JSON.stringify({licenseKey:e,domain:t})})}catch(u){throw o.signal.aborted?new Ci("License validation timed out"):u}finally{clearTimeout(a)}let c;try{c=await s.json()}catch{throw new Ci(`License server returned a non-JSON response${s.status?` (${s.status})`:""}`)}if(!s.ok){if(s.status===429||s.status>=500)throw new Ci(`License server error (${s.status})`);let u=t2(c)??`License validation failed${s.status?` (${s.status})`:""}`;return await fp(e,t),o2(u,n)}if(!e2(c))throw new Ci("License server returned an unexpected payload");let l=i2(c,n);if(l.status==="valid"&&r!==Yb){let u=c.offlineGrant?await Wb(c.offlineGrant,e,t):null;if(!u)throw new Ci("License validation endpoint did not return a verifiable signed grant");l={...l,environment:u.environment,tier:u.tier}}return l.status==="valid"?(xp.set(i,{result:l,timestamp:Date.now()}),c.offlineGrant&&(await $b(c.offlineGrant,e,t)||console.warn("[react-immersive] The license server returned an invalid offline grant; it was not cached."))):await fp(e,t),l}var Rc=(e,t=Yb)=>{let[n,i]=HT({status:"checking",isLocalDomain:!1});return GT(()=>{if(!XT())return;let r=!1,o=u=>{r||i(u)},a=e.trim(),s=window.location.hostname.toLowerCase(),c=$T(s);return o({status:"checking",isLocalDomain:c}),a?((async()=>{try{o(await a2(a,s,c,t))}catch(u){let d=u instanceof TypeError?"Could not reach license server":u instanceof Error?u.message:"License validation failed";o({status:"invalid",reason:d,isLocalDomain:c})}})(),()=>{r=!0}):(o({status:"invalid",reason:"No license key provided",isLocalDomain:c}),()=>{r=!0})},[e,t]),n};import{useRef as so,useState as l2,useCallback as Ir,useEffect as c2}from"react";import{jsx as Gn,jsxs as yp}from"react/jsx-runtime";var d2={up:{width:38,height:22},down:{width:38,height:22},left:{width:22,height:38},right:{width:22,height:38}},u2={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"},Lc=({direction:e})=>{let t=d2[e],n=u2[e];return yp("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:[Gn("polyline",{points:n,stroke:"rgba(0, 0, 0, 0.9)",strokeWidth:"6",strokeLinecap:"round",strokeLinejoin:"round"}),Gn("polyline",{points:n,stroke:"#2095F2",strokeWidth:"4",strokeLinecap:"round",strokeLinejoin:"round"})]})},ri=16,p2={"bottom-left":{bottom:ri,left:ri,top:"auto",right:"auto",transform:"none"},"bottom-right":{bottom:ri,right:ri,top:"auto",left:"auto",transform:"none"},"top-left":{top:ri,left:ri,bottom:"auto",right:"auto",transform:"none"},"top-right":{top:ri,right:ri,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:ri,left:"50%",bottom:"auto",right:"auto",transform:"translateX(-50%)"}},h2=({controlsRef:e,enabled:t=!0,opacity:n=.9,moveSensitivity:i=.001,rotateSensitivity:r=.01,position:o="center-bottom"})=>{let a=so(null),[s,c]=l2({x:0,y:0}),l=so(!1),u=so({x:0,y:0}),d=so(),h=so(),g=so(null),f=so(0),y=()=>e.current,k=(R,z,E)=>{let j=Math.hypot(R,z);if(j>E){let I=E/j;return{x:R*I,y:z*I}}return{x:R,y:z}},v=R=>{let E=Math.abs(R);return E<.12?0:Math.sign(R)*((E-.12)/(1-.12))},p=Ir(()=>{let R=()=>{let{x:z,y:E}=u.current,j=v(z),I=v(E);if(t&&(j!==0||I!==0)){let L=y();L&&L.rotate(-j*r,-I*r,!0)}d.current=requestAnimationFrame(R)};d.current=requestAnimationFrame(R)},[t,r]),m=Ir(()=>{d.current&&cancelAnimationFrame(d.current)},[]),M=Ir((R,z)=>{if(!a.current||!l.current)return;let E=a.current.getBoundingClientRect(),j=E.left+E.width/2,I=E.top+E.height/2,L=E.width/2-18,B=R-j,G=z-I,H=k(B,G,L);c(H),u.current={x:H.x/L,y:H.y/L}},[]),C=Ir(R=>{if(!t)return;R.preventDefault(),R.stopPropagation(),l.current=!0,p();let z="touches"in R?R.touches[0]:R;M(z.clientX,z.clientY)},[t,p,M]),P=Ir(R=>{if(!l.current)return;R.preventDefault();let z="touches"in R?R.touches[0]:R;M(z.clientX,z.clientY)},[M]),A=Ir(()=>{l.current=!1,c({x:0,y:0}),u.current={x:0,y:0},m()},[m]),b=i*10,w=Ir(R=>{t&&y()?.forward(R*b,!0)},[t,b]),T=Ir(R=>{t&&y()?.truck(R*b,0,!0)},[t,b]),S=Ir((R,z,E)=>{if(!t)return;h.current&&cancelAnimationFrame(h.current),g.current={control:R,amount:z,action:E},f.current=0,E(z);let j=I=>{if(!g.current)return;if(f.current===0){f.current=I,h.current=requestAnimationFrame(j);return}if(I-f.current>200){let{amount:B,action:G}=g.current;G(B),f.current=I}h.current=requestAnimationFrame(j)};h.current=requestAnimationFrame(j)},[t]),N=Ir(R=>{g.current?.control===R&&(h.current&&(cancelAnimationFrame(h.current),h.current=void 0),g.current=null,f.current=0)},[]);return c2(()=>(window.addEventListener("mousemove",P),window.addEventListener("mouseup",A),window.addEventListener("touchmove",P,{passive:!1}),window.addEventListener("touchend",A),window.addEventListener("touchcancel",A),()=>{window.removeEventListener("mousemove",P),window.removeEventListener("mouseup",A),window.removeEventListener("touchmove",P),window.removeEventListener("touchend",A),window.removeEventListener("touchcancel",A),m(),h.current&&cancelAnimationFrame(h.current)}),[P,A,m]),t?Gn("div",{className:"mc__wrapper",style:{opacity:n,...p2[o]},children:yp("div",{className:"mc__dpad",children:[Gn("button",{"aria-label":"Move forward",className:"mc__arrow mc__arrow--up",onMouseDown:()=>S("up",1,w),onMouseUp:()=>N("up"),onMouseLeave:()=>N("up"),onTouchStart:R=>{R.preventDefault(),S("up",1,w)},onTouchEnd:()=>N("up"),onTouchCancel:()=>N("up"),children:Gn(Lc,{direction:"up"})}),yp("div",{className:"mc__middle-row",children:[Gn("button",{"aria-label":"Move left",className:"mc__arrow mc__arrow--left",onMouseDown:()=>S("left",-1,T),onMouseUp:()=>N("left"),onMouseLeave:()=>N("left"),onTouchStart:R=>{R.preventDefault(),S("left",-1,T)},onTouchEnd:()=>N("left"),onTouchCancel:()=>N("left"),children:Gn(Lc,{direction:"left"})}),Gn("div",{ref:a,className:"mc__joystick",onMouseDown:C,onTouchStart:C,children:Gn("div",{className:"mc__knob",style:{transform:`translate(${s.x}px, ${s.y}px)`}})}),Gn("button",{"aria-label":"Move right",className:"mc__arrow mc__arrow--right",onMouseDown:()=>S("right",1,T),onMouseUp:()=>N("right"),onMouseLeave:()=>N("right"),onTouchStart:R=>{R.preventDefault(),S("right",1,T)},onTouchEnd:()=>N("right"),onTouchCancel:()=>N("right"),children:Gn(Lc,{direction:"right"})})]}),Gn("button",{"aria-label":"Move backward",className:"mc__arrow mc__arrow--down",onMouseDown:()=>S("down",-1,w),onMouseUp:()=>N("down"),onMouseLeave:()=>N("down"),onTouchStart:R=>{R.preventDefault(),S("down",-1,w)},onTouchEnd:()=>N("down"),onTouchCancel:()=>N("down"),children:Gn(Lc,{direction:"down"})})]})}):null},Jb=h2;import{HexColorPicker as m2}from"react-colorful";import{jsx as Bc,jsxs as Qb}from"react/jsx-runtime";var vp=({colorPicker:e,onClose:t,itemMaterials:n,setItemMaterials:i,inline:r=!1})=>Qb("div",{className:`ri-popover${r?" ri-popover--inline":""}`,style:r?{padding:12}:{left:e.x,top:e.y,width:"min(225px, calc(100vw - 24px))",padding:12},onPointerDown:o=>o.stopPropagation(),children:[Bc("p",{className:"ri-popoverLabel",children:"Color"}),Bc(m2,{color:n[e.objectId]?.hex??"#ffffff",onChange:o=>i(a=>({...a,[e.objectId]:{...a[e.objectId],hex:o}}))}),Qb("div",{className:"ri-inlineRow",children:[Bc("span",{className:"ri-colorCode",children:n[e.objectId]?.hex??"#ffffff"}),Bc("button",{className:"ri-secondaryButton",onClick:t,children:"Done"})]})]});import{jsx as zr,jsxs as wp}from"react/jsx-runtime";var Cp=({materialPopup:e,textureUrl:t,triggerFileUpload:n,clearTexture:i,inline:r=!1})=>wp("div",{className:`ri-popover${r?" ri-popover--inline":""}`,style:r?{overflow:"hidden"}:{left:e.x,top:e.y,width:"min(300px, calc(100vw - 24px))",overflow:"hidden"},onPointerDown:o=>o.stopPropagation(),children:[zr("div",{className:"ri-popoverHeader",children:zr("p",{className:"ri-popoverLabel",style:{marginBottom:0},children:"Material"})}),wp("div",{className:"ri-materialBody",children:[t?zr("div",{className:"ri-previewFrame",children:zr("img",{src:t,alt:"texture preview",className:"ri-previewImage"})}):wp("div",{className:"ri-emptyState",children:[zr("svg",{width:"24",height:"24",fill:"none",stroke:"currentColor",strokeWidth:1.5,viewBox:"0 0 24 24",children:zr("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"})}),zr("span",{style:{fontSize:12},children:"No texture applied"})]}),zr("button",{onClick:()=>n(e.objectId),className:"ri-uploadButton",children:t?"Replace image":"Upload image"}),t&&zr("button",{onClick:()=>i(e.objectId),className:"ri-removeButton",children:"Remove texture"}),zr("p",{className:"ri-formatHint",children:"JPG \xB7 PNG \xB7 WebP"})]})]});import{Fragment as g2,useEffect as Sp,useRef as f2,useState as Mp}from"react";import{Fragment as Tp,jsx as dn,jsxs as ca}from"react/jsx-runtime";function Zb({entries:e}){return dn(Tp,{children:e.map(([t,n])=>{let i=n!==null&&typeof n=="object",r=i?Object.entries(n):[];return i&&r.length>0?ca("div",{className:"left-panel__data-group",children:[dn("span",{className:"left-panel__data-key",children:t}),dn("div",{className:"left-panel__data-children",children:dn(Zb,{entries:r})})]},t):ca("div",{className:"left-panel__data-row",children:[dn("span",{className:"left-panel__data-key",children:t}),dn("span",{className:`left-panel__data-value left-panel__data-value--${typeof n}`,children:i?Array.isArray(n)?"[]":"{}":String(n)})]},t)})})}function b2({content:e}){let t=e!=null,[n,i]=Mp(t),[r,o]=Mp(t),a=f2(e);return t&&(a.current=e),Sp(()=>{if(t){i(!0);return}if(n){o(!1);let s=setTimeout(()=>i(!1),300);return()=>clearTimeout(s)}},[t,n]),Sp(()=>{if(n&&t){let s=requestAnimationFrame(()=>o(!0));return()=>cancelAnimationFrame(s)}},[n,t]),n?dn("div",{className:`left-panel__action-extra${r?" left-panel__action-extra--open":""}`,children:dn("div",{className:"left-panel__action-extra-inner",children:e??a.current})}):null}function Pp({isOpen:e,selectedObject:t,currentAction:n,onClose:i,onAction:r,renderActionExtra:o}){let[a,s]=Mp(t);Sp(()=>{t&&s(t)},[t]);let c=t??a,l=c?Object.entries(c).filter(([u])=>u!=="actions"):[];return dn("div",{className:`left-panel ${e?"left-panel--open":"left-panel--closed"}`,children:c&&ca(Tp,{children:[ca("div",{className:"left-panel__header",children:[dn("p",{className:"left-panel__title",children:c.label}),dn("button",{onClick:i,className:"left-panel__close-btn","aria-label":"Close panel",children:"\u2715"})]}),l.length>0&&dn("div",{className:"left-panel__data",children:dn(Zb,{entries:l})}),dn("hr",{className:"left-panel__divider"}),c.actions&&c.actions.length>0&&ca(Tp,{children:[dn("div",{className:"left-panel__actions-label",children:"Actions"}),dn("div",{className:"left-panel__actions-list",children:c.actions.map((u,d)=>{let h=n?.action.id===u.id&&(n.binding===c||n.binding?.id===c.id||n.binding?.modelObjectId===c.modelObjectId||n.objectId===c.id||n.objectId===c.modelObjectId),g=o?.(u.id);return ca(g2,{children:[dn("button",{onClick:f=>r({objectId:c.modelObjectId||c.id||"",action:u,binding:c,screenX:f.clientX,screenY:f.clientY}),className:["left-panel__action-btn",`left-panel__action-btn--${u.id}`,h?"left-panel__action-btn--active":""].filter(Boolean).join(" "),"data-action-id":u.id,"data-label":u.label,children:u.label}),dn(b2,{content:g})]},d)})})]})]})})}import{useMemo as y2,useState as tx}from"react";import{Boxes as v2}from"lucide-react";import{useState as x2}from"react";import{jsx as ii,jsxs as Ns}from"react/jsx-runtime";function ex({openButtonLabel:e,openButtonAriaLabel:t,eyebrow:n,title:i,searchValue:r,onSearchChange:o,searchPlaceholder:a,children:s,isOpen:c,onToggle:l,openButtonIcon:u,closeButtonIcon:d,closeButtonAriaLabel:h}){let[g,f]=x2(!1),y=c!==void 0?c:g,k=v=>{c===void 0&&f(v),l?.(v)};return Ns("div",{className:`ri-sidepanel-wrap ${y?"ri-sidepanel-wrap--open":"ri-sidepanel-wrap--closed"}`,children:[!y&&Ns("button",{type:"button",className:"ri-sidepanel__open-btn",onClick:()=>k(!0),"aria-label":t,title:"Open panel",children:[u,e?ii("span",{children:e}):null]}),Ns("div",{className:`ri-sidepanel ${y?"ri-sidepanel--open":"ri-sidepanel--closed"}`,"aria-hidden":!y,children:[Ns("div",{className:"ri-sidepanel__header",children:[Ns("div",{className:"ri-sidepanel__header-top",children:[ii("span",{className:"ri-sidepanel__eyebrow",children:n}),ii("button",{type:"button",className:"ri-sidepanel__close-btn",onClick:()=>k(!1),"aria-label":h,title:"Close",children:d??ii("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:ii("path",{d:"M1 1L11 11M11 1L1 11",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"})})})]}),ii("p",{className:"ri-sidepanel__title",children:i})]}),ii("div",{className:"ri-sidepanel__search-wrap",children:ii("input",{className:"ri-sidepanel__search",type:"text",placeholder:a,value:r,onChange:v=>o(v.target.value)})}),ii("div",{className:"ri-sidepanel__list",children:s})]})]})}import{jsx as lo,jsxs as w2}from"react/jsx-runtime";function kp({objectBindings:e,onAction:t,onFocus:n,onHover:i,isOpen:r,onToggle:o}){let[a,s]=tx(null),[c,l]=tx(""),u=y2(()=>Object.entries(e).filter(([d,h])=>{let g=c.toLowerCase();return d.toLowerCase().includes(g)||(h.label??"").toLowerCase().includes(g)}),[e,c]);return lo(ex,{openButtonLabel:"",openButtonAriaLabel:"Open scene objects panel",openButtonIcon:lo(v2,{width:16,height:16,"aria-hidden":"true"}),eyebrow:"SCENE OBJECTS",title:`${u.length} visible entries`,searchValue:c,onSearchChange:l,searchPlaceholder:"Search nodes, labels",isOpen:r,onToggle:o,closeButtonAriaLabel:"Close scene objects panel",children:u.map(([d,h])=>{let g=h.visible!==!1,f=a===d;return w2("div",{onClick:()=>n(h),onMouseEnter:()=>{s(d),i?.(h)},onMouseLeave:()=>{s(null),i?.(null)},className:`ri-sidepanel__row${f?" ri-sidepanel__row--hovered":""}`,children:[lo("span",{className:`ri-sidepanel__label${f?" ri-sidepanel__label--hovered":""}`,children:h.label??d}),lo("button",{type:"button",onClick:y=>{y.stopPropagation(),t?.({objectId:d,action:{id:"toggle-visibility",label:"Toggle Visibility",type:"command"},binding:h})},className:"ri-sidepanel__vis-btn",title:g?"Hide":"Show",children:lo("span",{className:`ri-sidepanel__checkbox${g?" ri-sidepanel__checkbox--checked":""}`,children:g&&lo("svg",{width:"9",height:"9",viewBox:"0 0 10 10",fill:"none",children:lo("path",{d:"M1.5 5L4 7.5L8.5 2.5",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})})})})]},d)})})}import{AlertTriangle as Fp,Box as wx,Camera as iP,Download as oP,Eraser as aP,FileImage as sP,RotateCcw as lP,ChevronLeft as cP,Square as Cx,ChevronRight as dP,RectangleGoggles as uP,QrCode as pP,X as Up,Expand as hP,Play as mP,Pause as gP,Smartphone as Sx,PencilRuler as fP,RulerDimensionLine as bP,Grid3X3 as xP,Orbit as yP}from"lucide-react";import{createContext as C2,useContext as S2}from"react";var _p=C2({isInsideEditor:!1,activeTab:"object",activeSubTab:"General",tier:"free"});var ir=()=>S2(_p);import{jsx as Ap,jsxs as Ep}from"react/jsx-runtime";function da({visible:e,message:t,tone:n="default",progress:i}){if(!e)return null;let r=typeof i=="number"&&Number.isFinite(i),o=r?Math.min(Math.max(i,0),100):0,a=Math.round(o);return Ep("div",{className:"bb-loadingOverlay",role:"status","aria-live":"polite",children:[r&&Ep("div",{className:"bb-loadingProgressRow",children:[Ap("div",{className:"bb-loadingProgress",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":a,children:Ap("div",{className:"bb-loadingProgress__bar",style:{width:`${a}%`}})}),Ep("span",{className:"bb-loadingProgress__label",children:[a,"%"]})]}),Ap("span",{className:`bb-loadingMessage bb-status--${n}`,children:t})]})}var Rp=new WeakSet;function ua(e){Rp.add(e)}function nx(e){let t=Rp.has(e);return t&&Rp.delete(e),t}import{useRef as qt,useEffect as Is,useMemo as or,useCallback as Oc,useSyncExternalStore as k2}from"react";import{useThree as _2,useFrame as A2}from"@react-three/fiber";import{Sphere as E2,PivotControls as R2}from"@react-three/drei";import{Vector3 as Cr,Vector2 as L2,AdditiveBlending as Lp,TextureLoader as B2,Matrix4 as O2,Quaternion as pa,Euler as Dc}from"three";var rx="data:image/png;base64,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";var ix="data:image/png;base64,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";var ox="data:image/png;base64,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";import{Fragment as G2,jsx as wt,jsxs as ar}from"react/jsx-runtime";var Bp=-100,Op=100,hx=.03,D2=.03,N2=.03,ax=.5,I2=rx,z2=ix,j2=ox,V2=Math.PI/4,sx=.4,ha=64,lx=hx*3,Dp="#4d7dff",cx="#ffcc00",dx=.02,F2=new Cr(0,1,0),Nc=32,ux="#ff9d3d",Ic=4;function Np(e){let t=new Float32Array((ha+1)*3);for(let n=0;n<=ha;n++){let i=n/ha*Math.PI*2,r=Math.cos(i)*sx,o=Math.sin(i)*sx,a=0,s=0,c=0;e==="x"?(s=r,c=o):e==="y"?(a=r,c=o):(a=r,s=o),t[n*3]=a,t[n*3+1]=s,t[n*3+2]=c}return t}function U2(e){let t=Math.abs(e.y)<.99?new Cr(0,1,0):new Cr(1,0,0),n=new Cr().crossVectors(e,t).normalize(),i=new Cr().crossVectors(e,n).normalize();return[n,i]}function px(e,t,n=1e-5){return Math.abs(e[0]-t[0])<n&&Math.abs(e[1]-t[1])<n&&Math.abs(e[2]-t[2])<n}var ma=null,Ip=new Set;function zs(e){ma!==e&&(ma=e,Ip.forEach(t=>t()))}function zp(e){return Ip.add(e),()=>Ip.delete(e)}function zc(){return ma}function mx({light:e,position:t,rotation:n=[0,0,0],color:i,intensity:r,visible:o,onPositionChange:a,onRotationChange:s,onDraggingChange:c}){let{activeTab:l,activeSubTab:u,setActiveTab:d,setActiveSubTab:h}=ir(),{camera:g,gl:f,raycaster:y,invalidate:k}=_2(),v=qt(null),p=qt(null),m=qt(null),M=qt(null),C=qt(null),P=qt(null),A=qt(null),b=qt(null),w=qt(null),T=qt(null),S=qt(null),N=or(()=>new O2,[]),R=or(()=>new pa,[]),z=or(()=>new Cr(1,1,1),[]),E=qt([0,0,0]),j=qt([0,0,0]),I=qt(!1),L=qt(null),B=qt(null),G=qt(null),H=qt(c);Is(()=>{H.current=c},[c]);let ae=or(()=>new Cr(t[0],t[1],t[2]),[t]),be=or(()=>new Dc(n[0],n[1],n[2]),[n]),pe=or(()=>new Float32Array(6),[]),xe=or(()=>Np("x"),[]),Te=or(()=>Np("y"),[]),ye=or(()=>Np("z"),[]),St=or(()=>new Float32Array((Nc+1)*3),[]),st=or(()=>new Float32Array(Ic*2*3),[]),De=e?.type==="point",ve=e?.type==="spot",Y=De?z2:ve?j2:I2,ft=De?D2:ve?N2:hx,ze=or(()=>new B2().load(Y),[Y]),lt=k2(zp,zc,zc),nt=!!e&<===e.id,Ee=qt(new Cr),rt=qt(new Dc);Is(()=>{I.current||(Ee.current.copy(ae),rt.current.copy(be),k())},[ae,be,k]),Is(()=>{e&&ma===e.id&&!o&&zs(null)},[e?.id,o]),Is(()=>()=>{e&&ma===e.id&&zs(null),G.current!==null&&(cancelAnimationFrame(G.current),G.current=null)},[e?.id]);let Bt=Oc(()=>{if(I.current||!nt)return;let Se=Ee.current,$=new pa().setFromEuler(rt.current);N.compose(Se,$,z)},[N,z,nt]);A2(()=>{if(v.current&&v.current.position.copy(Ee.current),Bt(),m.current){m.current.lookAt(g.position);let Se=g,$;Se.isOrthographicCamera?$=ft/Se.zoom:$=g.position.distanceTo(Ee.current)*ft,m.current.scale.setScalar($)}if(A.current){let Se=g,$;Se.isOrthographicCamera?$=lx/Se.zoom:$=g.position.distanceTo(Ee.current)*lx,A.current.scale.setScalar($)}if(C.current){let Se=C.current.getAttribute("position"),$=Se.array;$[0]=0,$[1]=0,$[2]=0,$[3]=Ee.current.x,$[4]=Ee.current.y,$[5]=Ee.current.z,Se.needsUpdate=!0,C.current.computeBoundingSphere()}if(P.current){let Se=Ee.current,$=Se.length();P.current.visible=$>ax,$>1e-6&&(P.current.position.copy(Se).multiplyScalar(.5),P.current.scale.set(1,$,1),P.current.quaternion.setFromUnitVectors(F2,Se.clone().normalize()))}if(M.current&&(M.current.visible=Ee.current.length()>ax),ve&&b.current&&w.current&&T.current){let Se=Ee.current,$=Se.length();if($>1e-6){b.current.visible=!0;let ge=Se.clone().negate().normalize(),ie=$,we=e?.angle??Math.PI/6,Pe=ie*Math.tan(we),ke=Se.clone().add(ge.clone().multiplyScalar(ie)),[Le,de]=U2(ge),it=w.current.getAttribute("position"),Ze=it.array;for(let je=0;je<=Nc;je++){let Ie=je/Nc*Math.PI*2,mn=ke.x+(Le.x*Math.cos(Ie)+de.x*Math.sin(Ie))*Pe,bt=ke.y+(Le.y*Math.cos(Ie)+de.y*Math.sin(Ie))*Pe,xn=ke.z+(Le.z*Math.cos(Ie)+de.z*Math.sin(Ie))*Pe;Ze[je*3]=mn,Ze[je*3+1]=bt,Ze[je*3+2]=xn}it.needsUpdate=!0,w.current.computeBoundingSphere();let It=T.current.getAttribute("position"),Ot=It.array;for(let je=0;je<Ic;je++){let Ie=je/Ic*Math.PI*2,mn=ke.x+(Le.x*Math.cos(Ie)+de.x*Math.sin(Ie))*Pe,bt=ke.y+(Le.y*Math.cos(Ie)+de.y*Math.sin(Ie))*Pe,xn=ke.z+(Le.z*Math.cos(Ie)+de.z*Math.sin(Ie))*Pe,yn=je*6;Ot[yn]=Se.x,Ot[yn+1]=Se.y,Ot[yn+2]=Se.z,Ot[yn+3]=mn,Ot[yn+4]=bt,Ot[yn+5]=xn}It.needsUpdate=!0,T.current.computeBoundingSphere()}else b.current.visible=!1}});let he=Oc(()=>{G.current!==null&&(cancelAnimationFrame(G.current),G.current=null),E.current=t,j.current=[n[0],n[1],n[2]],I.current=!0,L.current=null,B.current=null,H.current?.(!0)},[t,n]),Nt=Oc((Se,$,ge,ie)=>{let we=new Cr(E.current[0],E.current[1],E.current[2]),Pe=new Cr,ke=new pa,Le=new Cr;ie.decompose(Pe,ke,Le);let de=we.clone().applyMatrix4(ie),it=[Math.min(Math.max(de.x,Bp),Op),Math.min(Math.max(de.y,Bp),Op),Math.min(Math.max(de.z,Bp),Op)],Ze=new pa().setFromEuler(new Dc(j.current[0],j.current[1],j.current[2],"XYZ")),It=new pa().copy(ke).multiply(Ze),Ot=new Dc().setFromQuaternion(It,"XYZ"),je=[Ot.x,Ot.y,Ot.z];Ee.current.set(it[0],it[1],it[2]),rt.current.set(je[0],je[1],je[2]),L.current=it,B.current=je;let Ie=new pa().setFromEuler(rt.current);N.compose(Ee.current,Ie,z),k()},[N,z,k]),_t=Oc(()=>{I.current=!1;let Se=L.current,$=B.current;L.current=null,B.current=null;let ge=Se&&!px(Se,E.current),ie=$&&!px($,j.current);ge&&a&&a(Se),ie&&s&&s($),ge||ie?G.current=requestAnimationFrame(()=>{G.current=null,H.current?.(!1)}):H.current?.(!1)},[a,s]);return Is(()=>{let Se=ie=>{let we=f.domElement.getBoundingClientRect();return new L2((ie.clientX-we.left)/we.width*2-1,-((ie.clientY-we.top)/we.height)*2+1)},$=ie=>!!ie.target.closest?.("button, input, textarea, .ri-annotationPopup, .ri-colorPicker, .ri-materialPicker"),ge=ie=>{if($(ie))return;let we=Se(ie);y.setFromCamera(we,g);let Pe=[];if(p.current&&Pe.push(p.current),m.current&&Pe.push(m.current),Pe.length===0)return;if(y.intersectObjects(Pe,!1).length>0){let Le=e?.id??null;ma!==Le&&(zs(Le),d?.("scene"),h?.("Lighting")),ie.preventDefault(),ie.stopPropagation()}};return f.domElement.addEventListener("pointerdown",ge),()=>{f.domElement.removeEventListener("pointerdown",ge)}},[g,y,f,e,d,h]),l!=="scene"||u!=="Lighting"||!e||!o||e.type==="none"||e.type==="hemisphere"?null:ar("group",{ref:Se=>{Se&&xm(Se)},children:[ar("group",{ref:v,children:[wt("sprite",{ref:m,children:wt("spriteMaterial",{map:ze,transparent:!0,opacity:.9,blending:Lp,depthWrite:!1,rotation:ve?V2:0},Y)}),wt(E2,{ref:p,args:[.25,16,16],children:wt("meshBasicMaterial",{transparent:!0,opacity:.01})}),De&&ar("group",{ref:A,children:[ar("lineLoop",{renderOrder:999,children:[wt("bufferGeometry",{children:wt("bufferAttribute",{attach:"attributes-position",args:[xe,3],count:ha+1})}),wt("lineBasicMaterial",{color:Dp,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),ar("lineLoop",{renderOrder:999,children:[wt("bufferGeometry",{children:wt("bufferAttribute",{attach:"attributes-position",args:[Te,3],count:ha+1})}),wt("lineBasicMaterial",{color:Dp,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),ar("lineLoop",{renderOrder:999,children:[wt("bufferGeometry",{children:wt("bufferAttribute",{attach:"attributes-position",args:[ye,3],count:ha+1})}),wt("lineBasicMaterial",{color:Dp,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]})]})]}),!De&&!ve&&ar(G2,{children:[ar("mesh",{ref:P,children:[wt("cylinderGeometry",{args:[dx,dx,1,8,1,!0]}),wt("meshBasicMaterial",{color:cx,transparent:!0,opacity:.05,blending:Lp,depthWrite:!1,depthTest:!1})]}),ar("line",{ref:M,children:[wt("bufferGeometry",{ref:C,children:wt("bufferAttribute",{attach:"attributes-position",args:[pe,3],count:2})}),wt("lineBasicMaterial",{color:cx,transparent:!0,opacity:.7,blending:Lp})]})]}),ve&&ar("group",{ref:b,children:[ar("lineLoop",{renderOrder:999,children:[wt("bufferGeometry",{ref:w,children:wt("bufferAttribute",{attach:"attributes-position",args:[St,3],count:Nc+1})}),wt("lineBasicMaterial",{color:ux,transparent:!0,opacity:.85,depthTest:!1,depthWrite:!1})]}),ar("lineSegments",{renderOrder:999,children:[wt("bufferGeometry",{ref:T,children:wt("bufferAttribute",{attach:"attributes-position",args:[st,3],count:Ic*2})}),wt("lineBasicMaterial",{color:ux,transparent:!0,opacity:.5,depthTest:!1,depthWrite:!1})]})]}),nt&&a&&wt(R2,{ref:S,matrix:N,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableScaling:!0,onDragStart:he,onDrag:Nt,onDragEnd:_t})]})}import{useCallback as jp,useLayoutEffect as X2,useMemo as jr,useRef as oi}from"react";import{PivotControls as q2}from"@react-three/drei";import{useFrame as Y2,useThree as K2}from"@react-three/fiber";import{Euler as yx,Matrix4 as Vc,Quaternion as Fc,Vector3 as js}from"three";import{Box3 as gx,Euler as H2,Matrix4 as fx,Quaternion as W2,Vector3 as Si}from"three";function jc(e){e.updateWorldMatrix(!0,!0);let t=new fx().copy(e.matrixWorld).invert(),n=new gx,i=new gx,r=!1;return e.traverse(o=>{let a=o;if(!a.isMesh||!a.geometry||(a.geometry.boundingBox||a.geometry.computeBoundingBox(),!a.geometry.boundingBox))return;let s=new fx().multiplyMatrices(t,o.matrixWorld);i.copy(a.geometry.boundingBox).applyMatrix4(s),n.union(i),r=!0}),r?n.getCenter(new Si):new Si}function bx(e,t="XYZ"){return new W2().setFromEuler(new H2(e[0],e[1],e[2],t))}function $2(e,t,n,i,r="XYZ"){let a=new Si(...i).multiply(new Si(...n)).applyQuaternion(bx(t,r)).add(new Si(...e));return[a.x,a.y,a.z]}function xx(e,t,n,i,r,o="XYZ"){let a=new Si(...$2(e,t,i,r,o)),s=new Si(...r).multiply(new Si(...i)).applyQuaternion(bx(n,o)),c=a.sub(s);return[c.x,c.y,c.z]}import{jsx as vx}from"react/jsx-runtime";function Vp({node:e,space:t,onTransformChange:n,onDraggingChange:i}){let r=K2(S=>S.invalidate),o=jr(()=>jc(e),[e]),a=jr(()=>new Vc,[]),s=oi(!1),c=oi(new Vc),l=oi(new Vc),u=oi(null),d=oi(0),h=oi([]),g=oi(null),f=oi(i);f.current=i;let y=jr(()=>new js,[]),k=jr(()=>new Fc,[]),v=jr(()=>new js,[]),p=jr(()=>new Fc,[]),m=jr(()=>new js(1,1,1),[]),M=jr(()=>new Fc,[]),C=jr(()=>new js,[]),P=jr(()=>new js,[]),A=oi([0,0,0]),b=jp(()=>{s.current||(e.updateWorldMatrix(!0,!1),y.copy(o).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(k),p.copy(k),t==="world"&&p.identity(),a.compose(y,p,m))},[y,a,p,m,e,o,t,k]);X2(()=>(b(),()=>{let S=g.current!==null;S&&(cancelAnimationFrame(g.current),g.current=null),(s.current||S)&&(s.current=!1,f.current(!1));for(let N of h.current)Jo(N);h.current=[]}),[b]),Y2(()=>b());let w=jp(()=>{g.current!==null&&(cancelAnimationFrame(g.current),g.current=null),e.updateWorldMatrix(!0,!0),h.current=[];for(let S of Ko(e))Wg(S)||($l(S,S.matrixWorld),h.current.push(S));e.updateWorldMatrix(!0,!1),y.copy(o).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(k),e.getWorldScale(v),c.current.compose(y,k,v),l.current.copy(a),A.current=[e.rotation.x,e.rotation.y,e.rotation.z],u.current=null,s.current=!0,i(!0)},[y,a,e,i,o,k,v]),T=jp((S,N)=>{let R=c.current.clone().premultiply(N),z=l.current.clone().premultiply(N);R.decompose(C,k,P);let E=C.clone();z.decompose(y,p,m),t==="world"&&p.identity(),a.compose(y,p,m),S.decompose(C,M,P);let j=new yx().setFromQuaternion(M,e.rotation.order),[I,L,B]=A.current,G=[I+j.x,L+j.y,B+j.z],H=new Fc().setFromEuler(new yx(G[0],G[1],G[2],e.rotation.order)),be=(e.parent?.matrixWorld||new Vc).clone().invert(),pe=E.clone().applyMatrix4(be),xe=o.clone().multiply(e.scale).applyQuaternion(H),Te=pe.clone().sub(xe),ye=[Te.x,Te.y,Te.z];e.position.set(ye[0],ye[1],ye[2]),e.rotation.set(G[0],G[1],G[2],e.rotation.order),e.updateMatrixWorld(!0),r(),u.current={position:ye,rotation:G}},[y,M,a,p,m,r,e,o,C,P,t,k]);return vx("group",{children:vx(q2,{matrix:a,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableScaling:!0,onDragStart:w,onDrag:(S,N,R,z)=>T(N,z),onDragEnd:()=>{s.current=!1;let S=u.current;if(u.current=null,S)n(S),g.current=requestAnimationFrame(()=>{g.current=null,i(!1)});else if(h.current.length>0){for(let N of h.current)Jo(N);e.updateMatrixWorld(!0),r(),i(!1)}else i(!1);h.current=[]}})})}import{Fragment as co,jsx as X,jsxs as Oe}from"react/jsx-runtime";function vP(e){let t=e.object;if(!t.isSkinnedMesh||!e.face||!t.skeleton)return null;let n=t.geometry,i=n.getAttribute("skinIndex"),r=n.getAttribute("skinWeight"),o=n.getAttribute("position");if(!i||!r||!o)return null;let a=t.worldToLocal(e.point.clone()),s=[e.face.a,e.face.b,e.face.c],c=new In,l=s[0],u=1/0;for(let g of s){c.fromBufferAttribute(o,g);let f=c.distanceToSquared(a);f<u&&(u=f,l=g)}let d=i.getComponent(l,0),h=r.getComponent(l,0);for(let g=1;g<4;g++){let f=r.getComponent(l,g);f>h&&(h=f,d=i.getComponent(l,g))}return t.skeleton.bones[d]??null}function wP(e){let t=vP(e)??e.object,n=os(t);if(!n)return null;t.updateWorldMatrix(!0,!1);let i=t.worldToLocal(e.point.clone());return{anchorNodeName:n,anchorLocalPosition:[i.x,i.y,i.z]}}function CP(e,t,n){if(!e.anchorNodeName||!e.anchorLocalPosition)return!1;let i=xr(t,e.anchorNodeName);return i?(i.updateWorldMatrix(!0,!1),n.set(...e.anchorLocalPosition).applyMatrix4(i.matrixWorld),!0):!1}function SP({annotation:e,enabled:t,controlsRef:n,offsetRef:i}){let r=Px(h=>h.scene),o=at(null),a=at(!1),s=An(()=>new In,[]),c=An(()=>new In,[]),l=An(()=>new In,[]),u=e?.anchorNodeName,d=e?.anchorLocalPosition;return Ct(()=>{o.current=null,a.current=!1},[u,e?.id]),Tx(()=>{let h=n.current,g=i.current;if(!t||!h||!g||!u||!d){a.current=!1;return}let f=o.current;if((!f||!f.parent)&&(f=xr(r,u),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(g),h.setLookAt(l.x,l.y,l.z,s.x,s.y,s.z,!0))}),null}function MP(e){let t={total:0,missing:0};return e.traverse(n=>{let i=n;!i.isMesh||!i.geometry||(t.total+=1,i.geometry.getAttribute("uv")||(t.missing+=1))}),t}var TP=.2;function PP({enabled:e,speed:t,controlsRef:n}){let i=Px(r=>r.invalidate);return Tx((r,o)=>{!e||!n.current||(n.current.rotate(o*TP*t,0,!1),i())}),null}function kP(e,t,n){let i=t?.camera;if(!(i instanceof kx))return null;let o=(e instanceof ga?e:new ga().setFromObject(e)).getSize(new In).length();return!Number.isFinite(o)||o<=0?null:(i.near=o/100,i.far=o*100,i.updateProjectionMatrix(),t&&n===void 0&&(t.maxDistance=o*10),o)}function _P(e,t){let n=e.camera;if(!(n instanceof kx)||!(t>0))return;let i=Math.min(Math.max(e.distance/200,t/1e5),t/100);Math.abs(i-n.near)<=n.near*.01||(n.near=i,n.updateProjectionMatrix())}async function Mx(e,t,n=.6){let i=e.smoothTime;e.smoothTime=n;try{return await t()}finally{e.smoothTime=i}}function Uc({modelUrl:e,tilesetUrl:t,tilesErrorTarget:n=8,tilesCacheSize:i=800,onObjectCatalog:r,modelFormat:o,licenseKey:a,licenseValidationUrl:s,objectBindings:c,selectedObject:l,panelHoveredObject:u,onObjectBindingsChange:d,onObjectSelect:h,onObjectHover:g,onObjectEditLeaseChange:f,onModelLoaded:y,onLoadError:k,onProgress:v,onCameraControllerChange:p,cameraControllerType:m,onAction:M,onHiddenObjectsChange:C,onCameraChange:P,onViewerReady:A,onTextureUpload:b,onAnimationsReady:w,onAnnotationsChange:T,activeAnnotation:S,onActiveAnnotationChange:N,lights:R,camera:z,cameraLimits:E,backgroundColor:j,shadows:I=!0,showObjectBindingDataPanel:L=!0,customObjectBindingDataPanel:B,customSceneObjectsPanel:G,showSceneObjectsPanel:H=!0,showDownloadButton:ae=!0,downloadFilename:be="model",showResetButton:pe=!0,showLoadingOverlay:xe=!0,showMouseController:Te=!1,mouseControllerPosition:ye="center-bottom",mouseControllerOpacity:St=1,moveSensitivity:st=.08,zoomSensitivity:De=1,sceneConfig:ve,onSceneConfigChange:Y,disableZoom:ft=!1,zoomOnSelected:ze=!0,highlightOnHover:lt=!0,enableCameraControls:nt=!0,onAutoFit:Ee,refitOnResize:rt=!0,renderMode:Bt="demand",maxDpr:he=2,preserveDrawingBuffer:Nt=!1,performanceProfile:_t="auto",dracoDecoderPath:Se,ktx2TranscoderPath:$,meshopt:ge=!0,showMeasureTools:ie=!1,showUvCheckerButton:we=!1,showExplodeControls:Pe=!1,cinematic:ke,measurementUnit:Le="m",enableXR:de=!1,usdzUrl:it,arScaleMode:Ze="normalized",mobileHandoffUrl:It,showAnnotationNavigation:Ot=!0,showAnnotationOnHover:je=!1,moveModeEnabled:Ie=!1,objectTransformSpace:mn="world",enableKeyboardNavigation:bt=!1,showViewGizmo:xn=!1,autoRotate:yn=!1,autoRotateSpeed:zt=1}){let{isInsideEditor:V,activeTab:_,activeSubTab:F}=ir(),q=V&&_==="scene"&&F==="Lighting",te=Rc(a,s),Q=An(()=>ve??Vi,[ve]),[ne,pt]=Be(null),Ve=Q.model.renderer==="uv-checker",ct=we?ne??Ve:Ve,Ue=An(()=>{let x=ct?"uv-checker":Ve?"pbr":Q.model.renderer;return x===Q.model.renderer?Q:{...Q,model:{...Q.model,renderer:x}}},[Ve,Q,ct]);Ct(()=>{pt(null)},[e,Q.model.renderer,we,t]);let dt=An(()=>{if(j)return j;let x=Q.background;return x.enabled&&x.type==="color"?x.color:"#1c1c1d"},[j,Q]),fe=An(()=>({dracoDecoderPath:Se,ktx2TranscoderPath:$,meshopt:ge}),[Se,$,ge]),Mt=An(()=>Em(_t),[_t]),me=at(null),[jt,Ln]=Be("orbit"),[gn,on]=Be(!1),Pn=m!==void 0?m:jt,Tr=_e(x=>{on(!1),x!==Pn&&(Ln(x),p?.(x))},[Pn,p]),[si,Fr]=Be(!1);Ct(()=>{me.current&&(me.current.dollySpeed=Math.max(De,0))},[De]),Ct(()=>{me.current&&(me.current.enabled=nt&&!si)},[nt,si]);let Zt=at(null),qn=at(new Map),Ri=at(null),xt=at(null),Yn=at(null),Ur=at({});Ct(()=>()=>{for(let x of Object.values(Ur.current))URL.revokeObjectURL(x)},[]);let Kn=at({}),[,Co]=Be(0),Ys=_e(()=>{Co(x=>x+1)},[]),Ta=at({}),Ks=at(null),Bn=at(null),[yt,Pa]=Be(null),Pr=_e(x=>{Bn.current=x,Pa(x)},[]),So=at(new Set),Gr=at(null);Ct(()=>{let x=yt;if(!x||!bt||!nt||Ie)return;let D=new Set(["w","a","s","d"," ","c"]),re=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]),oe=0,le=Je=>Je.code==="Space"?" ":Je.key.toLowerCase(),vt=()=>{So.current.clear(),oe=0,Gr.current!==null&&(cancelAnimationFrame(Gr.current),Gr.current=null)},mt=Je=>{let tn=me.current,et=So.current;if(!tn||et.size===0){Gr.current=null,oe=0;return}let bn=oe?Math.min((Je-oe)/1e3,.05):1/60;oe=Je;let $t=Math.max(tn.distance*.75,.01)*bn;et.has("w")&&tn.forward($t,!1),et.has("s")&&tn.forward(-$t,!1),et.has("a")&&tn.truck(-$t,0,!1),et.has("d")&&tn.truck($t,0,!1),et.has(" ")&&tn.truck(0,$t,!1),et.has("c")&&tn.truck(0,-$t,!1),Gr.current=requestAnimationFrame(mt)},en=Je=>{if(Je.target!==x){vt();return}if(re.has(Je.key)){let et=me.current;if(!et)return;Je.preventDefault();let bn=Math.PI/90,$t=Math.max(et.distance*.05,.01);Je.key==="ArrowUp"?Je.shiftKey?et.forward($t,!0):et.rotate(0,-bn,!0):Je.key==="ArrowDown"?Je.shiftKey?et.forward(-$t,!0):et.rotate(0,bn,!0):Je.key==="ArrowLeft"?et.rotate(-bn,0,!0):et.rotate(bn,0,!0);return}let tn=le(Je);D.has(tn)&&(Je.preventDefault(),So.current.add(tn),Gr.current===null&&(Gr.current=requestAnimationFrame(mt)))},Wt=Je=>{So.current.delete(le(Je))};return x.addEventListener("keydown",en),x.addEventListener("keyup",Wt),x.addEventListener("blur",vt),()=>{x.removeEventListener("keydown",en),x.removeEventListener("keyup",Wt),x.removeEventListener("blur",vt),vt()}},[yt,nt,bt,Ie]);let ka=at(null),[Mo,To]=Be(c),[fn,Po]=Be({}),[Jn,Li]=Be(null),[_a,Js]=Be(null),[Aa,Ea]=Be(null),[nd,rd]=Be(null),[Fn,Qs]=Be(null),[kr,ko]=Be(null),an=at(null),_o=at(null),Ra=at(0),Zs=at(null),[id,el]=Be(0),_r=at(!1),Bi=at(!1),La=at(!!z);La.current=!!z;let mr=at(null),[tl,Oi]=Be(!!e),[Ba,Di]=Be(!e||!!Ee||!!z),[Hr,Oa]=Be(!1),[od,Da]=Be(!1),[nl,Ni]=Be(!1),[rl,il]=Be(!1),[ol,ad]=Be(null),[sd,Na]=Be(!1),[Qn,al]=Be({total:0,missing:0}),[O,U]=Be("Loading model..."),[J,se]=Be(null),Me=at({}),Ke=_e(()=>{let x=me.current;if(!x||mr.current)return;let D=x.getPosition(new In),re=x.getTarget(new In);mr.current={position:[D.x,D.y,D.z],target:[re.x,re.y,re.z]}},[]),[ot,Ge]=Be(!1),[gr,Lh]=Be(0),[ld,Bh]=Be(!1);Ct(()=>{Lh(0),Bh(!1)},[e,t]);let Ia=An(()=>{let x=Q.cinematic,D=x?.enabled?{waypoints:x.waypoints,duration:x.duration,loop:x.loop,autoPlay:x.autoPlay}:null;return ke===void 0?D&&(D.waypoints?.length??0)>=2?D:null:ke===!1?null:ke===!0?D??{}:{...D??{},...ke}},[ke,Q]),[Ii,Ar]=Be(!1),[Py,Ao]=Be(!1),cd=at(!1);Ct(()=>{Ar(!1),Ao(!1),cd.current=!1},[e,t]),Ct(()=>{!Ia?.autoPlay||cd.current||Hr&&Ba&&!tl&&(cd.current=!0,Ar(!0),Ao(!1))},[Ia,Hr,Ba,tl]);let{xrStore:zi,presenterRef:ky,arSupported:dd,vrSupported:Oh,quickLookSupported:Dh,resolvedMobileHandoffUrl:sl,isMobileHandoffOpen:Nh,arOverlay:_y,openMobileHandoff:Ay,closeMobileHandoff:Ih,openQuickLook:Ey,handleARStateChange:Ry}=Bm({enableXR:de,usdzUrl:it,mobileHandoffUrl:It}),[Er,zh]=Be(()=>ve?.annotations??[]);Ct(()=>{if(Er.length>0){let x=Er.reduce((D,re)=>Math.max(D,re.id),0);dl.current=x}else dl.current=0},[Er]);let[On,ll]=Be(null),[li,cl]=Be({title:"",description:""}),dl=at(0),[Ly,jh]=Be(null),[Zn,Eo]=Be(-1),[Vh,ul]=Be(!1),Ro=at(null),Vt=An(()=>[...Er].sort((x,D)=>x.id-D.id),[Er]),pl=An(()=>Zn<0||Zn>=Vt.length?null:Vt[Zn],[Zn,Vt]),Rr=_e(x=>{if(S!==void 0){N?.(x);return}jh(x?{annotation:x}:null)},[S,N]),Lo=_e(x=>{let D=me.current,re=an.current;if(!D)return;let oe=new In,le=qn.current.get(x.id);le?oe.copy(le):re&&CP(x,re,oe)||oe.set(x.worldPosition[0],x.worldPosition[1],x.worldPosition[2]),Zt.current=null;let vt=D.smoothTime;D.smoothTime=.6;let mt=x.worldNormal;if(re){let en=new ga().setFromObject(re),Wt=new In;en.getCenter(Wt);let Je=new In;en.getSize(Je);let tn=Je.length()*.2,et;mt?et=new In(mt[0],mt[1],mt[2]):et=oe.clone().sub(Wt),et.lengthSq()<1e-6&&et.set(0,0,1),et.normalize();let bn=Math.max(tn*.6,.3),$t=oe.clone().add(et.multiplyScalar(bn));D.setPosition($t.x,$t.y,$t.z,!0),x.anchorNodeName&&x.anchorLocalPosition&&(Zt.current=$t.clone().sub(oe))}D.setTarget(oe.x,oe.y,oe.z,!0),Ro.current&&clearTimeout(Ro.current),Ro.current=setTimeout(()=>{D.smoothTime=vt,Ro.current=null},800),Rr(x)},[Rr]),By=_e(()=>{Vt.length!==0&&(Ge(!0),Eo(0),Lo(Vt[0]))},[Vt,Lo]),Oy=_e(()=>{if(Vt.length===0||Zn<0)return;ul(!0);let x=(Zn-1+Vt.length)%Vt.length;Eo(x),Lo(Vt[x]),setTimeout(()=>ul(!1),500)},[Zn,Vt,Lo]),Dy=_e(()=>{if(Vt.length===0||Zn<0)return;if(Zn===Vt.length-1){if(Ge(!1),Eo(-1),Rr(null),me.current&&mr.current){let D=mr.current;me.current.setLookAt(D.position[0],D.position[1],D.position[2],D.target[0],D.target[1],D.target[2],!0)}return}ul(!0);let x=Zn+1;Eo(x),Lo(Vt[x]),setTimeout(()=>ul(!1),500)},[Zn,Vt,Lo,Rr]),Ny=_e(()=>{if(Ge(!1),Eo(-1),Rr(null),me.current&&mr.current){let x=mr.current;me.current.setLookAt(x.position[0],x.position[1],x.position[2],x.target[0],x.target[1],x.target[2],!0)}},[Rr]);Ct(()=>{Eo(-1),Ge(!1)},[Vt.length]),Ct(()=>()=>{Ro.current&&clearTimeout(Ro.current)},[]),Ct(()=>{pl&&ot&&Rr(pl)},[pl,Rr,ot]),Ct(()=>{if(ve?.annotations===void 0)return;let x=ve.annotations.map(D=>({...D,localPosition:D.localPosition??D.worldPosition}));zh(x)},[ve?.annotations]);let za=_e(()=>{if(S!==void 0){N?.(null);return}jh(null)},[S,N]),ja=S!==void 0?S:Ly?.annotation??null,Va=An(()=>ja?Er.find(D=>D.id===ja.id)??null:null,[ja,Er]);Ct(()=>{ja&&!Va&&za()},[ja,Va,za]);let Fa=d!==void 0,ht=Fa?c:Mo;Me.current=ht;let Iy=An(()=>Object.entries(ht).map(([x,D])=>JSON.stringify([x,D.modelObjectId,D.transform??null])).sort().join(""),[ht]),{measureMode:Ua,measureModeRef:zy,measurePoints:Fh,showDimensions:ud,measureBox:Uh,modelBounds:jy,refreshBounds:Gh,clearMeasurements:Vy,toggleMeasureMode:Fy,toggleDimensions:Uy,handleMeasurePointerDown:Gy,handleMeasureClick:Hy}=_m({canvasAreaRef:Bn,controlsRef:me,sceneRef:an,modelUrl:e,modelRotation:Q.model.rotation,bindingTransformSignature:Iy,modelLoaded:Hr}),{isDownloading:pd,downloadMenuOpen:Wy,uvExportError:Hh,toggleDownloadMenu:$y,handleDownloadMesh:Xy,handleDownloadScreenshot:qy,handleDownloadUvLayout:Yy}=Pm({sceneRef:an,materialRefs:Ta,rendererCaptureRef:Yn,objectBindings:ht,downloadFilename:be}),Wh=An(()=>Object.fromEntries(Object.entries(ht).filter(([,x])=>x.visible===!1).map(([x])=>[x,!0])),[ht]),Wr=An(()=>{let x=new WeakMap,D=new Map,re=new Map;for(let[oe,le]of Object.entries(ht))x.set(le,oe),D.has(le.id)||D.set(le.id,oe),re.has(le.modelObjectId)||re.set(le.modelObjectId,oe);return{byReference:x,byId:D,byModelObjectId:re}},[ht]),ci=_e(x=>x?Wr.byReference.get(x)??Wr.byModelObjectId.get(x.modelObjectId)??Wr.byId.get(x.id)??null:null,[Wr]),hd=l!==void 0,Ga=hd?l??null:nd,fr=ci(Ga),md=fr?Kn.current[fr]??null:null,$h=ci(lt?u??_a??Aa:null),Ky=$h?Kn.current[$h]??null:null,Xh=_e(x=>{Ea(x),g?.(x)},[g]),qh=L&&Ga!==null&&fr!==null,Yh=(fr?ht[fr]:null)??Ga;Ct(()=>{Fa||To(c)},[Fa,c]),Ct(()=>{C?.(Wh)},[Wh,C]);let Bo=_e(x=>{if(Pn==="pointerLock"){Tr("orbit");return}hd||rd(x),h?.(x)},[Pn,Tr,hd,h]),Oo=_e(x=>{Fa||To(x),d?.(x)},[Fa,d]),Jy=_e(x=>{let D=fr;if(!D||!x)return;let re=Me.current[D];re&&Oo({...Me.current,[D]:{...re,transform:{...re.transform,...x}}})},[Oo,fr]),$r=_e((x,D)=>ht[x]?x:D?ci(D):Wr.byId.get(x)??Wr.byModelObjectId.get(x)??null,[ht,ci,Wr]),Ha=_e((x,D)=>{let re=$r(x),oe=re?ht[re]:void 0;!re||!oe||Oo({...ht,[re]:{...oe,style:D(oe.style)}})},[$r,ht,Oo]),er=_e(()=>{if(Fn){let x=fn[Fn.objectId]?.hex;x!==void 0&&(Ha(Fn.objectId,D=>({...D,material:{...D?.material,baseColor:x}})),Po(D=>({...D,[Fn.objectId]:{}})))}Qs(null)},[Fn,fn,Ha]),Kh=_e(()=>{Bo(null),Li(null),er(),ko(null)},[Bo,er]),gd=_e((x,D,re,oe,le)=>{let vt=Ks.current,mt=Bn.current,en=me.current?.camera;if(!vt)return{objectId:x,x:24,y:24};let Wt=vt.getBoundingClientRect(),Je=12,tn=Wt.width-D-Je,et=Wt.height-re-Je,bn=Math.max(Je,(Wt.width-D)/2),$t=Math.max(Je,(Wt.height-re)/2),No=$r(x,oe),Xa=No?Kn.current[No]:null,Lr=(Io,ji)=>ji<=Je?Je:Math.min(Math.max(Io,Je),ji);if(mt&&en&&Xa){let Io=mt.getBoundingClientRect(),ji=new In;new ga().setFromObject(Xa).getCenter(ji),ji.project(en);let hv=(ji.x+1)/2*Io.width+(Io.left-Wt.left),mv=(1-ji.y)/2*Io.height+(Io.top-Wt.top);return{objectId:x,x:Lr(hv+24,tn),y:Lr(mv-re/2,et)}}let yd=typeof le?.screenX=="number"?le.screenX-Wt.left:bn,vd=typeof le?.screenY=="number"?le.screenY-Wt.top:$t;return{objectId:x,x:Lr(yd,tn),y:Lr(vd,et)}},[$r]),hl=_e(x=>{let{objectId:D,action:re,binding:oe}=x;switch(Li(x),re.id){case"toggle-visibility":{let le=D;oe?.modelObjectId&&(le=Wr.byModelObjectId.get(oe.modelObjectId)??le);let vt=ht[le],mt=vt?.visible===!1;vt&&Oo({...ht,[le]:{...vt,visible:mt}});break}case"change-color":er(),ko(null),Po(le=>{let vt=$r(D,oe)??D,mt=le[D]?.hex,en=ht[vt]?.style?.material?.baseColor;return{...le,[D]:{...le[D],hex:mt??en??"#ffffff"}}}),Qs(gd(D,225,250,oe,x));break;case"change-material":er(),ko(gd(D,300,320,oe,x));break;default:break}M?.(x)},[Oo,ht,gd,M,er,$r,Wr]);Ct(()=>{if(Fn)return window.addEventListener("pointerdown",er),()=>window.removeEventListener("pointerdown",er)},[Fn,er]),Ct(()=>{if(!kr)return;let x=()=>ko(null);return window.addEventListener("pointerdown",x),()=>window.removeEventListener("pointerdown",x)},[kr]),Ct(()=>{if(!Va)return;let x=D=>{if(ka.current&&!ka.current.contains(D.target)){if(D.target.closest?.(".ri-annotationMarker"))return;za()}};return document.addEventListener("mousedown",x),document.addEventListener("touchstart",x),()=>{document.removeEventListener("mousedown",x),document.removeEventListener("touchstart",x)}},[Va,za]),Ct(()=>{if(!On)return;let x=D=>{let re=D.target;if(re.closest?.(".ri-annotationPopup")||re.closest?.("button, input, textarea, .ri-measureTools, .ri-xrTools, .ri-buttonContainer"))return;let oe=Bn.current;!oe||!oe.contains(re)||(ll(null),cl({title:"",description:""}))};return document.addEventListener("mousedown",x,!0),document.addEventListener("touchstart",x,!0),()=>{document.removeEventListener("mousedown",x,!0),document.removeEventListener("touchstart",x,!0)}},[On]);let Jh=_e((x,D)=>{let re=Ur.current[x];re&&URL.revokeObjectURL(re),D.startsWith("blob:")?Ur.current[x]=D:delete Ur.current[x],Ha(x,oe=>({...oe,material:{...oe?.material,texture:{path:D}}}))},[Ha]),Qy=x=>{let D=x.target.files?.[0],re=xt.current;if(!D||!re)return;let oe=$r(re);oe&&(b?b(D,oe).then(le=>Jh(oe,le),le=>console.error("onTextureUpload failed:",le)):Jh(oe,URL.createObjectURL(D)),x.target.value="")},Qh=x=>{xt.current=x,Ri.current?.click()},Zh=x=>{let D=$r(x);if(!D)return;Ha(D,oe=>oe?.material?.texture?{...oe,material:{...oe.material,texture:void 0}}:oe);let re=Ur.current[D];re&&(URL.revokeObjectURL(re),delete Ur.current[D])},fd=at(A);fd.current=A;let br=_e(()=>{let x=me.current;!x||!fd.current||fd.current({controls:x,scene:an.current,objectBindings:Me.current,nodeRefs:Kn.current,homeCameraState:mr.current,captureImage:D=>xl(Yn.current,D),invalidate:()=>Yn.current?.invalidate()})},[]),Do=_e(async(x=!1)=>{let D=me.current,re=_o.current??an.current;if(!D||!re)return!1;try{if(x){let oe=(re instanceof ga?re:new ga().setFromObject(re)).getBoundingSphere(new nP),le=oe.center.clone(),mt=D.getPosition(new In).clone().sub(D.getTarget(new In));mt.lengthSq()<1e-6&&mt.set(0,0,1),mt.normalize();let en=Math.max(oe.radius*10,20),Wt=le.clone().add(mt.multiplyScalar(en));await D.setLookAt(Wt.x,Wt.y,Wt.z,le.x,le.y,le.z,!1)}return Di(!0),await Mx(D,()=>D.fitToBox(re,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),await new Promise(oe=>{let le=performance.now(),vt=()=>{D.active===!1||performance.now()-le>8e3?(D.dispatchEvent({type:"update"}),Yn.current?.invalidate(),oe()):(Yn.current?.invalidate(),setTimeout(vt,100))};setTimeout(vt,100)}),_r.current=!0,Ke(),br(),!0}catch(oe){return console.error("Fit scene error:",oe),!1}},[Ke,br]);Ct(()=>{if(_r.current=!1,Bi.current=!1,mr.current=null,an.current=null,_o.current=null,Oa(!1),Da(!1),Ni(!1),al({total:0,missing:0}),U("Loading model..."),se(null),!e){Oi(!1),Di(!0);return}Oi(!0),Di(!!Ee||La.current);let x=!1,D=null,re=le=>{D=setTimeout(oe,le)},oe=()=>{if(x||_r.current||Bi.current)return;let le=_o.current??an.current;if(!me.current||!le){re(100);return}if(Ra.current=kP(le,me.current,E?.maxDistance)??Ra.current,nx(me.current)){_r.current=!0,Ke(),br(),Oi(!1),Di(!0),Yn.current?.invalidate();return}Bi.current=!0,(Ee?Ee():La.current?Promise.resolve(!0):Do(!0)).then(mt=>{_r.current=mt!==!1,_r.current?(Ke(),br(),Oi(!1)):x||re(100)}).catch(()=>{_r.current=!1,x||re(100)}).finally(()=>{Bi.current=!1})};return re(50),()=>{x=!0,D&&clearTimeout(D)}},[Ke,E?.maxDistance,Do,e,br,Ee,t]),Ct(()=>{if(!rt)return;let x=yt;if(!x)return;let D=null,re=new ResizeObserver(()=>{!_r.current||Bi.current||(D&&clearTimeout(D),D=setTimeout(()=>{Do()},150))});return re.observe(x),()=>{re.disconnect(),D&&clearTimeout(D)}},[yt,Do,rt]);let em=_e(x=>{if(zy.current||(Ar(!1),er(),ko(null),Li(null),Bo(x),ft||!ze))return;let D=me.current,re=ci(x),oe=re?Kn.current[re]:null;D&&x.cameraState?.position&&x.cameraState?.target?(D.setPosition(x.cameraState.position[0],x.cameraState.position[1],x.cameraState.position[2],!0),D.setTarget(x.cameraState.target[0],x.cameraState.target[1],x.cameraState.target[2],!0)):D&&oe&&D.fitToBox(oe,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[Bo,er,ci,ft,ze]),tm=_e(x=>{if(Bo(x),ft)return;let D=me.current,re=ci(x),oe=re?Kn.current[re]:null;if(!D||!oe)return;let le=x.cameraState;le?.position&&le?.target?(D.setPosition(le.position[0],le.position[1],le.position[2],!0),D.setTarget(le.target[0],le.target[1],le.target[2],!0)):D.fitToBox(oe,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[Bo,ci,ft]);Ct(()=>{br()},[br]);let nm=_e((x,D)=>{_P(D,Ra.current),P?.(x,D),br()},[br,P]),Zy=_e(x=>{Zs.current=new Set(x.map(D=>D.name)),el(D=>D+1),r?.(x)},[r]),ev=_e(x=>{_o.current=x,Yn.current?.invalidate()},[]),rm=_e(x=>{an.current=x,Gh(x),al(MP(x));let D=Ka(x);ad(D>Ui?D:null),Na(!1),se(null),D>Ui&&U(`Preparing large model (${Math.round(D/1e6)}M triangles) \u2014 the first display can take a while on this device...`),Oa(!0),Da(!1),il(!1),y?.(x),br()},[br,y,Gh]),im=_e(x=>{Oi(!1),Di(!0),Da(!0),k?.(x)},[k]),tv=_e(x=>{x.lengthComputable&&x.total>0&&se(x.loaded/x.total*100),v?.(x)},[v]),om=_e((x,D,re)=>{if(!Y)return;let oe={...Q,lighting:{...Q.lighting,lights:Q.lighting.lights.map(le=>le.id===x?{...le,position:D,...re?{rotation:re}:{}}:le)}};Y(oe)},[Q,Y]);Ct(()=>{let x=an.current;if(!Hr||!x){Ni(!1);return}let D=Object.entries(ht);if(D.length===0){Ni(!1);return}let re=t?Zs.current:new Set(Object.keys(qo(x).nodesById));if(!re||re.size===0){Ni(!1);return}let oe=D.some(([le,vt])=>!re.has(vt.modelObjectId??le));Ni(oe)},[Hr,ht,id,t]);let bd=_e(async()=>{if(Ee){await Ee();return}let x=me.current;if(!x)return;let D=mr.current;try{D?await Mx(x,()=>x.setLookAt(D.position[0],D.position[1],D.position[2],D.target[0],D.target[1],D.target[2],!0)):await Do()}catch(re){console.error("Reset camera error:",re)}},[Ee,Do]),OA=_e(()=>{Ao(!1),Ar(!0)},[]),DA=_e(()=>{Ar(!1)},[]),nv=_e(()=>{Ar(!1),Ao(!0),setTimeout(()=>{bd()},100)},[bd]),rv=_e((x,D)=>{nm(x,D)},[nm]),iv=_e(x=>{let D=_==="scene"&&F==="Annotations";if(x.target.closest("button, input, textarea, .ri-colorPicker, .ri-materialPicker, .ri-annotationPopup, .ri-annotationMarker, .ri-viewAnnotationPopup"))return;let oe=Bn.current,le=me.current,vt=le?.camera,mt=an.current;if(!oe||!le||!vt||!mt||!D&&!le.enabled)return;let en=oe.getBoundingClientRect(),Wt=(x.clientX-en.left)/en.width*2-1,Je=-((x.clientY-en.top)/en.height)*2+1,tn=new tP;tn.setFromCamera(new rP(Wt,Je),vt);let et=tn.intersectObject(mt,!0);if(et.length===0)return;if(!D){let{x:Lr,y:yd,z:vd}=et[0].point;le.setOrbitPoint(Lr,yd,vd);return}let bn=et[0],$t=bn.point,No=mt.worldToLocal(bn.point.clone()),Xa=[0,0,1];if(bn.face){let Lr=bn.face.normal.clone().transformDirection(bn.object.matrixWorld).normalize();Xa=[Lr.x,Lr.y,Lr.z]}ll({worldPosition:[$t.x,$t.y,$t.z],localPosition:[No.x,No.y,No.z],worldNormal:Xa,anchor:wP(bn),screenX:x.clientX-en.left,screenY:x.clientY-en.top}),cl({title:"",description:""})},[_,F]),am=_e(()=>{if(!On||!li.title.trim())return;dl.current+=1;let D={id:dl.current,worldPosition:On.worldPosition,localPosition:On.localPosition,worldNormal:On.worldNormal,anchorNodeName:On.anchor?.anchorNodeName,anchorLocalPosition:On.anchor?.anchorLocalPosition,title:li.title.trim(),description:li.description},re=[...Er,D];zh(re),T?.(re),ll(null)},[On,li,Er,T]),xd=_e(()=>ll(null),[]),ov=_e(x=>{Rr(x)},[Rr]);if(te.status==="checking")return X("div",{className:"ri-viewer ri-viewer--license-checking",children:X(Hi,{title:"Verifying License",message:"Checking your license key..."})});if(te.status==="invalid")return X("div",{className:"ri-viewer ri-viewer--license-invalid",children:X(Hi,{tone:"error",title:"Invalid License",message:te.isLocalDomain?te.reason??"License has been revoked or has expired":"Failed to load. Please contact the site administrator."})});let sm=kr?$r(kr.objectId):null,lm=sm?ht[sm]?.style?.material?.texture?.path:void 0,av=Bn.current?.offsetWidth??600,sv=Bn.current?.offsetHeight??400,lv=350,cv=290,dv=On?Math.min(On.screenX+12,av-lv-8):0,uv=On?Math.min(On.screenY,sv-cv-8):0,pv=xe&&!!e&&!od&&!Hr,Wa=de&&(zi&&(dd||Oh)||Dh||!!sl),$a=x=>16+x*42;return Oe("div",{className:"ri-viewer",style:{background:dt},children:[Oe("div",{className:"ri-viewerLeft",ref:Ks,children:[B?B({isOpen:qh,selectedObject:Yh,currentAction:Jn,onClose:Kh,onAction:hl}):X(Pp,{isOpen:qh,selectedObject:Yh,currentAction:Jn,onClose:Kh,onAction:hl,renderActionExtra:x=>x==="change-color"&&Fn?X(vp,{inline:!0,colorPicker:Fn,onClose:er,itemMaterials:fn,setItemMaterials:Po}):x==="change-material"&&kr?X(Cp,{inline:!0,triggerFileUpload:Qh,materialPopup:kr,textureUrl:lm,clearTexture:Zh}):null}),Oe("div",{className:`ri-canvasArea ${Ua?"ri-canvasArea--measuring":""} ${Ba?"":"ri-canvasArea--positioning"} ${Ie?"ri-canvasArea--moveMode":""}`,ref:Pr,tabIndex:bt?0:void 0,onDoubleClick:iv,onPointerDown:x=>{bt&&Bn.current?.focus({preventScroll:!0}),Gy(x)},onClick:Hy,children:[nl&&!rl&&Oe("div",{className:"ri-bindingsMismatchBanner",children:[X(Fp,{size:14,className:"ri-bindingsMismatchBanner__icon"}),X("span",{children:"Object bindings data don't match this model"}),X("button",{type:"button",className:"ri-bindingsMismatchBanner__dismiss",onClick:x=>{x.stopPropagation(),il(!0)},"aria-label":"Dismiss",children:X(Up,{size:12})})]}),ol!==null&&!sd&&Oe("div",{className:`ri-largeModelBanner ${nl&&!rl?"ri-largeModelBanner--offset":""}`,children:[X(Fp,{size:14,className:"ri-largeModelBanner__icon"}),Oe("span",{children:["Very large model (",Math.round(ol/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."]}),X("button",{type:"button",className:"ri-largeModelBanner__dismiss",onClick:x=>{x.stopPropagation(),Na(!0)},"aria-label":"Dismiss",children:X(Up,{size:12})})]}),Ue.model.renderer==="uv-checker"&&Qn.missing>0&&Oe("div",{className:"ri-uvCheckerBanner",role:"status",children:[X(Fp,{size:14,className:"ri-uvCheckerBanner__icon"}),Oe("span",{children:[Qn.missing===Qn.total?"UV Checker: this model has no UV0 coordinates.":`UV Checker: ${Qn.missing} of ${Qn.total} meshes have no UV0 coordinates.`," ","Missing UVs are shown in magenta."]})]}),X("input",{ref:Ri,type:"file",accept:"image/png,image/jpeg,image/webp",className:"ri-hiddenInput",onChange:Qy}),Oe(eu,{camera:z,backgroundColor:j,shadows:I&&Q.shadows.enabled,sceneConfig:Ue,selectedObjectRef:md,hoveredObjectRef:Ky,highlightOnHover:lt,renderMode:Bt,maxDpr:he,reduceGpuLoad:Mt,xrStore:zi,rendererCaptureRef:Yn,preserveDrawingBuffer:Nt,children:[R??Oe(co,{children:[X(iu,{lightingConfig:Q.lighting,shadowConfig:Q.shadows,shadowsEnabled:I,environmentRotation:Q.environment.rotation,environmentConfig:Q.environment,modelBounds:jy,objectBindings:ht,nodeRefs:Kn}),q&&Q.lighting.lights.map(x=>!x.visible||x.type==="none"||x.type==="hemisphere"||x.attachment?null:X(mx,{light:x,position:x.position,rotation:x.rotation,color:x.color,intensity:x.intensity,visible:x.visible,onPositionChange:D=>om(x.id,D,x.rotation),onRotationChange:D=>om(x.id,x.position,D),onDraggingChange:Fr},x.id))]}),X(tu,{controlsRef:me,onCameraChange:rv,cameraLimits:E,controllerType:Pn,onPointerLockExit:()=>Tr("orbit")}),X(PP,{enabled:Pn==="pointerLock"?!1:Q.model.autoRotate??yn??!1,speed:Q.model.autoRotateSpeed??zt??1,controlsRef:me}),xn&&X(Q2,{alignment:"top-right",margin:[80,80],renderPriority:2,onUpdate:()=>{me.current?.update(0),Yn.current?.invalidate()},children:X(Z2,{axisColors:["#ff3653","#8adb00","#2c8fff"],labelColor:"white"})}),Ie&&md&&fr&&X(Vp,{node:md,space:mn,onTransformChange:Jy,onDraggingChange:x=>{Fr(x),Ga&&f?.(Ga,x)}},fr),X(bl,{onLoadError:im,children:X(J2,{fallback:null,children:(()=>{let x=Oe(co,{children:[t?X(sp,{url:t,rotation:Ue.model.rotation,errorTarget:n,cacheSize:i,decoderConfig:fe,objectBindings:ht,itemMaterials:fn,sceneConfig:Ue,selectedItem:fr,panelHoveredItem:u??_a,highlightOnHover:lt,onItemClick:em,onItemHover:Xh,onObjectCatalog:Zy,onTilesetBounds:ev,onModelLoaded:rm,onLoadError:im,nodeRefsOut:Kn,onNodeRefsChange:Ys,materialRefsOut:Ta,explodeFactor:gr,suspendBindingTransforms:si}):X(xu,{url:e,modelFormat:o,objectBindings:ht,selectedItem:fr,itemMaterials:fn,onItemClick:em,onItemHover:Xh,onModelLoaded:rm,onAnimationsReady:w,nodeRefsOut:Kn,onNodeRefsChange:Ys,materialRefsOut:Ta,panelHoveredItem:u??_a,sceneConfig:Ue,zoomOnSelected:ze,highlightOnHover:lt,decoderConfig:fe,onLoadProgress:tv,explodeFactor:gr,suspendBindingTransforms:si}),X(up,{annotations:Er,sceneConfig:Q,activeAnnotation:Va,popupRef:ka,canvasRootRef:Bn,worldPositionsRef:qn,modelLoaded:Hr,onAnnotationClick:ov,onCloseAnnotation:za,hideCloseButton:ot,showAnnotationOnHover:je}),X(SP,{annotation:pl,enabled:ot,controlsRef:me,offsetRef:Zt}),Ia&&X(hp,{controlsRef:me,sceneRef:an,config:Ia,playing:Ii,resetOnPlay:Py,onFinished:()=>{Ar(!1),Ao(!1)},onUserInteract:()=>{Ar(!1)}}),ie&&X(pp,{points:Fh,unit:Le,box:Uh,showDimensions:ud})]});return zi?X(Vb,{ref:ky,box:Uh,scaleMode:Ze,onARStateChange:Ry,children:x}):x})()})},t??e)]}),X(da,{visible:pv,message:O,progress:J??void 0}),Wa&&Oe("div",{className:"ri-xrTools",style:{top:`${$a(0)}px`},children:[!dd&&Dh&&Oe("button",{type:"button",className:"ri-xrButton",onClick:Ey,title:"View this model in AR with Apple Quick Look",children:[X(wx,{size:16}),"View in AR"]}),sl&&Oe("button",{type:"button",className:"ri-xrButton",onClick:Ay,title:"Open this experience on a phone for AR","aria-haspopup":"dialog","aria-expanded":Nh,children:[X(pP,{size:16}),X("span",{children:"Open on phone"})]}),zi&&dd&&Oe("button",{type:"button",className:"ri-xrButton",onClick:()=>zi.enterAR().catch(x=>{console.error("Failed to enter AR session:",x)}),title:"View this model in your space",children:[X(Sx,{size:16}),X("span",{className:"ri-xrButtonPrefix",children:"Enter"}),X("span",{children:"AR"})]}),zi&&Oh&&Oe("button",{type:"button",className:"ri-xrButton",onClick:()=>zi.enterVR().catch(x=>{console.error("Failed to enter VR session:",x)}),title:"View this model in VR",children:[X(uP,{size:16}),X("span",{className:"ri-xrButtonPrefix",children:"Enter"}),X("span",{children:"VR"})]})]}),_y,Nh&&sl&&X("div",{className:"ri-mobileHandoffBackdrop",onMouseDown:x=>{x.target===x.currentTarget&&Ih()},children:Oe("section",{className:"ri-mobileHandoffDialog",role:"dialog","aria-modal":"true","aria-labelledby":"ri-mobileHandoffTitle",children:[X("button",{type:"button",className:"ri-mobileHandoffClose",onClick:Ih,"aria-label":"Close phone handoff",children:X(Up,{size:18})}),X(Sx,{size:22,"aria-hidden":"true"}),X("h2",{id:"ri-mobileHandoffTitle",children:"View in AR"}),X("p",{children:"Scan the code and choose AR."}),X("div",{className:"ri-mobileHandoffQr",children:X(eP,{value:sl,size:208,level:"M",marginSize:4,title:"QR code to open this model on a phone"})})]})}),we&&X("div",{className:"ri-uvCheckerTools",style:{top:`${$a(Wa?1:0)}px`},children:X("button",{type:"button",className:`ri-measureButton ${ct?"ri-measureButton--active":""}`,onClick:()=>pt(x=>!(x??Ve)),title:ct?"Disable UV checker":"Enable UV checker","aria-label":ct?"Disable UV checker":"Enable UV checker","aria-pressed":ct,children:X(xP,{size:16})})}),ie&&Oe("div",{className:"ri-measureTools",style:{top:`${$a((Wa?1:0)+(we?1:0))}px`},children:[X("button",{type:"button",className:`ri-measureButton ${Ua?"ri-measureButton--active":""}`,onClick:Fy,title:Ua?"Stop measuring":"Measure distance","aria-pressed":Ua,children:X(fP,{size:16})}),X("button",{type:"button",className:`ri-measureButton ${ud?"ri-measureButton--active":""}`,onClick:Uy,title:"Toggle bounding dimensions","aria-pressed":ud,children:X(bP,{size:16})}),Fh.length>0&&X("button",{type:"button",className:"ri-measureButton",onClick:Vy,title:"Clear measurements",children:X(aP,{size:16})}),Ua&&X("span",{className:"ri-measureHint",children:"Click points on the model to measure"})]}),Pe&&Oe("div",{className:"ri-explodeTools",style:{top:`${$a((Wa?1:0)+(we?1:0)+(ie?1:0))}px`},children:[X("button",{type:"button",className:`ri-measureButton ${ld||gr>0?"ri-measureButton--active":""}`,onClick:()=>Bh(x=>!x),title:"Exploded view","aria-pressed":ld,children:X(hP,{size:16})}),ld&&X("div",{className:"ri-explodeSlider",onPointerDown:x=>x.stopPropagation(),children:X("input",{type:"range",min:0,max:100,value:Math.round(gr*100),onChange:x=>Lh(Number(x.target.value)/100),"aria-label":"Explode amount"})})]}),Ia&&Oe("div",{className:"ri-cinematicTools",style:{top:`${$a((Wa?1:0)+(we?1:0)+(ie?1:0)+(Pe?1:0))}px`},children:[X("button",{type:"button",className:`ri-measureButton ${Ii?"ri-measureButton--active":""}`,onClick:()=>{Ii?Ar(!1):(Ao(!1),Ar(!0))},title:Ii?"Pause cinematic":"Play cinematic","aria-pressed":Ii,children:Ii?X(gP,{size:16}):X(mP,{size:16})}),Ii&&X("button",{type:"button",className:"ri-measureButton ri-measureButton--stop",onClick:nv,title:"Stop cinematic and reset camera",children:X(Cx,{size:16})})]}),(pe||ae||Ot&&Vt.length>0)&&Oe("div",{className:"ri-buttonContainer",children:[X("div",{className:"ri-tourControls",children:Ot&&Vt.length>0&&X(co,{children:ot?Oe(co,{children:[Oe("button",{className:"ri-tourButton",onClick:Oy,disabled:Vh||Vt.length===0||Zn<=0,title:"Previous annotation",children:[X(cP,{size:16}),X("span",{children:"Prev"})]}),X("button",{className:"ri-tourButton ri-tourButton--stop",onClick:Ny,title:"Stop guided tour",children:X(Cx,{size:16})}),Oe("button",{className:"ri-tourButton ri-tourButton--next",onClick:Dy,disabled:Vh||Vt.length===0,title:"Next annotation",children:[X("span",{children:"Next"}),X(dP,{size:16})]})]}):X("button",{className:"ri-navButtonSingle",onClick:By,disabled:Vt.length===0,title:"Start guided tour",children:"Guided Tour"})})}),Oe("div",{className:"mv-rightControls",children:[pe&&X("button",{className:"mv-resetButton",onClick:bd,title:"Reset camera view",children:X(lP,{})}),Oe("div",{className:"mv-controllersWrapper",onPointerDown:x=>x.stopPropagation(),children:[gn&&Oe("div",{className:"mv-controllersMenu",children:[X("button",{type:"button",className:`mv-controllersMenuItem ${Pn==="orbit"?"mv-controllersMenuItem--active":""}`,onClick:()=>Tr("orbit"),children:"Orbit Control"}),X("button",{type:"button",className:`mv-controllersMenuItem ${Pn==="pointerLock"?"mv-controllersMenuItem--active":""}`,onClick:()=>Tr("pointerLock"),children:"Point Lock"})]}),X("button",{className:"mv-controllersButton",onClick:()=>on(x=>!x),title:"Camera controller","aria-label":"Camera controller settings",children:X(yP,{size:15})})]}),ae&&Oe("div",{className:"mv-downloadWrapper",onPointerDown:x=>x.stopPropagation(),children:[Wy&&Oe("div",{className:"mv-downloadMenu",children:[Oe("button",{className:"mv-downloadMenuItem",onClick:Xy,disabled:pd||!an.current,children:[X(wx,{size:14}),"Download GLB"]}),X("div",{className:"mv-downloadMenuDivider"}),Nt&&Oe(co,{children:[Oe("button",{className:"mv-downloadMenuItem",onClick:qy,disabled:!an.current,children:[X(iP,{size:14}),"Download PNG"]}),X("div",{className:"mv-downloadMenuDivider"})]}),Oe("button",{className:"mv-downloadMenuItem",onClick:Yy,disabled:!an.current,children:[X(sP,{size:14}),"Download UV Layout"]}),Hh&&X("div",{className:"mv-downloadMenuNotice",role:"status","aria-live":"polite",children:Hh})]}),X("button",{className:"mv-downloadButton",onClick:$y,disabled:pd||!an.current,title:"Download options",children:pd?Oe(co,{children:[X("span",{className:"mv-downloadButton__spinner"}),"Exporting\u2026"]}):Oe(co,{children:[X(oP,{size:15}),"Download"]})})]})]})]}),On&&Oe("div",{className:"ri-annotationPopup",style:{left:dv,top:uv},onPointerDown:x=>x.stopPropagation(),onClick:x=>x.stopPropagation(),children:[X("input",{autoFocus:!0,className:"ri-annotationInput",placeholder:"Title *",value:li.title,onChange:x=>cl(D=>({...D,title:x.target.value})),onKeyDown:x=>{x.key==="Enter"&&am(),x.key==="Escape"&&xd()}}),X("textarea",{className:"ri-annotationTextarea",placeholder:"Description",value:li.description,onChange:x=>cl(D=>({...D,description:x.target.value})),onKeyDown:x=>{x.key==="Escape"&&xd()},rows:5}),Oe("div",{className:"ri-annotationActions",children:[X("button",{onClick:am,className:`ri-annotationOkBtn ${li.title.trim()?"":"disabled"}`,disabled:!li.title.trim(),children:"OK"}),X("button",{onClick:xd,className:"ri-annotationCancelBtn",children:"Cancel"}),X("div",{className:"ri-annotationIcons"})]})]})]}),B&&Fn&&X(vp,{colorPicker:Fn,onClose:er,itemMaterials:fn,setItemMaterials:Po}),B&&kr&&X(Cp,{triggerFileUpload:Qh,materialPopup:kr,textureUrl:lm,clearTexture:Zh})]}),H&&X("div",{className:"ri-viewerRight",children:G?G({objectBindings:ht,onAction:hl,onFocus:tm,onHover:Js}):X(kp,{objectBindings:ht,onAction:hl,onFocus:tm,onHover:Js})}),Te&&X(Jb,{controlsRef:me,enabled:!0,opacity:St,moveSensitivity:st,position:ye})]})}import{useCallback as Dt,useEffect as wo,useMemo as yh,useRef as rn,useState as Xe}from"react";import{Redo2 as ey,Undo2 as ty,Upload as ny,ListRestart as ry,X as T_,AlertTriangle as P_}from"lucide-react";import{useCallback as zn,useRef as fa,useState as _x}from"react";import{Vector3 as Ax}from"three";function Ex(e){return[e.x,e.y,e.z]}function Mi(e,t){let n=new Ax,i=new Ax;return t.getPosition(n),t.getTarget(i),{position:Ex(n),target:Ex(i),fov:"fov"in e&&typeof e.fov=="number"?e.fov:null,zoom:"zoom"in e&&typeof e.zoom=="number"?e.zoom:1,azimuthAngle:t.azimuthAngle,polarAngle:t.polarAngle}}function AP(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 Vs(e,t,n=.6){let i=e.smoothTime;e.smoothTime=n;try{return await t()}finally{e.smoothTime=i}}function Gp(e={}){let t=fa(e);t.current=e;let n=fa(null),[i,r]=_x(null),[o,a]=_x(()=>({...e.presets})),s=fa(o);s.current=o;let c=zn(w=>{r(T=>AP(T,w)?T:w)},[]),l=zn((w,T)=>{c(Mi(w,T))},[c]),u=fa(null),d=fa(null),h=fa(null),g=zn(w=>{n.current=w;let T=Mi(w.controls.camera,w.controls);c(T),w.scene!==d.current&&(d.current=w.scene,u.current=null,h.current=null),w.homeCameraState&&!u.current&&(u.current=w.homeCameraState);let{initialPosition:S,initialTarget:N,initialTransition:R=!1}=t.current;if((S||N)&&w.scene&&(S||w.homeCameraState)&&h.current!==w.controls){h.current=w.controls,w.homeCameraState||ua(w.controls);let z=S??T.position,E=N??T.target;w.controls.setLookAt(z[0],z[1],z[2],E[0],E[1],E[2],R).then(()=>{if(n.current?.controls!==w.controls)return;let j=Mi(w.controls.camera,w.controls);u.current={position:j.position,target:j.target},c(j)}).catch(()=>{})}},[c]),f=zn(async()=>{let w=n.current,T=w?.controls;if(!T)return!1;try{let S=u.current;return S?await Vs(T,()=>T.setLookAt(S.position[0],S.position[1],S.position[2],S.target[0],S.target[1],S.target[2],!0)):w?.scene?await Vs(T,()=>T.fitToBox(w.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})):await Vs(T,()=>T.reset(!0)),!0}catch{return!1}},[]),y=zn(async()=>{let w=n.current;if(!w?.controls||!w.scene)return!1;try{return await Vs(w.controls,()=>w.controls.fitToBox(w.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),k=zn(async w=>{let T=n.current;if(!T?.controls)return!1;let S=vn(T.objectBindings,w);if(!S)return!1;let N=T.nodeRefs[S];if(!N)return!1;try{return await Vs(T.controls,()=>T.controls.fitToBox(N,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),v=zn(async(w,T=!0)=>{let S=n.current?.controls;if(!S)return!1;try{return n.current?.homeCameraState||ua(S),await S.setTarget(w[0],w[1],w[2],T),c(Mi(S.camera,S)),!0}catch{return!1}},[c]),p=zn(async(w,T=!0)=>{let S=n.current?.controls;if(!S)return!1;try{n.current?.homeCameraState||ua(S);let N=[S.setLookAt(w.position[0],w.position[1],w.position[2],w.target[0],w.target[1],w.target[2],T)];w.azimuthAngle!=null&&w.polarAngle!=null&&N.push(S.rotateTo(w.azimuthAngle,w.polarAngle,T)),await Promise.all(N);let R=S.camera,z=!1;return w.fov!=null&&"fov"in R&&typeof R.fov=="number"&&(R.fov=w.fov,z=!0),w.zoom!=null&&"zoom"in R&&typeof R.zoom=="number"&&(R.zoom=w.zoom,z=!0),z&&"updateProjectionMatrix"in R&&R.updateProjectionMatrix(),c(Mi(R,S)),!0}catch{return!1}},[c]),m=zn((w,T=!0)=>p(w,T),[p]),M=zn((w,T,S=!0)=>p({position:w,target:T},S),[p]),C=zn(async(w,T,S=!0)=>{let N=n.current?.controls;if(!N)return!1;try{return n.current?.homeCameraState||ua(N),await N.rotateTo(w,T,S),c(Mi(N.camera,N)),!0}catch{return!1}},[c]),P=zn(async(w,T=!0)=>{let S=n.current?.controls;if(!S)return!1;try{return n.current?.homeCameraState||ua(S),await S.dollyTo(w,T),c(Mi(S.camera,S)),!0}catch{return!1}},[c]),A=zn(w=>{let T=n.current?.controls,S=w.trim();if(!T||!S)return null;let N=Mi(T.camera,T);return s.current={...s.current,[S]:N},a(R=>({...R,[S]:N})),c(N),N},[c]),b=zn((w,T=!0)=>{let S=s.current[w];return S?p(S,T):Promise.resolve(!1)},[p]);return{cameraState:i,cameraPresets:o,resetView:f,focusObject:k,fitScene:y,setCameraTarget:v,setCameraState:m,lookAt:M,orbitTo:C,dollyTo:P,savePreset:A,goToPreset:b,handleCameraChange:l,handleViewerReady:g}}import{useCallback as ba,useEffect as EP,useRef as Rx,useState as uo}from"react";function Hp(){let e=Rx(null),[t,n]=uo([]),i=Rx(null),[r,o]=uo([]),[a,s]=uo(null),[c,l]=uo(!1),[u,d]=uo(1),[h,g]=uo(0),[f,y]=uo(0);EP(()=>()=>{i.current?.()},[]);let k=ba(P=>{i.current?.(),e.current=P,n(P.clips),o(P.clipDetails??P.clips.map(b=>({sourceName:b,duration:0})));let A=P.getState?.()??{currentClip:null,isPlaying:!1,speed:1,time:0,duration:0};s(A.currentClip),l(A.isPlaying),d(A.speed),g(A.time),y(A.duration),P.subscribe?i.current=P.subscribe(b=>{s(b.currentClip),l(b.isPlaying),d(b.speed),g(b.time),y(b.duration)}):i.current=null},[]),v=ba(P=>{e.current?.play(P),s(P),l(!0)},[]),p=ba(()=>{e.current?.pause(),l(!1)},[]),m=ba(()=>{e.current?.stop(),s(null),l(!1),g(0)},[]),M=ba(P=>{e.current?.setSpeed(P),d(P)},[]),C=ba(P=>{e.current?.seek?.(P),g(P)},[]);return{clips:t,clipDetails:r,currentClip:a,isPlaying:c,speed:u,time:h,duration:f,play:v,pause:p,stop:m,setSpeed:M,seek:C,handleAnimationsReady:k}}import{useState as Pk,useEffect as kk}from"react";import{useState as VP}from"react";import{ChevronDown as FP,ChevronLeft as UP,ChevronRight as GP,RotateCcw as HP}from"lucide-react";import{HexColorInput as WP,HexColorPicker as $P}from"react-colorful";import{useLayoutEffect as Bx,useRef as Wp,useState as $p}from"react";import{createPortal as LP}from"react-dom";import{ChevronDown as BP,Info as OP}from"lucide-react";import{HexColorInput as DP,HexColorPicker as NP}from"react-colorful";function xa(e){let t=e.replace("#","").match(/.{2}/g).map(i=>parseInt(i,16)/255).map(i=>i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4));return .2126*t[0]+.7152*t[1]+.0722*t[2]>.179?"#000":"#fff"}import{useEffect as RP}from"react";function Lx(e,t,n){RP(()=>{if(!n)return;let i=Array.isArray(e)?e:[e],r=o=>{let a=o.target;i.some(c=>c.current?.contains(a))||t()};return document.addEventListener("pointerdown",r,!0),()=>{document.removeEventListener("pointerdown",r,!0)}},[e,t,n])}import{jsx as He,jsxs as En}from"react/jsx-runtime";function Xp({anchorRef:e,onClose:t,children:n}){let i=Wp(null),[r,o]=$p(null);return Lx([i,e],t,!0),Bx(()=>{let a=e.current;if(!a)return;let s=a.getBoundingClientRect(),c=222,l=8,u=Math.min(Math.max(s.right-c,l),window.innerWidth-c-l),d=Math.min(s.bottom+6,window.innerHeight-200);o({top:d,left:u})},[e]),r?LP(He("div",{ref:i,className:"se-colorPickerPopover",style:{position:"fixed",top:r.top,left:r.left},children:n}),document.body):null}function IP(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").replace(/\s+/g," ").trim().replace(/\b\w/g,t=>t.toUpperCase())}function po({title:e,children:t}){return En("section",{className:"se-section",children:[He("h3",{className:"se-sectionTitle",children:e}),He("div",{className:"se-sectionBody",children:t})]})}function We({title:e,open:t,onToggle:n,trailing:i,children:r,disabled:o,tooltip:a}){let s=a?`${a}`:e;return En("section",{className:"se-panel",children:[En("button",{type:"button",className:"se-panelHeader",onClick:n,"aria-expanded":t,title:s,children:[En("span",{className:"se-panelHeaderMain",children:[He(BP,{size:16,className:`se-panelChevron ${t?"se-panelChevron--open":""}`}),He("span",{className:"se-panelTitle",children:e}),a?He("span",{className:"se-panelHelp",title:s,"aria-label":s,role:"img",onClick:c=>c.stopPropagation(),children:He(OP,{size:13})}):null]}),i?He("span",{className:"se-panelTrailing",onClick:c=>c.stopPropagation(),children:i}):null]}),t?He("div",{className:"se-panelBody",style:o?{opacity:.45,pointerEvents:"none"}:void 0,children:r}):null]})}function Qe({checked:e,onChange:t,label:n}){return En("label",{className:"se-switch","aria-label":n,children:[He("input",{type:"checkbox",checked:e,onChange:i=>t(i.target.checked)}),He("span",{className:"se-switchTrack",children:He("span",{className:"se-switchThumb"})})]})}function W({label:e,value:t,min:n,max:i,step:r,formatValue:o,onChange:a,disabled:s=!1}){return En("label",{className:`se-field ${s?"se-field--disabled":""}`,children:[En("span",{className:"se-fieldLabel",children:[e,He("span",{className:"se-fieldValue",children:o?o(t):t})]}),He("input",{className:"se-slider",type:"range",min:n,max:i,step:r,value:t,onChange:c=>a(Number(c.target.value)),disabled:s})]})}function tt({label:e,checked:t,onChange:n}){return En("label",{className:"se-field se-fieldInline",children:[He("span",{className:"se-fieldLabel",children:e}),He("input",{type:"checkbox",className:"se-checkbox",checked:t,onChange:i=>n(i.target.checked)})]})}function Hn({label:e,value:t,options:n,onChange:i}){return En("label",{className:"se-field se-fieldInline",children:[He("span",{className:"se-fieldLabel",children:e}),He("select",{className:"se-select",value:t,onChange:r=>i(r.target.value),children:n.map(r=>He("option",{value:r,children:IP(r)},r))})]})}function sr({label:e,value:t,onChange:n}){let[i,r]=$p(!1),o=Wp(null);return En("div",{className:"se-field",children:[En("div",{className:"se-fieldInline",children:[He("span",{className:"se-fieldLabel",children:e}),He("span",{ref:o,style:{display:"inline-flex"},children:He(DP,{prefixed:!0,className:"se-swatch",onClick:()=>r(a=>!a),style:{background:t,color:xa(t)},color:t,onChange:n})})]}),i?He(Xp,{anchorRef:o,onClose:()=>r(!1),children:He(NP,{color:t,onChange:n})}):null]})}function Ox({value:e,min:t,max:n,step:i,onChange:r}){let[o,a]=$p(String(e)),s=Wp(!1);return Bx(()=>{s.current||a(String(e))},[e]),He("input",{type:"number",className:"se-numberInput",min:t,max:n,step:i,value:o,onFocus:()=>{s.current=!0},onChange:c=>{let l=c.target.value;a(l),l!==""&&l!=="-"&&!Number.isNaN(Number(l))&&r(Number(l))},onBlur:()=>{s.current=!1,a(String(e))}})}function Ti({label:e,value:t,min:n,max:i,step:r,onChange:o}){return En("div",{className:"se-field",children:[He("span",{className:"se-fieldLabel",children:e}),He("div",{className:"se-vectorRow",children:["X","Y","Z"].map((s,c)=>En("label",{className:"se-vectorAxis",children:[He("span",{children:s}),He(Ox,{value:t[c],min:n,max:i,step:r,onChange:l=>{let u=[...t];u[c]=l,o(u)}})]},s))})]})}function ho({label:e,value:t,min:n,max:i,step:r,onChange:o}){return En("div",{className:"se-field",children:[He("span",{className:"se-fieldLabel",children:e}),He("div",{className:"se-vectorRow",children:["X","Y"].map((s,c)=>En("label",{className:"se-vectorAxis",children:[He("span",{children:s}),He(Ox,{value:t[c],min:n,max:i,step:r,onChange:l=>{let u=[...t];u[c]=l,o(u)}})]},s))})]})}var Dx={free:0,starter:1,growth:2};function Nx(e){return e==="starter"||e==="growth"||e==="scale"?e==="scale"?"growth":e:"free"}function ai(e,t){return Dx[e]>=Dx[t]}var Ix={free:"Free",starter:"Starter",growth:"Growth"};import{Lock as zP}from"lucide-react";import{jsx as jP,jsxs as zx}from"react/jsx-runtime";function jn({requiredTier:e,feature:t}){return zx("div",{className:"bb-tierLock",children:[jP(zP,{size:16}),zx("p",{className:"bb-tierLockMessage",children:[t," requires the ",Ix[e]," plan or higher."]})]})}import{Fragment as qp,jsx as ce,jsxs as Gt}from"react/jsx-runtime";var XP=["lit","unlit","normals"],qP=["color","image","environment"];function jx(e){let t=e%360;return t<0?t+360:t}function Fs({title:e,open:t,onToggle:n,children:i,trailing:r}){return Gt("section",{className:"se-panel",children:[Gt("button",{type:"button",className:"se-panelHeader",onClick:n,"aria-expanded":t,children:[Gt("span",{className:"se-panelHeaderMain",children:[ce(FP,{size:16,className:`se-panelChevron ${t?"se-panelChevron--open":""}`}),ce("span",{className:"se-panelTitle",children:e})]}),r?ce("span",{className:"se-panelTrailing",onClick:o=>o.stopPropagation(),children:r}):null]}),t?ce("div",{className:"se-panelBody",children:i}):null]})}function Yp({config:e,onChange:t}){let{model:n,camera:i,wireframe:r,background:o,environment:a}=e,{tier:s}=ir(),c=ai(s,"starter"),[l,u]=VP({general:!0,camera:!0,autoRotate:!1,wireframe:!1,background:!1}),d=p=>u(m=>({...m,[p]:!m[p]})),h=p=>t({...e,model:p}),g=p=>t({...e,camera:p}),f=p=>t({...e,wireframe:p}),y=p=>t({...e,background:p}),k=p=>t({...e,environment:p}),v=p=>{k({...a,source:"preset",preset:p})};return Gt("div",{className:"se-generalContent",children:[Gt(Fs,{title:"General",open:l.general,onToggle:()=>d("general"),children:[Gt("div",{className:"se-field",children:[Gt("div",{className:"se-fieldLabel",children:[ce("span",{children:"Straighten model"}),ce("button",{type:"button",className:"se-iconButton",onClick:()=>h({...n,rotation:[0,0,0]}),"aria-label":"Reset model rotation",children:ce(HP,{size:16})})]}),ce("div",{className:"se-axisStepperGrid",children:["X","Y","Z"].map((p,m)=>Gt("div",{className:"se-axisStepper",children:[ce("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let M=[...n.rotation];M[m]=jx(M[m]-90),h({...n,rotation:M})},"aria-label":`Rotate ${p} axis backward`,children:ce(UP,{size:16})}),ce("span",{className:"se-axisStepperLabel",children:p}),ce("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let M=[...n.rotation];M[m]=jx(M[m]+90),h({...n,rotation:M})},"aria-label":`Rotate ${p} axis forward`,children:ce(GP,{size:16})})]},p))})]}),ce(Ti,{label:"Rotation",value:n.rotation,min:0,max:360,step:1,onChange:p=>h({...n,rotation:p})}),Gt("div",{className:"se-field",children:[ce("span",{className:"se-fieldLabel",children:"Renderer"}),ce("div",{className:"se-segmentedControl se-segmentedControl--renderer",children:dm.map(p=>ce("button",{type:"button",className:`se-segmentedOption ${n.renderer===p?"se-segmentedOption--active":""}`,onClick:()=>h({...n,renderer:p}),children:p==="uv-checker"?"UV CHECKER":p.toUpperCase()},p))})]}),ce(Hn,{label:"Shading",value:n.shading,options:XP,onChange:p=>h({...n,shading:p})})]}),ce(Fs,{title:"Camera",open:l.camera,onToggle:()=>d("camera"),children:ce(W,{label:"Field Of View",value:i.fieldOfView,min:20,max:100,step:.1,formatValue:p=>`${p.toFixed(3)}\xB0`,onChange:p=>g({...i,fieldOfView:p})})}),ce(Fs,{title:"Auto Rotate",open:l.autoRotate,onToggle:()=>d("autoRotate"),trailing:Gt("label",{className:"se-switch","aria-label":"Toggle auto rotate",children:[ce("input",{type:"checkbox",checked:n.autoRotate??!1,onChange:p=>h({...n,autoRotate:p.target.checked})}),ce("span",{className:"se-switchTrack",children:ce("span",{className:"se-switchThumb"})})]}),children:n.autoRotate?ce(W,{label:"Rotation Speed",value:n.autoRotateSpeed??1,min:.1,max:3,step:.1,formatValue:p=>`${p.toFixed(1)}x`,onChange:p=>h({...n,autoRotateSpeed:p})}):ce("div",{className:"se-placeholder",children:"Enable auto rotate to adjust its speed."})}),ce(Fs,{title:"Wireframe",open:l.wireframe,onToggle:()=>d("wireframe"),trailing:Gt("label",{className:"se-switch","aria-label":"Toggle wireframe preview",children:[ce("input",{type:"checkbox",checked:c&&r.enabled,disabled:!c,onChange:p=>f({...r,enabled:p.target.checked})}),ce("span",{className:"se-switchTrack",children:ce("span",{className:"se-switchThumb"})})]}),children:c?Gt(qp,{children:[ce(W,{label:"Opacity",value:r.opacity,min:0,max:1,step:.01,onChange:p=>f({...r,opacity:p})}),ce(sr,{label:"Wire color",value:r.color,onChange:p=>f({...r,color:p})})]}):ce(jn,{requiredTier:"starter",feature:"Wireframe preview"})}),ce(Fs,{title:"Background",open:l.background,onToggle:()=>d("background"),trailing:Gt("label",{className:"se-switch","aria-label":"Toggle scene background",children:[ce("input",{type:"checkbox",checked:o.enabled,onChange:p=>y({...o,enabled:p.target.checked})}),ce("span",{className:"se-switchTrack",children:ce("span",{className:"se-switchThumb"})})]}),children:o.enabled?Gt(qp,{children:[Gt("div",{className:"se-field",children:[ce("span",{className:"se-fieldLabel",children:"Background type"}),ce("div",{className:"se-segmentedControl",children:qP.map(p=>ce("button",{type:"button",className:`se-segmentedOption ${o.type===p?"se-segmentedOption--active":""}`,onClick:()=>y({...o,type:p}),children:p},p))})]}),o.type==="environment"?c?Gt(qp,{children:[Gt("div",{className:"se-field",children:[ce("span",{className:"se-fieldLabel",children:"Environment source"}),Gt("div",{className:"se-segmentedControl",children:[ce("button",{type:"button",className:`se-segmentedOption ${a.source==="preset"?"se-segmentedOption--active":""}`,onClick:()=>k({...a,source:"preset"}),children:"PRESET"}),ce("button",{type:"button",className:`se-segmentedOption ${a.source==="custom"?"se-segmentedOption--active":""}`,onClick:()=>k({...a,source:"custom"}),children:"CUSTOM"})]})]}),a.source==="preset"?ce(Hn,{label:"Environment preset",value:a.preset,options:um,onChange:v}):Gt("label",{className:"se-field",children:[ce("span",{className:"se-fieldLabel",children:"Custom environment URL"}),ce("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/environment.hdr",value:a.customEnvironmentUrl,onChange:p=>k({...a,customEnvironmentUrl:p.target.value})}),ce("span",{className:"bb-note",children:"Enter a HDR, EXR, JPG, JPEG, PNG, or WEBP URL."}),a.customEnvironmentUrl.trim()&&!ml(a.customEnvironmentUrl)?ce("span",{className:"bb-note",style:{color:"#fca5a5"},children:"Invalid image/HDRI URL."}):null]}),ce(W,{label:"Environment intensity",value:a.intensity,min:0,max:3,step:.05,onChange:p=>k({...a,intensity:p})})]}):ce(jn,{requiredTier:"starter",feature:"Environment backgrounds"}):null,o.type==="image"?Gt("label",{className:"se-field",children:[ce("span",{className:"se-fieldLabel",children:"Background image URL"}),ce("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/background.jpg",value:o.imageUrl,onChange:p=>y({...o,imageUrl:p.target.value})})]}):null,o.type==="color"?Gt("div",{className:"se-field",children:[ce("span",{className:"se-fieldLabel",children:"Background color"}),ce("div",{className:"se-inlineColorPicker",children:ce($P,{color:o.color,onChange:p=>y({...o,color:p})})}),ce("div",{className:"se-fieldInline",children:ce(WP,{prefixed:!0,className:"se-swatch",style:{background:o.color,color:xa(o.color)},color:o.color,onChange:p=>y({...o,color:p})})})]}):null]}):ce("div",{className:"se-placeholder",children:"Background rendering is disabled for this scene preset."})})]})}import{useState as KP}from"react";import{jsx as ue,jsxs as Us}from"react/jsx-runtime";function Vx({pp:e,set:t,open:n,toggle:i}){let{ssao:r}=e;return Us(We,{title:"SSAO",tooltip:"Adds soft contact shadows in corners, creases, and tight spaces.",open:n.ssao,onToggle:()=>i("ssao"),disabled:!r.enabled,trailing:ue(Qe,{checked:r.enabled,onChange:o=>t("ssao",{...r,enabled:o}),label:"Toggle SSAO"}),children:[ue(W,{label:"Samples",value:r.samples,min:1,max:64,step:1,onChange:o=>t("ssao",{...r,samples:o})}),ue(W,{label:"Rings",value:r.rings,min:1,max:12,step:1,onChange:o=>t("ssao",{...r,rings:o})}),ue(W,{label:"Intensity",value:r.intensity,min:0,max:20,step:.5,onChange:o=>t("ssao",{...r,intensity:o})}),ue(W,{label:"Radius",value:r.radius,min:.01,max:1,step:.01,onChange:o=>t("ssao",{...r,radius:o})}),ue(W,{label:"Bias",value:r.bias,min:0,max:.1,step:.001,onChange:o=>t("ssao",{...r,bias:o})}),ue(W,{label:"Luminance Influence",value:r.luminanceInfluence,min:0,max:1,step:.01,onChange:o=>t("ssao",{...r,luminanceInfluence:o})}),ue(W,{label:"Fade",value:r.fade,min:0,max:.1,step:.001,onChange:o=>t("ssao",{...r,fade:o})}),ue(W,{label:"Min Radius Scale",value:r.minRadiusScale,min:0,max:1,step:.01,onChange:o=>t("ssao",{...r,minRadiusScale:o})}),ue(W,{label:"World Distance Threshold",value:r.worldDistanceThreshold,min:0,max:100,step:.1,onChange:o=>t("ssao",{...r,worldDistanceThreshold:o})}),ue(W,{label:"World Distance Falloff",value:r.worldDistanceFalloff,min:0,max:20,step:.1,onChange:o=>t("ssao",{...r,worldDistanceFalloff:o})}),ue(W,{label:"World Proximity Threshold",value:r.worldProximityThreshold,min:0,max:100,step:.1,onChange:o=>t("ssao",{...r,worldProximityThreshold:o})}),ue(W,{label:"World Proximity Falloff",value:r.worldProximityFalloff,min:0,max:20,step:.1,onChange:o=>t("ssao",{...r,worldProximityFalloff:o})})]})}function Fx({pp:e,set:t,open:n,toggle:i}){let{autofocus:r}=e;return Us(We,{title:"Auto focus",tooltip:"Keeps the focus plane tracking a subject so the image stays sharp where you want it.",open:n.autofocus,onToggle:()=>i("autofocus"),disabled:!r.enabled,trailing:ue(Qe,{checked:r.enabled,onChange:o=>t("autofocus",{...r,enabled:o}),label:"Toggle Autofocus"}),children:[ue(W,{label:"Focus Distance",value:r.focusDistance,min:0,max:50,step:.1,onChange:o=>t("autofocus",{...r,focusDistance:o})}),ue(W,{label:"Focus Range",value:r.focusRange,min:.1,max:50,step:.1,onChange:o=>t("autofocus",{...r,focusRange:o})}),ue(W,{label:"Focal Length",value:r.focalLength,min:0,max:1,step:.01,onChange:o=>t("autofocus",{...r,focalLength:o})}),ue(W,{label:"Bokeh Scale",value:r.bokehScale,min:0,max:20,step:.1,onChange:o=>t("autofocus",{...r,bokehScale:o})}),ue(Ti,{label:"Target",value:r.target,min:-100,max:100,step:.1,onChange:o=>t("autofocus",{...r,target:o})}),ue(tt,{label:"Mouse Follow",checked:r.mouse,onChange:o=>t("autofocus",{...r,mouse:o})}),ue(tt,{label:"Manual Update",checked:r.manual,onChange:o=>t("autofocus",{...r,manual:o})}),ue(W,{label:"Debug",value:r.debug,min:0,max:1,step:.01,onChange:o=>t("autofocus",{...r,debug:o})}),ue(W,{label:"Smooth Time",value:r.smoothTime,min:0,max:2,step:.01,onChange:o=>t("autofocus",{...r,smoothTime:o})})]})}function Ux({pp:e,set:t,open:n,toggle:i}){let{godRays:r}=e;return Us(We,{title:"God Rays",tooltip:"Creates light shafts that streak outward from a bright sun or light source.",open:n.godRays,onToggle:()=>i("godRays"),disabled:!r.enabled,trailing:ue(Qe,{checked:r.enabled,onChange:o=>t("godRays",{...r,enabled:o}),label:"Toggle GodRays"}),children:[ue(Ti,{label:"Sun Position",value:r.sunPosition,min:-100,max:100,step:.1,onChange:o=>t("godRays",{...r,sunPosition:o})}),ue(W,{label:"Samples",value:r.samples,min:1,max:128,step:1,onChange:o=>t("godRays",{...r,samples:o})}),ue(W,{label:"Density",value:r.density,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,density:o})}),ue(W,{label:"Decay",value:r.decay,min:0,max:1,step:.01,onChange:o=>t("godRays",{...r,decay:o})}),ue(W,{label:"Weight",value:r.weight,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,weight:o})}),ue(W,{label:"Exposure",value:r.exposure,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,exposure:o})}),ue(W,{label:"Clamp Max",value:r.clampMax,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,clampMax:o})}),ue(tt,{label:"Blur",checked:r.blur,onChange:o=>t("godRays",{...r,blur:o})}),ue(Hn,{label:"Kernel Size",value:r.kernelSize,options:qa,onChange:o=>t("godRays",{...r,kernelSize:o})})]})}function Gx({pp:e,set:t,open:n,toggle:i}){let{lensflare:r}=e;return Us(We,{title:"Lens Flare",tooltip:"Adds camera flare artifacts and glow from a bright light source.",open:n.lensflare,onToggle:()=>i("lensflare"),disabled:!r.enabled,trailing:ue(Qe,{checked:r.enabled,onChange:o=>t("lensflare",{...r,enabled:o}),label:"Toggle Lensflare"}),children:[ue(Ti,{label:"Lens Position",value:r.lensPosition,min:-100,max:100,step:.1,onChange:o=>t("lensflare",{...r,lensPosition:o})}),ue(W,{label:"Smooth Time",value:r.smoothTime,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,smoothTime:o})}),ue(W,{label:"Glare Size",value:r.glareSize,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,glareSize:o})}),ue(W,{label:"Flare Size",value:r.flareSize,min:0,max:.1,step:.001,onChange:o=>t("lensflare",{...r,flareSize:o})}),ue(W,{label:"Flare Speed",value:r.flareSpeed,min:0,max:.2,step:.001,onChange:o=>t("lensflare",{...r,flareSpeed:o})}),ue(W,{label:"Flare Shape",value:r.flareShape,min:0,max:.2,step:.001,onChange:o=>t("lensflare",{...r,flareShape:o})}),ue(tt,{label:"Animated",checked:r.animated,onChange:o=>t("lensflare",{...r,animated:o})}),ue(tt,{label:"Anamorphic",checked:r.anamorphic,onChange:o=>t("lensflare",{...r,anamorphic:o})}),ue(sr,{label:"Color Gain",value:r.colorGain,onChange:o=>t("lensflare",{...r,colorGain:o})}),ue(W,{label:"Halo Scale",value:r.haloScale,min:0,max:2,step:.01,onChange:o=>t("lensflare",{...r,haloScale:o})}),ue(tt,{label:"Secondary Ghosts",checked:r.secondaryGhosts,onChange:o=>t("lensflare",{...r,secondaryGhosts:o})}),ue(tt,{label:"Additional Streaks",checked:r.aditionalStreaks,onChange:o=>t("lensflare",{...r,aditionalStreaks:o})}),ue(W,{label:"Ghost Scale",value:r.ghostScale,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,ghostScale:o})}),ue(W,{label:"Opacity",value:r.opacity,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,opacity:o})}),ue(tt,{label:"Star Burst",checked:r.starBurst,onChange:o=>t("lensflare",{...r,starBurst:o})})]})}function Hx({pp:e,set:t,open:n,toggle:i}){let{depthOfField:r}=e;return Us(We,{title:"Depth Of Field",tooltip:"Blurs areas that sit away from the focal plane for a camera-like look.",open:n.depthOfField,onToggle:()=>i("depthOfField"),disabled:!r.enabled,trailing:ue(Qe,{checked:r.enabled,onChange:o=>t("depthOfField",{...r,enabled:o}),label:"Toggle DepthOfField"}),children:[ue(W,{label:"Focus Distance",value:r.focusDistance,min:0,max:50,step:.1,onChange:o=>t("depthOfField",{...r,focusDistance:o})}),ue(W,{label:"Focus Range",value:r.focusRange,min:.1,max:50,step:.1,onChange:o=>t("depthOfField",{...r,focusRange:o})}),ue(W,{label:"Focal Length",value:r.focalLength,min:0,max:1,step:.01,onChange:o=>t("depthOfField",{...r,focalLength:o})}),ue(W,{label:"Bokeh Scale",value:r.bokehScale,min:0,max:20,step:.1,onChange:o=>t("depthOfField",{...r,bokehScale:o})})]})}import{jsx as Fe,jsxs as ya}from"react/jsx-runtime";var YP=["linear","reinhard","aces"];function Wx({pp:e,set:t,open:n,toggle:i}){let{colorAverage:r}=e;return Fe(We,{title:"Color Average",tooltip:"Blends the frame toward a single average color for a washed-out stylized look.",open:n.colorAverage,onToggle:()=>i("colorAverage"),disabled:!r.enabled,trailing:Fe(Qe,{checked:r.enabled,onChange:o=>t("colorAverage",{...r,enabled:o}),label:"Toggle ColorAverage"}),children:Fe("div",{className:"se-placeholder",children:"Averages the frame color using the docs default blend mode."})})}function $x({pp:e,set:t,open:n,toggle:i}){let{brightnessContrast:r}=e;return ya(We,{title:"Brightness Contrast",tooltip:"Raises or lowers overall brightness and contrast across the scene.",open:n.brightnessContrast,onToggle:()=>i("brightnessContrast"),disabled:!r.enabled,trailing:Fe(Qe,{checked:r.enabled,onChange:o=>t("brightnessContrast",{...r,enabled:o}),label:"Toggle BrightnessContrast"}),children:[Fe(W,{label:"Brightness",value:r.brightness,min:-1,max:1,step:.01,onChange:o=>t("brightnessContrast",{...r,brightness:o})}),Fe(W,{label:"Contrast",value:r.contrast,min:-1,max:1,step:.01,onChange:o=>t("brightnessContrast",{...r,contrast:o})})]})}function Xx({pp:e,set:t,open:n,toggle:i}){let{hueSaturation:r}=e;return ya(We,{title:"Hue Saturation",tooltip:"Shifts the hue and saturation to tint the whole image.",open:n.hueSaturation,onToggle:()=>i("hueSaturation"),disabled:!r.enabled,trailing:Fe(Qe,{checked:r.enabled,onChange:o=>t("hueSaturation",{...r,enabled:o}),label:"Toggle HueSaturation"}),children:[Fe(W,{label:"Hue",value:r.hue,min:-Math.PI,max:Math.PI,step:.01,formatValue:o=>`${o.toFixed(2)} rad`,onChange:o=>t("hueSaturation",{...r,hue:o})}),Fe(W,{label:"Saturation",value:r.saturation,min:-1,max:1,step:.01,onChange:o=>t("hueSaturation",{...r,saturation:o})})]})}function qx({pp:e,set:t,open:n,toggle:i}){let{vignette:r}=e;return ya(We,{title:"Vignette",tooltip:"Darkens the edges of the screen so the center feels more focused.",open:n.vignette,onToggle:()=>i("vignette"),disabled:!r.enabled,trailing:Fe(Qe,{checked:r.enabled,onChange:o=>t("vignette",{...r,enabled:o}),label:"Toggle Vignette"}),children:[Fe(W,{label:"Offset",value:r.offset,min:0,max:1,step:.01,onChange:o=>t("vignette",{...r,offset:o})}),Fe(W,{label:"Darkness",value:r.darkness,min:0,max:1,step:.01,onChange:o=>t("vignette",{...r,darkness:o})}),Fe(tt,{label:"Eskil",checked:r.eskil,onChange:o=>t("vignette",{...r,eskil:o})})]})}function Yx({pp:e,set:t,open:n,toggle:i}){let{bloom:r}=e;return ya(We,{title:"Bloom",tooltip:"Makes bright areas glow and bleed softly into nearby pixels.",open:n.bloom,onToggle:()=>i("bloom"),disabled:!r.enabled,trailing:Fe(Qe,{checked:r.enabled,onChange:o=>t("bloom",{...r,enabled:o}),label:"Toggle Bloom"}),children:[Fe(W,{label:"Threshold",value:r.luminanceThreshold,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,luminanceThreshold:o})}),Fe(W,{label:"Smoothing",value:r.luminanceSmoothing,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,luminanceSmoothing:o})}),Fe(W,{label:"Intensity",value:r.intensity,min:0,max:3,step:.05,onChange:o=>t("bloom",{...r,intensity:o})}),Fe(tt,{label:"Mipmap Blur",checked:r.mipmapBlur,onChange:o=>t("bloom",{...r,mipmapBlur:o})}),Fe(W,{label:"Radius",value:r.radius,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,radius:o})}),Fe(W,{label:"Levels",value:r.levels,min:1,max:16,step:1,onChange:o=>t("bloom",{...r,levels:o})})]})}function Kx({pp:e,set:t,open:n,toggle:i}){let{toneMapping:r}=e;return ya(We,{title:"Tone Mapping",tooltip:"Remaps HDR lighting to screen output and controls exposure style.",open:n.toneMapping,onToggle:()=>i("toneMapping"),disabled:!r.enabled,trailing:Fe(Qe,{checked:r.enabled,onChange:o=>t("toneMapping",{...r,enabled:o}),label:"Toggle ToneMapping"}),children:[ya("div",{className:"se-field",children:[Fe("span",{className:"se-fieldLabel",children:"Mode"}),Fe("div",{className:"se-segmentedControl",children:YP.map(o=>Fe("button",{type:"button",className:`se-segmentedOption ${r.mode===o?"se-segmentedOption--active":""}`,onClick:()=>t("toneMapping",{...r,mode:o}),children:o==="aces"?"Filmic":o.charAt(0).toUpperCase()+o.slice(1)},o))})]}),Fe(W,{label:"Resolution",value:r.resolution,min:64,max:4096,step:64,onChange:o=>t("toneMapping",{...r,resolution:o})}),Fe(W,{label:"White Point",value:r.whitePoint,min:0,max:16,step:.01,onChange:o=>t("toneMapping",{...r,whitePoint:o})}),Fe(W,{label:"Middle Grey",value:r.middleGrey,min:0,max:1,step:.01,onChange:o=>t("toneMapping",{...r,middleGrey:o})}),Fe(W,{label:"Min Luminance",value:r.minLuminance,min:0,max:1,step:.01,onChange:o=>t("toneMapping",{...r,minLuminance:o})}),Fe(W,{label:"Average Luminance",value:r.averageLuminance,min:0,max:4,step:.01,onChange:o=>t("toneMapping",{...r,averageLuminance:o})}),Fe(W,{label:"Adaptation Rate",value:r.adaptationRate,min:0,max:10,step:.01,onChange:o=>t("toneMapping",{...r,adaptationRate:o})}),Fe(W,{label:"Exposure",value:r.exposure,min:0,max:3,step:.01,onChange:o=>t("toneMapping",{...r,exposure:o})})]})}function Jx({pp:e,set:t,open:n,toggle:i}){let{sepia:r}=e;return Fe(We,{title:"Sepia",tooltip:"Adds a warm vintage brown tint to the entire image.",open:n.sepia,onToggle:()=>i("sepia"),disabled:!r.enabled,trailing:Fe(Qe,{checked:r.enabled,onChange:o=>t("sepia",{...r,enabled:o}),label:"Toggle Sepia"}),children:Fe(W,{label:"Intensity",value:r.intensity,min:0,max:1,step:.01,onChange:o=>t("sepia",{...r,intensity:o})})})}import{jsx as Re,jsxs as va}from"react/jsx-runtime";function Qx({pp:e,set:t,open:n,toggle:i}){let{dotScreen:r}=e;return va(We,{title:"Dot Screen",tooltip:"Overlays a halftone dot pattern for a printed or retro look.",open:n.dotScreen,onToggle:()=>i("dotScreen"),disabled:!r.enabled,trailing:Re(Qe,{checked:r.enabled,onChange:o=>t("dotScreen",{...r,enabled:o}),label:"Toggle DotScreen"}),children:[Re(W,{label:"Angle",value:r.angle,min:0,max:Math.PI*2,step:.01,formatValue:o=>`${o.toFixed(2)} rad`,onChange:o=>t("dotScreen",{...r,angle:o})}),Re(W,{label:"Scale",value:r.scale,min:.1,max:10,step:.05,onChange:o=>t("dotScreen",{...r,scale:o})})]})}function Zx({pp:e,set:t,open:n,toggle:i}){let{glitch:r}=e;return va(We,{title:"Glitch",tooltip:"Introduces digital distortion, tearing, and scan noise.",open:n.glitch,onToggle:()=>i("glitch"),disabled:!r.enabled,trailing:Re(Qe,{checked:r.enabled,onChange:o=>t("glitch",{...r,enabled:o}),label:"Toggle Glitch"}),children:[Re(Hn,{label:"Mode",value:r.mode,options:pm,onChange:o=>t("glitch",{...r,mode:o})}),Re(ho,{label:"Delay",value:r.delay,min:0,max:10,step:.01,onChange:o=>t("glitch",{...r,delay:o})}),Re(ho,{label:"Duration",value:r.duration,min:0,max:5,step:.01,onChange:o=>t("glitch",{...r,duration:o})}),Re(ho,{label:"Strength",value:r.strength,min:0,max:2,step:.01,onChange:o=>t("glitch",{...r,strength:o})}),Re(ho,{label:"Chromatic Aberration Offset",value:r.chromaticAberrationOffset,min:0,max:.02,step:1e-4,onChange:o=>t("glitch",{...r,chromaticAberrationOffset:o})}),Re(W,{label:"Columns",value:r.columns,min:0,max:.5,step:.001,onChange:o=>t("glitch",{...r,columns:o})}),Re(W,{label:"Ratio",value:r.ratio,min:0,max:1,step:.01,onChange:o=>t("glitch",{...r,ratio:o})})]})}function e0({pp:e,set:t,open:n,toggle:i}){let{grid:r}=e;return va(We,{title:"Grid",tooltip:"Adds a visual grid overlay that feels retro or debug-like.",open:n.grid,onToggle:()=>i("grid"),disabled:!r.enabled,trailing:Re(Qe,{checked:r.enabled,onChange:o=>t("grid",{...r,enabled:o}),label:"Toggle Grid"}),children:[Re(W,{label:"Scale",value:r.scale,min:.1,max:10,step:.05,onChange:o=>t("grid",{...r,scale:o})}),Re(W,{label:"Line Width",value:r.lineWidth,min:0,max:1,step:.01,onChange:o=>t("grid",{...r,lineWidth:o})})]})}function t0({pp:e,set:t,open:n,toggle:i}){let{chromaticAberration:r}=e;return va(We,{title:"Chromatic Aberration",tooltip:"Separates color channels slightly to mimic lens fringing.",open:n.chromaticAberration,onToggle:()=>i("chromaticAberration"),disabled:!r.enabled,trailing:Re(Qe,{checked:r.enabled,onChange:o=>t("chromaticAberration",{...r,enabled:o}),label:"Toggle ChromaticAberration"}),children:[Re(W,{label:"Offset X",value:r.offsetX,min:0,max:.02,step:1e-4,onChange:o=>t("chromaticAberration",{...r,offsetX:o})}),Re(W,{label:"Offset Y",value:r.offsetY,min:0,max:.02,step:1e-4,onChange:o=>t("chromaticAberration",{...r,offsetY:o})}),Re(tt,{label:"Radial Modulation",checked:r.radialModulation,onChange:o=>t("chromaticAberration",{...r,radialModulation:o})}),Re(W,{label:"Modulation Offset",value:r.modulationOffset,min:0,max:1,step:.01,onChange:o=>t("chromaticAberration",{...r,modulationOffset:o})})]})}function n0({pp:e,set:t,open:n,toggle:i}){let{noise:r}=e;return va(We,{title:"Noise",tooltip:"Adds film grain or static noise to the rendered image.",open:n.noise,onToggle:()=>i("noise"),disabled:!r.enabled,trailing:Re(Qe,{checked:r.enabled,onChange:o=>t("noise",{...r,enabled:o}),label:"Toggle Noise"}),children:[Re(W,{label:"Amount",value:r.opacity,min:0,max:1,step:.01,onChange:o=>t("noise",{...r,opacity:o})}),Re(tt,{label:"Premultiply",checked:r.premultiply,onChange:o=>t("noise",{...r,premultiply:o})})]})}function r0({pp:e,set:t,open:n,toggle:i}){let{scanline:r}=e;return Re(We,{title:"Scan Line",tooltip:"Draws horizontal CRT-style scan lines over the frame.",open:n.scanline,onToggle:()=>i("scanline"),disabled:!r.enabled,trailing:Re(Qe,{checked:r.enabled,onChange:o=>t("scanline",{...r,enabled:o}),label:"Toggle Scanline"}),children:Re(W,{label:"Density",value:r.density,min:0,max:10,step:.25,onChange:o=>t("scanline",{...r,density:o})})})}function i0({pp:e,set:t,open:n,toggle:i}){let{pixelation:r}=e;return Re(We,{title:"Pixelation",tooltip:"Reduces detail into larger pixels for a blocky stylized effect.",open:n.pixelation,onToggle:()=>i("pixelation"),disabled:!r.enabled,trailing:Re(Qe,{checked:r.enabled,onChange:o=>t("pixelation",{...r,enabled:o}),label:"Toggle Pixelation"}),children:Re(W,{label:"Granularity",value:r.granularity,min:0,max:20,step:1,onChange:o=>t("pixelation",{...r,granularity:o})})})}function o0({pp:e,set:t,open:n,toggle:i}){let{ramp:r}=e;return va(We,{title:"Ramp",tooltip:"Adds a screen-space color gradient, or masks effects earlier in the stack.",open:n.ramp,onToggle:()=>i("ramp"),disabled:!r.enabled,trailing:Re(Qe,{checked:r.enabled,onChange:o=>t("ramp",{...r,enabled:o}),label:"Toggle Ramp"}),children:[Re(Hn,{label:"Ramp Type",value:r.rampType,options:hm,onChange:o=>t("ramp",{...r,rampType:o})}),Re(ho,{label:"Ramp Start",value:r.rampStart,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampStart:o})}),Re(ho,{label:"Ramp End",value:r.rampEnd,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampEnd:o})}),Re(sr,{label:"Start Color",value:r.startColor,onChange:o=>t("ramp",{...r,startColor:o})}),Re(sr,{label:"End Color",value:r.endColor,onChange:o=>t("ramp",{...r,endColor:o})}),!r.rampMask&&Re(W,{label:"Gradient Opacity",value:r.opacity??.5,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,opacity:o})}),Re(W,{label:"Bias",value:r.rampBias,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampBias:o})}),Re(W,{label:"Gain",value:r.rampGain,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampGain:o})}),Re(tt,{label:"Mask Earlier Effects",checked:r.rampMask,onChange:o=>t("ramp",{...r,rampMask:o})}),Re(tt,{label:"Invert",checked:r.rampInvert,onChange:o=>t("ramp",{...r,rampInvert:o})})]})}import{jsx as At,jsxs as c0}from"react/jsx-runtime";function a0({pp:e,set:t,open:n,toggle:i}){let{outline:r}=e;return c0(We,{title:"Outline",tooltip:"Draws a visible edge around the selected object binding.",open:n.outline,onToggle:()=>i("outline"),disabled:!r.enabled,trailing:At(Qe,{checked:r.enabled,onChange:o=>t("outline",{...r,enabled:o}),label:"Toggle Outline"}),children:[At("div",{className:"se-placeholder",children:"Outlines the currently selected object binding in the model editor."}),At(W,{label:"Selection Layer",value:r.selectionLayer,min:0,max:20,step:1,onChange:o=>t("outline",{...r,selectionLayer:o})}),At(W,{label:"Edge Strength",value:r.edgeStrength,min:0,max:10,step:.1,onChange:o=>t("outline",{...r,edgeStrength:o})}),At(W,{label:"Pulse Speed",value:r.pulseSpeed,min:0,max:10,step:.1,onChange:o=>t("outline",{...r,pulseSpeed:o})}),At(sr,{label:"Visible Edge Color",value:r.visibleEdgeColor,onChange:o=>t("outline",{...r,visibleEdgeColor:o})}),At(sr,{label:"Hidden Edge Color",value:r.hiddenEdgeColor,onChange:o=>t("outline",{...r,hiddenEdgeColor:o})}),At(Hn,{label:"Kernel Size",value:r.kernelSize,options:qa,onChange:o=>t("outline",{...r,kernelSize:o})}),At(tt,{label:"Blur",checked:r.blur,onChange:o=>t("outline",{...r,blur:o})}),At(tt,{label:"X-Ray",checked:r.xRay,onChange:o=>t("outline",{...r,xRay:o})})]})}function s0({pp:e,set:t,open:n,toggle:i}){let{selectiveBloom:r}=e;return c0(We,{title:"Selective Bloom",tooltip:"Applies bloom only to objects assigned to the selected layer.",open:n.selectiveBloom,onToggle:()=>i("selectiveBloom"),disabled:!r.enabled,trailing:At(Qe,{checked:r.enabled,onChange:o=>t("selectiveBloom",{...r,enabled:o}),label:"Toggle SelectiveBloom"}),children:[At("div",{className:"se-placeholder",children:"Applies bloom to the currently selected object binding."}),At(W,{label:"Selection Layer",value:r.selectionLayer,min:0,max:20,step:1,onChange:o=>t("selectiveBloom",{...r,selectionLayer:o})}),At(W,{label:"Intensity",value:r.intensity,min:0,max:5,step:.05,onChange:o=>t("selectiveBloom",{...r,intensity:o})}),At(W,{label:"Threshold",value:r.luminanceThreshold,min:0,max:1,step:.01,onChange:o=>t("selectiveBloom",{...r,luminanceThreshold:o})}),At(W,{label:"Smoothing",value:r.luminanceSmoothing,min:0,max:1,step:.01,onChange:o=>t("selectiveBloom",{...r,luminanceSmoothing:o})}),At(Hn,{label:"Kernel Size",value:r.kernelSize,options:qa,onChange:o=>t("selectiveBloom",{...r,kernelSize:o})}),At(tt,{label:"Mipmap Blur",checked:r.mipmapBlur,onChange:o=>t("selectiveBloom",{...r,mipmapBlur:o})}),At(tt,{label:"Inverted",checked:r.inverted,onChange:o=>t("selectiveBloom",{...r,inverted:o})}),At(tt,{label:"Ignore Background",checked:r.ignoreBackground,onChange:o=>t("selectiveBloom",{...r,ignoreBackground:o})})]})}function l0({pp:e,set:t,open:n,toggle:i}){let{smaa:r}=e;return At(We,{title:"SMAA",tooltip:"Reduces jagged edges with subpixel anti-aliasing.",open:n.smaa,onToggle:()=>i("smaa"),trailing:At(Qe,{checked:r.enabled,onChange:o=>t("smaa",{...r,enabled:o}),label:"Toggle SMAA"}),children:At("div",{className:"se-placeholder",children:"Subpixel Morphological Anti-Aliasing smooths jagged edges in post-process."})})}import{jsx as Et,jsxs as JP}from"react/jsx-runtime";function Kp({config:e,onChange:t}){let[n,i]=KP({autofocus:!1,colorAverage:!1,dotScreen:!1,glitch:!1,godRays:!1,grid:!1,lensflare:!1,outline:!1,selectiveBloom:!1,ramp:!1,ssao:!1,brightnessContrast:!1,hueSaturation:!1,depthOfField:!1,chromaticAberration:!1,vignette:!1,bloom:!1,toneMapping:!1,noise:!1,sepia:!1,scanline:!1,pixelation:!1,smaa:!1}),r=c=>i(l=>({...l,[c]:!l[c]})),o=e.postProcessing,s={pp:o,set:(c,l)=>t({...e,postProcessing:{...o,[c]:l}}),open:n,toggle:r};return JP("div",{className:"se-generalContent",children:[Et(Vx,{...s}),Et(Fx,{...s}),Et(Wx,{...s}),Et(Qx,{...s}),Et(Zx,{...s}),Et(Ux,{...s}),Et(e0,{...s}),Et(Gx,{...s}),Et(a0,{...s}),Et(s0,{...s}),Et($x,{...s}),Et(Xx,{...s}),Et(Hx,{...s}),Et(t0,{...s}),Et(qx,{...s}),Et(Yx,{...s}),Et(Kx,{...s}),Et(n0,{...s}),Et(Jx,{...s}),Et(r0,{...s}),Et(i0,{...s}),Et(o0,{...s}),Et(l0,{...s})]})}import{useState as d0,useSyncExternalStore as QP}from"react";import{Eye as ZP,EyeOff as ek,Plus as tk,Trash2 as nk}from"lucide-react";import{Fragment as u0,jsx as Ae,jsxs as Wn}from"react/jsx-runtime";var rk=["512","1024","2048","4096"],p0={none:"None",directional:"Direction",point:"Point",spot:"Spot",hemisphere:"Hemi"};function ik({index:e,light:t,selected:n,onSelect:i,onToggleVisible:r}){return Wn("div",{className:`se-lightRow ${n?"se-lightRow--active":""}`,onClick:i,children:[Wn("span",{className:"se-lightRowLabel",children:[e+1,": ",p0[t.type]]}),Ae("button",{type:"button",className:"se-iconButton","aria-label":t.visible?"Hide light":"Show light",onClick:o=>{o.stopPropagation(),r()},children:t.visible?Ae(ZP,{size:14}):Ae(ek,{size:14})})]})}function ok(){return{id:crypto.randomUUID(),type:"directional",color:"#ffffff",intensity:1,position:[5,10,5],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0}}function Jp({config:e,onChange:t}){let[n,i]=d0({lights:!0,shadows:!1,groundShadows:!1,environment:!1,envShadow:!1}),r=QP(zp,zc),[o,a]=d0(e.lighting.lights[0]?.id??null),s=r??o,c=b=>{a(b),zs(b)},l=b=>i(w=>({...w,[b]:!w[b]})),{tier:u}=ir(),d=ai(u,"starter"),{lighting:h,shadows:g,groundShadows:f,environment:y}=e,k=b=>t({...e,lighting:b}),v=b=>t({...e,shadows:b}),p=b=>t({...e,groundShadows:b}),m=b=>t({...e,environment:b}),M=(b,w)=>{k({...h,lights:h.lights.map(T=>T.id===b?{...T,...w}:T)})},C=h.lights.find(b=>b.id===s)??null,P=()=>{let b=ok();k({...h,lights:[...h.lights,b]}),c(b.id)},A=()=>{if(!C)return;let b=h.lights.filter(w=>w.id!==C.id);k({...h,lights:b}),c(b[0]?.id??null)};return Wn("div",{className:"se-generalContent",children:[Wn(We,{title:"Lights",open:n.lights,onToggle:()=>l("lights"),children:[Ae("div",{className:"se-lightList",children:h.lights.map((b,w)=>Ae(ik,{index:w,light:b,selected:b.id===s,onSelect:()=>c(b.id),onToggleVisible:()=>M(b.id,{visible:!b.visible})},b.id))}),Wn("div",{className:"se-lightActions",children:[Ae("button",{type:"button",className:"se-iconButton",onClick:P,title:"Add light",children:Ae(tk,{size:14})}),C&&h.lights.length>1&&Ae("button",{type:"button",className:"se-iconButton",onClick:A,title:"Remove selected light",children:Ae(nk,{size:14})})]}),C?Wn("div",{className:"se-lightProps",children:[Wn("div",{className:"se-field",children:[Ae("span",{className:"se-fieldLabel",children:"Type"}),Ae("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:cm.map(b=>Ae("button",{type:"button",className:`se-segmentedOption ${C.type===b?"se-segmentedOption--active":""}`,onClick:()=>M(C.id,{type:b}),children:p0[b]},b))})]}),Ae(sr,{label:"Color",value:C.color,onChange:b=>M(C.id,{color:b})}),Ae(W,{label:"Intensity",value:C.intensity,min:0,max:10,step:.1,onChange:b=>M(C.id,{intensity:b})}),C.type!=="hemisphere"&&C.type!=="none"&&Ae(Ti,{label:"Position",value:C.position,min:-100,max:100,step:.05,onChange:b=>M(C.id,{position:b})}),C.type==="spot"&&Wn(u0,{children:[Ae(W,{label:"Angle",value:C.angle??Math.PI/6,min:0,max:Math.PI/2,step:.01,formatValue:b=>`${Math.round(b*180/Math.PI)}\xB0`,onChange:b=>M(C.id,{angle:b})}),Ae(W,{label:"Penumbra",value:C.penumbra??.2,min:0,max:1,step:.01,onChange:b=>M(C.id,{penumbra:b})}),Ae(W,{label:"Distance",value:C.distance??0,min:0,max:100,step:.5,onChange:b=>M(C.id,{distance:b})}),Ae(W,{label:"Decay",value:C.decay??2,min:0,max:4,step:.1,onChange:b=>M(C.id,{decay:b})})]}),Ae(tt,{label:"Attached to camera",checked:C.attachedToCamera,onChange:b=>M(C.id,{attachedToCamera:b})}),Ae(tt,{label:"Cast shadows",checked:C.castShadow,onChange:b=>M(C.id,{castShadow:b})}),Ae(W,{label:"Shadow bias",value:C.shadowBias,min:-.01,max:.01,step:1e-4,onChange:b=>M(C.id,{shadowBias:b})})]}):null]}),Wn(We,{title:"Shadows",open:n.shadows,onToggle:()=>l("shadows"),disabled:!g.enabled,trailing:Ae(Qe,{checked:g.enabled,onChange:b=>v({...g,enabled:b}),label:"Toggle shadows"}),children:[Ae(Hn,{label:"Map size",value:String(g.mapSize),options:rk,onChange:b=>v({...g,mapSize:Number(b)})}),Ae(W,{label:"Bias",value:g.bias,min:-.01,max:.01,step:1e-4,onChange:b=>v({...g,bias:b})}),Ae(W,{label:"Normal bias",value:g.normalBias,min:0,max:.2,step:.01,onChange:b=>v({...g,normalBias:b})}),Ae(W,{label:"Radius (softness)",value:g.radius,min:0,max:20,step:.5,onChange:b=>v({...g,radius:b})})]}),Wn(We,{title:"Ground Shadows",open:n.groundShadows,onToggle:()=>l("groundShadows"),disabled:!f.enabled,trailing:Ae(Qe,{checked:f.enabled,onChange:b=>p({...f,enabled:b}),label:"Toggle ground shadows"}),children:[Wn("div",{className:"se-field",children:[Ae("span",{className:"se-fieldLabel",children:"Mode"}),Ae("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:["shadowCatcher"].map(b=>Ae("button",{type:"button",className:`se-segmentedOption ${f.mode===b?"se-segmentedOption--active":""}`,onClick:()=>p({...f,mode:b}),children:b==="shadowCatcher"?"Shadow Catcher":"Baked AO"},b))})]}),f.mode==="bakedAO"&&Ae("div",{className:"se-placeholder",children:"Requires pre-baked AO textures \u2014 not yet available."}),Ae(W,{label:"Intensity",value:f.intensity,min:0,max:1,step:.01,onChange:b=>p({...f,intensity:b})}),Ae(W,{label:"Border fade",value:f.borderFade,min:0,max:10,step:.1,onChange:b=>p({...f,borderFade:b})}),Ae(W,{label:"Height",value:f.height,min:-5,max:5,step:.1,onChange:b=>p({...f,height:b})}),Ae(W,{label:"Size",value:f.size,min:1,max:50,step:.5,onChange:b=>p({...f,size:b})})]}),Ae(We,{title:"Environment",open:n.environment,onToggle:()=>l("environment"),children:d?Wn(u0,{children:[Ae(W,{label:"Orientation",value:y.rotation,min:0,max:360,step:1,formatValue:b=>`${b}\xB0`,onChange:b=>m({...y,rotation:b})}),Ae(W,{label:"Brightness",value:y.intensity,min:0,max:3,step:.05,onChange:b=>m({...y,intensity:b})}),Wn(We,{title:"Shadow",open:n.envShadow,onToggle:()=>l("envShadow"),trailing:Ae(Qe,{checked:y.shadowLight.enabled,onChange:b=>m({...y,shadowLight:{...y.shadowLight,enabled:b}}),label:"Toggle environment shadow light"}),disabled:!y.shadowLight.enabled,children:[Ae(W,{label:"Light intensity",value:y.shadowLight.intensity,min:0,max:20,step:.1,onChange:b=>m({...y,shadowLight:{...y.shadowLight,intensity:b}})}),Ae(W,{label:"Shadow bias",value:y.shadowLight.bias,min:-.01,max:.01,step:1e-4,onChange:b=>m({...y,shadowLight:{...y.shadowLight,bias:b}})})]})]}):Ae(jn,{requiredTier:"starter",feature:"Environment lighting"})})]})}import{useMemo as ak,useState as sk}from"react";import{ChevronDown as lk,Pause as ck,Play as dk,Square as uk,Trash2 as pk}from"lucide-react";import{jsx as $e,jsxs as Rt}from"react/jsx-runtime";function hk(e){if(!Number.isFinite(e)||e<=0)return"Unknown duration";let t=Math.round(e*10)/10;if(t<60)return`${t.toFixed(1)}s`;let n=Math.floor(t/60),i=(t%60).toFixed(1).padStart(4,"0");return`${n}:${i}`}function h0(e){let t=Number.isFinite(e)&&e>0?e:0;if(t<60)return`${t.toFixed(1)}s`;let n=Math.floor(t/60),i=(t%60).toFixed(1).padStart(4,"0");return`${n}:${i}`}function mk(e){return Number.isFinite(e)?Math.min(3,Math.max(.1,Number(e.toFixed(2)))):1}function Qp({config:e,onChange:t,clipDetails:n,currentClip:i,isPlaying:r,time:o,play:a,pause:s,stop:c,setSpeed:l,seek:u}){let[d,h]=sk(!1),g=ak(()=>new Map(n.map(b=>[b.sourceName,b.duration])),[n]),f=e.animations.clips.filter(b=>!b.hidden),y=e.animations.clips.filter(b=>b.hidden),k=(b,w=e.animations.autoplayClip)=>{t({...e,animations:{clips:b(e.animations.clips),autoplayClip:w}})},v=(b,w)=>{k(T=>T.map(S=>S.sourceName===b?w(S):S))},p=(b,w)=>{v(b,T=>({...T,loopMode:w}))},m=(b,w)=>{let T=mk(w);v(b,S=>({...S,speed:T})),i===b&&l(T)},M=(b,w)=>{v(b,T=>({...T,displayName:w}))},C=b=>{let w=e.animations.autoplayClip===b?null:b;t({...e,animations:{...e.animations,autoplayClip:w}})},P=b=>{k(w=>w.map(T=>T.sourceName===b?{...T,hidden:!0}:T),e.animations.autoplayClip===b?null:e.animations.autoplayClip),i===b&&c()},A=b=>{k(w=>w.map(T=>T.sourceName===b?{...T,hidden:!1}:T))};return e.animations.clips.length===0?$e(po,{title:"Animations",children:$e("div",{className:"se-helperCard",children:"Upload a model with embedded animations to manage playback, naming, autoplay, and per-clip speed here."})}):Rt(po,{title:"Animations",children:[f.length===0&&$e("div",{className:"se-helperCard",children:$e("span",{children:"Preview clips directly in the viewer, choose one optional autoplay animation, and use soft delete to hide clips without modifying the GLB."})}),f.length===0?$e("div",{className:"se-placeholder",children:"All animations are currently removed. Restore a clip below to make it available again."}):$e("div",{className:"se-animationList",children:f.map(b=>{let w=i===b.sourceName,T=g.get(b.sourceName)??0;return Rt("article",{className:`se-animationCard ${w?"se-animationCard--active":""}`,children:[Rt("div",{className:"se-animationHeader",children:[Rt("div",{className:"se-animationHeading",children:[Rt("div",{className:"se-animationTitleRow",children:[$e("span",{className:"se-animationStatus",children:w?r?"Playing":"Paused":"Ready"}),e.animations.autoplayClip===b.sourceName?$e("span",{className:"se-animationBadge",children:"Autoplay"}):null]}),$e("div",{className:"se-animationSource",children:b.sourceName})]}),$e("button",{type:"button",className:"se-animationDangerButton",onClick:()=>P(b.sourceName),title:"Remove animation",children:$e(pk,{size:16})})]}),Rt("div",{className:"se-field",children:[$e("span",{className:"se-fieldLabel",children:"Display name"}),$e("input",{className:"se-textInput",value:b.displayName,onChange:N=>M(b.sourceName,N.target.value),placeholder:"Animation name"})]}),Rt("div",{className:"se-animationMeta",children:[$e("span",{children:hk(T)}),$e("span",{children:b.loopMode==="once"?"Play once":"Looping"}),Rt("span",{children:[b.speed.toFixed(2),"x"]})]}),Rt("div",{className:"se-animationButtonRow",children:[(()=>{let N=w&&r;return $e("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:()=>N?s():a(b.sourceName),"aria-label":N?"Pause":"Play",title:N?"Pause":"Play",children:N?$e(ck,{size:16}):$e(dk,{size:16})})})(),$e("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:c,disabled:!w,"aria-label":"Stop",title:"Stop",children:$e(uk,{size:16})})]}),Rt("div",{className:"se-animationSeekRow",children:[$e("input",{className:"se-slider se-animationSeek",type:"range",min:0,max:Math.max(T,.001),step:.01,value:w?Math.min(o,T):0,disabled:!w||T<=0,onChange:N=>u(Number(N.target.value)),"aria-label":"Seek"}),Rt("span",{className:"se-animationSeekTime",children:[h0(w?Math.min(o,T):0)," / ",h0(T)]})]}),Rt("div",{className:"se-animationGrid",children:[Rt("label",{className:"se-field",children:[$e("span",{className:"se-fieldLabel",children:"Loop mode"}),Rt("select",{className:"se-select",value:b.loopMode,onChange:N=>p(b.sourceName,N.target.value),children:[$e("option",{value:"repeat",children:"Loop"}),$e("option",{value:"once",children:"Play Once"})]})]}),Rt("label",{className:"se-field",children:[Rt("span",{className:"se-fieldLabel",children:["Speed",Rt("span",{className:"se-fieldValue",children:[b.speed.toFixed(2),"x"]})]}),Rt("div",{className:"se-animationSpeedRow",children:[$e("input",{className:"se-slider",type:"range",min:.1,max:3,step:.1,value:b.speed,onChange:N=>m(b.sourceName,Number(N.target.value))}),$e("input",{className:"se-numberInput se-animationSpeedInput",type:"number",min:.1,max:3,step:.1,value:b.speed,onChange:N=>m(b.sourceName,Number(N.target.value))})]})]})]}),$e("button",{type:"button",className:`se-animationAutoplayButton ${e.animations.autoplayClip===b.sourceName?"se-animationAutoplayButton--active":""}`,onClick:()=>C(b.sourceName),children:e.animations.autoplayClip===b.sourceName?"Disable autoplay":"Set as autoplay"})]},b.sourceName)})}),y.length>0?Rt("section",{className:"se-removedAnimations",children:[$e("button",{type:"button",className:"se-panelHeader",onClick:()=>h(b=>!b),children:Rt("span",{className:"se-panelHeaderMain",children:[$e(lk,{size:16,className:`se-panelChevron ${d?"se-panelChevron--open":""}`}),Rt("span",{className:"se-panelTitle",children:["Removed Animations (",y.length,")"]})]})}),d?$e("div",{className:"se-removedAnimationList",children:y.map(b=>Rt("div",{className:"se-removedAnimationRow",children:[Rt("div",{children:[$e("div",{className:"se-removedAnimationName",children:b.displayName||b.sourceName}),$e("div",{className:"se-animationSource",children:b.sourceName})]}),$e("button",{type:"button",className:"se-animationButton",onClick:()=>A(b.sourceName),children:"Restore"})]},b.sourceName))}):null]}):null]})}import{useState as m0}from"react";import{Pencil as gk,Trash2 as fk}from"lucide-react";import{jsx as un,jsxs as lr}from"react/jsx-runtime";function Zp({config:e,onChange:t}){let[n,i]=m0(null),[r,o]=m0({title:"",description:""}),a=e.annotations,s=d=>{i(d),o({title:d.title,description:d.description||""})},c=()=>{if(!n||!r.title.trim())return;let d=a.map(h=>h.id===n.id?{...h,title:r.title.trim(),description:r.description||""}:h);t({...e,annotations:d}),i(null),o({title:"",description:""})},l=d=>{if(window.confirm("Delete this annotation?")){let g=a.filter(f=>f.id!==d).map((f,y)=>({...f,id:y+1}));t({...e,annotations:g}),i(null),o({title:"",description:""})}},u=()=>{i(null),o({title:"",description:""})};return lr(po,{title:"Annotations",children:[e.annotations.length===0?un("div",{className:"bb-emptyAnnotations",children:"No annotations yet. Double-click on the model to add one."}):un("div",{className:"bb-annotationsList",children:e.annotations.map(d=>lr("div",{className:"bb-annotationCard",children:[lr("div",{className:"bb-annotationHeader",children:[lr("div",{className:"bb-annotationBadge",children:["#",d.id]}),lr("div",{className:"bb-annotationActions",children:[un("button",{className:"bb-annotationAction bb-annotationAction--edit",onClick:()=>s(d),title:"Edit annotation",children:un(gk,{size:16})}),un("button",{className:"bb-annotationAction bb-annotationAction--delete",onClick:()=>l(d.id),title:"Delete annotation",children:un(fk,{size:16})})]})]}),un("div",{className:"bb-annotationTitle",children:d.title}),d.description&&un("div",{className:"bb-annotationDescription",children:d.description}),lr("div",{className:"bb-annotationPosition",children:["Position: [",d.worldPosition[0].toFixed(2),","," ",d.worldPosition[1].toFixed(2),","," ",d.worldPosition[2].toFixed(2),"]"]})]},d.id))}),n&&un("div",{className:"bb-editAnnotationOverlay",onClick:u,children:lr("div",{className:"bb-editAnnotationPopup",onClick:d=>d.stopPropagation(),children:[lr("div",{className:"bb-editAnnotationHeader",children:[un("h3",{className:"bb-editAnnotationTitle",children:"Edit Annotation"}),un("button",{className:"bb-editAnnotationClose",onClick:u,children:"\xD7"})]}),lr("div",{className:"bb-editAnnotationBody",children:[lr("div",{className:"bb-field",children:[un("label",{className:"bb-label",children:"Title"}),un("input",{className:"bb-input",value:r.title,onChange:d=>o({...r,title:d.target.value}),placeholder:"Enter annotation title"})]}),lr("div",{className:"bb-field",children:[un("label",{className:"bb-label",children:"Description"}),un("textarea",{className:"bb-textarea",value:r.description,onChange:d=>o({...r,description:d.target.value}),placeholder:"Enter annotation description",rows:3})]}),lr("div",{className:"bb-editAnnotationActions",children:[un("button",{className:"bb-button",onClick:u,children:"Cancel"}),un("button",{className:"bb-button bb-button--primary",onClick:c,disabled:!r.title.trim(),children:"Save"}),un("button",{className:"bb-button bb-button--danger",onClick:()=>l(n.id),children:"Delete"})]})]})]})})]})}import{useState as bk,useCallback as mo}from"react";import{ArrowDown as xk,ArrowUp as yk,MapPin as vk,Plus as wk,Trash2 as Ck,Settings as Sk}from"lucide-react";import{Fragment as Tk,jsx as gt,jsxs as Yt}from"react/jsx-runtime";var Mk={enabled:!0,waypoints:[],loop:!0,autoPlay:!1},go=3.5;function eh({config:e,onChange:t,cameraState:n,onPreviewWaypoint:i}){let r=e.cinematic??Mk,{waypoints:o}=r,a=mo((v,p)=>{if(v.length<2)return 0;let m=0;for(let M=0;M<v.length-1;M++){let C=v[M].segmentDuration??go;m+=C}return p&&v.length>1&&(m+=v[v.length-1].segmentDuration??go),Math.max(m,0)},[]),s=mo(v=>{t({...e,cinematic:{...r,...v}})},[e,r,t]),c=mo(()=>{if(!n)return;let v={position:[...n.position],target:[...n.target],...n.azimuthAngle!=null?{azimuthAngle:n.azimuthAngle}:{},...n.polarAngle!=null?{polarAngle:n.polarAngle}:{},segmentDuration:go},p=[...o,v],m=a(p,r.loop);s({waypoints:p,duration:m})},[n,o,r.loop,a,s]),l=mo(v=>{let p=o.filter((M,C)=>C!==v),m=a(p,r.loop);s({waypoints:p,duration:m})},[o,r.loop,a,s]),u=mo((v,p)=>{let m=v+p;if(m<0||m>=o.length)return;let M=[...o];[M[v],M[m]]=[M[m],M[v]];let C=a(M,r.loop);s({waypoints:M,duration:C})},[o,r.loop,a,s]),d=mo((v,p)=>{let m=o.map((C,P)=>P===v?{...C,...p}:C),M=a(m,r.loop);s({waypoints:m,duration:M})},[o,r.loop,a,s]),[h,g]=bk(!1),f=o.some(v=>v.segmentDuration!==void 0),y=mo(v=>v>=o.length-1?go:o[v]?.segmentDuration??go,[o]),k=o.length>=2;return Yt(po,{title:"Cinematic Camera",children:[gt("p",{className:"se-cinematicHint",children:"Frame the model in the viewer, then capture it as a waypoint. The camera glides through the waypoints in order \u2014 enable and press play in the viewer to preview."}),Yt("button",{type:"button",className:"bb-button bb-button--primary se-cinematicAdd",onClick:c,disabled:!n,title:"Capture the current camera view as a waypoint",children:[gt(wk,{size:15}),"Add waypoint from current view"]}),Yt("div",{className:"se-customizeToggle",children:[Yt("label",{className:"se-toggleLabel",children:[gt("input",{type:"checkbox",checked:h,onChange:v=>g(v.target.checked)}),gt(Sk,{size:14}),gt("span",{children:"Customize durations between waypoints"})]}),h&&Yt("span",{className:"se-toggleHint",children:["Set duration for each segment between waypoints: 1\u21922, 2\u21923, etc. Default: ",go,"s"]})]}),o.length===0?gt("div",{className:"bb-emptyAnnotations",children:"No waypoints yet. Position the camera and add your first one."}):Yt(Tk,{children:[gt("div",{className:"se-waypointList",children:o.map((v,p)=>{let m=y(p),M=p===o.length-1,C=v.segmentDuration!==void 0&&v.segmentDuration!==go;return Yt("div",{children:[Yt("div",{className:"se-waypointCard",children:[gt("div",{className:"se-waypointBadge",children:p+1}),Yt("div",{className:"se-waypointBody",children:[Yt("div",{className:"se-waypointCoords",children:["pos [",v.position.map(P=>P.toFixed(1)).join(", "),"]"]}),Yt("div",{className:"se-waypointCoords",children:["look [",v.target.map(P=>P.toFixed(1)).join(", "),"]"]}),h&&!M&&Yt("div",{className:`se-customBadge ${C?"se-customBadge--custom":"se-customBadge--default"}`,children:[m.toFixed(1),"s",!C&&" (default)"]})]}),Yt("div",{className:"se-waypointActions",children:[gt("button",{className:"se-waypointAction",onClick:()=>i?.(v),title:"Fly camera to this waypoint",disabled:!i,children:gt(vk,{size:15})}),gt("button",{className:"se-waypointAction",onClick:()=>u(p,-1),title:"Move up",disabled:p===0,children:gt(yk,{size:15})}),gt("button",{className:"se-waypointAction",onClick:()=>u(p,1),title:"Move down",disabled:M,children:gt(xk,{size:15})}),gt("button",{className:"se-waypointAction se-waypointAction--delete",onClick:()=>l(p),title:"Delete waypoint",children:gt(Ck,{size:15})})]})]}),h&&!M&&Yt("div",{className:"se-segmentBetween",children:[Yt("div",{className:"se-segmentLabel",children:[p+1," \u2192 ",p+2,!v.segmentDuration&&" (default)"]}),Yt("div",{className:"se-segmentControls",children:[gt("span",{className:"se-durationLabel",children:"Duration:"}),gt("input",{type:"range",className:"se-segmentSlider",min:1,max:20,step:.5,value:m,onChange:P=>{let A=parseFloat(P.target.value);d(p,{segmentDuration:A})}}),Yt("span",{className:"se-segmentValue",children:[m.toFixed(1),"s"]}),Yt("div",{className:"se-presetButtons",children:[[2,4,6,8].map(P=>Yt("button",{className:"se-presetButton",onClick:()=>d(p,{segmentDuration:P}),children:[P,"s"]},`preset-${p}-${P}`)),gt("button",{className:"se-presetButton se-presetButton--default",onClick:()=>{let P=o.map((b,w)=>{if(w===p){let{segmentDuration:T,...S}=b;return S}return b}),A=a(P,r.loop);s({waypoints:P,duration:A})},children:"Reset"})]})]})]})]},`waypoint-wrapper-${p}`)})}),Yt("div",{className:"se-totalDuration",children:[gt("span",{className:"se-totalLabel",children:"Total duration:"}),gt("span",{className:"se-totalValue",children:k?(r.duration??a(o,r.loop)).toFixed(1)+"s":"-"}),!k&>("span",{className:"se-totalHint",children:"(need at least 2 waypoints)"})]})]}),gt(tt,{label:"Enable cinematic camera",checked:r.enabled,onChange:v=>s({enabled:v})}),gt(tt,{label:"Loop",checked:r.loop,onChange:v=>{let p=v,m=a(o,p);s({loop:p,duration:m})}}),gt(tt,{label:"Auto-play on load",checked:r.autoPlay,onChange:v=>s({autoPlay:v})}),!h&&k&>(W,{label:"Duration",value:r.duration??a(o,r.loop),min:4,max:120,step:1,formatValue:v=>`${v}s`,onChange:v=>s({duration:v})})]})}import{Box as _k,Clapperboard as Ak,MessageSquareText as Ek,Sparkles as Rk,Spotlight as Lk,Video as Bk}from"lucide-react";import{jsx as pn,jsxs as Dk}from"react/jsx-runtime";var Ok=[{label:"General",icon:pn(_k,{})},{label:"Lighting",icon:pn(Lk,{})},{label:"Animations",icon:pn(Ak,{})},{label:"Post Processing",icon:pn(Rk,{})},{label:"Annotations",icon:pn(Ek,{})},{label:"Cinematic",icon:pn(Bk,{})}],g0={currentClip:null,isPlaying:!1,time:0,duration:0,play:()=>{},pause:()=>{},stop:()=>{},setSpeed:()=>{},seek:()=>{}};function th({config:e,onChange:t,activeSubTab:n,onActiveSubTabChange:i,cameraState:r=null,onPreviewWaypoint:o,animationClipDetails:a=[],animationPlayback:s=g0}){let[c,l]=Pk("General"),u=n??c,d=s??g0,{tier:h}=ir(),g=ai(h,"starter"),f=ai(h,"growth");kk(()=>{n!==void 0&&l(n)},[n]);let y=k=>{n===void 0&&l(k),i?.(k)};return Dk("div",{className:"se-tabContent",children:[pn("div",{className:"se-subTabRow",children:Ok.map(k=>pn("button",{type:"button",title:k.label,className:`se-subTab ${u===k.label?"se-subTab--active":""}`,onClick:()=>y(k.label),children:k.icon},k.label))}),u==="General"&&pn(Yp,{config:e,onChange:t}),u==="Lighting"&&pn(Jp,{config:e,onChange:t}),u==="Animations"&&(g?pn(Qp,{config:e,onChange:t,clipDetails:a,currentClip:d.currentClip,isPlaying:d.isPlaying,time:d.time,duration:d.duration,play:d.play,pause:d.pause,stop:d.stop,setSpeed:d.setSpeed,seek:d.seek}):pn(jn,{requiredTier:"starter",feature:"Animation configuration"})),u==="Post Processing"&&(f?pn(Kp,{config:e,onChange:t}):pn(jn,{requiredTier:"growth",feature:"Post-processing effects"})),u==="Annotations"&&(g?pn(Zp,{config:e,onChange:t}):pn(jn,{requiredTier:"starter",feature:"Annotations"})),u==="Cinematic"&&(g?pn(eh,{config:e,onChange:t,cameraState:r,onPreviewWaypoint:o}):pn(jn,{requiredTier:"starter",feature:"Cinematic camera"}))]})}import{ChevronDown as f0,Info as b0}from"lucide-react";import{jsx as Rn,jsxs as fo}from"react/jsx-runtime";function x0({title:e,trailing:t,children:n,disabled:i,open:r,onToggle:o,tooltip:a}){let s=a?`${a}`:e;return fo("div",{className:"bb-materialPanel",children:[fo("button",{type:"button",className:"bb-materialPanelHeader",onClick:o,"aria-expanded":r,title:s,children:[fo("div",{className:"bb-materialPanelTitleWrap",children:[Rn(f0,{size:14,className:`bb-materialPanelChevron ${r?"bb-materialPanelChevron--open":""}`}),Rn("span",{className:"bb-materialPanelTitle",children:e}),a?Rn("span",{className:"bb-materialPanelHelp",title:s,"aria-label":s,role:"img",onClick:c=>c.stopPropagation(),children:Rn(b0,{size:12})}):null]}),t?Rn("div",{onClick:c=>c.stopPropagation(),children:t}):null]}),r?Rn("div",{className:"bb-materialPanelBody",style:i?{opacity:.45,pointerEvents:"none"}:void 0,children:n}):null]})}function Vn({title:e,open:t,onToggle:n,trailing:i,children:r,tooltip:o}){let a=o?`${e}: ${o}`:e;return fo("div",{className:"bb-section",children:[fo("button",{type:"button",className:"bb-sectionHeaderButton",onClick:n,"aria-expanded":t,title:a,children:[fo("span",{className:"bb-sectionHeaderMain",children:[Rn(f0,{size:15,className:`bb-sectionChevron ${t?"bb-sectionChevron--open":""}`}),Rn("h2",{className:"bb-sectionTitle",children:e}),o?Rn("span",{className:"bb-sectionHelp",title:a,"aria-label":a,role:"img",onClick:s=>s.stopPropagation(),children:Rn(b0,{size:13})}):null]}),i?Rn("span",{onClick:s=>s.stopPropagation(),children:i}):null]}),t?Rn("div",{className:"bb-sectionBody",children:r}):null]})}function y0({checked:e,onChange:t,label:n}){return fo("label",{className:"se-switch","aria-label":n,children:[Rn("input",{type:"checkbox",checked:e,onChange:i=>t(i.target.checked)}),Rn("span",{className:"se-switchTrack",children:Rn("span",{className:"se-switchThumb"})})]})}import{useState as C0}from"react";import{jsx as nh}from"react/jsx-runtime";function $n({panelKey:e,title:t,tooltip:n,toggleLabel:i,controls:r,children:o,requiredTier:a}){let{openMaterialPanels:s,materialPanelEnabled:c,onToggleMaterialPanel:l,onSetMaterialPanelState:u}=r,d=a?.locked??!1;return nh(x0,{title:t,tooltip:n,disabled:d||!c[e],open:s[e],onToggle:()=>l(e),trailing:nh(y0,{checked:!d&&c[e],onChange:d?()=>{}:h=>u(e,h),label:i??`Toggle ${t}`}),children:d&&a?nh(jn,{requiredTier:a.tier,feature:t}):o})}import{useRef as v0,useState as Nk}from"react";import{HexColorInput as Ik,HexColorPicker as zk}from"react-colorful";import{FileUp as jk}from"lucide-react";import{jsx as Kt,jsxs as Pi}from"react/jsx-runtime";function Jt({label:e,value:t,placeholder:n,onChange:i}){let r=v0(null);return Pi("div",{className:"bb-field bb-field--full",children:[Kt("label",{className:"bb-label",children:e}),Pi("div",{className:"bb-fileField",children:[Kt("input",{className:"bb-input bb-fileField-input",placeholder:n,value:t,onChange:o=>{let a=o.target.value;!a&&t&&Wd(t),i(a)}}),Kt("button",{type:"button",className:"bb-fileFieldButton",onClick:()=>r.current?.click(),"aria-label":`Select file for ${e}`,title:`Select file for ${e}`,children:Kt(jk,{size:20})}),Kt("input",{ref:r,type:"file",accept:"image/png,image/jpeg,image/webp,image/avif",className:"bb-hiddenInput",onChange:o=>{let a=o.target.files?.[0];if(!a)return;let s=$m(a);t&&t!==s&&Wd(t),Km(s,URL.createObjectURL(a)),i(s),o.target.value=""}})]})]})}function bo({label:e,value:t,fallback:n="#ffffff",onChange:i}){let[r,o]=Nk(!1),a=t||n,s=v0(null);return Pi("div",{className:"bb-field",children:[Kt("span",{className:"bb-label",children:e}),Kt("div",{className:"se-fieldInline",children:Kt("span",{ref:s,style:{display:"inline-flex"},children:Kt(Ik,{prefixed:!0,className:"se-swatch",onClick:()=>o(c=>!c),style:{background:a,color:xa(a)},color:a,onChange:i})})}),r?Kt(Xp,{anchorRef:s,onClose:()=>o(!1),children:Kt(zk,{color:a,onChange:i})}):null]})}function Gs({label:e,checked:t,onChange:n}){return Pi("label",{className:"bb-checkbox",children:[Kt("input",{type:"checkbox",checked:t,onChange:i=>n(i.target.checked)}),e]})}function w0({label:e,value:t,min:n,max:i,step:r,placeholder:o,onChange:a}){return Pi("div",{className:"bb-field",children:[Kt("label",{className:"bb-label",children:e}),Kt("input",{className:"bb-input",type:"number",min:n,max:i,step:r,placeholder:o,value:t??"",onChange:s=>a(s.target.value===""?void 0:Number(s.target.value))})]})}function wa({label:e,value:t,options:n,onChange:i}){return Pi("div",{className:"bb-field",children:[Kt("label",{className:"bb-label",children:e}),Kt("select",{className:"bb-select",value:t,onChange:r=>i(r.target.value),children:n.map(r=>Kt("option",{value:r,children:r},r))})]})}function Pt({label:e,value:t,min:n,max:i,step:r,onChange:o}){return Pi("div",{className:"bb-field bb-field--full",children:[Kt("label",{className:"bb-label",children:e}),Pi("div",{className:"bb-sliderField",children:[Kt("input",{className:`bb-slider ${t===void 0?"bb-slider--unset":""}`,type:"range",min:n,max:i,step:r,value:t??n,onChange:s=>o(Number(s.target.value))}),Kt("input",{className:"bb-input bb-input--compact",type:"number",min:n,max:i,step:r,value:t??"",onChange:s=>o(s.target.value===""?void 0:Number(s.target.value))})]})]})}import{Fragment as rh,jsx as Z,jsxs as nn}from"react/jsx-runtime";function S0({selectedItem:e,selectedMaterial:t,pbrWorkflow:n,onPbrWorkflowChange:i,openMaterialPanels:r,materialPanelEnabled:o,onToggleMaterialPanel:a,onSetMaterialPanelState:s,updateSelectedMaterial:c,setSelectedTexturePath:l}){let u={openMaterialPanels:r,materialPanelEnabled:o,onToggleMaterialPanel:a,onSetMaterialPanelState:s},{tier:d}=ir(),h=ai(d,"starter"),g={tier:"starter",locked:!h},[f,y]=C0("roughness"),[k,v]=C0("factor");return nn(rh,{children:[Z($n,{panelKey:"pbr",title:"PBR Maps",tooltip:"Controls the base color and workflow used for physically based shading.",controls:u,children:h?nn("div",{className:"bb-grid",children:[Z(wa,{label:"Workflow",value:n,options:["metalness","specular"],onChange:i}),Z("div",{className:"bb-field bb-field--full",children:Z("p",{className:"bb-note",style:{margin:0},children:n==="metalness"?"Metalness workflow maps directly to the underlying physical material.":"Specular workflow exposes the same physical material with non-metal specular controls; it does not switch to a separate spec/gloss shader."})}),Z(Jt,{label:n==="specular"?"Albedo texture path":"Base color texture path",placeholder:"materials/oak-wood.jpg",value:t?.texture?.path??"",onChange:p=>l(e,"texture",p)}),Z(bo,{label:n==="specular"?"Albedo color":"Base color",value:t?.baseColor??"#ffffff",onChange:p=>c(e,m=>({...m,baseColor:p}))}),n==="metalness"?nn(rh,{children:[Z(Pt,{label:"Metalness",value:t?.metalness,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,metalness:p}))}),Z(Jt,{label:"Metalness map path",placeholder:"materials/body-metalness.jpg",value:t?.metalnessMap?.path??"",onChange:p=>l(e,"metalnessMap",p)})]}):nn(rh,{children:[Z(Pt,{label:"Specular intensity",value:t?.specularIntensity,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,specularIntensity:p}))}),Z(bo,{label:"Specular color",value:t?.specularColor??"#ffffff",onChange:p=>c(e,m=>({...m,specularColor:p}))}),Z(Jt,{label:"Specular intensity map path",placeholder:"materials/body-specular-intensity.jpg",value:t?.specularIntensityMap?.path??"",onChange:p=>l(e,"specularIntensityMap",p)}),Z(Jt,{label:"Specular color map path",placeholder:"materials/body-specular-color.jpg",value:t?.specularColorMap?.path??"",onChange:p=>l(e,"specularColorMap",p)})]}),Z(Pt,{label:"Specular F0 / reflectivity",value:t?.reflectivity,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,reflectivity:p}))})]}):nn("div",{className:"bb-grid",children:[Z(bo,{label:"Base color",value:t?.baseColor??"#ffffff",onChange:p=>c(e,m=>({...m,baseColor:p}))}),Z(Pt,{label:"Metalness",value:t?.metalness,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,metalness:p}))}),Z("div",{className:"bb-field bb-field--full",children:Z(jn,{requiredTier:"starter",feature:"Texture maps, the specular workflow, and reflectivity"})})]})}),Z($n,{panelKey:"roughness",requiredTier:g,title:"Roughness / Glossiness",tooltip:"Adjusts how matte or shiny the surface appears.",toggleLabel:"Toggle Roughness and Glossiness",controls:u,children:nn("div",{className:"bb-grid",children:[Z(wa,{label:"Mode",value:f,options:["roughness","glossiness"],onChange:y}),Z("div",{className:"bb-field bb-field--full",children:Z("p",{className:"bb-note",style:{margin:0},children:f==="roughness"?"Roughness: 0 is glossy, 1 is matte.":"Glossiness is the inverse of roughness (glossiness = 1 \u2212 roughness)"})}),f==="roughness"?Z(Pt,{label:"Roughness",value:t?.roughness,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,roughness:p}))}):Z(Pt,{label:"Glossiness",value:t?.roughness===void 0?void 0:1-t.roughness,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,roughness:p===void 0?void 0:1-p}))}),Z(Jt,{label:f==="glossiness"?"Glossiness map path (applied as roughness)":"Roughness map path",placeholder:"materials/body-roughness.jpg",value:t?.roughnessMap?.path??"",onChange:p=>l(e,"roughnessMap",p)})]})}),Z($n,{panelKey:"emission",requiredTier:g,title:"Emission",tooltip:"Makes the material self-illuminated with emissive color and intensity.",controls:u,children:nn("div",{className:"bb-grid",children:[Z(bo,{label:"Emissive color",value:t?.emissive??"#000000",fallback:"#000000",onChange:p=>c(e,m=>({...m,emissive:p}))}),Z(Pt,{label:"Emissive intensity",value:t?.emissiveIntensity,min:0,max:10,step:.1,onChange:p=>c(e,m=>({...m,emissiveIntensity:p}))}),Z(Jt,{label:"Emissive map path",placeholder:"materials/body-emissive.jpg",value:t?.emissiveMap?.path??"",onChange:p=>l(e,"emissiveMap",p)})]})}),Z($n,{panelKey:"opacity",requiredTier:g,title:"Opacity",tooltip:"Controls transparency, alpha testing, and blending behavior.",controls:u,children:nn("div",{className:"bb-grid",children:[Z(Pt,{label:"Opacity",value:t?.opacity,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,opacity:p}))}),Z(Pt,{label:"Alpha test",value:t?.alphaTest,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,alphaTest:p}))}),Z(Jt,{label:"Alpha map path",placeholder:"materials/body-alpha.png",value:t?.alphaMap?.path??"",onChange:p=>l(e,"alphaMap",p)}),Z(wa,{label:"Blending mode",value:t?.blendingMode??"normal",options:Sd,onChange:p=>c(e,m=>({...m,blendingMode:p}))}),nn("div",{className:"bb-field",children:[Z("label",{className:"bb-label",children:"Alpha hash"}),Z("div",{className:"bb-checkboxRow",children:Z(Gs,{label:"Use alpha hash",checked:t?.alphaHash??!1,onChange:p=>c(e,m=>({...m,alphaHash:p}))})})]}),nn("div",{className:"bb-field",children:[Z("label",{className:"bb-label",children:"Dithering"}),Z("div",{className:"bb-checkboxRow",children:Z(Gs,{label:"Use dithering",checked:t?.dithering??!1,onChange:p=>c(e,m=>({...m,dithering:p}))})})]})]})}),nn($n,{panelKey:"normalBump",requiredTier:g,title:"Normal & Bump",tooltip:"Adds surface detail without changing the actual mesh shape.",toggleLabel:"Toggle Normal and Bump",controls:u,children:[nn("div",{className:"bb-grid",children:[Z(Jt,{label:"Normal map path",placeholder:"materials/body-normal.jpg",value:t?.normalMap?.path??"",onChange:p=>l(e,"normalMap",p)}),Z(Pt,{label:"Normal scale",value:t?.normalScale,min:0,max:5,step:.01,onChange:p=>c(e,m=>({...m,normalScale:p}))}),Z(Jt,{label:"Bump map path",placeholder:"materials/body-bump.jpg",value:t?.bumpMap?.path??"",onChange:p=>l(e,"bumpMap",p)}),Z(Pt,{label:"Bump scale",value:t?.bumpScale,min:0,max:5,step:.01,onChange:p=>c(e,m=>({...m,bumpScale:p}))})]}),Z("div",{className:"bb-checkboxRow",style:{marginTop:12},children:Z(Gs,{label:"Flip normal Y",checked:t?.flipNormalY??!1,onChange:p=>c(e,m=>({...m,flipNormalY:p}))})})]}),Z($n,{panelKey:"displacement",requiredTier:g,title:"Displacement",tooltip:"Offsets geometry using a texture to create real surface height.",controls:u,children:nn("div",{className:"bb-grid",children:[Z(Jt,{label:"Displacement map path",placeholder:"materials/body-displacement.jpg",value:t?.displacementMap?.path??"",onChange:p=>l(e,"displacementMap",p)}),Z(Pt,{label:"Displacement scale",value:t?.displacementScale,min:-5,max:5,step:.01,onChange:p=>c(e,m=>({...m,displacementScale:p}))}),Z(Pt,{label:"Displacement bias",value:t?.displacementBias,min:-5,max:5,step:.01,onChange:p=>c(e,m=>({...m,displacementBias:p}))})]})}),Z($n,{panelKey:"ao",requiredTier:g,title:"Ambient Occlusion",tooltip:"Darkens creases and contact areas to add depth.",controls:u,children:nn("div",{className:"bb-grid",children:[Z(Jt,{label:"AO map path",placeholder:"materials/body-ao.jpg",value:t?.aoMap?.path??"",onChange:p=>l(e,"aoMap",p)}),Z(Pt,{label:"AO intensity",value:t?.aoMapIntensity,min:0,max:5,step:.01,onChange:p=>c(e,m=>({...m,aoMapIntensity:p}))})]})}),nn($n,{panelKey:"clearcoat",requiredTier:g,title:"Clearcoat",tooltip:"Adds a glossy protective layer on top of the base material.",controls:u,children:[nn("div",{className:"bb-grid",children:[Z(Jt,{label:"Clearcoat map path",placeholder:"materials/body-clearcoat.jpg",value:t?.clearcoatMap?.path??"",onChange:p=>l(e,"clearcoatMap",p)}),Z(Pt,{label:"Clearcoat",value:t?.clearcoat,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,clearcoat:p}))}),Z(Jt,{label:"Clearcoat roughness map path",placeholder:"materials/body-clearcoat-roughness.jpg",value:t?.clearcoatRoughnessMap?.path??"",onChange:p=>l(e,"clearcoatRoughnessMap",p)}),Z(Pt,{label:"Clearcoat roughness",value:t?.clearcoatRoughness,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,clearcoatRoughness:p}))}),Z(Jt,{label:"Clearcoat normal map path",placeholder:"materials/body-clearcoat-normal.jpg",value:t?.clearcoatNormalMap?.path??"",onChange:p=>l(e,"clearcoatNormalMap",p)}),Z(Pt,{label:"Clearcoat normal scale",value:t?.clearcoatNormalScale,min:0,max:5,step:.01,onChange:p=>c(e,m=>({...m,clearcoatNormalScale:p}))})]}),Z("div",{className:"bb-checkboxRow",style:{marginTop:12},children:Z(Gs,{label:"Flip clearcoat normal Y",checked:t?.flipClearcoatNormalY??!1,onChange:p=>c(e,m=>({...m,flipClearcoatNormalY:p}))})})]}),Z($n,{panelKey:"sheen",requiredTier:g,title:"Sheen",tooltip:"Adds a soft fabric-like sheen on grazing angles.",controls:u,children:nn("div",{className:"bb-grid",children:[Z(Pt,{label:"Sheen",value:t?.sheen,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,sheen:p}))}),Z(bo,{label:"Sheen color",value:t?.sheenColor??"#ffffff",onChange:p=>c(e,m=>({...m,sheenColor:p}))}),Z(Jt,{label:"Sheen color map path",placeholder:"materials/body-sheen-color.jpg",value:t?.sheenColorMap?.path??"",onChange:p=>l(e,"sheenColorMap",p)}),Z(Pt,{label:"Sheen roughness",value:t?.sheenRoughness,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,sheenRoughness:p}))}),Z(Jt,{label:"Sheen roughness map path",placeholder:"materials/body-sheen-roughness.jpg",value:t?.sheenRoughnessMap?.path??"",onChange:p=>l(e,"sheenRoughnessMap",p)})]})}),Z($n,{panelKey:"anisotropy",requiredTier:g,title:"Anisotropy",tooltip:"Stretches reflections in one direction for brushed or fiber-like surfaces.",controls:u,children:nn("div",{className:"bb-grid",children:[Z(Pt,{label:"Intensity",value:t?.anisotropy,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,anisotropy:p}))}),Z(wa,{label:"Tilt direction",value:k,options:["factor","texture"],onChange:v}),k==="factor"?Z(Pt,{label:"Rotation (rad)",value:t?.anisotropyRotation,min:0,max:6.28,step:.01,onChange:p=>c(e,m=>({...m,anisotropyRotation:p}))}):Z(Jt,{label:"Anisotropy map path",placeholder:"materials/body-anisotropy.jpg",value:t?.anisotropyMap?.path??"",onChange:p=>l(e,"anisotropyMap",p)})]})}),Z($n,{panelKey:"transmission",requiredTier:g,title:"Transmission & Volume",tooltip:"Controls glass-like transmission and how light travels through volume.",toggleLabel:"Toggle Transmission and Volume",controls:u,children:nn("div",{className:"bb-grid",children:[Z(Pt,{label:"Transmission",value:t?.transmission,min:0,max:1,step:.01,onChange:p=>c(e,m=>({...m,transmission:p}))}),Z(Jt,{label:"Transmission map path",placeholder:"materials/body-transmission.jpg",value:t?.transmissionMap?.path??"",onChange:p=>l(e,"transmissionMap",p)}),Z(Pt,{label:"Thickness",value:t?.thickness,min:0,max:5,step:.01,onChange:p=>c(e,m=>({...m,thickness:p}))}),Z(Jt,{label:"Thickness map path",placeholder:"materials/body-thickness.jpg",value:t?.thicknessMap?.path??"",onChange:p=>l(e,"thicknessMap",p)}),Z(bo,{label:"Volume tint",value:t?.attenuationColor??"#ffffff",onChange:p=>c(e,m=>({...m,attenuationColor:p}))}),Z(w0,{label:"Attenuation distance",value:t?.attenuationDistance,min:0,step:.01,placeholder:"Infinity when unset",onChange:p=>c(e,m=>({...m,attenuationDistance:p}))})]})}),Z($n,{panelKey:"faces",requiredTier:g,title:"Faces Rendering",tooltip:"Chooses which side of the mesh renders and how backfaces are handled.",controls:u,children:Z("div",{className:"bb-grid",children:Z(wa,{label:"Side",value:t?.side??"front",options:Cd,onChange:p=>c(e,m=>({...m,side:p}))})})})]})}var M0=[{id:"wood",label:"Wood",swatch:"#8b5a2b",material:{baseColor:"#8b5a2b",metalness:0,roughness:.75,reflectivity:.04}},{id:"brushed-metal",label:"Brushed Metal",swatch:"linear-gradient(135deg, #cfcfcf, #8a8a8a)",material:{baseColor:"#c8c8c8",metalness:1,roughness:.35}},{id:"chrome",label:"Polished Chrome",swatch:"linear-gradient(135deg, #ffffff, #9aa0a6)",material:{baseColor:"#e8e8e8",metalness:1,roughness:.05}},{id:"gold",label:"Gold",swatch:"linear-gradient(135deg, #ffe9a8, #c89b2c)",material:{baseColor:"#e6b325",metalness:1,roughness:.2}},{id:"copper",label:"Copper",swatch:"linear-gradient(135deg, #e3a576, #8a4a26)",material:{baseColor:"#b87333",metalness:1,roughness:.3}},{id:"glass",label:"Glass",swatch:"linear-gradient(135deg, rgba(255,255,255,0.9), rgba(180,210,230,0.4))",material:{baseColor:"#ffffff",metalness:0,roughness:.02,reflectivity:.5,opacity:1,transmission:1,thickness:.5,attenuationColor:"#ffffff",attenuationDistance:1}},{id:"frosted-glass",label:"Frosted Glass",swatch:"linear-gradient(135deg, rgba(255,255,255,0.85), rgba(210,225,235,0.6))",material:{baseColor:"#ffffff",metalness:0,roughness:.4,reflectivity:.3,opacity:1,transmission:.9,thickness:.5}},{id:"plastic-glossy",label:"Glossy Plastic",swatch:"#dadada",material:{baseColor:"#dadada",metalness:0,roughness:.25,reflectivity:.5,clearcoat:.3,clearcoatRoughness:.1}},{id:"plastic-matte",label:"Matte Plastic",swatch:"#9a9a9a",material:{baseColor:"#9a9a9a",metalness:0,roughness:.85,reflectivity:.04}},{id:"rubber",label:"Rubber",swatch:"#1a1a1a",material:{baseColor:"#1a1a1a",metalness:0,roughness:.9,reflectivity:.02}},{id:"fabric",label:"Fabric",swatch:"#9c8a6b",material:{baseColor:"#9c8a6b",metalness:0,roughness:.95,sheen:.4,sheenColor:"#ffffff",sheenRoughness:.6}},{id:"ceramic",label:"Ceramic",swatch:"#f5f5f0",material:{baseColor:"#f5f5f0",metalness:0,roughness:.15,clearcoat:.6,clearcoatRoughness:.1}},{id:"concrete",label:"Concrete",swatch:"#9b9b93",material:{baseColor:"#9b9b93",metalness:0,roughness:.95,reflectivity:.03}}];import{jsx as ih,jsxs as Vk}from"react/jsx-runtime";function T0({disabled:e,onApply:t}){return ih("div",{className:"bb-presetGallery",children:M0.map(n=>Vk("button",{type:"button",className:"bb-presetSwatch",disabled:e,title:`Apply ${n.label} preset`,onClick:()=>t(n.material),children:[ih("span",{className:"bb-presetSwatchColor",style:{background:n.swatch}}),ih("span",{className:"bb-presetSwatchLabel",children:n.label})]},n.id))})}import{useEffect as Fk,useRef as Uk,useState as Gk}from"react";import{ChevronDown as Hk,Download as Wk,FileCode2 as $k,FileJson as Xk}from"lucide-react";import{jsx as Gc,jsxs as Hs}from"react/jsx-runtime";function oh({disabled:e,exporting:t,onExportJson:n,onExportTs:i}){let[r,o]=Gk(!1),a=Uk(null);return Fk(()=>{if(!r)return;let s=c=>{a.current?.contains(c.target)||o(!1)};return window.addEventListener("pointerdown",s),()=>window.removeEventListener("pointerdown",s)},[r]),Hs("div",{className:"bb-exportMenuWrapper",ref:a,children:[Hs("button",{type:"button",className:"bb-button bb-button--ghost",disabled:e||t,onClick:()=>o(s=>!s),title:"Export",children:[Gc(Wk,{size:14}),t?"Exporting\u2026":"Export",Gc(Hk,{size:12})]}),r&&Hs("div",{className:"bb-exportMenu",children:[Hs("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{o(!1),n()},children:[Gc(Xk,{size:14}),"JSON"]}),Hs("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{o(!1),i()},children:[Gc($k,{size:14}),"TypeScript"]})]})]})}import{jsx as xo,jsxs as ah}from"react/jsx-runtime";function P0({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r,idError:o}){return xo(Vn,{title:"Identity",open:n,onToggle:i,children:ah("div",{className:"bb-grid",children:[ah("div",{className:"bb-field bb-field--full",children:[xo("label",{className:"bb-label",children:"Model Node ID"}),xo("span",{className:"bb-note",children:"This is the exact mesh name from the imported model and stays locked."}),xo("input",{className:"bb-input bb-readonly",value:t.modelObjectId,readOnly:!0})]}),ah("div",{className:"bb-field bb-field--full",children:[xo("label",{className:"bb-label",children:"ID"}),xo("input",{className:`bb-input ${o?"bb-input--error":""}`,value:t.id,onChange:a=>r(e,s=>({...s,id:a.target.value}))}),o?xo("span",{className:"bb-status bb-status--error",children:o}):null]})]})})}import{useEffect as qk,useState as A0}from"react";var k0=["other","body","light","wheel","glass","interior","floor","wall","door","furniture","decor","electronics","seat","table","chair","window","sofa","bed","engine","headlight"],_0=["normal","hidden","selected","disabled"];import{jsx as Mn,jsxs as Sr}from"react/jsx-runtime";function E0({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r}){let[o,a]=A0(t.group??""),[s,c]=A0(t.tags?.join(", ")??"");qk(()=>{a(t.group??""),c(t.tags?.join(", ")??"")},[e,t.group,t.tags]);let l=()=>{r(e,d=>({...d,group:o.trim()||void 0}))},u=()=>{let d=[...new Set(s.split(",").map(h=>h.trim()).filter(Boolean))];r(e,h=>({...h,tags:d.length>0?d:void 0}))};return Sr(Vn,{title:"Basics",open:n,onToggle:i,children:[Sr("div",{className:"bb-grid",children:[Sr("div",{className:"bb-field",children:[Mn("label",{className:"bb-label",children:"Label"}),Mn("input",{className:"bb-input",value:t.label??"",onChange:d=>r(e,h=>({...h,label:d.target.value}))})]}),Sr("div",{className:"bb-field",children:[Mn("label",{className:"bb-label",children:"Type"}),Mn("input",{className:"bb-input",list:"binding-type-suggestions",value:t.type,onChange:d=>r(e,h=>({...h,type:d.target.value}))}),Mn("datalist",{id:"binding-type-suggestions",children:k0.map(d=>Mn("option",{value:d},d))})]}),Sr("div",{className:"bb-field",children:[Mn("label",{className:"bb-label",children:"Status"}),Mn("select",{className:"bb-select",value:t.status??"normal",onChange:d=>r(e,h=>({...h,status:d.target.value})),children:_0.map(d=>Mn("option",{value:d,children:d},d))})]}),Sr("div",{className:"bb-field",children:[Mn("label",{className:"bb-label",children:"Group"}),Mn("input",{className:"bb-input",placeholder:"paint",value:o,onChange:d=>a(d.target.value),onBlur:l,onKeyDown:d=>{d.key==="Enter"&&d.currentTarget.blur()}})]}),Sr("div",{className:"bb-field",children:[Mn("label",{className:"bb-label",children:"Tags"}),Mn("input",{className:"bb-input",placeholder:"exterior, configurable",value:s,onChange:d=>c(d.target.value),onBlur:u,onKeyDown:d=>{d.key==="Enter"&&d.currentTarget.blur()}})]})]}),Sr("div",{className:"bb-checkboxRow",style:{marginTop:12},children:[Sr("label",{className:"bb-checkbox",children:[Mn("input",{type:"checkbox",checked:t.selectable??!1,onChange:d=>r(e,h=>({...h,selectable:d.target.checked}))}),"selectable"]}),Sr("label",{className:"bb-checkbox",children:[Mn("input",{type:"checkbox",checked:t.hoverable??!1,onChange:d=>r(e,h=>({...h,hoverable:d.target.checked}))}),"hoverable"]}),Sr("label",{className:"bb-checkbox",children:[Mn("input",{type:"checkbox",checked:t.visible??!1,onChange:d=>r(e,h=>({...h,visible:d.target.checked}))}),"visible"]})]})]})}import{useEffect as Kk,useState as Jk}from"react";var yo=[{id:"change-color",label:"Change Color",handling:"viewer",description:"Opens a color picker docked under the action and commits the result to style.material.baseColor."},{id:"change-material",label:"Change Material",handling:"viewer",description:"Opens the material picker so the viewer can swap the object's texture."},{id:"toggle-visibility",label:"Toggle Visibility",handling:"viewer",description:"Flips the binding's visible flag."},{id:"toggle-light",label:"Toggle Light",handling:"host",description:"Seeded on light bindings. Add declarative effects for useViewerActions, or handle it in onAction."},{id:"change-light-color",label:"Change Light Color",handling:"host",description:"Seeded on light bindings. Add declarative effects for useViewerActions, or handle it in onAction."},{id:"set-brightness",label:"Set Brightness",handling:"host",description:"Seeded on light bindings. Add declarative effects for useViewerActions, or handle it in onAction."}],Hc="__custom__";function Ws(e){return yo.find(t=>t.id===e)}var f4=yo.filter(e=>e.handling==="viewer").map(e=>e.id),Yk=new Set(["","New Action",...yo.map(e=>e.label)]);function sh(e){return Yk.has(e.trim())}function R0(e,t){let n=Array.from({length:t.length+1},(i,r)=>r);for(let i=1;i<=e.length;i+=1){let r=[i];for(let o=1;o<=t.length;o+=1){let a=n[o-1]+(e[i-1]===t[o-1]?0:1);r[o]=Math.min(r[o-1]+1,n[o]+1,a)}n=r}return n[t.length]}function L0(e){if(Ws(e))return null;let t=e.trim().toLowerCase();if(!t)return null;let n=t.replace(/[^a-z0-9]/g,""),i=null;for(let r of yo){let o=Math.min(R0(t,r.id),R0(n,r.id.replace(/[^a-z0-9]/g,"")));(!i||o<i.distance)&&(i={id:r.id,distance:o})}return i&&i.distance<=2?i.id:null}import{Fragment as Zk,jsx as Qt,jsxs as cr}from"react/jsx-runtime";var B0=yo.filter(e=>e.handling==="viewer"),Qk=yo.filter(e=>e.handling==="host");function O0({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r}){let[o,a]=Jk(new Set);Kk(()=>{a(new Set)},[e]);let s=t.actions??[],c=(d,h)=>r(e,g=>({...g,actions:(g.actions??[]).map((f,y)=>y===d?h(f):f)})),l=d=>{r(e,h=>({...h,actions:(h.actions??[]).filter((g,f)=>f!==d)})),a(h=>{let g=new Set;return h.forEach(f=>{f<d?g.add(f):f>d&&g.add(f-1)}),g})},u=(d,h)=>a(g=>{let f=new Set(g);return h?f.add(d):f.delete(d),f});return cr(Vn,{title:"Actions",open:n,onToggle:i,children:[Qt("div",{className:"bb-actionList",children:s.map((d,h)=>{let g=Ws(d.id),f=o.has(h)||!g,y=d.id.trim(),k=g?null:L0(d.id),v=y.length>0&&s.some((p,m)=>m!==h&&p.id.trim()===y);return cr("div",{className:"bb-actionCard",children:[cr("div",{className:"bb-actionCardHeader",children:[cr("div",{className:"bb-actionCardTitle",children:["Action ",h+1]}),Qt("div",{className:"bb-actionCardMeta",children:d.type})]}),cr("div",{className:"bb-actionGrid",children:[cr("div",{className:"bb-field",children:[Qt("label",{className:"bb-label",children:"Action ID"}),cr("select",{className:"bb-select",value:f?Hc:d.id,onChange:p=>{let m=p.target.value;if(m===Hc){u(h,!0);return}u(h,!1);let M=Ws(m);c(h,C=>({...C,id:m,label:M&&sh(C.label)?M.label:C.label}))},children:[Qt("optgroup",{label:"Handled by the viewer",children:B0.map(p=>Qt("option",{value:p.id,children:p.id},p.id))}),Qt("optgroup",{label:"Handled by your app",children:Qk.map(p=>Qt("option",{value:p.id,children:p.id},p.id))}),Qt("option",{value:Hc,children:"Custom\u2026"})]})]}),f?cr("div",{className:"bb-field",children:[Qt("label",{className:"bb-label",children:"Custom action ID"}),Qt("input",{className:"bb-input",value:d.id,placeholder:"open-datasheet",onChange:p=>{u(h,!0),c(h,m=>({...m,id:p.target.value}))}})]}):null,cr("div",{className:"bb-field",children:[Qt("label",{className:"bb-label",children:"Label"}),Qt("input",{className:"bb-input",value:d.label,onChange:p=>c(h,m=>({...m,label:p.target.value}))})]}),g?Qt("span",{className:"bb-note",children:g.description}):y.length===0?Qt("span",{className:"bb-note",style:{color:"#fca5a5"},children:"An action ID is required, the button renders but can never be identified in onAction."}):cr("span",{className:"bb-note",style:{color:"#fcd34d"},children:["Unrecognised ID, the viewer has no built-in behavior for it. Add declarative effects and execute them with useViewerActions, or handle it in onAction.",k?cr(Zk,{children:[" Did you mean ",Qt("button",{type:"button",className:"bb-linkButton",onClick:()=>{u(h,!1);let p=Ws(k);c(h,m=>({...m,id:k,label:p&&sh(m.label)?p.label:m.label}))},children:k}),"?"]}):null]}),d.effects?.length?cr("span",{className:"bb-note",children:[d.effects.length," declarative effect",d.effects.length===1?"":"s",", execute with useViewerActions."]}):null,v?Qt("span",{className:"bb-note",style:{color:"#fcd34d"},children:"Another action on this binding uses the same ID, they will render as two identical buttons."}):null]}),Qt("div",{className:"bb-actionFooter",children:Qt("button",{type:"button",className:"bb-button bb-button--ghost bb-actionRemove",onClick:()=>l(h),children:"Remove Action"})})]},h)})}),Qt("div",{style:{marginTop:10},children:Qt("button",{type:"button",className:"bb-button",onClick:()=>{let d=B0.find(h=>!s.some(g=>g.id===h.id));r(e,h=>({...h,actions:[...h.actions??[],{id:d?.id??"",label:d?.label??"New Action",type:"command"}]})),d||u(s.length,!0)},children:"Add Action"})})]})}import{MapPin as e_,Trash2 as t_}from"lucide-react";import{Fragment as n_,jsx as dr,jsxs as Xn}from"react/jsx-runtime";function D0({selectedBinding:e,open:t,onToggle:n,cameraState:i,formattedCameraState:r,savedCameraPosition:o,onSaveCameraPosition:a,onGoToSavedCamera:s,onClearSavedCamera:c,onResetView:l,onFitScene:u}){return Xn(Vn,{title:"Camera Position",open:t,onToggle:n,children:[Xn("div",{className:"se-waypointCard bb-cameraWaypoint",children:[dr("span",{className:"bb-cameraLiveBadge",children:"LIVE"}),Xn("div",{className:"se-waypointBody",children:[dr("div",{className:"bb-cameraWaypointLabel",children:"Current view"}),i?Xn(n_,{children:[Xn("div",{className:"se-waypointCoords",children:["pos ",r?.position]}),Xn("div",{className:"se-waypointCoords",children:["look ",r?.target]})]}):dr("div",{className:"se-waypointCoords",children:"Move the camera to see live position"})]})]}),Xn("div",{className:"bb-cameraControls bb-cameraControls--centered",children:[dr("button",{type:"button",className:"bb-button bb-button--primary",onClick:a,disabled:!i,children:"Save"}),dr("button",{type:"button",className:"bb-button bb-button--ghost",onClick:l,children:"Reset View"}),dr("button",{type:"button",className:"bb-button bb-button--ghost",onClick:u,children:"Fit Scene"})]}),o?.position&&o?.target&&Xn("div",{className:"se-waypointCard bb-cameraWaypoint",children:[dr("span",{className:"bb-cameraSavedBadge",children:"SAVED"}),Xn("div",{className:"se-waypointBody",children:[Xn("div",{className:"bb-cameraWaypointLabel",children:["For ",e.label]}),Xn("div",{className:"se-waypointCoords",children:["pos [",o.position.map(d=>d.toFixed(1)).join(", "),"]"]}),Xn("div",{className:"se-waypointCoords",children:["look [",o.target.map(d=>d.toFixed(1)).join(", "),"]"]})]}),Xn("div",{className:"se-waypointActions",children:[dr("button",{className:"se-waypointAction",onClick:s,title:"Fly camera to the saved position",children:dr(e_,{size:15})}),dr("button",{className:"se-waypointAction se-waypointAction--delete",onClick:c,title:"Delete saved position",children:dr(t_,{size:15})})]})]}),dr("span",{className:"bb-note",children:'Tip: Position the camera how you want, then click "Save" to store this position for the selected object. The camera position updates in real-time as you navigate.'})]})}import{useLayoutEffect as r_,useRef as i_,useState as o_}from"react";import{Move3d as a_,RotateCcw as s_}from"lucide-react";import{jsx as kt,jsxs as Mr}from"react/jsx-runtime";var N0=["X","Y","Z"];var l_=.1;function lh(e){let t=e%360;return t<0?t+360:t}function I0(e){return lh(e*180/Math.PI)}function z0(e){return e*Math.PI/180}function c_(e,t,n){let i=[...e],r=I0(e[t]);return i[t]=z0(lh(r+n)),i}function j0({value:e,min:t=-1/0,max:n=1/0,step:i=.1,disabled:r=!1,onChange:o,formatValue:a=l=>Number(l.toFixed(3)),ariaLabel:s,className:c}){let l=a(e),[u,d]=o_(String(l)),h=i_(!1);return r_(()=>{h.current||d(String(l))},[l]),kt("input",{type:"number",className:c,step:i,min:t===-1/0?void 0:t,max:n===1/0?void 0:n,value:u,disabled:r,"aria-label":s,onFocus:()=>{h.current=!0},onChange:g=>{let f=g.target.value;if(d(f),f===""||f==="-")return;let y=Number(f);if(Number.isFinite(y)){let k=Math.max(t,Math.min(n,y));o(k)}},onBlur:()=>{h.current=!1,d(String(a(e)))}})}function d_({value:e,min:t=-1/0,max:n=1/0,step:i=.1,disabled:r=!1,onChange:o,formatValue:a=c=>Number(c.toFixed(3)),label:s}){return kt("div",{className:"bb-transformAxesGrid",children:N0.map((c,l)=>Mr("div",{className:"bb-transformAxis",children:[kt("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:c}),kt("div",{className:"bb-transformAxisControl",children:kt(j0,{className:"se-numberInput bb-transformNumberInput",step:i,min:t,max:n,value:e[l],disabled:r,formatValue:a,ariaLabel:`${c} ${s?.toLowerCase()||""}`,onChange:u=>{let d=[...e];d[l]=u,o(d)}})})]},c))})}function V0({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r,moveModeEnabled:o,onToggleMoveMode:a,transformSpace:s,onTransformSpaceChange:c,originalTransform:l}){let u=t.transform?.rotation??l?.rotation??[0,0,0],d=t.transform?.position??l?.position??[0,0,0],h=(p,m)=>{let M=p.transform?.rotation??l?.rotation??[0,0,0],C=p.transform?.position??l?.position??[0,0,0],P=p.transform?.scale??l?.scale??[1,1,1],A=l?.pivotLocal??[0,0,0],b=xx(C,M,m,P,A,l?.rotationOrder??"XYZ");return{...p,transform:{...p.transform,position:b,rotation:m}}},g=(p,m)=>{e&&r(e,M=>{let C=M.transform?.rotation??l?.rotation??[0,0,0],P=c_(C,p,m);return h(M,P)})},f=(p,m)=>{e&&r(e,M=>{let P=[...M.transform?.rotation??l?.rotation??[0,0,0]];return P[p]=z0(lh(m)),h(M,P)})},y=(p,m)=>{e&&r(e,M=>{let P=[...M.transform?.position??l?.position??[0,0,0]];return P[p]=m,{...M,transform:{...M.transform,position:P}}})},k=(p,m)=>{e&&y(p,d[p]+m)},v=()=>{!e||!l||r(e,p=>{let m={...p.transform};return delete m.position,delete m.rotation,{...p,transform:Object.keys(m).length>0?m:void 0}})};return Mr(Vn,{title:"Move & Rotate",open:n,onToggle:i,tooltip:"Enable the transform gizmo to move or rotate the selected mesh on any axis. Rotation uses the object's visible center while exported position and rotation remain local GLTF transforms.",children:[Mr("div",{className:"se-field",children:[Mr("div",{className:"se-fieldLabel",children:[Mr("span",{children:[kt(a_,{size:14,style:{marginRight:6,verticalAlign:"-2px"}}),"Transform gizmo"]}),Mr("label",{className:"se-switch","aria-label":"Toggle move mode",children:[kt("input",{type:"checkbox",checked:o,onChange:p=>a(p.target.checked)}),kt("span",{className:"se-switchTrack",children:kt("span",{className:"se-switchThumb"})})]})]}),kt("span",{className:"bb-note",children:"Select a mesh \xB7 drag the colored arrows or planes to move"})]}),Mr("div",{className:"se-field",style:{marginTop:10},children:[kt("div",{className:"se-fieldLabel",children:kt("span",{children:"Axis space"})}),kt("div",{className:"se-segmentedControl",children:["world","local"].map(p=>kt("button",{type:"button",className:`se-segmentedOption ${s===p?"se-segmentedOption--active":""}`,onClick:()=>c(p),children:p},p))})]}),Mr("div",{className:"se-field",style:{marginTop:10},children:[kt("div",{className:"se-fieldLabel",children:kt("span",{children:"Rotation (degrees)"})}),kt("div",{className:"bb-transformAxesGrid",children:N0.map((p,m)=>{let M=Math.round(I0(u[m]));return Mr("div",{className:"bb-transformAxis",children:[kt("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:p}),kt("div",{className:"bb-transformAxisControl",children:kt(j0,{className:"se-numberInput bb-transformNumberInput",step:1,min:0,max:359,value:M,disabled:!e,formatValue:C=>Math.round(C),ariaLabel:`${p} rotation in degrees`,onChange:C=>f(m,C)})})]},p)})})]}),Mr("div",{className:"se-field",style:{marginTop:10},children:[kt("div",{className:"se-fieldLabel",children:kt("span",{children:"Position"})}),kt(d_,{value:d,min:-1/0,max:1/0,step:l_,disabled:!e,label:"position",onChange:p=>{e&&r(e,m=>({...m,transform:{...m.transform,position:p}}))}})]}),Mr("button",{type:"button",className:"bb-button bb-button--ghost",style:{marginTop:10,display:"inline-flex",alignItems:"center",gap:6},disabled:!e||!l,onClick:v,title:"Restore this node's position and rotation to what they were in the original model",children:[kt(s_,{size:14}),"Restore original position & rotation"]})]})}import{memo as g_,useMemo as U0,useState as f_}from"react";function u_(e){return e.trim().replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/[_\s]+/g,"-").replace(/[^a-zA-Z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").toLowerCase()}function ch(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").replace(/\s+/g," ").trim().replace(/\b\w/g,t=>t.toUpperCase())}function p_(e){let t=e.toLowerCase();return t.includes("light")?"light":t.includes("wheel")||t.includes("rim")||t.includes("tire")?"wheel":t.includes("glass")||t.includes("window")||t.includes("windshield")||t.includes("sunroof")?"glass":t.includes("seat")||t.includes("dashboard")||t.includes("console")||t.includes("doorpanel")?"interior":t.includes("floor")?"floor":t.includes("wall")?"wall":t.includes("door")?"door":t.includes("chair")||t.includes("table")||t.includes("sofa")||t.includes("bed")?"furniture":"other"}function h_(e){return e==="light"||e.endsWith("light")?[{id:"toggle-light",label:"Toggle Light",type:"command"},{id:"change-light-color",label:"Change Light Color",type:"command"},{id:"set-brightness",label:"Set Brightness",type:"command"}]:[{id:"change-color",label:"Change Color",type:"command"},{id:"change-material",label:"Change Material",type:"command"},{id:"toggle-visibility",label:"Toggle Visibility",type:"command"}]}function m_(e){let t=p_(e);return{id:u_(e),modelObjectId:e,type:t,label:ch(e),status:"normal",selectable:!0,hoverable:!0,visible:!0,style:{},actions:h_(t),metrics:{},metadata:{}}}function Wc(e){return Object.fromEntries(e.map(t=>[t,m_(t)]))}function F0(e){let{nodesById:t}=qo(e),n=[];for(let[i,r]of Object.entries(t)){let o=r;o.isMesh&&o.geometry&&r.name&&n.push(i)}return n.sort((i,r)=>i.localeCompare(r))}import{Fragment as x_,jsx as vo,jsxs as ki}from"react/jsx-runtime";var G0=g_(b_);function b_({bindings:e,selectedItem:t,onSelect:n,onHover:i,isOpen:r=!0,onToggle:o}){let[a,s]=f_(""),c=U0(()=>Object.keys(e),[e]),l=U0(()=>{let u=a.trim().toLowerCase();return u?c.filter(d=>{let h=e[d];return d.toLowerCase().includes(u)||h.label?.toLowerCase().includes(u)||h.type.toLowerCase().includes(u)}):c},[e,c,a]);return ki("aside",{className:`bb-sidebar bb-sidebar--right ${r?"":"bb-sidebar--collapsed"}`,children:[ki("div",{className:"bb-header bb-header--sidebar",children:[!r&&vo("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>o?.(!0),"aria-label":"Open scene nodes sidebar",title:"Open scene nodes",children:"\u2190"}),r&&ki(x_,{children:[ki("div",{children:[vo("div",{className:"bb-sectionKicker",children:"Scene Nodes"}),ki("div",{className:"bb-sectionHeading",children:[l.length," visible entries"]})]}),vo("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>o?.(!1),"aria-label":"Close scene nodes sidebar",title:"Close scene nodes",children:"\u2192"})]})]}),r&&ki("section",{className:"bb-nodeList",children:[vo("div",{className:"bb-search",children:vo("input",{className:"bb-input",placeholder:"Search nodes, labels, or types",value:a,onChange:u=>s(u.target.value)})}),vo("div",{className:"bb-nodeItems",children:l.map(u=>{let d=e[u];return ki("button",{type:"button",className:`bb-nodeButton ${u===t?"bb-nodeButton--active":""}`,onClick:()=>n(u),onMouseEnter:()=>i?.(u),onMouseLeave:()=>i?.(null),children:[vo("span",{className:"bb-nodeName",children:u}),ki("span",{className:"bb-nodeMeta",children:[d.type,d.label===ch(u)?"":d.label||"\xB7 Untitled"]})]},u)})})]})]})}import{jsx as $c,jsxs as H0}from"react/jsx-runtime";function dh({title:e,label:t,open:n,onToggle:i,draft:r,error:o,example:a,onDraftChange:s,onCommit:c}){return $c(Vn,{title:e,open:n,onToggle:i,children:H0("div",{className:"bb-field",children:[$c("label",{className:"bb-label",children:t}),$c("textarea",{className:"bb-textarea",value:r,onChange:l=>s(l.target.value),onBlur:c}),o?$c("span",{className:"bb-status bb-status--error",children:o}):H0("span",{className:"bb-note",children:["Use a JSON object like ",a,"."]})]})})}function W0(e,t){let n=new Map(e.animations.clips.map(o=>[o.sourceName,o])),i=t.map(({sourceName:o})=>n.get(o)??{sourceName:o,displayName:o,hidden:!1,loopMode:"repeat",speed:1}),r=e.animations.autoplayClip&&i.some(o=>o.sourceName===e.animations.autoplayClip&&!o.hidden)?e.animations.autoplayClip:null;return{clips:i,autoplayClip:r}}import{useCallback as Xc,useReducer as y_,useRef as v_}from"react";var w_=100;function C_(e,t){switch(t.type){case"set":{let n=typeof t.updater=="function"?t.updater(e.present):t.updater;return n===e.present?e:t.coalesce?{...e,present:n,future:[]}:{past:[...e.past,e.present].slice(-w_),present:n,future:[]}}case"undo":{if(e.past.length===0)return e;let n=e.past[e.past.length-1];return{past:e.past.slice(0,-1),present:n,future:[e.present,...e.future]}}case"redo":{if(e.future.length===0)return e;let[n,...i]=e.future;return{past:[...e.past,e.present],present:n,future:i}}case"reset":return{past:[],present:t.value,future:[]}}}function uh(e,t=600){let[n,i]=y_(C_,{past:[],present:e,future:[]}),r=v_(0),o=Xc(l=>{let u=Date.now(),d=u-r.current<t;r.current=u,i({type:"set",updater:l,coalesce:d})},[t]),a=Xc(()=>{r.current=0,i({type:"undo"})},[]),s=Xc(()=>{r.current=0,i({type:"redo"})},[]),c=Xc(l=>{r.current=0,i({type:"reset",value:l})},[]);return{value:n.present,setValue:o,undo:a,redo:s,reset:c,canUndo:n.past.length>0,canRedo:n.future.length>0}}import{strToU8 as S_}from"fflate";function $0(e){return JSON.stringify(e,null,2)}function X0(e){return['import { defineObjectBindings } from "@liveroom-tech/react-immersive/utils";',"",`export const objectBindings = defineObjectBindings(${JSON.stringify(e,null,2)});`,""].join(`
|
|
25
|
+
`)}function q0(e){return JSON.stringify(e,null,2)}function Y0(e){return['import type { SceneConfig } from "@liveroom-tech/react-immersive/utils";',"",`export const sceneConfig: SceneConfig = ${JSON.stringify(e,null,2)};`,""].join(`
|
|
26
|
+
`)}function $s(e,t,n){Xr(new Blob([t],{type:n}),e)}function ph(e){return JSON.stringify(e??{},null,2)}function hh(e){return`[${e[0].toFixed(3)}, ${e[1].toFixed(3)}, ${e[2].toFixed(3)}]`}function M_(e){let t=e.style?.material;return t?Object.values(t).filter(n=>!!n&&typeof n=="object"&&typeof n.path=="string"&&n.path.trim().length>0).map(n=>n.path):[]}async function K0(e){let t=new Set;for(let r of Object.values(e))for(let o of M_(r))t.add(o);let n=[],i=[];return await Promise.all(Array.from(t).map(async r=>{let o=Xm(r);if(o)try{let a=await fetch(o);if(!a.ok)throw new Error(String(a.status));n.push({path:r,blob:await a.blob()})}catch{i.push(r)}})),{assets:n,failedPaths:i}}async function mh(e,t,n,i,r){if(r.length===0){$s(e,t,n);return}let o={[e]:S_(t)};for(let s of r)o[s.path]=new Uint8Array(await s.blob.arrayBuffer());let a=await yl(o);Xr(new Blob([a],{type:"application/zip"}),i)}var gh={pbr:["texture","baseColor","metalness","metalnessMap","specularIntensity","specularIntensityMap","specularColor","specularColorMap","reflectivity"],roughness:["roughness","roughnessMap"],emission:["emissive","emissiveIntensity","emissiveMap"],opacity:["opacity","alphaMap","alphaTest","alphaHash","dithering","blendingMode"],normalBump:["normalMap","normalScale","flipNormalY","bumpMap","bumpScale"],displacement:["displacementMap","displacementScale","displacementBias"],ao:["aoMap","aoMapIntensity"],clearcoat:["clearcoat","clearcoatMap","clearcoatRoughness","clearcoatRoughnessMap","clearcoatNormalMap","clearcoatNormalScale","flipClearcoatNormalY"],sheen:["sheen","sheenColor","sheenColorMap","sheenRoughness","sheenRoughnessMap"],anisotropy:["anisotropy","anisotropyRotation","anisotropyMap"],transmission:["transmission","transmissionMap","thickness","thicknessMap","attenuationColor","attenuationDistance"],faces:["side"]},J0=Object.keys(gh);function Q0(e){if(e==null)return!1;if(typeof e=="string")return e.trim().length>0;if(typeof e=="number")return Number.isFinite(e);if(typeof e=="boolean")return e;if(typeof e=="object"&&"path"in e){let t=e.path;return typeof t=="string"&&t.trim().length>0}return!1}function fh(e){if(e)return Object.values(e).some(Q0)?e:void 0}function ur(e,t){return e?gh[t].some(n=>Q0(e[n])):!1}function bh(e){return{pbr:ur(e,"pbr"),roughness:ur(e,"roughness"),emission:ur(e,"emission"),opacity:ur(e,"opacity"),normalBump:ur(e,"normalBump"),displacement:ur(e,"displacement"),ao:ur(e,"ao"),clearcoat:ur(e,"clearcoat"),sheen:ur(e,"sheen"),anisotropy:ur(e,"anisotropy"),transmission:ur(e,"transmission"),faces:ur(e,"faces")}}function xh(e,t){if(t)return{...e,style:{...e.style,material:t}};if(!e.style)return e;let{material:n,...i}=e.style;return{...e,style:Object.keys(i).length>0?i:void 0}}function Z0(e,t){if(!e)return;let n={...e};for(let i of gh[t])delete n[i];return n}import{Fragment as Ca,jsx as ee,jsxs as qe}from"react/jsx-runtime";var k_="/room.glb";function qc(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function iy(e,t){if(!qc(e)||!qc(t))return t??e;let n={...e};for(let[i,r]of Object.entries(t)){let o=n[i];n[i]=qc(o)&&qc(r)?iy(o,r):r}return n}function oy({licenseKey:e,licenseValidationUrl:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,project:o,onProjectChange:a,projectChangeDebounceMs:s=350,onModelUpload:c,onEditLeaseChange:l}){let u=rn(null),d=rn(null),h=rn(null),[g,f]=Xe(o?.model.url??null),[y,k]=Xe(o?.model.name??""),[v,p]=Xe(o?.model??null),[m,M]=Xe(null),C=uh(o?.objectBindings??{}),P=C.value,A=C.setValue,[b,w]=Xe(!1),[T,S]=Xe(null),[N,R]=Xe(!1),[z,E]=Xe("Load the demo model or upload a GLB, GLTF, OBJ, FBX, or USDZ model to generate bindings."),[j,I]=Xe("default"),[L,B]=Xe(!1),[G,H]=Xe("{}"),[ae,be]=Xe("{}"),[pe,xe]=Xe(null),[Te,ye]=Xe(null),[St,st]=Xe(!1),[De,ve]=Xe(!1),[Y,ft]=Xe(!1),[ze,lt]=Xe({identity:!0,basics:!0,material:!1,actions:!1,camera:!1,transform:!1,metrics:!1,metadata:!1}),[nt,Ee]=Xe({pbr:!0,roughness:!1,emission:!1,opacity:!1,normalBump:!1,displacement:!1,ao:!1,clearcoat:!1,sheen:!1,anisotropy:!1,transmission:!1,faces:!1}),rt=O=>lt(U=>({...U,[O]:!U[O]})),Bt=O=>Ee(U=>({...U,[O]:!U[O]})),[he,Nt]=Xe("object"),[_t,Se]=Xe("General"),[$,ge]=Xe("metalness"),[ie,we]=Xe(bh()),Pe=rn(null),[ke,Le]=Xe(!1),[de,it]=Xe(!0),[Ze,It]=Xe(!0),[Ot,je]=Xe(!1),[Ie,mn]=Xe(null),[bt,xn]=Xe(!1),[yn,zt]=Xe("world"),V=rn({}),_=uh(o?.sceneConfig??Vi),F=_.value,q=_.setValue,[te,Q]=Xe("orbit"),ne=te==="pointerLock",[pt,Ve]=Xe(null),[ct,Ue]=Xe(null),dt=Rc(e,t),fe=Nx(dt.tier),Mt=yh(()=>({isInsideEditor:!0,activeTab:he,activeSubTab:_t,tier:fe,setActiveTab:Nt,setActiveSubTab:Se}),[he,_t,fe]),me=rn(null),jt=rn(0),Ln=rn(0),gn=rn(o?`${o.id}:${o.revision}`:null),on=rn(null),Ei=rn(!1),Pn=rn(!1),Tr=rn(o?{modelUrl:o.model.url,bindings:o.objectBindings,sceneConfig:o.sceneConfig}:null),si=rn(void 0),Fr=rn(0),Zt=rn(null),qn=rn(o?{requestId:0,modelName:o.model.name??"model",modelUrl:o.model.url,storedBindings:o.objectBindings,streaming:!!o.model.tilesetUrl}:null),Ri=rn(null),{cameraState:xt,resetView:Yn,focusObject:Ur,fitScene:Kn,setCameraState:Co,handleCameraChange:Ys,handleViewerReady:Ta}=Gp(),Ks=Dt(O=>{ne||Co({position:O.position,target:O.target,fov:xt?.fov??null,zoom:xt?.zoom??1,azimuthAngle:O.azimuthAngle,polarAngle:O.polarAngle},!0)},[ne,Co,xt]),Bn=Hp(),yt=m?P[m]??null:null,Pa=yt?.style?.material,Pr=yt?.cameraState,So=xt?{position:hh(xt.position),target:hh(xt.target)}:null,Gr=Dt(O=>{q(U=>{let J=U.annotations.map(Me=>Me.id).join(","),se=O.map(Me=>Me.id).join(",");return J===se?U:{...U,annotations:O}})},[]),ka=Dt(O=>{Ve(O?{annotation:O}:null)},[]);wo(()=>{if(!yt){H("{}"),be("{}"),xe(null),ye(null);return}H(ph(yt.metrics)),be(ph(yt.metadata)),xe(null),ye(null)},[yt]),wo(()=>{let O=bh(Pa);if(Pe.current!==m){Pe.current=m,we(O);return}we(U=>{let J=!1,se={...U};for(let Me of J0)O[Me]&&!U[Me]&&(se[Me]=!0,J=!0);return J?se:U})},[m,Pa]),wo(()=>()=>{me.current?.cleanup(),Zt.current&&clearTimeout(Zt.current)},[]);let Mo=Dt((O,U)=>{let J=Wc(O);if(U){let se=new Map(Object.values(U).map(Me=>[Me.modelObjectId,Me]));for(let Me of O){let Ke=se.get(Me);Ke&&(J[Me]=Ke)}}return J},[]);wo(()=>{if(!o)return;let O=`${o.id}:${o.revision}`;if(gn.current===O)return;gn.current=O;let U=g!==o.model.url||v?.tilesetUrl!==o.model.tilesetUrl||v?.assetVersion!==o.model.assetVersion,J=P!==o.objectBindings,se=F!==o.sceneConfig;(U||J||se)&&(Pn.current=!0),p(o.model),k(o.model.name??"model");let Me=o.objectBindings;if(J){let Ke=on.current;Me=Ke?Mo(Ke,o.objectBindings):o.objectBindings,C.reset(Me)}if(se&&_.reset(o.sceneConfig),U){let Ke=++Ln.current;qn.current={requestId:Ke,modelName:o.model.name??"model",modelUrl:o.model.url,storedBindings:o.objectBindings,streaming:!!o.model.tilesetUrl},Ri.current=null,M(null),w(!0),f(o.model.url)}Tr.current={modelUrl:o.model.url,bindings:Me,sceneConfig:o.sceneConfig}},[P,Mo,o,g,F,v,C,_]);let To=rn(a);To.current=a,wo(()=>{if(!o||!To.current||!g)return;if(!Ei.current){Ei.current=!0;return}let O=Tr.current;if(g===o.model.url&&P===o.objectBindings&&F===o.sceneConfig||O!==null&&g===O.modelUrl&&P===O.bindings&&F===O.sceneConfig){Pn.current=!1;return}if(qn.current)return;if(Pn.current){Pn.current=!1;return}let U=window.setTimeout(()=>{To.current?.({projectId:o.id,baseRevision:o.revision,model:{...v??o.model,url:g,name:y||o.model.name},objectBindings:P,sceneConfig:F},"local")},s);return()=>window.clearTimeout(U)},[P,y,g,o,s,v,F]),wo(()=>{let O=U=>{if(U.key.toLowerCase()!=="z"||!(U.metaKey||U.ctrlKey))return;let J=U.target,se=J?.tagName;if(se==="INPUT"||se==="TEXTAREA"||J?.isContentEditable)return;U.preventDefault();let Me=he==="scene"?_:C;U.shiftKey?Me.redo():Me.undo()};return window.addEventListener("keydown",O),()=>window.removeEventListener("keydown",O)},[he,C,_]),wo(()=>{if(b||j==="default"||j==="success")return;B(!0);let O=window.setTimeout(()=>B(!1),4e3);return()=>window.clearTimeout(O)},[z,j,b]);let fn=yh(()=>Object.keys(P),[P]),Po=yh(()=>!m||!yt?null:yt.id.trim()?Object.entries(P).some(([J,se])=>J!==m&&se.id===yt.id)?"Another binding already uses this ID.":null:"ID is required.",[P,m,yt]),Jn=(O,U)=>{A(J=>({...J,[O]:U(J[O])}))},Li=(O,U)=>{Jn(O,J=>{let se=fh(U(J.style?.material));return xh(J,se)})},_a=(O,U,J)=>{Li(O,se=>({...se,[U]:J?{path:J}:void 0}))},Js=(O,U)=>{we(J=>({...J,[O]:U})),!U&&m&&Jn(m,J=>{let se=fh(Z0(J.style?.material,O));return xh(J,se)})},Aa=Dt((O,U,J)=>{let se=F0(O),Me=Wc(se);if(J){let ot=new Map(Object.values(J).map(Ge=>[Ge.modelObjectId,Ge]));for(let Ge of se){let gr=ot.get(Ge);gr&&(Me[Ge]=gr)}}O.updateMatrixWorld(!0);let Ke={};for(let ot of se){let Ge=xr(O,ot);if(!Ge){Ke[ot]={position:[0,0,0],rotation:[0,0,0],scale:[1,1,1],pivotLocal:[0,0,0],rotationOrder:"XYZ"};continue}let gr=jc(Ge);Ke[ot]={position:[Ge.position.x,Ge.position.y,Ge.position.z],rotation:[Ge.rotation.x,Ge.rotation.y,Ge.rotation.z],scale:[Ge.scale.x,Ge.scale.y,Ge.scale.z],pivotLocal:[gr.x,gr.y,gr.z],rotationOrder:Ge.rotation.order}}V.current=Ke,C.reset(Me),M(se[0]??null),J||q(ot=>({...ot,annotations:[]})),E(`Generated ${se.length} bindings from ${U}.`),I("success"),Fr.current=100,S(100),Zt.current&&clearTimeout(Zt.current),Zt.current=setTimeout(()=>{Zt.current=null,w(!1),S(null)},400)},[C,q]),Ea=(O,U,J,se)=>{let Me=++Ln.current;w(!0),S(null),Fr.current=0,Zt.current&&(clearTimeout(Zt.current),Zt.current=null),si.current=J;let Ke=J?J/1048576:0;E(Ke>=100?`Reading ${U} (${Math.round(Ke)}MB \u2014 large file, this can take a while)...`:`Reading ${U} and generating starter bindings...`),I("default"),k(U),p(se??{url:O,name:U}),Ve(null);let ot=Ri.current;if(O===g&&ot?.url===O){qn.current=null,Aa(ot.scene,U);return}qn.current={requestId:Me,modelName:U,modelUrl:O,streaming:!!se?.tilesetUrl},f(O),C.reset({}),M(null)},nd=Dt(O=>{let U=qn.current;if(!(!U||U.requestId!==Ln.current)){if(qn.current=null,Ri.current={url:U.modelUrl,scene:O},U.streaming){E(`Streaming ${U.modelName}.`),I("success"),w(!1);return}U.storedBindings&&(Pn.current=!0),Aa(O,U.modelName,U.storedBindings)}},[Aa,C]),rd=Dt(O=>{let U=O.map(se=>se.name);if(U.length===0)return;on.current=U,Pn.current=!0;let J=Mo(U,o?.objectBindings);if(C.reset(J),o){let se=Tr.current;Tr.current={modelUrl:se?.modelUrl??o.model.url,bindings:J,sceneConfig:se?.sceneConfig??o.sceneConfig}}M(se=>se??U[0]??null),E(`Streaming ${U.length} bindable objects.`),I("success"),w(!1)},[Mo,C,o]),Fn=Dt(O=>{let U=qn.current;!U||U.requestId!==Ln.current||(qn.current=null,console.error(O),E(`Could not read ${U.modelName}. Make sure the file is a valid GLB, GLTF, OBJ, FBX, or USDZ asset.`),I("error"),Zt.current&&(clearTimeout(Zt.current),Zt.current=null),Fr.current=0,w(!1),S(null))},[]),Qs=Dt(O=>{let U=null;if(O.lengthComputable&&O.total>0)U=O.loaded/O.total*100;else{let se=si.current;se&&se>0&&(U=O.loaded/se*100)}if(U===null)return;let J=Math.min(90,Math.floor(U/10)*10);J>Fr.current&&(Fr.current=J,S(J)),U>=99.5&&E(se=>se.startsWith("Finalizing")?se:"Finalizing model \u2014 parsing geometry and textures (large files can take a moment here)...")},[]),kr=Dt(O=>{Bn.handleAnimationsReady(O);let U=O.clipDetails??O.clips.map(J=>({sourceName:J,duration:0}));q(J=>({...J,animations:W0(J,U)}))},[Bn,q]),ko=async()=>{me.current?.cleanup(),me.current=null,await Ea(k_,"room.glb")},an=async O=>{if(c){try{w(!0),E(`Uploading ${O.name}...`),I("default");let J=await c(O);await Ea(J.url,J.name??O.name,O.size,J)}catch(J){w(!1),E(J instanceof Error?J.message:`Could not upload ${O.name}.`),I("error")}return}let U;try{U=await Ol(O)}catch(J){E(J instanceof Error?J.message:"Could not read model file. Upload a .glb, .gltf, .obj, .fbx, .usdz, or .zip asset."),I("error");return}me.current?.cleanup(),me.current=U,await Ea(U.url,U.name,O.size,{url:U.url,name:U.name})},_o=async O=>{let U=O.target.files?.[0];U&&(await an(U),O.target.value="")},Ra=()=>{me.current?.cleanup(),me.current=null,Ri.current=null,qn.current=null,V.current={},jt.current=0,st(!1),Zt.current&&(clearTimeout(Zt.current),Zt.current=null),Fr.current=0,S(null),si.current=void 0,f(null),k(""),p(null),M(null),Ve(null),C.reset({}),H("{}"),be("{}"),xe(null),ye(null),Ue(null),xn(!1),q(O=>({...O,animations:Vi.animations,annotations:[]})),E("Load the demo model or upload a GLB, GLTF, OBJ, FBX, or USDZ model to generate bindings."),I("default")},Zs=()=>{u.current?.click()},id=()=>{d.current?.click()},el=async O=>{R(!0);try{let{assets:U,failedPaths:J}=await K0(P);O==="json"?await mh("objectBindings.json",$0(P),"application/json","objectBindings.zip",U):await mh("objectBindings.ts",X0(P),"text/typescript","objectBindings-ts.zip",U),J.length>0?(E(`Exported, but ${J.length} uploaded image${J.length===1?"":"s"} couldn't be bundled: ${J.join(", ")}.`),I("error")):U.length>0&&(E(`Exported with ${U.length} uploaded image${U.length===1?"":"s"} bundled into the zip.`),I("success"))}catch(U){let J=U instanceof Error?U.message:"Unknown export error.";E(`Failed to export bindings: ${J}`),I("error")}finally{R(!1)}},_r=async O=>{if(!fn.length){E("Load a model before importing bindings."),I("error");return}let U;try{U=JSON.parse(await O.text())}catch{E(`${O.name} is not valid JSON.`),I("error");return}if(U===null||typeof U!="object"||Array.isArray(U)){E("Expected a JSON object mapping object IDs to bindings."),I("error");return}let J=new Map;for(let ot of Object.values(U))if(ot!==null&&typeof ot=="object"&&typeof ot.id=="string"&&typeof ot.type=="string"&&typeof ot.modelObjectId=="string"){let Ge=ot;J.set(Ge.modelObjectId,Ge)}if(J.size===0){E(`${O.name} doesn't look like an exported bindings file.`),I("error");return}let se={...P},Me=0;for(let ot of Object.keys(se)){let Ge=J.get(ot);Ge&&(se[ot]=Ge,Me++)}if(Me===0){E(`None of the object IDs in ${O.name} match this model \u2014 nothing imported.`),I("error");return}A(se);let Ke=J.size-Me;E(Ke>0?`Imported ${Me} binding${Me===1?"":"s"} from ${O.name} (${Ke} skipped \u2014 not in this model).`:`Imported ${Me} binding${Me===1?"":"s"} from ${O.name}.`),I("success")},Bi=async O=>{let U=O.target.files?.[0];U&&(await _r(U),O.target.value="")},La=()=>{h.current?.click()},mr=async O=>{let U;try{U=JSON.parse(await O.text())}catch{E(`${O.name} is not valid JSON.`),I("error");return}if(U===null||typeof U!="object"||Array.isArray(U)){E("Expected a JSON object with scene config sections."),I("error");return}let J=["model","camera","lighting","wireframe","shadows","environment","background","groundShadows","postProcessing","animations","annotations","cinematic"],se=U,Me=J.filter(Ke=>se[Ke]!==void 0);if(Me.length===0){E(`${O.name} doesn't look like an exported scene config file.`),I("error");return}q(Ke=>{let ot={...Ke};for(let Ge of Me)ot[Ge]=iy(Ke[Ge],se[Ge]);return ot}),E(`Imported ${Me.length} section${Me.length===1?"":"s"} from ${O.name}.`),I("success")},tl=async O=>{let U=O.target.files?.[0];U&&(await mr(U),O.target.value="")},Oi=O=>{O.preventDefault(),O.stopPropagation(),!(b||g)&&(jt.current+=1,st(!0))},Ba=O=>{O.preventDefault(),O.stopPropagation(),!(b||g)&&(O.dataTransfer.dropEffect="copy",st(!0))},Di=O=>{O.preventDefault(),O.stopPropagation(),!(b||g)&&(jt.current=Math.max(0,jt.current-1),jt.current===0&&st(!1))},Hr=async O=>{if(O.preventDefault(),O.stopPropagation(),jt.current=0,st(!1),b||g)return;let U=O.dataTransfer.files?.[0];U&&await an(U)},Oa=(O,U,J)=>{if(!m)return;let se;try{se=JSON.parse(U)}catch{J("Invalid JSON");return}if(se===null||typeof se!="object"||Array.isArray(se)){J("Expected a JSON object");return}if(O==="metrics"&&Object.values(se).some(Ke=>typeof Ke!="number"||!Number.isFinite(Ke))){J("Metrics values must be numbers");return}Jn(m,Me=>({...Me,[O]:se})),J(null)},od=Dt(O=>{if(ne){Q("orbit");return}if(!O){M(null);return}let U=Object.entries(P).find(([J,se])=>se===O||J===O.modelObjectId||se.modelObjectId===O.modelObjectId)?.[0]??null;M(U)},[ne,P]),Da=Dt(async O=>{if(ne){Q("orbit");return}M(O),Ue(null),await Ur(O)},[ne,Ur]),nl=Dt(O=>{Ue(O?P[O]??null:null)},[P]),Ni=Dt(O=>ft(!O),[]),rl=Dt(()=>{if(ne){E("Camera positions aren't available while Pointer Lock is the active camera controller."),I("error");return}if(!m||!xt)return;let O={position:xt.position,target:xt.target,...xt.fov!=null?{fov:xt.fov}:{},zoom:xt.zoom};Jn(m,U=>({...U,cameraState:O}))},[ne,m,xt]),il=Dt(()=>{if(ne){E("Camera positions aren't available while Pointer Lock is the active camera controller."),I("error");return}!Pr?.position||!Pr?.target||Co({position:Pr.position,target:Pr.target,fov:Pr.fov??xt?.fov??null,zoom:Pr.zoom??xt?.zoom??1},!0)},[ne,Pr,Co,xt]),ol=Dt(()=>{ne||m&&Jn(m,O=>({...O,cameraState:void 0}))},[ne,m]),ad=Dt(async()=>{if(ne){E("Reset View isn't available while Pointer Lock is the active camera controller."),I("error");return}await Yn()},[ne,Yn]),sd=Dt(async()=>{if(ne){E("Fit Scene isn't available while Pointer Lock is the active camera controller."),I("error");return}await Kn()},[ne,Kn]),Na=Dt(O=>{mn(O),je(!0)},[]),Qn=Dt(()=>{je(!1),mn(null)},[]),al=Dt(()=>{if(Ie==="bindings"){if(!fn.length){Qn();return}let O=Wc(fn);C.reset(O),M(fn[0]??null),E("Object bindings reset to default values."),I("success")}else Ie==="scene"&&(_.reset(Vi),E("Scene config reset to default values."),I("success"));Qn()},[Ie,fn,C,_,Qn]);return dt.status==="checking"?ee("div",{className:"bb-root bb-root--licenseChecking",children:ee(Hi,{title:"Verifying License",message:"Checking your license key..."})}):dt.status==="invalid"?ee("div",{className:"bb-root bb-root--licenseInvalid",children:ee(Hi,{tone:"error",title:"Invalid License",message:dt.isLocalDomain?dt.reason??"License has been revoked or has expired":"Failed to load. Please contact the site administrator."})}):qe(_p.Provider,{value:Mt,children:[qe("div",{className:"bb-root",children:[ee("input",{ref:u,type:"file",accept:Bl,className:"bb-hiddenInput",onChange:_o,disabled:b}),ee("input",{ref:d,type:"file",accept:".json,application/json",className:"bb-hiddenInput",onChange:Bi,disabled:b}),ee("input",{ref:h,type:"file",accept:".json,application/json",className:"bb-hiddenInput",onChange:tl,disabled:b}),qe("aside",{className:`bb-sidebar bb-sidebar--left ${De?"bb-sidebar--collapsed":""}`,children:[qe("div",{className:"bb-header bb-header--sidebar",children:[!De&&ee("h1",{className:"bb-title",children:"Binding Builder"}),ee("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>ve(O=>!O),"aria-label":De?"Open editor sidebar":"Collapse editor sidebar",title:De?"Open editor":"Collapse editor",children:De?"\u2192":"\u2190"})]}),!De&&qe(Ca,{children:[qe("div",{className:"bb-tabRow",children:[ee("button",{type:"button",className:`bb-tab ${he==="object"?"bb-tab--active":""}`,onClick:()=>Nt("object"),children:"Object"}),ee("button",{type:"button",className:`bb-tab ${he==="scene"?"bb-tab--active":""}`,onClick:()=>Nt("scene"),children:"Scene"})]}),ee("section",{className:"bb-editor",children:he==="scene"?ee(Ca,{children:g?ee(th,{config:F,onChange:q,activeSubTab:_t,onActiveSubTabChange:Se,cameraState:_t==="Cinematic"&&xt?{position:xt.position,target:xt.target,azimuthAngle:xt.azimuthAngle,polarAngle:xt.polarAngle}:null,onPreviewWaypoint:Ks,animationClipDetails:Bn.clipDetails,animationPlayback:Bn}):ee("div",{className:"bb-emptyEditor",children:"Upload a model to edit its scene settings."})}):!yt||!m?ee("div",{className:"bb-emptyEditor",children:"Select a generated node binding to edit its values."}):qe(Ca,{children:[ee("div",{className:"bb-editorHeader",children:qe("div",{children:[ee("div",{className:"bb-sectionKicker",children:"Editing Binding"}),ee("h2",{className:"bb-editorTitle",children:yt.label||m}),qe("div",{className:"bb-editorMeta",children:[ee("span",{children:yt.type}),ee("span",{children:yt.modelObjectId})]})]})}),ee(P0,{selectedItem:m,selectedBinding:yt,open:ze.identity,onToggle:()=>rt("identity"),updateBinding:Jn,idError:Po}),ee(E0,{selectedItem:m,selectedBinding:yt,open:ze.basics,onToggle:()=>rt("basics"),updateBinding:Jn}),qe(Vn,{title:"Material",open:ze.material,onToggle:()=>rt("material"),tooltip:"Edit the selected object's base material, textures, and surface properties.",children:[ee(T0,{disabled:!m,onApply:O=>m&&Li(m,U=>({...U,...O}))}),ee(S0,{selectedItem:m,selectedMaterial:Pa,pbrWorkflow:$,onPbrWorkflowChange:ge,openMaterialPanels:nt,materialPanelEnabled:ie,onToggleMaterialPanel:Bt,onSetMaterialPanelState:Js,updateSelectedMaterial:Li,setSelectedTexturePath:_a})]}),ee(O0,{selectedItem:m,selectedBinding:yt,open:ze.actions,onToggle:()=>rt("actions"),updateBinding:Jn}),ee(D0,{selectedBinding:yt,open:ze.camera,onToggle:()=>rt("camera"),cameraState:xt,formattedCameraState:So,savedCameraPosition:Pr,onSaveCameraPosition:rl,onGoToSavedCamera:il,onClearSavedCamera:ol,onResetView:ad,onFitScene:sd}),ee(V0,{selectedItem:m,selectedBinding:yt,open:ze.transform,onToggle:()=>rt("transform"),updateBinding:Jn,moveModeEnabled:bt,onToggleMoveMode:xn,transformSpace:yn,onTransformSpaceChange:zt,originalTransform:V.current[m]??null}),ee(dh,{title:"Metrics",label:"Metrics JSON",open:ze.metrics,onToggle:()=>rt("metrics"),draft:G,error:pe,example:'{"area": 42}',onDraftChange:H,onCommit:()=>Oa("metrics",G,xe)}),ee(dh,{title:"Metadata",label:"Metadata JSON",open:ze.metadata,onToggle:()=>rt("metadata"),draft:ae,error:Te,example:'{"room": "kitchen"}',onDraftChange:be,onCommit:()=>Oa("metadata",ae,ye)})]})}),he==="object"&&qe("div",{className:"bb-toolbar",children:[qe("div",{className:"bb-toolbarGroup",children:[ee("button",{type:"button",className:"bb-iconButton",disabled:!C.canUndo,onClick:C.undo,title:"Undo (Cmd/Ctrl+Z)",children:ee(ty,{size:16})}),ee("button",{type:"button",className:"bb-iconButton",disabled:!fn.length,onClick:()=>Na("bindings"),title:"Reset object bindings to default",children:ee(ry,{size:16})}),ee("button",{type:"button",className:"bb-iconButton",disabled:!C.canRedo,onClick:C.redo,title:"Redo (Cmd/Ctrl+Shift+Z)",children:ee(ey,{size:16})})]}),ee("div",{className:"bb-toolbarDivider"}),qe("button",{type:"button",className:"bb-button bb-button--ghost",disabled:!fn.length||b,onClick:id,title:"Re-apply a previously exported objectBindings.json onto this model",children:[ee(ny,{size:14}),"Import"]}),ee("div",{className:"bb-toolbarDivider"}),ee(oh,{disabled:!fn.length||N,exporting:N,onExportJson:()=>el("json"),onExportTs:()=>el("ts")})]}),he==="scene"&&qe("div",{className:"bb-toolbar",children:[qe("div",{className:"bb-toolbarGroup",children:[ee("button",{type:"button",className:"bb-iconButton",disabled:!_.canUndo,onClick:_.undo,title:"Undo (Cmd/Ctrl+Z)",children:ee(ty,{size:16})}),ee("button",{type:"button",className:"bb-iconButton",onClick:()=>Na("scene"),title:"Reset scene config to default",children:ee(ry,{size:16})}),ee("button",{type:"button",className:"bb-iconButton",disabled:!_.canRedo,onClick:_.redo,title:"Redo (Cmd/Ctrl+Shift+Z)",children:ee(ey,{size:16})})]}),ee("div",{className:"bb-toolbarDivider"}),qe("button",{type:"button",className:"bb-button bb-button--ghost",disabled:!fn.length||b,onClick:La,title:"Re-apply a previously exported sceneConfig.json",children:[ee(ny,{size:14}),"Import"]}),ee("div",{className:"bb-toolbarDivider"}),ee(oh,{disabled:!fn.length||b,onExportJson:()=>$s("sceneConfig.json",q0(F),"application/json"),onExportTs:()=>$s("sceneConfig.ts",Y0(F),"text/typescript")})]})]})]}),qe("main",{className:"bb-previewShell",children:[qe("div",{className:"bb-previewHeader",children:[qe("div",{className:"bb-previewToggles",children:[qe("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[ee("input",{type:"checkbox",checked:ke,onChange:O=>Le(O.target.checked)}),"Zoom on selected"]}),qe("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[ee("input",{type:"checkbox",checked:de,onChange:O=>it(O.target.checked)}),"Highlight on hover"]}),qe("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[ee("input",{type:"checkbox",checked:Ze,onChange:O=>It(O.target.checked)}),"Camera controller"]})]}),qe("div",{className:"bb-previewControlsColumn",children:[qe("div",{className:"bb-previewControls",children:[ee("div",{className:"bb-previewMeta",children:ee("span",{children:m?`Focused: ${m}`:"Select a node to inspect it"})}),g&&ee("button",{type:"button",className:"bb-button bb-button--ghost bb-removeModelButton",onClick:Ra,children:"Remove model"})]}),g&&ee("div",{className:"bb-moveHint",children:ne?ee(Ca,{children:"Click the preview to look around \xB7 Esc to release"}):bt?ee(Ca,{children:"Select a mesh \xB7 drag the colored arrows, planes, or rings"}):qe(Ca,{children:[ee("kbd",{children:"W"}),ee("kbd",{children:"A"}),ee("kbd",{children:"S"}),ee("kbd",{children:"D"})," move \xB7 ",ee("kbd",{children:"Space"}),"/",ee("kbd",{children:"C"})," up \xB7 down \xB7 drag to look"]})})]})]}),qe("div",{className:"bb-preview",children:[ee(da,{visible:b||L,message:z,tone:j,progress:T??void 0}),g?ee(Uc,{modelUrl:g,tilesetUrl:v?.tilesetUrl,objectBindings:P,selectedObject:yt,onObjectSelect:od,onObjectBindingsChange:A,onObjectEditLeaseChange:(O,U)=>l?.(O.modelObjectId||O.id,U),showObjectBindingDataPanel:!1,showSceneObjectsPanel:!1,onCameraChange:Ys,onViewerReady:Ta,onAnnotationsChange:Gr,activeAnnotation:pt?.annotation??null,onActiveAnnotationChange:ka,onAnimationsReady:kr,onModelLoaded:nd,onLoadError:Fn,onObjectCatalog:rd,onProgress:Qs,onCameraControllerChange:Q,cameraControllerType:te,licenseKey:e,licenseValidationUrl:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,sceneConfig:F,onSceneConfigChange:q,preserveDrawingBuffer:!0,disableZoom:!1,zoomOnSelected:ke,highlightOnHover:de,enableCameraControls:Ze,moveModeEnabled:bt,objectTransformSpace:yn,enableKeyboardNavigation:!0,showViewGizmo:!0,panelHoveredObject:de?ct:null,showLoadingOverlay:!1,autoRotate:ne?!1:F.model.autoRotate??!1,autoRotateSpeed:F.model.autoRotateSpeed??1}):ee("div",{className:`bb-previewPlaceholder ${St?"bb-previewPlaceholder--dragActive":""}`,onDragEnter:Oi,onDragOver:Ba,onDragLeave:Di,onDrop:Hr,children:qe("div",{children:[ee("div",{children:"Upload a GLB, GLTF, OBJ, FBX, or USDZ model, or drag a supported model/ZIP bundle here to generate editable object bindings."}),ee("button",{type:"button",className:"bb-previewPlaceholderButton",onClick:Zs,disabled:b,children:"Upload"})]})})]})]}),ee(G0,{bindings:P,selectedItem:m,onSelect:Da,onHover:nl,isOpen:!Y,onToggle:Ni})]}),Ot&&ee("div",{className:"bb-reset-overlay",onClick:Qn,children:qe("div",{className:"bb-reset-dialog",onClick:O=>O.stopPropagation(),children:[qe("div",{className:"bb-reset-header",children:[qe("h3",{className:"bb-reset-title",children:[ee(P_,{size:20,className:"bb-icon-warning"}),"Confirm Reset"]}),ee("button",{className:"bb-reset-close",onClick:Qn,children:ee(T_,{size:20})})]}),qe("div",{className:"bb-reset-body",children:[qe("p",{className:"bb-reset-message",children:["Are you sure you want to reset"," ",ee("strong",{children:Ie==="bindings"?"Object Bindings":"Scene Config"}),"?"]}),ee("p",{className:"bb-reset-details",children:Ie==="bindings"?"This will remove all your custom changes to object properties, groups, tags, transforms, materials, actions, camera positions, metrics, and metadata.":"This will restore all scene settings (camera, lighting, environment, background, animations, annotations, etc.) to their default values."}),ee("p",{className:"bb-reset-warning",children:"This action cannot be undone!"})]}),qe("div",{className:"bb-reset-footer",children:[ee("button",{className:"bb-reset-btn",onClick:Qn,children:"Cancel"}),ee("button",{className:"bb-reset-btn-danger",onClick:al,children:"Yes, Reset"})]})]})})]})}import{useRef as _i,useState as Ht,useCallback as Tn,useEffect as pr,useMemo as Yc,Component as __,Suspense as vh}from"react";import{CameraControls as A_,Environment as E_}from"@react-three/drei";import{useFrame as uy,useThree as Sa}from"@react-three/fiber";import{Canvas as R_}from"@react-three/fiber";import{Box3 as L_,MeshStandardMaterial as B_,PerspectiveCamera as O_,Vector3 as D_}from"three";import{SkeletonUtils as N_}from"three-stdlib";import{X as Th,Check as py,Settings as I_,ChevronDown as z_,Boxes as j_,Trash2 as V_,Upload as wh,AlertTriangle as F_}from"lucide-react";import{Fragment as dy,jsx as K,jsxs as Ye}from"react/jsx-runtime";var ay={color:"#93c5fd",intensity:.05},U_=["apartment","city","dawn","forest","lobby","night","park","studio","sunset","warehouse"];function G_(e){return!!(e&&"isMesh"in e&&e.isMesh)}function sy(e,t){Array.isArray(e)?e.forEach(t):t(e)}function H_(e,t){if(!t)return;let n=t.camera;if(!(n instanceof O_))return;let i=new L_().setFromObject(e).getSize(new D_).length();!Number.isFinite(i)||i<=0||(n.near=i/100,n.far=i*100,n.updateProjectionMatrix(),t.maxDistance=i*10)}var Mh=class extends __{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n){this.props.onLoadError?.(n)}render(){return this.state.hasError?null:this.props.children}};function W_({url:e,format:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,hiddenKeys:o,selectedKey:a,panelHoveredKey:s,nodeRefsOut:c,onMeshesReady:l,onModelLoaded:u,onLoadProgress:d,onMeshClick:h,highlightOnHover:g}){let{scene:f}=zl(e,{dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r},t,d),y=Sa(S=>S.invalidate),{setCanvasCursor:k,restoreCanvasCursor:v}=Xl(),[p,m]=Ht(null),M=Yc(()=>N_.clone(f),[f]),C=Yc(()=>{let S={};return M.traverse(N=>{if(!G_(N))return;let R=N.name||N.uuid;S[R]={key:R,label:N.name||N.type,ref:N}}),S},[M]),P=Yc(()=>{let S={};for(let[N,{ref:R}]of Object.entries(C)){let E=(Array.isArray(R.material)?R.material:[R.material]).map(j=>{let L=(Yo(j)??new B_).clone();return L.userData.baseColor=L.color.clone(),L.userData.baseMap=L.map,L.userData.baseEmissive=L.emissive.clone(),L.userData.baseEmissiveMap=L.emissiveMap,L.userData.baseEmissiveIntensity=L.emissiveIntensity,L});S[N]=Array.isArray(R.material)?E:E[0]}return S},[C]);pr(()=>()=>{Object.values(P).forEach(S=>sy(S,N=>N.dispose()))},[P]);let A=_i(null);pr(()=>{A.current!==e&&(A.current=e,M.updateWorldMatrix(!0,!0),ds(M),l(C),u(M))},[e,M,C,l,u]),pr(()=>{let S=new AbortController;return Vo(M,S.signal),()=>{S.abort(),Gi(M)}},[M]);let b=Yc(()=>!gl(M),[M]);pr(()=>{for(let[S,{ref:N}]of Object.entries(C))c.current[S]=N},[C,c]),pr(()=>{!g&&p!==null&&(m(null),v())},[g,p,v]),pr(()=>{for(let[S,{ref:N}]of Object.entries(C)){N.visible=!o.has(S);let R=P[S];if(!R)continue;N.material=R;let z=g&&p===S,E=g&&s===S;sy(R,j=>{if(j.color.copy(j.userData.baseColor),j.map=j.userData.baseMap??null,j.emissive.copy(j.userData.baseEmissive),j.emissiveMap=j.userData.baseEmissiveMap??null,j.emissiveIntensity=j.userData.baseEmissiveIntensity,E||z){let I=!!j.userData.baseEmissiveMap;j.emissive.set(ay.color),j.emissiveIntensity=I?j.userData.baseEmissiveIntensity:ay.intensity}j.needsUpdate=!0})}y()},[C,P,p,a,s,g,o,y]);let w=S=>{let N=S;for(;N;){let R=N.name||N.uuid;if(C[R])return R;N=N.parent}return null},T=b?{onClick:S=>{let N=w(S.object);N&&(S.stopPropagation(),h(N))},...g?{onPointerOver:S=>{let N=w(S.object);N&&(S.stopPropagation(),k("pointer"),m(N))},onPointerOut:S=>{S.stopPropagation(),v(),m(null)}}:{}}:{};return K("primitive",{object:M,...T})}function $_({scene:e,controlsRef:t,refitOnResize:n,onInitialFitComplete:i}){let r=_i(!1),o=Sa(c=>c.invalidate),a=Sa(c=>c.size),s=_i(null);return pr(()=>{r.current=!1,o()},[o,e]),uy(()=>{if(!r.current){if(!e||!t.current){o();return}r.current=!0,H_(e,t.current),t.current.fitToBox(e,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{}).finally(i)}}),pr(()=>{if(!(!n||!r.current||!e||!t.current))return s.current&&clearTimeout(s.current),s.current=setTimeout(()=>{t.current?.fitToBox(e,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{}),o()},150),()=>{s.current&&clearTimeout(s.current)}},[a.width,a.height,n]),null}function X_({exposure:e}){let t=Sa(i=>i.gl),n=Sa(i=>i.invalidate);return pr(()=>{t.toneMappingExposure=e,n()},[t,e,n]),null}function q_({enabled:e,controlsRef:t}){let n=Sa(i=>i.invalidate);return uy((i,r)=>{!e||!t.current||(t.current.rotate(r*.2,0,!1),n())}),null}function Kc(e){return Array.from(e.types).includes("Files")}function ly({label:e,checked:t,onChange:n}){return Ye("div",{className:"env-row",children:[K("span",{className:"env-row__label",children:e}),K("div",{className:"env-row__value",children:K("button",{className:"env-checkbox-btn",onClick:()=>n(!t),children:K("span",{className:`env-checkbox${t?" env-checkbox--checked":""}`,children:t&&K(py,{size:9,strokeWidth:2,color:"white"})})})})]})}function Ch({label:e,value:t,onChange:n}){return Ye("div",{className:"env-row",children:[K("span",{className:"env-row__label",children:e}),K("div",{className:"env-row__value",children:Ye("div",{className:"env-color-swatch",style:{background:t},children:[K("span",{className:"env-color-swatch__hex",children:t}),K("input",{type:"color",className:"env-color-swatch__input",value:t,onChange:i=>n(i.target.value)})]})})]})}function Sh({label:e,value:t,min:n,max:i,step:r,onChange:o}){return Ye("div",{className:"env-row",children:[K("span",{className:"env-row__label",children:e}),Ye("div",{className:"env-row__value env-row__value--slider",children:[K("input",{type:"range",className:"env-slider",min:n,max:i,step:r,value:t,onChange:a=>o(Number(a.target.value))}),K("span",{className:"env-slider__value",children:t.toFixed(2)})]})]})}function Y_({label:e,value:t,options:n,onChange:i}){return Ye("div",{className:"env-row",children:[K("span",{className:"env-row__label",children:e}),K("div",{className:"env-row__value",children:K("select",{className:"env-select",value:t,onChange:r=>i(r.target.value),children:n.map(r=>K("option",{value:r,children:r},r))})})]})}function cy({title:e,children:t}){let[n,i]=Ht(!1);return Ye("div",{className:"env-section",children:[Ye("button",{className:"env-section__header",onClick:()=>i(r=>!r),children:[K(z_,{size:12,strokeWidth:2,className:`env-section__chevron${n?" env-section__chevron--collapsed":""}`}),K("span",{children:e})]}),!n&&K("div",{className:"env-section__body",children:t})]})}function K_({isOpen:e,onToggle:t,settings:n,onChange:i}){return Ye("div",{className:`left-panel-wrapper ${e?"left-panel-wrapper--open":"left-panel-wrapper--closed"}`,children:[!e&&K("button",{className:"side-panel__open-btn side-panel__open-btn--left",onClick:()=>t(!0),children:K(I_,{size:20,strokeWidth:1.8})}),Ye("div",{className:`side-panel side-panel--left ${e?"side-panel--open-left":"side-panel--closed-left"}`,"aria-hidden":!e,children:[K("div",{className:"side-panel__header",children:Ye("div",{className:"side-panel__header-top",children:[K("span",{className:"side-panel__eyebrow",children:"Scene Settings"}),K("button",{className:"side-panel__close-btn",onClick:()=>t(!1),title:"Close",children:K(Th,{size:12,strokeWidth:1.6})})]})}),Ye("div",{className:"env-controls",children:[Ye(cy,{title:"Background",children:[K(ly,{label:"Background",checked:n.backgroundEnabled,onChange:r=>i("backgroundEnabled",r)}),K(Ch,{label:"Background Color",value:n.backgroundColor,onChange:r=>i("backgroundColor",r)}),K(Y_,{label:"Environment",value:n.envPreset,options:U_,onChange:r=>i("envPreset",r)}),K(ly,{label:"Auto Rotate",checked:n.autoRotate,onChange:r=>i("autoRotate",r)})]}),Ye(cy,{title:"Lighting",children:[K(Sh,{label:"Exposure",value:n.exposure,min:0,max:2,step:.05,onChange:r=>i("exposure",r)}),K(Sh,{label:"Ambient Light Intensity",value:n.ambientIntensity,min:0,max:3,step:.05,onChange:r=>i("ambientIntensity",r)}),K(Ch,{label:"Ambient Light Color",value:n.ambientColor,onChange:r=>i("ambientColor",r)}),K(Sh,{label:"Direct Light Intensity",value:n.directionalIntensity,min:0,max:5,step:.05,onChange:r=>i("directionalIntensity",r)}),K(Ch,{label:"Direct Light Color",value:n.directionalColor,onChange:r=>i("directionalColor",r)})]})]})]})]})}function J_({meshKeys:e,hiddenKeys:t,selectedKey:n,isOpen:i,onToggle:r,onFocus:o,onHover:a,onToggleVisibility:s}){let[c,l]=Ht(""),[u,d]=Ht(null),h=Object.values(e).filter(g=>g.label.toLowerCase().includes(c.toLowerCase()));return Ye("div",{className:`right-panel-wrapper ${i?"right-panel-wrapper--open":"right-panel-wrapper--closed"}`,children:[!i&&K("button",{className:"side-panel__open-btn",onClick:()=>r(!0),children:K(j_,{size:20,strokeWidth:1.8})}),Ye("div",{className:`side-panel ${i?"side-panel--open":"side-panel--closed"}`,"aria-hidden":!i,children:[Ye("div",{className:"side-panel__header",children:[Ye("div",{className:"side-panel__header-top",children:[K("span",{className:"side-panel__eyebrow",children:"SCENE OBJECTS"}),K("button",{className:"side-panel__close-btn",onClick:()=>r(!1),title:"Close",children:K(Th,{size:12,strokeWidth:1.6})})]}),Ye("p",{className:"side-panel__title",children:[h.length," objects"]})]}),K("div",{className:"side-panel__search-wrap",children:K("input",{className:"side-panel__search",type:"text",placeholder:"Search objects",value:c,onChange:g=>l(g.target.value)})}),K("div",{className:"side-panel__list",children:h.map(({key:g,label:f})=>{let y=!t.has(g),k=n===g,v=u===g;return Ye("div",{onClick:()=>o(g),onMouseEnter:()=>{d(g),a(g)},onMouseLeave:()=>{d(null),a(null)},className:["side-panel__row",v?"side-panel__row--hovered":"",k?"side-panel__row--selected":""].filter(Boolean).join(" "),children:[K("span",{className:`side-panel__label${v||k?" side-panel__label--hovered":""}`,children:f}),K("button",{className:"side-panel__vis-btn",title:y?"Hide":"Show",onClick:p=>{p.stopPropagation(),s(g)},children:K("span",{className:`side-panel__checkbox${y?" side-panel__checkbox--checked":""}`,children:y&&K(py,{size:9,strokeWidth:5,color:"white"})})})]},g)})})]})]})}function hy({modelUrl:e,modelFormat:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r=!0,backgroundColor:o="#1a1a1a",showSceneObjectsPanel:a=!0,showSceneSettingsPanel:s=!0,enableModelUpload:c=!1,zoomOnSelected:l=!1,highlightOnHover:u=!1,showLoadingOverlay:d=!0,refitOnResize:h=!0,backgroundEnabled:g=!1,autoRotate:f=!1,envPreset:y="city",exposure:k=1,ambientIntensity:v=.6,ambientColor:p="#ffffff",directionalIntensity:m=1.2,directionalColor:M="#ffffff",onModelLoaded:C,onLoadError:P}){let A=_i(null),b=_i({}),w=_i(null),T=_i(null),S=_i(0),[N,R]=Ht(null),[z,E]=Ht(null),[j,I]=Ht(!1),[L,B]=Ht({}),[G,H]=Ht(new Set),[ae,be]=Ht(null),[pe,xe]=Ht(null),[Te,ye]=Ht(null),[St,st]=Ht(null),[De,ve]=Ht(!1),[Y,ft]=Ht(!1),[ze,lt]=Ht(!1),[nt,Ee]=Ht(null),[rt,Bt]=Ht(!1),[he,Nt]=Ht(()=>typeof window>"u"?!0:window.innerWidth>900),[_t,Se]=Ht(()=>typeof window>"u"?!0:window.innerWidth>900),[$,ge]=Ht({backgroundEnabled:g,backgroundColor:o,autoRotate:f,envPreset:y,exposure:k,ambientIntensity:v,ambientColor:p,directionalIntensity:m,directionalColor:M}),ie=c?Te:e,we=Tn(()=>{R(null),E(null),I(!1),B({}),H(new Set),be(null),xe(null),ve(!1),lt(!1),Ee(null)},[]),Pe=Tn(()=>{T.current?.cleanup(),T.current=null},[]),ke=Tn(()=>{Pe(),ye(null),st(null),we(),ge({backgroundEnabled:g,backgroundColor:o,autoRotate:f,envPreset:y,exposure:k,ambientIntensity:v,ambientColor:p,directionalIntensity:m,directionalColor:M})},[p,v,f,o,g,M,m,y,k,we,Pe]),Le=Tn(async _=>{ft(!0);try{let F=await Ol(_);Pe(),T.current=F,ye(F.url),st(F.name),we()}catch(F){ve(!0),P?.(F)}finally{ft(!1)}},[P,we,Pe]),de=Tn(_=>{let F=_?.[0];F&&Le(F)},[Le]);pr(()=>()=>{Pe()},[Pe]);let it=Tn((_,F)=>{ge(q=>({...q,[_]:F}))},[]);pr(()=>{ge(_=>({..._,backgroundColor:o}))},[o]),pr(()=>{we()},[ie,we]);let Ze=Tn(_=>{B(_),H(new Set),be(null)},[]),It=Tn(_=>{R(_),ve(!1);let F=Ka(_);E(F>Ui?F:null),I(!1),Ee(null),C?.(_)},[C]),Ot=Tn(_=>{ve(!0),Ee(null),P?.(_)},[P]),je=Tn(_=>{_.lengthComputable&&_.total>0&&Ee(_.loaded/_.total*100)},[]),Ie=Tn(_=>{if(be(_),!l)return;let F=b.current[_];!F||!A.current||A.current.fitToBox(F,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[l]),mn=Tn(_=>{H(F=>{let q=new Set(F);return q.has(_)?q.delete(_):q.add(_),q})},[]),bt=Tn(_=>{!c||!Kc(_.dataTransfer)||(_.preventDefault(),_.stopPropagation(),S.current+=1,Bt(!0))},[c]),xn=Tn(_=>{!c||!Kc(_.dataTransfer)||(_.preventDefault(),_.stopPropagation(),_.dataTransfer.dropEffect="copy",Bt(!0))},[c]),yn=Tn(_=>{!c||!Kc(_.dataTransfer)||(_.preventDefault(),_.stopPropagation(),S.current=Math.max(0,S.current-1),S.current===0&&Bt(!1))},[c]),zt=Tn(_=>{!c||!Kc(_.dataTransfer)||(_.preventDefault(),_.stopPropagation(),S.current=0,Bt(!1),de(_.dataTransfer.files))},[c,de]),V=d&&(Y||!!(ie&&!De&&(!N||!ze)));return Ye("div",{className:"smv-root",style:{background:$.backgroundColor},onDragEnter:bt,onDragOver:xn,onDragLeave:yn,onDrop:zt,children:[s&&ie&&K(K_,{isOpen:_t,onToggle:Se,settings:$,onChange:it}),Ye("div",{className:"smv-canvasArea",children:[z!==null&&!j&&Ye("div",{className:"smv-largeModelBanner",children:[K(F_,{size:14,className:"smv-largeModelBanner__icon"}),Ye("span",{children:["Very large model detected (",Math.round(z/1e6),"M triangles) \u2014 it may render and move slowly on this device, and click/hover selection on the model is disabled. Use the scene objects panel to select parts."]}),K("button",{type:"button",className:"smv-largeModelBanner__dismiss",onClick:()=>I(!0),"aria-label":"Dismiss",children:K(Th,{size:12})})]}),c?Ye(dy,{children:[K("input",{ref:w,type:"file",accept:Bl,className:"smv-upload-input",onChange:_=>{de(_.target.files),_.currentTarget.value=""}}),ie?K("div",{className:"smv-upload-toolbar",children:Ye(dy,{children:[K("span",{className:"smv-upload-toolbar__name",children:St??"Uploaded model"}),Ye("button",{type:"button",className:"smv-upload-toolbar__button smv-upload-toolbar__button--ghost",onClick:ke,children:[K(V_,{size:14}),"Clear"]})]})}):null]}):null,ie?K(R_,{dpr:[1,2],frameloop:"demand",resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:{background:$.backgroundColor},camera:{position:[0,0,5],fov:45,near:.1,far:1e3},children:Ye(vh,{fallback:null,children:[K("ambientLight",{intensity:$.ambientIntensity,color:$.ambientColor}),K("directionalLight",{position:[-4,5,7],intensity:$.directionalIntensity,color:$.directionalColor,castShadow:!0}),K("directionalLight",{position:[-5,5,5],intensity:.5}),K(vh,{fallback:null,children:K(E_,{preset:$.envPreset,background:$.backgroundEnabled})}),K(X_,{exposure:$.exposure}),K(q_,{enabled:$.autoRotate,controlsRef:A}),K(Mh,{onLoadError:Ot,children:K(vh,{fallback:null,children:K(W_,{url:ie,format:Te?void 0:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,hiddenKeys:G,selectedKey:ae,panelHoveredKey:pe,nodeRefsOut:b,onMeshesReady:Ze,onModelLoaded:It,onLoadProgress:je,onMeshClick:Ie,highlightOnHover:u})})},ie),K($_,{scene:N,controlsRef:A,refitOnResize:h,onInitialFitComplete:()=>lt(!0)}),K(A_,{ref:A,makeDefault:!0,smoothTime:.3})]})}):K("div",{className:"smv-upload-empty-state",style:{background:$.backgroundColor},children:Ye("div",{className:"smv-upload-empty-state__card",children:[K("div",{className:"smv-upload-empty-state__icon",children:K(wh,{size:24})}),Ye("p",{className:"smv-upload-empty-state__body",children:["Drag and drop ",K("code",{children:".glb"}),", ",K("code",{children:".gltf"}),","," ",K("code",{children:".obj"}),", ",K("code",{children:".fbx"}),", ",K("code",{children:".usdz"}),", or"," ",K("code",{children:".zip"})," here"]}),Ye("button",{type:"button",className:"smv-upload-empty-state__button",onClick:()=>w.current?.click(),children:[K(wh,{size:15}),"Choose model"]})]})}),K(da,{visible:V,message:"Loading model...",progress:Y?void 0:nt??void 0}),c&&rt?K("div",{className:"smv-upload-drop-overlay",children:Ye("div",{className:"smv-upload-drop-overlay__card",children:[K(wh,{size:20}),K("span",{children:"Release to load your model"})]})}):null]}),a&&ie&&K(J_,{meshKeys:L,hiddenKeys:G,selectedKey:ae,isOpen:he,onToggle:Nt,onFocus:Ie,onHover:xe,onToggleVisibility:mn})]})}import{useCallback as my,useState as Q_}from"react";function Z_(e=null){let[t,n]=Q_(e),i=my(o=>{n(o)},[n]),r=my(()=>{n(null)},[]);return{selectedObjectBinding:t,setSelectedObjectBinding:n,handleObjectSelect:i,clearSelection:r}}import{useMemo as eA}from"react";function tA(e,t){return eA(()=>{if(!t)return null;let n=e[t];return n||(Object.values(e).find(i=>i.id===t||i.modelObjectId===t)??null)},[e,t])}import{useMemo as nA}from"react";function rA(e){return nA(()=>Object.values(e).map(t=>t.modelObjectId),[e])}import{useCallback as hn,useMemo as gy,useState as iA}from"react";var fy={baseColor:"texture",metalness:"metalnessMap",roughness:"roughnessMap",emissive:"emissiveMap",alpha:"alphaMap",normal:"normalMap",bump:"bumpMap",ao:"aoMap",displacement:"displacementMap",clearcoat:"clearcoatMap",clearcoatRoughness:"clearcoatRoughnessMap",clearcoatNormal:"clearcoatNormalMap",anisotropy:"anisotropyMap",transmission:"transmissionMap",thickness:"thicknessMap",sheenColor:"sheenColorMap",sheenRoughness:"sheenRoughnessMap",specularIntensity:"specularIntensityMap",specularColor:"specularColorMap"};function by(e){if(e)return Object.fromEntries(Object.entries(e).map(([t,n])=>[t,n&&typeof n=="object"?{...n}:n]))}function oA(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t.visible===!1).map(([t])=>[t,!0]))}function aA(e){let[t,n]=iA(e),i=hn((A,b)=>{n(w=>b===void 0?zo(w,A):zo(w,A,b))},[]),r=hn((A,b)=>i(A,Td(b)),[i]),o=hn((A,b)=>r(A,{baseColor:b}),[r]),a=hn((A,b,w="baseColor")=>{let T=fy[w],S=typeof b=="string"?{path:b}:b;i(A,{style:{material:{[T]:S}}})},[i]),s=hn((A,b="baseColor")=>{let w=fy[b];i(A,{style:{material:{[w]:void 0}}})},[i]),c=hn((A,b)=>{n(w=>{let T=vn(w,A);if(!T)return w;let S=by(w[T]?.style?.material),N=Fi(w,b);if(N.length===0)return w;let R=w;for(let z of N){let E=w[z];E&&(R===w&&(R={...w}),R[z]={...E,style:{...E.style,material:by(S)}})}return R})},[]),l=hn(A=>i(A,{style:{material:void 0}}),[i]),u=hn((A,b)=>i(A,{transform:b}),[i]),d=hn(A=>i(A,{transform:void 0}),[i]),h=hn((A,b)=>i(A,{metadata:b}),[i]),g=hn(A=>Md(t,A),[t]),f=hn(A=>Fi(t,A).map(b=>t[b]?.id??b),[t]),y=hn(A=>{let b=vn(t,A);return b?t[b]?.style?.material??null:null},[t]),k=hn(A=>i(A,{visible:!1}),[i]),v=hn(A=>i(A,{visible:!0}),[i]),p=hn(A=>{n(b=>{let w=Fi(b,A).reduce((T,S)=>{let N=b[S];return N&&T.push({ids:S,patch:{visible:N.visible===!1}}),T},[]);return zo(b,w)})},[n]),m=hn(()=>{n(A=>zo(A,Object.keys(A),{visible:!0}))},[n]),M=gy(()=>oA(t),[t]),C=gy(()=>Object.keys(M).map(A=>t[A]?.id??A),[M,t]),P=hn(A=>{let b=vn(t,A);return b?t[b]?.visible===!1:!1},[t]);return{objectBindings:t,setObjectBindings:n,updateObjectBindings:i,setMaterial:r,setBaseColor:o,setTexture:a,clearTexture:s,copyMaterial:c,resetMaterial:l,getMaterial:y,setTransform:u,resetTransform:d,updateMetadata:h,selectObjectBindings:g,selectObjectBindingIds:f,hiddenObjects:M,hiddenObjectIds:C,hideObject:k,showObject:v,toggleObjectVisibility:p,isObjectHidden:P,clearHiddenObjects:m}}import{useCallback as hr,useMemo as sA,useRef as lA,useState as cA}from"react";var dA={type:"point",color:"#ffffff",intensity:1,position:[0,0,0],distance:0,decay:2,attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0};function uA(e){let t=lA(null),[n,i]=cA(()=>{let v=typeof e=="function"?e():e;return t.current=v,v}),r=hr(v=>{i(p=>{let m=typeof v=="function"?v(p):v;return Pd(p,m)})},[]),o=hr(()=>{let v=t.current;v&&i(v)},[]),a=hr((v,p)=>{r(m=>({lighting:{lights:m.lighting.lights.map(M=>M.id===v?{...M,...p}:M)}}))},[r]),s=hr(v=>{r(p=>p.lighting.lights.some(m=>m.id===v.id)?{}:{lighting:{lights:[...p.lighting.lights,{...dA,...v}]}})},[r]),c=hr(v=>{r(p=>({lighting:{lights:p.lighting.lights.filter(m=>m.id!==v)}}))},[r]),l=hr((v,p)=>a(v,{intensity:p}),[a]),u=hr((v,p)=>a(v,{color:p}),[a]),d=hr(v=>a(v,{visible:!0}),[a]),h=hr(v=>a(v,{visible:!1}),[a]),g=hr(v=>{r(p=>({lighting:{lights:p.lighting.lights.map(m=>m.id===v?{...m,visible:!m.visible}:m)}}))},[r]),f=hr((v,p)=>a(v,{attachment:p,attachedToCamera:!1}),[a]),y=hr(v=>a(v,{attachment:void 0}),[a]),k=sA(()=>({items:n.lighting.lights,get:v=>n.lighting.lights.find(p=>p.id===v),add:s,update:a,remove:c,setIntensity:l,setColor:u,show:d,hide:h,toggle:g,attach:f,detach:y}),[n.lighting.lights,s,a,c,l,u,d,h,g,f,y]);return{sceneConfig:n,setSceneConfig:i,updateSceneConfig:r,resetSceneConfig:o,lights:k}}import{useCallback as pA,useState as hA}from"react";function mA(){let[e,t]=hA(null),n=pA(i=>{t(i)},[t]);return{hoveredObjectBinding:e,handleHoveredObject:n}}import{useCallback as Ph,useState as Xs}from"react";import{Box3 as gA,Vector3 as xy}from"three";function Jc(e){return[e.x,e.y,e.z]}function fA(){let[e,t]=Xs(!0),[n,i]=Xs(!1),[r,o]=Xs(null),[a,s]=Xs(null),[c,l]=Xs(0),u=Ph(g=>{let f=new gA().setFromObject(g),y=f.min.clone(),k=f.max.clone(),v=new xy,p=new xy,m=0;g.traverse(M=>{"isMesh"in M&&M.isMesh&&(m+=1)}),f.getCenter(v),f.getSize(p),s({min:Jc(y),max:Jc(k),center:Jc(v),size:Jc(p)}),l(m),o(null),t(!1),i(!0)},[]),d=Ph(g=>{o(g),s(null),l(0),t(!1),i(!1)},[]),h=Ph(()=>{t(!0),i(!1),o(null),s(null),l(0)},[]);return{isLoading:e,isReady:n,error:r,bounds:a,objectCount:c,handleModelLoaded:u,handleLoadError:d,resetModelState:h}}import{useCallback as kh}from"react";function bA({bindings:e,scene:t,camera:n,animations:i,onAction:r}){let{objectBindings:o,updateObjectBindings:a,showObject:s,hideObject:c,toggleObjectVisibility:l}=e,u=t?.updateSceneConfig,d=n?.focusObject,h=n?.fitScene,g=n?.resetView,f=n?.setCameraTarget,y=n?.setCameraState,k=i?.play,v=i?.pause,p=i?.stop,m=i?.setSpeed,M=i?.seek,C=kh(b=>{let w=vn(o,b);return w?o[w]?.actions??[]:[]},[o]),P=kh(async b=>{for(let w of b.action.effects??[]){if("objectBindings"in w){a(w.target,w.objectBindings);continue}if("sceneConfig"in w){u?.(w.sceneConfig);continue}if("visibility"in w){w.visibility==="show"?s(w.target):w.visibility==="hide"?c(w.target):l(w.target);continue}if("camera"in w){let S=w.camera;S.type==="focus-object"?await d?.(S.objectId??b.objectId):S.type==="fit-scene"?await h?.():S.type==="reset"?await g?.():S.type==="set-target"?await f?.(S.target,S.transition??!0):await y?.(S.state,S.transition??!0);continue}let T=w.animation;T.type==="play"?k?.(T.clip):T.type==="pause"?v?.():T.type==="stop"?p?.():T.type==="set-speed"?m?.(T.speed):M?.(T.time)}await r?.(b)},[h,d,c,r,v,k,g,M,m,y,f,s,p,l,a,u]),A=kh(async(b,w)=>{let T=vn(o,b);if(!T)return null;let S=o[T],N=S?.actions?.find(z=>z.id===w);if(!S||!N)return null;let R={objectId:T,action:N,binding:S};return await P(R),R},[P,o]);return{getActionsForObject:C,handleAction:P,runAction:A}}import{useCallback as Qc,useRef as yy}from"react";function xA(e){return typeof e=="function"?e:e?.handleViewerReady??null}function yA(...e){let t=yy(null),n=yy(e);n.current=e;let i=Qc(s=>{t.current=s;let c=new Set;for(let l of n.current){let u=xA(l);u&&!c.has(u)&&(c.add(u),u(s))}},[]),r=Qc(()=>t.current,[]),o=Qc(s=>{let c=t.current;return c?c.captureImage(s):Promise.reject(new Error("ModelViewer is not ready yet."))},[]),a=Qc(()=>{let s=t.current;return s?(s.invalidate(),!0):!1},[]);return{handleViewerReady:i,getViewer:r,captureImage:o,invalidate:a}}import{useCallback as Lt,useEffect as vA,useRef as Vr}from"react";import{Material as wA,PointLight as CA,Vector3 as SA}from"three";var Eh=["emissiveIntensity","opacity","metalness","roughness","transmission","clearcoat","clearcoatRoughness","ior","thickness"],Zc=1;function ed(e){return typeof e=="string"?[e]:e}function td(e,t=0,n=1){return Math.min(n,Math.max(t,e))}function _h(e,t){return e+Math.random()*(t-e)}function vy([e,t],n){return e+(t-e)*n}function Ah([e,t],n){return[e[0]+(t[0]-e[0])*n,e[1]+(t[1]-e[1])*n,e[2]+(t[2]-e[2])*n]}function wy(e,t){let n=td(e);switch(t){case"ease-in":return n*n;case"ease-out":return 1-(1-n)*(1-n);case"ease-in-out":return n<.5?2*n*n:1-Math.pow(-2*n+2,2)/2;default:return n}}function MA(e){let t=e.material;return t?(Array.isArray(t)?t:[t]).filter(n=>n instanceof wA):[]}function TA(e){let t={opacity:e.opacity,transparent:e.transparent};e.color&&(t.baseColor=`#${e.color.getHexString()}`),e.emissive&&(t.emissive=`#${e.emissive.getHexString()}`);for(let n of Eh){let i=e[n];typeof i=="number"&&(t[n]=i)}return t}function Cy(e,t){t.baseColor!==void 0&&e.color&&e.color.set(t.baseColor),t.emissive!==void 0&&e.emissive&&e.emissive.set(t.emissive);for(let n of Eh){let i=t[n];i!==void 0&&typeof e[n]=="number"&&(e[n]=i)}t.transparent!==void 0&&(e.transparent=t.transparent),e.needsUpdate=!0}function PA(e){return{position:[e.position.x,e.position.y,e.position.z],rotation:[e.rotation.x,e.rotation.y,e.rotation.z],scale:[e.scale.x,e.scale.y,e.scale.z],visible:e.visible}}function kA(e,t){if(t.position&&e.position.set(...t.position),t.rotation&&e.rotation.set(...t.rotation),t.scale!==void 0){let n=typeof t.scale=="number"?[t.scale,t.scale,t.scale]:t.scale;e.scale.set(...n)}t.visible!==void 0&&(e.visible=t.visible),e.updateMatrix(),e.updateMatrixWorld(!0)}function _A(e={}){let t=Vr(e);t.current=e;let n=Vr(null),i=Vr(null),r=Vr(null),o=Vr(new Map),a=Vr(new Map),s=Vr(new Map),c=Vr(new Map),l=Lt(L=>{let B=n.current;if(!B)return null;let G=vn(B.objectBindings,L);return B.nodeRefs[L]??(G?B.nodeRefs[G]:null)??(B.scene?xr(B.scene,L):null)??null},[]),u=Lt(L=>{let B=n.current;return B?typeof L=="object"&&!Array.isArray(L)?Fi(B.objectBindings,L):ed(L).map(G=>vn(B.objectBindings,G)??G):typeof L=="string"?[L]:Array.isArray(L)?L:[]},[]),d=Lt(()=>{n.current?.invalidate()},[]),h=Lt((L,B)=>{let G=!1;for(let H of u(L)){let ae=l(H);if(ae)for(let be of MA(ae))s.current.has(be)||s.current.set(be,TA(be)),Cy(be,B),G=!0}return G},[l,u]),g=Lt((L,B)=>{let G=h(L,B);return G&&d(),G},[d,h]),f=Lt((L,B)=>{let G=!1;for(let H of u(L)){let ae=l(H);ae&&(c.current.has(ae)||c.current.set(ae,PA(ae)),kA(ae,B),G=!0)}return G},[l,u]),y=Lt((L,B)=>{let G=f(L,B);return G&&d(),G},[d,f]),k=Lt(L=>{let B=l(L);if(!B)return null;B.updateWorldMatrix(!0,!1);let G=B.getWorldPosition(new SA);return[G.x,G.y,G.z]},[l]),v=Lt(L=>{let B=a.current.get(L);return B?(B.light.removeFromParent(),B.light.dispose(),a.current.delete(L),d(),!0):!1},[d]),p=Lt(L=>{let B=l(L.target);if(!B)return!1;let G=a.current.get(L.id),H=G?.light??new CA;return G&&G.target!==L.target&&H.removeFromParent(),H.name=`react-immersive-runtime-light:${L.id}`,H.color.set(L.color??"#ffffff"),H.intensity=L.intensity??1,H.distance=L.distance??0,H.decay=L.decay??2,H.castShadow=L.castShadow??!1,H.position.set(...L.offset??[0,0,0]),H.parent!==B&&B.add(H),a.current.set(L.id,{light:H,target:L.target}),d(),!0},[d,l]),m=Lt((L,B)=>{let G=a.current.get(L);if(!G)return!1;if(B.target&&B.target!==G.target){let H=l(B.target);if(!H)return!1;G.light.removeFromParent(),H.add(G.light),G.target=B.target}return B.color!==void 0&&G.light.color.set(B.color),B.intensity!==void 0&&(G.light.intensity=B.intensity),B.distance!==void 0&&(G.light.distance=B.distance),B.decay!==void 0&&(G.light.decay=B.decay),B.offset!==void 0&&G.light.position.set(...B.offset),B.castShadow!==void 0&&(G.light.castShadow=B.castShadow),d(),!0},[d,l]),M=Lt((L,B)=>{let G=H=>B[H%B.length]??0;for(let H of L.materials??[])u(H.targets).forEach((ae,be)=>{let pe=G(be),xe={};for(let Te of Eh){let ye=H.values[Te];ye&&(xe[Te]=vy(ye,pe))}h(ae,xe)});for(let H of L.transforms??[])u(H.targets).forEach((ae,be)=>{let pe=G(be),xe={};H.values.position&&(xe.position=Ah(H.values.position,pe)),H.values.rotation&&(xe.rotation=Ah(H.values.rotation,pe)),H.values.scale&&(xe.scale=Ah(H.values.scale,pe)),f(ae,xe)});for(let H of L.lights??[])ed(H.lights).forEach((ae,be)=>{let pe=a.current.get(ae);pe&&(pe.light.intensity=vy(H.intensity,G(be)))})},[u,h,f]),C=Vr(()=>{}),P=Vr(()=>{});P.current=L=>{r.current=null;let B=!1;for(let[G,H]of o.current){H.startedAt===null&&(H.startedAt=L);let ae=H.lastFrameAt??L;H.lastFrameAt=L;let be=H.override&&H.override.until>L?H.override.level:null;H.override&&be===null&&(H.override=null);let pe=H.update(L,L-H.startedAt,Math.min(100,L-ae),be);B=!0,pe||(o.current.delete(G),H.onComplete?.())}B&&d(),o.current.size>0&&C.current()},C.current=()=>{r.current!==null||typeof requestAnimationFrame>"u"||(r.current=requestAnimationFrame(L=>P.current(L)))};let A=Lt(L=>(o.current.set(L.id,L),C.current(),L.id),[]),b=Lt((L,B={})=>{let G=B.id??`transition-${Zc++}`,H=Math.max(1,B.duration??400),ae=B.easing??"ease-in-out";return A({id:G,startedAt:null,lastFrameAt:null,override:null,onComplete:B.onComplete,update:(be,pe,xe,Te)=>{let ye=Te??wy(pe/H,ae);return M(L,[ye]),pe<H}})},[M,A]),w=Lt((L,B={})=>{let G=B.id??`pulse-${Zc++}`,H=Math.max(1,B.duration??1e3),ae=B.minLevel??0,be=B.maxLevel??1,pe=B.repeat??1/0,xe=B.synchronized??!0,Te=Math.max(1,...[...L.materials??[],...L.transforms??[]].map(ye=>u(ye.targets).length),...(L.lights??[]).map(ye=>ed(ye.lights).length));return A({id:G,startedAt:null,lastFrameAt:null,override:null,onComplete:B.onComplete,update:(ye,St,st,De)=>{let ve=St/H,Y=Array.from({length:xe?1:Te},(ft,ze)=>{if(De!==null)return De;let lt=ve+(xe?0:ze/Te),nt=.5-Math.cos(lt%1*Math.PI*2)/2;return ae+(be-ae)*nt});return M(L,Y),pe===1/0||ve<pe}})},[M,A,u]),T=Lt((L,B={})=>{let G=B.id??`timeline-${Zc++}`,H=B.repeat??1,ae=L.map(pe=>({...pe,duration:Math.max(1,pe.duration),hold:Math.max(0,pe.hold??0)})),be=Math.max(1,ae.reduce((pe,xe)=>pe+xe.duration+xe.hold,0));return A({id:G,startedAt:null,lastFrameAt:null,override:null,onComplete:B.onComplete,update:(pe,xe,Te,ye)=>{if(ae.length===0||H<=0)return!1;let St=xe/be;if(H!==1/0&&St>=H){for(let ve of ae)M(ve.channels,[1]);return!1}let st=xe%be,De=0;for(let ve of ae){let Y=De+ve.duration,ft=Y+ve.hold;if(st>=Y){M(ve.channels,[ye??1]),De=ft;continue}if(st>=De){let ze=ye??wy((st-De)/ve.duration,ve.easing??"ease-in-out");M(ve.channels,[ze]);break}}return!0}})},[M,A]),S=Lt((L,B={})=>{let G=B.id??`flicker-${Zc++}`,H=B.synchronized??!0,ae=B.minLevel??.15,be=B.maxLevel??1,pe=B.interval??[45,160],xe=typeof pe=="number"?[pe,pe]:pe,Te=[Math.max(1,Math.min(...xe)),Math.max(1,Math.max(...xe))],ye=td(B.response??.7,.01,1),St=td(B.blackoutChance??.08),st=td(B.flashChance??.12),De=B.flashLevel??1.15,ve=Math.max(1,...[...L.materials??[],...L.transforms??[]].map(nt=>u(nt.targets).length),...(L.lights??[]).map(nt=>ed(nt.lights).length)),Y=H?1:ve,ft=Array.from({length:Y},()=>ae),ze=Array.from({length:Y},()=>ae),lt=Array.from({length:Y},()=>0);return A({id:G,startedAt:null,lastFrameAt:null,override:null,onComplete:B.onComplete,update:(nt,Ee,rt,Bt)=>{for(let he=0;he<Y;he+=1){if(Bt!==null)ze[he]=Bt;else if(nt>=lt[he]){let _t=Math.random();ze[he]=_t<St?_h(0,Math.min(.04,ae)):_t<St+st?De:_h(ae,be),lt[he]=nt+_h(...Te)}let Nt=1-Math.pow(1-ye,Math.max(1,rt)/16.67);ft[he]+=(ze[he]-ft[he])*Nt}return M(L,ft),B.duration===void 0||Ee<B.duration}})},[M,A,u]),N=Lt((L,B,G)=>{let H=o.current.get(L);if(!H)return!1;let ae=typeof performance>"u"?Date.now():performance.now();return H.override={level:B,until:ae+Math.max(0,G)},C.current(),!0},[]),R=Lt(L=>o.current.delete(L),[]),z=Lt(()=>{o.current.clear(),r.current!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(r.current),r.current=null)},[]),E=Lt(()=>{for(let[L,B]of s.current)Cy(L,B);s.current.clear();for(let[L,B]of c.current)L.position.set(...B.position),L.rotation.set(...B.rotation),L.scale.set(...B.scale),L.visible=B.visible,L.updateMatrix(),L.updateMatrixWorld(!0);c.current.clear();for(let L of a.current.values())L.light.removeFromParent(),L.light.dispose();a.current.clear(),d()},[d]),j=Lt(()=>{z(),E()},[E,z]),I=Lt(L=>{i.current&&i.current!==L.scene&&E(),n.current=L,i.current=L.scene,t.current.onViewerReady?.(L)},[E]);return vA(()=>()=>{j(),n.current=null,i.current=null},[j]),{handleViewerReady:I,setMaterial:g,setTransform:y,getWorldPosition:k,addPointLight:p,updatePointLight:m,removePointLight:v,transition:b,timeline:T,pulse:w,flicker:S,overrideEffect:N,stopEffect:R,stopAllEffects:z,resetRuntime:j}}import{useCallback as Ma,useEffect as Rh,useRef as Ai,useState as AA}from"react";function Ty(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function qs(e){return typeof e=="number"&&Number.isFinite(e)}function Sy(e){return Array.isArray(e)&&e.length===3&&e.every(qs)}function EA(e){return!Ty(e)||!Sy(e.position)||!Sy(e.target)||e.fov!==null&&!qs(e.fov)||!qs(e.zoom)||e.zoom<=0||e.azimuthAngle!==void 0&&!qs(e.azimuthAngle)||e.polarAngle!==void 0&&!qs(e.polarAngle)?null:{position:e.position,target:e.target,fov:e.fov,zoom:e.zoom,azimuthAngle:e.azimuthAngle,polarAngle:e.polarAngle}}function RA(e){if(!Ty(e))return null;let t;if(e.camera!==void 0){let r=EA(e.camera);if(!r)return null;t=r}let n;if(e.hidden!==void 0){if(!Array.isArray(e.hidden)||!e.hidden.every(r=>typeof r=="string"))return null;n=e.hidden}let i;if(e.selected===null||typeof e.selected=="string")i=e.selected;else if(e.selected!==void 0)return null;return{camera:t,hidden:n,selected:i}}function My(e,t,n){let i=Object.values(t).filter(r=>r.visible===!1).map(r=>r.id);return{camera:e??void 0,hidden:i,selected:n?.id??null}}function LA({cameraState:e,setCameraState:t,objectBindings:n,onObjectBindingsChange:i,selectedObjectBinding:r,setSelectedObjectBinding:o,paramKey:a="view",debounceMs:s=400,autoSync:c=!0}){let l=Ai(null),u=Ai(null),d=Ai(null),h=Ai(null),g=Ai(null),f=Ma(()=>{g.current!==null&&(window.clearTimeout(g.current),g.current=null),d.current=null,h.current=null},[]),y=Ma(()=>{let w=My(e,n,r);return`${a}=${encodeURIComponent(JSON.stringify(w))}`},[e,n,r,a]),k=Ma(()=>{let w=new URL(window.location.href);return w.hash=y(),w.toString()},[y]),v=Ma(w=>{let T=new URL(window.location.href);T.hash=w,window.history.replaceState(null,"",T.toString()),u.current=w,l.current=new URLSearchParams(T.hash.slice(1)).get(a)},[a]),p=Ma(()=>{f(),v(y())},[y,f,v]),m=Ai({cameraState:e,objectBindings:n,selectedObjectBinding:r});m.current={cameraState:e,objectBindings:n,selectedObjectBinding:r};let[M,C]=AA(!1);Rh(()=>{if(!c||!M){f();return}let w=m.current,T=My(w.cameraState,w.objectBindings,w.selectedObjectBinding),S=`${a}=${encodeURIComponent(JSON.stringify(T))}`;if(S===u.current){f();return}S===d.current&&s===h.current||(f(),d.current=S,h.current=s,g.current=window.setTimeout(()=>{g.current=null,d.current=null,h.current=null,v(S)},Math.max(0,s)))},[c,e,f,s,n,a,M,r,v]),Rh(()=>f,[f]);let P=Ai(null),A=Ai(null),b=Ma(async()=>{C(!0);let w=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash,T=new URLSearchParams(w).get(a);if(!T)return P.current=null,!1;if(T===l.current||T===P.current||T===A.current)return!1;let S;try{S=JSON.parse(T)}catch{return!1}let N=RA(S);if(!N)return!1;A.current=T;try{if(N.camera&&await t(N.camera,!1),N.hidden){let R=new Set(N.hidden);i(Object.fromEntries(Object.entries(n).map(([z,E])=>[z,{...E,visible:!R.has(E.id)}])))}if(N.selected!==void 0){let R=N.selected?vn(n,N.selected):null;o(R?n[R]:null)}return P.current=T,!0}finally{A.current===T&&(A.current=null)}},[n,i,a,t,o]);return Rh(()=>{let w=()=>{b().catch(()=>{})};return window.addEventListener("hashchange",w),()=>{window.removeEventListener("hashchange",w)}},[b]),{getShareUrl:k,syncUrl:p,restoreFromUrl:b}}export{oy as BindingBuilder,Vi as DEFAULT_SCENE_CONFIG,Sd as MATERIAL_BLENDING_MODES,Cd as MATERIAL_SIDES,Uc as ModelViewer,hy as SimpleModelViewer,gv as defineObjectBindings,Td as material,zo as patchBindings,Pd as patchSceneConfig,Fi as selectBindingKeys,Md as selectBindings,tA as useObjectBinding,rA as useObjectBindingIds,aA as useObjectBindings,uA as useSceneConfig,LA as useShareableViewerState,bA as useViewerActions,Hp as useViewerAnimations,Gp as useViewerCamera,yA as useViewerConnection,_A as useViewerEffects,mA as useViewerHover,fA as useViewerModel,Z_ as useViewerSelection};
|